github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/storage/filestore_test.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:45</date> 10 //</624450119827197952> 11 12 13 package storage 14 15 import ( 16 "bytes" 17 "context" 18 "io" 19 "io/ioutil" 20 "os" 21 "testing" 22 23 "github.com/ethereum/go-ethereum/swarm/testutil" 24 ) 25 26 const testDataSize = 0x0001000 27 28 func TestFileStorerandom(t *testing.T) { 29 testFileStoreRandom(false, t) 30 testFileStoreRandom(true, t) 31 } 32 33 func testFileStoreRandom(toEncrypt bool, t *testing.T) { 34 tdb, cleanup, err := newTestDbStore(false, false) 35 defer cleanup() 36 if err != nil { 37 t.Fatalf("init dbStore failed: %v", err) 38 } 39 db := tdb.LDBStore 40 db.setCapacity(50000) 41 memStore := NewMemStore(NewDefaultStoreParams(), db) 42 localStore := &LocalStore{ 43 memStore: memStore, 44 DbStore: db, 45 } 46 47 fileStore := NewFileStore(localStore, NewFileStoreParams()) 48 defer os.RemoveAll("/tmp/bzz") 49 50 slice := testutil.RandomBytes(1, testDataSize) 51 ctx := context.TODO() 52 key, wait, err := fileStore.Store(ctx, bytes.NewReader(slice), testDataSize, toEncrypt) 53 if err != nil { 54 t.Fatalf("Store error: %v", err) 55 } 56 err = wait(ctx) 57 if err != nil { 58 t.Fatalf("Store waitt error: %v", err.Error()) 59 } 60 resultReader, isEncrypted := fileStore.Retrieve(context.TODO(), key) 61 if isEncrypted != toEncrypt { 62 t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) 63 } 64 resultSlice := make([]byte, testDataSize) 65 n, err := resultReader.ReadAt(resultSlice, 0) 66 if err != io.EOF { 67 t.Fatalf("Retrieve error: %v", err) 68 } 69 if n != testDataSize { 70 t.Fatalf("Slice size error got %d, expected %d.", n, testDataSize) 71 } 72 if !bytes.Equal(slice, resultSlice) { 73 t.Fatalf("Comparison error.") 74 } 75 ioutil.WriteFile("/tmp/slice.bzz.16M", slice, 0666) 76 ioutil.WriteFile("/tmp/result.bzz.16M", resultSlice, 0666) 77 localStore.memStore = NewMemStore(NewDefaultStoreParams(), db) 78 resultReader, isEncrypted = fileStore.Retrieve(context.TODO(), key) 79 if isEncrypted != toEncrypt { 80 t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) 81 } 82 for i := range resultSlice { 83 resultSlice[i] = 0 84 } 85 n, err = resultReader.ReadAt(resultSlice, 0) 86 if err != io.EOF { 87 t.Fatalf("Retrieve error after removing memStore: %v", err) 88 } 89 if n != len(slice) { 90 t.Fatalf("Slice size error after removing memStore got %d, expected %d.", n, len(slice)) 91 } 92 if !bytes.Equal(slice, resultSlice) { 93 t.Fatalf("Comparison error after removing memStore.") 94 } 95 } 96 97 func TestFileStoreCapacity(t *testing.T) { 98 testFileStoreCapacity(false, t) 99 testFileStoreCapacity(true, t) 100 } 101 102 func testFileStoreCapacity(toEncrypt bool, t *testing.T) { 103 tdb, cleanup, err := newTestDbStore(false, false) 104 defer cleanup() 105 if err != nil { 106 t.Fatalf("init dbStore failed: %v", err) 107 } 108 db := tdb.LDBStore 109 memStore := NewMemStore(NewDefaultStoreParams(), db) 110 localStore := &LocalStore{ 111 memStore: memStore, 112 DbStore: db, 113 } 114 fileStore := NewFileStore(localStore, NewFileStoreParams()) 115 slice := testutil.RandomBytes(1, testDataSize) 116 ctx := context.TODO() 117 key, wait, err := fileStore.Store(ctx, bytes.NewReader(slice), testDataSize, toEncrypt) 118 if err != nil { 119 t.Errorf("Store error: %v", err) 120 } 121 err = wait(ctx) 122 if err != nil { 123 t.Fatalf("Store error: %v", err) 124 } 125 resultReader, isEncrypted := fileStore.Retrieve(context.TODO(), key) 126 if isEncrypted != toEncrypt { 127 t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) 128 } 129 resultSlice := make([]byte, len(slice)) 130 n, err := resultReader.ReadAt(resultSlice, 0) 131 if err != io.EOF { 132 t.Fatalf("Retrieve error: %v", err) 133 } 134 if n != len(slice) { 135 t.Fatalf("Slice size error got %d, expected %d.", n, len(slice)) 136 } 137 if !bytes.Equal(slice, resultSlice) { 138 t.Fatalf("Comparison error.") 139 } 140 //清除内存 141 memStore.setCapacity(0) 142 //检查它是否确实是空的 143 fileStore.ChunkStore = memStore 144 resultReader, isEncrypted = fileStore.Retrieve(context.TODO(), key) 145 if isEncrypted != toEncrypt { 146 t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) 147 } 148 if _, err = resultReader.ReadAt(resultSlice, 0); err == nil { 149 t.Fatalf("Was able to read %d bytes from an empty memStore.", len(slice)) 150 } 151 //检查它如何与本地商店一起工作 152 fileStore.ChunkStore = localStore 153 //localstore.dbstore.setCapacity(0) 154 resultReader, isEncrypted = fileStore.Retrieve(context.TODO(), key) 155 if isEncrypted != toEncrypt { 156 t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) 157 } 158 for i := range resultSlice { 159 resultSlice[i] = 0 160 } 161 n, err = resultReader.ReadAt(resultSlice, 0) 162 if err != io.EOF { 163 t.Fatalf("Retrieve error after clearing memStore: %v", err) 164 } 165 if n != len(slice) { 166 t.Fatalf("Slice size error after clearing memStore got %d, expected %d.", n, len(slice)) 167 } 168 if !bytes.Equal(slice, resultSlice) { 169 t.Fatalf("Comparison error after clearing memStore.") 170 } 171 } 172