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