carlos / platform Public

umask-parallel

Squashed from umask-parallel into main.
claude agent, operated by paul@keymail.dev 4d6f0e6cad84622e0c03904783636f7785cd0320 parent 6f2af4c
72 files changed, +126 −10
  • internal/activator/activator_test.go +7 −10
  • internal/activator/claimrecord_linux_test.go +3 −0
  • internal/activator/cmdunit_test.go +1 −0
  • internal/activator/exec_gate_test.go +1 −0
  • internal/activator/generations_backend_test.go +1 −0
  • internal/activator/gensocket_rev19_test.go +2 −0
  • internal/activator/identity_test.go +3 −0
  • internal/activator/loglistener_test.go +1 −0
  • internal/activator/plan14_generation_backend_test.go +1 −0
  • internal/activator/swap_executed_test.go +2 −0
  • internal/activator/unitproc_gen_test.go +1 −0
  • internal/activator/unitproc_test.go +5 −0
  • internal/activator/wakecheck_claim_linux_test.go +1 −0
  • internal/activator/wakeplan_test.go +1 −0
  • internal/activator/wakerecord_refused_test.go +1 −0
  • internal/host/agent_layout_test.go +2 −0
  • internal/host/agent_test.go +4 −0
  • internal/host/claimhandover_recovery_test.go +1 −0
  • internal/host/claimparticipation_stale_test.go +1 −0
  • internal/host/claimretirerecovery_test.go +1 −0
  • internal/host/claimservingparksource_linux_test.go +1 −0
  • internal/host/converge_adopted_test.go +1 −0
  • internal/host/edgesclaims_test.go +2 −0
  • internal/host/guardtransaction_test.go +1 −0
  • internal/host/installchannel_identity_test.go +1 −0
  • internal/host/installchannel_policy_test.go +1 −0
  • internal/host/instancekeys_test.go +1 −0
  • internal/host/movescut_test.go +1 −0
  • internal/host/movescutguard_test.go +1 −0
  • internal/host/movesenvskew_test.go +1 −0
  • internal/host/movesfilescap_test.go +1 −0
  • internal/host/movesfinal_test.go +1 −0
  • internal/host/movesland_finalfix_test.go +1 −0
  • internal/host/movesland_test.go +1 −0
  • internal/host/movesphase1_test.go +1 −0
  • internal/host/movesprobe_test.go +2 −0
  • internal/host/movesreport_test.go +2 −0
  • internal/host/movesrevert_test.go +3 −0
  • internal/host/plan10_j2_adapter_test.go +4 −0
  • internal/host/plan10_j2_test.go +1 −0
  • internal/host/plan11_release_test.go +1 −0
  • internal/host/plan12_census_test.go +1 −0
  • internal/host/plan12_fix1_test.go +1 −0
  • internal/host/plan12_handover_test.go +1 −0
  • internal/host/plan12_restore_linux_test.go +1 −0
  • internal/host/plan14_create_participation_test.go +1 −0
  • internal/host/plan14_delete_participation_test.go +1 −0
  • internal/host/plan14_fix2_inventory_test.go +1 −0
  • internal/host/plan14_fix4_live_linux_test.go +1 −0
  • internal/host/plan14_incident_recipe_test.go +1 −0
  • internal/host/plan14_launch_verifier_test.go +1 −0
  • internal/host/plan14_recovery_without_health_test.go +1 −0
  • internal/host/plan14_restart_consumption_test.go +2 −0
  • internal/host/plan9_a_guard_test.go +1 −0
  • internal/host/plan9_d2_test.go +1 −0
  • internal/host/plan9_fix1_stop_test.go +1 −0
  • internal/host/plan9fix1_journal_linux_test.go +2 −0
  • internal/host/plan9fix2_inventory_linux_test.go +1 −0
  • internal/host/proofask_test.go +9 −0
  • internal/host/proofbinding_test.go +3 −0
  • internal/host/proofroot_test.go +3 −0
  • internal/host/relocatepass_round1_test.go +1 −0
  • internal/host/relocationfinish_unix_test.go +1 −0
  • internal/host/relocationfirstwake_unix_test.go +1 −0
  • internal/host/relocationlanding_test.go +1 −0
  • internal/host/relocationreleasehold_test.go +1 −0
  • internal/host/rootexecution_migration_test.go +3 −0
  • internal/host/runexec_linux_test.go +2 −0
  • internal/host/schedule_rearm_wake_test.go +1 −0
  • internal/host/schedule_wake_test.go +4 −0
  • internal/host/systemapply_test.go +6 −0
  • internal/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)