Harden debug bundle filesystem collaborators

This commit is contained in:
2026-07-18 13:42:17 +00:00
parent 9746a42e04
commit 7bcce9953e
4 changed files with 184 additions and 4 deletions

View File

@@ -5,6 +5,9 @@ import (
"path/filepath"
"testing"
"time"
"gitea.maximumdirect.net/eric/notarius/internal/core/artifacts"
"gitea.maximumdirect.net/eric/notarius/internal/framework/contracts"
)
func TestAllocateCreatesRestrictiveSummaryAndTrace(t *testing.T) {
@@ -61,6 +64,80 @@ func TestAllocateRetriesAndDoesNotDeleteBundle(t *testing.T) {
t.Fatal(err)
}
}
func TestAllocateReturnsErrorAfterRunIDCollisionsAreExhausted(t *testing.T) {
parent := t.TempDir()
fixed := time.Unix(0, 99).UTC()
if err := os.Mkdir(filepath.Join(parent, "run-99"), 0o700); err != nil {
t.Fatal(err)
}
previous := utcNow
utcNow = func() time.Time { return fixed }
defer func() { utcNow = previous }()
if _, err := Allocate(parent); err == nil {
t.Fatal("Allocate succeeded after exhausting run ID collisions")
}
}
func TestSummaryWriterWritesEverySummaryArtifact(t *testing.T) {
bundle, err := Allocate(t.TempDir())
if err != nil {
t.Fatal(err)
}
summary := bundle.Summary()
if err := summary.WriteInvocation(Invocation{Operation: "run"}); err != nil {
t.Fatal(err)
}
if err := summary.WriteRedactedEffectiveConfig(testRedactedSummaryPayload{}); err != nil {
t.Fatal(err)
}
if err := summary.WriteResolvedPipeline(map[string]any{}); err != nil {
t.Fatal(err)
}
if err := summary.WriteResolvedReferences(nil); err != nil {
t.Fatal(err)
}
if err := summary.WriteCheckpointEvents(nil); err != nil {
t.Fatal(err)
}
if err := summary.WriteRunManifest(artifacts.RunManifest{RunID: bundle.RunID()}); err != nil {
t.Fatal(err)
}
if err := summary.WriteChunkPlan(artifacts.ChunkPlanSummary{}); err != nil {
t.Fatal(err)
}
if err := summary.WriteRunReport(RunReport{RunID: bundle.RunID(), PipelineID: "test"}); err != nil {
t.Fatal(err)
}
if err := summary.WriteWarnings([]contracts.Warning{{ReasonCode: "test"}}); err != nil {
t.Fatal(err)
}
if err := summary.WriteError("failed"); err != nil {
t.Fatal(err)
}
for _, name := range []string{
ArtifactInvocationMetadata,
ArtifactEffectiveConfig,
ArtifactResolvedPipeline,
ArtifactResolvedReferences,
ArtifactCheckpointEvents,
ArtifactRunManifest,
ArtifactChunkPlan,
ArtifactRunReport,
ArtifactWarnings,
ArtifactErrorLog,
} {
info, err := os.Stat(filepath.Join(bundle.SummaryRoot(), name))
if err != nil {
t.Fatalf("summary artifact %q: %v", name, err)
}
if info.Mode().Perm() != 0o600 {
t.Fatalf("summary artifact %q mode=%#o", name, info.Mode().Perm())
}
}
}
func TestSummaryWriterConfinesArtifacts(t *testing.T) {
bundle, err := Allocate(t.TempDir())
if err != nil {
@@ -73,3 +150,9 @@ func TestSummaryWriterConfinesArtifacts(t *testing.T) {
t.Fatal("accepted backslash")
}
}
type testRedactedSummaryPayload struct{}
func (testRedactedSummaryPayload) RedactedSummaryPayload() any {
return map[string]any{"redacted": true}
}