github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/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 12:09:49</date> 10 //</624342682457608192> 11 12 // 13 // 14 // 15 // 16 // 17 // 18 // 19 // 20 // 21 // 22 // 23 // 24 // 25 // 26 // 27 28 // 29 // 30 package test 31 32 import ( 33 "bytes" 34 "fmt" 35 "io" 36 "strconv" 37 "testing" 38 39 "github.com/ethereum/go-ethereum/common" 40 "github.com/ethereum/go-ethereum/swarm/storage" 41 "github.com/ethereum/go-ethereum/swarm/storage/mock" 42 ) 43 44 // 45 // 46 // 47 // 48 func MockStore(t *testing.T, globalStore mock.GlobalStorer, n int) { 49 t.Run("GlobalStore", func(t *testing.T) { 50 addrs := make([]common.Address, n) 51 for i := 0; i < n; i++ { 52 addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) 53 } 54 55 for i, addr := range addrs { 56 chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...)) 57 data := []byte(strconv.FormatInt(int64(i)+1, 16)) 58 data = append(data, make([]byte, 4096-len(data))...) 59 globalStore.Put(addr, chunkAddr, data) 60 61 for _, cAddr := range addrs { 62 cData, err := globalStore.Get(cAddr, chunkAddr) 63 if cAddr == addr { 64 if err != nil { 65 t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err) 66 } 67 if !bytes.Equal(data, cData) { 68 t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData) 69 } 70 if !globalStore.HasKey(cAddr, chunkAddr) { 71 t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex()) 72 } 73 } else { 74 if err != mock.ErrNotFound { 75 t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err) 76 } 77 if len(cData) > 0 { 78 t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData) 79 } 80 if globalStore.HasKey(cAddr, chunkAddr) { 81 t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex()) 82 } 83 } 84 } 85 } 86 }) 87 88 t.Run("NodeStore", func(t *testing.T) { 89 nodes := make(map[common.Address]*mock.NodeStore) 90 for i := 0; i < n; i++ { 91 addr := common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) 92 nodes[addr] = globalStore.NewNodeStore(addr) 93 } 94 95 i := 0 96 for addr, store := range nodes { 97 i++ 98 chunkAddr := storage.Address(append(addr[:], []byte(fmt.Sprintf("%x", i))...)) 99 data := []byte(strconv.FormatInt(int64(i)+1, 16)) 100 data = append(data, make([]byte, 4096-len(data))...) 101 store.Put(chunkAddr, data) 102 103 for cAddr, cStore := range nodes { 104 cData, err := cStore.Get(chunkAddr) 105 if cAddr == addr { 106 if err != nil { 107 t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err) 108 } 109 if !bytes.Equal(data, cData) { 110 t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData) 111 } 112 if !globalStore.HasKey(cAddr, chunkAddr) { 113 t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex()) 114 } 115 } else { 116 if err != mock.ErrNotFound { 117 t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err) 118 } 119 if len(cData) > 0 { 120 t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData) 121 } 122 if globalStore.HasKey(cAddr, chunkAddr) { 123 t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex()) 124 } 125 } 126 } 127 } 128 }) 129 } 130 131 // 132 // 133 func ImportExport(t *testing.T, outStore, inStore mock.GlobalStorer, n int) { 134 exporter, ok := outStore.(mock.Exporter) 135 if !ok { 136 t.Fatal("outStore does not implement mock.Exporter") 137 } 138 importer, ok := inStore.(mock.Importer) 139 if !ok { 140 t.Fatal("inStore does not implement mock.Importer") 141 } 142 addrs := make([]common.Address, n) 143 for i := 0; i < n; i++ { 144 addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) 145 } 146 147 for i, addr := range addrs { 148 chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...)) 149 data := []byte(strconv.FormatInt(int64(i)+1, 16)) 150 data = append(data, make([]byte, 4096-len(data))...) 151 outStore.Put(addr, chunkAddr, data) 152 } 153 154 r, w := io.Pipe() 155 defer r.Close() 156 157 go func() { 158 defer w.Close() 159 if _, err := exporter.Export(w); err != nil { 160 t.Fatalf("export: %v", err) 161 } 162 }() 163 164 if _, err := importer.Import(r); err != nil { 165 t.Fatalf("import: %v", err) 166 } 167 168 for i, addr := range addrs { 169 chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...)) 170 data := []byte(strconv.FormatInt(int64(i)+1, 16)) 171 data = append(data, make([]byte, 4096-len(data))...) 172 for _, cAddr := range addrs { 173 cData, err := inStore.Get(cAddr, chunkAddr) 174 if cAddr == addr { 175 if err != nil { 176 t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err) 177 } 178 if !bytes.Equal(data, cData) { 179 t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData) 180 } 181 if !inStore.HasKey(cAddr, chunkAddr) { 182 t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex()) 183 } 184 } else { 185 if err != mock.ErrNotFound { 186 t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err) 187 } 188 if len(cData) > 0 { 189 t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData) 190 } 191 if inStore.HasKey(cAddr, chunkAddr) { 192 t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex()) 193 } 194 } 195 } 196 } 197 } 198