github.com/alpe/etcd@v0.1.2-0.20130915230056-09f31af88aeb/store/store_test.go (about) 1 package store 2 3 import ( 4 "encoding/json" 5 "testing" 6 "time" 7 ) 8 9 func TestStoreGetDelete(t *testing.T) { 10 11 s := CreateStore(100) 12 s.Set("foo", "bar", time.Unix(0, 0), 1) 13 res, err := s.Get("foo") 14 15 if err != nil { 16 t.Fatalf("Unknown error") 17 } 18 19 var result Response 20 json.Unmarshal(res, &result) 21 22 if result.Value != "bar" { 23 t.Fatalf("Cannot get stored value") 24 } 25 26 s.Delete("foo", 2) 27 _, err = s.Get("foo") 28 29 if err == nil { 30 t.Fatalf("Got deleted value") 31 } 32 } 33 34 func TestTestAndSet(t *testing.T) { 35 s := CreateStore(100) 36 s.Set("foo", "bar", time.Unix(0, 0), 1) 37 38 _, err := s.TestAndSet("foo", "barbar", "barbar", time.Unix(0, 0), 2) 39 40 if err == nil { 41 t.Fatalf("test bar == barbar should fail") 42 } 43 44 _, err = s.TestAndSet("foo", "bar", "barbar", time.Unix(0, 0), 3) 45 46 if err != nil { 47 t.Fatalf("test bar == bar should succeed") 48 } 49 50 _, err = s.TestAndSet("foo", "", "barbar", time.Unix(0, 0), 4) 51 52 if err == nil { 53 t.Fatalf("test empty == bar should fail") 54 } 55 56 _, err = s.TestAndSet("fooo", "bar", "barbar", time.Unix(0, 0), 5) 57 58 if err == nil { 59 t.Fatalf("test bar == non-existing key should fail") 60 } 61 62 _, err = s.TestAndSet("fooo", "", "bar", time.Unix(0, 0), 6) 63 64 if err != nil { 65 t.Fatalf("test empty == non-existing key should succeed") 66 } 67 68 } 69 70 func TestSaveAndRecovery(t *testing.T) { 71 72 s := CreateStore(100) 73 s.Set("foo", "bar", time.Unix(0, 0), 1) 74 s.Set("foo2", "bar2", time.Now().Add(time.Second*5), 2) 75 state, err := s.Save() 76 77 if err != nil { 78 t.Fatalf("Cannot Save %s", err) 79 } 80 81 newStore := CreateStore(100) 82 83 // wait for foo2 expires 84 time.Sleep(time.Second * 6) 85 86 newStore.Recovery(state) 87 88 res, err := newStore.Get("foo") 89 90 var result Response 91 json.Unmarshal(res, &result) 92 93 if result.Value != "bar" { 94 t.Fatalf("Recovery Fail") 95 } 96 97 res, err = newStore.Get("foo2") 98 99 if err == nil { 100 t.Fatalf("Get expired value") 101 } 102 103 s.Delete("foo", 3) 104 105 } 106 107 func TestExpire(t *testing.T) { 108 // test expire 109 s := CreateStore(100) 110 s.Set("foo", "bar", time.Now().Add(time.Second*1), 0) 111 time.Sleep(2 * time.Second) 112 113 _, err := s.Get("foo") 114 115 if err == nil { 116 t.Fatalf("Got expired value") 117 } 118 119 //test change expire time 120 s.Set("foo", "bar", time.Now().Add(time.Second*10), 1) 121 122 _, err = s.Get("foo") 123 124 if err != nil { 125 t.Fatalf("Cannot get Value") 126 } 127 128 s.Set("foo", "barbar", time.Now().Add(time.Second*1), 2) 129 130 time.Sleep(2 * time.Second) 131 132 _, err = s.Get("foo") 133 134 if err == nil { 135 t.Fatalf("Got expired value") 136 } 137 138 // test change expire to stable 139 s.Set("foo", "bar", time.Now().Add(time.Second*1), 3) 140 141 s.Set("foo", "bar", time.Unix(0, 0), 4) 142 143 time.Sleep(2 * time.Second) 144 145 _, err = s.Get("foo") 146 147 if err != nil { 148 t.Fatalf("Cannot get Value") 149 } 150 151 // test stable to expire 152 s.Set("foo", "bar", time.Now().Add(time.Second*1), 5) 153 time.Sleep(2 * time.Second) 154 _, err = s.Get("foo") 155 156 if err == nil { 157 t.Fatalf("Got expired value") 158 } 159 160 // test set older node 161 s.Set("foo", "bar", time.Now().Add(-time.Second*1), 6) 162 _, err = s.Get("foo") 163 164 if err == nil { 165 t.Fatalf("Got expired value") 166 } 167 168 } 169 170 func BenchmarkStoreSet(b *testing.B) { 171 s := CreateStore(100) 172 173 keys := GenKeys(10000, 5) 174 175 b.ResetTimer() 176 for i := 0; i < b.N; i++ { 177 178 for i, key := range keys { 179 s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i)) 180 } 181 182 s = CreateStore(100) 183 } 184 } 185 186 func BenchmarkStoreGet(b *testing.B) { 187 s := CreateStore(100) 188 189 keys := GenKeys(10000, 5) 190 191 for i, key := range keys { 192 s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i)) 193 } 194 195 b.ResetTimer() 196 for i := 0; i < b.N; i++ { 197 198 for _, key := range keys { 199 s.Get(key) 200 } 201 202 } 203 } 204 205 func BenchmarkStoreSnapshotCopy(b *testing.B) { 206 s := CreateStore(100) 207 208 keys := GenKeys(10000, 5) 209 210 for i, key := range keys { 211 s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i)) 212 } 213 214 var state []byte 215 216 b.ResetTimer() 217 for i := 0; i < b.N; i++ { 218 s.clone() 219 } 220 b.SetBytes(int64(len(state))) 221 } 222 223 func BenchmarkSnapshotSaveJson(b *testing.B) { 224 s := CreateStore(100) 225 226 keys := GenKeys(10000, 5) 227 228 for i, key := range keys { 229 s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i)) 230 } 231 232 var state []byte 233 234 b.ResetTimer() 235 for i := 0; i < b.N; i++ { 236 state, _ = s.Save() 237 } 238 b.SetBytes(int64(len(state))) 239 } 240 241 func BenchmarkSnapshotRecovery(b *testing.B) { 242 s := CreateStore(100) 243 244 keys := GenKeys(10000, 5) 245 246 for i, key := range keys { 247 s.Set(key, "barbarbarbarbar", time.Unix(0, 0), uint64(i)) 248 } 249 250 state, _ := s.Save() 251 252 b.ResetTimer() 253 for i := 0; i < b.N; i++ { 254 newStore := CreateStore(100) 255 newStore.Recovery(state) 256 } 257 b.SetBytes(int64(len(state))) 258 }