feat: add independent platform modules and multi-provider storage
This commit is contained in:
59
storage/storagetest/contract.go
Normal file
59
storage/storagetest/contract.go
Normal file
@@ -0,0 +1,59 @@
|
||||
// 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"
|
||||
)
|
||||
|
||||
func Run(t *testing.T, store storage.Store) {
|
||||
t.Helper()
|
||||
ctx := context.Background()
|
||||
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 _, 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, cancel := context.WithCancel(ctx)
|
||||
cancel()
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user