github.com/susy-go/susy-graviton@v0.0.0-20190614130430-36cddae42305/swarm/storage/filestore_test.go (about) 1 // Copyleft 2016 The susy-graviton Authors 2 // This file is part of the susy-graviton library. 3 // 4 // The susy-graviton library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The susy-graviton library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MSRCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the susy-graviton library. If not, see <http://www.gnu.org/licenses/>. 16 17 package storage 18 19 import ( 20 "bytes" 21 "context" 22 "io" 23 "io/ioutil" 24 "os" 25 "testing" 26 27 "github.com/susy-go/susy-graviton/swarm/testutil" 28 ) 29 30 const testDataSize = 0x0001000 31 32 func TestFileStorerandom(t *testing.T) { 33 testFileStoreRandom(false, t) 34 testFileStoreRandom(true, t) 35 } 36 37 func testFileStoreRandom(toEncrypt bool, t *testing.T) { 38 tdb, cleanup, err := newTestDbStore(false, false) 39 defer cleanup() 40 if err != nil { 41 t.Fatalf("init dbStore failed: %v", err) 42 } 43 db := tdb.LDBStore 44 db.setCapacity(50000) 45 memStore := NewMemStore(NewDefaultStoreParams(), db) 46 localStore := &LocalStore{ 47 memStore: memStore, 48 DbStore: db, 49 } 50 51 fileStore := NewFileStore(localStore, NewFileStoreParams()) 52 defer os.RemoveAll("/tmp/bzz") 53 54 slice := testutil.RandomBytes(1, testDataSize) 55 ctx := context.TODO() 56 key, wait, err := fileStore.Store(ctx, bytes.NewReader(slice), testDataSize, toEncrypt) 57 if err != nil { 58 t.Fatalf("Store error: %v", err) 59 } 60 err = wait(ctx) 61 if err != nil { 62 t.Fatalf("Store waitt error: %v", err.Error()) 63 } 64 resultReader, isEncrypted := fileStore.Retrieve(context.TODO(), key) 65 if isEncrypted != toEncrypt { 66 t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) 67 } 68 resultSlice := make([]byte, testDataSize) 69 n, err := resultReader.ReadAt(resultSlice, 0) 70 if err != io.EOF { 71 t.Fatalf("Retrieve error: %v", err) 72 } 73 if n != testDataSize { 74 t.Fatalf("Slice size error got %d, expected %d.", n, testDataSize) 75 } 76 if !bytes.Equal(slice, resultSlice) { 77 t.Fatalf("Comparison error.") 78 } 79 ioutil.WriteFile("/tmp/slice.bzz.16M", slice, 0666) 80 ioutil.WriteFile("/tmp/result.bzz.16M", resultSlice, 0666) 81 localStore.memStore = NewMemStore(NewDefaultStoreParams(), db) 82 resultReader, isEncrypted = fileStore.Retrieve(context.TODO(), key) 83 if isEncrypted != toEncrypt { 84 t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) 85 } 86 for i := range resultSlice { 87 resultSlice[i] = 0 88 } 89 n, err = resultReader.ReadAt(resultSlice, 0) 90 if err != io.EOF { 91 t.Fatalf("Retrieve error after removing memStore: %v", err) 92 } 93 if n != len(slice) { 94 t.Fatalf("Slice size error after removing memStore got %d, expected %d.", n, len(slice)) 95 } 96 if !bytes.Equal(slice, resultSlice) { 97 t.Fatalf("Comparison error after removing memStore.") 98 } 99 } 100 101 func TestFileStoreCapacity(t *testing.T) { 102 testFileStoreCapacity(false, t) 103 testFileStoreCapacity(true, t) 104 } 105 106 func testFileStoreCapacity(toEncrypt bool, t *testing.T) { 107 tdb, cleanup, err := newTestDbStore(false, false) 108 defer cleanup() 109 if err != nil { 110 t.Fatalf("init dbStore failed: %v", err) 111 } 112 db := tdb.LDBStore 113 memStore := NewMemStore(NewDefaultStoreParams(), db) 114 localStore := &LocalStore{ 115 memStore: memStore, 116 DbStore: db, 117 } 118 fileStore := NewFileStore(localStore, NewFileStoreParams()) 119 slice := testutil.RandomBytes(1, testDataSize) 120 ctx := context.TODO() 121 key, wait, err := fileStore.Store(ctx, bytes.NewReader(slice), testDataSize, toEncrypt) 122 if err != nil { 123 t.Errorf("Store error: %v", err) 124 } 125 err = wait(ctx) 126 if err != nil { 127 t.Fatalf("Store error: %v", err) 128 } 129 resultReader, isEncrypted := fileStore.Retrieve(context.TODO(), key) 130 if isEncrypted != toEncrypt { 131 t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) 132 } 133 resultSlice := make([]byte, len(slice)) 134 n, err := resultReader.ReadAt(resultSlice, 0) 135 if err != io.EOF { 136 t.Fatalf("Retrieve error: %v", err) 137 } 138 if n != len(slice) { 139 t.Fatalf("Slice size error got %d, expected %d.", n, len(slice)) 140 } 141 if !bytes.Equal(slice, resultSlice) { 142 t.Fatalf("Comparison error.") 143 } 144 // Clear memStore 145 memStore.setCapacity(0) 146 // check whether it is, indeed, empty 147 fileStore.ChunkStore = memStore 148 resultReader, isEncrypted = fileStore.Retrieve(context.TODO(), key) 149 if isEncrypted != toEncrypt { 150 t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) 151 } 152 if _, err = resultReader.ReadAt(resultSlice, 0); err == nil { 153 t.Fatalf("Was able to read %d bytes from an empty memStore.", len(slice)) 154 } 155 // check how it works with localStore 156 fileStore.ChunkStore = localStore 157 // localStore.dbStore.setCapacity(0) 158 resultReader, isEncrypted = fileStore.Retrieve(context.TODO(), key) 159 if isEncrypted != toEncrypt { 160 t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) 161 } 162 for i := range resultSlice { 163 resultSlice[i] = 0 164 } 165 n, err = resultReader.ReadAt(resultSlice, 0) 166 if err != io.EOF { 167 t.Fatalf("Retrieve error after clearing memStore: %v", err) 168 } 169 if n != len(slice) { 170 t.Fatalf("Slice size error after clearing memStore got %d, expected %d.", n, len(slice)) 171 } 172 if !bytes.Equal(slice, resultSlice) { 173 t.Fatalf("Comparison error after clearing memStore.") 174 } 175 } 176 177 // TestGetAllReferences only tests that GetAllReferences returns an expected 178 // number of references for a given file 179 func TestGetAllReferences(t *testing.T) { 180 tdb, cleanup, err := newTestDbStore(false, false) 181 defer cleanup() 182 if err != nil { 183 t.Fatalf("init dbStore failed: %v", err) 184 } 185 db := tdb.LDBStore 186 memStore := NewMemStore(NewDefaultStoreParams(), db) 187 localStore := &LocalStore{ 188 memStore: memStore, 189 DbStore: db, 190 } 191 fileStore := NewFileStore(localStore, NewFileStoreParams()) 192 193 // testRuns[i] and expectedLen[i] are dataSize and expected length respectively 194 testRuns := []int{1024, 8192, 16000, 30000, 1000000} 195 expectedLens := []int{1, 3, 5, 9, 248} 196 for i, r := range testRuns { 197 slice := testutil.RandomBytes(1, r) 198 199 addrs, err := fileStore.GetAllReferences(context.Background(), bytes.NewReader(slice), false) 200 if err != nil { 201 t.Fatal(err) 202 } 203 if len(addrs) != expectedLens[i] { 204 t.Fatalf("Expected reference array length to be %d, but is %d", expectedLens[i], len(addrs)) 205 } 206 } 207 }