github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/swarm/storage/mock/test/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:49</date>
    10  //</624342682457608192>
    11  
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  //
    25  //
    26  //
    27  
    28  //
    29  //
    30  package test
    31  
    32  import (
    33  	"bytes"
    34  	"fmt"
    35  	"io"
    36  	"strconv"
    37  	"testing"
    38  
    39  	"github.com/ethereum/go-ethereum/common"
    40  	"github.com/ethereum/go-ethereum/swarm/storage"
    41  	"github.com/ethereum/go-ethereum/swarm/storage/mock"
    42  )
    43  
    44  //
    45  //
    46  //
    47  //
    48  func MockStore(t *testing.T, globalStore mock.GlobalStorer, n int) {
    49  	t.Run("GlobalStore", func(t *testing.T) {
    50  		addrs := make([]common.Address, n)
    51  		for i := 0; i < n; i++ {
    52  			addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16))
    53  		}
    54  
    55  		for i, addr := range addrs {
    56  			chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...))
    57  			data := []byte(strconv.FormatInt(int64(i)+1, 16))
    58  			data = append(data, make([]byte, 4096-len(data))...)
    59  			globalStore.Put(addr, chunkAddr, data)
    60  
    61  			for _, cAddr := range addrs {
    62  				cData, err := globalStore.Get(cAddr, chunkAddr)
    63  				if cAddr == addr {
    64  					if err != nil {
    65  						t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err)
    66  					}
    67  					if !bytes.Equal(data, cData) {
    68  						t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData)
    69  					}
    70  					if !globalStore.HasKey(cAddr, chunkAddr) {
    71  						t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex())
    72  					}
    73  				} else {
    74  					if err != mock.ErrNotFound {
    75  						t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err)
    76  					}
    77  					if len(cData) > 0 {
    78  						t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData)
    79  					}
    80  					if globalStore.HasKey(cAddr, chunkAddr) {
    81  						t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex())
    82  					}
    83  				}
    84  			}
    85  		}
    86  	})
    87  
    88  	t.Run("NodeStore", func(t *testing.T) {
    89  		nodes := make(map[common.Address]*mock.NodeStore)
    90  		for i := 0; i < n; i++ {
    91  			addr := common.HexToAddress(strconv.FormatInt(int64(i)+1, 16))
    92  			nodes[addr] = globalStore.NewNodeStore(addr)
    93  		}
    94  
    95  		i := 0
    96  		for addr, store := range nodes {
    97  			i++
    98  			chunkAddr := storage.Address(append(addr[:], []byte(fmt.Sprintf("%x", i))...))
    99  			data := []byte(strconv.FormatInt(int64(i)+1, 16))
   100  			data = append(data, make([]byte, 4096-len(data))...)
   101  			store.Put(chunkAddr, data)
   102  
   103  			for cAddr, cStore := range nodes {
   104  				cData, err := cStore.Get(chunkAddr)
   105  				if cAddr == addr {
   106  					if err != nil {
   107  						t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err)
   108  					}
   109  					if !bytes.Equal(data, cData) {
   110  						t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData)
   111  					}
   112  					if !globalStore.HasKey(cAddr, chunkAddr) {
   113  						t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex())
   114  					}
   115  				} else {
   116  					if err != mock.ErrNotFound {
   117  						t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err)
   118  					}
   119  					if len(cData) > 0 {
   120  						t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData)
   121  					}
   122  					if globalStore.HasKey(cAddr, chunkAddr) {
   123  						t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex())
   124  					}
   125  				}
   126  			}
   127  		}
   128  	})
   129  }
   130  
   131  //
   132  //
   133  func ImportExport(t *testing.T, outStore, inStore mock.GlobalStorer, n int) {
   134  	exporter, ok := outStore.(mock.Exporter)
   135  	if !ok {
   136  		t.Fatal("outStore does not implement mock.Exporter")
   137  	}
   138  	importer, ok := inStore.(mock.Importer)
   139  	if !ok {
   140  		t.Fatal("inStore does not implement mock.Importer")
   141  	}
   142  	addrs := make([]common.Address, n)
   143  	for i := 0; i < n; i++ {
   144  		addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16))
   145  	}
   146  
   147  	for i, addr := range addrs {
   148  		chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...))
   149  		data := []byte(strconv.FormatInt(int64(i)+1, 16))
   150  		data = append(data, make([]byte, 4096-len(data))...)
   151  		outStore.Put(addr, chunkAddr, data)
   152  	}
   153  
   154  	r, w := io.Pipe()
   155  	defer r.Close()
   156  
   157  	go func() {
   158  		defer w.Close()
   159  		if _, err := exporter.Export(w); err != nil {
   160  			t.Fatalf("export: %v", err)
   161  		}
   162  	}()
   163  
   164  	if _, err := importer.Import(r); err != nil {
   165  		t.Fatalf("import: %v", err)
   166  	}
   167  
   168  	for i, addr := range addrs {
   169  		chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...))
   170  		data := []byte(strconv.FormatInt(int64(i)+1, 16))
   171  		data = append(data, make([]byte, 4096-len(data))...)
   172  		for _, cAddr := range addrs {
   173  			cData, err := inStore.Get(cAddr, chunkAddr)
   174  			if cAddr == addr {
   175  				if err != nil {
   176  					t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err)
   177  				}
   178  				if !bytes.Equal(data, cData) {
   179  					t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData)
   180  				}
   181  				if !inStore.HasKey(cAddr, chunkAddr) {
   182  					t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex())
   183  				}
   184  			} else {
   185  				if err != mock.ErrNotFound {
   186  					t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err)
   187  				}
   188  				if len(cData) > 0 {
   189  					t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData)
   190  				}
   191  				if inStore.HasKey(cAddr, chunkAddr) {
   192  					t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex())
   193  				}
   194  			}
   195  		}
   196  	}
   197  }
   198