80 lines
1.9 KiB
Go
80 lines
1.9 KiB
Go
package debug
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"sync"
|
|
"testing"
|
|
|
|
"gitea.maximumdirect.net/eric/notarius/internal/framework/pipeline"
|
|
)
|
|
|
|
func TestFilesystemRecorderWritesWithinTraceRoot(t *testing.T) {
|
|
root := t.TempDir()
|
|
recorder, err := NewFilesystemRecorder(root)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := recorder.WriteBytes("attempt/data", []byte("payload")); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
info, err := os.Stat(filepath.Join(root, "attempt", "data"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if info.Mode().Perm() != 0o600 {
|
|
t.Fatalf("mode=%#o", info.Mode().Perm())
|
|
}
|
|
if err := recorder.WriteBytes("../outside", nil); err == nil {
|
|
t.Fatal("accepted traversal")
|
|
}
|
|
}
|
|
|
|
func TestFilesystemRecorderPropagatesWriteFailures(t *testing.T) {
|
|
root := filepath.Join(t.TempDir(), "trace")
|
|
if err := os.WriteFile(root, []byte("not a directory"), 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
recorder, err := NewFilesystemRecorder(root)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := recorder.WriteBytes("attempt/data", []byte("payload")); err == nil {
|
|
t.Fatal("WriteBytes concealed a trace-root write failure")
|
|
}
|
|
}
|
|
|
|
func TestSynchronizedFilesystemRecorderSupportsConcurrentWrites(t *testing.T) {
|
|
root := t.TempDir()
|
|
recorder, err := NewFilesystemRecorder(root)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
recorder = pipeline.SynchronizedDebugRecorder(recorder)
|
|
|
|
const writes = 16
|
|
var wg sync.WaitGroup
|
|
errs := make(chan error, writes)
|
|
for i := 0; i < writes; i++ {
|
|
i := i
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
errs <- recorder.WriteBytes(fmt.Sprintf("attempt/%02d/data", i), []byte("payload"))
|
|
}()
|
|
}
|
|
wg.Wait()
|
|
close(errs)
|
|
for err := range errs {
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
for i := 0; i < writes; i++ {
|
|
if _, err := os.Stat(filepath.Join(root, "attempt", fmt.Sprintf("%02d", i), "data")); err != nil {
|
|
t.Fatalf("trace artifact %d: %v", i, err)
|
|
}
|
|
}
|
|
}
|