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