diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 939a9025109..7dcc194cfbe 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,6 +29,15 @@ variables: GRADLE_VERSION: "8.14.4" # must match gradle-wrapper.properties MAVEN_REPOSITORY_PROXY: "https://depot-read-api-java.us1.ddbuild.io/magicmirror/magicmirror/@current/" GRADLE_PLUGIN_PROXY: "https://depot-read-api-java.us1.ddbuild.io/magicmirror/magicmirror/@current/" + ARM64_BUILDER_IMAGE_REPO: "ghcr.io/datadog/dd-trace-java-docker-build" + ARM64_BUILDER_IMAGE_TAG: "alexeyk_arm64-test-arm64-base" + WINDOWS_JDK8_VERSION: "8u482-b08" # keep pinned to Temurin GA patch releases and bump periodically + WINDOWS_JDK11_VERSION: "11.0.30+7" + WINDOWS_JDK17_VERSION: "17.0.18+8" + WINDOWS_JDK21_VERSION: "21.0.10+7" + WINDOWS_JDK25_VERSION: "25.0.2+10" + WINDOWS_BOOTSTRAP_CACHE_POLICY: pull + WINDOWS_DEPENDENCY_CACHE_POLICY: pull BUILDER_IMAGE_REPO: "registry.ddbuild.io/images/mirror/dd-trace-java-docker-build" # images are pinned in images/mirror.lock.yaml in the DataDog/images repo BUILDER_IMAGE_VERSION_PREFIX: "ci-" # use either an empty string (e.g. "") for latest images or a version followed by a hyphen (e.g. "ci-" or "123_merge-") REPO_NOTIFICATION_CHANNEL: "#apm-java-escalations" @@ -346,6 +355,18 @@ populate_dep_cache: - GRADLE_TARGET: ":smokeTest" CACHE_TYPE: "smoke" +populate_dep_cache_windows: + extends: .windows_base_test_job + when: manual + allow_failure: true + variables: + WINDOWS_BOOTSTRAP_CACHE_POLICY: pull-push + WINDOWS_DEPENDENCY_CACHE_POLICY: push + script: + - | + .\gradlew.bat :baseTest -PskipTests -PtestJvm=21 --stacktrace --no-daemon --parallel --max-workers=4 + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + publish-artifacts-to-s3: image: registry.ddbuild.io/images/mirror/amazon/aws-cli:2.4.29 stage: publish @@ -571,6 +592,156 @@ muzzle-dep-report: .restore_pretest_env: &restore_pretest_env - source pretest.env +.windows_test_cache: + cache: + - key: "windows-jdks-temurin-${WINDOWS_JDK8_VERSION}-${WINDOWS_JDK11_VERSION}-${WINDOWS_JDK17_VERSION}-${WINDOWS_JDK21_VERSION}-${WINDOWS_JDK25_VERSION}-x64" + paths: + - .tools/jdk-8/ + - .tools/jdk-11/ + - .tools/jdk-17/ + - .tools/jdk-21/ + - .tools/jdk-25/ + policy: $WINDOWS_BOOTSTRAP_CACHE_POLICY + unprotect: true + - key: + files: + - gradle/wrapper/gradle-wrapper.properties + prefix: "windows-gradle-wrapper" + paths: + - .gradle/wrapper/ + policy: $WINDOWS_BOOTSTRAP_CACHE_POLICY + unprotect: true + - key: + files: + - settings.gradle.kts + - "**/gradle.lockfile" + prefix: "windows-base-deps-jdk21" + fallback_keys: + - "windows-base-deps-jdk21-default" + paths: + - .gradle/caches/ + - .gradle/notifications/ + - .mvn/caches/ + policy: $WINDOWS_DEPENDENCY_CACHE_POLICY + unprotect: true + +.windows_base_test_job: + extends: .windows_test_cache + stage: tests + tags: [ "windows-v2:2025" ] + needs: [] + variables: + GIT_STRATEGY: none + GIT_SUBMODULE_STRATEGY: normal + GIT_SUBMODULE_DEPTH: 1 + SKIP_BUILDSCAN: "true" + TESTCONTAINERS_CHECKS_DISABLE: "true" + TESTCONTAINERS_RYUK_DISABLED: "true" + before_script: + - | + $ErrorActionPreference = "Stop" + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + + $toolsDir = Join-Path $env:CI_PROJECT_DIR ".tools" + $tmpDir = Join-Path $env:CI_PROJECT_DIR ".tmp" + $tmpDirJava = $tmpDir.Replace("\", "/") + $jdk8ArchiveVersion = $env:WINDOWS_JDK8_VERSION.Replace("-", "") + $jdk11ArchiveVersion = $env:WINDOWS_JDK11_VERSION.Replace("+", "_") + $jdk17ArchiveVersion = $env:WINDOWS_JDK17_VERSION.Replace("+", "_") + $jdk21ArchiveVersion = $env:WINDOWS_JDK21_VERSION.Replace("+", "_") + $jdk25ArchiveVersion = $env:WINDOWS_JDK25_VERSION.Replace("+", "_") + $jdk8Home = Join-Path $toolsDir "jdk-8" + $jdk11Home = Join-Path $toolsDir "jdk-11" + $jdk17Home = Join-Path $toolsDir "jdk-17" + $jdk21Home = Join-Path $toolsDir "jdk-21" + $jdk25Home = Join-Path $toolsDir "jdk-25" + + New-Item -ItemType Directory -Force -Path $toolsDir, $tmpDir, ".gradle", ".mvn\caches" | Out-Null + try { + New-Item -ItemType Directory -Force -Path "C:\tmp" | Out-Null + } catch { + Write-Host "Unable to create C:\tmp: $($_.Exception.Message)" + } + + git --version + git config --global --add safe.directory $env:CI_PROJECT_DIR + if (-not (Test-Path ".git")) { + git init . + git remote add origin $env:CI_REPOSITORY_URL + } else { + git remote remove origin 2>$null + git remote add origin $env:CI_REPOSITORY_URL + } + git config core.longpaths true + git fetch --depth 1 origin $env:CI_COMMIT_SHA + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + git checkout --force --detach FETCH_HEAD + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + @( + "DD_SERVICE", + "DD_ENTITY_ID", + "DD_SITE", + "DD_ENV", + "DD_DATACENTER", + "DD_PARTITION", + "DD_CLOUDPROVIDER" + ) | ForEach-Object { + if (Test-Path "Env:$_") { + Remove-Item "Env:$_" + } + } + + function Install-TemurinJdk([string]$jdkHome, [string]$jdkUrl, [string]$zipName) { + $jdkZip = Join-Path $env:TEMP $zipName + $jdkExtract = "$jdkHome-extract" + if (-not (Test-Path (Join-Path $jdkHome "bin\java.exe"))) { + if (Test-Path $jdkExtract) { Remove-Item $jdkExtract -Recurse -Force } + (New-Object System.Net.WebClient).DownloadFile($jdkUrl, $jdkZip) + Expand-Archive -Path $jdkZip -DestinationPath $jdkExtract -Force + if (Test-Path $jdkHome) { Remove-Item $jdkHome -Recurse -Force } + $expandedJdkDir = Get-ChildItem $jdkExtract -Directory | Select-Object -First 1 + Move-Item $expandedJdkDir.FullName $jdkHome + Remove-Item $jdkZip -Force + Remove-Item $jdkExtract -Recurse -Force + } + } + + Install-TemurinJdk $jdk8Home "https://github.com/adoptium/temurin8-binaries/releases/download/jdk$($env:WINDOWS_JDK8_VERSION)/OpenJDK8U-jdk_x64_windows_hotspot_$jdk8ArchiveVersion.zip" "temurin-jdk-$jdk8ArchiveVersion-windows-x64.zip" + Install-TemurinJdk $jdk11Home "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-$($env:WINDOWS_JDK11_VERSION)/OpenJDK11U-jdk_x64_windows_hotspot_$jdk11ArchiveVersion.zip" "temurin-jdk-$jdk11ArchiveVersion-windows-x64.zip" + Install-TemurinJdk $jdk17Home "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-$($env:WINDOWS_JDK17_VERSION)/OpenJDK17U-jdk_x64_windows_hotspot_$jdk17ArchiveVersion.zip" "temurin-jdk-$jdk17ArchiveVersion-windows-x64.zip" + Install-TemurinJdk $jdk21Home "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-$($env:WINDOWS_JDK21_VERSION)/OpenJDK21U-jdk_x64_windows_hotspot_$jdk21ArchiveVersion.zip" "temurin-jdk-$jdk21ArchiveVersion-windows-x64.zip" + Install-TemurinJdk $jdk25Home "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-$($env:WINDOWS_JDK25_VERSION)/OpenJDK25U-jdk_x64_windows_hotspot_$jdk25ArchiveVersion.zip" "temurin-jdk-$jdk25ArchiveVersion-windows-x64.zip" + + $env:JAVA_HOME = $jdk21Home + $env:JAVA_8_HOME = $jdk8Home + $env:JAVA_11_HOME = $jdk11Home + $env:JAVA_17_HOME = $jdk17Home + $env:JAVA_21_HOME = $jdk21Home + $env:JAVA_25_HOME = $jdk25Home + $env:Path = "$($env:JAVA_HOME)\bin;$env:Path" + $env:GRADLE_USER_HOME = Join-Path $env:CI_PROJECT_DIR ".gradle" + $env:ORG_GRADLE_PROJECT_mavenRepositoryProxy = $env:MAVEN_REPOSITORY_PROXY + $env:ORG_GRADLE_PROJECT_gradlePluginProxy = $env:GRADLE_PLUGIN_PROXY + + if ($env:MAVEN_REPOSITORY_PROXY) { + (Get-Content ".mvn\wrapper\maven-wrapper.properties") ` + -replace "https://repo.maven.apache.org/maven2/", $env:MAVEN_REPOSITORY_PROXY ` + | Set-Content ".mvn\wrapper\maven-wrapper.properties" -Encoding ASCII + } + + Add-Content gradle.properties "org.gradle.java.installations.auto-detect=false" -Encoding ASCII + Add-Content gradle.properties "org.gradle.java.installations.auto-download=false" -Encoding ASCII + Add-Content gradle.properties "org.gradle.java.installations.fromEnv=JAVA_HOME,JAVA_8_HOME,JAVA_11_HOME,JAVA_17_HOME,JAVA_21_HOME,JAVA_25_HOME" -Encoding ASCII + Add-Content gradle.properties "org.gradle.jvmargs=-Xms1g -Xmx4g -Djava.util.prefs.userRoot=$tmpDirJava/java-prefs -Ddatadog.forkedMinHeapSize=128M -Ddatadog.forkedMaxHeapSize=1024M -XX:ErrorFile=$tmpDirJava/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$tmpDirJava" -Encoding ASCII + + & "$env:JAVA_8_HOME\bin\java.exe" -version + & "$env:JAVA_11_HOME\bin\java.exe" -version + & "$env:JAVA_17_HOME\bin\java.exe" -version + & "$env:JAVA_21_HOME\bin\java.exe" -version + & "$env:JAVA_25_HOME\bin\java.exe" -version + java -version + .\gradlew.bat --version + .test_job: extends: .gradle_build image: ${BUILDER_IMAGE_REPO}:${BUILDER_IMAGE_VERSION_PREFIX}$testJvm @@ -641,6 +812,96 @@ muzzle-dep-report: - scheduler_failure - data_integrity_failure +.test_job_arm64_poc: + image: ${ARM64_BUILDER_IMAGE_REPO}:${ARM64_BUILDER_IMAGE_TAG} + tags: [ "docker-in-docker:arm64" ] + stage: tests + needs: [] + cache: + - key: dependency-arm64-base + paths: + - .gradle/wrapper + - .gradle/caches + - .gradle/notifications + - .mvn/caches + policy: pull + unprotect: true + variables: + GRADLE_PARAMS: "-PskipFlakyTests" + GRADLE_WORKERS: 6 + GRADLE_MEMORY_MIN: 1G + GRADLE_MEMORY_MAX: 4G + KUBERNETES_CPU_REQUEST: 10 + KUBERNETES_MEMORY_REQUEST: 20Gi + KUBERNETES_MEMORY_LIMIT: 20Gi + TESTCONTAINERS_CHECKS_DISABLE: "true" + TESTCONTAINERS_RYUK_DISABLED: "true" + TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX: "registry.ddbuild.io/images/mirror/" + JETTY_AVAILABLE_PROCESSORS: 4 + GIT_SUBMODULE_STRATEGY: normal + GIT_SUBMODULE_DEPTH: 1 + before_script: + - git config --global --add safe.directory "$CI_PROJECT_DIR" + - export ORG_GRADLE_PROJECT_mavenRepositoryProxy=$MAVEN_REPOSITORY_PROXY + - export ORG_GRADLE_PROJECT_gradlePluginProxy=$GRADLE_PLUGIN_PROXY + - | + JAVA_HOMES=$(env | grep -E '^JAVA_[A-Z0-9_]+_HOME=' | sed 's/=.*//' | paste -sd,) + cat >> gradle.properties < { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - for (int i = 0; i < messageCount; ++i) { - try { - flushed.add(unpacker.unpackString()); - } catch (Exception error) { - Assertions.fail(error.getMessage()); + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + for (int i = 0; i < messageCount; ++i) { + try { + flushed.add(unpacker.unpackString()); + } catch (Exception error) { + fail(error.getMessage()); + } } + } catch (IOException error) { + fail(error.getMessage()); } })); assertTrue(packer.format("abcdefghijklm", mapper), "data fits in buffer"); @@ -117,13 +124,12 @@ public void testWriteBinary() { newBuffer( 25, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { int length = unpacker.unpackBinaryHeader(); assertEquals(4, length); assertArrayEquals(data, unpacker.readPayload(length)); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format( @@ -138,16 +144,14 @@ public void testWriteBinaryNoArgVariant() { newBuffer( 10, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { - assertEquals(unpacker.unpackBinaryHeader(), 6); - assertArrayEquals( - unpacker.readPayload(6), "foobar".getBytes(StandardCharsets.UTF_8)); + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(6, unpacker.unpackBinaryHeader()); + assertArrayEquals(unpacker.readPayload(6), "foobar".getBytes(UTF_8)); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); - writer.writeBinary("foobar".getBytes(StandardCharsets.UTF_8)); + writer.writeBinary("foobar".getBytes(UTF_8)); } @Test @@ -158,13 +162,12 @@ public void testWriteBinaryAsObject() { newBuffer( 25, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { int length = unpacker.unpackBinaryHeader(); assertEquals(4, length); assertArrayEquals(data, unpacker.readPayload(length)); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data, (ba, writable) -> writable.writeObject(ba, null)); @@ -179,13 +182,12 @@ public void testWriteByteBuffer() { newBuffer( 25, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { int length = unpacker.unpackBinaryHeader(); assertEquals(4, length); assertArrayEquals(data, unpacker.readPayload(length)); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(ByteBuffer.wrap(data), (bb, writable) -> writable.writeBinary(bb)); @@ -200,13 +202,12 @@ public void testWriteByteBufferAsObject() { newBuffer( 25, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { int length = unpacker.unpackBinaryHeader(); assertEquals(4, length); assertArrayEquals(data, unpacker.readPayload(length)); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format( @@ -221,11 +222,10 @@ public void testWriteNull() { newBuffer( 25, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { unpacker.unpackNil(); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(null, (x, w) -> w.writeObject(x, null)); @@ -239,11 +239,10 @@ public void testWriteBooleanAsObject() { newBuffer( 25, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertTrue(unpacker.unpackBoolean()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(true, (x, w) -> w.writeObject(x, null)); @@ -257,11 +256,10 @@ public void testWriteBoolean() { newBuffer( 25, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertTrue(unpacker.unpackBoolean()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(true, (x, w) -> w.writeBoolean(x)); @@ -276,11 +274,10 @@ public void testWriteGenericNumber() { newBuffer( 25, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(data.doubleValue(), unpacker.unpackDouble(), 0); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data, (Mapper) (x, w) -> w.writeObject(x, null)); @@ -295,11 +292,10 @@ public void testWriteCharArray() { newBuffer( 25, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(data, unpacker.unpackString()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data.toCharArray(), (x, w) -> w.writeObject(x, null)); @@ -314,11 +310,10 @@ public void testWriteUTF8ByteString() { newBuffer( 25, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals("xyz", unpacker.unpackString()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(utf8BytesString, (x, w) -> w.writeObject(x, null)); @@ -333,14 +328,13 @@ public void testWriteBooleanArray() { newBuffer( 25, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(4, unpacker.unpackArrayHeader()); for (boolean datum : data) { assertEquals(datum, unpacker.unpackBoolean()); } } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); @@ -355,14 +349,13 @@ public void testWriteFloatArray() { newBuffer( 100, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(4, unpacker.unpackArrayHeader()); for (float datum : data) { assertEquals(datum, unpacker.unpackFloat(), 0.001); } } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); @@ -377,14 +370,13 @@ public void testWriteDoubleArray() { newBuffer( 100, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(4, unpacker.unpackArrayHeader()); for (double datum : data) { assertEquals(datum, unpacker.unpackDouble(), 0.001); } } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); @@ -399,14 +391,13 @@ public void testWriteLongArray() { newBuffer( 100, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(4, unpacker.unpackArrayHeader()); for (long datum : data) { assertEquals(datum, unpacker.unpackLong()); } } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); @@ -421,14 +412,13 @@ public void testWriteIntArray() { newBuffer( 100, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(4, unpacker.unpackArrayHeader()); for (int datum : data) { assertEquals(datum, unpacker.unpackInt()); } } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); @@ -443,14 +433,13 @@ public void testWriteShortArray() { newBuffer( 100, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(4, unpacker.unpackArrayHeader()); for (short datum : data) { assertEquals(datum, unpacker.unpackInt()); } } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); @@ -465,11 +454,10 @@ public void testWriteLongBoxed() { newBuffer( 100, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(data, unpacker.unpackLong()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); @@ -484,12 +472,11 @@ public void testWriteLongPrimitive() { newBuffer( 100, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(data, unpacker.unpackLong()); assertEquals(data, unpacker.unpackLong()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format( @@ -509,14 +496,13 @@ public void testWriteNegativeLongPrimitive() { newBuffer( 100, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(data, unpacker.unpackLong()); assertEquals(data, unpacker.unpackLong()); // Can't unpack unsigned long directly as the unpacker refuses negative values assertEquals(data, unpacker.unpackValue().asNumberValue().toLong()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format( @@ -537,11 +523,10 @@ public void testWriteIntBoxed() { newBuffer( 100, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(data, unpacker.unpackInt()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); @@ -556,11 +541,10 @@ public void testWriteIntPrimitive() { newBuffer( 100, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(data, unpacker.unpackInt()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data, (x, w) -> w.writeInt(x)); @@ -575,11 +559,10 @@ public void testWriteShortBoxed() { newBuffer( 100, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(data, unpacker.unpackInt()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); @@ -594,11 +577,10 @@ public void testUnknownObject() { newBuffer( 100, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(data.toString(), unpacker.unpackString()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); @@ -613,13 +595,12 @@ public void testWriteObjectArray() { newBuffer( 100, (messageCount, buffy) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffy)) { assertEquals(data.length, unpacker.unpackArrayHeader()); assertEquals(data[0].toString(), unpacker.unpackString()); assertEquals(data[1].toString(), unpacker.unpackString()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); @@ -628,18 +609,17 @@ public void testWriteObjectArray() { @Test public void testWriteStringUTF8BytesString() { - UTF8BytesString value = UTF8BytesString.create("foobár"); + UTF8BytesString value = UTF8BytesString.create(NON_ASCII_STRING); MsgPackWriter writer = new MsgPackWriter( newBuffer( - 20, + NON_ASCII_BUFFER_CAPACITY * 2, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { - assertEquals(unpacker.unpackString(), "foobár"); - assertEquals(unpacker.unpackString(), "foobár"); + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(NON_ASCII_STRING, unpacker.unpackString()); + assertEquals(NON_ASCII_STRING, unpacker.unpackString()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); writer.writeObjectString(value, null); @@ -653,12 +633,11 @@ public void testWriteStringNull() { newBuffer( 20, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { unpacker.unpackNil(); unpacker.unpackNil(); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); writer.writeObjectString(null, null); @@ -671,7 +650,7 @@ public void testWriteObjectStringGeneralPath() { new Object() { @Override public String toString() { - return "foobár"; + return NON_ASCII_STRING; } }; MsgPackWriter writer = @@ -679,16 +658,15 @@ public String toString() { newBuffer( 40, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { - assertEquals(unpacker.unpackString(), "foobár"); - assertEquals(unpacker.unpackString(), "foobàr"); + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(NON_ASCII_STRING, unpacker.unpackString()); + assertEquals(NON_ASCII_STRING, unpacker.unpackString()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); writer.writeObjectString(value, null); - writer.writeObjectString(value, s -> "foobàr".getBytes(StandardCharsets.UTF_8)); + writer.writeObjectString(value, s -> NON_ASCII_BYTES); } @Test @@ -696,16 +674,15 @@ public void testWriteStringGeneralCharSequence() { MsgPackWriter writer = new MsgPackWriter( newBuffer( - 10, + NON_ASCII_BUFFER_CAPACITY, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { - assertEquals(unpacker.unpackString(), "foobár"); + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(NON_ASCII_STRING, unpacker.unpackString()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); - CharBuffer charSeq = CharBuffer.wrap("foobár"); + CharBuffer charSeq = CharBuffer.wrap(NON_ASCII_STRING); writer.writeString(charSeq, null); } @@ -714,16 +691,15 @@ public void testWriteStringEncodingCache() { MsgPackWriter writer = new MsgPackWriter( newBuffer( - 10, + NON_ASCII_BUFFER_CAPACITY, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { - assertEquals(unpacker.unpackString(), "foobár"); + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(NON_ASCII_STRING, unpacker.unpackString()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); - writer.writeString("", s -> "foobár".getBytes(StandardCharsets.UTF_8)); + writer.writeString("", s -> NON_ASCII_BYTES); } @Test @@ -733,14 +709,13 @@ public void testStartArray() { newBuffer( 10, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { - assertEquals(unpacker.unpackArrayHeader(), 1); - assertEquals(unpacker.unpackArrayHeader(), 0xFFFF); - assertEquals(unpacker.unpackArrayHeader(), 0x10000); - assertEquals(unpacker.unpackArrayHeader(), 1); + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(1, unpacker.unpackArrayHeader()); + assertEquals(0xFFFF, unpacker.unpackArrayHeader()); + assertEquals(0x10000, unpacker.unpackArrayHeader()); + assertEquals(1, unpacker.unpackArrayHeader()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); writer.startArray(1); @@ -756,13 +731,12 @@ public void testStartMap() { newBuffer( 10, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { - assertEquals(unpacker.unpackMapHeader(), 1); - assertEquals(unpacker.unpackMapHeader(), 0xFFFF); - assertEquals(unpacker.unpackMapHeader(), 0x10000); + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(1, unpacker.unpackMapHeader()); + assertEquals(0xFFFF, unpacker.unpackMapHeader()); + assertEquals(0x10000, unpacker.unpackMapHeader()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); writer.startMap(1); @@ -777,13 +751,12 @@ public void testStartStringHeader() { newBuffer( 10, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { - assertEquals(unpacker.unpackRawStringHeader(), 1); - assertEquals(unpacker.unpackRawStringHeader(), 0xFFFF); - assertEquals(unpacker.unpackRawStringHeader(), 0x10000); + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { + assertEquals(1, unpacker.unpackRawStringHeader()); + assertEquals(0xFFFF, unpacker.unpackRawStringHeader()); + assertEquals(0x10000, unpacker.unpackRawStringHeader()); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); writer.writeStringHeader(1); @@ -814,11 +787,10 @@ public void testSimpleStackTraceEvent() { newBuffer( 1000, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { checkStackTraceEvent(data, unpacker); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(data, (x, w) -> w.writeObject(x, null)); @@ -833,11 +805,10 @@ public void testSimpleStackTraceFrame() { newBuffer( 1000, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { checkStackTraceFrame(frame, unpacker); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(frame, (x, w) -> w.writeObject(x, null)); @@ -850,11 +821,10 @@ private void testStackTraceBatch(final Map> batch) newBuffer( 100000, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { + try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { checkStackTraceBatch(batch, unpacker); } catch (IOException e) { - Assertions.fail(e.getMessage()); + fail(e.getMessage()); } })); messageFormatter.format(batch, (x, w) -> w.writeObject(x, null)); diff --git a/components/environment/src/main/java/datadog/environment/OperatingSystem.java b/components/environment/src/main/java/datadog/environment/OperatingSystem.java index 1d24d7680c9..686bfca442d 100644 --- a/components/environment/src/main/java/datadog/environment/OperatingSystem.java +++ b/components/environment/src/main/java/datadog/environment/OperatingSystem.java @@ -1,5 +1,6 @@ package datadog.environment; +import static datadog.environment.OperatingSystem.Architecture.ARM64; import static datadog.environment.OperatingSystem.Type.LINUX; import static datadog.environment.OperatingSystem.Type.MACOS; import static datadog.environment.OperatingSystem.Type.WINDOWS; @@ -25,6 +26,15 @@ public final class OperatingSystem { private OperatingSystem() {} + /** + * Checks whether the architecture is arm64. + * + * @return @{@code true} if architecture is arm64, {@code false} otherwise. + */ + public static boolean isArm64() { + return ARCHITECTURE == ARM64; + } + /** * Checks whether the operating system is Linux based. * diff --git a/components/json/src/test/java/datadog/json/JsonReaderTest.java b/components/json/src/test/java/datadog/json/JsonReaderTest.java index e716a625103..15a635c148a 100644 --- a/components/json/src/test/java/datadog/json/JsonReaderTest.java +++ b/components/json/src/test/java/datadog/json/JsonReaderTest.java @@ -215,7 +215,8 @@ void testStringEscaping() { assertEquals("\n", reader.nextString()); assertEquals("\r", reader.nextString()); assertEquals("\t", reader.nextString()); - assertEquals("É", reader.nextString()); + // Explicit escape for non-ASCII `É` to make test independent of container settings. + assertEquals("\u00C9", reader.nextString()); reader.endArray(); } catch (IOException e) { fail("Failed to read escaped JSON strings", e); diff --git a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/buildid/BuildIdExtractorIntegrationTest.java b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/buildid/BuildIdExtractorIntegrationTest.java index 2556c4cb624..da13cbca0b5 100644 --- a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/buildid/BuildIdExtractorIntegrationTest.java +++ b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/buildid/BuildIdExtractorIntegrationTest.java @@ -3,7 +3,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeFalse; +import datadog.environment.OperatingSystem; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -134,6 +136,8 @@ private static Stream elfBinaries() { @ParameterizedTest(name = "ELF: {1}") @MethodSource("elfBinaries") void testElfBuildIdExtraction(String containerPath, String description) throws Exception { + // TODO: check if arm64 can be supported too. + assumeFalse(OperatingSystem.isArm64(), "Skipping for arm64"); Path localBinary = copyFromContainer(linuxContainer, containerPath); ElfBuildIdExtractor extractor = new ElfBuildIdExtractor(); diff --git a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/EnvironmentChecker.java b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/EnvironmentChecker.java index 62ca9ea29fe..62beaeba443 100644 --- a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/EnvironmentChecker.java +++ b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/EnvironmentChecker.java @@ -1,7 +1,5 @@ package com.datadog.profiling.controller; -import static datadog.environment.OperatingSystem.Architecture.ARM64; - import datadog.environment.JavaVirtualMachine; import datadog.environment.OperatingSystem; import datadog.environment.SystemProperties; @@ -243,11 +241,7 @@ private static boolean extractSoFromJar(Path target, StringBuilder sb) throws Ex .filter(e -> e.getName().contains("libjavaProfiler.so")) .filter( e -> - e.getName() - .contains( - OperatingSystem.architecture() == ARM64 - ? "/linux-arm64/" - : "/linux-x64/") + e.getName().contains(OperatingSystem.isArm64() ? "/linux-arm64/" : "/linux-x64/") && (!OperatingSystem.isMusl() || e.getName().contains("-musl"))) .findFirst() .map( diff --git a/dd-java-agent/instrumentation/aerospike-4.0/src/test/groovy/datadog/trace/instrumentation/aerospike4/AerospikeBaseTest.groovy b/dd-java-agent/instrumentation/aerospike-4.0/src/test/groovy/datadog/trace/instrumentation/aerospike4/AerospikeBaseTest.groovy index 57848379357..25353f6731d 100644 --- a/dd-java-agent/instrumentation/aerospike-4.0/src/test/groovy/datadog/trace/instrumentation/aerospike4/AerospikeBaseTest.groovy +++ b/dd-java-agent/instrumentation/aerospike-4.0/src/test/groovy/datadog/trace/instrumentation/aerospike4/AerospikeBaseTest.groovy @@ -1,5 +1,9 @@ package datadog.trace.instrumentation.aerospike4 +import static datadog.environment.OperatingSystem.arm64 +import static datadog.trace.agent.test.utils.PortUtils.waitForPortToOpen +import static java.util.concurrent.TimeUnit.SECONDS +import static org.testcontainers.containers.wait.strategy.Wait.forLogMessage import datadog.trace.agent.test.asserts.TraceAssert import datadog.trace.agent.test.naming.VersionedNamingTestBase @@ -9,11 +13,9 @@ import datadog.trace.core.DDSpan import org.testcontainers.containers.GenericContainer import spock.lang.Shared -import static datadog.trace.agent.test.utils.PortUtils.waitForPortToOpen -import static java.util.concurrent.TimeUnit.SECONDS -import static org.testcontainers.containers.wait.strategy.Wait.forLogMessage - abstract class AerospikeBaseTest extends VersionedNamingTestBase { + // arm64 supported only since `ce-6.2.0.2`: + private static final String AEROSPIKE_IMAGE = isArm64() ? 'aerospike:ce-6.2.0.2' : 'aerospike:5.5.0.9' @Shared def aerospike @@ -25,7 +27,7 @@ abstract class AerospikeBaseTest extends VersionedNamingTestBase { int aerospikePort = 3000 def setup() throws Exception { - aerospike = new GenericContainer('aerospike:5.5.0.9') + aerospike = new GenericContainer(AEROSPIKE_IMAGE) .withExposedPorts(3000) .waitingFor(forLogMessage(".*heartbeat-received.*\\n", 1)) diff --git a/dd-java-agent/instrumentation/google-pubsub-1.116/src/test/groovy/PubSubTest.groovy b/dd-java-agent/instrumentation/google-pubsub-1.116/src/test/groovy/PubSubTest.groovy index 289822df042..07189f86b37 100644 --- a/dd-java-agent/instrumentation/google-pubsub-1.116/src/test/groovy/PubSubTest.groovy +++ b/dd-java-agent/instrumentation/google-pubsub-1.116/src/test/groovy/PubSubTest.groovy @@ -1,4 +1,3 @@ - import static datadog.trace.agent.test.utils.TraceUtils.basicSpan import com.google.api.gax.core.NoCredentialsProvider @@ -34,13 +33,12 @@ import datadog.trace.core.datastreams.StatsGroup import datadog.trace.instrumentation.grpc.client.GrpcClientDecorator import io.grpc.ManagedChannel import io.grpc.ManagedChannelBuilder +import java.nio.charset.StandardCharsets +import java.util.concurrent.CountDownLatch import org.testcontainers.containers.PubSubEmulatorContainer import org.testcontainers.utility.DockerImageName import spock.lang.Shared -import java.nio.charset.StandardCharsets -import java.util.concurrent.CountDownLatch - abstract class PubSubTest extends VersionedNamingTestBase { private static final String PROJECT_ID = "dd-trace-java" @@ -97,7 +95,7 @@ abstract class PubSubTest extends VersionedNamingTestBase { } def setupSpec() { - emulator = new PubSubEmulatorContainer(DockerImageName.parse("gcr.io/google.com/cloudsdktool/cloud-sdk:495.0.0-emulators")) + emulator = new PubSubEmulatorContainer(DockerImageName.parse("gcr.io/google.com/cloudsdktool/google-cloud-cli:495.0.0-emulators")) emulator.start() channel = ManagedChannelBuilder.forTarget(emulator.getEmulatorEndpoint()).usePlaintext().build() transportChannelProvider = FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel)) diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/executor/NettyExecutorInstrumentationTest.groovy b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/executor/NettyExecutorInstrumentationTest.groovy index fc944416d94..78b80fc2357 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/executor/NettyExecutorInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/executor/NettyExecutorInstrumentationTest.groovy @@ -1,5 +1,9 @@ package executor + +import static org.junit.jupiter.api.Assumptions.assumeTrue + +import datadog.environment.OperatingSystem import datadog.trace.agent.test.InstrumentationSpecification import datadog.trace.api.Trace import datadog.trace.core.DDSpan @@ -8,24 +12,21 @@ import io.netty.channel.epoll.EpollEventLoopGroup import io.netty.channel.local.LocalEventLoopGroup import io.netty.channel.nio.NioEventLoopGroup import io.netty.util.concurrent.DefaultEventExecutorGroup -import runnable.JavaAsyncChild -import spock.lang.Shared - import java.lang.reflect.InvocationTargetException import java.util.concurrent.Callable import java.util.concurrent.Future import java.util.concurrent.RejectedExecutionException import java.util.concurrent.TimeUnit - -import static org.junit.jupiter.api.Assumptions.assumeTrue +import runnable.JavaAsyncChild +import spock.lang.Shared class NettyExecutorInstrumentationTest extends InstrumentationSpecification { - @Shared - boolean isLinux = System.getProperty("os.name").toLowerCase().contains("linux") - + boolean isLinux = OperatingSystem.isLinux() + @Shared + boolean isArm64 = OperatingSystem.isArm64() // TODO: check if arm64 can be supported too. @Shared - EpollEventLoopGroup epollEventLoopGroup = isLinux ? new EpollEventLoopGroup(4) : null + EpollEventLoopGroup epollEventLoopGroup = isLinux && !isArm64 ? new EpollEventLoopGroup(4) : null @Shared DefaultEventExecutorGroup defaultEventExecutorGroup = new DefaultEventExecutorGroup(4) @Shared diff --git a/dd-java-agent/instrumentation/java/java-lang/java-lang-9.0/src/test/groovy/datadog/trace/instrumentation/java/lang/invoke/StringConcatFactoryCallSiteTest.groovy b/dd-java-agent/instrumentation/java/java-lang/java-lang-9.0/src/test/groovy/datadog/trace/instrumentation/java/lang/invoke/StringConcatFactoryCallSiteTest.groovy index efb7f32702a..5350b195975 100644 --- a/dd-java-agent/instrumentation/java/java-lang/java-lang-9.0/src/test/groovy/datadog/trace/instrumentation/java/lang/invoke/StringConcatFactoryCallSiteTest.groovy +++ b/dd-java-agent/instrumentation/java/java-lang/java-lang-9.0/src/test/groovy/datadog/trace/instrumentation/java/lang/invoke/StringConcatFactoryCallSiteTest.groovy @@ -147,7 +147,9 @@ class StringConcatFactoryCallSiteTest extends InstrumentationSpecification { setup: StringModule iastModule = Mock(StringModule) InstrumentationBridge.registerIastModule(iastModule) - final expected = '𠆢Hello𠆢\u0001𠆢World!.' + // Explicit escape for non-ASCII symbol to make test independent of container settings. + final utfConstant = '\uD840\uDDA2' // 𠆢 + final expected = "${utfConstant}Hello${utfConstant}\u0001${utfConstant}World!." when: final result = TestStringConcatFactorySuite.plusWithUtfConstants('Hello', 'World!') @@ -157,8 +159,8 @@ class StringConcatFactoryCallSiteTest extends InstrumentationSpecification { 1 * iastModule.onStringConcatFactory( expected, ['Hello', 'World!'] as String[], - '𠆢\u0001\u0002\u0001.', - ['𠆢\u0001𠆢'] as Object[], + "${utfConstant}\u0001\u0002\u0001.", + ["${utfConstant}\u0001${utfConstant}"] as Object[], [-2, 0, -5, 1, -1] as int[]) 0 * _ } diff --git a/dd-java-agent/instrumentation/java/java-lang/java-lang-9.0/src/test/java/foo/bar/TestStringConcatFactorySuite.java b/dd-java-agent/instrumentation/java/java-lang/java-lang-9.0/src/test/java/foo/bar/TestStringConcatFactorySuite.java index 2bf8ce74c84..6371eba174a 100644 --- a/dd-java-agent/instrumentation/java/java-lang/java-lang-9.0/src/test/java/foo/bar/TestStringConcatFactorySuite.java +++ b/dd-java-agent/instrumentation/java/java-lang/java-lang-9.0/src/test/java/foo/bar/TestStringConcatFactorySuite.java @@ -5,6 +5,8 @@ import org.slf4j.LoggerFactory; public abstract class TestStringConcatFactorySuite { + // Explicit escape for non-ASCII symbol to make test independent of container settings. + private static final String UTF_CONSTANT = "\uD840\uDDA2"; // 𠆢 private static final Logger LOGGER = LoggerFactory.getLogger(TestStringConcatFactorySuite.class); @@ -33,7 +35,8 @@ public static String plusWithConstantsAndTags(final String left, final String ri public static String plusWithUtfConstants(final String left, final String right) { LOGGER.debug("Before string plus {} {}", left, right); - final String result = "𠆢" + left + "𠆢\u0001𠆢" + right + "."; + final String result = + UTF_CONSTANT + left + UTF_CONSTANT + "\u0001" + UTF_CONSTANT + right + "."; LOGGER.debug("After string plus {}", result); return result; } @@ -50,7 +53,8 @@ public static String stringPlusWithMultipleObjects(final Object... target) { LOGGER.debug("Before string plus {}", Arrays.toString(target)); String result = ""; for (final Object item : target) { - result += item; + //noinspection StringConcatenationInLoop + result += item; // intentional `+` in loop for test. } LOGGER.debug("After string plus {}", result); return result; diff --git a/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/datadog/trace/instrumentation/java/net/URLEncoderCallSiteTest.groovy b/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/datadog/trace/instrumentation/java/net/URLEncoderCallSiteTest.groovy index 5e75f298b28..bcbe1ce070d 100644 --- a/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/datadog/trace/instrumentation/java/net/URLEncoderCallSiteTest.groovy +++ b/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/datadog/trace/instrumentation/java/net/URLEncoderCallSiteTest.groovy @@ -7,6 +7,8 @@ import datadog.trace.api.iast.propagation.PropagationModule import foo.bar.TestURLEncoderCallSiteSuite class URLEncoderCallSiteTest extends InstrumentationSpecification { + // Explicit escape for non-ASCII `ståle` to make test independent of container settings. + private static final String NON_ASCII_QUERY = 'my test.asp?name=st\u00E5le&car=saab' @Override protected void configurePreAgent() { @@ -27,9 +29,9 @@ class URLEncoderCallSiteTest extends InstrumentationSpecification { 0 * _ where: - args | expected - ['my test.asp?name=ståle&car=saab'] | 'my+test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab' - ['my test.asp?name=ståle&car=saab', 'UTF-8'] | 'my+test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab' + args | expected + [NON_ASCII_QUERY] | 'my+test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab' + [NON_ASCII_QUERY, 'UTF-8'] | 'my+test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab' } void 'test encode with null args'() { diff --git a/internal-api/src/test/groovy/datadog/trace/api/git/RawParseUtilsTest.groovy b/internal-api/src/test/groovy/datadog/trace/api/git/RawParseUtilsTest.groovy index f262a5c127b..84b457d9956 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/git/RawParseUtilsTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/api/git/RawParseUtilsTest.groovy @@ -1,16 +1,16 @@ package datadog.trace.api.git +import static java.nio.charset.StandardCharsets.UTF_16 +import static java.nio.charset.StandardCharsets.UTF_8 import spock.lang.Specification -import java.nio.charset.StandardCharsets - class RawParseUtilsTest extends Specification { def "test decode no fallback"() { setup: - def str = new String("some-string".getBytes(), StandardCharsets.UTF_16) - def encoded = str.bytes + def str = new String("some-string".getBytes(), UTF_16) + def encoded = str.getBytes(UTF_8) when: def decoded = RawParseUtils.decode(encoded, 0, encoded.length) @@ -21,8 +21,8 @@ class RawParseUtilsTest extends Specification { def "test extract binary string"() { setup: - def str = new String("some-string".getBytes(), StandardCharsets.UTF_8) - def encoded = str.bytes + def str = new String("some-string".getBytes(), UTF_8) + def encoded = str.getBytes(UTF_8) when: def decoded = RawParseUtils.extractBinaryString(encoded, 0, encoded.length)