github.com/annwntech/go-micro/v2@v2.9.5/store/memory/memory_test.go (about) 1 package memory 2 3 import ( 4 "fmt" 5 "os" 6 "testing" 7 "time" 8 9 "github.com/kr/pretty" 10 "github.com/annwntech/go-micro/v2/store" 11 ) 12 13 func TestMemoryReInit(t *testing.T) { 14 s := NewStore(store.Table("aaa")) 15 s.Init(store.Table("")) 16 if len(s.Options().Table) > 0 { 17 t.Error("Init didn't reinitialise the store") 18 } 19 } 20 21 func TestMemoryBasic(t *testing.T) { 22 s := NewStore() 23 s.Init() 24 basictest(s, t) 25 } 26 27 func TestMemoryPrefix(t *testing.T) { 28 s := NewStore() 29 s.Init(store.Table("some-prefix")) 30 basictest(s, t) 31 } 32 33 func TestMemoryNamespace(t *testing.T) { 34 s := NewStore() 35 s.Init(store.Database("some-namespace")) 36 basictest(s, t) 37 } 38 39 func TestMemoryNamespacePrefix(t *testing.T) { 40 s := NewStore() 41 s.Init(store.Table("some-prefix"), store.Database("some-namespace")) 42 basictest(s, t) 43 } 44 45 func basictest(s store.Store, t *testing.T) { 46 if len(os.Getenv("IN_TRAVIS_CI")) == 0 { 47 t.Logf("Testing store %s, with options %# v\n", s.String(), pretty.Formatter(s.Options())) 48 } 49 // Read and Write an expiring Record 50 if err := s.Write(&store.Record{ 51 Key: "Hello", 52 Value: []byte("World"), 53 Expiry: time.Millisecond * 100, 54 }); err != nil { 55 t.Error(err) 56 } 57 if r, err := s.Read("Hello"); err != nil { 58 t.Error(err) 59 } else { 60 if len(r) != 1 { 61 t.Error("Read returned multiple records") 62 } 63 if r[0].Key != "Hello" { 64 t.Errorf("Expected %s, got %s", "Hello", r[0].Key) 65 } 66 if string(r[0].Value) != "World" { 67 t.Errorf("Expected %s, got %s", "World", r[0].Value) 68 } 69 } 70 time.Sleep(time.Millisecond * 200) 71 if _, err := s.Read("Hello"); err != store.ErrNotFound { 72 t.Errorf("Expected %# v, got %# v", store.ErrNotFound, err) 73 } 74 75 // Write 3 records with various expiry and get with prefix 76 records := []*store.Record{ 77 &store.Record{ 78 Key: "foo", 79 Value: []byte("foofoo"), 80 }, 81 &store.Record{ 82 Key: "foobar", 83 Value: []byte("foobarfoobar"), 84 Expiry: time.Millisecond * 100, 85 }, 86 &store.Record{ 87 Key: "foobarbaz", 88 Value: []byte("foobarbazfoobarbaz"), 89 Expiry: 2 * time.Millisecond * 100, 90 }, 91 } 92 for _, r := range records { 93 if err := s.Write(r); err != nil { 94 t.Errorf("Couldn't write k: %s, v: %# v (%s)", r.Key, pretty.Formatter(r.Value), err) 95 } 96 } 97 if results, err := s.Read("foo", store.ReadPrefix()); err != nil { 98 t.Errorf("Couldn't read all \"foo\" keys, got %# v (%s)", pretty.Formatter(results), err) 99 } else { 100 if len(results) != 3 { 101 t.Errorf("Expected 3 items, got %d", len(results)) 102 } 103 if len(os.Getenv("IN_TRAVIS_CI")) == 0 { 104 t.Logf("Prefix test: %v\n", pretty.Formatter(results)) 105 } 106 } 107 time.Sleep(time.Millisecond * 100) 108 if results, err := s.Read("foo", store.ReadPrefix()); err != nil { 109 t.Errorf("Couldn't read all \"foo\" keys, got %# v (%s)", pretty.Formatter(results), err) 110 } else { 111 if len(results) != 2 { 112 t.Errorf("Expected 2 items, got %d", len(results)) 113 } 114 if len(os.Getenv("IN_TRAVIS_CI")) == 0 { 115 t.Logf("Prefix test: %v\n", pretty.Formatter(results)) 116 } 117 } 118 time.Sleep(time.Millisecond * 100) 119 if results, err := s.Read("foo", store.ReadPrefix()); err != nil { 120 t.Errorf("Couldn't read all \"foo\" keys, got %# v (%s)", pretty.Formatter(results), err) 121 } else { 122 if len(results) != 1 { 123 t.Errorf("Expected 1 item, got %d", len(results)) 124 } 125 if len(os.Getenv("IN_TRAVIS_CI")) == 0 { 126 t.Logf("Prefix test: %# v\n", pretty.Formatter(results)) 127 } 128 } 129 if err := s.Delete("foo", func(d *store.DeleteOptions) {}); err != nil { 130 t.Errorf("Delete failed (%v)", err) 131 } 132 if results, err := s.Read("foo", store.ReadPrefix()); err != nil { 133 t.Errorf("Couldn't read all \"foo\" keys, got %# v (%s)", pretty.Formatter(results), err) 134 } else { 135 if len(results) != 0 { 136 t.Errorf("Expected 0 items, got %d (%# v)", len(results), pretty.Formatter(results)) 137 } 138 } 139 140 // Write 3 records with various expiry and get with Suffix 141 records = []*store.Record{ 142 &store.Record{ 143 Key: "foo", 144 Value: []byte("foofoo"), 145 }, 146 &store.Record{ 147 Key: "barfoo", 148 Value: []byte("barfoobarfoo"), 149 Expiry: time.Millisecond * 100, 150 }, 151 &store.Record{ 152 Key: "bazbarfoo", 153 Value: []byte("bazbarfoobazbarfoo"), 154 Expiry: 2 * time.Millisecond * 100, 155 }, 156 } 157 for _, r := range records { 158 if err := s.Write(r); err != nil { 159 t.Errorf("Couldn't write k: %s, v: %# v (%s)", r.Key, pretty.Formatter(r.Value), err) 160 } 161 } 162 if results, err := s.Read("foo", store.ReadSuffix()); err != nil { 163 t.Errorf("Couldn't read all \"foo\" keys, got %# v (%s)", pretty.Formatter(results), err) 164 } else { 165 if len(results) != 3 { 166 t.Errorf("Expected 3 items, got %d", len(results)) 167 } 168 if len(os.Getenv("IN_TRAVIS_CI")) == 0 { 169 t.Logf("Prefix test: %v\n", pretty.Formatter(results)) 170 } 171 } 172 time.Sleep(time.Millisecond * 100) 173 if results, err := s.Read("foo", store.ReadSuffix()); err != nil { 174 t.Errorf("Couldn't read all \"foo\" keys, got %# v (%s)", pretty.Formatter(results), err) 175 } else { 176 if len(results) != 2 { 177 t.Errorf("Expected 2 items, got %d", len(results)) 178 } 179 if len(os.Getenv("IN_TRAVIS_CI")) == 0 { 180 t.Logf("Prefix test: %v\n", pretty.Formatter(results)) 181 } 182 } 183 time.Sleep(time.Millisecond * 100) 184 if results, err := s.Read("foo", store.ReadSuffix()); err != nil { 185 t.Errorf("Couldn't read all \"foo\" keys, got %# v (%s)", pretty.Formatter(results), err) 186 } else { 187 if len(results) != 1 { 188 t.Errorf("Expected 1 item, got %d", len(results)) 189 } 190 if len(os.Getenv("IN_TRAVIS_CI")) == 0 { 191 t.Logf("Prefix test: %# v\n", pretty.Formatter(results)) 192 } 193 } 194 if err := s.Delete("foo"); err != nil { 195 t.Errorf("Delete failed (%v)", err) 196 } 197 if results, err := s.Read("foo", store.ReadSuffix()); err != nil { 198 t.Errorf("Couldn't read all \"foo\" keys, got %# v (%s)", pretty.Formatter(results), err) 199 } else { 200 if len(results) != 0 { 201 t.Errorf("Expected 0 items, got %d (%# v)", len(results), pretty.Formatter(results)) 202 } 203 } 204 205 // Test Prefix, Suffix and WriteOptions 206 if err := s.Write(&store.Record{ 207 Key: "foofoobarbar", 208 Value: []byte("something"), 209 }, store.WriteTTL(time.Millisecond*100)); err != nil { 210 t.Error(err) 211 } 212 if err := s.Write(&store.Record{ 213 Key: "foofoo", 214 Value: []byte("something"), 215 }, store.WriteExpiry(time.Now().Add(time.Millisecond*100))); err != nil { 216 t.Error(err) 217 } 218 if err := s.Write(&store.Record{ 219 Key: "barbar", 220 Value: []byte("something"), 221 // TTL has higher precedence than expiry 222 }, store.WriteExpiry(time.Now().Add(time.Hour)), store.WriteTTL(time.Millisecond*100)); err != nil { 223 t.Error(err) 224 } 225 if results, err := s.Read("foo", store.ReadPrefix(), store.ReadSuffix()); err != nil { 226 t.Error(err) 227 } else { 228 if len(results) != 1 { 229 t.Errorf("Expected 1 results, got %d: %# v", len(results), pretty.Formatter(results)) 230 } 231 } 232 time.Sleep(time.Millisecond * 100) 233 if results, err := s.List(); err != nil { 234 t.Errorf("List failed: %s", err) 235 } else { 236 if len(results) != 0 { 237 t.Error("Expiry options were not effective") 238 } 239 } 240 s.Write(&store.Record{Key: "a", Value: []byte("a")}) 241 s.Write(&store.Record{Key: "aa", Value: []byte("aa")}) 242 s.Write(&store.Record{Key: "aaa", Value: []byte("aaa")}) 243 if results, err := s.Read("b", store.ReadPrefix()); err != nil { 244 t.Error(err) 245 } else { 246 if len(results) != 0 { 247 t.Errorf("Expected 0 results, got %d", len(results)) 248 } 249 } 250 251 s.Close() // reset the store 252 for i := 0; i < 10; i++ { 253 s.Write(&store.Record{ 254 Key: fmt.Sprintf("a%d", i), 255 Value: []byte{}, 256 }) 257 } 258 if results, err := s.Read("a", store.ReadLimit(5), store.ReadPrefix()); err != nil { 259 t.Error(err) 260 } else { 261 if len(results) != 5 { 262 t.Fatal("Expected 5 results, got ", len(results)) 263 } 264 if results[0].Key != "a0" { 265 t.Fatalf("Expected a0, got %s", results[0].Key) 266 } 267 if results[4].Key != "a4" { 268 t.Fatalf("Expected a4, got %s", results[4].Key) 269 } 270 } 271 if results, err := s.Read("a", store.ReadLimit(30), store.ReadOffset(5), store.ReadPrefix()); err != nil { 272 t.Error(err) 273 } else { 274 if len(results) != 5 { 275 t.Error("Expected 5 results, got ", len(results)) 276 } 277 } 278 }