From 68768adf89c7e75a0e7a726c09d59fc26da2c0b4 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 27 Mar 2026 15:53:31 -0400 Subject: [PATCH 01/23] Initial support for running tests on CI under Windows OS. --- .gitlab-ci.yml | 149 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a1c4a61c2f3..9168004a173 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,6 +29,9 @@ 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/" + WINDOWS_JDK_VERSION: "21.0.9+10" # keep pinned to a Temurin 21 GA patch release and bump periodically + 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 +349,19 @@ 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: + - | + $ErrorActionPreference = "Stop" + .\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 +587,116 @@ muzzle-dep-report: .restore_pretest_env: &restore_pretest_env - source pretest.env +.windows_test_cache: + cache: + - key: "windows-jdk-temurin-${WINDOWS_JDK_VERSION}-x64" + paths: + - .tools/jdk-21/ + 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: clone + 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("\", "/") + $jdkArchiveVersion = $env:WINDOWS_JDK_VERSION.Replace("+", "_") + $jdkZip = Join-Path $env:TEMP "temurin-jdk-$jdkArchiveVersion-windows-x64.zip" + $jdkExtract = Join-Path $toolsDir "jdk-extract" + $jdkHome = Join-Path $toolsDir "jdk-21" + $jdkUrl = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-$($env:WINDOWS_JDK_VERSION)/OpenJDK21U-jdk_x64_windows_hotspot_$jdkArchiveVersion.zip" + + 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 + @( + "DD_SERVICE", + "DD_ENTITY_ID", + "DD_SITE", + "DD_ENV", + "DD_DATACENTER", + "DD_PARTITION", + "DD_CLOUDPROVIDER" + ) | ForEach-Object { + if (Test-Path "Env:$_") { + Remove-Item "Env:$_" + } + } + + 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 + } + + $env:JAVA_HOME = $jdkHome + $env:JAVA_21_HOME = $jdkHome + $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_21_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 + + java -version + .\gradlew.bat --version + .test_job: extends: .gradle_build image: ${BUILDER_IMAGE_REPO}:${BUILDER_IMAGE_VERSION_PREFIX}$testJvm @@ -688,6 +814,29 @@ test_base: - if [ "$testJvm" == "8" ]; then export GRADLE_PARAMS="-PskipFlakyTests -PcheckCoverage"; fi - !reference [.test_job, script] +test_base_windows21: + extends: .windows_base_test_job + when: manual + allow_failure: true + script: + - | + $ErrorActionPreference = "Stop" + .\gradlew.bat :baseTest -PskipFlakyTests -PtestJvm=21 --stacktrace --no-daemon --parallel --max-workers=4 --continue + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + artifacts: + when: always + paths: + - workspace/**/build/test-results/** + - workspace/**/build/reports/tests/** + - buildSrc/build/test-results/** + - buildSrc/build/reports/tests/** + - .gradle/daemon/*/*.out.log + - .tmp/** + reports: + junit: + - workspace/**/build/test-results/**/*.xml + - buildSrc/build/test-results/**/*.xml + test_inst: extends: .test_job_with_test_agent variables: From 855700a82ec331e4b0aa6a43df3397445bd45c50 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 27 Mar 2026 16:05:00 -0400 Subject: [PATCH 02/23] Code review. --- .gitlab-ci.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9168004a173..969af8d8193 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -30,6 +30,7 @@ variables: 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/" WINDOWS_JDK_VERSION: "21.0.9+10" # keep pinned to a Temurin 21 GA patch release and bump periodically + WINDOWS_JDK_DIR: "jdk-21" # local directory name for the JDK; update alongside WINDOWS_JDK_VERSION major 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 @@ -358,7 +359,6 @@ populate_dep_cache_windows: WINDOWS_DEPENDENCY_CACHE_POLICY: push script: - | - $ErrorActionPreference = "Stop" .\gradlew.bat :baseTest -PskipTests -PtestJvm=21 --stacktrace --no-daemon --parallel --max-workers=4 if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } @@ -591,7 +591,7 @@ muzzle-dep-report: cache: - key: "windows-jdk-temurin-${WINDOWS_JDK_VERSION}-x64" paths: - - .tools/jdk-21/ + - .tools/${WINDOWS_JDK_DIR}/ policy: $WINDOWS_BOOTSTRAP_CACHE_POLICY unprotect: true - key: @@ -639,7 +639,7 @@ muzzle-dep-report: $jdkArchiveVersion = $env:WINDOWS_JDK_VERSION.Replace("+", "_") $jdkZip = Join-Path $env:TEMP "temurin-jdk-$jdkArchiveVersion-windows-x64.zip" $jdkExtract = Join-Path $toolsDir "jdk-extract" - $jdkHome = Join-Path $toolsDir "jdk-21" + $jdkHome = Join-Path $toolsDir $env:WINDOWS_JDK_DIR $jdkUrl = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-$($env:WINDOWS_JDK_VERSION)/OpenJDK21U-jdk_x64_windows_hotspot_$jdkArchiveVersion.zip" New-Item -ItemType Directory -Force -Path $toolsDir, $tmpDir, ".gradle", ".mvn\caches" | Out-Null @@ -820,7 +820,6 @@ test_base_windows21: allow_failure: true script: - | - $ErrorActionPreference = "Stop" .\gradlew.bat :baseTest -PskipFlakyTests -PtestJvm=21 --stacktrace --no-daemon --parallel --max-workers=4 --continue if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } artifacts: From 3c3d311efb2c3c430e1f22710763224b579f987f Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 27 Mar 2026 16:10:00 -0400 Subject: [PATCH 03/23] Fixed build. --- .gitlab-ci.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 969af8d8193..ae798a052c8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -622,7 +622,7 @@ muzzle-dep-report: tags: [ "windows-v2:2025" ] needs: [] variables: - GIT_STRATEGY: clone + GIT_STRATEGY: none GIT_SUBMODULE_STRATEGY: normal GIT_SUBMODULE_DEPTH: 1 SKIP_BUILDSCAN: "true" @@ -639,7 +639,7 @@ muzzle-dep-report: $jdkArchiveVersion = $env:WINDOWS_JDK_VERSION.Replace("+", "_") $jdkZip = Join-Path $env:TEMP "temurin-jdk-$jdkArchiveVersion-windows-x64.zip" $jdkExtract = Join-Path $toolsDir "jdk-extract" - $jdkHome = Join-Path $toolsDir $env:WINDOWS_JDK_DIR + $jdkHome = Join-Path $toolsDir "jdk-21" $jdkUrl = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-$($env:WINDOWS_JDK_VERSION)/OpenJDK21U-jdk_x64_windows_hotspot_$jdkArchiveVersion.zip" New-Item -ItemType Directory -Force -Path $toolsDir, $tmpDir, ".gradle", ".mvn\caches" | Out-Null @@ -651,6 +651,18 @@ muzzle-dep-report: 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", From eaf7d2c39b53eeddfbc78e4d228583333ca5c52c Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 27 Mar 2026 18:13:20 -0400 Subject: [PATCH 04/23] Other JDKs added --- .gitlab-ci.yml | 65 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ae798a052c8..b06cc5034e2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,8 +29,10 @@ 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/" - WINDOWS_JDK_VERSION: "21.0.9+10" # keep pinned to a Temurin 21 GA patch release and bump periodically - WINDOWS_JDK_DIR: "jdk-21" # local directory name for the JDK; update alongside WINDOWS_JDK_VERSION major + WINDOWS_JDK8_VERSION: "8u472-b08" # keep pinned to Temurin GA patch releases and bump periodically + WINDOWS_JDK11_VERSION: "11.0.29+7" + WINDOWS_JDK17_VERSION: "17.0.17+10" + WINDOWS_JDK21_VERSION: "21.0.9+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 @@ -589,9 +591,12 @@ muzzle-dep-report: .windows_test_cache: cache: - - key: "windows-jdk-temurin-${WINDOWS_JDK_VERSION}-x64" + - key: "windows-jdks-temurin-${WINDOWS_JDK8_VERSION}-${WINDOWS_JDK11_VERSION}-${WINDOWS_JDK17_VERSION}-${WINDOWS_JDK21_VERSION}-x64" paths: - - .tools/${WINDOWS_JDK_DIR}/ + - .tools/jdk-8/ + - .tools/jdk-11/ + - .tools/jdk-17/ + - .tools/jdk-21/ policy: $WINDOWS_BOOTSTRAP_CACHE_POLICY unprotect: true - key: @@ -636,11 +641,14 @@ muzzle-dep-report: $toolsDir = Join-Path $env:CI_PROJECT_DIR ".tools" $tmpDir = Join-Path $env:CI_PROJECT_DIR ".tmp" $tmpDirJava = $tmpDir.Replace("\", "/") - $jdkArchiveVersion = $env:WINDOWS_JDK_VERSION.Replace("+", "_") - $jdkZip = Join-Path $env:TEMP "temurin-jdk-$jdkArchiveVersion-windows-x64.zip" - $jdkExtract = Join-Path $toolsDir "jdk-extract" - $jdkHome = Join-Path $toolsDir "jdk-21" - $jdkUrl = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-$($env:WINDOWS_JDK_VERSION)/OpenJDK21U-jdk_x64_windows_hotspot_$jdkArchiveVersion.zip" + $jdk8ArchiveVersion = $env:WINDOWS_JDK8_VERSION.Replace("-", "") + $jdk11ArchiveVersion = $env:WINDOWS_JDK11_VERSION.Replace("+", "_") + $jdk17ArchiveVersion = $env:WINDOWS_JDK17_VERSION.Replace("+", "_") + $jdk21ArchiveVersion = $env:WINDOWS_JDK21_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" New-Item -ItemType Directory -Force -Path $toolsDir, $tmpDir, ".gradle", ".mvn\caches" | Out-Null try { @@ -677,19 +685,31 @@ muzzle-dep-report: } } - 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 + 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 + } } - $env:JAVA_HOME = $jdkHome - $env:JAVA_21_HOME = $jdkHome + 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" + + $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: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 @@ -703,9 +723,12 @@ muzzle-dep-report: 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_21_HOME" -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" -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 java -version .\gradlew.bat --version From 0e25abd9238a706faf65c93c10cadc1da5366b05 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 27 Mar 2026 18:27:04 -0400 Subject: [PATCH 05/23] Added JDK 25 and updated other JDKs to latest. --- .gitlab-ci.yml | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b06cc5034e2..19bf31b0c8e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,10 +29,11 @@ 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/" - WINDOWS_JDK8_VERSION: "8u472-b08" # keep pinned to Temurin GA patch releases and bump periodically - WINDOWS_JDK11_VERSION: "11.0.29+7" - WINDOWS_JDK17_VERSION: "17.0.17+10" - WINDOWS_JDK21_VERSION: "21.0.9+10" + 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 @@ -591,12 +592,13 @@ muzzle-dep-report: .windows_test_cache: cache: - - key: "windows-jdks-temurin-${WINDOWS_JDK8_VERSION}-${WINDOWS_JDK11_VERSION}-${WINDOWS_JDK17_VERSION}-${WINDOWS_JDK21_VERSION}-x64" + - 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: @@ -645,10 +647,12 @@ muzzle-dep-report: $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 { @@ -704,12 +708,14 @@ muzzle-dep-report: 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 @@ -723,12 +729,14 @@ muzzle-dep-report: 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" -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 From c17176c735776cab7d69c32eeca9f498da4d0607 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Mon, 30 Mar 2026 17:53:52 -0400 Subject: [PATCH 06/23] ARM64 POC test. --- .gitlab-ci.yml | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4560b31621b..06c1ae6aa62 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,6 +29,8 @@ 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_PREFIX: "alexeyk_arm64-test-arm64-" 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" @@ -810,6 +812,71 @@ muzzle-dep-report: - scheduler_failure - data_integrity_failure +.test_job_arm64_poc: + image: ${ARM64_BUILDER_IMAGE_REPO}:${ARM64_BUILDER_IMAGE_TAG_PREFIX}$testJvm + 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 + TESTCONTAINERS_CHECKS_DISABLE: "true" + TESTCONTAINERS_RYUK_DISABLED: "true" + TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX: "registry.ddbuild.io/images/mirror/" + JETTY_AVAILABLE_PROCESSORS: 4 + before_script: + - 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 < Date: Mon, 30 Mar 2026 18:02:40 -0400 Subject: [PATCH 07/23] Missing git --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 06c1ae6aa62..7d01bda2018 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -836,6 +836,8 @@ muzzle-dep-report: TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX: "registry.ddbuild.io/images/mirror/" JETTY_AVAILABLE_PROCESSORS: 4 before_script: + - apt-get update + - apt-get install -y --no-install-recommends git - export ORG_GRADLE_PROJECT_mavenRepositoryProxy=$MAVEN_REPOSITORY_PROXY - export ORG_GRADLE_PROJECT_gradlePluginProxy=$GRADLE_PLUGIN_PROXY - | From 4f693f1e50158f9b50d9a626ad367637d9a9ac10 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Tue, 31 Mar 2026 10:12:26 -0400 Subject: [PATCH 08/23] WIP --- .gitlab-ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7d01bda2018..d4742ea2326 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -831,6 +831,9 @@ muzzle-dep-report: 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/" @@ -955,6 +958,9 @@ test_base_arm64: variables: testJvm: "21" GRADLE_TARGET: ":baseTest" + parallel: + matrix: + - CI_SPLIT: [ "1/4", "2/4", "3/4", "4/4" ] test_inst: extends: .test_job_with_test_agent From c44f94a7fa199b23522d4d9c7233164aa0f94ccd Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Tue, 31 Mar 2026 12:28:21 -0400 Subject: [PATCH 09/23] Attempt to fix container setup --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d4742ea2326..010a41fdf7e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -834,6 +834,8 @@ muzzle-dep-report: KUBERNETES_CPU_REQUEST: 10 KUBERNETES_MEMORY_REQUEST: 20Gi KUBERNETES_MEMORY_LIMIT: 20Gi + LANG: C.UTF-8 + LC_ALL: C.UTF-8 TESTCONTAINERS_CHECKS_DISABLE: "true" TESTCONTAINERS_RYUK_DISABLED: "true" TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX: "registry.ddbuild.io/images/mirror/" From ca702f5a1214d919e77517a7b9e56e32e7b43776 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Tue, 31 Mar 2026 13:24:20 -0400 Subject: [PATCH 10/23] Refactor fix by using charsets explicitly. --- .gitlab-ci.yml | 2 -- .../datadog/trace/api/git/RawParseUtilsTest.groovy | 12 ++++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 010a41fdf7e..d4742ea2326 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -834,8 +834,6 @@ muzzle-dep-report: KUBERNETES_CPU_REQUEST: 10 KUBERNETES_MEMORY_REQUEST: 20Gi KUBERNETES_MEMORY_LIMIT: 20Gi - LANG: C.UTF-8 - LC_ALL: C.UTF-8 TESTCONTAINERS_CHECKS_DISABLE: "true" TESTCONTAINERS_RYUK_DISABLED: "true" TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX: "registry.ddbuild.io/images/mirror/" 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) From df8d6c4426a07e53a33f1df53b51833241490539 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Tue, 31 Mar 2026 14:52:15 -0400 Subject: [PATCH 11/23] Fixed tests for arm64 --- .gitlab-ci.yml | 7 ++++ .../msgpack/MsgPackWriterTest.java | 37 ++++++++++--------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d4742ea2326..16ea3010a84 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -839,6 +839,7 @@ muzzle-dep-report: TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX: "registry.ddbuild.io/images/mirror/" JETTY_AVAILABLE_PROCESSORS: 4 before_script: + - source .gitlab/gitlab-utils.sh - apt-get update - apt-get install -y --no-install-recommends git - export ORG_GRADLE_PROJECT_mavenRepositoryProxy=$MAVEN_REPOSITORY_PROXY @@ -854,6 +855,12 @@ muzzle-dep-report: - export GRADLE_USER_HOME=$(pwd)/.gradle - sed -i "s|https://repo.maven.apache.org/maven2/|$MAVEN_REPOSITORY_PROXY|g" .mvn/wrapper/maven-wrapper.properties - *normalize_node_index + - gitlab_section_start "gradle-dance" "Fix .gradle directory permissions" + - cp -r .gradle .gradle-copy + - rm -rf .gradle + - mv .gradle-copy .gradle + - ls -la + - gitlab_section_end "gradle-dance" - *prepare_test_env - export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xms$GRADLE_MEMORY_MIN -Xmx$GRADLE_MEMORY_MAX -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp -Djava.util.prefs.userRoot=/tmp/.java/.userPrefs-${CI_JOB_ID}' -Ddatadog.forkedMinHeapSize=128M -Ddatadog.forkedMaxHeapSize=1024M" - export GRADLE_ARGS="--build-cache --stacktrace --no-daemon --parallel --max-workers=$GRADLE_WORKERS" diff --git a/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java b/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java index 48a7b72cb0b..5c87afb7e85 100644 --- a/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java +++ b/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java @@ -1,6 +1,7 @@ package datadog.communication.serialization.msgpack; import static datadog.trace.util.stacktrace.StackTraceEvent.DEFAULT_LANGUAGE; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -19,7 +20,6 @@ import java.math.BigDecimal; import java.nio.ByteBuffer; import java.nio.CharBuffer; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -33,6 +33,9 @@ import org.msgpack.core.MessageUnpacker; public class MsgPackWriterTest { + private static final String NON_ASCII_STRING = "foobár"; + private static final byte[] NON_ASCII_BYTES = NON_ASCII_STRING.getBytes(UTF_8); + private static final int NON_ASCII_BUFFER_CAPACITY = NON_ASCII_BYTES.length + 4; @Test public void testOverflow() { @@ -141,13 +144,12 @@ public void testWriteBinaryNoArgVariant() { MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); try { assertEquals(unpacker.unpackBinaryHeader(), 6); - assertArrayEquals( - unpacker.readPayload(6), "foobar".getBytes(StandardCharsets.UTF_8)); + assertArrayEquals(unpacker.readPayload(6), "foobar".getBytes(UTF_8)); } catch (IOException e) { Assertions.fail(e.getMessage()); } })); - writer.writeBinary("foobar".getBytes(StandardCharsets.UTF_8)); + writer.writeBinary("foobar".getBytes(UTF_8)); } @Test @@ -628,16 +630,17 @@ public void testWriteObjectArray() { @Test public void testWriteStringUTF8BytesString() { - UTF8BytesString value = UTF8BytesString.create("foobár"); + UTF8BytesString value = UTF8BytesString.create(NON_ASCII_STRING); + int encodedLength = value.encodedLength(); MsgPackWriter writer = new MsgPackWriter( newBuffer( - 20, + (encodedLength + 4) * 2, (messageCount, buffer) -> { MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); try { - assertEquals(unpacker.unpackString(), "foobár"); - assertEquals(unpacker.unpackString(), "foobár"); + assertEquals(unpacker.unpackString(), NON_ASCII_STRING); + assertEquals(unpacker.unpackString(), NON_ASCII_STRING); } catch (IOException e) { Assertions.fail(e.getMessage()); } @@ -671,7 +674,7 @@ public void testWriteObjectStringGeneralPath() { new Object() { @Override public String toString() { - return "foobár"; + return NON_ASCII_STRING; } }; MsgPackWriter writer = @@ -681,14 +684,14 @@ public String toString() { (messageCount, buffer) -> { MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); try { - assertEquals(unpacker.unpackString(), "foobár"); + assertEquals(unpacker.unpackString(), NON_ASCII_STRING); assertEquals(unpacker.unpackString(), "foobàr"); } catch (IOException e) { Assertions.fail(e.getMessage()); } })); writer.writeObjectString(value, null); - writer.writeObjectString(value, s -> "foobàr".getBytes(StandardCharsets.UTF_8)); + writer.writeObjectString(value, s -> "foobàr".getBytes(UTF_8)); } @Test @@ -696,16 +699,16 @@ 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"); + assertEquals(unpacker.unpackString(), NON_ASCII_STRING); } catch (IOException e) { Assertions.fail(e.getMessage()); } })); - CharBuffer charSeq = CharBuffer.wrap("foobár"); + CharBuffer charSeq = CharBuffer.wrap(NON_ASCII_STRING); writer.writeString(charSeq, null); } @@ -714,16 +717,16 @@ 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"); + assertEquals(unpacker.unpackString(), NON_ASCII_STRING); } catch (IOException e) { Assertions.fail(e.getMessage()); } })); - writer.writeString("", s -> "foobár".getBytes(StandardCharsets.UTF_8)); + writer.writeString("", s -> NON_ASCII_BYTES); } @Test From e89fa15f9253d3ac306b6e5d0d25f0da1241feb6 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Tue, 31 Mar 2026 22:27:14 -0400 Subject: [PATCH 12/23] wip --- .gitlab-ci.yml | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 16ea3010a84..95c12002371 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -30,7 +30,7 @@ variables: 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_PREFIX: "alexeyk_arm64-test-arm64-" + 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" @@ -813,7 +813,7 @@ muzzle-dep-report: - data_integrity_failure .test_job_arm64_poc: - image: ${ARM64_BUILDER_IMAGE_REPO}:${ARM64_BUILDER_IMAGE_TAG_PREFIX}$testJvm + image: ${ARM64_BUILDER_IMAGE_REPO}:${ARM64_BUILDER_IMAGE_TAG} tags: [ "docker-in-docker:arm64" ] stage: tests needs: [] @@ -839,9 +839,6 @@ muzzle-dep-report: TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX: "registry.ddbuild.io/images/mirror/" JETTY_AVAILABLE_PROCESSORS: 4 before_script: - - source .gitlab/gitlab-utils.sh - - apt-get update - - apt-get install -y --no-install-recommends git - export ORG_GRADLE_PROJECT_mavenRepositoryProxy=$MAVEN_REPOSITORY_PROXY - export ORG_GRADLE_PROJECT_gradlePluginProxy=$GRADLE_PLUGIN_PROXY - | @@ -855,18 +852,13 @@ muzzle-dep-report: - export GRADLE_USER_HOME=$(pwd)/.gradle - sed -i "s|https://repo.maven.apache.org/maven2/|$MAVEN_REPOSITORY_PROXY|g" .mvn/wrapper/maven-wrapper.properties - *normalize_node_index - - gitlab_section_start "gradle-dance" "Fix .gradle directory permissions" - - cp -r .gradle .gradle-copy - - rm -rf .gradle - - mv .gradle-copy .gradle - - ls -la - - gitlab_section_end "gradle-dance" - *prepare_test_env - export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xms$GRADLE_MEMORY_MIN -Xmx$GRADLE_MEMORY_MAX -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp -Djava.util.prefs.userRoot=/tmp/.java/.userPrefs-${CI_JOB_ID}' -Ddatadog.forkedMinHeapSize=128M -Ddatadog.forkedMaxHeapSize=1024M" - export GRADLE_ARGS="--build-cache --stacktrace --no-daemon --parallel --max-workers=$GRADLE_WORKERS" - - ./gradlew --version + - chown -R non-root-user:non-root-group "$CI_PROJECT_DIR" + - su -m non-root-user -c "./gradlew --version" script: - - ./gradlew $GRADLE_TARGET $GRADLE_PARAMS -PtestJvm=$testJvm -Pslot=$CI_NODE_INDEX/$CI_NODE_TOTAL $GRADLE_ARGS --continue + - su -m non-root-user -c "./gradlew $GRADLE_TARGET $GRADLE_PARAMS -PtestJvm=$testJvm -Pslot=$CI_NODE_INDEX/$CI_NODE_TOTAL $GRADLE_ARGS --continue" artifacts: when: always paths: From df99d3c1d8827267c00bd3861615189ce75641fb Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Tue, 31 Mar 2026 22:36:46 -0400 Subject: [PATCH 13/23] wip --- .gitlab-ci.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 95c12002371..915526b0e75 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -855,10 +855,9 @@ muzzle-dep-report: - *prepare_test_env - export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xms$GRADLE_MEMORY_MIN -Xmx$GRADLE_MEMORY_MAX -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp -Djava.util.prefs.userRoot=/tmp/.java/.userPrefs-${CI_JOB_ID}' -Ddatadog.forkedMinHeapSize=128M -Ddatadog.forkedMaxHeapSize=1024M" - export GRADLE_ARGS="--build-cache --stacktrace --no-daemon --parallel --max-workers=$GRADLE_WORKERS" - - chown -R non-root-user:non-root-group "$CI_PROJECT_DIR" - - su -m non-root-user -c "./gradlew --version" + - ./gradlew --version script: - - su -m non-root-user -c "./gradlew $GRADLE_TARGET $GRADLE_PARAMS -PtestJvm=$testJvm -Pslot=$CI_NODE_INDEX/$CI_NODE_TOTAL $GRADLE_ARGS --continue" + - ./gradlew $GRADLE_TARGET $GRADLE_PARAMS -PtestJvm=$testJvm -Pslot=$CI_NODE_INDEX/$CI_NODE_TOTAL $GRADLE_ARGS --continue artifacts: when: always paths: From 471763dc369e61018812713c78276e29268ebbcc Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Tue, 31 Mar 2026 23:07:08 -0400 Subject: [PATCH 14/23] wip --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 915526b0e75..eaee846c59f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -839,6 +839,7 @@ muzzle-dep-report: TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX: "registry.ddbuild.io/images/mirror/" JETTY_AVAILABLE_PROCESSORS: 4 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 - | From 81d76354c6e536a35c1652b9032792270406755e Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Wed, 1 Apr 2026 09:13:25 -0400 Subject: [PATCH 15/23] Fixed issues with git and test. --- .gitlab-ci.yml | 2 ++ .../json/src/test/java/datadog/json/JsonReaderTest.java | 2 +- .../buildid/BuildIdExtractorIntegrationTest.java | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index eaee846c59f..9bcf51cef3a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -838,6 +838,8 @@ muzzle-dep-report: 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 diff --git a/components/json/src/test/java/datadog/json/JsonReaderTest.java b/components/json/src/test/java/datadog/json/JsonReaderTest.java index e716a625103..802c83f26b3 100644 --- a/components/json/src/test/java/datadog/json/JsonReaderTest.java +++ b/components/json/src/test/java/datadog/json/JsonReaderTest.java @@ -215,7 +215,7 @@ void testStringEscaping() { assertEquals("\n", reader.nextString()); assertEquals("\r", reader.nextString()); assertEquals("\t", reader.nextString()); - assertEquals("É", reader.nextString()); + 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..b36fa3a34a2 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 @@ -1,9 +1,12 @@ package datadog.crashtracking.buildid; +import static datadog.environment.OperatingSystem.Architecture.ARM64; 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 +137,9 @@ private static Stream elfBinaries() { @ParameterizedTest(name = "ELF: {1}") @MethodSource("elfBinaries") void testElfBuildIdExtraction(String containerPath, String description) throws Exception { + assumeFalse( + OperatingSystem.architecture() == ARM64, + "ELF test uses x86_64 container library paths and is not portable to arm64"); Path localBinary = copyFromContainer(linuxContainer, containerPath); ElfBuildIdExtractor extractor = new ElfBuildIdExtractor(); From 82f4c2d885db18b304e913f12ec98475d720c27a Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Wed, 1 Apr 2026 11:13:42 -0400 Subject: [PATCH 16/23] Fixed `arm64` test failures and clean up related code. --- .../msgpack/MsgPackWriterTest.java | 257 ++++++++---------- .../java/datadog/json/JsonReaderTest.java | 2 +- .../BuildIdExtractorIntegrationTest.java | 6 + .../trace/api/git/RawParseUtilsTest.groovy | 12 +- 4 files changed, 126 insertions(+), 151 deletions(-) diff --git a/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java b/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java index 48a7b72cb0b..071dea20fcf 100644 --- a/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java +++ b/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java @@ -1,10 +1,12 @@ package datadog.communication.serialization.msgpack; import static datadog.trace.util.stacktrace.StackTraceEvent.DEFAULT_LANGUAGE; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; import datadog.communication.serialization.ByteBufferConsumer; import datadog.communication.serialization.Codec; @@ -19,7 +21,6 @@ import java.math.BigDecimal; import java.nio.ByteBuffer; import java.nio.CharBuffer; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -27,12 +28,14 @@ import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.msgpack.core.MessagePack; import org.msgpack.core.MessageUnpacker; public class MsgPackWriterTest { + private static final String NON_ASCII_STRING = "foobár"; + private static final byte[] NON_ASCII_BYTES = NON_ASCII_STRING.getBytes(UTF_8); + private static final int NON_ASCII_BUFFER_CAPACITY = NON_ASCII_BYTES.length + 4; @Test public void testOverflow() { @@ -71,13 +74,16 @@ public void testFlushOfOverflow() { newBuffer( 2 + 25, // enough space for a 25 element string and its 2 byte header (messageCount, buffer) -> { - 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 +123,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 +143,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 +161,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 +181,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 +201,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 +221,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 +238,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 +255,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 +273,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 +291,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 +309,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 +327,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 +348,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 +369,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 +390,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 +411,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 +432,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 +453,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 +471,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 +495,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 +522,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 +540,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 +558,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 +576,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 +594,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 +608,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 +632,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 +649,7 @@ public void testWriteObjectStringGeneralPath() { new Object() { @Override public String toString() { - return "foobár"; + return NON_ASCII_STRING; } }; MsgPackWriter writer = @@ -679,16 +657,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("foobàr", 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 -> "foobàr".getBytes(UTF_8)); } @Test @@ -696,16 +673,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 +690,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 +708,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 +730,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 +750,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 +786,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 +804,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 +820,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/json/src/test/java/datadog/json/JsonReaderTest.java b/components/json/src/test/java/datadog/json/JsonReaderTest.java index e716a625103..802c83f26b3 100644 --- a/components/json/src/test/java/datadog/json/JsonReaderTest.java +++ b/components/json/src/test/java/datadog/json/JsonReaderTest.java @@ -215,7 +215,7 @@ void testStringEscaping() { assertEquals("\n", reader.nextString()); assertEquals("\r", reader.nextString()); assertEquals("\t", reader.nextString()); - assertEquals("É", reader.nextString()); + 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..b36fa3a34a2 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 @@ -1,9 +1,12 @@ package datadog.crashtracking.buildid; +import static datadog.environment.OperatingSystem.Architecture.ARM64; 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 +137,9 @@ private static Stream elfBinaries() { @ParameterizedTest(name = "ELF: {1}") @MethodSource("elfBinaries") void testElfBuildIdExtraction(String containerPath, String description) throws Exception { + assumeFalse( + OperatingSystem.architecture() == ARM64, + "ELF test uses x86_64 container library paths and is not portable to arm64"); Path localBinary = copyFromContainer(linuxContainer, containerPath); ElfBuildIdExtractor extractor = new ElfBuildIdExtractor(); 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) From 0d501a839db1e841b5c789c1596c7a23129bba40 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Wed, 1 Apr 2026 11:20:33 -0400 Subject: [PATCH 17/23] Minor comment. --- .../buildid/BuildIdExtractorIntegrationTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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 b36fa3a34a2..a0cf46ea89b 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 @@ -137,9 +137,8 @@ private static Stream elfBinaries() { @ParameterizedTest(name = "ELF: {1}") @MethodSource("elfBinaries") void testElfBuildIdExtraction(String containerPath, String description) throws Exception { - assumeFalse( - OperatingSystem.architecture() == ARM64, - "ELF test uses x86_64 container library paths and is not portable to arm64"); + // TODO: check if arm64 can be supported too. + assumeFalse(OperatingSystem.architecture() == ARM64, "Skipping for arm64"); Path localBinary = copyFromContainer(linuxContainer, containerPath); ElfBuildIdExtractor extractor = new ElfBuildIdExtractor(); From 80de346e9629c6d7365582a15dc14762f9ffa465 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Wed, 1 Apr 2026 12:53:53 -0400 Subject: [PATCH 18/23] wip --- .../msgpack/MsgPackWriterTest.java | 239 ++++++++---------- 1 file changed, 103 insertions(+), 136 deletions(-) diff --git a/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java b/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java index 5c87afb7e85..1fb070c53cc 100644 --- a/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java +++ b/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; import datadog.communication.serialization.ByteBufferConsumer; import datadog.communication.serialization.Codec; @@ -27,15 +28,15 @@ import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.msgpack.core.MessagePack; import org.msgpack.core.MessageUnpacker; public class MsgPackWriterTest { - private static final String NON_ASCII_STRING = "foobár"; + // Explicit escapes for non-ASCII test data so it is independent of container settings. + private static final String NON_ASCII_STRING = "foob\u00E1r_\u263a"; // foobár_☺ private static final byte[] NON_ASCII_BYTES = NON_ASCII_STRING.getBytes(UTF_8); - private static final int NON_ASCII_BUFFER_CAPACITY = NON_ASCII_BYTES.length + 4; + private static final int NON_ASCII_BUFFER_CAPACITY = NON_ASCII_BYTES.length + 1; @Test public void testOverflow() { @@ -74,13 +75,16 @@ public void testFlushOfOverflow() { newBuffer( 2 + 25, // enough space for a 25 element string and its 2 byte header (messageCount, buffer) -> { - 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"); @@ -120,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( @@ -141,12 +144,11 @@ public void testWriteBinaryNoArgVariant() { newBuffer( 10, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { - assertEquals(unpacker.unpackBinaryHeader(), 6); + 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(UTF_8)); @@ -160,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)); @@ -181,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)); @@ -202,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( @@ -223,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)); @@ -241,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)); @@ -259,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)); @@ -278,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)); @@ -297,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)); @@ -316,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)); @@ -335,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)); @@ -357,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)); @@ -379,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)); @@ -401,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)); @@ -423,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)); @@ -445,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)); @@ -467,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)); @@ -486,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( @@ -511,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( @@ -539,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)); @@ -558,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)); @@ -577,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)); @@ -596,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)); @@ -615,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)); @@ -631,18 +610,16 @@ public void testWriteObjectArray() { @Test public void testWriteStringUTF8BytesString() { UTF8BytesString value = UTF8BytesString.create(NON_ASCII_STRING); - int encodedLength = value.encodedLength(); MsgPackWriter writer = new MsgPackWriter( newBuffer( - (encodedLength + 4) * 2, + NON_ASCII_BUFFER_CAPACITY * 2, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { - assertEquals(unpacker.unpackString(), NON_ASCII_STRING); - assertEquals(unpacker.unpackString(), NON_ASCII_STRING); + 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); @@ -656,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); @@ -682,12 +658,11 @@ public String toString() { newBuffer( 40, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { - assertEquals(unpacker.unpackString(), NON_ASCII_STRING); - 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); @@ -701,11 +676,10 @@ public void testWriteStringGeneralCharSequence() { newBuffer( NON_ASCII_BUFFER_CAPACITY, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { - assertEquals(unpacker.unpackString(), NON_ASCII_STRING); + 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(NON_ASCII_STRING); @@ -719,11 +693,10 @@ public void testWriteStringEncodingCache() { newBuffer( NON_ASCII_BUFFER_CAPACITY, (messageCount, buffer) -> { - MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer); - try { - assertEquals(unpacker.unpackString(), NON_ASCII_STRING); + 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 -> NON_ASCII_BYTES); @@ -736,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); @@ -759,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); @@ -780,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); @@ -817,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)); @@ -836,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)); @@ -853,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)); From 23da3ecc9dab6452fe25104e44522c8e5a5cba15 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Wed, 1 Apr 2026 13:20:08 -0400 Subject: [PATCH 19/23] Fixed review notes. --- .../serialization/msgpack/MsgPackWriterTest.java | 7 ++++--- .../json/src/test/java/datadog/json/JsonReaderTest.java | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java b/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java index 071dea20fcf..61a831c97d7 100644 --- a/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java +++ b/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java @@ -33,9 +33,10 @@ import org.msgpack.core.MessageUnpacker; public class MsgPackWriterTest { - private static final String NON_ASCII_STRING = "foobár"; + // Explicit escapes for non-ASCII chars to make test independent of container settings. + private static final String NON_ASCII_STRING = "foob\u00E1r_\u263a"; // foobár_☺ private static final byte[] NON_ASCII_BYTES = NON_ASCII_STRING.getBytes(UTF_8); - private static final int NON_ASCII_BUFFER_CAPACITY = NON_ASCII_BYTES.length + 4; + private static final int NON_ASCII_BUFFER_CAPACITY = NON_ASCII_BYTES.length + 1; @Test public void testOverflow() { @@ -659,7 +660,7 @@ public String toString() { (messageCount, buffer) -> { try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(buffer)) { assertEquals(NON_ASCII_STRING, unpacker.unpackString()); - assertEquals("foobàr", unpacker.unpackString()); + assertEquals(NON_ASCII_STRING, unpacker.unpackString()); } catch (IOException e) { fail(e.getMessage()); } diff --git a/components/json/src/test/java/datadog/json/JsonReaderTest.java b/components/json/src/test/java/datadog/json/JsonReaderTest.java index 802c83f26b3..15a635c148a 100644 --- a/components/json/src/test/java/datadog/json/JsonReaderTest.java +++ b/components/json/src/test/java/datadog/json/JsonReaderTest.java @@ -215,6 +215,7 @@ void testStringEscaping() { assertEquals("\n", reader.nextString()); assertEquals("\r", reader.nextString()); assertEquals("\t", reader.nextString()); + // Explicit escape for non-ASCII `É` to make test independent of container settings. assertEquals("\u00C9", reader.nextString()); reader.endArray(); } catch (IOException e) { From 2f7d96cc6e672c6f421f4ddfa3d793f760f53a99 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Wed, 1 Apr 2026 13:26:29 -0400 Subject: [PATCH 20/23] Fixed review notes. --- .../communication/serialization/msgpack/MsgPackWriterTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java b/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java index 61a831c97d7..0f2a7ea119e 100644 --- a/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java +++ b/communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java @@ -666,7 +666,7 @@ public String toString() { } })); writer.writeObjectString(value, null); - writer.writeObjectString(value, s -> "foobàr".getBytes(UTF_8)); + writer.writeObjectString(value, s -> NON_ASCII_BYTES); } @Test From 90edeb4a63df06251f248146693c83bf1d8760e4 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Wed, 1 Apr 2026 13:43:33 -0400 Subject: [PATCH 21/23] Attempt to run test_inst on arm64 --- .gitlab-ci.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b7ca7f10b4a..20c0467268f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -883,6 +883,25 @@ muzzle-dep-report: - scheduler_failure - data_integrity_failure +.test_job_arm64_with_test_agent: + extends: .test_job_arm64_poc + variables: + CI_USE_TEST_AGENT: "true" + CI_AGENT_HOST: local-agent + services: + - name: registry.ddbuild.io/images/mirror/dd-apm-test-agent/ddapm-test-agent:v1.44.0 + alias: local-agent + variables: + LOG_LEVEL: "DEBUG" + TRACE_LANGUAGE: "java" + DD_SUPPRESS_TRACE_PARSE_ERRORS: "true" + DD_POOL_TRACE_CHECK_FAILURES: "true" + DD_DISABLE_ERROR_RESPONSES: "true" + ENABLED_CHECKS: "trace_content_length,trace_stall,meta_tracer_version_header,trace_count_header,trace_peer_service,trace_dd_service" + script: + - !reference [.test_job_arm64_poc, script] + - .gitlab/check_test_agent_results.sh + .test_job_with_test_agent: extends: .test_job variables: @@ -971,6 +990,17 @@ test_inst: parallel: matrix: *test_matrix_8 +test_inst_arm64: + extends: .test_job_arm64_with_test_agent + when: manual + allow_failure: true + variables: + testJvm: "21" + GRADLE_TARGET: ":instrumentationTest" + parallel: + matrix: + - CI_SPLIT: [ "1/8", "2/8", "3/8", "4/8", "5/8", "6/8", "7/8", "8/8" ] + test_inst_latest: extends: .test_job_with_test_agent variables: From fc166cad8de9ec383e797a1cf4b931aff097fa60 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Wed, 1 Apr 2026 14:32:21 -0400 Subject: [PATCH 22/23] Fixed UTF const. --- .../lang/invoke/StringConcatFactoryCallSiteTest.groovy | 8 +++++--- .../test/java/foo/bar/TestStringConcatFactorySuite.java | 8 ++++++-- .../java/net/URLEncoderCallSiteTest.groovy | 8 +++++--- 3 files changed, 16 insertions(+), 8 deletions(-) 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'() { From eedf1a52fec5d33db70062d423d0486678ed0fca Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Wed, 1 Apr 2026 15:32:21 -0400 Subject: [PATCH 23/23] Fixed arm64 support. --- .gitlab-ci.yml | 2 +- .../datadog/environment/OperatingSystem.java | 10 ++++++++++ .../BuildIdExtractorIntegrationTest.java | 3 +-- .../controller/EnvironmentChecker.java | 8 +------- .../aerospike4/AerospikeBaseTest.groovy | 12 +++++++----- .../src/test/groovy/PubSubTest.groovy | 8 +++----- .../NettyExecutorInstrumentationTest.groovy | 19 ++++++++++--------- 7 files changed, 33 insertions(+), 29 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 20c0467268f..7dcc194cfbe 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -999,7 +999,7 @@ test_inst_arm64: GRADLE_TARGET: ":instrumentationTest" parallel: matrix: - - CI_SPLIT: [ "1/8", "2/8", "3/8", "4/8", "5/8", "6/8", "7/8", "8/8" ] + - CI_SPLIT: [ "1/4", "2/4", "3/4", "4/4" ] test_inst_latest: extends: .test_job_with_test_agent 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/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 a0cf46ea89b..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 @@ -1,6 +1,5 @@ package datadog.crashtracking.buildid; -import static datadog.environment.OperatingSystem.Architecture.ARM64; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -138,7 +137,7 @@ private static Stream elfBinaries() { @MethodSource("elfBinaries") void testElfBuildIdExtraction(String containerPath, String description) throws Exception { // TODO: check if arm64 can be supported too. - assumeFalse(OperatingSystem.architecture() == ARM64, "Skipping for arm64"); + 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