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 }