github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/swarm/storage/netstore_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:50</date> 10 //</624342684303101952> 11 12 // 13 // 14 // 15 // 16 // 17 // 18 // 19 // 20 // 21 // 22 // 23 // 24 // 25 // 26 // 27 28 package storage 29 30 import ( 31 "context" 32 "encoding/hex" 33 "errors" 34 "io/ioutil" 35 "testing" 36 "time" 37 38 "github.com/ethereum/go-ethereum/swarm/network" 39 ) 40 41 var ( 42 errUnknown = errors.New("unknown error") 43 ) 44 45 type mockRetrieve struct { 46 requests map[string]int 47 } 48 49 func NewMockRetrieve() *mockRetrieve { 50 return &mockRetrieve{requests: make(map[string]int)} 51 } 52 53 func newDummyChunk(addr Address) *Chunk { 54 chunk := NewChunk(addr, make(chan bool)) 55 chunk.SData = []byte{3, 4, 5} 56 chunk.Size = 3 57 58 return chunk 59 } 60 61 func (m *mockRetrieve) retrieve(ctx context.Context, chunk *Chunk) error { 62 hkey := hex.EncodeToString(chunk.Addr) 63 m.requests[hkey] += 1 64 65 // 66 if m.requests[hkey] == 2 { 67 return errUnknown 68 } 69 70 // 71 if m.requests[hkey] == 3 { 72 *chunk = *newDummyChunk(chunk.Addr) 73 go func() { 74 time.Sleep(100 * time.Millisecond) 75 close(chunk.ReqC) 76 }() 77 78 return nil 79 } 80 81 return nil 82 } 83 84 func TestNetstoreFailedRequest(t *testing.T) { 85 searchTimeout = 300 * time.Millisecond 86 87 // 88 addr := network.RandomAddr() // 89 90 // 91 datadir, err := ioutil.TempDir("", "netstore") 92 if err != nil { 93 t.Fatal(err) 94 } 95 params := NewDefaultLocalStoreParams() 96 params.Init(datadir) 97 params.BaseKey = addr.Over() 98 localStore, err := NewTestLocalStoreForAddr(params) 99 if err != nil { 100 t.Fatal(err) 101 } 102 103 r := NewMockRetrieve() 104 netStore := NewNetStore(localStore, r.retrieve) 105 106 key := Address{} 107 108 // 109 // 110 // 111 // 112 // 113 114 // 115 _, err = netStore.Get(context.TODO(), key) 116 if got := r.requests[hex.EncodeToString(key)]; got != 2 { 117 t.Fatalf("expected to have called retrieve two times, but got: %v", got) 118 } 119 if err != errUnknown { 120 t.Fatalf("expected to get an unknown error, but got: %s", err) 121 } 122 123 // 124 chunk, err := netStore.Get(context.TODO(), key) 125 if got := r.requests[hex.EncodeToString(key)]; got != 3 { 126 t.Fatalf("expected to have called retrieve three times, but got: %v", got) 127 } 128 if err != nil || chunk == nil { 129 t.Fatalf("expected to get a chunk but got: %v, %s", chunk, err) 130 } 131 if len(chunk.SData) != 3 { 132 t.Fatalf("expected to get a chunk with size 3, but got: %v", chunk.SData) 133 } 134 } 135