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