package frostfs // Tests for our FrostFS client code import ( "testing" "context" "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "os" "sync" ) // Initialize storage backend for tests func openStorage(t *testing.T) *Storage { cid := os.Getenv("FROSTFS_CID") // example: 348WWfBKbS79Wbmm38MRE3oBoEDM5Ga1XXbGKGNyisDM endpoint := os.Getenv("FROSTFS_ENDPOINT") // example: grpc://localhost:8802 if cid == "" || endpoint == "" { t.Skipf("one or more environment variables not set: FROSTFS_ENDPOINT, FROSTFS_CID") } key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) // TODO: using ephemeral keys for now, later read from env vars if err != nil { t.Fatal(err) } storage, err := Open(endpoint, cid, key) if err != nil { t.Fatal(err) } return storage } // Save some bytes to FrostFS and clean up after func TestObjectPutDelete(t *testing.T) { var payload = []byte("Hello FrostFS!\n") storage := openStorage(t) ctx, cancel := context.WithCancel(context.Background()) t.Cleanup(cancel) oid, err := storage.Save(ctx, payload, "FileName", "hello_from_sdk.txt", "Tag", "foobar") if err != nil { t.Fatal(err) } t.Logf("saved object: %s", oid) err = storage.Delete(ctx, oid) if err != nil { t.Fatal(err) } t.Logf("deleted object: %s", oid) } // Check that FrostFS is in fact a content addressable storage func TestMulipleObjects(t *testing.T) { var payload = []byte("Multiple objects with same content should get the same object ID") ctx, cancel := context.WithCancel(context.Background()) t.Cleanup(cancel) var wg sync.WaitGroup objects := make(chan string) go func() { baseline := "" for { select { case <-ctx.Done(): return case obj, ok := <-objects: if !ok { return } if baseline == "" { baseline = obj continue } if obj != baseline { t.Fatalf("non-identical object id: %s != %s", baseline, obj) } } } }() const testCount = 5 storage := openStorage(t) for i := 0; i < testCount; i++ { wg.Add(1) go func() { defer wg.Done() oid, err := storage.Save(ctx, payload, "FileName", "CAS.txt", "Tag", "test") if err != nil { t.Fatal(err) } err = storage.Delete(ctx, oid) if err != nil { t.Fatal(err) } t.Log(oid) }() } wg.Wait() }