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