优化结构
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"io"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestComposeStreams(t *testing.T) {
|
||||
@@ -48,3 +49,62 @@ func TestComposeStreamsRemovesPartialDestination(t *testing.T) {
|
||||
t.Fatalf("compose error = %v, removed = %v", err, removed)
|
||||
}
|
||||
}
|
||||
|
||||
func TestComposeStreamsUnblocksProducerWhenDestinationFails(t *testing.T) {
|
||||
putErr := errors.New("destination failed")
|
||||
done := make(chan error, 1)
|
||||
go func() {
|
||||
_, err := composeStreams(context.Background(), []string{"large"}, func(context.Context, string) (io.ReadCloser, error) {
|
||||
return io.NopCloser(strings.NewReader(strings.Repeat("x", 1<<20))), nil
|
||||
}, func(context.Context, string, io.Reader) error {
|
||||
return putErr
|
||||
}, func(context.Context, string) error { return nil }, "out")
|
||||
done <- err
|
||||
}()
|
||||
|
||||
select {
|
||||
case err := <-done:
|
||||
if !errors.Is(err, putErr) {
|
||||
t.Fatalf("compose error = %v, want %v", err, putErr)
|
||||
}
|
||||
case <-time.After(time.Second):
|
||||
t.Fatal("compose remained blocked after destination failure")
|
||||
}
|
||||
}
|
||||
|
||||
func TestNormalizeDeletePrefix(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
value string
|
||||
valid string
|
||||
wantErr bool
|
||||
}{
|
||||
{name: "canonicalizes", value: "/uploads/chunks/", valid: "uploads/chunks"},
|
||||
{name: "cleans duplicate separators", value: "uploads//chunks", valid: "uploads/chunks"},
|
||||
{name: "rejects empty", value: " / ", wantErr: true},
|
||||
{name: "rejects traversal", value: "uploads/../", wantErr: true},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got, err := normalizeDeletePrefix(tt.value)
|
||||
if tt.wantErr {
|
||||
if err == nil {
|
||||
t.Fatalf("normalizeDeletePrefix(%q) succeeded with %q", tt.value, got)
|
||||
}
|
||||
return
|
||||
}
|
||||
if err != nil || got != tt.valid {
|
||||
t.Fatalf("normalizeDeletePrefix(%q) = %q, %v; want %q", tt.value, got, err, tt.valid)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestAdvanceDeletePrefixCursor(t *testing.T) {
|
||||
if _, err := advanceDeletePrefixCursor("cursor", "cursor", true); err == nil {
|
||||
t.Fatal("same cursor should fail")
|
||||
}
|
||||
if next, err := advanceDeletePrefixCursor("", "next", true); err != nil || next != "next" {
|
||||
t.Fatalf("advance cursor = %q, %v", next, err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user