umask-parallel
Squashed from umask-parallel into main.
72 files changed,
+126
−10
internal/activator/activator_test.go+7 −10internal/activator/claimrecord_linux_test.go+3 −0internal/activator/cmdunit_test.go+1 −0internal/activator/exec_gate_test.go+1 −0internal/activator/generations_backend_test.go+1 −0internal/activator/gensocket_rev19_test.go+2 −0internal/activator/identity_test.go+3 −0internal/activator/loglistener_test.go+1 −0internal/activator/plan14_generation_backend_test.go+1 −0internal/activator/swap_executed_test.go+2 −0internal/activator/unitproc_gen_test.go+1 −0internal/activator/unitproc_test.go+5 −0internal/activator/wakecheck_claim_linux_test.go+1 −0internal/activator/wakeplan_test.go+1 −0internal/activator/wakerecord_refused_test.go+1 −0internal/host/agent_layout_test.go+2 −0internal/host/agent_test.go+4 −0internal/host/claimhandover_recovery_test.go+1 −0internal/host/claimparticipation_stale_test.go+1 −0internal/host/claimretirerecovery_test.go+1 −0internal/host/claimservingparksource_linux_test.go+1 −0internal/host/converge_adopted_test.go+1 −0internal/host/edgesclaims_test.go+2 −0internal/host/guardtransaction_test.go+1 −0internal/host/installchannel_identity_test.go+1 −0internal/host/installchannel_policy_test.go+1 −0internal/host/instancekeys_test.go+1 −0internal/host/movescut_test.go+1 −0internal/host/movescutguard_test.go+1 −0internal/host/movesenvskew_test.go+1 −0internal/host/movesfilescap_test.go+1 −0internal/host/movesfinal_test.go+1 −0internal/host/movesland_finalfix_test.go+1 −0internal/host/movesland_test.go+1 −0internal/host/movesphase1_test.go+1 −0internal/host/movesprobe_test.go+2 −0internal/host/movesreport_test.go+2 −0internal/host/movesrevert_test.go+3 −0internal/host/plan10_j2_adapter_test.go+4 −0internal/host/plan10_j2_test.go+1 −0internal/host/plan11_release_test.go+1 −0internal/host/plan12_census_test.go+1 −0internal/host/plan12_fix1_test.go+1 −0internal/host/plan12_handover_test.go+1 −0internal/host/plan12_restore_linux_test.go+1 −0internal/host/plan14_create_participation_test.go+1 −0internal/host/plan14_delete_participation_test.go+1 −0internal/host/plan14_fix2_inventory_test.go+1 −0internal/host/plan14_fix4_live_linux_test.go+1 −0internal/host/plan14_incident_recipe_test.go+1 −0internal/host/plan14_launch_verifier_test.go+1 −0internal/host/plan14_recovery_without_health_test.go+1 −0internal/host/plan14_restart_consumption_test.go+2 −0internal/host/plan9_a_guard_test.go+1 −0internal/host/plan9_d2_test.go+1 −0internal/host/plan9_fix1_stop_test.go+1 −0internal/host/plan9fix1_journal_linux_test.go+2 −0internal/host/plan9fix2_inventory_linux_test.go+1 −0internal/host/proofask_test.go+9 −0internal/host/proofbinding_test.go+3 −0internal/host/proofroot_test.go+3 −0internal/host/relocatepass_round1_test.go+1 −0internal/host/relocationfinish_unix_test.go+1 −0internal/host/relocationfirstwake_unix_test.go+1 −0internal/host/relocationlanding_test.go+1 −0internal/host/relocationreleasehold_test.go+1 −0internal/host/rootexecution_migration_test.go+3 −0internal/host/runexec_linux_test.go+2 −0internal/host/schedule_rearm_wake_test.go+1 −0internal/host/schedule_wake_test.go+4 −0internal/host/systemapply_test.go+6 −0internal/host/systemparticipation_test.go+2 −0
CI passed — run details
CI log
=== gate ===
.amadan/test-gate.sh
=== launchctx (0 s)
ok amadan.net/carlos/platform.git/launchctx 0.012s
? amadan.net/carlos/platform.git/launchctx/controlname [no test files]
? amadan.net/carlos/platform.git/launchctx/wireid [no test files]
=== vet (17 s)
=== gofmt (0 s)
gofmt -l .: clean
=== rest (164 s)
? github.com/carlosframework/platform/cmd/changelog [no test files]
ok github.com/carlosframework/platform/cmd/console 3.811s
ok github.com/carlosframework/platform/cmd/moveprobe 11.880s
ok github.com/carlosframework/platform/cmd/zddprobe 0.798s
ok github.com/carlosframework/platform/internal/activator 60.025s
ok github.com/carlosframework/platform/internal/agentsock 0.041s
ok github.com/carlosframework/platform/internal/alerting 0.007s
ok github.com/carlosframework/platform/internal/analytics 0.030s
ok github.com/carlosframework/platform/internal/appconfig 3.015s
ok github.com/carlosframework/platform/internal/apperr 0.136s
ok github.com/carlosframework/platform/internal/applog 0.299s
ok github.com/carlosframework/platform/internal/awsinv 0.006s
ok github.com/carlosframework/platform/internal/boxchoice 0.012s
ok github.com/carlosframework/platform/internal/boxid 0.883s
? github.com/carlosframework/platform/internal/boxid/boxidtest [no test files]
? github.com/carlosframework/platform/internal/boxid/internal/signtest [no test files]
ok github.com/carlosframework/platform/internal/boxvolumes 0.017s
ok github.com/carlosframework/platform/internal/caps 0.017s
ok github.com/carlosframework/platform/internal/certwarm 0.009s
ok github.com/carlosframework/platform/internal/cgroup 0.785s
ok github.com/carlosframework/platform/internal/changelog 0.551s
ok github.com/carlosframework/platform/internal/claimactivation 1.318s
ok github.com/carlosframework/platform/internal/clamd 0.060s
? github.com/carlosframework/platform/internal/cliflag [no test files]
? github.com/carlosframework/platform/internal/controlname [no test files]
? github.com/carlosframework/platform/internal/controlsock [no test files]
ok github.com/carlosframework/platform/internal/dbdoor 5.778s
ok github.com/carlosframework/platform/internal/dbdoor/dbdoortest 0.016s
ok github.com/carlosframework/platform/internal/dbverify 0.012s
ok github.com/carlosframework/platform/internal/dnsrec 0.010s
ok github.com/carlosframework/platform/internal/docsite 0.015s
ok github.com/carlosframework/platform/internal/domains 2.945s
ok github.com/carlosframework/platform/internal/doorkey 0.012s
ok github.com/carlosframework/platform/internal/economics 0.015s
ok github.com/carlosframework/platform/internal/edge 45.369s
? github.com/carlosframework/platform/internal/edgeproof [no test files]
ok github.com/carlosframework/platform/internal/edgesfile 0.008s
ok github.com/carlosframework/platform/internal/fleetapi 0.133s
ok github.com/carlosframework/platform/internal/gate 1.655s
ok github.com/carlosframework/platform/internal/genselect 0.015s
ok github.com/carlosframework/platform/internal/geo 0.019s
ok github.com/carlosframework/platform/internal/geoip 0.030s
ok github.com/carlosframework/platform/internal/historyreadback 0.156s
ok github.com/carlosframework/platform/internal/host 136.066s
ok github.com/carlosframework/platform/internal/hostactors 5.996s
ok github.com/carlosframework/platform/internal/hostactors/awsmembership 0.007s
ok github.com/carlosframework/platform/internal/hostbox 2.949s
ok github.com/carlosframework/platform/internal/hostclaim 0.819s
ok github.com/carlosframework/platform/internal/hostenv 0.007s
ok github.com/carlosframework/platform/internal/hostevidence 0.006s
ok github.com/carlosframework/platform/internal/hostexec 5.196s
ok github.com/carlosframework/platform/internal/hostfence 0.041s
ok github.com/carlosframework/platform/internal/hostfiles 10.360s
ok github.com/carlosframework/platform/internal/hostfloor 0.021s
ok github.com/carlosframework/platform/internal/hostguard 1.068s
ok github.com/carlosframework/platform/internal/hostops 1.939s
? github.com/carlosframework/platform/internal/hostops/fencerelease [no test files]
ok github.com/carlosframework/platform/internal/hostops/internal/fencerelease 0.006s
ok github.com/carlosframework/platform/internal/hostquarantine 0.002s
ok github.com/carlosframework/platform/internal/hostrelocate 0.708s
ok github.com/carlosframework/platform/internal/hostresolve 0.189s
ok github.com/carlosframework/platform/internal/hostwrite 0.009s
ok github.com/carlosframework/platform/internal/infraview 0.002s
ok github.com/carlosframework/platform/internal/instancectl 5.233s
ok github.com/carlosframework/platform/internal/instanceexec 2.808s
ok github.com/carlosframework/platform/internal/instancefs 0.005s
ok github.com/carlosframework/platform/internal/instancekey 0.008s
ok github.com/carlosframework/platform/internal/instanceupdates 0.009s
ok github.com/carlosframework/platform/internal/layout 1.782s
ok github.com/carlosframework/platform/internal/lbhealth 0.003s
ok github.com/carlosframework/platform/internal/lease 10.274s
ok github.com/carlosframework/platform/internal/lease/leasetest 0.592s
ok github.com/carlosframework/platform/internal/ledger 0.027s
ok github.com/carlosframework/platform/internal/mail 0.237s
ok github.com/carlosframework/platform/internal/maintenance 0.113s
ok github.com/carlosframework/platform/internal/maintenanceexec 5.554s
ok github.com/carlosframework/platform/internal/maintenanceguard 0.146s
ok github.com/carlosframework/platform/internal/metrics 0.006s
ok github.com/carlosframework/platform/internal/moves 22.381s
ok github.com/carlosframework/platform/internal/moves/archive 0.991s
ok github.com/carlosframework/platform/internal/objstore 0.260s
ok github.com/carlosframework/platform/internal/ops 0.296s
ok github.com/carlosframework/platform/internal/park 0.301s
ok github.com/carlosframework/platform/internal/plans 0.012s
ok github.com/carlosframework/platform/internal/privatefile 0.004s
ok github.com/carlosframework/platform/internal/provision 22.584s
ok github.com/carlosframework/platform/internal/publicrelease 0.010s
? github.com/carlosframework/platform/internal/regionname [no test files]
ok github.com/carlosframework/platform/internal/registry 5.649s
ok github.com/carlosframework/platform/internal/relay 7.241s
ok github.com/carlosframework/platform/internal/release 26.789s
ok github.com/carlosframework/platform/internal/rollout 3.778s
ok github.com/carlosframework/platform/internal/rolloutwords 0.004s
ok github.com/carlosframework/platform/internal/rootaws 0.009s
ok github.com/carlosframework/platform/internal/rootparticipation 0.065s
ok github.com/carlosframework/platform/internal/rootstate 0.027s
ok github.com/carlosframework/platform/internal/runs 0.596s
ok github.com/carlosframework/platform/internal/s3compat 0.006s
ok github.com/carlosframework/platform/internal/safefile 0.007s
ok github.com/carlosframework/platform/internal/schedule 2.700s
ok github.com/carlosframework/platform/internal/seeds 0.012s
ok github.com/carlosframework/platform/internal/sim/hostlife 11.634s
ok github.com/carlosframework/platform/internal/sim/litestreamfacts 3.396s
ok github.com/carlosframework/platform/internal/status 0.080s
ok github.com/carlosframework/platform/internal/steering 0.010s
ok github.com/carlosframework/platform/internal/stopevidence 0.301s
ok github.com/carlosframework/platform/internal/svcrole 0.003s
ok github.com/carlosframework/platform/internal/telemetry 0.007s
ok github.com/carlosframework/platform/internal/termfence 0.005s
ok github.com/carlosframework/platform/internal/tunnelclient 0.005s
ok github.com/carlosframework/platform/internal/unixdial 0.002s
ok github.com/carlosframework/platform/internal/updatewords 0.007s
ok github.com/carlosframework/platform/internal/usage 0.008s
ok github.com/carlosframework/platform/internal/version 0.002s
ok github.com/carlosframework/platform/internal/vet 1.688s
=== internal_console@0 (82 s)
ok github.com/carlosframework/platform/internal/console 80.709s
=== internal_console@1 (36 s)
ok github.com/carlosframework/platform/internal/console 35.170s
=== internal_console@2 (43 s)
ok github.com/carlosframework/platform/internal/console 41.698s
=== internal_console@3 (37 s)
ok github.com/carlosframework/platform/internal/console 35.423s
=== internal_console@4 (36 s)
ok github.com/carlosframework/platform/internal/console 35.033s
=== internal_console@5 (35 s)
ok github.com/carlosframework/platform/internal/console 33.522s
=== internal_console@6 (38 s)
ok github.com/carlosframework/platform/internal/console 36.738s
=== internal_console@7 (43 s)
ok github.com/carlosframework/platform/internal/console 41.399s
=== root@0 (33 s)
ok github.com/carlosframework/platform 31.863s
=== root@1 (44 s)
ok github.com/carlosframework/platform 42.677s
=== root@2 (41 s)
ok github.com/carlosframework/platform 40.071s
=== cross ===
--- shard 0 of 5 ---
cross-compiling darwin/arm64
--- shard 1 of 5 ---
cross-compiling darwin/amd64
--- shard 2 of 5 ---
cross-compiling linux/arm64
linux/arm64 carlos binary: 50069666 bytes (ceiling 52000000)
--- shard 3 of 5 ---
cross-compiling windows/amd64
--- shard 4 of 5 ---
cross-compiling windows/arm64
=== minio-contract ===
minio contract: arm64, minio RELEASE.2025-09-07T16-13-09Z, mc RELEASE.2025-08-13T08-35-41Z
minio: downloading https://github.com/minio/minio/releases/download/RELEASE.2025-09-07T16-13-09Z/minio.linux-arm64.RELEASE.2025-09-07T16-13-09Z
minio: downloaded, digest verified
mc: downloading https://github.com/minio/mc/releases/download/RELEASE.2025-08-13T08-35-41Z/mc.linux-arm64.RELEASE.2025-08-13T08-35-41Z
mc: downloaded, digest verified
minio healthy on 127.0.0.1:20999
Added `local` successfully.
Bucket created successfully `local/contract-bucket`.
Bucket created successfully `local/denied-bucket`.
Created policy `contract-only` successfully.
Added user `scopeduser` successfully.
Attached Policies: [contract-only]
To User: scopeduser
buckets and scoped user ready
=== RUN TestDeliveredContractMinio
=== RUN TestDeliveredContractMinio/put
=== RUN TestDeliveredContractMinio/get_round-trips_the_body
=== RUN TestDeliveredContractMinio/list_shows_the_key
=== RUN TestDeliveredContractMinio/head_and_list_agree_on_the_version
=== RUN TestDeliveredContractMinio/the_app_cannot_tag_its_own_object
=== RUN TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/not_by_PutObjectTagging
=== RUN TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/and_not_by_x-amz-tagging_on_upload
=== RUN TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route
=== RUN TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CreateMultipartUpload
=== RUN TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CopyObject_with_a_REPLACE_tagging_directive
=== RUN TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/but_multipart_itself_is_allowed
=== RUN TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_copy_itself_is_allowed
=== RUN TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/a_POST-policy_forged_tag_with_a_matching_version_is_still_not_a_verdict
=== RUN TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_an_ordinary_tagged-with-something-else_upload_is_allowed
=== RUN TestDeliveredContractMinio/delete_removes_it
=== RUN TestDeliveredContractMinio/cross-bucket_denial
--- PASS: TestDeliveredContractMinio (0.02s)
--- PASS: TestDeliveredContractMinio/put (0.00s)
--- PASS: TestDeliveredContractMinio/get_round-trips_the_body (0.00s)
--- PASS: TestDeliveredContractMinio/list_shows_the_key (0.00s)
--- PASS: TestDeliveredContractMinio/head_and_list_agree_on_the_version (0.00s)
--- PASS: TestDeliveredContractMinio/the_app_cannot_tag_its_own_object (0.00s)
--- PASS: TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/not_by_PutObjectTagging (0.00s)
--- PASS: TestDeliveredContractMinio/the_app_cannot_tag_its_own_object/and_not_by_x-amz-tagging_on_upload (0.00s)
--- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route (0.01s)
--- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CreateMultipartUpload (0.00s)
--- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/not_by_CopyObject_with_a_REPLACE_tagging_directive (0.00s)
--- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/but_multipart_itself_is_allowed (0.00s)
--- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_copy_itself_is_allowed (0.00s)
--- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/a_POST-policy_forged_tag_with_a_matching_version_is_still_not_a_verdict (0.00s)
--- PASS: TestDeliveredContractMinio/the_app_cannot_tag_by_any_other_route/and_an_ordinary_tagged-with-something-else_upload_is_allowed (0.00s)
--- PASS: TestDeliveredContractMinio/delete_removes_it (0.00s)
--- PASS: TestDeliveredContractMinio/cross-bucket_denial (0.00s)
PASS
ok github.com/carlosframework/platform/internal/objstore 0.024s
=== RUN TestT4StorageProbeMinio
2026/10/21 21:54:55 moves: T4: STORE: list: operation error S3: ListObjectsV2, https response error StatusCode: 403, RequestID: 18E0AA1D84630C4D, HostID: 7c420053e0fbcd7f41653fdd92ffa2802c903d05303b1aa15adc2e8bb65d183f, api error SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.
--- PASS: TestT4StorageProbeMinio (0.01s)
PASS
ok github.com/carlosframework/platform/internal/host 0.024s
minio contract: PASS
diff --git a/internal/activator/activator_test.go b/internal/activator/activator_test.go| index 84c04e9df..b8c04587f 100644 |
| --- a/internal/activator/activator_test.go |
| +++ b/internal/activator/activator_test.go |
| @@ -6110,16 +6110,11 @@ func TestMain(m *testing.M) { |
| // write package state (a shrunk timeout, a hook, the generations switch, |
| // the log's output), set the environment or the working directory, depend |
| // on time it measures itself (time.Since), or use the /proc child waits in |
| -// childwait_test.go, which count every child of this binary. Nor may it |
| -// bind a socket through edge.SecureUnixListen (a control, log or cmd-stream |
| -// listener: every ExecBackend spawn and nested start binds one), which sets |
| -// the process's umask to 0177 around the bind, so a directory a parallel |
| -// test made in that window comes out 0600 and unusable. A test that does |
| -// any of these stays sequential. The tests marked parallel were checked |
| -// for all of it, through every test helper they call, and run once each |
| -// to see that none reaches SecureUnixListen; a test that later starts |
| -// shrinking a package var or spawning through the backend must drop its |
| -// t.Parallel(). |
| +// childwait_test.go, which count every child of this binary. A test that |
| +// does any of these stays sequential. The tests marked parallel were |
| +// checked for all of it, through every test helper they call; a test that |
| +// later starts shrinking a package var or setting the environment must |
| +// drop its t.Parallel(). |
| // fakeAppMain is the app half: bind the --socket, tighten it to 0600 — the |
| // exact titogo habit that stranded the sibling router in issue #103 — and |
| @@ -6236,6 +6231,7 @@ func TestExecBackendFailedWakeDoesNotNormalizeSocketMode(t *testing.T) { |
| // socket. The squatter here holds its 200 until the child has verifiably |
| // exited, making the race the guard closes deterministic. |
| func TestExecBackendDoesNotNormalizeSquatterSocket(t *testing.T) { |
| + t.Parallel() |
| requireUnixSockets(t) |
| b := testExecBackend(t) |
| host := "squatted.example.com" |
| @@ -6313,6 +6309,7 @@ func TestExecBackendDoesNotNormalizeSquatterSocket(t *testing.T) { |
| // "child exited". It also pins the other half — that the listener is still |
| // closed, on this path, once the child is gone. |
| func TestChildProcStopKeepsTheControlSocketUpUntilTheChildExits(t *testing.T) { |
| + t.Parallel() |
| requireUnixSockets(t) |
| dir := t.TempDir() |
| ready := filepath.Join(dir, "ready") // the child's SIGTERM trap is installed |
diff --git a/internal/activator/claimrecord_linux_test.go b/internal/activator/claimrecord_linux_test.go| index 7c56af25a..97d9be459 100644 |
| --- a/internal/activator/claimrecord_linux_test.go |
| +++ b/internal/activator/claimrecord_linux_test.go |
| @@ -130,6 +130,7 @@ func (c *claimedRecord) start(t *testing.T, e *actEntry, maxStarts int) error { |
| // claim actor's bucket, before each exec. A start that failed for any other |
| // reason is retried, and the retry is a new exec: it records again. |
| func TestAClaimedStartRecordsBeforeEachExec(t *testing.T) { |
| + t.Parallel() |
| c := newClaimedRecord(t, nil) |
| launches := 0 |
| granted := launchedChild(t) |
| @@ -279,6 +280,7 @@ func TestAClaimedProbeRecords(t *testing.T) { |
| // claim's Holder.Location (internal/host buildStates.locate, ruling |
| // R-CLAIMPREFIX-2), which is the claimed lease's. |
| func TestAClaimedSidecarRestartRecordsTheBuildItsPrimaryRan(t *testing.T) { |
| + t.Parallel() |
| claimedSidecarRestart(t, false) |
| } |
| @@ -288,6 +290,7 @@ func TestAClaimedSidecarRestartRecordsTheBuildItsPrimaryRan(t *testing.T) { |
| // pin's demand. Prepare's start was checked against the pin (s.Version is |
| // Pin.Build), and s.Staged is what actually ran. |
| func TestAPinnedClaimedSidecarRestartRunsTheClaimedFile(t *testing.T) { |
| + t.Parallel() |
| claimedSidecarRestart(t, true) |
| } |
diff --git a/internal/activator/cmdunit_test.go b/internal/activator/cmdunit_test.go| index 2f87e3a18..862ff37d9 100644 |
| --- a/internal/activator/cmdunit_test.go |
| +++ b/internal/activator/cmdunit_test.go |
| @@ -151,6 +151,7 @@ func TestStartCmdRefusesAnUnsafeRunID(t *testing.T) { |
| } |
| func TestStopAndSettleDrainsBothStreams(t *testing.T) { |
| + t.Parallel() |
| b, rt, ctl, unit, u, out, errs := startTestCmd(t) |
| unit.set("active", "inv1", true, true) |
| write := func(path, s string) { |
diff --git a/internal/activator/exec_gate_test.go b/internal/activator/exec_gate_test.go| index 153667835..30a5f99ee 100644 |
| --- a/internal/activator/exec_gate_test.go |
| +++ b/internal/activator/exec_gate_test.go |
| @@ -688,6 +688,7 @@ func flatLiveFixture(t *testing.T) (b *ExecBackend, rt registry.Route, v1, v2, o |
| // exec cannot start a build the gate never saw. A refusal starts nothing. |
| // With the gate nil the spawn execs the live link exactly as before. |
| func TestALiveExecGateGatesTheFlatLiveLinkSpawn(t *testing.T) { |
| + t.Parallel() |
| t.Run("gated build is the exec'd build", func(t *testing.T) { |
| b, rt, v1, v2, out := flatLiveFixture(t) |
| g := &liveGate{refuse: map[string]bool{"v2": true}} |
diff --git a/internal/activator/generations_backend_test.go b/internal/activator/generations_backend_test.go| index 3cfb77e1f..d8c57d8ff 100644 |
| --- a/internal/activator/generations_backend_test.go |
| +++ b/internal/activator/generations_backend_test.go |
| @@ -160,6 +160,7 @@ func TestStartGenFlatBindsItsOwnGenerationSocket(t *testing.T) { |
| // control env follows it, and prepare removes only that generation's stale |
| // file. |
| func TestStartGenNestedUsesItsOwnDirectory(t *testing.T) { |
| + t.Parallel() |
| ctl := &fakeControl{inv: "inv1"} |
| unit := &fakeUnit{} |
| b, rt := nestedBackend(t, ctl, unit) |
diff --git a/internal/activator/gensocket_rev19_test.go b/internal/activator/gensocket_rev19_test.go| index 65793d674..42a64b2c1 100644 |
| --- a/internal/activator/gensocket_rev19_test.go |
| +++ b/internal/activator/gensocket_rev19_test.go |
| @@ -94,6 +94,7 @@ func sameLaunch(t *testing.T, offArgv, genArgv []string, offEnv, genEnv map[stri |
| // Rule 2, flat: a generation's exec has the flag-off argv and agent-owned |
| // environment apart from the socket's directory and the control path. |
| func TestFlatGenerationLaunchMatchesTheFlagOffLaunch(t *testing.T) { |
| + t.Parallel() |
| requireUnixSockets(t) |
| b := testExecBackend(t) |
| b.RunDirOverride = shortRunDir(t) |
| @@ -143,6 +144,7 @@ func TestFlatGenerationLaunchMatchesTheFlagOffLaunch(t *testing.T) { |
| // agent-owned environment apart from the socket's directory and the control |
| // path, and prepare made the generation's own directory before the start. |
| func TestNestedGenerationLaunchMatchesTheFlagOffLaunch(t *testing.T) { |
| + t.Parallel() |
| ctl := &fakeControl{} |
| unit := &fakeUnit{} |
| b, rt := nestedBackend(t, ctl, unit) |
diff --git a/internal/activator/identity_test.go b/internal/activator/identity_test.go| index 836d79b2e..23ea4b384 100644 |
| --- a/internal/activator/identity_test.go |
| +++ b/internal/activator/identity_test.go |
| @@ -348,6 +348,7 @@ func noPlainVerbs(t *testing.T, ctl *fakeControl) { |
| // that is the original run unit (generation 0); with them on, generation n. |
| // Never a plain Start or StartGen. |
| func TestNestedStartExeNamesTheRecordedFile(t *testing.T) { |
| + t.Parallel() |
| for _, tc := range []struct { |
| name string |
| gens bool |
| @@ -471,6 +472,7 @@ func declinedPinFixture(t *testing.T, ctl *fakeControl, unit *fakeUnit) (*ExecBa |
| // the gate answered still runs v1. Never a plain Start or StartGen, which |
| // would bind whatever the link names when root lays the unit out. |
| func TestADeclinedNestedLiveLinkStartRunsThePinnedFile(t *testing.T) { |
| + t.Parallel() |
| for _, tc := range []struct { |
| name string |
| gens bool |
| @@ -532,6 +534,7 @@ func TestADeclinedNestedLiveLinkStartRunsThePinnedFile(t *testing.T) { |
| // The same for the legacy sidecar's nested live-link start: root is asked |
| // to bind the pinned v1 (StartSidecarExe), never a plain sidecar start. |
| func TestADeclinedNestedSidecarStartRunsThePinnedFile(t *testing.T) { |
| + t.Parallel() |
| ctl := &fakeControl{inv: "inv1"} |
| unit := &fakeUnit{} |
| b, rt, x, v2 := declinedPinFixture(t, ctl, unit) |
diff --git a/internal/activator/loglistener_test.go b/internal/activator/loglistener_test.go| index 9d5e41578..b890f692c 100644 |
| --- a/internal/activator/loglistener_test.go |
| +++ b/internal/activator/loglistener_test.go |
| @@ -68,6 +68,7 @@ func TestLogListenerTeesOneConnectionAndRefusesASecond(t *testing.T) { |
| // written after Close returns must not reach the sink, and the tee |
| // goroutine must not outlive the listener. |
| func TestLogListenerCloseShutsTheConnectionAndWaitsForTheTee(t *testing.T) { |
| + t.Parallel() |
| dir, err := os.MkdirTemp("", "ll") |
| if err != nil { |
| t.Fatal(err) |
diff --git a/internal/activator/plan14_generation_backend_test.go b/internal/activator/plan14_generation_backend_test.go| index f609bf736..5eb679af9 100644 |
| --- a/internal/activator/plan14_generation_backend_test.go |
| +++ b/internal/activator/plan14_generation_backend_test.go |
| @@ -99,6 +99,7 @@ func TestPlan14GenerationBackendControlBoundary(t *testing.T) { |
| } |
| func TestPlan14GenerationBackendAuxiliaryBoundary(t *testing.T) { |
| + t.Parallel() |
| for _, claimed := range []bool{false, true} { |
| for _, role := range []string{"seed", "sidecar"} { |
| for _, pinned := range []bool{false, true} { |
diff --git a/internal/activator/swap_executed_test.go b/internal/activator/swap_executed_test.go| index 1e800a15e..83a67fccb 100644 |
| --- a/internal/activator/swap_executed_test.go |
| +++ b/internal/activator/swap_executed_test.go |
| @@ -169,6 +169,7 @@ func TestReplaceWorkerReportsWhetherTheAttemptsBuildExecuted(t *testing.T) { |
| // kill the same way, so an abandoned forced attempt regained an allowance |
| // it may have spent. |
| func TestASwapWhoseNestedStartIsUncertainReportsExecution(t *testing.T) { |
| + t.Parallel() |
| unitFailed := errors.New("the unit failed to start") |
| for _, tc := range []struct { |
| name string |
| @@ -219,6 +220,7 @@ func TestASwapWhoseNestedStartIsUncertainReportsExecution(t *testing.T) { |
| // abandonment, with nothing executed. Before the fix the kill-proven cases |
| // were abandoned with Executed true. |
| func TestAHoldWhoseNestedStartIsUncertainIsDown(t *testing.T) { |
| + t.Parallel() |
| unitFailed := errors.New("the unit failed to start") |
| exitedUnobserved := func(instancectl.StagedExe) (string, error) { return "", nil } |
| rootFailed := func(instancectl.StagedExe) (string, error) { return "", unitFailed } |
diff --git a/internal/activator/unitproc_gen_test.go b/internal/activator/unitproc_gen_test.go| index 028878c1e..1d8394c42 100644 |
| --- a/internal/activator/unitproc_gen_test.go |
| +++ b/internal/activator/unitproc_gen_test.go |
| @@ -174,6 +174,7 @@ func TestUnitGen(t *testing.T) { |
| // Flag off: a nested wake starts the original template, with the original |
| // launch file, log socket and unit name. |
| func TestStartUnitWithContainmentOffKeepsTheOriginalTemplate(t *testing.T) { |
| + t.Parallel() |
| ctl := &fakeControl{inv: "inv1"} |
| unit := &fakeUnit{} |
| b, rt := nestedBackend(t, ctl, unit) |
diff --git a/internal/activator/unitproc_test.go b/internal/activator/unitproc_test.go| index d65dca226..f002c37d6 100644 |
| --- a/internal/activator/unitproc_test.go |
| +++ b/internal/activator/unitproc_test.go |
| @@ -145,6 +145,7 @@ func nestedBackend(t *testing.T, ctl *fakeControl, unit *fakeUnit) (*ExecBackend |
| } |
| func TestStartUnitWritesTheLaunchFileAndReturnsAUnitProc(t *testing.T) { |
| + t.Parallel() |
| ctl := &fakeControl{inv: "inv1"} |
| unit := &fakeUnit{} |
| b, rt := nestedBackend(t, ctl, unit) |
| @@ -210,6 +211,7 @@ func TestStartUnitWritesTheLaunchFileAndReturnsAUnitProc(t *testing.T) { |
| } |
| func TestUnitProcDoesNotExitOnTerminalStateWhileTheCgroupIsPopulated(t *testing.T) { |
| + t.Parallel() |
| ctl := &fakeControl{inv: "inv1"} |
| unit := &fakeUnit{} |
| b, rt := nestedBackend(t, ctl, unit) |
| @@ -240,6 +242,7 @@ func TestUnitProcDoesNotExitOnTerminalStateWhileTheCgroupIsPopulated(t *testing. |
| } |
| func TestUnitProcStopsAForeignInvocation(t *testing.T) { |
| + t.Parallel() |
| ctl := &fakeControl{inv: "inv1"} |
| unit := &fakeUnit{} |
| b, rt := nestedBackend(t, ctl, unit) |
| @@ -346,6 +349,7 @@ func (e *eventCapture) last() (capturedEvent, bool) { |
| // member-safe event, and the record must be consumed (removed) exactly |
| // once. |
| func TestUnitProcExitLineBoundsAForgedExitRecord(t *testing.T) { |
| + t.Parallel() |
| ctl := &fakeControl{inv: "inv1"} |
| unit := &fakeUnit{} |
| b, rt := nestedBackend(t, ctl, unit) |
| @@ -471,6 +475,7 @@ func TestStopKeepsListenersOpenUntilTerminationIsProven(t *testing.T) { |
| // Stop a second time once it returns ErrStillRunning. The listeners must |
| // still close once termination is proven, with nobody asking again. |
| func TestStopClosesListenersAfterDoneWithNoSecondStopCall(t *testing.T) { |
| + t.Parallel() |
| ctl := &fakeControl{inv: "inv1"} |
| unit := &fakeUnit{} |
| b, rt := nestedBackend(t, ctl, unit) |
diff --git a/internal/activator/wakecheck_claim_linux_test.go b/internal/activator/wakecheck_claim_linux_test.go| index 46340e9e9..bf69a1100 100644 |
| --- a/internal/activator/wakecheck_claim_linux_test.go |
| +++ b/internal/activator/wakecheck_claim_linux_test.go |
| @@ -94,6 +94,7 @@ func newHeldClaimed(t *testing.T, live, hashed string) *heldClaimed { |
| // waits for the install; the launch then snapshots the target and runs it, |
| // recorded first. |
| func TestAClaimedHeldWakeWaitsForRootsInstall(t *testing.T) { |
| + t.Parallel() |
| c := newHeldClaimed(t, "v3", "v1") |
| c.a.HeldTarget = heldOn("v1") |
| r := &asks{then: func(string, string) { c.b.fakeBackend.setLive("v1") }} |
diff --git a/internal/activator/wakeplan_test.go b/internal/activator/wakeplan_test.go| index b188a6a45..675eb3498 100644 |
| --- a/internal/activator/wakeplan_test.go |
| +++ b/internal/activator/wakeplan_test.go |
| @@ -1372,6 +1372,7 @@ func TestAFirstWakeWithTimeForAVerdictStillExecsB(t *testing.T) { |
| // exactly one terminal event. Before the fix both hold cases sent |
| // GenCancelled and the proven overlap crash served nothing. |
| func TestAPlannedWakeWhoseNestedStartIsUncertain(t *testing.T) { |
| + t.Parallel() |
| unitFailed := errors.New("the unit failed to start") |
| // B (v2) is answered as the case says; the good build (v1) starts. |
| bAnswers := func(inv string, err error) func(instancectl.StagedExe) (string, error) { |
diff --git a/internal/activator/wakerecord_refused_test.go b/internal/activator/wakerecord_refused_test.go| index 224175449..2c46a9fad 100644 |
| --- a/internal/activator/wakerecord_refused_test.go |
| +++ b/internal/activator/wakerecord_refused_test.go |
| @@ -67,6 +67,7 @@ func refusedWake(t *testing.T, eb *ExecBackend, rt registry.Route) (error, []str |
| } |
| func TestARefusedLaunchLeavesNoBuildStateRecord(t *testing.T) { |
| + t.Parallel() |
| const host = "shop.example.com" |
| route := func(eb *ExecBackend) registry.Route { |
| return registry.Route{Host: host, Kind: "instance", Hibernate: true, App: "app", |
diff --git a/internal/host/agent_layout_test.go b/internal/host/agent_layout_test.go| index 958bfe704..849a38bc0 100644 |
| --- a/internal/host/agent_layout_test.go |
| +++ b/internal/host/agent_layout_test.go |
| @@ -710,6 +710,7 @@ func TestStartupRecoveryIntentReadsWithAHoldMarker(t *testing.T) { |
| } |
| func TestFastTickLayoutPrecedesClaimSerialNotify(t *testing.T) { |
| + t.Parallel() |
| for _, occupied := range []bool{false, true} { |
| t.Run(map[bool]string{false: "empty", true: "full"}[occupied], func(t *testing.T) { |
| env := newFastFixture(t) |
| @@ -757,6 +758,7 @@ func TestFastTickLayoutPrecedesClaimSerialNotify(t *testing.T) { |
| } |
| func TestSyncExecSerializedFencedClaimHost(t *testing.T) { |
| + t.Parallel() |
| reg := restartTestRegistry(t) |
| store := release.NewDirStore(t.TempDir()) |
| dd := t.TempDir() |
diff --git a/internal/host/agent_test.go b/internal/host/agent_test.go| index cc64235de..67b614b40 100644 |
| --- a/internal/host/agent_test.go |
| +++ b/internal/host/agent_test.go |
| @@ -982,6 +982,7 @@ func TestAdoptPassStartsTheNamedUnitAgainAfterAFailedRestart(t *testing.T) { |
| // release.Pass split on the Hibernate FLAG and handed every flagged route |
| // restart=nil, so the dispatch never ran for the routes it was written for. |
| func TestAdoptPassBouncesAWarmHibernatingInstance(t *testing.T) { |
| + t.Parallel() |
| dir := t.TempDir() |
| optDir := t.TempDir() |
| s := release.NewDirStore(dir) |
| @@ -1223,6 +1224,7 @@ func TestReconcileSerializedRunsBothRecordFamilies(t *testing.T) { |
| // adoptLoop's 1-minute first pass covers boot). After either seed, a CHANGE |
| // runs the full pass set exactly once and an unchanged serial runs nothing. |
| func TestFastTickActsOnSerialChangeNotBoot(t *testing.T) { |
| + t.Parallel() |
| env := newFastFixture(t) |
| var passes int |
| d := env.deps(func() { passes++ }) |
| @@ -1341,6 +1343,7 @@ func TestFastSweepBackoffDoubles(t *testing.T) { |
| // plain.test (Hibernate: false) is only reachable via the positional |
| // restart; both must bounce. |
| func TestFastSweepBouncesAWarmHibernatingCanary(t *testing.T) { |
| + t.Parallel() |
| env := newFastFixture(t) |
| ctx := context.Background() |
| plat := runtime.GOOS + "-" + runtime.GOARCH |
| @@ -1430,6 +1433,7 @@ func TestRestartHoldGrowsCapsAndResetsOnANewVersion(t *testing.T) { |
| // (not one per tick), and a restart that finally succeeds clears the hold at |
| // once. |
| func TestFastSweepBoundsARestartFlap(t *testing.T) { |
| + t.Parallel() |
| env := newFastFixture(t) |
| ctx := context.Background() |
| plat := runtime.GOOS + "-" + runtime.GOARCH |
diff --git a/internal/host/claimhandover_recovery_test.go b/internal/host/claimhandover_recovery_test.go| index c829b18fc..7d155e497 100644 |
| --- a/internal/host/claimhandover_recovery_test.go |
| +++ b/internal/host/claimhandover_recovery_test.go |
| @@ -106,6 +106,7 @@ func postRecoveryHandover(t *testing.T, socket string, request coldHandoverReque |
| // The kernel and lease are fixtures. Recovery, persisted receipts, the Unix |
| // root endpoint, cold handover, writer admission and next restore are real. |
| func TestClaimColdHandoverAfterControllerRecoveryReachesNextWake(t *testing.T) { |
| + t.Parallel() |
| for _, boot := range []string{"boot-1", "boot-2"} { |
| t.Run(boot, func(t *testing.T) { |
| ctx := t.Context() |
diff --git a/internal/host/claimparticipation_stale_test.go b/internal/host/claimparticipation_stale_test.go| index b136161f0..ed59d73b3 100644 |
| --- a/internal/host/claimparticipation_stale_test.go |
| +++ b/internal/host/claimparticipation_stale_test.go |
| @@ -23,6 +23,7 @@ func (f staleClaimReader) Read(ctx context.Context, host string) (hostclaim.Obse |
| } |
| func TestPlan9PreviousAgentRetiredParticipation(t *testing.T) { |
| + t.Parallel() |
| for _, mode := range []string{"free", "free-lock-held", "free-without-history", "replacement", "replacement-artifact", "missing-retirement", "artifact", "launch", "fresh-retirement-missing", "fresh-absent", "root", "adopt"} { |
| t.Run(mode, func(t *testing.T) { |
| f := newRecoveryFixture(t) |
diff --git a/internal/host/claimretirerecovery_test.go b/internal/host/claimretirerecovery_test.go| index 353fd1b3b..466d20d08 100644 |
| --- a/internal/host/claimretirerecovery_test.go |
| +++ b/internal/host/claimretirerecovery_test.go |
| @@ -102,6 +102,7 @@ func startRetirementRecoveryTransport(t *testing.T, handler ClaimRootHTTP) strin |
| } |
| func TestClaimRetirementRecoversPersistedLaunchOwner(t *testing.T) { |
| + t.Parallel() |
| f := newRecoveryFixture(t) |
| former := f.controller("boot-1", "controller-1", 4101, "start-1") |
| admitted := former.admit(t, f) |
diff --git a/internal/host/claimservingparksource_linux_test.go b/internal/host/claimservingparksource_linux_test.go| index 5f2c25363..40cb4e04f 100644 |
| --- a/internal/host/claimservingparksource_linux_test.go |
| +++ b/internal/host/claimservingparksource_linux_test.go |
| @@ -17,6 +17,7 @@ import ( |
| ) |
| func TestServingParkSourceUsesRootInventory(t *testing.T) { |
| + t.Parallel() |
| for _, attack := range []string{"none", "unmaterialized", "duplicate", "owner", "revision", "enrollment", "record", "stamp", "foreign", "missing", "flat", "symlink", "replacement"} { |
| t.Run(attack, func(t *testing.T) { |
| f, _, _, inputs := servingRetirementFixture(t) |
diff --git a/internal/host/converge_adopted_test.go b/internal/host/converge_adopted_test.go| index 2a5840833..e2bdbc889 100644 |
| --- a/internal/host/converge_adopted_test.go |
| +++ b/internal/host/converge_adopted_test.go |
| @@ -278,6 +278,7 @@ func (b *versionedBackend) started() []string { |
| // started, so the ONLY thing that can cycle the instance is the leg — a 90s |
| // grace cannot rescue this test. |
| func TestConvergeLegCyclesARootAdoptedInstanceOnARealActivator(t *testing.T) { |
| + t.Parallel() |
| env := newFastFixture(t) |
| ctx := context.Background() |
| plat := runtime.GOOS + "-" + runtime.GOARCH |
diff --git a/internal/host/edgesclaims_test.go b/internal/host/edgesclaims_test.go| index bf0a75c87..a3f40a519 100644 |
| --- a/internal/host/edgesclaims_test.go |
| +++ b/internal/host/edgesclaims_test.go |
| @@ -247,6 +247,7 @@ func TestEdgesClaimsAFailingClaimDoesNotStarveTheRest(t *testing.T) { |
| // every claim of a 2,000-host box fresh. Timer passes alone come every |
| // five to six minutes and read 256 claims each. |
| func TestEdgesLoopRefreshesEveryClaimWithinTheTTL(t *testing.T) { |
| + t.Parallel() |
| const n = 2000 |
| book := &claimsBook{claims: map[string]*hostclaim.Claim{}} |
| var hosts []string |
| @@ -290,6 +291,7 @@ func TestEdgesLoopRefreshesEveryClaimWithinTheTTL(t *testing.T) { |
| // every write, claim passes wait out the schedule's backoff and their own |
| // failures move it; once writes succeed, the 30-second claim passes resume. |
| func TestEdgesLoopClaimPassesObeyTheRetryBackoff(t *testing.T) { |
| + t.Parallel() |
| book := &claimsBook{claims: map[string]*hostclaim.Claim{}} |
| var hosts []string |
| for i := 0; i < 4000; i++ { // enough that reads stay due throughout |
diff --git a/internal/host/guardtransaction_test.go b/internal/host/guardtransaction_test.go| index 310d0e3aa..ef99b8594 100644 |
| --- a/internal/host/guardtransaction_test.go |
| +++ b/internal/host/guardtransaction_test.go |
| @@ -205,6 +205,7 @@ func TestGuardRecoveryRetainsMarkerOnInvalidImageOrMarker(t *testing.T) { |
| } |
| func TestGuardRecoveryRefusesControllersAfterBegin(t *testing.T) { |
| + t.Parallel() |
| states := []struct { |
| name string |
| malformed bool |
diff --git a/internal/host/installchannel_identity_test.go b/internal/host/installchannel_identity_test.go| index 0387f0d78..7126a9c32 100644 |
| --- a/internal/host/installchannel_identity_test.go |
| +++ b/internal/host/installchannel_identity_test.go |
| @@ -217,6 +217,7 @@ func TestInstallChannelPolicyIdentityInstallsAFreshBoxOnAnUntaggedPointer(t *tes |
| // Every refusal of --identity leaves the box as it was, fetches nothing and |
| // keeps no identity. |
| func TestInstallChannelPolicyIdentityRefusals(t *testing.T) { |
| + t.Parallel() |
| _, otherKey, _ := ed25519.GenerateKey(nil) |
| const notSigned = "the --identity file is not a release identity signed for this deployment, so nothing was installed" |
| const notPublished = "the --identity file is not the identity published for v1.4.0, so nothing was installed" |
diff --git a/internal/host/installchannel_policy_test.go b/internal/host/installchannel_policy_test.go| index 9256ea5cf..db8f0f92f 100644 |
| --- a/internal/host/installchannel_policy_test.go |
| +++ b/internal/host/installchannel_policy_test.go |
| @@ -242,6 +242,7 @@ func TestInstallChannelPolicyArmsAnUpdatedBoxAtTheChannelHead(t *testing.T) { |
| // Each refusal of --policy on the updated box, and on a fresh one, leaves |
| // the box as it was and fetches nothing. |
| func TestInstallChannelPolicyRefusals(t *testing.T) { |
| + t.Parallel() |
| _, otherKey, _ := ed25519.GenerateKey(nil) |
| for _, c := range []struct { |
| name string |
diff --git a/internal/host/instancekeys_test.go b/internal/host/instancekeys_test.go| index 8babc8ff4..c15b5e049 100644 |
| --- a/internal/host/instancekeys_test.go |
| +++ b/internal/host/instancekeys_test.go |
| @@ -250,6 +250,7 @@ func TestBackfillInSlotSkipsAFencedHostAndReadsTheRowAgain(t *testing.T) { |
| // while a row is being written (the layout pass or a move about to move |
| // the host's files) is installed only once the write has returned. |
| func TestBackfillInSlotHoldsOffAFenceUntilTheWriteReturns(t *testing.T) { |
| + t.Parallel() |
| rt := registry.Route{Host: "shop.example.com", Kind: "instance", Status: "ready", Socket: "/run/carlos/shop.example.com.sock"} |
| svc := &activator.Service{} |
| writing, release := make(chan struct{}), make(chan struct{}) |
diff --git a/internal/host/movescut_test.go b/internal/host/movescut_test.go| index e9654fd16..3c926b01a 100644 |
| --- a/internal/host/movescut_test.go |
| +++ b/internal/host/movescut_test.go |
| @@ -939,6 +939,7 @@ func TestArchivedNeverPrecedesTheSealedArchive(t *testing.T) { |
| // and the claim moving/sealed with nobody executing, which anyone who sees |
| // it may finish with the same Flip. |
| func TestFlipWritesRecordThenClaim(t *testing.T) { |
| + t.Parallel() |
| ctx := context.Background() |
| h := newCutHarness(t) |
| h.ready(t) |
diff --git a/internal/host/movescutguard_test.go b/internal/host/movescutguard_test.go| index 31df74b06..65919753e 100644 |
| --- a/internal/host/movescutguard_test.go |
| +++ b/internal/host/movescutguard_test.go |
| @@ -415,6 +415,7 @@ func TestCutGuardRefusalEndsTheStepOnAConflict(t *testing.T) { |
| // staging lease the requested round takes before the holder check is |
| // main's order (ruling T5-lease) and is not this refusal's. |
| func TestCutHolderRefusalEndsTheStepOnAConflict(t *testing.T) { |
| + t.Parallel() |
| ctx := context.Background() |
| for _, phase := range []string{provision.CutRequested, provision.CutAdmitted} { |
| t.Run(phase, func(t *testing.T) { |
diff --git a/internal/host/movesenvskew_test.go b/internal/host/movesenvskew_test.go| index 4e310556a..6c31752ab 100644 |
| --- a/internal/host/movesenvskew_test.go |
| +++ b/internal/host/movesenvskew_test.go |
| @@ -66,6 +66,7 @@ const t3OldReportWant = "the source reported its launch environment in an older |
| // target refuses the source's v1 report at T3, before comparing, named to |
| // named and named to home. |
| func TestT3RefusesAnOlderSourceReport(t *testing.T) { |
| + t.Parallel() |
| for name, opts := range map[string][]p1Option{ |
| "named to named": {realLaunchEnv}, |
| "named to home": {intoHome, realLaunchEnv}, |
diff --git a/internal/host/movesfilescap_test.go b/internal/host/movesfilescap_test.go| index 4380028a7..2a35b54c9 100644 |
| --- a/internal/host/movesfilescap_test.go |
| +++ b/internal/host/movesfilescap_test.go |
| @@ -115,6 +115,7 @@ func putP1Manifest(t *testing.T, h *phase1Harness, loc, gen string, m hostfiles. |
| // target in the claim, the move still preparing. A manifest the readers |
| // accept passes, and the round stages as before. |
| func TestPreparingRefusesAFilesManifestPastTheCap(t *testing.T) { |
| + t.Parallel() |
| for name, c := range capCases { |
| t.Run(name, func(t *testing.T) { |
| h := newPhase1Harness(t) |
diff --git a/internal/host/movesfinal_test.go b/internal/host/movesfinal_test.go| index d7c5c9c98..e4414f0a4 100644 |
| --- a/internal/host/movesfinal_test.go |
| +++ b/internal/host/movesfinal_test.go |
| @@ -773,6 +773,7 @@ func TestMovesParticipantRecord(t *testing.T) { |
| // Plan 5, ruling G17) but wires the registry's delete; an unarmed pass |
| // changes nothing. |
| func TestSourceParkWaitsUnarmedInProduction(t *testing.T) { |
| + t.Parallel() |
| h := newFinalHarness(t) |
| h.commit(t) |
| for name, unarm := range map[string]func(*moveCfg){ |
diff --git a/internal/host/movesland_finalfix_test.go b/internal/host/movesland_finalfix_test.go| index 6f1947d82..a220c6748 100644 |
| --- a/internal/host/movesland_finalfix_test.go |
| +++ b/internal/host/movesland_finalfix_test.go |
| @@ -354,6 +354,7 @@ func TestLandingInstallRefusesASuccessor(t *testing.T) { |
| // deadline and landing_deadline (spec §7.4). The cut deadline here falls a |
| // minute after the flip; the landing deadline is fifteen minutes away. |
| func TestLandingCutDeadlineMarksRollback(t *testing.T) { |
| + t.Parallel() |
| ctx := context.Background() |
| setCutDeadline := func(t *testing.T, h *landingHarness) time.Time { |
| t.Helper() |
diff --git a/internal/host/movesland_test.go b/internal/host/movesland_test.go| index b1fbfb30a..537cd3739 100644 |
| --- a/internal/host/movesland_test.go |
| +++ b/internal/host/movesland_test.go |
| @@ -1681,6 +1681,7 @@ func TestLocalWritesNoFilesManifestBeforeItsStep(t *testing.T) { |
| // Ruling G17: with the park engine's hooks unwired, as armPhase1 leaves |
| // them, the landing is not armed: the pass logs and writes nothing. |
| func TestLandingWaitsUnarmedInProduction(t *testing.T) { |
| + t.Parallel() |
| h := newLandingHarness(t) |
| h.flip(t) |
| h.lw = &movesWorker{mirrors: map[string]lease.MirrorStore{}} |
diff --git a/internal/host/movesphase1_test.go b/internal/host/movesphase1_test.go| index 57f2bc639..60c53ddd0 100644 |
| --- a/internal/host/movesphase1_test.go |
| +++ b/internal/host/movesphase1_test.go |
| @@ -290,6 +290,7 @@ func rewriteP1Claim(t *testing.T, s release.Store, edit func(*hostclaim.Claim)) |
| // And for every point at which the lease turns unsafe, the requests issued |
| // are exactly the checks that passed: no class signs without one. |
| func TestEveryStagingWriteIsGuarded(t *testing.T) { |
| + t.Parallel() |
| h := newPhase1Harness(t) |
| h.start(t, "manual") |
| h.lease.until = h.clock.now.Add(moves.SignatureLife) // inside SignatureLife + skew |
diff --git a/internal/host/movesprobe_test.go b/internal/host/movesprobe_test.go| index b9c3c6202..91c3c7fd7 100644 |
| --- a/internal/host/movesprobe_test.go |
| +++ b/internal/host/movesprobe_test.go |
| @@ -48,6 +48,7 @@ func wakeThenProxy(w http.ResponseWriter, r *http.Request, _ registry.Route, pro |
| // S1 must prove the instance itself answered, in full, with a 2xx, within |
| // its deadline (Task 14 review finding 4). |
| func TestS1ProbeNeedsTheInstanceItself(t *testing.T) { |
| + t.Parallel() |
| ctx := context.Background() |
| answer := func(code int) registry.Route { |
| return instanceForTest(t, func(w http.ResponseWriter, r *http.Request) { |
| @@ -216,6 +217,7 @@ func (b *countingWakeBackend) wakes() int { |
| // committed). ServeScheduled does not read the gate, so the probe must: |
| // whatever the move's state, S1 fails without a wake. |
| func TestS1ProbeNeverWakesAGatedImport(t *testing.T) { |
| + t.Parallel() |
| for _, gate := range []string{strings.Repeat("a", 64), registry.ImportGateClosed} { |
| probe, b := armedProbe(t, gate) |
| got := probe(context.Background(), p1Host, "/") |
diff --git a/internal/host/movesreport_test.go b/internal/host/movesreport_test.go| index 20a420ea8..8565251c9 100644 |
| --- a/internal/host/movesreport_test.go |
| +++ b/internal/host/movesreport_test.go |
| @@ -386,6 +386,7 @@ func TestMeasureDiskIn(t *testing.T) { |
| // The regional S3 measurement writes the probe key outside moves/ with |
| // this box's own client and deletes it (F11). |
| func TestMeasureS3UsesTheProbeKeyAndCleansUp(t *testing.T) { |
| + t.Parallel() |
| f := newFakeMoveMirror() |
| m := measureS3(func(context.Context) (lease.MirrorStore, error) { return f, nil }, "data-uk", (&stepClock{now: time.Now()}).Now) |
| r, err := m(context.Background(), moves.ProbeKey(p1Host, p1ID)) |
| @@ -503,6 +504,7 @@ func TestProbeStoreSpeaksS3(t *testing.T) { |
| // (Task 14 review finding 1). The source's local database file counts when |
| // it is larger; a newest file that is not LTX fails T6 and T11 closed. |
| func TestT11PricesTheLogicalDatabaseSize(t *testing.T) { |
| + t.Parallel() |
| h := newPhase1Harness(t) |
| h.start(t, "manual") |
| newest := ltxForTest(t, 4096, 1<<18, 3, 3) // a 1 GiB database, one page in this file |
diff --git a/internal/host/movesrevert_test.go b/internal/host/movesrevert_test.go| index b9ff01db0..67e1e1150 100644 |
| --- a/internal/host/movesrevert_test.go |
| +++ b/internal/host/movesrevert_test.go |
| @@ -313,6 +313,7 @@ func (h *revertHarness) closed(t *testing.T) { |
| // and rev_phase steps evidence to probing (no baselines, so no verify), op.phase |
| // following (J1). |
| func TestRevertFromStoppingComputesEvidenceFirst(t *testing.T) { |
| + t.Parallel() |
| h := newRevertHarness(t) |
| h.fromStopping(t) |
| h.arm(t) |
| @@ -583,6 +584,7 @@ func TestRetryResumesARevertsRevPhase(t *testing.T) { |
| // record closes with LastMove rolled_back, the offline time counted from the |
| // cut to the reopen, and the source's journal parked. |
| func TestRevertOpensAndReleases(t *testing.T) { |
| + t.Parallel() |
| h := newRevertHarness(t) |
| h.fromStopped(t) |
| h.arm(t) |
| @@ -1139,6 +1141,7 @@ func TestRestatusHoldIsConditional(t *testing.T) { |
| // (§7.4 evidence), so giveUpExecution publishes the report without one, |
| // records no baselines, and the revert goes on. |
| func TestRevertFromStoppingWithUnarchivableFiles(t *testing.T) { |
| + t.Parallel() |
| h := newRevertHarness(t) |
| h.fromStopping(t) |
| if err := os.Symlink("/etc/passwd", filepath.Join(h.cfg.DataDir, p1Host, "link")); err != nil { |
diff --git a/internal/host/plan10_j2_adapter_test.go b/internal/host/plan10_j2_adapter_test.go| index 55dcf7be0..d0dd45363 100644 |
| --- a/internal/host/plan10_j2_adapter_test.go |
| +++ b/internal/host/plan10_j2_adapter_test.go |
| @@ -183,6 +183,7 @@ func TestPlan10J2AdapterRecordsInputsBeforeTheGroupDProbe(t *testing.T) { |
| // this rollback's probe at probing by this box stops the attempt before any |
| // render or wake. |
| func TestPlan10J2AdapterStopsBeforeTheWake(t *testing.T) { |
| + t.Parallel() |
| type tc struct { |
| claimPhase, exec, srcGen string |
| in provision.MoveInputs |
| @@ -295,6 +296,7 @@ func TestPlan10J2AdapterRefusesWithoutItsDependencies(t *testing.T) { |
| // spent nine-attempt budget stops for an operator, a lapsed window or a |
| // changed claim waits for the next pass, anything else is an error. |
| func TestPlan10J2AdapterOutcomes(t *testing.T) { |
| + t.Parallel() |
| other := errors.New("boom") |
| for name, tc := range map[string]struct { |
| wakeErr error |
| @@ -515,6 +517,7 @@ func TestPlan10J2RevertRunUsesProductionAdapter(t *testing.T) { |
| } |
| func TestPlan10J2RevertMissingProviderWaitsWithoutInputsOrWake(t *testing.T) { |
| + t.Parallel() |
| h := newRevertHarness(t) |
| h.fromStopped(t) |
| h.arm(t) |
| @@ -589,6 +592,7 @@ func TestPlan10J2NinthFailedStartSticksAndKeepsJournal(t *testing.T) { |
| } |
| func TestPlan10J2RevertAdapterRejectsChangedBinding(t *testing.T) { |
| + t.Parallel() |
| for _, tc := range []string{"reopened", "generation", "rev_phase", "kind", "executor"} { |
| t.Run(tc, func(t *testing.T) { |
| f := newRecoveryFixture(t) |
diff --git a/internal/host/plan10_j2_test.go b/internal/host/plan10_j2_test.go| index d90eb31cd..57b2f035c 100644 |
| --- a/internal/host/plan10_j2_test.go |
| +++ b/internal/host/plan10_j2_test.go |
| @@ -261,6 +261,7 @@ func TestPlan10J2TeardownReachesForwardOnlyAlongTheRecoveryRow(t *testing.T) { |
| // exactly as a landing's does (before any prelaunch record), and a stop of an |
| // attempt with no prelaunch record never runs the local root's stop. |
| func TestPlan10J2AdmissionFailureReleasesTheRecoveryLease(t *testing.T) { |
| + t.Parallel() |
| probe := activator.StartPolicy{MaxStarts: 5, Window: 30 * time.Second, Probe: true} |
| for _, kind := range []string{hostclaim.KindRestoring, hostclaim.KindReverting} { |
| t.Run(kind, func(t *testing.T) { |
diff --git a/internal/host/plan11_release_test.go b/internal/host/plan11_release_test.go| index 5d2a906ea..caf0536fe 100644 |
| --- a/internal/host/plan11_release_test.go |
| +++ b/internal/host/plan11_release_test.go |
| @@ -18,6 +18,7 @@ import ( |
| ) |
| func TestPlan11ReleaseNeedsExactSignedRootStop(t *testing.T) { |
| + t.Parallel() |
| for _, bad := range []string{"", "unsigned", "wrong-stamp", "retirement", "wrong-enrollment", "wrong-session", "session-zero", "zero-stale", "zero-as-stopped", "positive-as-no-process"} { |
| t.Run(bad, func(t *testing.T) { |
| ctx := context.Background() |
diff --git a/internal/host/plan12_census_test.go b/internal/host/plan12_census_test.go| index dcc769be8..25b88db58 100644 |
| --- a/internal/host/plan12_census_test.go |
| +++ b/internal/host/plan12_census_test.go |
| @@ -102,6 +102,7 @@ func TestPlan12LegacyAndMovesHaveIndependentLabels(t *testing.T) { |
| } |
| func TestPlan12HolderResidueInOtherRegion(t *testing.T) { |
| + t.Parallel() |
| f := newRecoveryFixture(t) |
| o := f.read() |
| c := o.Claim |
diff --git a/internal/host/plan12_fix1_test.go b/internal/host/plan12_fix1_test.go| index c1feb9219..23ea0b360 100644 |
| --- a/internal/host/plan12_fix1_test.go |
| +++ b/internal/host/plan12_fix1_test.go |
| @@ -83,6 +83,7 @@ func TestPlan12InventoryReplayChecksAllTimers(t *testing.T) { |
| } |
| func TestPlan12InitialSourceRecoveryRequiresRootStop(t *testing.T) { |
| + t.Parallel() |
| for _, session := range []uint64{0, 2} { |
| t.Run(fmt.Sprint(session), func(t *testing.T) { |
| f, o, _ := plan12Handover(t, hostclaim.KindRestoring, "stop") |
diff --git a/internal/host/plan12_handover_test.go b/internal/host/plan12_handover_test.go| index 514f6fa6c..deef298dc 100644 |
| --- a/internal/host/plan12_handover_test.go |
| +++ b/internal/host/plan12_handover_test.go |
| @@ -153,6 +153,7 @@ func TestPlan12RecoveryPredecessorEvidence(t *testing.T) { |
| } |
| } |
| func TestPlan12RecoveryAdmissionAfterTargetSession(t *testing.T) { |
| + t.Parallel() |
| for _, kind := range []string{hostclaim.KindRestoring} { |
| t.Run(kind, func(t *testing.T) { |
| f, o, h := plan12Handover(t, kind, "stop") |
diff --git a/internal/host/plan12_restore_linux_test.go b/internal/host/plan12_restore_linux_test.go| index c950f72c7..2157b1968 100644 |
| --- a/internal/host/plan12_restore_linux_test.go |
| +++ b/internal/host/plan12_restore_linux_test.go |
| @@ -32,6 +32,7 @@ import ( |
| ) |
| func TestPlan12RecoveryRestoreSourceDatabase(t *testing.T) { |
| + t.Parallel() |
| for _, name := range []string{hostclaim.KindRestoring, hostclaim.KindReverting, "clean-return", "never-restoring", "never-reverting", "never-clean-return", "missing-inventory", "wrong-inventory", "missing-registry", "interrupted", "admission-crash", "prejournal-failure", "intent-crash", "evidence-read-failure", "concurrent-update", "prelaunch-update"} { |
| t.Run(name, func(t *testing.T) { |
| kind, clean := name, name == "clean-return" || name == "never-clean-return" |
diff --git a/internal/host/plan14_create_participation_test.go b/internal/host/plan14_create_participation_test.go| index 20a971f32..0ba7af021 100644 |
| --- a/internal/host/plan14_create_participation_test.go |
| +++ b/internal/host/plan14_create_participation_test.go |
| @@ -17,6 +17,7 @@ import ( |
| ) |
| func TestPlan14CreateParticipationBeforeInstallation(t *testing.T) { |
| + t.Parallel() |
| f, root, _ := plan14InstallRegistration(t, hostclaim.KindServing, "") |
| before := f.read() |
| h := before.Claim.Holder |
diff --git a/internal/host/plan14_delete_participation_test.go b/internal/host/plan14_delete_participation_test.go| index be20abbc6..ca7f9c6c4 100644 |
| --- a/internal/host/plan14_delete_participation_test.go |
| +++ b/internal/host/plan14_delete_participation_test.go |
| @@ -13,6 +13,7 @@ import ( |
| ) |
| func TestPlan14OrdinaryDeleteParticipation(t *testing.T) { |
| + t.Parallel() |
| for _, mode := range []string{"live", "stopped", "parking", "retired", "serving stopped", "pending", "record present", "delete absent", "etag", "key", "enrollment", "foreign home", "session", "stamp", "op", "box", "inventory"} { |
| t.Run(mode, func(t *testing.T) { |
| f, root, iq := plan14InstallRegistration(t, hostclaim.KindServing, "") |
diff --git a/internal/host/plan14_fix2_inventory_test.go b/internal/host/plan14_fix2_inventory_test.go| index 95630b9c6..a32c50f1a 100644 |
| --- a/internal/host/plan14_fix2_inventory_test.go |
| +++ b/internal/host/plan14_fix2_inventory_test.go |
| @@ -45,6 +45,7 @@ func TestPlan14Fix2OldInventoryRequestLeavesNoIntent(t *testing.T) { |
| } |
| } |
| func TestPlan14Fix2CommittedInventoryAfterETagChange(t *testing.T) { |
| + t.Parallel() |
| f, root, q := plan14InstallRegistration(t, hostclaim.KindLanding, provision.LandChecking) |
| state := &plan14RegistrationCrash{rollbackDisk: &rollbackDisk{dir: t.TempDir()}} |
| root.Stop.Coordinator.Guard.Root = hostguard.NewRootAuthority(state) |
diff --git a/internal/host/plan14_fix4_live_linux_test.go b/internal/host/plan14_fix4_live_linux_test.go| index 18ecef2ed..0c96d651d 100644 |
| --- a/internal/host/plan14_fix4_live_linux_test.go |
| +++ b/internal/host/plan14_fix4_live_linux_test.go |
| @@ -392,6 +392,7 @@ func TestPlan14Fix4IndexFailureCachedForPass(t *testing.T) { |
| } |
| func TestPlan14Fix4HibernateStartGuard(t *testing.T) { |
| + t.Parallel() |
| e, rt, u, c, _ := plan14AdoptionFixture(t) |
| rt.Hibernate = true |
| if err := e.root.reg.Upsert(rt); err != nil { |
diff --git a/internal/host/plan14_incident_recipe_test.go b/internal/host/plan14_incident_recipe_test.go| index 0d5b22703..832ab8f48 100644 |
| --- a/internal/host/plan14_incident_recipe_test.go |
| +++ b/internal/host/plan14_incident_recipe_test.go |
| @@ -229,6 +229,7 @@ func (s *namedRecordSwitchStore) Get(ctx context.Context, key string) ([]byte, s |
| } |
| func TestPlan14SignedNamedRecoveryUsesOneCanonicalRecord(t *testing.T) { |
| + t.Parallel() |
| e, rt, u, _, _ := plan14AdoptionFixture(t) |
| if _, err := e.store.Put(t.Context(), "accounts/bac/account.json", []byte(`{"id":2,"sqid":"bac"}`), ""); err != nil { |
| t.Fatal(err) |
diff --git a/internal/host/plan14_launch_verifier_test.go b/internal/host/plan14_launch_verifier_test.go| index 9b8b55172..36fe2e445 100644 |
| --- a/internal/host/plan14_launch_verifier_test.go |
| +++ b/internal/host/plan14_launch_verifier_test.go |
| @@ -53,6 +53,7 @@ func TestPlan14LaunchVerifierToken(t *testing.T) { |
| } |
| func TestPlan14LaunchVerifierCallerOrder(t *testing.T) { |
| + t.Parallel() |
| for _, name := range []string{"idle", "begin", "end", "recover", "activation", "floor-begin", "floor-end", "system-begin", "system-clear", "system-recovery", "guard-close", "guard-rollback"} { |
| t.Run(name, func(t *testing.T) { |
| lock := &plan14ReleaseStore{} |
diff --git a/internal/host/plan14_recovery_without_health_test.go b/internal/host/plan14_recovery_without_health_test.go| index 65c53c1ec..0962ed521 100644 |
| --- a/internal/host/plan14_recovery_without_health_test.go |
| +++ b/internal/host/plan14_recovery_without_health_test.go |
| @@ -51,6 +51,7 @@ func TestPlan14SignedRestartWithoutHealthHistory(t *testing.T) { |
| } |
| func TestPlan14CapturedRollbackWithoutHealthHistory(t *testing.T) { |
| + t.Parallel() |
| e, rt, u, c, _ := plan14AdoptionFixture(t) |
| before, err := c.host(t.Context(), rt.Host) |
| if err != nil { |
diff --git a/internal/host/plan14_restart_consumption_test.go b/internal/host/plan14_restart_consumption_test.go| index f66b0e9b2..d9ca287e9 100644 |
| --- a/internal/host/plan14_restart_consumption_test.go |
| +++ b/internal/host/plan14_restart_consumption_test.go |
| @@ -166,6 +166,7 @@ func TestPlan14RootRestartProductionHeldRollover(t *testing.T) { |
| } |
| func TestPlan14RootRestartProductionBindingChange(t *testing.T) { |
| + t.Parallel() |
| f := newRestartConsumptionFixture(t) |
| if err := f.run(t); err != nil { |
| t.Fatal(err) |
| @@ -433,6 +434,7 @@ func TestPlan14RootRestartProductionCanonicalSelection(t *testing.T) { |
| } |
| func TestPlan14RootRestartProductionReplacedInstallation(t *testing.T) { |
| + t.Parallel() |
| f := newRestartConsumptionFixture(t) |
| if err := f.run(t); err != nil { |
| t.Fatal(err) |
diff --git a/internal/host/plan9_a_guard_test.go b/internal/host/plan9_a_guard_test.go| index 66381082b..d18294dc1 100644 |
| --- a/internal/host/plan9_a_guard_test.go |
| +++ b/internal/host/plan9_a_guard_test.go |
| @@ -80,6 +80,7 @@ func plan9aAbsent(t *testing.T, paths ...string) { |
| // completion. Root's marker and transaction go, so the box is not wedged, |
| // and the console's reservation stays held for a retry or an operator. |
| func TestPlan9AUnchangedTransactionRecordsNoCompletion(t *testing.T) { |
| + t.Parallel() |
| for _, state := range []string{"prepared", "staging-failed", "late-participation", "abandoned-install"} { |
| t.Run(state, func(t *testing.T) { |
| f, id := plan9aTargetFixture(t) |
diff --git a/internal/host/plan9_d2_test.go b/internal/host/plan9_d2_test.go| index 667f1c75b..f6456a7c2 100644 |
| --- a/internal/host/plan9_d2_test.go |
| +++ b/internal/host/plan9_d2_test.go |
| @@ -320,6 +320,7 @@ func TestPlan9D2CrossBoxHandoverAuthorizesFromTheSealedCut(t *testing.T) { |
| } |
| func TestPlan9D2CrossBoxHandoverRefusesWithoutExactEvidence(t *testing.T) { |
| + t.Parallel() |
| for name, tc := range map[string]struct { |
| claim func(*hostclaim.Claim) |
| prior func(*hostclaim.Claim) |
diff --git a/internal/host/plan9_fix1_stop_test.go b/internal/host/plan9_fix1_stop_test.go| index 1b976a899..0d87cf3d4 100644 |
| --- a/internal/host/plan9_fix1_stop_test.go |
| +++ b/internal/host/plan9_fix1_stop_test.go |
| @@ -44,6 +44,7 @@ func plan9Fix1StopAtCommitted(t *testing.T) (*recoveryFixture, *recoveryControll |
| // that exact session at committed, the signed receipt verifies, and the |
| // pending lease is released so the host's next admission is not refused. |
| func TestPlan9Fix1TeardownStopsAProbeThatReachedCommitted(t *testing.T) { |
| + t.Parallel() |
| for name, teardown := range map[string]func(context.Context, *recoveryController, hostclaim.Observed, hostclaim.Observed) error{ |
| "stop": func(ctx context.Context, c *recoveryController, checkpoint, _ hostclaim.Observed) error { |
| return c.wake.Stop(ctx, checkpoint) |
diff --git a/internal/host/plan9fix1_journal_linux_test.go b/internal/host/plan9fix1_journal_linux_test.go| index 4e56c3275..47829fb72 100644 |
| --- a/internal/host/plan9fix1_journal_linux_test.go |
| +++ b/internal/host/plan9fix1_journal_linux_test.go |
| @@ -61,6 +61,7 @@ func plan9Fix1RootRetire(t *testing.T) (ClaimRootHTTP, hostguard.FenceTarget, *r |
| // own stop inventory does not name, even when it decodes strictly and matches |
| // the host, incarnation, stamp, ownership, target and stop receipt. |
| func TestPlan9Fix1RootRetireRefusesPlantedJournalArtifacts(t *testing.T) { |
| + t.Parallel() |
| for _, rootName := range []string{"data", "opt", "units"} { |
| t.Run(rootName, func(t *testing.T) { |
| root, target, reg, base := plan9Fix1RootRetire(t) |
| @@ -111,6 +112,7 @@ func TestPlan9Fix1RootRetireRefusesPlantedJournalArtifacts(t *testing.T) { |
| // C-1: a symlinked retirement journal directory is refused before any write. |
| func TestPlan9Fix1RootRetireRefusesSymlinkedJournalDir(t *testing.T) { |
| + t.Parallel() |
| root, target, reg, base := plan9Fix1RootRetire(t) |
| victim := filepath.Join(base, "victim") |
| if err := os.Mkdir(victim, 0700); err != nil { |
diff --git a/internal/host/plan9fix2_inventory_linux_test.go b/internal/host/plan9fix2_inventory_linux_test.go| index de66f0a90..6db3604de 100644 |
| --- a/internal/host/plan9fix2_inventory_linux_test.go |
| +++ b/internal/host/plan9fix2_inventory_linux_test.go |
| @@ -18,6 +18,7 @@ import ( |
| ) |
| func TestR2InventoryNamesForeignArtifact(t *testing.T) { |
| + t.Parallel() |
| for _, rootName := range []string{"opt", "units", "data"} { |
| t.Run(rootName, func(t *testing.T) { |
| root, target, reg, base := plan9Fix1RootRetire(t) |
diff --git a/internal/host/proofask_test.go b/internal/host/proofask_test.go| index b64fbf476..c06022dfe 100644 |
| --- a/internal/host/proofask_test.go |
| +++ b/internal/host/proofask_test.go |
| @@ -46,6 +46,7 @@ func mintAskerFixture(t *testing.T, activeFor time.Duration) (*mintAsker, *int, |
| // Review focus 5: the relay can drop a request and a mint write can fail, so |
| // the agent asks every 2 minutes until it sees the proof, then stops. |
| func TestMintAskerReasksUntilTheProofAppears(t *testing.T) { |
| + t.Parallel() |
| a, asked, clock, store, sha := mintAskerFixture(t, 20*time.Minute) |
| ctx := context.Background() |
| t0 := *clock |
| @@ -115,6 +116,7 @@ func putDevProof(t *testing.T, store release.Store, sha string, at time.Time) { |
| // finds no proof for it, and asks root again, rather than answering from the |
| // old file's hash and the proof it found for that. |
| func TestMintAskerRehashesAReusedVersionPath(t *testing.T) { |
| + t.Parallel() |
| a, asked, clock, store, sha := mintAskerFixture(t, 20*time.Minute) |
| ctx := context.Background() |
| t0 := *clock |
| @@ -144,6 +146,7 @@ func TestMintAskerRehashesAReusedVersionPath(t *testing.T) { |
| // The same bytes rewritten in place with a new mtime are hashed again too: |
| // size and mtime are part of the file's identity, not only its inode. |
| func TestMintAskerRehashesAFileRewrittenInPlace(t *testing.T) { |
| + t.Parallel() |
| a, asked, clock, store, sha := mintAskerFixture(t, 20*time.Minute) |
| ctx := context.Background() |
| t0 := *clock |
| @@ -168,6 +171,7 @@ func TestMintAskerRehashesAFileRewrittenInPlace(t *testing.T) { |
| // The proven cache is per proof object: a proof seen for one prover does not |
| // answer for another after the policy changes prover. |
| func TestMintAskerProvenCacheIsPerProver(t *testing.T) { |
| + t.Parallel() |
| a, asked, clock, store, sha := mintAskerFixture(t, 20*time.Minute) |
| ctx := context.Background() |
| t0 := *clock |
| @@ -187,6 +191,7 @@ func TestMintAskerProvenCacheIsPerProver(t *testing.T) { |
| } |
| func TestMintAskerWaitsOutTheBake(t *testing.T) { |
| + t.Parallel() |
| a, asked, _, store, sha := mintAskerFixture(t, 5*time.Minute) |
| a.tick(context.Background()) |
| if *asked != 0 { |
| @@ -201,6 +206,7 @@ func TestMintAskerWaitsOutTheBake(t *testing.T) { |
| // nothing until it parses, so the asker has nothing to ask for and stays |
| // quiet rather than reading the broken file as "no prove block" and guessing. |
| func TestMintAskerAsksNothingOnABrokenPolicy(t *testing.T) { |
| + t.Parallel() |
| a, asked, _, store, sha := mintAskerFixture(t, 20*time.Minute) |
| if err := os.WriteFile(a.policyPath, []byte(`{"schema":1,"prove":`), 0o644); err != nil { |
| t.Fatal(err) |
| @@ -218,6 +224,7 @@ func TestMintAskerAsksNothingOnABrokenPolicy(t *testing.T) { |
| // the fast set while it waits (at the gate's 30 s cadence), and leaves once |
| // it adopts. |
| func TestFastMembersKeepsAWaitingRoute(t *testing.T) { |
| + t.Parallel() |
| f := newFastFixture(t) |
| ctx := context.Background() |
| host := "edge.example.com" |
| @@ -289,6 +296,7 @@ func TestFastMembersKeepsAWaitingRoute(t *testing.T) { |
| // whose head is unproven waits like a staged one, and rejoins the sweep each |
| // time its 30 s miss runs out. Its unstaged backoff must not stretch that. |
| func TestFastMembersKeepsAnUnstagedWaitingRouteAtTheMissCadence(t *testing.T) { |
| + t.Parallel() |
| f := newFastFixture(t) |
| ctx := context.Background() |
| host := "new.example.com" |
| @@ -334,6 +342,7 @@ func TestFastMembersKeepsAnUnstagedWaitingRouteAtTheMissCadence(t *testing.T) { |
| // adoptHost returns before the gate) must not keep its host in the sweep |
| // every tick. It backs off like an unstaged route. |
| func TestFastMembersBacksOffAWaitTheSweepLeftStanding(t *testing.T) { |
| + t.Parallel() |
| f := newFastFixture(t) |
| ctx := context.Background() |
| host := "edge.example.com" |
diff --git a/internal/host/proofbinding_test.go b/internal/host/proofbinding_test.go| index 2e1252212..7383fcaa3 100644 |
| --- a/internal/host/proofbinding_test.go |
| +++ b/internal/host/proofbinding_test.go |
| @@ -171,6 +171,7 @@ func TestPlan14ProofBindingChangesAfterObservation(t *testing.T) { |
| } |
| func TestPlan14OrdinaryInstanceBinding(t *testing.T) { |
| + t.Parallel() |
| e, rt, rec, source := plan14ProofFixture(t) |
| rec.Addr, rec.Unit = "", "" |
| plan14PutRecord(t, e.store, rec) |
| @@ -198,6 +199,7 @@ func TestPlan14OrdinaryInstanceBinding(t *testing.T) { |
| } |
| func TestPlan14RootRestartDispatchFromRecord(t *testing.T) { |
| + t.Parallel() |
| e, rt, rec, source := plan14ProofFixture(t) |
| rec.Unit = "" |
| rt.Unit = "" |
| @@ -219,6 +221,7 @@ func TestPlan14RootRestartDispatchFromRecord(t *testing.T) { |
| } |
| func TestPlan14ProofClaimBinding(t *testing.T) { |
| + t.Parallel() |
| e, rt, rec, s := plan14ProofFixture(t) |
| observed := hostclaim.Observed{Host: rec.Host, ETag: "claim-one", Claim: &hostclaim.Claim{Host: rec.Host, Holder: &hostclaim.Holder{Key: provision.RecordKey(rec.Account, rec.App, rec.Host), Account: rec.Account, App: rec.App, Incarnation: "inc", Stamp: 1, Session: 1, WriterBox: "box"}, Op: hostclaim.Op{Kind: hostclaim.KindServing, Exec: "box"}}} |
| s.claim = func(context.Context, string) (hostclaim.Observed, error) { return observed, nil } |
diff --git a/internal/host/proofroot_test.go b/internal/host/proofroot_test.go| index eb5ec6749..b41b0e23a 100644 |
| --- a/internal/host/proofroot_test.go |
| +++ b/internal/host/proofroot_test.go |
| @@ -111,6 +111,7 @@ func (e *proofRootEnv) signed(t *testing.T, provenAt time.Time) *release.Proof { |
| } |
| func TestProofRootMintsWhenEveryConditionHolds(t *testing.T) { |
| + t.Parallel() |
| e := newProofRootEnv(t, provePolicy) |
| e.root.run(context.Background()) |
| p := e.proof(t) |
| @@ -153,6 +154,7 @@ func TestProofRootMintsPastAMovesHeldRefusal(t *testing.T) { |
| } |
| func TestProofRootNeverOverwritesAProof(t *testing.T) { |
| + t.Parallel() |
| e := newProofRootEnv(t, provePolicy) |
| first := e.signed(t, e.now.Add(-time.Minute)) |
| if err := release.PutProof(context.Background(), e.store, "bab", first); err != nil { |
| @@ -300,6 +302,7 @@ func TestProofRootHourlyLineWhenRequirementIsOff(t *testing.T) { |
| // hourly passes still leaves its trail. Deleting the whole file (the other |
| // break glass) is "off" too. |
| func TestProofRootRequireEntryLeavesTheMarker(t *testing.T) { |
| + t.Parallel() |
| e := newProofRootEnv(t, nil) |
| if err := os.WriteFile(e.root.policyPath, []byte(fmt.Sprintf( |
| `{"schema":1,"require":[{"app":"console","prover":"dev","key":%q}]}`, e.pubB64)), 0o644); err != nil { |
diff --git a/internal/host/relocatepass_round1_test.go b/internal/host/relocatepass_round1_test.go| index 8094f69c0..c7e0e6041 100644 |
| --- a/internal/host/relocatepass_round1_test.go |
| +++ b/internal/host/relocatepass_round1_test.go |
| @@ -66,6 +66,7 @@ func passRegistry(t *testing.T, hosts ...string) *registry.Registry { |
| // many rows. A pass that finds pending completions asks which box this is |
| // once, however many it finds. |
| func TestCompletionPassAsksNothingMoreWithNothingPending(t *testing.T) { |
| + t.Parallel() |
| ctx := t.Context() |
| store := &countingClaims{Store: release.NewDirStore(t.TempDir())} |
| for _, host := range []string{"a.example", "b.example", "c.example"} { |
diff --git a/internal/host/relocationfinish_unix_test.go b/internal/host/relocationfinish_unix_test.go| index 22aeed30c..ad651b0dc 100644 |
| --- a/internal/host/relocationfinish_unix_test.go |
| +++ b/internal/host/relocationfinish_unix_test.go |
| @@ -151,6 +151,7 @@ func (w *finishWorld) done(discharges int) { |
| // claim's record on every pass, whatever the row says, and every step |
| // resumes after a failure or a crash at any point, through the pass. |
| func TestRelocatePassFinishesACompletionFromItsRecord(t *testing.T) { |
| + t.Parallel() |
| t.Run("in one pass", func(t *testing.T) { |
| w := newFinishWorld(t) |
| w.pass() |
diff --git a/internal/host/relocationfirstwake_unix_test.go b/internal/host/relocationfirstwake_unix_test.go| index f16bc93ff..576c301d2 100644 |
| --- a/internal/host/relocationfirstwake_unix_test.go |
| +++ b/internal/host/relocationfirstwake_unix_test.go |
| @@ -37,6 +37,7 @@ import ( |
| // dials root at the fixed controlsock.Path, chowns its state directory to |
| // the carlos uid and needs a cgroup manager. Checklist item 12 is that run. |
| func TestCompletionPassThenFirstServingWakeWithRegionHAOff(t *testing.T) { |
| + t.Parallel() |
| ctx := t.Context() |
| f := newRecoveryFixture(t) |
| const box, op = "box-1", "rel-1" |
diff --git a/internal/host/relocationlanding_test.go b/internal/host/relocationlanding_test.go| index 8e33b24cb..938bb78a0 100644 |
| --- a/internal/host/relocationlanding_test.go |
| +++ b/internal/host/relocationlanding_test.go |
| @@ -155,6 +155,7 @@ func TestRelocatePassConvertsAFencedCommittedLanding(t *testing.T) { |
| // None of them writes the claim, though the move committed and its target |
| // is fenced. |
| func TestRelocatePassConversionRefusesAnUnauthorizedWorker(t *testing.T) { |
| + t.Parallel() |
| type tc struct { |
| name string |
| change func(*hostactors.Roster) |
diff --git a/internal/host/relocationreleasehold_test.go b/internal/host/relocationreleasehold_test.go| index aadd722fc..2f2ffe45d 100644 |
| --- a/internal/host/relocationreleasehold_test.go |
| +++ b/internal/host/relocationreleasehold_test.go |
| @@ -35,6 +35,7 @@ import ( |
| // done; a claim that does not serve on this box is left alone and is |
| // ErrChanged. |
| func TestRelocationReleaseHoldWaitsForDischarge(t *testing.T) { |
| + t.Parallel() |
| const host, box = "shop.example", "dst" |
| ctx := t.Context() |
| created := time.Date(2026, 10, 7, 0, 0, 0, 0, time.UTC) |
diff --git a/internal/host/rootexecution_migration_test.go b/internal/host/rootexecution_migration_test.go| index 76ee2f53c..54f2b3cf4 100644 |
| --- a/internal/host/rootexecution_migration_test.go |
| +++ b/internal/host/rootexecution_migration_test.go |
| @@ -159,6 +159,7 @@ func TestPlan14ExecutionRetainedSourceParticipation(t *testing.T) { |
| } |
| func TestPlan14ExecutionInstalledWithoutLaunchCleanup(t *testing.T) { |
| + t.Parallel() |
| for _, positive := range []bool{false, true} { |
| t.Run(fmt.Sprint(positive), func(t *testing.T) { |
| f, root, iq := plan14InstallRegistration(t, hostclaim.KindLanding, "checking") |
| @@ -230,6 +231,7 @@ func TestPlan14ExecutionRecoveryStartsCanonicalFence(t *testing.T) { |
| } |
| func TestPlan14ExecutionFirstSessionTransition(t *testing.T) { |
| + t.Parallel() |
| f, root, iq := plan14InstallRegistration(t, hostclaim.KindLanding, "checking") |
| q := executionExpectation(f.read().Claim) |
| before, err := root.executionAuthority(t.Context(), q, execlease.ControllerProcess{}) |
| @@ -259,6 +261,7 @@ func TestPlan14ExecutionFirstSessionTransition(t *testing.T) { |
| } |
| func TestPlan14ExecutionEstablishedSessionTransitionNeedsCleanup(t *testing.T) { |
| + t.Parallel() |
| for _, clean := range []bool{false, true} { |
| t.Run(fmt.Sprint(clean), func(t *testing.T) { |
| f, root, iq := plan14InstallRegistration(t, hostclaim.KindLanding, "checking") |
diff --git a/internal/host/runexec_linux_test.go b/internal/host/runexec_linux_test.go| index 842a67fa4..76b55e4cc 100644 |
| --- a/internal/host/runexec_linux_test.go |
| +++ b/internal/host/runexec_linux_test.go |
| @@ -238,6 +238,7 @@ func (c ctxStore) Put(ctx context.Context, key string, body []byte, ifMatch stri |
| } |
| func TestRunCancelledAfterLaunch(t *testing.T) { |
| + t.Parallel() |
| s := ctxStore{release.NewDirStore(t.TempDir())} |
| rec, req := pickedRun(t, s, 60) |
| done := instancectl.CmdStatus{State: instancectl.CmdDone, InvocationID: "inv1", Result: "exit-code", Status: "143", Code: "1"} |
| @@ -754,6 +755,7 @@ func (l *rechecksAfterSwitch) RunCmd(ctx context.Context, rt registry.Route, spe |
| // the run's own end, cancelled (130) or timed out (124), never "start |
| // failed" (re-review 7). |
| func TestRunEndedDuringThePostSwitchRecheckGetsItsOwnResult(t *testing.T) { |
| + t.Parallel() |
| t.Run("cancelled", func(t *testing.T) { |
| s := &blockOneRead{Store: release.NewDirStore(t.TempDir()), reading: make(chan struct{})} |
| rec, req := pickedRun(t, s, 60) |
diff --git a/internal/host/schedule_rearm_wake_test.go b/internal/host/schedule_rearm_wake_test.go| index 560861d41..4a3926478 100644 |
| --- a/internal/host/schedule_rearm_wake_test.go |
| +++ b/internal/host/schedule_rearm_wake_test.go |
| @@ -15,6 +15,7 @@ import ( |
| ) |
| func TestSleepingInstanceRearmsItsNextDeliveryBeforeReturning(t *testing.T) { |
| + t.Parallel() |
| const host = "rearm.bab.oncarlos.com" |
| const idle = 200 * time.Millisecond |
| entered := make(chan struct{}, 1) |
diff --git a/internal/host/schedule_wake_test.go b/internal/host/schedule_wake_test.go| index 4cd0d4109..3c14e09d1 100644 |
| --- a/internal/host/schedule_wake_test.go |
| +++ b/internal/host/schedule_wake_test.go |
| @@ -215,6 +215,7 @@ func wakeFixture(t *testing.T, host string, idle time.Duration, h http.HandlerFu |
| // this pins is that the runner's delivery leg drives that machinery correctly |
| // from a sleeping start. |
| func TestScheduledTickWakesASleepingInstanceAndItHibernatesAgain(t *testing.T) { |
| + t.Parallel() |
| const host = "sleepy.bab.oncarlos.com" |
| // The idle window is short so the test can watch a real hibernation. |
| const idle = 400 * time.Millisecond |
| @@ -389,6 +390,7 @@ func TestDeliveryReusesTheConnectionForASocket(t *testing.T) { |
| // Asserted by firing one: a once-row on a storeless box's registry is |
| // delivered to its instance and finishes. |
| func TestArmScheduleFiresOnceTimersWithNoDeployStore(t *testing.T) { |
| + t.Parallel() |
| const host = "storeless.bab.oncarlos.com" |
| served := make(chan struct{}, 1) |
| reg, _, svc, dd := wakeFixture(t, host, 30*time.Second, func(w http.ResponseWriter, r *http.Request) { |
| @@ -447,6 +449,7 @@ func TestArmScheduleFiresOnceTimersWithNoDeployStore(t *testing.T) { |
| // back for the same path, dropped when its delivery errors, and the whole map |
| // reset rather than grown past maxProxyCache. |
| func TestProxyCacheIsStableAndBounded(t *testing.T) { |
| + t.Parallel() |
| d := &activatorDeliverer{} |
| first := d.proxyFor("/run/carlos/a.sock") |
| if again := d.proxyFor("/run/carlos/a.sock"); again != first { |
| @@ -550,6 +553,7 @@ func TestUnixProxyKeepsTheShapeCloseIdleNeeds(t *testing.T) { |
| // leg alone. The sweep guard (which reads the timers table) would correctly |
| // hold a host awake for a tick due this soon, and that is Task 3's test. |
| func TestDeliveryDoesNotHoldTheInstanceAwake(t *testing.T) { |
| + t.Parallel() |
| const host = "ticky.bab.oncarlos.com" |
| const idle = 300 * time.Millisecond |
| reg, inst, svc, _ := wakeFixture(t, host, idle, func(w http.ResponseWriter, r *http.Request) { |
diff --git a/internal/host/systemapply_test.go b/internal/host/systemapply_test.go| index c76bf1a76..ee79416d8 100644 |
| --- a/internal/host/systemapply_test.go |
| +++ b/internal/host/systemapply_test.go |
| @@ -253,6 +253,7 @@ func TestApplyChannelComesFromRootNotTheRequest(t *testing.T) { |
| } |
| func TestApplyStaleTupleIsRefusedAgainstTheRequestsTuple(t *testing.T) { |
| + t.Parallel() |
| f := newApplyFixture(t, "stable", "v1") |
| old := f.promote("v2", []byte("x"), false) |
| time.Sleep(1100 * time.Millisecond) |
| @@ -907,6 +908,7 @@ func TestApplyRollbackRestartsTheRelay(t *testing.T) { |
| } |
| func TestApplyRollbackFailedLeavesPrevAndAppliedAlone(t *testing.T) { |
| + t.Parallel() |
| f, req := applyHappy(t) |
| writeJSONDurable(filepath.Join(systemRootDir(f.a.optDir), "applied.json"), systemApplied{Version: "v1", Channel: "stable", At: f.now}, 0o644) |
| f.edgeUp = false // never comes up, on either binary |
| @@ -1104,6 +1106,7 @@ func TestRecoveryAnswersTheJournalsVersionNotALaterRequest(t *testing.T) { |
| } |
| func TestRecoveryAnswersTheInterruptedPromoteNotTheRePromote(t *testing.T) { |
| + t.Parallel() |
| // v2 was interrupted; the operator re-promoted the same v2. The |
| // recovery's result must name the promote it recovered, or the retry |
| // arrives at a box that has already recorded it as rolled back. |
| @@ -1588,6 +1591,7 @@ func TestApplyInstallsAPostLayoutCandidateOverNestedRows(t *testing.T) { |
| // This is the box's own line of defence against `carlos system update |
| // --file`, which the console's guard does not judge. Flat rows let it in. |
| func TestApplyRefusesAMountedButBelowFloorCandidateOverANestedRow(t *testing.T) { |
| + t.Parallel() |
| for _, tc := range []struct { |
| name string |
| rows []registry.Route |
| @@ -1839,6 +1843,7 @@ func TestBootRecoveryUsesTheArmedFloorOffline(t *testing.T) { |
| // is written. The proof of "before": region HA defers this install at the |
| // step just ahead of the journal, and the two files are already there. |
| func TestDecidePrevWritesTheSidecarAndVerdictBeforeTheJournal(t *testing.T) { |
| + t.Parallel() |
| for _, tc := range []struct { |
| name, running string |
| held, verdict bool |
| @@ -2258,6 +2263,7 @@ func TestFirstFloorArmedDuringStagingRefusesTheRename(t *testing.T) { |
| // even on a box with no floor yet (it creates .moves for it), so the agent's |
| // first arming waits until the rename is done and cannot slip in between. |
| func TestFirstArmingWaitsForTheActivationLock(t *testing.T) { |
| + t.Parallel() |
| f, _ := floorFixture(t, "v0.31.0", "v0.32.0") |
| armed := make(chan error, 1) |
| f.a.beforeSwap = func() { |
diff --git a/internal/host/systemparticipation_test.go b/internal/host/systemparticipation_test.go| index 90731379a..ecdd03b7d 100644 |
| --- a/internal/host/systemparticipation_test.go |
| +++ b/internal/host/systemparticipation_test.go |
| @@ -43,6 +43,7 @@ func assertNotUpdated(t *testing.T, f *applyFixture, why string) { |
| // Spec §5.10: any controller record, in any state, refuses the update. |
| func TestApplyRefusesWhileThisBoxTakesPartInAClaimOperation(t *testing.T) { |
| + t.Parallel() |
| for _, state := range []string{"pending", "active", "lost"} { |
| t.Run(state, func(t *testing.T) { |
| f, _ := applyHappy(t) |
| @@ -58,6 +59,7 @@ func TestApplyRefusesWhileThisBoxTakesPartInAClaimOperation(t *testing.T) { |
| // Review Focus 4: what root cannot read is a refusal, never a pass. |
| func TestApplyRefusesWhenItCannotTellWhetherThisBoxTakesPart(t *testing.T) { |
| + t.Parallel() |
| cases := map[string]func(t *testing.T, f *applyFixture){ |
| "a temporary file": func(t *testing.T, f *applyFixture) { |
| os.WriteFile(filepath.Join(hostexec(t, f), ".shop.bab.test.json.tmp"), nil, 0o600) |