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