diff --git a/.github/workflows/check.bali.yml b/.github/workflows/check.bali.yml new file mode 100644 index 0000000..7bec807 --- /dev/null +++ b/.github/workflows/check.bali.yml @@ -0,0 +1,231 @@ +name: "Check - Bali Compatibility" + +on: + workflow_call: + secrets: + testsuite_token: + description: "Token for a private testsuite checkout from another repository; needs contents and pull-request write access when apply_updates is set" + required: false + bali_release_token: + description: "Token with contents:read access to elide-dev/bali; required when source is release" + required: false + inputs: + testsuite_ref: + description: "Reviewed testsuite commit containing the Bali integration; defaults to the calling workflow's commit" + required: false + default: "" + type: string + source: + description: "Where the Bali distribution comes from: an artifact of the calling workflow run, or the latest published Bali release" + required: false + default: "artifact" + type: string + artifact: + description: "Bali distribution artifact from the calling build; required when source is artifact" + required: false + default: "" + type: string + runner: + required: false + default: ubuntu-24.04 + type: string + ratchet: + description: "Regenerate expectations/jdk-jtreg.ratchet.toml from this run's failures, like Elide's ratchet; also records the stock-JDK reference baseline when it is missing or stale" + required: false + default: false + type: boolean + apply_updates: + description: "Commit reports/bali, the ratchet, and the reference baseline to update_branch in the testsuite repository and open a pull request" + required: false + default: false + type: boolean + create_pr: + description: "Open or refresh a pull request for update_branch when apply_updates commits changes" + required: false + default: true + type: boolean + update_branch: + description: "Testsuite branch receiving committed reports" + required: false + default: "sync/bali-compatibility" + type: string + update_base: + description: "Testsuite branch the report pull request targets" + required: false + default: "main" + type: string + +permissions: + contents: read + actions: read + +jobs: + compatibility: + name: "Bali" + runs-on: ${{ inputs.runner }} + timeout-minutes: 60 + steps: + - uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 + with: + disable-sudo: true + egress-policy: audit + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 + with: + repository: elide-dev/testsuite + token: ${{ secrets.testsuite_token || github.token }} + ref: ${{ inputs.testsuite_ref || github.sha }} + persist-credentials: false + - uses: step-security/setup-bun@f6f5dadeac34f70c7828f731569e8d6e8330b8fb + with: + bun-version: "1.4.0" + - name: Check distribution source + env: + SOURCE: ${{ inputs.source }} + ARTIFACT: ${{ inputs.artifact }} + shell: bash + run: | + set -euo pipefail + case "$SOURCE" in + artifact) [[ -n "$ARTIFACT" ]] || { echo '::error::source=artifact needs the artifact input'; exit 2; } ;; + release) ;; + *) echo "::error::Unknown source '$SOURCE'; use artifact or release"; exit 2 ;; + esac + - name: Download distribution artifact + if: ${{ inputs.source == 'artifact' }} + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c + with: + name: ${{ inputs.artifact }} + path: .harness/distribution-artifact + - name: Extract distribution artifact + if: ${{ inputs.source == 'artifact' }} + shell: bash + run: | + set -euo pipefail + shopt -s nullglob + archives=(.harness/distribution-artifact/bali-*.tgz) + [[ ${#archives[@]} -eq 1 ]] || { echo 'Expected exactly one Bali distribution tarball'; exit 2; } + mkdir -p .harness/distribution + tar -xzf "${archives[0]}" -C .harness/distribution + - name: Resolve and download latest stable release + if: ${{ inputs.source == 'release' }} + env: + # Bali is internal: the job token cannot read another repository. + GH_TOKEN: ${{ secrets.bali_release_token }} + shell: bash + run: | + set -euo pipefail + if [[ -z "$GH_TOKEN" ]]; then + echo '::error::source=release needs the bali_release_token secret with contents:read access to elide-dev/bali.' + exit 2 + fi + mkdir -p .harness/release .harness/distribution + gh api repos/elide-dev/bali/releases/latest > .harness/release/release.json + bun bin/bali-release.ts select .harness/release/release.json .harness/release/selection.json + asset_id=$(bun -e 'console.log((await Bun.file(".harness/release/selection.json").json()).assetId)') + # Download the resolved asset ID, never resolve "latest" a second time. + gh api "repos/elide-dev/bali/releases/assets/$asset_id" \ + -H 'Accept: application/octet-stream' > .harness/release/distribution.tgz + bun bin/bali-release.ts verify .harness/release/selection.json .harness/release/distribution.tgz + tar -xzf .harness/release/distribution.tgz -C .harness/distribution + - name: Run OpenJDK runtime tests + env: + RATCHET: ${{ inputs.ratchet }} + shell: bash + run: | + set -euo pipefail + args=(--bali-home "$PWD/.harness/distribution") + if [[ "$RATCHET" == "true" ]]; then args+=(--ratchet); fi + bun run testsuite --target bali "${args[@]}" + - name: Job summary + if: always() + shell: bash + run: | + if [[ -f .harness/release/selection.json ]]; then + { + echo 'Bali release under test:' + echo '```json' + cat .harness/release/selection.json + echo '```' + } >> "$GITHUB_STEP_SUMMARY" + fi + if [[ -f .harness/work/jdk-jtreg/report.md ]]; then + cat .harness/work/jdk-jtreg/report.md >> "$GITHUB_STEP_SUMMARY" + else + echo 'Bali compatibility did not produce a report. See setup/harness logs.' >> "$GITHUB_STEP_SUMMARY" + fi + if [[ -f reports/bali/index.md ]]; then + printf '\n' >> "$GITHUB_STEP_SUMMARY" + cat reports/bali/index.md >> "$GITHUB_STEP_SUMMARY" + fi + - name: Upload results and diagnostics + if: always() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a + with: + name: bali-compatibility-${{ runner.os }}-${{ runner.arch }} + include-hidden-files: true + retention-days: 30 + path: | + .harness/release/release.json + .harness/release/selection.json + reports/bali/** + expectations/jdk-jtreg.ratchet.toml + expectations/jdk-jtreg.reference.json + .harness/work/jdk-jtreg/report.* + .harness/work/jdk-jtreg/inventory.json + .harness/work/jdk-jtreg/jtreg-run-*/reference/** + .harness/work/jdk-jtreg/jtreg-run-*/bali/** + if-no-files-found: warn + - name: "Update: Commit Generated Reports" + if: ${{ always() && inputs.apply_updates }} + id: update + shell: bash + env: + TESTSUITE_TOKEN: ${{ secrets.testsuite_token }} + UPDATE_BRANCH: ${{ inputs.update_branch || 'sync/bali-compatibility' }} + run: | + set -euo pipefail + if [[ -z "$TESTSUITE_TOKEN" ]]; then + echo '::error::apply_updates needs the testsuite_token secret with contents and pull-request write access to elide-dev/testsuite; the calling job token cannot push to another repository.' + exit 2 + fi + git config user.name "elide-ci" + git config user.email "ci@elide.dev" + git add -- reports/bali expectations/jdk-jtreg.ratchet.toml expectations/jdk-jtreg.reference.json + if git diff --cached --quiet; then + echo "changed=false" >> "$GITHUB_OUTPUT" + echo "No generated changes to commit." + exit 0 + fi + + git checkout -B "$UPDATE_BRANCH" + git commit -m "ci: update Bali compatibility reports" + # Checkout ran without persisted credentials; authenticate git only here. + auth="$(printf 'x-access-token:%s' "$TESTSUITE_TOKEN" | base64 | tr -d '\n')" + header="http.https://github.com/.extraheader=AUTHORIZATION: basic $auth" + # The shallow checkout has no remote-tracking ref for the update branch, so + # fetch it first; otherwise --force-with-lease rejects any existing branch. + git -c "$header" fetch --no-tags origin \ + "+refs/heads/$UPDATE_BRANCH:refs/remotes/origin/$UPDATE_BRANCH" || true + git -c "$header" push --force-with-lease origin "$UPDATE_BRANCH" + echo "changed=true" >> "$GITHUB_OUTPUT" + echo "branch=$UPDATE_BRANCH" >> "$GITHUB_OUTPUT" + + - name: "Update: Open Pull Request" + if: ${{ always() && inputs.apply_updates && inputs.create_pr && steps.update.outputs.changed == 'true' }} + shell: bash + env: + GH_TOKEN: ${{ secrets.testsuite_token }} + BRANCH: ${{ steps.update.outputs.branch }} + BASE_BRANCH: ${{ inputs.update_base || 'main' }} + RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + run: | + set -euo pipefail + title="ci: update Bali compatibility reports" + body="Automated Bali compatibility report update from ${GITHUB_WORKFLOW} run ${GITHUB_RUN_ID} ($RUN_URL). This records the measurement under reports/bali/ and includes the ratchet file when the run regenerated it." + existing="$(gh pr list --repo elide-dev/testsuite --head "$BRANCH" --state open --json url --jq '.[0].url // ""')" + if [[ -n "$existing" ]]; then + gh pr edit "$existing" --repo elide-dev/testsuite --title "$title" --body "$body" + echo "Updated PR: $existing" + else + gh pr create --repo elide-dev/testsuite --base "$BASE_BRANCH" --head "$BRANCH" --title "$title" --body "$body" + fi diff --git a/.github/workflows/check.compliance.yml b/.github/workflows/check.compliance.yml index 5587c0f..81b9f19 100644 --- a/.github/workflows/check.compliance.yml +++ b/.github/workflows/check.compliance.yml @@ -112,7 +112,7 @@ env: jobs: compliance: - name: "Compliance" + name: "Elide" runs-on: ${{ fromJSON(inputs.runner) }} timeout-minutes: 720 env: diff --git a/.github/workflows/on.bali-release.yml b/.github/workflows/on.bali-release.yml new file mode 100644 index 0000000..becc882 --- /dev/null +++ b/.github/workflows/on.bali-release.yml @@ -0,0 +1,141 @@ +name: "Manual - Bali Release Compatibility" + +"on": + workflow_dispatch: + inputs: + ratchet: + description: "Regenerate expectations/jdk-jtreg.ratchet.toml from this run's failures, like Elide's ratchet; also records the stock-JDK reference baseline when it is missing or stale" + required: false + default: false + type: boolean + # Add a schedule here when recurring measurements are wanted. The job's + # defaults also work without workflow_dispatch inputs. + +permissions: + contents: read + +concurrency: + group: bali-release-compatibility + cancel-in-progress: false + +jobs: + compatibility: + name: "Latest Bali release / Linux AMD64" + runs-on: ubuntu-24.04 + timeout-minutes: 60 + permissions: + contents: write + pull-requests: write + steps: + - name: Harden runner + uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 + with: + disable-sudo: true + egress-policy: audit + - name: Checkout testsuite + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 + with: + persist-credentials: true + - name: Setup Bun + uses: step-security/setup-bun@f6f5dadeac34f70c7828f731569e8d6e8330b8fb + with: + bun-version: "1.4.0" + - name: Resolve and download latest stable release + env: + # Bali is internal: the testsuite job token cannot read another repository. + GH_TOKEN: ${{ secrets.BALI_RELEASE_TOKEN }} + shell: bash + run: | + set -euo pipefail + if [[ -z "$GH_TOKEN" ]]; then + echo '::error::Configure BALI_RELEASE_TOKEN with contents:read access to elide-dev/bali in the testsuite repository or organization.' + exit 2 + fi + mkdir -p .harness/release .harness/distribution + gh api repos/elide-dev/bali/releases/latest > .harness/release/release.json + bun bin/bali-release.ts select .harness/release/release.json .harness/release/selection.json + asset_id=$(bun -e 'console.log((await Bun.file(".harness/release/selection.json").json()).assetId)') + # Download the resolved asset ID, never resolve "latest" a second time. + gh api "repos/elide-dev/bali/releases/assets/$asset_id" \ + -H 'Accept: application/octet-stream' > .harness/release/distribution.tgz + bun bin/bali-release.ts verify .harness/release/selection.json .harness/release/distribution.tgz + tar -xzf .harness/release/distribution.tgz -C .harness/distribution + - name: Run OpenJDK compatibility tests + env: + RATCHET: ${{ inputs.ratchet || false }} + shell: bash + run: | + set -euo pipefail + args=(--bali-home "$PWD/.harness/distribution") + if [[ "$RATCHET" == "true" ]]; then args+=(--ratchet); fi + bun run testsuite --target bali "${args[@]}" + - name: Write job summary + if: always() + shell: bash + run: | + { + echo '## Bali release compatibility' + if [[ -f .harness/release/selection.json ]]; then + echo 'Resolved release and expected archive checksum:' + echo '```json' + cat .harness/release/selection.json + echo '```' + fi + if [[ -f .harness/work/jdk-jtreg/report.md ]]; then + cat .harness/work/jdk-jtreg/report.md + else + echo 'No test report was produced. Inspect the setup and harness logs.' + fi + if [[ -f reports/bali/index.md ]]; then + cat reports/bali/index.md + fi + } >> "$GITHUB_STEP_SUMMARY" + - name: Upload reports and diagnostics + if: always() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a + with: + name: bali-release-compatibility-linux-amd64 + include-hidden-files: true + retention-days: 30 + if-no-files-found: warn + path: | + .harness/release/release.json + .harness/release/selection.json + .harness/work/jdk-jtreg/report.* + .harness/work/jdk-jtreg/inventory.json + .harness/work/jdk-jtreg/jtreg-run-*/reference/** + .harness/work/jdk-jtreg/jtreg-run-*/bali/** + expectations/jdk-jtreg.ratchet.toml + expectations/jdk-jtreg.reference.json + reports/bali/** + - name: Save report history in a pull request + if: ${{ always() && !cancelled() && github.ref_type == 'branch' && hashFiles('.harness/work/jdk-jtreg/report.json') != '' }} + env: + GH_TOKEN: ${{ github.token }} + BASE_BRANCH: ${{ github.ref_name }} + REPORT_BRANCH: sync/bali-reports-${{ github.run_id }}-${{ github.run_attempt }} + RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + shell: bash + run: | + set -euo pipefail + git config user.name "elide-ci" + git config user.email "ci@elide.dev" + git add -- reports/bali expectations/jdk-jtreg.ratchet.toml expectations/jdk-jtreg.reference.json + if git diff --cached --quiet; then + echo 'No new Bali reports to commit.' + exit 0 + fi + # Each run keeps its own branch so unmerged measurements are retained. + git checkout -b "$REPORT_BRANCH" + git commit -m "ci: record Bali compatibility measurement" + git push origin "$REPORT_BRANCH" + body_file="$RUNNER_TEMP/bali-report-pr.md" + cat > "$body_file" <//jdk-jtreg/` +has exactly the Elide file set (`results.json.gz`, `summary.json`, `jdk-jtreg.md`, +`index.md`, `pass-rate.svg`, `impact.*`, `changes.*`) plus two adapter extras: +`differential.md`, the paired view rebuilt from each result's metadata, and +`coverage.svg`. `reports/bali/index.json`, `index.md`, and `pass-rate.svg` are the +same generated indexes Elide keeps under `reports/`. + +Raw logs and local paths stay in ignored run directories. The reusable +`check.bali.yml` workflow uploads raw diagnostics and generated reports even after +test failures, and can commit `reports/bali/` and the ratchet file when the caller +opts in with `apply_updates`. + +The source is Java 25 GA at commit +`6c48f4ed707bf0b15f9b6098de30db8aae6fa40f`. The jtreg archive is Shipilev's +checksum-pinned `7.5.1+1` rebuild, reporting `7.5.1-dev+0`; it is not an Oracle +binary. Downloads are verified on every use and cached under +`.harness/bali/archives`. Source or archive updates require updating the pins +together and re-ratcheting. + +## Shared repository integration + +`jdk-jtreg` is a regular `[[workload]]` in `registry.toml` with `target = "bali"` and +`adapter = "jdk-jtreg"`; the adapter is registered beside the Elide adapters and the +manifest path comes from the workload settings. It shares jtreg mechanics (run-root +creation, common flags, outcome names, runner exit-code rules) with the javac adapter +through `harness/src/adapters/jtreg.ts`; what remains Bali-specific is running the +corpus on two JDKs and flattening the pair. `bun run testsuite --target bali` runs +it; the Elide launcher skips workloads with another target, and `--all-suites` never +includes it. Elide remains the default target; its commands and history are unchanged. +The shared launcher runs Bali in Linux AMD64 Docker, without an Elide installation. +Use `--execution native` explicitly for native platform testing. + +The harness identifies a run by the Bali version (from `bin/java -version`) and the +digest of the distribution files, recorded as the run's target in `summary.json`. +Re-measuring the same binary replaces its report, and `changes.*` diffs against the +previous run of the workload, exactly as for Elide builds. Because Bali reports live +under `reports/bali/`, they have their own indexes and are not part of the Elide README +table or SQL commands. + +## Pull request checks + +Every pull request in this repository runs two independent compliance jobs +beside the harness unit tests: + +- **Compliance / Elide** runs the Elide suites through `check.compliance.yml` + against the nightly Elide build, exactly as before. +- **Compliance / Bali** runs `check.bali.yml` with `source: release`: it resolves + the latest published Bali release, downloads and verifies its Linux AMD64 + tarball, and runs `jdk-jtreg` in Docker on a hosted Ubuntu 24.04 runner. With + the committed reference baseline only Bali executes, about 14 minutes of + tests. It needs the `BALI_RELEASE_TOKEN` repository secret with `contents:read` access to + `elide-dev/bali`, and never commits reports. + +The two jobs do not depend on each other, so a Bali change is judged by the +Bali job alone, and an Elide nightly regression shows up only in the Elide job. + +## Calling from Bali CI + +After publishing this integration, call +`elide-dev/testsuite/.github/workflows/check.bali.yml@` from the +Bali build workflow, depending on its existing distribution build. Supply the +same reviewed commit as `testsuite_ref`, the uploaded distribution artifact name +as `artifact` (the default `source: artifact`), and a compatible runner. Artifacts are downloaded from the calling +workflow run; the native image is never rebuilt here. For a private testsuite +checkout, pass the optional `testsuite_token` secret with read access to this +repository. + +The expectations file starts empty, so the first runs return exit 1 for every +Bali-only failure while still uploading results and writing `reports/bali/`. Run once with `ratchet: true`, +review the generated `expectations/jdk-jtreg.ratchet.toml` and +`expectations/jdk-jtreg.reference.json`, and commit both; after that the job is +green unless a previously passing file regresses, and the stock JDK is not run +again until a pin changes. Establish the +ratchet on the actual CI runner before making the job required. The workflow is +reusable, not scheduled; inside this repository it runs on pull requests with +`source: release` (see above). + +By default the reusable workflow stores results only in the workflow artifact. +Pass `apply_updates: true` to also commit `reports/bali/`, the ratchet file, and +the reference baseline to the testsuite repository, following Elide's compliance workflow: the job checks +out `testsuite_ref`, publishes the measurement, commits to `update_branch` +(default `sync/bali-compatibility`) with a force push, and opens or refreshes a +pull request against `update_base` (default `main`) unless `create_pr` is false. +The commit runs even when tests fail, so red measurements are retained. A +later run replaces an unmerged update branch, the same as Elide's +`sync/compliance`; merge report PRs promptly if every measurement matters, or +use the manual release workflow, which keeps one branch per run. Because the +calling repository's job token cannot push to testsuite, `apply_updates` +requires the `testsuite_token` secret with contents and pull-request write +access to this repository; the job fails with an explicit error otherwise. +Hand-curated expectations are never modified by CI; only the ratchet file and +the reference baseline are. + +## Manual latest-release measurements + +In this repository's Actions tab, choose **Manual - Bali Release Compatibility** +and **Run workflow**. It resolves GitHub's latest published, non-prerelease Bali +release once, downloads its Linux AMD64 tarball by asset ID, verifies the API's +SHA-256 digest, and tests it in a Linux AMD64 Docker container on Ubuntu 24.04. +No Bali checkout, native-image build, or Elide installation is needed. + +Leave `ratchet` unchecked for an ordinary measurement; existing regressions +return exit 1 while still producing reports. Check it to regenerate the ratchet +file from the run, and the reference baseline if it is missing or stale, which +the report PR then includes for review. Incomplete runs +fail rather than becoming green. + +The job summary shows the selected release and test results. The +`bali-release-compatibility-linux-amd64` artifact retains release provenance, +per-test results, generated history, and raw jtreg diagnostics for 30 days, +including when testing fails. + +For runs dispatched from a branch, the workflow also commits `reports/bali/`, +the ratchet file, and the reference baseline to `sync/bali-reports--` and opens a PR against +the dispatch branch. Each run has its own branch so later runs cannot overwrite +unmerged measurements. Merge the PR to retain the results in the repository and +expose them through `reports/bali/index.md`. Concurrent report PRs can conflict in +the generated indexes; resolve that as for Elide's `reports/index.*`, by keeping +both measurement directories and letting the next run regenerate the indexes. +Publishing does not turn a failed check green. Runs without a +measurement cannot publish; tag dispatches retain artifacts only. + +Report publication uses the ordinary `GITHUB_TOKEN` with contents and pull-request +write permissions. The repository must allow GitHub Actions to create pull requests. +Bali is currently an internal repository: configure `BALI_RELEASE_TOKEN` in +testsuite (or as an organization secret accessible to testsuite) with read access +to Bali's contents. The workflow reports an actionable error if it is missing. + +Only manual dispatch is enabled. A future `schedule` trigger can use the same +job unchanged; no required dispatch inputs or interactive prompts are involved. + +## Docker execution in CI + +Bali uses the same execution model as Elide: the shared launcher builds a +harness image and runs `harness/src/cli.ts` in Docker. `--target bali` defaults to +**linux/amd64**. Both Bali CI workflows use this path. The image uses Debian Trixie +like Elide's harness, pinned Bun 1.4.0, stock Temurin JDK 25.0.2 as the reference, +and the harness dependencies. Both base images are pinned by digest. + +```sh +bun run testsuite --target bali --bali-home /path/to/linux-amd64/bali +``` + +The distribution is mounted read-only at `/opt/bali`; `registry.toml` and +`manifests/` are mounted read-only; `expectations/` is mounted read-only unless +`--ratchet` is given; `reports/` and `.harness/` are writable, exactly as for Elide +runs. Docker runs as the invoking user, with the same user mapping, writable-mount +checks, and interrupt cleanup as the Elide launcher, shared through `bin/docker.ts`. +Release access credentials stay on the host and are not passed into the test +container. Like Elide, no image or checkout provenance is recorded beyond the run +identity. No macOS measurement is published. + +`--execution native` runs the same harness entry point on the host. CI uses the +Docker path. diff --git a/README.md b/README.md index 21f3579..80d87ad 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,18 @@ Tracking: [Compliance Testing meta (WHIPLASH#1172)](https://github.com/elide-dev > Full enabled slices may be RED until expectations are ratcheted and failures > are classified. +## Bali runtime compatibility + +This repository also supports Bali as a Docker-based Linux AMD64 target. Elide remains the default. + +```sh +bun run testsuite --target bali --suite jdk-jtreg --bali-home /path/to/linux-amd64/bali +``` + +See [Bali setup and expectations](BALI.md) and [Bali compatibility history](reports/bali/index.md). +The runtime suite (`test/jdk`) is separate from Elide's compiler suite (`javac-jtreg`). +Runner coverage, verified passes, reference issues, and unsupported files remain separate. + ## Compatibility diff --git a/bin/bali-docker.test.ts b/bin/bali-docker.test.ts new file mode 100644 index 0000000..1314155 --- /dev/null +++ b/bin/bali-docker.test.ts @@ -0,0 +1,101 @@ +import { expect, test } from "bun:test"; +import { mkdtemp, mkdir, rm } from "node:fs/promises"; +import { join, resolve } from "node:path"; +import { tmpdir } from "node:os"; +import { baliPlan, containerArgs, harnessArgs, runBaliDocker } from "./bali-docker"; + +const user = ["--user", "1000:1000"]; + +test("Bali plan drives the shared harness with --target bali and never forwards release credentials", () => { + const plan = baliPlan(["--ratchet", "--bali-home", "dist"], "/repo"); + const args = containerArgs(plan, "/repo", "sha256:" + "a".repeat(64), "run=fixture", "digest1", user); + expect(args).toContain("1000:1000"); + expect(args).not.toContain("TESTSUITE_REVISION=abc"); + expect(args).toContain("linux/amd64"); + expect(args).toContain("type=bind,src=/repo/dist,dst=/opt/bali,readonly"); + expect(args).toContain("type=bind,src=/repo/expectations,dst=/work/expectations"); + expect(args).toContain("type=bind,src=/repo/registry.toml,dst=/work/registry.toml,readonly"); + expect(args.slice(args.indexOf("sha256:" + "a".repeat(64)) + 1)).toEqual( + harnessArgs(plan, "digest1", { + registry: "/work/registry.toml", + repoRoot: "/work", + baliHome: "/opt/bali", + suiteRoot: "/work/suites", + reports: "/work/reports/bali", + expectations: "/work/expectations", + }), + ); + expect(args).toContain("--target"); + expect(args).toContain("/work/reports/bali"); + expect(args).toContain("--ratchet"); + expect(args).not.toContain("GH_TOKEN"); + expect(args).not.toContain("BALI_RELEASE_TOKEN"); + const readonly = containerArgs( + baliPlan(["--bali-home", "dist"], "/repo"), + "/repo", + "sha256:" + "a".repeat(64), + "run=fixture", + "digest1", + user, + ); + expect(readonly).toContain("type=bind,src=/repo/expectations,dst=/work/expectations,readonly"); + expect(readonly).not.toContain("--ratchet"); +}); + +test("Bali plan validates suites from the registry and accepts --ratchet anywhere", () => { + expect(baliPlan(["--suite", "jdk-jtreg", "--ratchet", "--bali-home", "dist"], "/repo").ratchet).toBe(true); + expect(baliPlan(["--bali-home", "--ratchet"], "/repo").ratchet).toBe(false); + expect(() => baliPlan(["--ratchet", "--ratchet", "--bali-home", "dist"], "/repo")).toThrow(); + expect(() => baliPlan(["--suite", "test262", "--bali-home", "dist"], "/repo")).toThrow( + "Bali supports --suite jdk-jtreg", + ); + expect(baliPlan(["--bali-home", "dist"], "/repo", ["jdk-jtreg", "other"]).suite).toBe("jdk-jtreg"); + expect(baliPlan(["--reference-home", "/jdk", "--bali-home", "dist"], "/repo").referenceHome).toBe("/jdk"); +}); + +test("Docker launcher rejects macOS artifacts and a host reference JDK, and propagates build errors", async () => { + const temp = await mkdtemp(join(tmpdir(), "bali-container-")); + try { + const home = join(temp, "distribution"); + await mkdir(join(home, "bin"), { recursive: true }); + await mkdir(join(home, "lib"), { recursive: true }); + await Bun.write(join(home, "bin/bali"), new Uint8Array(20)); + for (const file of ["bin/java", "lib/modules", "release"]) await Bun.write(join(home, file), file); + const commands: string[][] = []; + const run = async (args: string[]) => { + commands.push(args); + return 1; + }; + const root = resolve(import.meta.dir, ".."); + const argv = ["--bali-home", home]; + await expect( + runBaliDocker([...argv, "--reference-home", "/jdk"], root, "test=fixture", run), + ).rejects.toThrow("fixed in the image"); + await expect(runBaliDocker(argv, root, "test=fixture", run)).rejects.toThrow("Linux AMD64"); + expect(commands).toHaveLength(0); + const elf = new Uint8Array(20); + elf.set([127, 69, 76, 70, 2, 1]); + elf[18] = 62; + await Bun.write(join(home, "bin/bali"), elf); + expect(await runBaliDocker(argv, root, "test=fixture", run)).toBe(2); + expect(commands).toHaveLength(1); + expect(commands[0]).toContain("linux/amd64"); + const successCommands: string[][] = []; + const regression = await runBaliDocker(argv, root, "test=fixture", async (args) => { + successCommands.push(args); + if (args[1] === "build") { + await Bun.write(args[args.indexOf("--iidfile") + 1]!, "sha256:" + "a".repeat(64)); + return 0; + } + return 1; + }); + expect(regression).toBe(1); + expect(successCommands).toHaveLength(2); + expect(successCommands[1]).toContain("--rm"); + expect(successCommands[1]).toContain("--init"); + expect(successCommands[1]).toContain("jdk-jtreg"); + expect(successCommands[1]).toContain("--digest"); + } finally { + await rm(temp, { recursive: true, force: true }); + } +}); diff --git a/bin/bali-docker.ts b/bin/bali-docker.ts new file mode 100644 index 0000000..59d74bf --- /dev/null +++ b/bin/bali-docker.ts @@ -0,0 +1,218 @@ +// Bali target launcher: runs the shared harness (harness/src/cli.ts) for workloads whose +// registry `target` is "bali", in Linux AMD64 Docker by default or natively on request. +// Docker primitives are shared with the Elide launcher through ./docker. +import { randomUUID } from "node:crypto"; +import { mkdir, realpath, rm } from "node:fs/promises"; +import { resolve, join } from "node:path"; +import { artifactDigest } from "../harness/src/adapters/jdk-jtreg"; +import { + assertWritableMountSources, + platformArgs, + requireDocker, + run as runCommand, + userArgs, +} from "./docker"; + +const PLATFORM = "linux/amd64"; + +export interface BaliPlan { + baliHome: string; + referenceHome?: string; + suite: string; + ratchet: boolean; +} +export function baliPlan(argv: string[], cwd: string, suites: string[] = ["jdk-jtreg"]): BaliPlan { + const args = [...argv]; + let ratchet = false; + const options = new Map(); + for (let i = 0; i < args.length; i += 2) { + if (args[i] === "--ratchet" && !ratchet) { + ratchet = true; + i--; + continue; + } + if ( + !["--bali-home", "--reference-home", "--suite"].includes(args[i]!) || + !args[i + 1] || + options.has(args[i]!) + ) + throw new Error( + `Bali runs accept --bali-home [--reference-home ] [--ratchet] [--suite ${suites.join("|")}].`, + ); + options.set(args[i]!, args[i + 1]!); + } + const suite = options.get("--suite") ?? suites[0]!; + if (!suites.includes(suite)) throw new Error(`Bali supports --suite ${suites.join(", ")}`); + if (!options.has("--bali-home")) + throw new Error("Bali runs require --bali-home pointing to a packaged distribution"); + return { + baliHome: resolve(cwd, options.get("--bali-home")!), + referenceHome: options.has("--reference-home") + ? resolve(cwd, options.get("--reference-home")!) + : undefined, + suite, + ratchet, + }; +} +export interface HarnessPaths { + registry: string; + repoRoot: string; + baliHome: string; + suiteRoot: string; + reports: string; + expectations: string; +} +/** The same cli.ts invocation the Elide launcher builds, with --target bali. */ +export function harnessArgs(plan: BaliPlan, digest: string, paths: HarnessPaths): string[] { + return [ + "run", + plan.suite, + "--target", + "bali", + "--registry", + paths.registry, + "--repo-root", + paths.repoRoot, + "--elide-path", + paths.baliHome, + "--digest", + digest, + "--suite-root", + paths.suiteRoot, + "--reports", + paths.reports, + "--expectations", + paths.expectations, + "--log-prefix", + `[${plan.suite}] `, + "--log", + "--failure-output", + "hide", + ...(plan.ratchet ? ["--ratchet"] : []), + ]; +} +export function containerArgs( + plan: BaliPlan, + root: string, + image: string, + label: string, + digest: string, + user: string[], +): string[] { + return [ + "docker", + "run", + "--rm", + "--init", + ...platformArgs(PLATFORM), + "--label", + label, + ...user, + "--mount", + `type=bind,src=${plan.baliHome},dst=/opt/bali,readonly`, + "--mount", + `type=bind,src=${join(root, ".harness")},dst=/work/.harness`, + "--mount", + `type=bind,src=${join(root, "reports")},dst=/work/reports`, + // Expectations are mounted like Elide's: read-only unless this run ratchets them. + "--mount", + `type=bind,src=${join(root, "expectations")},dst=/work/expectations${plan.ratchet ? "" : ",readonly"}`, + "--mount", + `type=bind,src=${join(root, "registry.toml")},dst=/work/registry.toml,readonly`, + "--mount", + `type=bind,src=${join(root, "manifests")},dst=/work/manifests,readonly`, + image, + ...harnessArgs(plan, digest, { + registry: "/work/registry.toml", + repoRoot: "/work", + baliHome: "/opt/bali", + suiteRoot: "/work/suites", + reports: "/work/reports/bali", + expectations: "/work/expectations", + }), + ]; +} +async function prepareRoot(root: string): Promise { + await mkdir(join(root, ".harness"), { recursive: true }); + await mkdir(join(root, "reports/bali"), { recursive: true }); + await mkdir(join(root, "expectations"), { recursive: true }); +} +export async function runBaliDocker( + argv: string[], + root: string, + label: string, + run: (args: string[]) => Promise = runCommand, + suites?: string[], +): Promise { + const plan = baliPlan(argv, process.cwd(), suites); + if (plan.referenceHome) + throw new Error( + "--reference-home is not accepted for Docker runs: the reference JDK is fixed in the image. Use --execution native.", + ); + plan.baliHome = await realpath(plan.baliHome); + // Reject macOS binaries before spending time building a Linux image. + const magic = new Uint8Array( + await Bun.file(join(plan.baliHome, "bin/bali")).slice(0, 20).arrayBuffer(), + ); + if ( + magic[0] !== 0x7f || + magic[1] !== 0x45 || + magic[2] !== 0x4c || + magic[3] !== 0x46 || + magic[4] !== 2 || + magic[5] !== 1 || + magic[18] !== 62 || + magic[19] !== 0 + ) + throw new Error( + "Docker tests need the Linux AMD64 Bali release, not a macOS/ARM64 distribution. Use --execution native for native platform testing.", + ); + const digest = await artifactDigest(plan.baliHome); + await prepareRoot(root); + assertWritableMountSources(["reports", "expectations", ".harness"]); + if (run === runCommand) await requireDocker(); + const user = userArgs(String(process.getuid?.() ?? 1000), String(process.getgid?.() ?? 1000)); + const dockerfile = join(root, "docker/bali.Dockerfile"); + const iid = join(root, ".harness", `bali-image-${randomUUID()}.txt`); + console.log(`Building Bali test environment (${PLATFORM})...`); + try { + const built = await run([ + "docker", + "build", + ...platformArgs(PLATFORM), + "--iidfile", + iid, + "-f", + dockerfile, + root, + ]); + if (built !== 0) return 2; + const image = (await Bun.file(iid).text()).trim(); + if (!/^sha256:[a-f0-9]{64}$/.test(image)) + throw new Error("Docker did not return a valid image identity"); + console.log(`Running ${plan.suite} in ${image}; workspace: ${join(root, ".harness/work", plan.suite)}`); + return await run(containerArgs(plan, root, image, label, digest, user)); + } finally { + await rm(iid, { force: true }); + } +} +/** Native host run through the same harness entry point, with JAVA_HOME as the reference. */ +export async function runBaliNative(argv: string[], root: string, suites?: string[]): Promise { + const plan = baliPlan(argv, process.cwd(), suites); + const baliHome = await realpath(plan.baliHome); + if (plan.referenceHome) process.env.JAVA_HOME = plan.referenceHome; + await prepareRoot(root); + const { main, parseArgs } = await import("../harness/src/cli"); + return main( + parseArgs( + harnessArgs(plan, await artifactDigest(baliHome), { + registry: join(root, "registry.toml"), + repoRoot: root, + baliHome, + suiteRoot: join(root, "suites"), + reports: join(root, "reports/bali"), + expectations: join(root, "expectations"), + }), + ), + ); +} diff --git a/bin/bali-release.test.ts b/bin/bali-release.test.ts new file mode 100644 index 0000000..74297b0 --- /dev/null +++ b/bin/bali-release.test.ts @@ -0,0 +1,60 @@ +import { expect, test } from "bun:test"; +import { createHash } from "node:crypto"; +import { mkdtemp, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { selectBaliRelease, verifyReleaseArchive, type Release } from "./bali-release"; +const release = (): Release => ({ + id: 1, + tag_name: "v0.4.0", + html_url: "https://github.com/elide-dev/bali/releases/tag/v0.4.0", + published_at: "2026-08-30T03:44:48Z", + draft: false, + prerelease: false, + assets: [ + { + id: 42, + name: "bali-0.4.0-linux-amd64.tgz", + digest: "sha256:" + "a".repeat(64), + state: "uploaded", + }, + { + id: 43, + name: "bali-0.4.0-linux-arm64.tgz", + digest: "sha256:" + "b".repeat(64), + state: "uploaded", + }, + ], +}); +test("latest release selection binds the exact Linux AMD64 asset and checksum", () => { + expect(selectBaliRelease(release())).toMatchObject({ + tag: "v0.4.0", + assetId: 42, + sha256: "a".repeat(64), + platform: "linux-amd64", + }); + for (const bad of [ + { ...release(), draft: true }, + { ...release(), prerelease: true }, + { ...release(), assets: [] }, + { ...release(), tag_name: "v0.4.0\ninjected" }, + ]) + expect(() => selectBaliRelease(bad)).toThrow(); + const duplicate = release(); + duplicate.assets.push(duplicate.assets[0]!); + expect(() => selectBaliRelease(duplicate)).toThrow("exactly one"); + const missing = release(); + missing.assets[0]!.digest = null; + expect(() => selectBaliRelease(missing)).toThrow("SHA-256"); +}); +test("archive verification rejects corrupted downloads", async () => { + const root = await mkdtemp(join(tmpdir(), "bali-release-")); + try { + const path = join(root, "distribution.tgz"); + await Bun.write(path, "downloaded bytes"); + await verifyReleaseArchive(path, createHash("sha256").update("downloaded bytes").digest("hex")); + await expect(verifyReleaseArchive(path, "a".repeat(64))).rejects.toThrow("mismatch"); + } finally { + await rm(root, { recursive: true, force: true }); + } +}); diff --git a/bin/bali-release.ts b/bin/bali-release.ts new file mode 100644 index 0000000..265276d --- /dev/null +++ b/bin/bali-release.ts @@ -0,0 +1,69 @@ +import { createHash } from "node:crypto"; +import { createReadStream } from "node:fs"; + +interface ReleaseAsset { + id: number; + name: string; + digest: string | null; + state: string; +} +export interface Release { + id: number; + tag_name: string; + html_url: string; + published_at: string; + draft: boolean; + prerelease: boolean; + assets: ReleaseAsset[]; +} +export function selectBaliRelease(release: Release) { + if (release.draft || release.prerelease || !release.published_at) + throw new Error("Expected a published stable Bali release"); + if (!/^v?\d+\.\d+\.\d+(?:[.+-][0-9A-Za-z.-]+)?$/.test(release.tag_name)) + throw new Error("Unexpected Bali release tag"); + const name = `bali-${release.tag_name.replace(/^v/, "")}-linux-amd64.tgz`; + const assets = release.assets.filter((asset) => asset.name === name); + if (assets.length !== 1) throw new Error(`Expected exactly one release asset: ${name}`); + const asset = assets[0]!; + if (!Number.isSafeInteger(asset.id) || asset.id <= 0 || asset.state !== "uploaded") + throw new Error("Release asset is not ready for download"); + if (!asset.digest || !/^sha256:[a-f0-9]{64}$/.test(asset.digest)) + throw new Error("Release asset has no usable SHA-256 digest"); + return { + repository: "elide-dev/bali", + releaseId: release.id, + tag: release.tag_name, + url: release.html_url, + publishedAt: release.published_at, + platform: "linux-amd64", + assetId: asset.id, + assetName: name, + sha256: asset.digest.slice(7), + }; +} +export async function verifyReleaseArchive(path: string, expected: string) { + if (!/^[a-f0-9]{64}$/.test(expected)) throw new Error("Invalid expected SHA-256"); + const hash = createHash("sha256"); + for await (const chunk of createReadStream(path)) hash.update(chunk); + if (hash.digest("hex") !== expected) throw new Error("Bali release archive SHA-256 mismatch"); +} +if (import.meta.main) { + try { + const [command, input, output] = Bun.argv.slice(2); + if (command === "select" && input && output) { + const selected = selectBaliRelease(await Bun.file(input).json()); + await Bun.write(output, JSON.stringify(selected, null, 2) + "\n"); + console.log(`${selected.tag}: ${selected.assetName} (${selected.sha256})`); + } else if (command === "verify" && input && output) { + const selected = await Bun.file(input).json(); + await verifyReleaseArchive(output, selected.sha256); + console.log(`Verified ${selected.assetName}`); + } else + throw new Error( + "usage: bali-release.ts select | verify ", + ); + } catch (error) { + console.error(error instanceof Error ? error.message : error); + process.exitCode = 2; + } +} diff --git a/bin/docker.ts b/bin/docker.ts new file mode 100644 index 0000000..e8c46e0 --- /dev/null +++ b/bin/docker.ts @@ -0,0 +1,190 @@ +// Shared Docker launcher primitives for the Elide (bin/run.ts) and Bali (bin/bali-docker.ts) +// targets: process running with interrupt cleanup, user mapping, and writable-mount checks. +import { createHash, randomUUID } from "node:crypto"; +import { closeSync, openSync, readFileSync, unlinkSync, writeFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +export const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const RUN_LABEL_KEY = "elide.testsuite.run"; +const RUN_ID = `${Date.now()}-${process.pid}-${randomUUID()}`; +/** Label applied to every container of this launcher process, so interrupts can clean up. */ +export const RUN_LABEL = `${RUN_LABEL_KEY}=${RUN_ID}`; +const activeProcesses = new Set>(); +let handlingSignal = false; + +export function log(message: string): void { + process.stderr.write(`[bin/run] ${message}\n`); +} + +export function usageError(message: string): never { + log(message); + process.exit(2); +} + +function cleanupContainersSync(): void { + const listed = Bun.spawnSync(["docker", "ps", "-aq", "--filter", `label=${RUN_LABEL}`], { + stdout: "pipe", + stderr: "pipe", + }); + const ids = new TextDecoder().decode(listed.stdout).trim().split(/\s+/).filter(Boolean); + if (ids.length === 0) return; + log(`cleaning up ${ids.length} running container(s) for interrupted run`); + Bun.spawnSync(["docker", "rm", "-f", ...ids], { + stdout: "ignore", + stderr: "ignore", + }); +} + +function interrupt(signal: NodeJS.Signals): never { + if (handlingSignal) process.exit(130); + handlingSignal = true; + log(`received ${signal}; stopping active command and cleaning up containers`); + for (const proc of activeProcesses) { + try { + proc.kill("SIGINT"); + } catch { + // Best effort: labelled containers are forcibly removed below. + } + } + cleanupContainersSync(); + process.exit(signal === "SIGTERM" ? 143 : 130); +} + +process.on("SIGINT", () => interrupt("SIGINT")); +process.on("SIGTERM", () => interrupt("SIGTERM")); + +export async function run(args: string[], opts: { cwd?: string; env?: NodeJS.ProcessEnv } = {}): Promise { + const proc = Bun.spawn(args, { + cwd: opts.cwd ?? ROOT, + env: opts.env ?? process.env, + stdin: "inherit", + stdout: "inherit", + stderr: "inherit", + }); + activeProcesses.add(proc); + try { + return await proc.exited; + } finally { + activeProcesses.delete(proc); + } +} + +export async function runWithHeartbeat(args: string[], label: string, opts: { cwd?: string; env?: NodeJS.ProcessEnv } = {}): Promise { + log(`${label}...`); + const started = performance.now(); + const timer = setInterval(() => { + const seconds = Math.round((performance.now() - started) / 1000); + log(`${label} still running (${seconds}s)...`); + }, 5_000); + try { + const rc = await run(args, opts); + const seconds = Math.round((performance.now() - started) / 1000); + log(`${label} ${rc === 0 ? "done" : `exited ${rc}`} (${seconds}s).`); + return rc; + } finally { + clearInterval(timer); + } +} + +export async function capture(args: string[], opts: { cwd?: string; env?: NodeJS.ProcessEnv } = {}): Promise<{ + exitCode: number; + stdout: string; + stderr: string; +}> { + const proc = Bun.spawn(args, { + cwd: opts.cwd ?? ROOT, + env: opts.env ?? process.env, + stdout: "pipe", + stderr: "pipe", + }); + activeProcesses.add(proc); + try { + const [stdout, stderr, exitCode] = await Promise.all([ + new Response(proc.stdout).text(), + new Response(proc.stderr).text(), + proc.exited, + ]); + return { exitCode, stdout, stderr }; + } finally { + activeProcesses.delete(proc); + } +} + +export async function requireDocker(): Promise { + const result = await capture(["docker", "--version"]); + if (result.exitCode !== 0) usageError("docker not found on PATH"); +} + +export function platformArgs(platform: string): string[] { + return platform ? ["--platform", platform] : []; +} + +/** Run as the invoking user so bind-mounted output stays owned by them. */ +export function userArgs(uid: string, gid: string, containerPath?: string): string[] { + return [ + "--user", + `${uid}:${gid}`, + "-e", + "HOME=/work/.harness", + ...(containerPath ? ["-e", `PATH=${containerPath}`] : []), + ]; +} + +export function sha256File(path: string): string { + return createHash("sha256").update(readFileSync(path)).digest("hex"); +} + +/** Fail early with a diagnostic when a previous root-owned container left mounts unwritable. */ +export function assertWritableMountSources(dirs: string[], files: string[] = []): void { + for (const dir of dirs) { + const target = resolve(ROOT, dir, `.write-test-${process.pid}`); + try { + writeFileSync(target, ""); + unlinkSync(target); + } catch (err) { + usageError( + `${dir}/ is not writable by the current user (${err instanceof Error ? err.message : String(err)}). ` + + "Run once with --repair-ownership to fix stale root-owned files.", + ); + } + } + for (const file of files) { + try { + closeSync(openSync(resolve(ROOT, file), "a")); + } catch (err) { + usageError( + `${file} is not writable by the current user (${err instanceof Error ? err.message : String(err)}). ` + + "Run once with --repair-ownership to fix stale ownership.", + ); + } + } +} + +export async function fixHostOwnership( + image: string, + plat: string[], + uid: string, + gid: string, + label: string, + paths: string[], +): Promise { + await runWithHeartbeat( + [ + "docker", + "run", + "--rm", + "--label", + RUN_LABEL, + ...plat, + "--entrypoint", + "chown", + ...paths.flatMap((path) => ["-v", `${ROOT}/${path}:/target/${path}`]), + image, + "-R", + `${uid}:${gid}`, + ...paths.map((path) => `/target/${path}`), + ], + label, + ); +} diff --git a/bin/run.ts b/bin/run.ts index 75c5184..f49534f 100755 --- a/bin/run.ts +++ b/bin/run.ts @@ -22,6 +22,21 @@ import { availableParallelism } from "node:os"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import { classifySuiteStatus } from "./suite-status"; +import { + ROOT, + RUN_LABEL, + assertWritableMountSources, + capture, + fixHostOwnership, + log, + platformArgs, + requireDocker, + run, + runWithHeartbeat, + sha256File, + usageError, + userArgs, +} from "./docker"; interface Options { elideRef: string; @@ -44,6 +59,7 @@ interface Options { interface WorkloadInfo { id: string; path?: string; + target?: string; } interface SuiteRunSummary { @@ -74,11 +90,7 @@ interface SuiteSummaryRow { changes?: SuiteChanges; } -const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const DEFAULT_ELIDE_REF = "ghcr.io/elide-dev/elide:nightly"; -const RUN_LABEL_KEY = "elide.testsuite.run"; -const RUN_ID = `${Date.now()}-${process.pid}-${randomUUID()}`; -const RUN_LABEL = `${RUN_LABEL_KEY}=${RUN_ID}`; const CONTAINER_PATH = [ "/opt/jtreg/bin", "/opt/graalvm-jdk-25.0.3/bin", @@ -90,12 +102,6 @@ const CONTAINER_PATH = [ "/sbin", "/bin", ].join(":"); -const activeProcesses = new Set>(); -let handlingSignal = false; - -function log(message: string): void { - process.stderr.write(`[bin/run] ${message}\n`); -} const COLOR = process.stderr.isTTY && !process.env.NO_COLOR; const ansi = { @@ -107,11 +113,6 @@ const ansi = { bold: (s: string) => COLOR ? `\x1b[1m${s}\x1b[0m` : s, }; -function usageError(message: string): never { - log(message); - process.exit(2); -} - function parsePositiveInt(value: string | undefined, name: string): number | undefined { if (value === undefined || value === "") return undefined; const parsed = Number.parseInt(value, 10); @@ -142,38 +143,6 @@ function planConcurrency(options: Options, suiteCount: number): ConcurrencyPlan return { cpuCount: cpus, totalBudget, suiteWorkers, threads }; } -function cleanupContainersSync(): void { - const listed = Bun.spawnSync(["docker", "ps", "-aq", "--filter", `label=${RUN_LABEL}`], { - stdout: "pipe", - stderr: "pipe", - }); - const ids = new TextDecoder().decode(listed.stdout).trim().split(/\s+/).filter(Boolean); - if (ids.length === 0) return; - log(`cleaning up ${ids.length} running container(s) for interrupted run`); - Bun.spawnSync(["docker", "rm", "-f", ...ids], { - stdout: "ignore", - stderr: "ignore", - }); -} - -function interrupt(signal: NodeJS.Signals): never { - if (handlingSignal) process.exit(130); - handlingSignal = true; - log(`received ${signal}; stopping active command and cleaning up containers`); - for (const proc of activeProcesses) { - try { - proc.kill("SIGINT"); - } catch { - // Best effort: labelled containers are forcibly removed below. - } - } - cleanupContainersSync(); - process.exit(signal === "SIGTERM" ? 143 : 130); -} - -process.on("SIGINT", () => interrupt("SIGINT")); -process.on("SIGTERM", () => interrupt("SIGTERM")); - function parseArgs(argv: string[]): Options { const options: Options = { elideRef: DEFAULT_ELIDE_REF, @@ -262,76 +231,6 @@ function parseArgs(argv: string[]): Options { return options; } -function platformArgs(platform: string): string[] { - return platform ? ["--platform", platform] : []; -} - -function userArgs(uid: string, gid: string): string[] { - return ["--user", `${uid}:${gid}`, "-e", "HOME=/work/.harness", "-e", `PATH=${CONTAINER_PATH}`]; -} - -async function run(args: string[], opts: { cwd?: string; env?: NodeJS.ProcessEnv } = {}): Promise { - const proc = Bun.spawn(args, { - cwd: opts.cwd ?? ROOT, - env: opts.env ?? process.env, - stdin: "inherit", - stdout: "inherit", - stderr: "inherit", - }); - activeProcesses.add(proc); - try { - return await proc.exited; - } finally { - activeProcesses.delete(proc); - } -} - -async function runWithHeartbeat(args: string[], label: string, opts: { cwd?: string; env?: NodeJS.ProcessEnv } = {}): Promise { - log(`${label}...`); - const started = performance.now(); - const timer = setInterval(() => { - const seconds = Math.round((performance.now() - started) / 1000); - log(`${label} still running (${seconds}s)...`); - }, 5_000); - try { - const rc = await run(args, opts); - const seconds = Math.round((performance.now() - started) / 1000); - log(`${label} ${rc === 0 ? "done" : `exited ${rc}`} (${seconds}s).`); - return rc; - } finally { - clearInterval(timer); - } -} - -async function capture(args: string[], opts: { cwd?: string; env?: NodeJS.ProcessEnv } = {}): Promise<{ - exitCode: number; - stdout: string; - stderr: string; -}> { - const proc = Bun.spawn(args, { - cwd: opts.cwd ?? ROOT, - env: opts.env ?? process.env, - stdout: "pipe", - stderr: "pipe", - }); - activeProcesses.add(proc); - try { - const [stdout, stderr, exitCode] = await Promise.all([ - new Response(proc.stdout).text(), - new Response(proc.stderr).text(), - proc.exited, - ]); - return { exitCode, stdout, stderr }; - } finally { - activeProcesses.delete(proc); - } -} - -async function requireDocker(): Promise { - const result = await capture(["docker", "--version"]); - if (result.exitCode !== 0) usageError("docker not found on PATH"); -} - function dockerImageName(elideRef: string): string { return `elide-harness:${elideRef.replaceAll(/[/:@]/g, "_")}`; } @@ -340,10 +239,6 @@ function isLocalInstallDir(path: string): boolean { return existsSync(path) && statSync(path).isDirectory() && existsSync(resolve(path, "bin/elide")); } -function sha256File(path: string): string { - return createHash("sha256").update(readFileSync(path)).digest("hex"); -} - async function buildHarnessImage(options: Options, image: string, plat: string[]): Promise { const { elideRef } = options; if (isLocalInstallDir(elideRef)) { @@ -436,6 +331,8 @@ function parseRegistry(registryPath: string): WorkloadInfo[] { if (id) current.id = id; const path = line.match(/^\s*path\s*=\s*"([^"]+)"/)?.[1]; if (path) current.path = path; + const target = line.match(/^\s*target\s*=\s*"([^"]+)"/)?.[1]; + if (target) current.target = target; } if (current?.id) workloads.push(current); return workloads; @@ -449,58 +346,6 @@ async function suiteVersion(workload: WorkloadInfo): Promise { return result.exitCode === 0 ? result.stdout.trim() : "unknown"; } -async function fixHostOwnership(image: string, plat: string[], uid: string, gid: string, label: string): Promise { - await runWithHeartbeat([ - "docker", - "run", - "--rm", - "--label", - RUN_LABEL, - ...plat, - "--entrypoint", - "chown", - "-v", - `${ROOT}/reports:/target/reports`, - "-v", - `${ROOT}/expectations:/target/expectations`, - "-v", - `${ROOT}/.harness:/target/.harness`, - "-v", - `${ROOT}/README.md:/target/README.md`, - image, - "-R", - `${uid}:${gid}`, - "/target/reports", - "/target/expectations", - "/target/.harness", - "/target/README.md", - ], label); -} - -function assertWritableMountSources(): void { - for (const dir of ["reports", "expectations", ".harness"]) { - const target = resolve(ROOT, dir, `.write-test-${process.pid}`); - try { - writeFileSync(target, ""); - unlinkSync(target); - } catch (err) { - usageError( - `${dir}/ is not writable by the current user (${err instanceof Error ? err.message : String(err)}). ` + - "Run once with --repair-ownership to fix stale root-owned files.", - ); - } - } - - try { - closeSync(openSync(resolve(ROOT, "README.md"), "a")); - } catch (err) { - usageError( - `README.md is not writable by the current user (${err instanceof Error ? err.message : String(err)}). ` + - "Run once with --repair-ownership to fix stale ownership.", - ); - } -} - function walkSummaryPaths(root: string): string[] { if (!existsSync(root)) return []; const out: string[] = []; @@ -699,18 +544,23 @@ function renderFinalSuiteSummary(rows: SuiteSummaryRow[]): void { process.stderr.write(`${bottom}\n\n`); } -async function main(): Promise { +async function main(argv = Bun.argv.slice(2)): Promise { process.chdir(ROOT); - const options = parseArgs(Bun.argv.slice(2)); + const options = parseArgs(argv); const plat = platformArgs(options.platform); const hostUid = (await $`id -u`.text()).trim(); const hostGid = (await $`id -g`.text()).trim(); - const user = userArgs(hostUid, hostGid); + const user = userArgs(hostUid, hostGid, CONTAINER_PATH); const registryPath = resolve(ROOT, "registry.toml"); const workloads = parseRegistry(registryPath); + // Workloads for other runtimes (registry `target`) are run through `--target `. const suites = options.allSuites && options.suites.length === 0 - ? workloads.map((workload) => workload.id) + ? workloads.filter((workload) => (workload.target ?? "elide") === "elide").map((workload) => workload.id) : options.suites.length ? options.suites : ["test262"]; + for (const suite of suites) { + const target = workloads.find((workload) => workload.id === suite)?.target; + if (target && target !== "elide") usageError(`suite '${suite}' targets ${target}; run it with --target ${target}`); + } if (options.prepareSuites) { const rc = await runWithHeartbeat( @@ -741,9 +591,14 @@ async function main(): Promise { if (!existsSync(resolve(ROOT, "README.md"))) closeSync(openSync(resolve(ROOT, "README.md"), "a")); if (options.repairOwnership) { - await fixHostOwnership(image, plat, hostUid, hostGid, "repairing writable mount ownership before suite runs"); + await fixHostOwnership(image, plat, hostUid, hostGid, "repairing writable mount ownership before suite runs", [ + "reports", + "expectations", + ".harness", + "README.md", + ]); } else { - assertWritableMountSources(); + assertWritableMountSources(["reports", "expectations", ".harness"], ["README.md"]); } const expMode = options.ratchet ? "rw" : "ro"; @@ -852,7 +707,33 @@ async function main(): Promise { } try { - process.exit(await main()); + const argv = Bun.argv.slice(2); + const targetIndex = argv.indexOf("--target"); + const target = targetIndex < 0 ? "elide" : argv[targetIndex + 1]; + if (targetIndex >= 0) argv.splice(targetIndex, 2); + if (target === "bali") { + const executionIndex = argv.indexOf("--execution"); + const execution = executionIndex < 0 ? "docker" : argv[executionIndex + 1]; + if (executionIndex >= 0) argv.splice(executionIndex, 2); + const baliSuites = parseRegistry(resolve(ROOT, "registry.toml")) + .filter((workload) => workload.target === "bali") + .map((workload) => workload.id); + if (argv.includes("--help")) { + console.log( + `usage: bun run testsuite --target bali --bali-home [--ratchet] [--suite ${baliSuites.join("|")}] [--execution docker|native]\n` + + "Docker (default) runs linux/amd64 with the reference JDK fixed in the image. --execution native runs on this host, " + + "using JAVA_HOME or --reference-home as the reference JDK. Results go to reports/bali/ and are checked against expectations/.toml like Elide suites.", + ); + } else if (execution === "docker") { + const { runBaliDocker } = await import("./bali-docker"); + process.exitCode = await runBaliDocker(argv, ROOT, RUN_LABEL, run, baliSuites); + } else if (execution === "native") { + const { runBaliNative } = await import("./bali-docker"); + process.exitCode = await runBaliNative(argv, ROOT, baliSuites); + } else throw new Error(`Unknown execution environment: ${execution}`); + } else if (target === "elide") { + process.exit(await main(argv)); + } else throw new Error(`Unknown target: ${target}`); } catch (err) { log(`ERROR: unexpected failure: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`); process.exit(2); diff --git a/docker/bali.Dockerfile b/docker/bali.Dockerfile new file mode 100644 index 0000000..15f1837 --- /dev/null +++ b/docker/bali.Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 +# Match Elide's Linux/Debian harness environment; stock Java is Bali's oracle. +FROM eclipse-temurin:25.0.2_10-jdk@sha256:1bda4d9e668f44f399abed30636c34e0befb727408fba27b1e6aaefcf9df346b AS reference +FROM node:25-trixie@sha256:b6cf8d20ee78aa10f0a6b98242e26d547869801abd6bc3f7094b0a54301dee02 +RUN npm install -g bun@1.4.0 \ + && apt-get update \ + && apt-get install -y --no-install-recommends ca-certificates curl git unzip \ + libzstd1 libfreetype6 fontconfig libx11-6 libxext6 libxi6 libxrender1 libxtst6 libasound2t64 \ + && rm -rf /var/lib/apt/lists/* +COPY --from=reference /opt/java/openjdk /opt/reference-jdk +ENV JAVA_HOME=/opt/reference-jdk +ENV PATH=/opt/reference-jdk/bin:$PATH +# The shared harness (cli.ts, expectations, ratchet, reports) needs its dependencies; +# the Elide-host postinstall is irrelevant for Bali and is skipped. +WORKDIR /work/harness +COPY harness/package.json harness/bun.lock ./ +RUN bun install --frozen-lockfile --ignore-scripts +COPY harness/src ./src +WORKDIR /work +# registry.toml, manifests/, expectations/, reports/, and .harness/ are bind-mounted at +# run time, exactly as for the Elide harness container. +ENTRYPOINT ["bun", "/work/harness/src/cli.ts"] diff --git a/expectations/jdk-jtreg.ratchet.toml b/expectations/jdk-jtreg.ratchet.toml new file mode 100644 index 0000000..80025c1 --- /dev/null +++ b/expectations/jdk-jtreg.ratchet.toml @@ -0,0 +1,52 @@ +# AUTO-GENERATED by `run --ratchet`. Do not edit by hand. +# Generated for bali 0.4.0 (sha b999d6f6f0ea) on 2026-09-10T09:23:55.252Z. + +[fail] +"build/releaseFile/CheckReleaseFile.java" = "" +"java/io/Serializable/clearHandleTable/ClearHandleTable.java" = "" +"java/io/Serializable/getSuidClinitError/GetSuidClinitError.java" = "" +"java/lang/Class/IsAnnotationType.java" = "" +"java/lang/ClassLoader/IsParallelCapable.java" = "" +"java/lang/SecurityManager/CheckSecurityProvider.java" = "" +"java/lang/StackWalker/DumpStackTest.java" = "" +"java/lang/StackWalker/MultiThreadStackWalk.java" = "" +"java/lang/StackWalker/VerifyStackTrace.java" = "" +"java/lang/System/finalization/FinThreads.java" = "" +"java/lang/annotation/AnnotationToStringTest.java" = "" +"java/lang/ref/Basic.java" = "" +"java/lang/ref/FinalizeOverride.java" = "" +"java/net/Socket/asyncClose/Race.java" = "" +"java/net/URLClassLoader/B7050028.java" = "" +"java/security/Principal/Implies.java" = "" +"java/security/Provider/DefaultProviderList.java" = "" +"java/text/Format/NumberFormat/MultipleNumberScriptTest.java" = "" +"java/util/Collections/RotateHuge.java" = "" +"java/util/ResourceBundle/Control/LoadingStrategiesTest.java" = "" +"java/util/TimeZone/AssureTzdataVersion.java" = "" +"javax/net/ssl/HttpsURLConnection/CriticalSubjectAltName.java" = "" +"javax/net/ssl/TLSCommon/ConcurrentClientAccessTest.java" = "" +"javax/net/ssl/TLSCommon/TestSessionLocalPrincipal.java" = "" +"javax/security/auth/login/Exceptions/NewExceptions.java" = "" +"javax/security/auth/login/LoginContext/SharedState.java" = "" +"javax/xml/crypto/dsig/GetInstanceTests.java" = "" +"javax/xml/crypto/dsig/TransformService/NullParent.java" = "" +"javax/xml/crypto/dsig/TransformService/UnknownProvider.java" = "" +"javax/xml/crypto/dsig/XMLSignatureFactory/UnknownProvider.java" = "" +"javax/xml/crypto/dsig/keyinfo/KeyInfoFactory/UnknownProvider.java" = "" +"jdk/dynalink/BeanLinkerRecordsTest.java" = "" +"jdk/internal/loader/InterruptedClassLoad.java" = "" +"sun/net/www/protocol/https/HttpsURLConnection/DNSIdentities.java" = "" +"sun/net/www/protocol/https/HttpsURLConnection/Identities.java" = "" +"sun/net/www/protocol/https/NewImpl/JavaxHostnameVerifier.java" = "" +"sun/security/jgss/spnego/MSOID.java" = "" +"sun/security/krb5/NullStringToKey.java" = "" +"sun/security/krb5/etype/UnsupportedKeyType.java" = "" +"sun/security/provider/SecureRandom/StrongSeedReader.java" = "" +"sun/security/rsa/TestCACerts.java" = "" +"sun/security/ssl/ClientHandshaker/RSAExport.java" = "" +"sun/security/ssl/SSLContextImpl/DefaultDTLSEnabledProtocols.java" = "" +"sun/security/ssl/SSLContextImpl/DefaultEnabledProtocols.java" = "" +"sun/util/resources/TimeZone/Bug4848242.java" = "" +"tools/jlink/CheckExecutable.java" = "" +"tools/jlink/ReleaseImplementorTest.java" = "" +"tools/launcher/InstanceMainTest.java" = "" diff --git a/expectations/jdk-jtreg.reference.json b/expectations/jdk-jtreg.reference.json new file mode 100644 index 0000000..61e0989 --- /dev/null +++ b/expectations/jdk-jtreg.reference.json @@ -0,0 +1,5892 @@ +{ + "schema": 1, + "fingerprint": "bcb93d37931c86d6314a651c84c4144107b5a65e527907a3202986d386102f5d", + "inputs": { + "protocol": 2, + "manifest": "openjdk25-jdk-inventory-v2", + "source": "829e6bae36579c46a3f9222355abe0b0ca7d66b3bfc8659eaf784fa002529692", + "jtreg": "18102bb9901e05a676455d6d6fd82de08f3a4471b6d1e8bc2663e0aced8b484e", + "execution": { + "concurrency": 4, + "timeoutFactor": 1, + "headless": true + }, + "root": "requiredVersion=7.5.1+1\nuseNewOptions=true\nuseNewPatchModule=true\nexclusiveAccess.dirs=java/math/BigInteger/largeMemory java/rmi/Naming java/util/prefs sun/management/jmxremote sun/tools/jstatd sun/security/mscapi java/util/Arrays/largeMemory java/util/BitSet/stream javax/rmi java/net/httpclient/websocket com/sun/net/httpserver/simpleserver sun/tools/jhsdb\n", + "heap": "-Xmx2g", + "referenceVersion": "openjdk version \"25.0.2\" 2026-01-20 LTS\nOpenJDK Runtime Environment Temurin-25.0.2+10 (build 25.0.2+10-LTS)\nOpenJDK 64-Bit Server VM Temurin-25.0.2+10 (build 25.0.2+10-LTS, mixed mode, sharing)", + "platform": "linux-x64", + "inventory": "5dcfd4d1ad8136a4559b041e3c97a76135a01a6f925fe6533f02ef563d7a6408" + }, + "generatedAt": "2026-09-10T09:23:55.086Z", + "exitCode": 2, + "results": { + "build/releaseFile/CheckReleaseFile.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/AlgorithmParameters/OAEPOrder.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/CICO/CICOChainingTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/CICO/CICODESFuncTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/CICO/CICOSkipTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AEAD/AEADBufferTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AEAD/Encrypt.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AEAD/GCMLargeDataKAT.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AEAD/GCMParameterSpecTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AEAD/GCMShortBuffer.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AEAD/GCMShortInput.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AEAD/KeyWrapper.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AEAD/ReadWriteSkip.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AEAD/SealedObjectTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AEAD/WrongAAD.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AES/Test4511676.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AES/Test4512524.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AES/Test4512704.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AES/Test4626070.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AES/TestAESCipher.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AES/TestAESCiphers/TestAESWithDefaultProvider.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AES/TestAESCiphers/TestAESWithRemoveAddProvider.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AES/TestCopySafe.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AES/TestNoPaddingModes.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/AES/TestShortBuffer.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/CTS/CTSMode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/DES/DESSecretKeySpec.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/DES/DesAPITest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/DES/DoFinalReturnLen.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/DES/PaddingTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/DES/PerformanceTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/DES/TextPKCS5PaddingTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/JCE/Bugs/4686632/Empty.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/KeyWrap/TestGeneral.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/KeyWrap/TestKeySizeCheck.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/KeyWrap/XMLEncKAT.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/PBE/DecryptWithoutParameters.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/PBE/PBEInvalidParamsTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/PBE/PBEKeyTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/PBE/PBEKeysAlgorithmNames.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/PBE/PBEParametersTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/PBE/PBMacBuffer.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/PBE/PBMacDoFinalVsUpdate.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/PBE/PKCS12CipherKAT.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/PBE/PKCS12Oid.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/PBE/TestCipherPBE.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/PBE/TestCipherPBECons.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/RC2ArcFour/CipherKAT.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/RSA/TestOAEPParameterSpec.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/RSA/TestOAEP_KAT.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/TextLength/SameBufferOverwrite.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/TextLength/TestCipherTextLength.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/UTIL/StrongOrUnlimited.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Cipher/UTIL/SunJCEGetInstance.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/KDF/HKDFKnownAnswerTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/KeyAgreement/SupportedDHKeys.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/KeyAgreement/TestExponentSize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/KeyAgreement/UnsupportedDHKeys.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/KeyFactory/PBKDF2HmacSHA1FactoryTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/KeyGenerator/Test4628062.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/KeyGenerator/TestExplicitKeyLength.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Mac/DigestCloneabilityTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Mac/HmacMD5.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Mac/HmacPBESHA1.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/Mac/MacKAT.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/NSASuiteB/TestAESOids.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/NSASuiteB/TestAESWrapOids.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/NSASuiteB/TestHmacSHAOids.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "com/sun/crypto/provider/TLS/TestLeadingZeroes.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/BufferedInputStream/CloseStream.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/BufferedInputStream/CountUpdate.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/BufferedInputStream/Fill.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/BufferedInputStream/ReadAfterClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/BufferedInputStream/ReadZeroBytes.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/BufferedReader/EOL.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/BufferedReader/Fill.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/BufferedReader/MarkedFillAtEOF.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/BufferedReader/ReadLine.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/BufferedReader/ReadLineSync.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/BufferedReader/Ready.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/BufferedReader/SkipNegative.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/BufferedWriter/Cleanup.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/ByteArrayInputStream/Skip.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/ByteArrayOutputStream/ToString.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/CharArrayReader/Constructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/CharArrayReader/OverflowInSkip.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/DataInputStream/OpsAfterClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/DataInputStream/ReadLinePushback.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/DataInputStream/SkipBytes.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/DataOutputStream/CounterOverflow.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Externalizable/compatibility/ExternalizableBlockData.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Externalizable/definesWriteObject/DefinesWriteObject.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/AccessDenied.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/CheckTempDir.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/CompareTo.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/Cons.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/Create.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/CreateNewFile.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/DeleteOnExit.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/DeleteOnExitLong.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/DeleteOnExitNPE.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/FileMethods.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/GetParent.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/HashCodeEquals.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/IsHidden.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/ListNull.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/ListRoots.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/ListSpace.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/MaxPathLength.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/Mkdir.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/NulFile.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/NullArgs.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/TimeZoneLastModified.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/ToURI.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/ToURL.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/Unicode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/UserDirChangedTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/createTempFile/NameTooLong.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/createTempFile/Patterns.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/File/createTempFile/TargetDirectory.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/FileDescriptor/Finalize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/FileDescriptor/RememberAppend.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/FileDescriptor/Sharing.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/FileInputStream/NegativeAvailable.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/FileInputStream/OpenDir.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/FileInputStream/OpsAfterClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/FileOutputStream/AtomicAppend.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/FileOutputStream/OpsAfterClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/FilePermission/FilePermissionCollection.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/FilePermission/SpecTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/FilterOutputStream/BoundsCheck.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/FilterOutputStream/SuppressedException.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/FilterOutputStream/Write.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/InputStream/OpsAfterClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/InputStream/ReadParams.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/InputStream/Skip.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/InputStreamReader/GrowAfterEOF.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/InputStreamReader/NullCreate.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/InputStreamReader/One.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/InputStreamReader/ReadOffset.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/LineNumberInputStream/Available.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/LineNumberInputStream/MarkReset.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/LineNumberInputStream/Skip.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/LineNumberInputStream/SkipEOL.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/LineNumberReader/MarkReset.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/LineNumberReader/Read.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/LineNumberReader/ReadReadLine.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/LineNumberReader/Skip.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/NegativeInitSize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/ObjectInputStream/NegativeArraySizeTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/ObjectInputStream/TestObjectStreamClass.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/OutputStream/WriteParams.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/OutputStreamWriter/BoundsCheck.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/OutputStreamWriter/CloseWriterOnFailedFlush.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/OutputStreamWriter/Encode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/OutputStreamWriter/NullCreate.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/OutputStreamWriter/TestWrite.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/OutputStreamWriter/WriteAfterClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedInputStream/CloseAndAvailableRC.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedInputStream/ClosedWriter.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedInputStream/Constructors.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedInputStream/FasterWriter.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedInputStream/WriterLoop.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedOutputStream/ClosedWrite.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedOutputStream/DeadReader.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedOutputStream/MultipleConnect.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedOutputStream/NotConnected.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedOutputStream/WriteAfterClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedReader/Constructors.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedReader/ReadToArray.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedReader/Ready.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedWriter/ConnectAfterReaderClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedWriter/FlushAfterClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PipedWriter/WriteAfterReaderClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PrintStream/CheckError.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PrintStream/ClearErrorStream.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PrintStream/EncodingConstructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PrintStream/FailingConstructors.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PrintStream/NullConstructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PrintStream/WriteBytes.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PrintWriter/CheckError.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PrintWriter/ClearErrorWriter.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PrintWriter/FailingConstructors.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PrintWriter/OpsAfterClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PrintWriter/OversynchronizedTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PrintWriter/SubClass.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PushbackInputStream/Available.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PushbackInputStream/ClosedStream.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PushbackInputStream/MarkReset.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PushbackInputStream/Skip.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PushbackReader/MarkReset.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PushbackReader/ReadCloseRaceNPE.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/PushbackReader/Skip.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/RandomAccessFile/Close.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/RandomAccessFile/EOF.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/RandomAccessFile/FileLengthTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/RandomAccessFile/OpenSync.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/RandomAccessFile/OpsAfterClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/RandomAccessFile/ParameterCheck.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/RandomAccessFile/ReadLine.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/RandomAccessFile/ReadWritePrimitives.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/RandomAccessFile/Seek.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/RandomAccessFile/WriteBytesChars.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/RandomAccessFile/WriteUTF.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/RandomAccessFile/skipBytes/SkipBytes.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Reader/NullLock.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Reader/OpsAfterClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Reader/ReadIntoReadOnlyBuffer.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Reader/ReadParams.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Reader/ReaderBulkReadContract.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Reader/SkipNegative.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/SequenceInputStream/Close.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/SequenceInputStream/ConstructorNull.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/SequenceInputStream/LotsOfStreams.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/InvalidClassException/TestIceConstructors.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/InvalidObjectException/TestIoeConstructors.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/NPEProvoker/NPEProvoker.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/available/Available.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/badSerialPersistentField/BadSerialPersistentField.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/badSerialVersionUID/BadSerialVersionUID.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/badSubstByReplace/BadSubstByReplace.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/classDescHooks/CNFException.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/classDescHooks/ClassDescHooks.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/classDescHooks/ExternLoopback.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/classDescHooks/Loopback.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/clearHandleTable/ClearHandleTable.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/cloneArray/CloneArray.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/concurrentClassDescLookup/ConcurrentClassDescLookup.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/defaultDataEnd/DefaultDataEnd.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/defaultReadObjectCNFException/DefaultReadObjectCNFException.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/enum/array/Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/enum/basic/Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/enum/classObject/Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/enum/ignoreSerializationFields/Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/enum/ignoreSerializationMethods/Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/enum/mismatchedTypecode/Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/enum/unshared/Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/explicitCNFException/ExplicitCNFException.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/finalFields/FinalFields.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/getSuidClinitError/GetSuidClinitError.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/illegalHandle/Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/inactiveRegistration/InactiveRegistration.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/lookupInterfaceDesc/LookupInterfaceDesc.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/maskSyntheticModifier/MaskSyntheticModifierTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/modifyStaticFields/ModifyStaticFields.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/noSuchFieldClarification/NoSuchFieldClarification.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/nonserializable/ExceptionDetail.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/notAvailable/NotAvailable.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/nullArgExceptionOrder/Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/oldTests/AnnotateClass.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/oldTests/ArraysOfArrays.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/oldTests/BinaryTree.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/oldTests/CheckForException.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/oldTests/CheckingEquality.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/oldTests/CircularList.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/oldTests/ValidateClass.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/optionalDataEnd/OptionalDataEnd.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/partialClassDesc/PartialClassDesc.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/primitiveClasses/PrimitiveClasses.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/proxy/replace/Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/readPastObject/ReadPastObject.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/replaceStringArray/ReplaceStringArray.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/replaceWithNull/ReplaceWithNull.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/resolveClass/MethodTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/resolveClassException/ResolveClassException.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/resolveProxyClass/NonPublicInterface.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/skipToEndOfBlockData/SkipToEndOfBlockData.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/survivePrematureClose/SurvivePrematureClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/typeSafeEnum/TypeSafeEnum.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/typeStringBackRef/TypeStringBackRef.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/underlyingOutputStreamException/UnderlyingOutputStreamException.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/userRWObjError/UserRWObjError.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/validate/Validate.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/verifyDynamicObjHandleTable/VerifyDynamicObjHandleTable.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Serializable/writeReplace/WriteReplace.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/StreamTokenizer/Comment.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/StreamTokenizer/NullConstruct.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/StreamTokenizer/QuoteTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/StreamTokenizer/ReadAhead.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/StreamTokenizer/Reset.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/StringReader/ClosedReady.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/StringReader/NegativeMarkLimit.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/StringReader/Skip.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/StringWriter/NegativeBufferSize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Writer/Append.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Writer/Bug6856817.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Writer/WriteFromString.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/Writer/WriteParams.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/charStreams/BCat.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/charStreams/BufferSizes.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/charStreams/BufferedReaderMark.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/charStreams/Cat.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/charStreams/LineLengths.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/charStreams/LineNumbers.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/charStreams/RandomLines.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/charStreams/SmallReads.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/charStreams/StringConvert.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/charStreams/UTF8.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/charStreams/WriteLengths.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/etc/FailingFlushAndClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/pathNames/win32/BadDriveLetter.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/readBytes/MemoryLeak.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/io/readBytes/ReadBytesBounds.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Appendable/Basic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/AssertionError/Cause.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Boolean/Factory.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Boolean/GetBoolean.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Boolean/ParseBoolean.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Byte/Decode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Character/Bug4404588.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Character/CharacterName.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Character/Latin1Digit.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Character/TestNegativeCodepoint.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Character/TestUndefinedDirectionality.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Character/TestUndefinedIdentifierStartPart.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Character/TestUndefinedIgnorable.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Character/TestUndefinedMirrored.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Character/TestUndefinedNumeric.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Character/TestUndefinedTitleCase.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Character/TestWhiteSpace.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/ArrayMethods.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/ArrayType.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/Cast.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/ForPrimitiveName.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/GenericStringTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/IsAnnotationType.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/IsEnum.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/IsSynthetic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/NameTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/ProtectionDomainRace.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/attributes/ClassAttributesTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/forName/InitArg.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/forName/InvalidNameWithSlash.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getClasses/Sanity.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getDeclaredClasses/Sanity.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getDeclaredClasses/TypeTag.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getDeclaredField/Exceptions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getDeclaredMethod/Exceptions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getDeclaringClass/Sanity.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getEnclosingConstructor/EnclosingConstructorTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getEnclosingMethod/EnclosingMethodTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getField/ArrayLength.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getField/Exceptions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getMethod/Exceptions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getMethod/NullInParamList.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getMethods/NonPublicStaticInitializer.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getMethods/StarInheritance.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getModifiers/ForInnerClass.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getModifiers/ForStaticInnerClass.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getModifiers/ResolveFrom.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getModifiers/StripACC_SUPER.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getModifiers/TestPrimitiveAndArrayModifiers.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Class/getSimpleName/GetSimpleNameTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ClassLoader/ExceptionHidingLoader.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ClassLoader/GetDefinedPackage.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ClassLoader/GetPackage.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ClassLoader/IsParallelCapable.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ClassLoader/LoadNullClass.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ClassLoader/findSystemClass/Loader.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Double/Extrema.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Double/NaNInfinityParsing.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Double/ParseDouble.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Double/ToString.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Float/Extrema.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Float/NaNInfinityParsing.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Float/ParseFloat.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/InheritableThreadLocal/Basic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/InheritableThreadLocal/ITLRemoveTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Integer/Decode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Integer/GetInteger.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Integer/ParsingTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Integer/Unsigned.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Long/Decode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Long/GetLong.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Long/ParsingTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Long/Unsigned.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Math/AbsPositiveZero.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Math/Atan2Tests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Math/CeilAndFloorTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Math/Clamp.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Math/ExpCornerCaseTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Math/IeeeRemainderTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Math/MinMax.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Math/PowTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Math/Rint.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Object/WaitTooLong.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Process/WaitFor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ProcessBuilder/DestroyTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ProcessBuilder/InheritIOEHandle.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ProcessBuilder/Zombies.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/RuntimePermission/ExitVM.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/RuntimeTests/Resources.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/RuntimeTests/Version/Basic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/RuntimeTests/exec/BadEnvp.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/RuntimeTests/exec/ConcurrentRead.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/RuntimeTests/exec/ExecEmptyString.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/RuntimeTests/exec/ExecWithInput.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/RuntimeTests/exec/LotsOfDestroys.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/RuntimeTests/exec/LotsOfOutput.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/RuntimeTests/exec/SleepyCat.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/SecurityManager/CheckSecurityProvider.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Short/ByteSwap.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Short/Decode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StackTraceElement/PublicConstructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StackWalker/DumpStackTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StackWalker/HiddenFrames.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StackWalker/MultiThreadStackWalk.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StackWalker/StackStreamState.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StackWalker/TestBCI.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StackWalker/VerifyStackTrace.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StackWalker/WalkFunction.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StrictMath/PowTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/CaseConvertSameInstance.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/CaseInsensitiveComparator.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/CompareIC.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/Encodings.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/EqualsIgnoreCase.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/Exceptions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/Indent.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/IndexOfEmptyInEmpty.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/IsBlank.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/IsEmpty.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/Lines.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/NonCharacterMapping.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/Regex.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/StringContentEqualsBug.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/Strip.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/Supplementary.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/ToLowerCase.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/ToUpperCase.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/String/Transform.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuffer/BufferForwarding.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuffer/Exceptions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuffer/GetCharsOverLength.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuffer/GetCharsSrcEndLarger.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuffer/InsertMaxValue.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuffer/InsertNullString.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuffer/Replace.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuffer/SetLength.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuffer/Substring.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuffer/Supplementary.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuffer/TestSynchronization.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuffer/ToStringCache.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuilder/BuilderForwarding.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuilder/EnsureCapacity.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuilder/Exceptions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuilder/StressSBTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/StringBuilder/Supplementary.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/System/Available.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/System/IHashCode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/System/Logger/interface/LoggerInterfaceTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/System/Versions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/System/finalization/FinInterrupt.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/System/finalization/FinThreads.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Thread/GenerifyStackTraces.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Thread/HoldsLock.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Thread/ITLConstructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Thread/IsAlive.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Thread/MainThreadTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Thread/NullStackTrace.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ThreadLocal/Basic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ThreadLocal/ImmutableLocal.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ThreadLocal/InitialValue.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ThreadLocal/MemoryLeak.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ThreadLocal/TLRemoveTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ThreadLocal/TestThreadId.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Throwable/LegacyChainedExceptionSerialization.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Throwable/LocalizedMessage.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Throwable/NewChainedExceptions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Throwable/OverrideFillInStackTrace.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Throwable/StackTraceSerialization.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/Throwable/SuppressedExceptions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/AnnotationToStringTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/AnnotationType/AnnotationTypeRuntimeAssumptionTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/AnnotationTypeMismatchException/AnnotationTypeMismatchTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/AnnotationTypeMismatchException/ArityTypeMismatchTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/AnnotationTypeMismatchException/ArrayTypeMismatchTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/AnnotationTypeMismatchException/EnumTypeMismatchTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/EnumConstructorAnnotation.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/ParameterAnnotations.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/RecursiveAnnotation.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/TestIncompleteAnnotationExceptionNPE.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/TypeAnnotationReflection.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/TypeParamAnnotation.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/UnitTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/repeatingAnnotations/InheritedAssociatedAnnotations.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/repeatingAnnotations/NonInheritableContainee.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/repeatingAnnotations/OrderUnitTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/typeAnnotations/GetAnnotatedInterfaces.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/typeAnnotations/GetAnnotatedNestedSuperclass.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/typeAnnotations/GetAnnotatedReceiverType.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/typeAnnotations/GetAnnotatedSuperclass.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/typeAnnotations/TestObjectMethods.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/typeAnnotations/TestReceiverTypeOwner.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/typeAnnotations/TestReceiverTypeOwnerType.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/typeAnnotations/TestReceiverTypeParameterizedConstructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/annotation/typeAnnotations/TestReceiverTypeParameterizedMethod.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/constant/DynamicConstantDescTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ref/Basic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ref/EarlyTimeout.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ref/EnqueueNullRef.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ref/FinalizeOverride.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ref/NullQueue.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ref/PhantomReferentClearing.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ref/ReferenceClone.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ref/ReferenceEnqueue.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ref/ReferenceEnqueuePending.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ref/ReferenceRefersTo.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/ref/SoftReference/Bash.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/AccessFlag/ClassAccessFlagTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/AccessFlag/FieldAccessFlagTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/AccessFlag/ModuleDescriptorAccessFlagTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/AccessFlag/VersionedLocationsTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/AnnotatedElement/TestAnnotatedElementDefaults.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Array/ExceedMaxDim.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Constructor/GenericStringTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Constructor/TestParameterAnnotations.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/DefaultAccessibility.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Field/4490864/StaticFieldTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Field/4498653/StaticInitializerTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Field/GenericStringTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Field/Set.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Field/TestFieldReflectValueOf.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Generics/HashCodeTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Generics/Probe.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Generics/SignatureTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Generics/StringsAndBounds.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Generics/TestGenericReturnTypeToString.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Generics/TestParameterizedType.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Generics/TestPlainArrayNotGeneric.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Generics/exceptionCauseTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Generics/getAnnotationTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Method/GenericStringTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Method/InheritedInterfaceMethods.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Method/InheritedMethods.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Method/InterfaceStatic/StaticInterfaceMethodInWayOfDefault.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Method/IsDefaultTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Method/defaultMethodModeling/DefaultMethodModeling.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Method/invoke/ErrorInInvoke.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Method/invoke/IllegalAccessInInvoke.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Method/invoke/TestMethodReflectValueOf.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Modifier/toStringTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Parameter/BadClassFiles.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Parameter/NoName.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Parameter/WithoutParameters.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Proxy/Boxing.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/Proxy/CharType.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/ReflectPermission/Exceptions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/lang/reflect/TypeVariable/TestAnnotatedElement.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/AddTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/CompareToTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/ConstructorUnscaledValue.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/DivideTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/EqualsTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/IntValueExactTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/IntegralDivisionTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/IntegralValueTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/LongValueExactTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/MovePointTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/MultiplyTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/NegateTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/PowTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/PrecisionTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/RoundingTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/ScaleByPowerOfTenTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/SerializationTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/SquareRootTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigDecimal/ZeroScalingTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigInteger/BigIntegerParallelMultiplyTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigInteger/BitLengthOverflow.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigInteger/CompareToTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigInteger/DoubleValueOverflow.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigInteger/HashCode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigInteger/ModInvTime.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigInteger/ModPowPowersof2.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigInteger/OperatorNpeTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigInteger/PrimitiveConversionTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigInteger/ProbablePrime.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigInteger/SerializationTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigInteger/StringConstructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigInteger/TestValueExact.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/BigInteger/UnicodeConstructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/math/RoundingMode/RoundingModeTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Authenticator/GetAuthenticatorTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/B6499348.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/CookieHandler/B6644726.java": { + "status": "fail", + "detail": "Failed. Execution failed\\: `main' threw exception\\: java.lang.RuntimeException\\: Should have 5 cookies. Got only 3, expires probably didn't parse correctly" + }, + "java/net/CookieHandler/NullUriCookieTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/CookieHandler/TestHttpCookie.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/DatagramPacket/CheckBoundaries.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/DatagramPacket/Offset.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/DatagramPacket/ReuseBuf.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/DatagramPacket/Unresolved.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/DatagramSocket/AddressNotSet.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/DatagramSocket/B6411513.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/DatagramSocket/GetLocalAddress.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/DatagramSocket/ImplicitBind.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/DatagramSocket/InheritHandle.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/DatagramSocket/LocalSocketAddress.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/DatagramSocket/ReportSocketClosed.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/DatagramSocket/TestAfterClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/DatagramSocketImpl/CheckDiscard.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/HttpCookie/CookieNegativeMaxAge.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/IDN/IllegalArg.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/IDN/UseSTD3ASCIIRules.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Inet4Address/isSiteLocalAddress.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Inet6Address/B4923906.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Inet6Address/IPv6AddressTypes.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Inet6Address/IPv6Numeric.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Inet6Address/StringScope.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Inet6Address/serialize/Inet6AddressSerTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Inet6Address/serialize/Serialize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/InetAddress/B6246242.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/InetAddress/B6296240.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/InetAddress/BadDottedIPAddress.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/InetAddress/CachedUnknownHostName.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/InetAddress/GetLoopbackAddress.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/InetAddress/IPv4Formats.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/InetAddress/IsReachable.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/InetAddress/WhiteSpaceHostTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/InetSocketAddress/B4849451.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/InetSocketAddress/B6469803.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/InetSocketAddress/CreateUnresolved.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/InterfaceAddress/NetworkPrefixLength.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/MulticastSocket/B6425815.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/MulticastSocket/B6427403.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/MulticastSocket/MulticastTTL.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/MulticastSocket/NetworkInterfaceEmptyGetInetAddressesTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/MulticastSocket/Reuse.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/MulticastSocket/SetTTLAndGetTTL.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/MulticastSocket/SetTTLTo0.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/MulticastSocket/TestDefaults.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/MulticastSocket/TimeToLive.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/NetworkInterface/Equals.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/NetworkInterface/GetMacAddress.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/NetworkInterface/IndexTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/NetworkInterface/NetParamsTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/NetworkInterface/SubNetworkInterfaceTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/PlainSocketImpl/BigBacklog.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/PlainSocketImpl/CustomSocketImplFactory.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/PlainSocketImpl/SetBufferSize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/PlainSocketImpl/SetOption.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/PortUnreachableException/Concurrent.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/PortUnreachableException/OneExceptionOnly.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/PortUnreachableException/Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/ProxySelector/B6563259.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/ProxySelector/B6737819.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/ProxySelector/B8035158.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/ProxySelector/MultiThreadedSystemProxies.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/ResponseCache/getResponseCode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/ServerSocket/IsClosedAfterAsyncClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/ServerSocket/NullConstructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/ServerSocket/TestAfterClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Socket/IDNTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Socket/NullHost.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Socket/SetReceiveBufferSize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Socket/ShutdownBoth.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Socket/SoTimeout.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Socket/Streams.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Socket/asyncClose/Race.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/SocketException/TestSocketExceptionCtor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/SocketPermission/ActionSpace.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/SocketPermission/B4414825.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/SocketPermission/Equals.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/SocketPermission/NoAction.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/SocketPermission/SocketPermissionCollection.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/SocketPermission/Wildcard.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/Socks/BadProxySelector.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URI/RelativeEncoding.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URI/Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URI/URItoURLTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/B4148751.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/B6529759.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/B8282395.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/Constructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/Equals.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/GetDefaultPort.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/HashCode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/LocaleDependentURLTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/OpenConnection.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/OpenStream.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/ParseAuthority.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/ParseURL.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/Protocol.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/RelativePath.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/RelativeURL.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/RelativeURLTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/RestoreURL.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/TestIPv6Addresses.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/TestPort.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/TestRFC2732.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/URIToURLTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URL/UppercaseScheme.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLClassLoader/AddURLTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLClassLoader/B6827999.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLClassLoader/B6896088.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLClassLoader/B7050028.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLClassLoader/ClassPathTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLClassLoader/FindResourceDoesNotThrowException.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLClassLoader/GetURLsTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLClassLoader/NullURLTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLClassLoader/URLParsing.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLConnection/Connect.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLConnection/ExifContentGuesser.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLConnection/GetContentType.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLConnection/GetFileNameMap.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLConnection/GetLastModified.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLConnection/GetXmlContentType.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLConnection/RequestPropertyValues.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLConnection/Responses.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLConnection/TIFFContentGuesser.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLConnection/UnknownContentType.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLDecoder/B6463990.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLDecoder/EncodeDecode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLDecoder/URLDecoderArgs.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLEncoder/DecodeNonEncoded.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLEncoder/Decoder.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLEncoder/URLEncodeDecode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/URLEncoder/URLEncoderEncodeArgs.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/net/ipv6tests/BadIPv6Addresses.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/Buffer/AllocateDirectInit.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/Buffer/CharAt.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/Buffer/Order.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/Buffer/StringCharBufferSliceTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/ByteOrder/NativeOrder.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/MappedByteBuffer/Basic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/MappedByteBuffer/ForceException.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/MappedByteBuffer/SubclassCastUOE.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/MappedByteBuffer/Truncate.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/AsynchronousChannelGroup/AsExecutor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/AsynchronousChannelGroup/GroupOfOne.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/AsynchronousChannelGroup/Unbounded.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/AsynchronousSocketChannel/DieBeforeComplete.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Channels/Basic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Channels/CloseWriterOnFailedFlush.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Channels/ReadByte.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Channels/ReadOffset.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Channels/TinyBuffers.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Channels/Write.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/ConfigureBlocking.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/DatagramChannel/AdaptorConcurrentIO.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/DatagramChannel/ChangingAddress.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/DatagramChannel/EmptyBuffer.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/DatagramChannel/NoSender.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/DatagramChannel/NotBound.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/DatagramChannel/Receive.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/DatagramChannel/Refused.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/DatagramChannel/StressNativeSignal.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/DatagramChannel/ThereCanBeOnlyOne.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/DatagramChannel/Truncate.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/FileLock/FileLockConstructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Pipe/EmptyRead.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Pipe/PipeInterrupt.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/SelectionKey/AtomicAttachTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/SelectionKey/RacyRegister.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/CancelDuringRegister.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/Close.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/CloseInvalidatesKeys.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/CloseThenRegister.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/CloseWhenKeyIdle.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/KeySets.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/OpRead.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/ReadAfterConnect.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/RegAfterPreClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/SelectAfterRead.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/SelectNowWhenEmpty.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/SelectWrite.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/WakeupAfterClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/WakeupEmpty.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/WakeupNow.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/WakeupOverflow.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/Selector/WakeupSpeed.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/ServerSocketChannel/AdaptServerSocket.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/ServerSocketChannel/Open.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/SocketChannel/Bind.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/SocketChannel/Close.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/SocketChannel/CloseAfterConnect.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/SocketChannel/ExceptionTranslation.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/SocketChannel/GetChannel.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/SocketChannel/LingerOnClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/SocketChannel/Shutdown.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/SocketChannel/Trivial.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/SocketChannel/UnboundSocketTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/etc/NetworkChannelTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/etc/Shadow.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/unixdomain/Shutdown.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/channels/unixdomain/SocketOptions.java": { + "status": "fail", + "detail": "Failed. Execution failed\\: `main' threw exception\\: java.lang.RuntimeException\\: wrong username, actual 1001 but expected value from property user.name is ?" + }, + "java/nio/charset/CharsetDecoder/ASCIIDecode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/charset/CharsetDecoder/AverageMax.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/charset/CharsetDecoder/EmptyInput.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/charset/CharsetDecoder/NaNinCtor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/charset/CharsetEncoder/CanEncode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/charset/CharsetEncoder/NaNinCtor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/charset/RemovingSunIO/TestUnmappableForLength.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/charset/coders/FullRead.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/charset/coders/IOCoders.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/charset/coders/IsLegalReplacement.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/charset/coders/StreamTimeout.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/charset/coders/Surrogates.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/file/Files/CopyToNonDefaultFS.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/file/Files/NameLimits.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/file/Files/walkFileTree/Nulls.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/file/Path/UriImportExport.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/file/PathMatcher/Basic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/file/WatchService/DeleteInterference.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/file/WatchService/LotsOfCancels.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/file/WatchService/LotsOfCloses.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/file/WatchService/UpdateInterference.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/nio/file/attribute/AclEntry/EmptySet.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/AccessControlContext/CheckCtor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/AccessControlContext/NullCombinerEquals.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/AccessController/PreserveCombiner.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/BasicPermission/BasicPermissionCollection.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/BasicPermission/EqualsImplies.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/BasicPermission/ExitVMEquals.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/BasicPermission/Homogeneity.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/BasicPermission/MixedBasicPermissions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/BasicPermission/NullOrEmptyName.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/BasicPermission/PermClass.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/BasicPermission/SerialVersion.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/CodeSigner/Serialize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/CodeSource/CertsMatch.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/CodeSource/Implies.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Exceptions/ChainingConstructors.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Identity/EqualsHashCodeContract.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/IdentityScope/NoDefaultSystemScope.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/KeyFactory/GenerateRSAPrivateCrtKey.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/KeyFactory/KeyFactoryGetKeySpecForInvalidSpec.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/KeyPairGenerator/FinalizeHalf.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/KeyStore/KeyStoreBuilder.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/KeyStore/PBETest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/KeyStore/PKCS12/CheckDefaults.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/KeyStore/PKCS12/ConvertP12Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/KeyStore/PKCS12/ReadP12Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/KeyStore/PKCS12/WriteP12Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/KeyStore/TestKeyStoreBasic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/KeyStore/TestKeyStoreEntry.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/MessageDigest/ArgumentSanity.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/PKCS12Attribute/HashCode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Permission/NullName.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Permission/ToString.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/PermissionCollection/AddToReadOnlyPermissionCollection.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/PermissionCollection/Concurrent.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Permissions/DeserializeInvalidPermissions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Principal/Implies.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/PrivilegedActionException/PrintWrappedException.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/ProtectionDomain/CheckWhatYouGet.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/ProtectionDomain/NullPerms.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Provider/CaseSensitiveServices.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Provider/CertStoreConstructorParam.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Provider/DefaultProviderList.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Provider/Equals.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Provider/GetServiceRace.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Provider/InvalidServiceTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Provider/NewInstance.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Provider/ProviderInfoCheck.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Provider/ProviderVersionCheck.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Provider/Turkish.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/SecureRandom/DefaultProvider.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/SecureRandom/GetAlgorithm.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/SecureRandom/NextBytesNull.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/SecureRandom/Serialize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Security/CaseInsensitiveAlgNames.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Security/Nulls.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Security/removing/RemoveProviderByIdentity.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Security/removing/RemoveStaticProvider.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/Signature/SignatureGetAlgorithm.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/SignedObject/Correctness.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/UnresolvedPermission/AccessorMethods.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPath/Serialize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathBuilder/NoExtensions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathBuilder/akiExt/AKISerialNumber.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathBuilder/targetConstraints/BuildOddSel.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathBuilder/zeroLengthPath/ZeroLengthPath.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathEncodingTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathValidator/OCSP/AIACheck.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathValidator/OCSP/FailoverToCRL.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathValidator/indirectCRL/CircularCRLOneLevel.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathValidator/indirectCRL/CircularCRLOneLevelRevoked.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathValidator/indirectCRL/CircularCRLTwoLevel.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathValidator/indirectCRL/CircularCRLTwoLevelRevoked.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathValidator/nameConstraints/NameConstraintsWithRID.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathValidator/nameConstraints/NameConstraintsWithUnexpectedRID.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathValidator/nameConstraints/NameConstraintsWithoutRID.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathValidator/nameConstraintsRFC822/ValidateCertPath.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathValidator/targetConstraints/ValidateTargetConstraints.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathValidator/trustAnchor/ValWithAnchorByName.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathValidatorException/GetMessage.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathValidatorException/ReasonTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertPathValidatorException/Serial.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertStore/NoLDAP.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertificateFactory/BadX509CertData.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertificateFactory/GenerateCertificatesEmptyCollection.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertificateFactory/ReturnStream.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertificateFactory/SlowStream.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertificateFactory/invalidEncodedCerts/DetectInvalidEncoding.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertificateFactory/openssl/BadFooter.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/CertificateFactory/openssl/OpenSSLCert.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/GetInstance.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/PKIXRevocationChecker/OcspUnauthorized.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/PKIXRevocationChecker/UnitTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/PolicyNode/GetPolicyQualifiers.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/URICertStoreParameters/TestBasic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/X509CertSelector/SetNameConstraintsEmptySequence.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/X509Certificate/ExtKeyUsage.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/X509Certificate/X509BadCertificate.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/pkix/nameConstraintsMinMax/VerifyNameConstraints.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/cert/pkix/policyChanges/TestPolicy.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/misc/GetInstanceNullsEmpties.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/spec/ECCBasic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/spec/PKCS8EncodedKeySpec/Algorithm.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/security/spec/TestNamedParameterSpec.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Bidi/BidiBug.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Bidi/BidiSurrogateTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Bidi/Bug7002398.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Bidi/Bug7041232.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Bidi/Bug8005277.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/BreakIterator/Bug4740757.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/BreakIterator/Bug4912404.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/BreakIterator/Bug6513074.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/BreakIterator/Bug7104012.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/BreakIterator/Bug8032446.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/BreakIterator/ExceptionTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Collator/Bug6970930.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Collator/Bug7200119.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Collator/CurrencyCollate.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/Bug4396385.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/Bug4736959.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/Bug6251817.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/Bug6609750.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/Bug6645292.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/Bug7130335.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/Bug7177315.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/Bug8072099.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/Bug8081794.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/Bug8141243.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/DateFormatSymbolsCloneTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/ISO8601ZoneTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/SDFTCKZoneNamesTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/WeekDateTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/bug4097450.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/bug4099975.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/bug6271375.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/bug6317072.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DateFormat/bug6412896.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DecimalFormat/Bug6609740.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DecimalFormat/Bug7196316.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DecimalFormat/Bug8165466.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DecimalFormat/FormatMicroBenchmark.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/DecimalFormat/TieRoundingTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/MessageFormat/MessageFormatsByArgumentIndex.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/NumberFormat/Bug4833877.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/NumberFormat/MultipleNumberScriptTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/NumberFormat/NumberFormatRounding.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/NumberFormat/TestgetPatternSeparator_ja.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/text/Format/common/Bug6215962.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/AbstractCollection/ToArrayTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/AbstractCollection/ToString.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/AbstractList/FailFastIterator.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/AbstractList/HasNextAfterException.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/AbstractMap/AbstractMapClone.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/AbstractMap/Equals.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/AbstractMap/ToString.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/AbstractSequentialList/AddAll.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ArrayList/AddAll.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ArrayList/Bug6533203.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ArrayList/EnsureCapacity.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ArrayList/SortingModCount.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ArrayList/SubListModCount.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Arrays/Big.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Arrays/Fill.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Arrays/FloatDoubleOrder.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Arrays/TimSortStackSize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Base64/Base64GetEncoderTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Base64/TestBase64Golden.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/BitSet/And.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/BitSet/MemoryLeak.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/BitSet/StickySize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/Bug4851640.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/Bug4958050.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/Bug5078053.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/Bug6178071.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/Bug6234795.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/Bug6448234.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/Bug6645263.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/Bug7017458.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/Bug8075548.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/Bug8152077.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/Bug8176847.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/Builder/BuilderTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/CalendarTypeTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/Limit.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/WeekDateTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Calendar/ZoneOffsets.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collection/BiggernYours.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collection/HotPotatoes.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collection/IteratorAtEnd.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/AsLifoQueue.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/BigBinarySearch.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/BinarySearchNullComparator.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/CheckedListReplaceAll.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/CheckedMapReplaceAll.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/CheckedNull.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/EmptyIterator.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/Enum.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/EqualsTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/FindSubList.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/Frequency.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/MinMax.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/NCopies.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/NullComparator.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/RacingCollections.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/ReplaceAll.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/ReverseOrder.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/ReverseOrder2.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/RotateEmpty.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/RotateHuge.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/Ser.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/SetFromMap.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/Swap.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/T6433170.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/ViewSynch.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Collections/WrappedNull.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Date/Bug4955000.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Date/TZ.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Deque/ChorusLine.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumMap/DistinctEntrySetElements.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumMap/EntrySetIteratorRemoveInvalidatesEntry.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumMap/EnumMapBash.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumMap/ProperEntrySetOnClone.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumMap/SimpleSerialization.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumMap/ToArray.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumMap/UniqueNullValue.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumSet/AllOf.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumSet/BogusEnumSet.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumSet/ComplementOf.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumSet/EnumSetClassSerialization.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumSet/InsertWrongType.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumSet/JumboRange.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumSet/LargeEnumIteratorRemoveResilience.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumSet/Range.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumSet/RetainAll.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/EnumSet/SmallEnumIteratorRemoveResilience.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Formattable/StockName.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Formatter/Close.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Formatter/Constructors.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Formatter/FailingConstructors.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Formatter/Flush.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Formatter/NullArg.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/HashMap/KeySetRemove.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/HashMap/NullKeyAtResize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/HashMap/OverrideIsEmpty.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/HashMap/PutNullKey.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/HashMap/ReplaceExisting.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/HashMap/SetValue.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/HashMap/ToArray.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/HashMap/ToString.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Hashtable/EqualsCast.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Hashtable/HashCode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Hashtable/IllegalLoadFactor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Hashtable/ReadObject.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Hashtable/SelfRef.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Hashtable/SerializationDeadlock.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Hashtable/SimpleSerialization.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/IdentityHashMap/DistinctEntrySetElements.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/IdentityHashMap/EntrySetIteratorRemoveInvalidatesEntry.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/IdentityHashMap/ToArray.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/IdentityHashMap/ToString.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/IllegalFormatException/Constructors.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/LinkedHashMap/Basic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/LinkedHashMap/Cache.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/LinkedHashMap/ComputeIfAbsentAccessOrder.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/LinkedHashMap/EmptyMapIterator.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/LinkedHashSet/Basic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/LinkedList/AddAll.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/LinkedList/Clone.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/LinkedList/ComodifiedRemove.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/LinkedList/Remove.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Locale/ExtensionsTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Locale/LSRDataTest.java": { + "status": "fail", + "detail": "Failed. Execution failed\\: `main' threw exception\\: java.nio.file.NoSuchFileException\\: /work/.harness/work/jdk-jtreg/jtreg-run-sZYMBg/suite/java/util/Locale/../../../../../src/java.base/share/data/lsrdata/language-subtag-registry.txt" + }, + "java/util/Locale/LanguageSubtagRegistryTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Map/EntryHashCode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Map/Get.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Map/ToArray.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/MissingFormatArgumentException/GetFormatSpecifier.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Objects/BasicObjectsTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Observable/ClearChanged.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/PluggableLocale/SupportedLocalesTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/PriorityQueue/ForgetMeNot.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/PriorityQueue/NoNulls.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/PriorityQueue/PriorityQueueSort.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/PriorityQueue/RemoveContains.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/BlankLines.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/Bug6609431.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/CheckOverrides.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/CheckUnsynchronized.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/CloseXMLStream.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/EscapeSpace.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/LoadAndStoreNPE.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/LoadAndStoreXML.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/LoadAndStoreXMLWithDefaults.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/LoadParsing.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/LoadParsing2.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/LoadSeparators.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/Save.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/SaveClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/SaveComments.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/SaveEncoding.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/SaveSeparator.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Properties/UnicodeEscape.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/PropertyPermission/PropertyPermissionCollection.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Random/LXMRandomWithSeed.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Random/NextBytes.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Random/NextIntPowerOfTwoMod.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ResourceBundle/Bug4083270Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ResourceBundle/Bug4195978Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ResourceBundle/Bug4353454.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ResourceBundle/Bug6190861.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ResourceBundle/Bug6572242.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ResourceBundle/Control/BadControlsTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ResourceBundle/Control/ControlFactoryTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ResourceBundle/Control/LoadingStrategiesTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ResourceBundle/Control/XMLResourceBundleTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ResourceBundle/Test4318520.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Scanner/FailingConstructors.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/ServiceLoader/NPE.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/StringTokenizer/FormFeed.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/StringTokenizer/ResetPos.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/StringTokenizer/Supplementary.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TimeZone/AssureTzdataVersion.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TimeZone/Bug5097350.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TimeZone/Bug6772689.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TimeZone/DaylightTimeTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TimeZone/IDTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TimeZone/ListTimeZones.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TimeZone/SimpleTimeZoneCloneRaceTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TimeZone/bug4096952.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Timer/Args.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Timer/KillThread.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Timer/NameConstructors.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TreeMap/Clone.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TreeMap/ContainsValue.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TreeMap/EmptyMapAndNulls.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TreeMap/HeadTailTypeError.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TreeMap/NullAtEnd.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TreeMap/NullPermissiveComparator.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TreeMap/SubMap.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/TreeMap/SubMapClear.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Vector/ComodifiedRemoveAllElements.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Vector/CopyInto.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Vector/IllegalConstructorArgs.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Vector/LastIndexOf.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Vector/SerializationDeadlock.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Vector/SimpleSerialization.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/Vector/SyncLastIndexOf.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/WeakHashMap/Iteration.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/WeakHashMap/ZeroInitCap.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/Attributes/IterationOrder.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/Attributes/Name.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/Attributes/PutAndPutAll.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/Attributes/TestAttrsNL.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/JarEntry/GetMethodsReturnClones.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/JarFile/Constructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/JarFile/JarNoManifest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/JarFile/MevNPE.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/JarFile/ScanSignedJar.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/JarFile/SignedJarFileGetInputStream.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/JarFile/SorryClosed.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/JarFile/TurkCert.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/JarInputStream/EmptyJar.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/JarInputStream/ScanSignedJar.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/JarInputStream/TestIndexedJarWithBadSignature.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/jar/TestExtra.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/regex/NamedGroupsTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/spi/ToolProviderDescriptionTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/spi/ToolProviderTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/Bounds.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/ConstructDeflaterInput.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/ConstructInflaterOutput.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/DataDescriptor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/GZIP/GZIPInZip.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/GZIP/ReadUByte.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/InflaterInputStream/MarkReset.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/InflaterInputStream/UnexpectedEndOfZlibStream.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/InfoZip.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/InterruptibleZip.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/ReadLoc.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/StoredCRC.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/StreamConstructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/StreamIOAfterClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/TestEmptyZip.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/TestExtraTime.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/TestLocalTime.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/ZipEntry/Clone.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/ZipEntry/Constructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/ZipFile/Comment.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/ZipFile/Constructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/ZipFile/ManyZipFiles.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/ZipFile/ShortRead.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/ZipInputStream/Constructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "java/util/zip/ZipInputStream/Skip.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/Cipher/ByteBuffersNull.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/Cipher/CipherInputStreamExceptions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/Cipher/CipherStreamClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/Cipher/ExampleVectors/CheckExampleVectors.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/Cipher/GCMAPI.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/Cipher/GetMaxAllowed.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/Cipher/InOutBuffers.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/Cipher/TestCipherMode.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/Cipher/Turkish.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/CryptoPermission/LowercasePermCheck.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/CryptoPermission/RC4AliasPermCheck.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/CryptoPermission/RSANoLimit.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/CryptoPermissions/CryptoPolicyFallback.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/EncryptedPrivateKeyInfo/GetAlgName.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/EncryptedPrivateKeyInfo/GetEncoded.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/JceSecurity/FinalRestricted.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/KeyGenerator/CompareKeys.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/Mac/NullMacSpi.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/NullCipher/TestWithoutInit.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/SealedObject/NullKeySealedObject.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/SealedObject/TestSealedObjectNull.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/SecretKeyFactory/PBKDF2TranslateTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/SecretKeyFactory/SecKFTranslateTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/spec/DESKeySpec/CheckParity.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/spec/DESKeySpec/CheckWeakKeys.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/spec/DESKeySpec/NullKey.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/spec/GCMParameterSpec/GCMParameterSpecTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/spec/IvParameterSpec/InvalidArgs.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/spec/IvParameterSpec/NullIV.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/spec/PBEKeySpec/PBEKeySpecRacing.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/spec/RC2ParameterSpec/RC2AlgorithmParameters.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/spec/RC2ParameterSpec/RC2ParameterSpecEquals.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/spec/RC5ParameterSpec/InvalidIV.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/crypto/spec/RC5ParameterSpec/RC5ParameterSpecEquals.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/FixingJavadocs/JavaxURLNulls.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/FixingJavadocs/KMTMGetNothing.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/GetInstance.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/HttpsURLConnection/CriticalSubjectAltName.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/HttpsURLConnection/DefaultCacheResponse.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/HttpsURLConnection/DelayDefaultContextLoading.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/SSLEngine/ArgCheck.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/SSLEngine/CheckTlsEngineResults.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/SSLEngine/FinishedPresent.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/SSLEngine/IllegalHandshakeMessage.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/SSLEngine/LargePacket.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/SSLEngine/SSLEngineResultArgs.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/SSLEngineResult/Deserialize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/SSLException/CheckSSLHandshakeException.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/SSLException/CheckSSLKeyException.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/SSLException/CheckSSLPeerUnverifiedException.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/SSLException/CheckSSLProtocolException.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/SSLParameters/NamedGroupsSpec.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/SSLSession/ResumeTLS13withSNI.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/SSLSession/SessionCacheSizeTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/SSLSession/SessionTimeOutTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/ServerName/BestEffortOnLazyConnected.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/ServerName/IllegalSNIName.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/ServerName/SSLSocketConsistentSNI.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/ServerName/SSLSocketInconsistentSNI.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/TLSCommon/ConcurrentClientAccessTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/TLSCommon/TestSessionLocalPrincipal.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/finalize/SSLSessionFinalizeTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/sanity/CacertsExplorer.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/sanity/ciphersuites/CipherSuitesInOrder.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/sanity/ciphersuites/NoKerberos.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/net/ssl/sanity/pluggability/CheckSSLContextExport.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/PrivateCredentialPermission/CanonError.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/PrivateCredentialPermission/EmptyName.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/PrivateCredentialPermission/Equals.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/PrivateCredentialPermission/Serial.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/PrivateCredentialPermission/Serial2.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/Subject/AddPrincipalSubclass.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/Subject/CurrentSubject.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/Subject/DoAsTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/Subject/Generic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/Subject/Synch.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/Subject/Synch2.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/Subject/Synch3.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/Subject/UnreliableContains.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/SubjectDomainCombiner/Optimize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/callback/PasswordCallback/PasswordCleanup.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/login/Configuration/ConfigFileWithBlank.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/login/Exceptions/NewExceptions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/login/LoginContext/SharedState.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/x500/X500Principal/DerIsConstructor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/x500/X500Principal/Equals.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/x500/X500Principal/EscapedChars.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/x500/X500Principal/InvalidConstructorInput.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/x500/X500Principal/KeywordMap.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/x500/X500Principal/OIDMap.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/x500/X500Principal/Parse.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/security/auth/x500/X500Principal/RFC4514.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/xml/crypto/dsig/GetInstanceTests.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/xml/crypto/dsig/TransformService/NullParent.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/xml/crypto/dsig/TransformService/UnknownProvider.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/xml/crypto/dsig/XMLSignatureFactory/UnknownProvider.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "javax/xml/crypto/dsig/keyinfo/KeyInfoFactory/UnknownProvider.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "jdk/dynalink/BeanLinkerRecordsTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "jdk/internal/jrtfs/PathOps.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "jdk/internal/loader/InterruptedClassLoad.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "jdk/internal/loader/URLClassPath/FileLoaderTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "jdk/internal/loader/URLClassPath/JarLoaderTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "jdk/security/JavaDotSecurity/TestJDKIncludeInExceptions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/http/HttpClient/B8025710.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/http/HttpClient/MultiThreadTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/http/HttpClient/ProxyTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/file/EncodedMultiByteChar.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/file/Equals.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/file/FileMap.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/file/FileURLTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/file/GetContentLength.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/file/GetContentType.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/file/GetHeaderFields.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/file/GetLastModified.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/file/NonUTF8EncodedChar.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/ftp/HandlerEquals.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/ftp/UserAndPasswordTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/http/Finalizer.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/http/GetOutputStream.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/http/ProtocolRedirect.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/https/HttpsURLConnection/DNSIdentities.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/https/HttpsURLConnection/Identities.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/https/HttpsURLConnection/ImpactOnSNI.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/https/NewImpl/JavaxHostnameVerifier.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/jar/B4756443.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/jar/B5105410.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/jar/CanonicalizationTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/jar/FileURLConnectionLeak.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/jar/JarURLConnectionUseCaches.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/net/www/protocol/mailto/HandlerParse.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/ch/Basic.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/ch/SelProvider.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/ch/ServerSocketAdaptorTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/ch/TempBuffer.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/BufferUnderflowEUCTWTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/CheckCaseInsensitiveEncAliases.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/CheckICNE.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/ConvertSingle.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/DecoderOverflow.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/EUCJPUnderflowDecodeTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/EncodingNothing.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/EucJpLinux0212.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/EucJpLinuxDecoderRecoveryTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/FindASCIICodingBugs.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/FindASCIIRangeCodingBugs.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/FindASCIIReplBugs.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/ISO8859x.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/LatinCharReplacementTWTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/LeftOverSurrogate.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/MalformedSurrogateStringTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/MalformedSurrogates.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/ReadZero.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/SurrogateGB18030Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/SurrogateTestEUCTW.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/SurrogateTestHKSCS.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/Test4206507.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/Test6275027.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/Test6392804.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/TestJIS0208Decoder.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/TestJIS0212Decoder.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/TestMS950.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/TestMiscEUC_JP.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/TestUTF8.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/TestUTF8BOM.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/TestUTF_16.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/TestUTF_32.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/TestUni2HKSCS.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/UkrainianIsNotRussian.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/nio/cs/ZeroedByteArrayEUCTWTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ec/ECDSAPrvGreaterThanOrder.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ec/ed/EdDSAReuseTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ec/ed/EmptyMessage.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/jca/PreferredProviderTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/jgss/CtorTests2.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/jgss/spnego/MSOID.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/jgss/spnego/MechTokenMissing.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/krb5/BadKdcDefaultValue.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/krb5/NullStringToKey.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/krb5/etype/UnsupportedKeyType.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/lib/cacerts/VerifyCACerts.java": { + "status": "fail", + "detail": "Failed. Execution failed\\: `main' threw exception\\: java.lang.RuntimeException\\: At least one cacert test failed" + }, + "sun/security/pkcs/pkcs8/TestLeadingZeros.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/pkcs11/Provider/ConfigShortPath.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/pkcs11/Provider/LoginISE.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/pkcs12/Bug6415637.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/pkcs12/EmptyAlias.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/pkcs12/MixedcaseAlias.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/pkcs12/PBES2Encoding.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/pkcs12/StorePasswordTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/pkcs12/StoreSecretKeyTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/pkcs12/StoreTrustedCertTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/pkcs12/WrongPBES2.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/DSA/SecureRandomReset.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/DSA/TestMaxLengthDER.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/KeyStore/DksWithEmptyKeystore.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/KeyStore/TestJKSWithSecretKey.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/KeyStore/WrongPassword.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/KeyStore/WrongStoreType.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/MessageDigest/Offsets.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/MessageDigest/TestSHAClone.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/NSASuiteB/TestSHAOids.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/PolicyFile/CanonPath.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/PolicyFile/NullCodeSource.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/PolicyFile/nullDomain.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/SecureRandom/SHA1PRNGReseed.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/SecureRandom/StrongSeedReader.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/SeedGenerator/Awt_Hang_Test.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/certpath/DisabledAlgorithms/CPValidatorEndEntity.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/certpath/DisabledAlgorithms/CPValidatorIntermediate.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/certpath/DisabledAlgorithms/CPValidatorTrustAnchor.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/provider/certpath/PKIXCertPathValidator/Validity.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/rsa/InvalidBitString.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/rsa/PrivateKeyEqualityTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/rsa/TestCACerts.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/rsa/TestKeyFactory.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/rsa/TestRSAOidSupport.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/rsa/WithoutNULL.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/rsa/pss/PSSKeyCompatibility.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/rsa/pss/PSSParametersTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/AppInputStream/ReadHandshake.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/CipherSuite/NoDesRC4DesEdeCiphSuite.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/CipherSuite/SSL_NULL.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/ClientHandshaker/RSAExport.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLContextImpl/BadKSProvider.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLContextImpl/BadTSProvider.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLContextImpl/DefaultCipherSuitePreference.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLContextImpl/DefaultDTLSEnabledProtocols.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLContextImpl/DefaultEnabledProtocols.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLContextImpl/NullGetAcceptedIssuers.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLContextImpl/SSLContextDefault.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLEngineImpl/SSLEngineDecodeBadPoint.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLSessionContextImpl/DefautlCacheSize.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLSessionContextImpl/Timeout.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLSocketImpl/AsyncSSLSocketClose.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLSocketImpl/CheckMethods.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLSocketImpl/ClientTimeout.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLSocketImpl/LargePacketAfterHandshakeTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLSocketImpl/LoopbackSSLSocket.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLSocketImpl/SSLSocketImplThrowsWrongExceptions.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/SSLSocketImpl/SetSoTimeout.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/ServerHandshaker/GetPeerHost.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/ServerHandshaker/HelloExtensionsTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/X509KeyManager/NullCases.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/X509KeyManager/PreferredKey.java": { + "status": "fail", + "detail": "Failed. Execution failed\\: `main' threw exception\\: java.lang.Exception\\: Failed to get the preferable key aliases" + }, + "sun/security/ssl/X509KeyManager/SelectOneKeyOutOfMany.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/X509TrustManagerImpl/CertRequestOverflow.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/X509TrustManagerImpl/CheckNullEntity.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/X509TrustManagerImpl/SunX509ExtendedTM.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/ssl/rsa/CheckProviderEntries.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/util/DerInputBuffer/B8336667/Reproducer.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/x509/AVA/EmptyValue.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/x509/DNSName/LeadingPeriod.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/x509/GeneralName/X400Address.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/x509/X509CRLImpl/Verify.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/x509/X509CertImpl/ECSigParamsVerifyWithCert.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/security/x509/X509CertImpl/Verify.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/text/resources/Collator/Bug4848897.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/text/resources/Format/Bug4685470.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/util/calendar/Bug6653944.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/util/resources/TimeZone/Bug4848242.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/util/resources/TimeZone/Bug4858517.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "sun/util/resources/cldr/Bug8134384.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "tools/jlink/CheckExecutable.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "tools/jlink/ReleaseImplementorTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "tools/launcher/DiacriticTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + }, + "tools/launcher/InstanceMainTest.java": { + "status": "pass", + "detail": "Passed. Execution successful" + } + } +} diff --git a/expectations/jdk-jtreg.toml b/expectations/jdk-jtreg.toml new file mode 100644 index 0000000..159b939 --- /dev/null +++ b/expectations/jdk-jtreg.toml @@ -0,0 +1,12 @@ +# Bali jdk-jtreg expectations. Keys are picomatch globs over test/jdk file paths +# such as java/lang/**. Same format and semantics as the Elide suites: +# [skip] mutes files (not scored), [fail] records known Bali-only failures. +# Failures observed by a `--ratchet` run are recorded automatically in +# jdk-jtreg.ratchet.toml; hand-curated entries with reasons belong here. +# +# Adapter gaps (unsupported jtreg directives) and reference-JDK problems are +# reported as skips by the adapter itself and need no entries. + +[skip] + +[fail] diff --git a/harness/src/adapters/index.ts b/harness/src/adapters/index.ts index 9ab292c..91c430d 100644 --- a/harness/src/adapters/index.ts +++ b/harness/src/adapters/index.ts @@ -1,6 +1,7 @@ import type { Adapter } from "./types"; import { cpythonCoreAdapter } from "./cpython-core"; import { javacJtregAdapter } from "./javac-jtreg"; +import { jdkJtregAdapter } from "./jdk-jtreg"; import { nodeApiAdapter } from "./node-api"; import { test262Adapter } from "./test262"; import { wptWintertcAdapter } from "./wpt-wintertc"; @@ -8,6 +9,7 @@ import { wptWintertcAdapter } from "./wpt-wintertc"; export const ADAPTERS: Record = { "cpython-core": cpythonCoreAdapter, "javac-jtreg": javacJtregAdapter, + "jdk-jtreg": jdkJtregAdapter, "node-api": nodeApiAdapter, test262: test262Adapter, "wpt-wintertc": wptWintertcAdapter, diff --git a/harness/src/adapters/javac-jtreg.ts b/harness/src/adapters/javac-jtreg.ts index 8b52711..10c12c7 100644 --- a/harness/src/adapters/javac-jtreg.ts +++ b/harness/src/adapters/javac-jtreg.ts @@ -1,17 +1,11 @@ -import { chmodSync, cpSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, statSync, symlinkSync, writeFileSync } from "node:fs"; +import { chmodSync, cpSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync, symlinkSync, writeFileSync } from "node:fs"; import { dirname, join, resolve } from "node:path"; import picomatch from "picomatch"; import type { Adapter, AdapterContext } from "./types"; import type { TestResult } from "../results/schema"; import { loadManifest } from "../manifest"; import { runProcess, type ProcessRunResult } from "./process"; - -const STATUS: Record = { - passed: "pass", - failed: "fail", - error: "error", - "not run": "skip", -}; +import { createJtregRunRoot, isJtregRunnerExit, jtregCommonArgs, jtregOutcome } from "./jtreg"; const JTREG_DEFAULT_ACTION_TIMEOUT_SECONDS = 120; @@ -207,8 +201,7 @@ export function buildWrapperJdk(wrapperJdk: string, realJdkHome: string, repoRoo } export async function createJtregRunLayout(ctx: AdapterContext, realJdkHome?: string): Promise { - mkdirSync(ctx.workspacePath, { recursive: true }); - const runRoot = mkdtempSync(join(ctx.workspacePath, "jtreg-run-")); + const runRoot = createJtregRunRoot(ctx.workspacePath); const workDir = join(runRoot, "JTwork"); const reportDir = join(runRoot, "JTreport"); const wrapperJdk = join(runRoot, "wrapper-jdk"); @@ -276,7 +269,7 @@ export function parseJtregSummary(text: string): TestResult[] { const path = statusFirst?.[2] ?? pathFirst?.[1]; const message = pathFirst?.[3]?.trim(); if (!statusName || !path) continue; - const status = message?.startsWith("Test ignored:") ? "skip" : STATUS[statusName.toLowerCase()]; + const status = message?.startsWith("Test ignored:") ? "skip" : jtregOutcome(statusName); if (!status) continue; results.push({ kind: "test", @@ -322,26 +315,21 @@ function runnerFailureResult(result: ProcessRunResult): TestResult { } function isJtregRunnerFailure(result: ProcessRunResult): boolean { - if (result.timedOut) return true; - // jtreg uses 1 for no tests, 2 for failed tests, and 3 for errored tests. - // When a parseable summary exists, those outcomes are carried per test. - return result.exitCode !== 0 && result.exitCode !== 1 && result.exitCode !== 2 && result.exitCode !== 3; + // When a parseable summary exists, jtreg's 1/2/3 exit codes are carried per test. + return result.timedOut || isJtregRunnerExit(result.exitCode); } function appendCapped(output: string, text: string, cap: number): string { return output.length < cap ? output + text.slice(0, cap - output.length) : output; } -function jtregTimeoutArgs(settings: Record): string[] { +function jtregTimeoutFactor(settings: Record): number | undefined { const caseTimeoutSeconds = Number(settings.jtregCaseTimeoutSeconds); if (Number.isFinite(caseTimeoutSeconds) && caseTimeoutSeconds > 0) { - return [`-timeoutFactor:${caseTimeoutSeconds / JTREG_DEFAULT_ACTION_TIMEOUT_SECONDS}`]; + return caseTimeoutSeconds / JTREG_DEFAULT_ACTION_TIMEOUT_SECONDS; } - const timeoutFactor = Number(settings.jtregTimeoutFactor ?? 1); - return Number.isFinite(timeoutFactor) && timeoutFactor > 0 - ? [`-timeoutFactor:${timeoutFactor}`] - : []; + return Number.isFinite(timeoutFactor) && timeoutFactor > 0 ? timeoutFactor : undefined; } async function* readStreamLines( @@ -402,13 +390,9 @@ export async function* runJavacJtreg(ctx: AdapterContext): AsyncIterable join(jtregLangtoolsRoot, test)), ]; const emitted = new Set(); diff --git a/harness/src/adapters/jdk-jtreg.test.ts b/harness/src/adapters/jdk-jtreg.test.ts new file mode 100644 index 0000000..2c88200 --- /dev/null +++ b/harness/src/adapters/jdk-jtreg.test.ts @@ -0,0 +1,429 @@ +import { expect, test } from "bun:test"; +import { chmod, mkdir, mkdtemp, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { + PROTOCOL, + REFERENCE_BASELINE, + ROOT, + baselineResults, + buildReferenceBaseline, + cleanEnv, + loadReferenceBaseline, + MEASUREMENT_ENVIRONMENT, + referenceComplete, + referenceFingerprint, + referenceInputs, + discover, + flatten, + jdkJtregAdapter, + hasTest, + incomplete, + markdown, + parseJtr, + portableReason, + propertiesReason, + runSuiteOnRuntime, + runtimeProgress, + summary, + unflatten, + type Entry, + type Manifest, + type Report, + type Result, + type Status, +} from "./jdk-jtreg"; +import { compare as compareExpectations } from "../expectations/compare"; +import { parseExpectations, type Expectations } from "../expectations/load"; +import { ratchetCandidates } from "../expectations/ratchet"; +import manifest from "../../../manifests/bali-jdk.json"; + +const none = (): Expectations => ({ entries: [], ratchet: new Set() }); +// The harness exits 2 for an incomplete run (the adapter throws), else 1 iff regressions. +const code = (r: Report) => + incomplete(r) ? 2 : compareExpectations(flatten(r), none()).regressions.length ? 1 : 0; + +const jtr = (status: string) => + `#Test Results (version 2)\n#-----testresult-----\nexecStatus=${status}\n#section:main\nexecStatus=Passed. Fake output\n`; +const report = (statuses: Status[]): Report => ({ + schema: 2, + suite: "fixture", + createdAt: "2026-09-07T00:00:00Z", + metadata: {}, + exitCodes: { + reference: 0, + bali: statuses.every((status) => status === "pass" || status === "unsupported") ? 0 : 2, + }, + tests: statuses.map((status, index) => ({ + id: `java/lang/${index}.java`, + area: "java/lang", + unsupported: status === "unsupported" ? "Unsupported @library directive" : null, + reference: { status: status === "unsupported" ? "unsupported" : "pass", detail: "reference" }, + bali: { status, detail: status }, + })), +}); +const main = "public static void main(String[] args) {}"; +const source = `/* @test\n * @run main/othervm Example\n */\n${main}`; + +test("jtr parsing uses the result header, never guest output or missing results", () => { + expect(parseJtr(jtr("Passed. Execution successful")).status).toBe("pass"); + expect(parseJtr(jtr("Passed. Skipped: Windows only")).status).toBe("skipped"); + expect(parseJtr(jtr("Failed. main threw exception")).status).toBe("fail"); + expect(parseJtr(jtr("Error. Cannot compile")).status).toBe("error"); + expect(parseJtr(jtr("Error. Program timed out")).status).toBe("timeout"); + expect(parseJtr(jtr("Not run. Filtered")).status).toBe("blocked"); + expect(parseJtr(undefined).status).toBe("blocked"); + expect(parseJtr("#section:main\nexecStatus=Passed. Fake output").status).toBe("blocked"); +}); + +test("discovery parses test descriptions without mistaking ordinary javadoc for jtreg tags", () => { + expect(hasTest(source)).toBe(true); + expect(hasTest("# @test\n# shell test")).toBe(true); + expect(hasTest("class Fixture {} ")).toBe(false); + expect( + portableReason("java/lang/Example.java", source + "\n/**\n * @throws Exception reason\n */"), + ).toBeNull(); + for (const tag of [ + "requires vm.gc.G1", + "library /test/lib", + "modules java.base/jdk.internal.misc", + "ignore broken", + "build Helper", + "run main -XX:+WhiteBoxAPI Example", + "run testng Example", + "test id=second", + ]) { + expect( + portableReason("java/lang/Example.java", `/* @test\n * @${tag}\n */\n${main}`), + ).not.toBeNull(); + } + expect(propertiesReason("# comment\nallowSmartActionArgs=true\n")).toBeNull(); + expect(propertiesReason("modules=java.desktop\n")).not.toBeNull(); + expect( + portableReason("java/lang/Example.java", `/* @test\n @library /test/lib\n */\n${main}`), + ).toBe("Unsupported @library directive"); + expect(hasTest(`/*\n @test\n */`)).toBe(true); + expect( + portableReason( + "java/lang/Example.java", + `/* @test\n * @run main Example\n * extraArgument\n */\n${main}`, + ), + ).not.toBeNull(); +}); + +test("inventory retains unsupported tests, excludes support files, and respects inherited settings", async () => { + const root = await mkdtemp(join(tmpdir(), "bali-compat-")); + try { + await mkdir(join(root, "java/lang/restricted"), { recursive: true }); + await Bun.write(join(root, "java/lang/Example.java"), source); + await Bun.write(join(root, "java/lang/Fixture.java"), "class Fixture {}"); + await Bun.write(join(root, "java/lang/Script.sh"), "# @test\n# @run shell Script.sh\n"); + await Bun.write(join(root, "java/lang/restricted/Example.java"), source); + await Bun.write(join(root, "java/lang/restricted/TEST.properties"), "modules=java.desktop\n"); + const rows = await discover(root); + expect(rows.length).toBe(3); + expect(rows[0]!.unsupported).toBeNull(); + expect(rows[1]!.unsupported).toBe("Non-Java test action"); + expect(rows[2]!.unsupported).toContain("TEST.properties"); + } finally { + await rm(root, { recursive: true, force: true }); + } +}); + +test("manifest declares a pinned inventory scope rather than a handpicked passing list", () => { + expect(manifest.scope).toBe("test/jdk"); + expect(manifest).not.toHaveProperty("tests"); + expect(manifest.source.revision).toMatch(/^[a-f0-9]{40}$/); + for (const pin of [manifest.source, manifest.jtreg]) expect(pin.sha256).toMatch(/^[a-f0-9]{64}$/); +}); + +test("only harness aborts or missing results are incomplete; failures are ordinary results", () => { + expect(code(report(["pass", "unsupported"]))).toBe(0); + expect(code(report(["fail"]))).toBe(1); + expect(code(report(["timeout"]))).toBe(1); + expect(code(report(["blocked"]))).toBe(2); + expect(code(report([]))).toBe(2); + const referenceIssue = report(["pass"]); + referenceIssue.tests[0]!.reference.status = "fail"; + referenceIssue.exitCodes.reference = 2; + // A reference problem is not a Bali regression: it is skipped, not scored. + expect(code(referenceIssue)).toBe(0); + expect(incomplete(referenceIssue)).toBe(false); + expect(summary(referenceIssue).verifiedPassing).toBe(0); + expect(summary(referenceIssue).referenceIssues).toBe(1); + const badHarness = report(["pass"]); + for (const exit of [1, 4, 5, 6]) { + badHarness.exitCodes.bali = exit; + expect(incomplete(badHarness)).toBe(true); + expect(code(badHarness)).toBe(2); + } + const testError = report(["error"]); + testError.exitCodes.bali = 3; + expect(code(testError)).toBe(1); +}); + +test("flattening keeps both-pass as pass, Bali-only failures as failures, and other outcomes as skips", () => { + const flat = flatten(report(["pass", "fail", "timeout", "skipped", "unsupported"])); + expect(flat.map((t) => t.status)).toEqual(["pass", "fail", "error", "fail", "skip"]); + expect(flat[1]!.meta).toMatchObject({ area: "java/lang", bali: { status: "fail" } }); + expect(flat[4]!.message).toBe("Unsupported @library directive"); + const referenceIssue = report(["pass"]); + referenceIssue.tests[0]!.reference.status = "fail"; + expect(flatten(referenceIssue)[0]).toMatchObject({ + status: "skip", + message: "Reference fail: reference", + }); + // Reclassifying a passing file as unsupported loses its pass rather than hiding it. + const reclassified = report(["pass"]); + reclassified.tests[0]!.unsupported = "Unsupported directive"; + expect(flatten(reclassified)[0]!.status).toBe("skip"); + expect(summary(reclassified).verifiedPassing).toBe(0); +}); + +test("expectations and ratchet apply to flattened results exactly like Elide suites", () => { + const tests = flatten(report(["pass", "fail", "error"])); + const exp = parseExpectations('[fail]\n"java/lang/1.java" = "known"\n'); + expect(compareExpectations(tests, exp).regressions.map((t) => t.id)).toEqual(["java/lang/2.java"]); + expect(ratchetCandidates(tests, exp)).toEqual(["java/lang/2.java"]); + exp.ratchet.add("java/lang/2.java"); + expect(compareExpectations(tests, exp).regressions).toEqual([]); + const fixed = compareExpectations(flatten(report(["pass", "pass", "pass"])), exp); + expect(fixed.newPasses.map((t) => t.id)).toEqual(["java/lang/1.java", "java/lang/2.java"]); + const muted = parseExpectations('[skip]\n"java/lang/**" = "muted"\n'); + expect(compareExpectations(tests, muted).counts).toMatchObject({ skip: 3, pass: 0 }); +}); + +test("summary exposes reference problems and adapter gaps in the fixed inventory", () => { + const data = report(["pass", "unsupported", "fail"]); + expect(summary(data)).toEqual({ + inventory: 3, + runnable: 2, + unsupported: 1, + verifiedPassing: 1, + baliFailures: 1, + referenceIssues: 0, + incomplete: false, + }); + expect(markdown(data)).toContain("3 test files inventoried"); + expect(markdown(data)).toContain("not Java SE certification"); +}); + +test("measurement environment ignores terminal locale and uses fixed settings", async () => { + const ambient = { + LANG: "cs_CZ.UTF-8", + LC_ALL: "", + LC_CTYPE: "UTF-8", + TZ: "Pacific/Honolulu", + PATH: "/usr/bin", + JAVA_TOOL_OPTIONS: "-Xmx1g", + }; + const env = cleanEnv("/jdk", ambient); + expect(env.LANG).toBe("C.UTF-8"); + expect(env.LC_ALL).toBe("C.UTF-8"); + expect(env.LC_CTYPE).toBe("C.UTF-8"); + expect(env.TZ).toBeUndefined(); + expect(env.JAVA_TOOL_OPTIONS).toBeUndefined(); + expect(env.JAVA_HOME).toBe("/jdk"); + expect(env.PATH).toBe("/jdk/bin:/usr/bin"); + expect(ambient.TZ).toBe("Pacific/Honolulu"); + expect(MEASUREMENT_ENVIRONMENT).toEqual({ + LANG: "C.UTF-8", + LC_ALL: "C.UTF-8", + LC_CTYPE: "C.UTF-8", + TZ: null, + }); +}); + +test("runtime progress counts only completed results, including timeouts and skips", async () => { + const work = await mkdtemp(join(tmpdir(), "bali-compat-progress-")); + try { + await Bun.write(join(work, "Pass.jtr"), jtr("Passed. Execution successful")); + await Bun.write(join(work, "Timeout.jtr"), jtr("Error. Program timed out")); + await Bun.write(join(work, "Skip.jtr"), jtr("Passed. Skipped: unsupported platform")); + await Bun.write(join(work, "Running.jtr"), "#Test Results (version 2)\n"); + expect( + await runtimeProgress(work, [ + "Pass.java", + "Timeout.java", + "Skip.java", + "Running.java", + "Missing.java", + ]), + ).toEqual({ completed: 3, passed: 1, failed: 1, skipped: 1 }); + } finally { + await rm(work, { recursive: true, force: true }); + } +}); + +test("native adapter invokes jtreg with selected runtime and stock compiler and reads fresh results", async () => { + const root = await mkdtemp(join(tmpdir(), "bali-native-adapter-")); + try { + const ref = join(root, "reference-jdk"); + await mkdir(join(ref, "bin"), { recursive: true }); + const java = join(ref, "bin/java"); + await Bun.write( + java, + `#!/bin/sh +exec '${process.execPath.replaceAll("'", "'\\''")}' '${join(root, "fake-jtreg.ts")}' "$@" +`, + ); + await chmod(java, 0o755); + await Bun.write( + join(root, "fake-jtreg.ts"), + ` +const args = process.argv.slice(2); +const work = args.find(a => a.startsWith("-w:"))!.slice(3); +await Bun.write(work + "/Example.jtr", "#-----testresult-----\\nexecStatus=Passed. Execution successful\\n#section:main\\n"); +console.log("fixture jtreg started"); +console.error("fixture jtreg diagnostic"); +while (!(await Bun.file(${JSON.stringify(join(root, "release"))}).exists())) await Bun.sleep(10); +console.log("fixture jtreg completed"); +`, + ); + const home = join(root, "bali-jdk"); + const output = join(root, "bali"); + const running = runSuiteOnRuntime( + output, + join(root, "suite"), + "/fixture/jtreg.jar", + ref, + home, + [{ id: "Example.java", area: "fixture", unsupported: null }], + manifest.execution, + ); + try { + const deadline = Date.now() + 3000; + let live = ""; + while (Date.now() < deadline) { + const file = Bun.file(join(output, "harness.log")); + if (await file.exists()) live = await file.text(); + if (live.includes("fixture jtreg diagnostic")) break; + await Bun.sleep(10); + } + expect(live).toContain("fixture jtreg started"); + expect(live).toContain("fixture jtreg diagnostic"); + expect(live).not.toContain("fixture jtreg completed"); + } finally { + await Bun.write(join(root, "release"), "release"); + await running; + } + const result = await running; + expect(result.exitCode).toBe(0); + expect(result.results.get("Example.java")?.status).toBe("pass"); + const args = await Bun.file(join(output, "command.json")).json(); + expect(args).toContain("-testjdk:" + home); + expect(args).toContain("-compilejdk:" + ref); + expect(args).toContain("-javaoption:-Xmx2g"); + expect(await Bun.file(join(output, "harness.log")).text()).toContain("fixture jtreg completed"); + } finally { + await rm(root, { recursive: true, force: true }); + } +}); + +test("flattened results rebuild the paired report for the differential files", async () => { + const original = report(["pass", "fail", "timeout", "unsupported"]); + const rows = unflatten(flatten(original)); + expect(rows).toEqual(original.tests); + const files = await jdkJtregAdapter.reports!({} as never, flatten(original)); + expect(Object.keys(files).sort()).toEqual(["coverage.svg", "differential.md"]); + expect(files["differential.md"]).toContain("4 test files inventoried"); + expect(files["differential.md"]).toContain("results.json.gz"); + expect(files["coverage.svg"]).toContain("3/4 runnable; 1 verified passes"); +}); + +const referenceInventory: Entry[] = [ + { id: "java/lang/A.java", area: "java/lang", unsupported: null }, + { id: "java/lang/B.java", area: "java/lang", unsupported: "Unsupported @library directive" }, +]; +const inputsFor = (inventory: Entry[] = referenceInventory, referenceVersion = 'openjdk version "25.0.2"') => + referenceInputs({ manifest: manifest as Manifest, root: ROOT, referenceVersion, inventory, platform: "linux-x64" }); + +test("reference fingerprint covers exactly the inputs that determine stock-JDK outcomes", () => { + const fingerprint = referenceFingerprint(inputsFor()); + expect(referenceFingerprint(inputsFor())).toBe(fingerprint); + expect(inputsFor().protocol).toBe(PROTOCOL); + // Only the runnable set matters, not how an unsupported file is described. + const reworded = referenceInventory.map((test) => + test.unsupported ? { ...test, unsupported: "Unsupported @modules directive" } : test, + ); + expect(referenceFingerprint(inputsFor(reworded))).toBe(fingerprint); + const grown = [...referenceInventory, { id: "java/lang/C.java", area: "java/lang", unsupported: null }]; + expect(referenceFingerprint(inputsFor(grown))).not.toBe(fingerprint); + expect(referenceFingerprint(inputsFor(referenceInventory, 'openjdk version "25.0.3"'))).not.toBe(fingerprint); + const base = inputsFor(); + const variants = [ + { ...base, protocol: base.protocol + 1 }, + { ...base, source: "0".repeat(64) }, + { ...base, jtreg: "0".repeat(64) }, + { ...base, execution: { ...base.execution, concurrency: base.execution.concurrency + 1 } }, + { ...base, root: base.root + "extra=1\n" }, + { ...base, heap: "-Xmx1g" }, + { ...base, platform: "darwin-arm64" }, + ]; + for (const variant of variants) expect(referenceFingerprint(variant)).not.toBe(fingerprint); +}); + +test("a matching committed baseline replaces the stock-JDK run; missing, stale, or malformed ones do not", async () => { + const root = await mkdtemp(join(tmpdir(), "bali-reference-baseline-")); + try { + const pass: Result = { status: "pass", detail: "Passed. Execution successful" }; + const run = { + exitCode: 2, + results: new Map([ + ["java/lang/A.java", pass], + ["java/lang/B.java", { status: "unsupported", detail: "Unsupported @library directive" }], + ]), + }; + expect(referenceComplete(run, referenceInventory)).toBe(true); + expect(referenceComplete({ ...run, exitCode: 4 }, referenceInventory)).toBe(false); + expect( + referenceComplete( + { exitCode: 0, results: new Map([["java/lang/A.java", { status: "blocked", detail: "" }]]) }, + referenceInventory, + ), + ).toBe(false); + expect(referenceComplete({ exitCode: 0, results: new Map() }, referenceInventory)).toBe(false); + + const inputs = inputsFor(); + const baseline = buildReferenceBaseline(inputs, run, referenceInventory, "2026-09-10T09:23:55.252Z"); + expect(baseline.fingerprint).toBe(referenceFingerprint(inputs)); + expect(Object.keys(baseline.results)).toEqual(["java/lang/A.java"]); + + const path = join(root, REFERENCE_BASELINE); + expect(await loadReferenceBaseline(path, baseline.fingerprint)).toMatchObject({ + reason: expect.stringContaining("no reference baseline"), + }); + await Bun.write(path, JSON.stringify(baseline)); + const loaded = await loadReferenceBaseline(path, baseline.fingerprint); + if (!("baseline" in loaded)) throw new Error(loaded.reason); + const restored = baselineResults(loaded.baseline, referenceInventory); + expect(restored.exitCode).toBe(2); + expect(restored.results.get("java/lang/A.java")).toEqual(pass); + expect(restored.results.get("java/lang/B.java")?.status).toBe("unsupported"); + // A newly runnable file has no baseline entry: blocked, so the run is incomplete, never a pass. + const grown = [...referenceInventory, { id: "java/lang/C.java", area: "java/lang", unsupported: null }]; + expect(baselineResults(loaded.baseline, grown).results.get("java/lang/C.java")?.status).toBe("blocked"); + + expect(await loadReferenceBaseline(path, "f".repeat(64))).toMatchObject({ + reason: expect.stringContaining("stale"), + }); + await Bun.write(path, JSON.stringify({ schema: 1, fingerprint: baseline.fingerprint })); + expect(await loadReferenceBaseline(path, baseline.fingerprint)).toMatchObject({ + reason: expect.stringContaining("malformed"), + }); + await Bun.write(path, "{not json"); + expect(await loadReferenceBaseline(path, baseline.fingerprint)).toMatchObject({ + reason: expect.stringContaining("unreadable"), + }); + } finally { + await rm(root, { recursive: true, force: true }); + } +}); + +test("reports state whether the reference came from the baseline or from this run", () => { + const fromBaseline = { ...report(["pass"]), metadata: { reference: { source: "baseline", generatedAt: "2026-09-10T09:23:55.252Z" } } }; + expect(markdown(fromBaseline)).toContain("committed baseline generated 2026-09-10T09:23:55.252Z"); + const fromRun = { ...report(["pass"]), metadata: { reference: { source: "run" } } }; + expect(markdown(fromRun)).toContain("measured by running the stock JDK"); + expect(markdown(report(["pass"]))).not.toContain("Reference outcomes"); +}); diff --git a/harness/src/adapters/jdk-jtreg.ts b/harness/src/adapters/jdk-jtreg.ts new file mode 100644 index 0000000..bf5c498 --- /dev/null +++ b/harness/src/adapters/jdk-jtreg.ts @@ -0,0 +1,804 @@ +/** + * RFC-0016: discover the pinned OpenJDK test/jdk inventory and measure runtime support. + * + * The original TEST.ROOT probes HotSpot WhiteBox/diagnostic flags even for + * portable cases. Both runtimes use the same portable root; unsupported test + * directives remain visible as adapter gaps instead of disappearing from the inventory. + * All sibling fixtures are preserved. Stock javac compiles both runtime selections. + * + * The reference outcome is a function of the pins alone (corpus, jtreg, reference JDK, + * portable root, execution options, adapter protocol, runnable inventory), so it is kept + * as a committed, fingerprinted baseline in expectations/ and the stock JDK is only run + * when no matching baseline exists. `--ratchet` records a fresh reference run as the + * baseline, like it records the ratchet. + * Archives are verified on every use and each run gets fresh work directories. + * Reports distinguish verified passes, Bali gaps, reference issues, and unsupported + * files. Paired outcomes are flattened into Elide's single-status model, so the shared + * expectations, ratchet, and report code protect previous passes without requiring all + * known gaps to be fixed first. + * Local binaries are identified by digest, never attributed to the current + * source commit. No network or process work happens when imported by tests. + */ +import { $ } from "bun"; +import { createHash } from "node:crypto"; +import { closeSync, createReadStream, openSync } from "node:fs"; +import { mkdir, realpath, rename, rm } from "node:fs/promises"; +import { arch, release } from "node:os"; +import { basename, dirname, join, resolve } from "node:path"; +import type { Adapter, AdapterContext } from "./types"; +import { createJtregRunRoot, isJtregTimeout, jtregCommonArgs } from "./jtreg"; +import type { Result as HarnessResult, TestResult } from "../results/schema"; +export const REPO = resolve(import.meta.dir, "../../.."); +const HEAP_CAP = "-Xmx2g"; + +// Bump the protocol only when result meaning changes, not on ordinary refactors. +export const PROTOCOL = 2; +export const ROOT = "requiredVersion=7.5.1+1\nuseNewOptions=true\nuseNewPatchModule=true\n"; +/** manifests/bali-jdk.json: pinned corpus, jtreg build, and fixed execution options. */ +export type Manifest = { + id: string; + scope: string; + source: { url: string; sha256: string; revision: string }; + jtreg: { url: string; sha256: string }; + execution: { concurrency: number; timeoutFactor: number; headless: boolean }; +}; +const ARTIFACTS = ["bin/java", "bin/bali", "lib/modules", "release"]; +export type Status = "pass" | "fail" | "error" | "timeout" | "blocked" | "unsupported" | "skipped"; +export type Result = { status: Status; detail: string }; +export type Entry = { id: string; area: string; unsupported: string | null }; +export type Row = Entry & { reference: Result; bali: Result }; +export type Report = { + schema: 2; + suite: string; + createdAt: string; + metadata: Record; + exitCodes: { reference: number; bali: number }; + tests: Row[]; +}; +const CACHE = resolve(process.env.BALI_JTREG_CACHE ?? join(REPO, ".harness/bali/archives")); + +const digest = (value: string) => createHash("sha256").update(value).digest("hex"); +async function fileDigest(path: string): Promise { + const hash = createHash("sha256"); + for await (const chunk of createReadStream(path)) hash.update(chunk); + return hash.digest("hex"); +} + +/** Missing/malformed results never become passes; only the result header counts. */ +export function parseJtr(text: string | undefined): Result { + if (text === undefined) return { status: "blocked", detail: "No jtreg result; see harness.log" }; + const header = text.split("#-----testresult-----\n")[1]?.split("\n#section:")[0]; + const detail = header?.match(/^execStatus=(.*)$/m)?.[1]; + if (!detail) return { status: "blocked", detail: "Missing execStatus in jtreg result" }; + if (detail.startsWith("Passed. Skipped")) return { status: "skipped", detail }; + if (detail.startsWith("Passed.")) return { status: "pass", detail }; + if (/^Failed\.|^Error\./.test(detail) && isJtregTimeout(detail)) + return { status: "timeout", detail }; + if (detail.startsWith("Failed.")) return { status: "fail", detail }; + if (detail.startsWith("Error.")) return { status: "error", detail }; + return { status: "blocked", detail }; +} + +/** Test-bearing files are counted once; multiple @test variants remain visible but unsupported. */ +export function hasTest(source: string): boolean { + return /(?:\/\*|^[ \t]*(?:\*|#)?|