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