github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/storage/filestore_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  //</624450119827197952>
    11  
    12  
    13  package storage
    14  
    15  import (
    16  	"bytes"
    17  	"context"
    18  	"io"
    19  	"io/ioutil"
    20  	"os"
    21  	"testing"
    22  
    23  	"github.com/ethereum/go-ethereum/swarm/testutil"
    24  )
    25  
    26  const testDataSize = 0x0001000
    27  
    28  func TestFileStorerandom(t *testing.T) {
    29  	testFileStoreRandom(false, t)
    30  	testFileStoreRandom(true, t)
    31  }
    32  
    33  func testFileStoreRandom(toEncrypt bool, t *testing.T) {
    34  	tdb, cleanup, err := newTestDbStore(false, false)
    35  	defer cleanup()
    36  	if err != nil {
    37  		t.Fatalf("init dbStore failed: %v", err)
    38  	}
    39  	db := tdb.LDBStore
    40  	db.setCapacity(50000)
    41  	memStore := NewMemStore(NewDefaultStoreParams(), db)
    42  	localStore := &LocalStore{
    43  		memStore: memStore,
    44  		DbStore:  db,
    45  	}
    46  
    47  	fileStore := NewFileStore(localStore, NewFileStoreParams())
    48  	defer os.RemoveAll("/tmp/bzz")
    49  
    50  	slice := testutil.RandomBytes(1, testDataSize)
    51  	ctx := context.TODO()
    52  	key, wait, err := fileStore.Store(ctx, bytes.NewReader(slice), testDataSize, toEncrypt)
    53  	if err != nil {
    54  		t.Fatalf("Store error: %v", err)
    55  	}
    56  	err = wait(ctx)
    57  	if err != nil {
    58  		t.Fatalf("Store waitt error: %v", err.Error())
    59  	}
    60  	resultReader, isEncrypted := fileStore.Retrieve(context.TODO(), key)
    61  	if isEncrypted != toEncrypt {
    62  		t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted)
    63  	}
    64  	resultSlice := make([]byte, testDataSize)
    65  	n, err := resultReader.ReadAt(resultSlice, 0)
    66  	if err != io.EOF {
    67  		t.Fatalf("Retrieve error: %v", err)
    68  	}
    69  	if n != testDataSize {
    70  		t.Fatalf("Slice size error got %d, expected %d.", n, testDataSize)
    71  	}
    72  	if !bytes.Equal(slice, resultSlice) {
    73  		t.Fatalf("Comparison error.")
    74  	}
    75  	ioutil.WriteFile("/tmp/slice.bzz.16M", slice, 0666)
    76  	ioutil.WriteFile("/tmp/result.bzz.16M", resultSlice, 0666)
    77  	localStore.memStore = NewMemStore(NewDefaultStoreParams(), db)
    78  	resultReader, isEncrypted = fileStore.Retrieve(context.TODO(), key)
    79  	if isEncrypted != toEncrypt {
    80  		t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted)
    81  	}
    82  	for i := range resultSlice {
    83  		resultSlice[i] = 0
    84  	}
    85  	n, err = resultReader.ReadAt(resultSlice, 0)
    86  	if err != io.EOF {
    87  		t.Fatalf("Retrieve error after removing memStore: %v", err)
    88  	}
    89  	if n != len(slice) {
    90  		t.Fatalf("Slice size error after removing memStore got %d, expected %d.", n, len(slice))
    91  	}
    92  	if !bytes.Equal(slice, resultSlice) {
    93  		t.Fatalf("Comparison error after removing memStore.")
    94  	}
    95  }
    96  
    97  func TestFileStoreCapacity(t *testing.T) {
    98  	testFileStoreCapacity(false, t)
    99  	testFileStoreCapacity(true, t)
   100  }
   101  
   102  func testFileStoreCapacity(toEncrypt bool, t *testing.T) {
   103  	tdb, cleanup, err := newTestDbStore(false, false)
   104  	defer cleanup()
   105  	if err != nil {
   106  		t.Fatalf("init dbStore failed: %v", err)
   107  	}
   108  	db := tdb.LDBStore
   109  	memStore := NewMemStore(NewDefaultStoreParams(), db)
   110  	localStore := &LocalStore{
   111  		memStore: memStore,
   112  		DbStore:  db,
   113  	}
   114  	fileStore := NewFileStore(localStore, NewFileStoreParams())
   115  	slice := testutil.RandomBytes(1, testDataSize)
   116  	ctx := context.TODO()
   117  	key, wait, err := fileStore.Store(ctx, bytes.NewReader(slice), testDataSize, toEncrypt)
   118  	if err != nil {
   119  		t.Errorf("Store error: %v", err)
   120  	}
   121  	err = wait(ctx)
   122  	if err != nil {
   123  		t.Fatalf("Store error: %v", err)
   124  	}
   125  	resultReader, isEncrypted := fileStore.Retrieve(context.TODO(), key)
   126  	if isEncrypted != toEncrypt {
   127  		t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted)
   128  	}
   129  	resultSlice := make([]byte, len(slice))
   130  	n, err := resultReader.ReadAt(resultSlice, 0)
   131  	if err != io.EOF {
   132  		t.Fatalf("Retrieve error: %v", err)
   133  	}
   134  	if n != len(slice) {
   135  		t.Fatalf("Slice size error got %d, expected %d.", n, len(slice))
   136  	}
   137  	if !bytes.Equal(slice, resultSlice) {
   138  		t.Fatalf("Comparison error.")
   139  	}
   140  //清除内存
   141  	memStore.setCapacity(0)
   142  //检查它是否确实是空的
   143  	fileStore.ChunkStore = memStore
   144  	resultReader, isEncrypted = fileStore.Retrieve(context.TODO(), key)
   145  	if isEncrypted != toEncrypt {
   146  		t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted)
   147  	}
   148  	if _, err = resultReader.ReadAt(resultSlice, 0); err == nil {
   149  		t.Fatalf("Was able to read %d bytes from an empty memStore.", len(slice))
   150  	}
   151  //检查它如何与本地商店一起工作
   152  	fileStore.ChunkStore = localStore
   153  //localstore.dbstore.setCapacity(0)
   154  	resultReader, isEncrypted = fileStore.Retrieve(context.TODO(), key)
   155  	if isEncrypted != toEncrypt {
   156  		t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted)
   157  	}
   158  	for i := range resultSlice {
   159  		resultSlice[i] = 0
   160  	}
   161  	n, err = resultReader.ReadAt(resultSlice, 0)
   162  	if err != io.EOF {
   163  		t.Fatalf("Retrieve error after clearing memStore: %v", err)
   164  	}
   165  	if n != len(slice) {
   166  		t.Fatalf("Slice size error after clearing memStore got %d, expected %d.", n, len(slice))
   167  	}
   168  	if !bytes.Equal(slice, resultSlice) {
   169  		t.Fatalf("Comparison error after clearing memStore.")
   170  	}
   171  }
   172