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