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  }