package frostfs // Tests for our FrostFS client code import ( "testing" "context" "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "sync" ) func openStorage(t *testing.T) *Storage { const ( cid_hardcoded = "348WWfBKbS79Wbmm38MRE3oBoEDM5Ga1XXbGKGNyisDM" endpoint_hardcoded = "grpc://localhost:8802" ) // We will use an ephemeral key to write to publicly writable container key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { t.Fatal(err) } storage, err := Open(endpoint_hardcoded, cid_hardcoded, 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() }