forked from TrueCloudLab/lego
101 lines
2.1 KiB
Go
101 lines
2.1 KiB
Go
|
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()
|
||
|
}
|