github.com/bcskill/bcschain/v3@v3.4.9-beta2/ethdb/s3/s3_test.go (about) 1 // +build integration 2 3 package s3_test 4 5 import ( 6 "context" 7 "flag" 8 "fmt" 9 "io/ioutil" 10 "math/rand" 11 "os" 12 "path/filepath" 13 "reflect" 14 "testing" 15 "time" 16 17 "github.com/bcskill/bcschain/v3/ethdb" 18 "github.com/bcskill/bcschain/v3/ethdb/s3" 19 ) 20 21 var ( 22 endpoint = flag.String("endpoint", "", "s3 endpoint") 23 bucket = flag.String("bucket", "", "s3 bucket") 24 accessKeyID = flag.String("access-key-id", "", "access key id") 25 secretAccessKey = flag.String("secret-access-key", "", "secret access key") 26 ) 27 28 func init() { 29 rand.Seed(time.Now().UnixNano()) 30 } 31 32 func TestSegmentCompactor(t *testing.T) { 33 dir, err := ioutil.TempDir("", "") 34 if err != nil { 35 t.Fatal(err) 36 } 37 defer os.RemoveAll(dir) 38 39 // Open test segment. 40 table := fmt.Sprintf("gochain-s3-%x", rand.Intn(65536)) 41 ldb := ethdb.NewLDBSegment("1234", filepath.Join(dir, "1234")) 42 if err := ldb.Open(); err != nil { 43 t.Fatal(err) 44 } 45 defer ldb.Close() 46 47 // Write to segment. 48 if err := ldb.Put([]byte("foo"), []byte("bar")); err != nil { 49 t.Fatal(err) 50 } else if err := ldb.Put([]byte("baz"), []byte("bat")); err != nil { 51 t.Fatal(err) 52 } 53 54 // Compact and upload segment. 55 client := MustOpenClient() 56 sc := s3.NewSegmentCompactor(client) 57 segment, err := sc.CompactSegment(context.Background(), table, ldb) 58 if err != nil { 59 t.Fatal(err) 60 } 61 62 // Verify keys are accessible. 63 if v, err := segment.Get([]byte("baz")); err != nil { 64 t.Fatal(err) 65 } else if string(v) != "bat" { 66 t.Fatalf("unexpected value: %q", string(v)) 67 } 68 69 // Purge local data & retry key. 70 if err := segment.(*s3.Segment).Purge(); err != nil { 71 t.Fatal(err) 72 } 73 if v, err := segment.Get([]byte("baz")); err != nil { 74 t.Fatal(err) 75 } else if string(v) != "bat" { 76 t.Fatalf("unexpected value: %q", string(v)) 77 } 78 79 // Remove object from bucket. 80 if err := client.RemoveObject(context.Background(), s3.SegmentKey(table, ldb.Name())); err != nil { 81 t.Fatal(err) 82 } 83 } 84 85 func TestSegmentOpener_ListSegmentKeys(t *testing.T) { 86 dir, err := ioutil.TempDir("", "") 87 if err != nil { 88 t.Fatal(err) 89 } 90 defer os.RemoveAll(dir) 91 92 // Write objects to bucket. 93 table := fmt.Sprintf("gochain-s3-%x", rand.Intn(65536)) 94 client := MustOpenClient() 95 if _, err := client.PutObject(context.Background(), s3.SegmentKey(table, "0000"), []byte("foo")); err != nil { 96 t.Fatal(err) 97 } else if _, err := client.PutObject(context.Background(), s3.SegmentKey(table, "0001"), []byte("bar")); err != nil { 98 t.Fatal(err) 99 } 100 101 // List names. 102 so := s3.NewSegmentOpener(client) 103 if names, err := so.ListSegmentNames("", table); err != nil { 104 t.Fatal(err) 105 } else if !reflect.DeepEqual(names, []string{"0000", "0001"}) { 106 t.Fatalf("unexpected names: %#v", names) 107 } 108 109 // Remove objects from bucket. 110 if err := client.RemoveObject(context.Background(), s3.SegmentKey(table, "0000")); err != nil { 111 t.Fatal(err) 112 } else if err := client.RemoveObject(context.Background(), s3.SegmentKey(table, "0001")); err != nil { 113 t.Fatal(err) 114 } 115 } 116 117 // NewClient returns a client with the test flags set. 118 func NewClient() *s3.Client { 119 c := s3.NewClient() 120 c.Endpoint = *endpoint 121 c.Bucket = *bucket 122 c.AccessKeyID = *accessKeyID 123 c.SecretAccessKey = *secretAccessKey 124 return c 125 } 126 127 // MustOpenClient opens client using test flag arguments. 128 func MustOpenClient() *s3.Client { 129 c := NewClient() 130 if err := c.Open(); err != nil { 131 panic(err) 132 } 133 return c 134 }