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