github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/storage/mock/test/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 //</624450121165180928> 11 12 13 //包测试提供用于测试的函数 14 //GlobalStrer实施。 15 package test 16 17 import ( 18 "bytes" 19 "fmt" 20 "io" 21 "strconv" 22 "testing" 23 24 "github.com/ethereum/go-ethereum/common" 25 "github.com/ethereum/go-ethereum/swarm/storage" 26 "github.com/ethereum/go-ethereum/swarm/storage/mock" 27 ) 28 29 //mockstore从提供的globalstorer创建nodestore实例, 30 //每个都有一个唯一的地址,在上面存储不同的块 31 //并检查它们是否可在所有节点上检索。 32 //属性n定义将创建的节点存储数。 33 func MockStore(t *testing.T, globalStore mock.GlobalStorer, n int) { 34 t.Run("GlobalStore", func(t *testing.T) { 35 addrs := make([]common.Address, n) 36 for i := 0; i < n; i++ { 37 addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) 38 } 39 40 for i, addr := range addrs { 41 chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...)) 42 data := []byte(strconv.FormatInt(int64(i)+1, 16)) 43 data = append(data, make([]byte, 4096-len(data))...) 44 globalStore.Put(addr, chunkAddr, data) 45 46 for _, cAddr := range addrs { 47 cData, err := globalStore.Get(cAddr, chunkAddr) 48 if cAddr == addr { 49 if err != nil { 50 t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err) 51 } 52 if !bytes.Equal(data, cData) { 53 t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData) 54 } 55 if !globalStore.HasKey(cAddr, chunkAddr) { 56 t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex()) 57 } 58 } else { 59 if err != mock.ErrNotFound { 60 t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err) 61 } 62 if len(cData) > 0 { 63 t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData) 64 } 65 if globalStore.HasKey(cAddr, chunkAddr) { 66 t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex()) 67 } 68 } 69 } 70 } 71 t.Run("delete", func(t *testing.T) { 72 chunkAddr := storage.Address([]byte("1234567890abcd")) 73 for _, addr := range addrs { 74 err := globalStore.Put(addr, chunkAddr, []byte("data")) 75 if err != nil { 76 t.Fatalf("put data to store %s key %s: %v", addr.Hex(), chunkAddr.Hex(), err) 77 } 78 } 79 firstNodeAddr := addrs[0] 80 if err := globalStore.Delete(firstNodeAddr, chunkAddr); err != nil { 81 t.Fatalf("delete from store %s key %s: %v", firstNodeAddr.Hex(), chunkAddr.Hex(), err) 82 } 83 for i, addr := range addrs { 84 _, err := globalStore.Get(addr, chunkAddr) 85 if i == 0 { 86 if err != mock.ErrNotFound { 87 t.Errorf("get data from store %s key %s: expected mock.ErrNotFound error, got %v", addr.Hex(), chunkAddr.Hex(), err) 88 } 89 } else { 90 if err != nil { 91 t.Errorf("get data from store %s key %s: %v", addr.Hex(), chunkAddr.Hex(), err) 92 } 93 } 94 } 95 }) 96 }) 97 98 t.Run("NodeStore", func(t *testing.T) { 99 nodes := make(map[common.Address]*mock.NodeStore) 100 for i := 0; i < n; i++ { 101 addr := common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) 102 nodes[addr] = globalStore.NewNodeStore(addr) 103 } 104 105 i := 0 106 for addr, store := range nodes { 107 i++ 108 chunkAddr := storage.Address(append(addr[:], []byte(fmt.Sprintf("%x", i))...)) 109 data := []byte(strconv.FormatInt(int64(i)+1, 16)) 110 data = append(data, make([]byte, 4096-len(data))...) 111 store.Put(chunkAddr, data) 112 113 for cAddr, cStore := range nodes { 114 cData, err := cStore.Get(chunkAddr) 115 if cAddr == addr { 116 if err != nil { 117 t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err) 118 } 119 if !bytes.Equal(data, cData) { 120 t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData) 121 } 122 if !globalStore.HasKey(cAddr, chunkAddr) { 123 t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex()) 124 } 125 } else { 126 if err != mock.ErrNotFound { 127 t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err) 128 } 129 if len(cData) > 0 { 130 t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData) 131 } 132 if globalStore.HasKey(cAddr, chunkAddr) { 133 t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex()) 134 } 135 } 136 } 137 } 138 t.Run("delete", func(t *testing.T) { 139 chunkAddr := storage.Address([]byte("1234567890abcd")) 140 var chosenStore *mock.NodeStore 141 for addr, store := range nodes { 142 if chosenStore == nil { 143 chosenStore = store 144 } 145 err := store.Put(chunkAddr, []byte("data")) 146 if err != nil { 147 t.Fatalf("put data to store %s key %s: %v", addr.Hex(), chunkAddr.Hex(), err) 148 } 149 } 150 if err := chosenStore.Delete(chunkAddr); err != nil { 151 t.Fatalf("delete key %s: %v", chunkAddr.Hex(), err) 152 } 153 for addr, store := range nodes { 154 _, err := store.Get(chunkAddr) 155 if store == chosenStore { 156 if err != mock.ErrNotFound { 157 t.Errorf("get data from store %s key %s: expected mock.ErrNotFound error, got %v", addr.Hex(), chunkAddr.Hex(), err) 158 } 159 } else { 160 if err != nil { 161 t.Errorf("get data from store %s key %s: %v", addr.Hex(), chunkAddr.Hex(), err) 162 } 163 } 164 } 165 }) 166 }) 167 } 168 169 //importexport将块保存到出口,将它们导出到tar存档, 170 //将tar存档导入到instore并检查是否正确导入了所有块。 171 func ImportExport(t *testing.T, outStore, inStore mock.GlobalStorer, n int) { 172 exporter, ok := outStore.(mock.Exporter) 173 if !ok { 174 t.Fatal("outStore does not implement mock.Exporter") 175 } 176 importer, ok := inStore.(mock.Importer) 177 if !ok { 178 t.Fatal("inStore does not implement mock.Importer") 179 } 180 addrs := make([]common.Address, n) 181 for i := 0; i < n; i++ { 182 addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) 183 } 184 185 for i, addr := range addrs { 186 chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...)) 187 data := []byte(strconv.FormatInt(int64(i)+1, 16)) 188 data = append(data, make([]byte, 4096-len(data))...) 189 outStore.Put(addr, chunkAddr, data) 190 } 191 192 r, w := io.Pipe() 193 defer r.Close() 194 195 exportErrChan := make(chan error) 196 go func() { 197 defer w.Close() 198 199 _, err := exporter.Export(w) 200 exportErrChan <- err 201 }() 202 203 if _, err := importer.Import(r); err != nil { 204 t.Fatalf("import: %v", err) 205 } 206 207 if err := <-exportErrChan; err != nil { 208 t.Fatalf("export: %v", err) 209 } 210 211 for i, addr := range addrs { 212 chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...)) 213 data := []byte(strconv.FormatInt(int64(i)+1, 16)) 214 data = append(data, make([]byte, 4096-len(data))...) 215 for _, cAddr := range addrs { 216 cData, err := inStore.Get(cAddr, chunkAddr) 217 if cAddr == addr { 218 if err != nil { 219 t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err) 220 } 221 if !bytes.Equal(data, cData) { 222 t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData) 223 } 224 if !inStore.HasKey(cAddr, chunkAddr) { 225 t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex()) 226 } 227 } else { 228 if err != mock.ErrNotFound { 229 t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err) 230 } 231 if len(cData) > 0 { 232 t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData) 233 } 234 if inStore.HasKey(cAddr, chunkAddr) { 235 t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex()) 236 } 237 } 238 } 239 } 240 } 241