// Package storagetest provides shared adapter checks. Use a dedicated test // bucket/root and a Store configured with a 64-byte object limit. package storagetest import ( "context" "errors" "git.yuntuo.hk/k2safe/go-omni/storage" "io" "strings" "testing" "time" ) func Run(t *testing.T, store storage.Store) { t.Helper() ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() key := "contract/文件 +%.txt" defer store.Delete(ctx, key) if _, err := store.Get(ctx, key); !errors.Is(err, storage.ErrNotFound) { t.Fatal("missing object", err) } for _, body := range []string{"original", "replacement"} { info, err := store.Put(ctx, key, strings.NewReader(body), int64(len(body)), "text/plain") if err != nil || info.Size != int64(len(body)) { t.Fatal(info, err) } object, err := store.Get(ctx, key) if err != nil { t.Fatal(err) } data, err := io.ReadAll(object.Body) object.Body.Close() if err != nil || string(data) != body || object.ContentType != "text/plain" { t.Fatal(string(data), object.Info, err) } } if _, err := store.Put(ctx, "tooBig", strings.NewReader(strings.Repeat("a", 65)), 65, "text/plain"); !errors.Is(err, storage.ErrTooLarge) { t.Fatal(err) } for _, size := range []int64{0, 2, 4} { if _, err := store.Put(ctx, "sizeMismatch", strings.NewReader("abc"), size, "text/plain"); err == nil { t.Fatalf("declared size %d accepted for 3 bytes", size) } } defer store.Delete(context.Background(), "sizeMismatch") for _, key := range []string{"../bad", "a/../b", "/absolute", "a//b", "a\\b"} { if _, err := store.Put(ctx, key, strings.NewReader("a"), 1, "text/plain"); err == nil { t.Fatal(key) } } canceled, cancelRequest := context.WithCancel(ctx) cancelRequest() if _, err := store.Get(canceled, key); !errors.Is(err, context.Canceled) { t.Fatal(err) } if err := store.Delete(ctx, key); err != nil { t.Fatal(err) } if err := store.Delete(ctx, key); err != nil { t.Fatal(err) } if _, err := store.Get(ctx, key); !errors.Is(err, storage.ErrNotFound) { t.Fatal(err) } }