github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/swarm/state/dbstore_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  package state
    26  
    27  import (
    28  	"bytes"
    29  	"errors"
    30  	"io/ioutil"
    31  	"os"
    32  	"strings"
    33  	"testing"
    34  )
    35  
    36  var ErrInvalidArraySize = errors.New("invalid byte array size")
    37  var ErrInvalidValuePersisted = errors.New("invalid value was persisted to the db")
    38  
    39  type SerializingType struct {
    40  	key   string
    41  	value string
    42  }
    43  
    44  func (st *SerializingType) MarshalBinary() (data []byte, err error) {
    45  	d := []byte(strings.Join([]string{st.key, st.value}, ";"))
    46  
    47  	return d, nil
    48  }
    49  
    50  func (st *SerializingType) UnmarshalBinary(data []byte) (err error) {
    51  	d := bytes.Split(data, []byte(";"))
    52  	l := len(d)
    53  	if l == 0 {
    54  		return ErrInvalidArraySize
    55  	}
    56  	if l == 2 {
    57  		keyLen := len(d[0])
    58  		st.key = string(d[0][:keyLen])
    59  
    60  		valLen := len(d[1])
    61  		st.value = string(d[1][:valLen])
    62  	}
    63  
    64  	return nil
    65  }
    66  
    67  //
    68  func TestDBStore(t *testing.T) {
    69  	dir, err := ioutil.TempDir("", "db_store_test")
    70  	if err != nil {
    71  		panic(err)
    72  	}
    73  	defer os.RemoveAll(dir)
    74  
    75  	store, err := NewDBStore(dir)
    76  	if err != nil {
    77  		t.Fatal(err)
    78  	}
    79  
    80  	testStore(t, store)
    81  
    82  	store.Close()
    83  
    84  	persistedStore, err := NewDBStore(dir)
    85  	if err != nil {
    86  		t.Fatal(err)
    87  	}
    88  	defer persistedStore.Close()
    89  
    90  	testPersistedStore(t, persistedStore)
    91  }
    92  
    93  func testStore(t *testing.T, store Store) {
    94  	ser := &SerializingType{key: "key1", value: "value1"}
    95  	jsonify := []string{"a", "b", "c"}
    96  
    97  	err := store.Put(ser.key, ser)
    98  	if err != nil {
    99  		t.Fatal(err)
   100  	}
   101  
   102  	err = store.Put("key2", jsonify)
   103  	if err != nil {
   104  		t.Fatal(err)
   105  	}
   106  
   107  }
   108  
   109  func testPersistedStore(t *testing.T, store Store) {
   110  	ser := &SerializingType{}
   111  
   112  	err := store.Get("key1", ser)
   113  	if err != nil {
   114  		t.Fatal(err)
   115  	}
   116  
   117  	if ser.key != "key1" || ser.value != "value1" {
   118  		t.Fatal(ErrInvalidValuePersisted)
   119  	}
   120  
   121  	as := []string{}
   122  	err = store.Get("key2", &as)
   123  
   124  	if len(as) != 3 {
   125  		t.Fatalf("serialized array did not match expectation")
   126  	}
   127  	if as[0] != "a" || as[1] != "b" || as[2] != "c" {
   128  		t.Fatalf("elements serialized did not match expected values")
   129  	}
   130  }