github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/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 19:16:45</date>
    10  //</624450121165180928>
    11  
    12  
    13  //包测试提供用于测试的函数
    14  //GlobalStrer实施。
    15  package test
    16  
    17  import (
    18  	"bytes"
    19  	"fmt"
    20  	"io"
    21  	"strconv"
    22  	"testing"
    23  
    24  	"github.com/ethereum/go-ethereum/common"
    25  	"github.com/ethereum/go-ethereum/swarm/storage"
    26  	"github.com/ethereum/go-ethereum/swarm/storage/mock"
    27  )
    28  
    29  //mockstore从提供的globalstorer创建nodestore实例,
    30  //每个都有一个唯一的地址,在上面存储不同的块
    31  //并检查它们是否可在所有节点上检索。
    32  //属性n定义将创建的节点存储数。
    33  func MockStore(t *testing.T, globalStore mock.GlobalStorer, n int) {
    34  	t.Run("GlobalStore", func(t *testing.T) {
    35  		addrs := make([]common.Address, n)
    36  		for i := 0; i < n; i++ {
    37  			addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16))
    38  		}
    39  
    40  		for i, addr := range addrs {
    41  			chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...))
    42  			data := []byte(strconv.FormatInt(int64(i)+1, 16))
    43  			data = append(data, make([]byte, 4096-len(data))...)
    44  			globalStore.Put(addr, chunkAddr, data)
    45  
    46  			for _, cAddr := range addrs {
    47  				cData, err := globalStore.Get(cAddr, chunkAddr)
    48  				if cAddr == addr {
    49  					if err != nil {
    50  						t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err)
    51  					}
    52  					if !bytes.Equal(data, cData) {
    53  						t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData)
    54  					}
    55  					if !globalStore.HasKey(cAddr, chunkAddr) {
    56  						t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex())
    57  					}
    58  				} else {
    59  					if err != mock.ErrNotFound {
    60  						t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err)
    61  					}
    62  					if len(cData) > 0 {
    63  						t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData)
    64  					}
    65  					if globalStore.HasKey(cAddr, chunkAddr) {
    66  						t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex())
    67  					}
    68  				}
    69  			}
    70  		}
    71  		t.Run("delete", func(t *testing.T) {
    72  			chunkAddr := storage.Address([]byte("1234567890abcd"))
    73  			for _, addr := range addrs {
    74  				err := globalStore.Put(addr, chunkAddr, []byte("data"))
    75  				if err != nil {
    76  					t.Fatalf("put data to store %s key %s: %v", addr.Hex(), chunkAddr.Hex(), err)
    77  				}
    78  			}
    79  			firstNodeAddr := addrs[0]
    80  			if err := globalStore.Delete(firstNodeAddr, chunkAddr); err != nil {
    81  				t.Fatalf("delete from store %s key %s: %v", firstNodeAddr.Hex(), chunkAddr.Hex(), err)
    82  			}
    83  			for i, addr := range addrs {
    84  				_, err := globalStore.Get(addr, chunkAddr)
    85  				if i == 0 {
    86  					if err != mock.ErrNotFound {
    87  						t.Errorf("get data from store %s key %s: expected mock.ErrNotFound error, got %v", addr.Hex(), chunkAddr.Hex(), err)
    88  					}
    89  				} else {
    90  					if err != nil {
    91  						t.Errorf("get data from store %s key %s: %v", addr.Hex(), chunkAddr.Hex(), err)
    92  					}
    93  				}
    94  			}
    95  		})
    96  	})
    97  
    98  	t.Run("NodeStore", func(t *testing.T) {
    99  		nodes := make(map[common.Address]*mock.NodeStore)
   100  		for i := 0; i < n; i++ {
   101  			addr := common.HexToAddress(strconv.FormatInt(int64(i)+1, 16))
   102  			nodes[addr] = globalStore.NewNodeStore(addr)
   103  		}
   104  
   105  		i := 0
   106  		for addr, store := range nodes {
   107  			i++
   108  			chunkAddr := storage.Address(append(addr[:], []byte(fmt.Sprintf("%x", i))...))
   109  			data := []byte(strconv.FormatInt(int64(i)+1, 16))
   110  			data = append(data, make([]byte, 4096-len(data))...)
   111  			store.Put(chunkAddr, data)
   112  
   113  			for cAddr, cStore := range nodes {
   114  				cData, err := cStore.Get(chunkAddr)
   115  				if cAddr == addr {
   116  					if err != nil {
   117  						t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err)
   118  					}
   119  					if !bytes.Equal(data, cData) {
   120  						t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData)
   121  					}
   122  					if !globalStore.HasKey(cAddr, chunkAddr) {
   123  						t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex())
   124  					}
   125  				} else {
   126  					if err != mock.ErrNotFound {
   127  						t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err)
   128  					}
   129  					if len(cData) > 0 {
   130  						t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData)
   131  					}
   132  					if globalStore.HasKey(cAddr, chunkAddr) {
   133  						t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex())
   134  					}
   135  				}
   136  			}
   137  		}
   138  		t.Run("delete", func(t *testing.T) {
   139  			chunkAddr := storage.Address([]byte("1234567890abcd"))
   140  			var chosenStore *mock.NodeStore
   141  			for addr, store := range nodes {
   142  				if chosenStore == nil {
   143  					chosenStore = store
   144  				}
   145  				err := store.Put(chunkAddr, []byte("data"))
   146  				if err != nil {
   147  					t.Fatalf("put data to store %s key %s: %v", addr.Hex(), chunkAddr.Hex(), err)
   148  				}
   149  			}
   150  			if err := chosenStore.Delete(chunkAddr); err != nil {
   151  				t.Fatalf("delete key %s: %v", chunkAddr.Hex(), err)
   152  			}
   153  			for addr, store := range nodes {
   154  				_, err := store.Get(chunkAddr)
   155  				if store == chosenStore {
   156  					if err != mock.ErrNotFound {
   157  						t.Errorf("get data from store %s key %s: expected mock.ErrNotFound error, got %v", addr.Hex(), chunkAddr.Hex(), err)
   158  					}
   159  				} else {
   160  					if err != nil {
   161  						t.Errorf("get data from store %s key %s: %v", addr.Hex(), chunkAddr.Hex(), err)
   162  					}
   163  				}
   164  			}
   165  		})
   166  	})
   167  }
   168  
   169  //importexport将块保存到出口,将它们导出到tar存档,
   170  //将tar存档导入到instore并检查是否正确导入了所有块。
   171  func ImportExport(t *testing.T, outStore, inStore mock.GlobalStorer, n int) {
   172  	exporter, ok := outStore.(mock.Exporter)
   173  	if !ok {
   174  		t.Fatal("outStore does not implement mock.Exporter")
   175  	}
   176  	importer, ok := inStore.(mock.Importer)
   177  	if !ok {
   178  		t.Fatal("inStore does not implement mock.Importer")
   179  	}
   180  	addrs := make([]common.Address, n)
   181  	for i := 0; i < n; i++ {
   182  		addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16))
   183  	}
   184  
   185  	for i, addr := range addrs {
   186  		chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...))
   187  		data := []byte(strconv.FormatInt(int64(i)+1, 16))
   188  		data = append(data, make([]byte, 4096-len(data))...)
   189  		outStore.Put(addr, chunkAddr, data)
   190  	}
   191  
   192  	r, w := io.Pipe()
   193  	defer r.Close()
   194  
   195  	exportErrChan := make(chan error)
   196  	go func() {
   197  		defer w.Close()
   198  
   199  		_, err := exporter.Export(w)
   200  		exportErrChan <- err
   201  	}()
   202  
   203  	if _, err := importer.Import(r); err != nil {
   204  		t.Fatalf("import: %v", err)
   205  	}
   206  
   207  	if err := <-exportErrChan; err != nil {
   208  		t.Fatalf("export: %v", err)
   209  	}
   210  
   211  	for i, addr := range addrs {
   212  		chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...))
   213  		data := []byte(strconv.FormatInt(int64(i)+1, 16))
   214  		data = append(data, make([]byte, 4096-len(data))...)
   215  		for _, cAddr := range addrs {
   216  			cData, err := inStore.Get(cAddr, chunkAddr)
   217  			if cAddr == addr {
   218  				if err != nil {
   219  					t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err)
   220  				}
   221  				if !bytes.Equal(data, cData) {
   222  					t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData)
   223  				}
   224  				if !inStore.HasKey(cAddr, chunkAddr) {
   225  					t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex())
   226  				}
   227  			} else {
   228  				if err != mock.ErrNotFound {
   229  					t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err)
   230  				}
   231  				if len(cData) > 0 {
   232  					t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData)
   233  				}
   234  				if inStore.HasKey(cAddr, chunkAddr) {
   235  					t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex())
   236  				}
   237  			}
   238  		}
   239  	}
   240  }
   241