diff --git a/internal/server/store/command_test.go b/internal/server/store/command_test.go index 33621c6..cdf0576 100644 --- a/internal/server/store/command_test.go +++ b/internal/server/store/command_test.go @@ -126,6 +126,37 @@ func TestClaimDispatchExpiresAndFencesRequeue_HP_DISPATCH_02(t *testing.T) { } } +func TestPendingStdinWaitsForDurableDispatch_HP_DISPATCH_06(t *testing.T) { + t.Parallel() + ctx := context.Background() + opened, err := Open(ctx, Options{DataDir: filepath.Join(t.TempDir(), "state"), BusyTimeout: time.Second}) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = opened.Close() }) + now := time.Date(2026, time.September, 11, 8, 50, 0, 0, time.UTC) + if _, err := opened.RegisterClientSession(ctx, ClientRegistration{ClientID: "stdin-client", Platform: 2, Architecture: "amd64", DaemonVersion: "test", DaemonCWD: `C:\\`, SupportedShells: []byte{1}, ClientInstanceID: [16]byte{41}, SessionID: [16]byte{42}, ConnectedAt: now}); err != nil { + t.Fatal(err) + } + issue := fixedStoreIssue(0x97) + if _, err := opened.QueueCommand(ctx, QueueCommandInput{IssueUUID: issue, ClientID: "stdin-client", IssueTime: now, ReceiptTime: now, ImmutableSHA256: sha256.Sum256([]byte("stdin ordering")), ExecutionSpec: []byte("spec")}); err != nil { + t.Fatal(err) + } + if _, err := opened.AppendStdin(ctx, StdinWriteInput{IssueUUID: issue, ClientID: "stdin-client", RequestUUID: fixedStoreIssue(0x98), Data: []byte("input"), ImmutableHash: sha256.Sum256([]byte("stdin append")), OccurredAt: now}); err != nil { + t.Fatal(err) + } + if pending, err := opened.PendingStdin(ctx, "stdin-client"); err != nil || len(pending) != 0 { + t.Fatalf("queued command exposed stdin = %#v, %v", pending, err) + } + if candidate, err := opened.ClaimNextDispatch(ctx, "stdin-client", 7, now); err != nil || candidate == nil || candidate.IssueUUID != issue { + t.Fatalf("dispatch claim = %#v, %v", candidate, err) + } + pending, err := opened.PendingStdin(ctx, "stdin-client") + if err != nil || len(pending) != 1 || pending[0].IssueUUID != issue || pending[0].WriteSeq != 1 || string(pending[0].Data) != "input" { + t.Fatalf("dispatched command stdin = %#v, %v", pending, err) + } +} + func TestLateDispatchAcceptanceAndEventRetainExpiryContradiction_BH_DISPATCH_09(t *testing.T) { t.Parallel() ctx := context.Background() diff --git a/test/coverage.toml b/test/coverage.toml index d470901..372e8e2 100644 --- a/test/coverage.toml +++ b/test/coverage.toml @@ -637,6 +637,12 @@ layer = "unit" status = "implemented" tests = ["internal/observability/rotate_test.go:TestFormatLogWritesStructuredBoundedRecords_HP_OPS_04"] +[[requirements]] +id = "HP-DISPATCH-10" +layer = "unit" +status = "implemented" +tests = ["internal/server/store/command_test.go:TestPendingStdinWaitsForDurableDispatch_HP_DISPATCH_06"] + [[requirements]] id = "HP-STORE-01" layer = "integration"