github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/swarm/storage/mock/test/test.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 // 10 // 11 // 12 // 13 // 14 // 15 // 16 // 17 // 18 // 19 // 20 // 21 // 22 // 23 // 24 25 // 26 // 27 package test 28 29 import ( 30 "bytes" 31 "fmt" 32 "io" 33 "strconv" 34 "testing" 35 36 "github.com/ethereum/go-ethereum/common" 37 "github.com/ethereum/go-ethereum/swarm/storage" 38 "github.com/ethereum/go-ethereum/swarm/storage/mock" 39 ) 40 41 // 42 // 43 // 44 // 45 func MockStore(t *testing.T, globalStore mock.GlobalStorer, n int) { 46 t.Run("GlobalStore", func(t *testing.T) { 47 addrs := make([]common.Address, n) 48 for i := 0; i < n; i++ { 49 addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) 50 } 51 52 for i, addr := range addrs { 53 chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...)) 54 data := []byte(strconv.FormatInt(int64(i)+1, 16)) 55 data = append(data, make([]byte, 4096-len(data))...) 56 globalStore.Put(addr, chunkAddr, data) 57 58 for _, cAddr := range addrs { 59 cData, err := globalStore.Get(cAddr, chunkAddr) 60 if cAddr == addr { 61 if err != nil { 62 t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err) 63 } 64 if !bytes.Equal(data, cData) { 65 t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData) 66 } 67 if !globalStore.HasKey(cAddr, chunkAddr) { 68 t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex()) 69 } 70 } else { 71 if err != mock.ErrNotFound { 72 t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err) 73 } 74 if len(cData) > 0 { 75 t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData) 76 } 77 if globalStore.HasKey(cAddr, chunkAddr) { 78 t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex()) 79 } 80 } 81 } 82 } 83 }) 84 85 t.Run("NodeStore", func(t *testing.T) { 86 nodes := make(map[common.Address]*mock.NodeStore) 87 for i := 0; i < n; i++ { 88 addr := common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) 89 nodes[addr] = globalStore.NewNodeStore(addr) 90 } 91 92 i := 0 93 for addr, store := range nodes { 94 i++ 95 chunkAddr := storage.Address(append(addr[:], []byte(fmt.Sprintf("%x", i))...)) 96 data := []byte(strconv.FormatInt(int64(i)+1, 16)) 97 data = append(data, make([]byte, 4096-len(data))...) 98 store.Put(chunkAddr, data) 99 100 for cAddr, cStore := range nodes { 101 cData, err := cStore.Get(chunkAddr) 102 if cAddr == addr { 103 if err != nil { 104 t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err) 105 } 106 if !bytes.Equal(data, cData) { 107 t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData) 108 } 109 if !globalStore.HasKey(cAddr, chunkAddr) { 110 t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex()) 111 } 112 } else { 113 if err != mock.ErrNotFound { 114 t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err) 115 } 116 if len(cData) > 0 { 117 t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData) 118 } 119 if globalStore.HasKey(cAddr, chunkAddr) { 120 t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex()) 121 } 122 } 123 } 124 } 125 }) 126 } 127 128 // 129 // 130 func ImportExport(t *testing.T, outStore, inStore mock.GlobalStorer, n int) { 131 exporter, ok := outStore.(mock.Exporter) 132 if !ok { 133 t.Fatal("outStore does not implement mock.Exporter") 134 } 135 importer, ok := inStore.(mock.Importer) 136 if !ok { 137 t.Fatal("inStore does not implement mock.Importer") 138 } 139 addrs := make([]common.Address, n) 140 for i := 0; i < n; i++ { 141 addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) 142 } 143 144 for i, addr := range addrs { 145 chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...)) 146 data := []byte(strconv.FormatInt(int64(i)+1, 16)) 147 data = append(data, make([]byte, 4096-len(data))...) 148 outStore.Put(addr, chunkAddr, data) 149 } 150 151 r, w := io.Pipe() 152 defer r.Close() 153 154 go func() { 155 defer w.Close() 156 if _, err := exporter.Export(w); err != nil { 157 t.Fatalf("export: %v", err) 158 } 159 }() 160 161 if _, err := importer.Import(r); err != nil { 162 t.Fatalf("import: %v", err) 163 } 164 165 for i, addr := range addrs { 166 chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...)) 167 data := []byte(strconv.FormatInt(int64(i)+1, 16)) 168 data = append(data, make([]byte, 4096-len(data))...) 169 for _, cAddr := range addrs { 170 cData, err := inStore.Get(cAddr, chunkAddr) 171 if cAddr == addr { 172 if err != nil { 173 t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err) 174 } 175 if !bytes.Equal(data, cData) { 176 t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData) 177 } 178 if !inStore.HasKey(cAddr, chunkAddr) { 179 t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex()) 180 } 181 } else { 182 if err != mock.ErrNotFound { 183 t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err) 184 } 185 if len(cData) > 0 { 186 t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData) 187 } 188 if inStore.HasKey(cAddr, chunkAddr) { 189 t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex()) 190 } 191 } 192 } 193 } 194 }