github.com/TeaOSLab/EdgeNode@v1.3.8/internal/utils/kvstore/store_test.go (about) 1 // Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 3 package kvstore_test 4 5 import ( 6 "github.com/TeaOSLab/EdgeNode/internal/utils/kvstore" 7 "github.com/cockroachdb/pebble" 8 "github.com/iwind/TeaGo/Tea" 9 "github.com/iwind/TeaGo/assert" 10 _ "github.com/iwind/TeaGo/bootstrap" 11 "sync" 12 "testing" 13 "time" 14 ) 15 16 func TestMain(m *testing.M) { 17 m.Run() 18 19 if testingStore != nil { 20 _ = testingStore.Close() 21 } 22 } 23 24 func TestStore_Default(t *testing.T) { 25 var a = assert.NewAssertion(t) 26 27 store, err := kvstore.DefaultStore() 28 if err != nil { 29 t.Fatal(err) 30 } 31 a.IsTrue(store != nil) 32 } 33 34 func TestStore_Default_Concurrent(t *testing.T) { 35 var lastStore *kvstore.Store 36 37 const threads = 32 38 39 var wg = &sync.WaitGroup{} 40 wg.Add(threads) 41 for i := 0; i < threads; i++ { 42 go func() { 43 defer wg.Done() 44 45 store, err := kvstore.DefaultStore() 46 if err != nil { 47 t.Log("ERROR", err) 48 t.Fail() 49 } 50 51 if lastStore != nil && lastStore != store { 52 t.Log("ERROR", "should be single instance") 53 t.Fail() 54 } 55 56 lastStore = store 57 }() 58 } 59 wg.Wait() 60 } 61 62 func TestStore_Open(t *testing.T) { 63 store, err := kvstore.OpenStore("test") 64 if err != nil { 65 t.Fatal(err) 66 } 67 defer func() { 68 _ = store.Close() 69 }() 70 71 t.Log("opened") 72 _ = store 73 } 74 75 func TestStore_Twice(t *testing.T) { 76 { 77 t.Log(1) 78 store, err := kvstore.OpenStore("test") 79 if err != nil { 80 t.Fatal(err) 81 } 82 _ = store.Close() 83 } 84 85 { 86 t.Log("2") 87 store, err := kvstore.OpenStore("test") 88 if err != nil { 89 t.Fatal(err) 90 } 91 defer func() { 92 _ = store.Close() 93 }() 94 } 95 96 t.Log("opened") 97 } 98 99 func TestStore_RawDB(t *testing.T) { 100 store, err := kvstore.OpenStore("test") 101 if err != nil { 102 t.Fatal(err) 103 } 104 defer func() { 105 _ = store.Close() 106 }() 107 108 err = store.RawDB().Set([]byte("hello"), []byte("world"), nil) 109 if err != nil { 110 t.Fatal(err) 111 } 112 } 113 114 func TestOpenStoreDir(t *testing.T) { 115 store, err := kvstore.OpenStoreDir(Tea.Root+"/data/stores", "test3") 116 if err != nil { 117 t.Fatal(err) 118 } 119 defer func() { 120 _ = store.Close() 121 }() 122 123 t.Log("opened") 124 125 _ = store 126 } 127 128 func TestStore_CloseTwice(t *testing.T) { 129 store, err := kvstore.OpenStore("test") 130 if err != nil { 131 t.Fatal(err) 132 } 133 defer func() { 134 for i := 0; i < 3; i++ { 135 err = store.Close() 136 if err != nil { 137 t.Fatal(err) 138 } 139 } 140 }() 141 } 142 143 func TestStore_Count(t *testing.T) { 144 testCountStore(t) 145 146 _ = testingStore.Close() 147 } 148 149 var testingStore *kvstore.Store 150 151 func testOpenStore(t *testing.T) *kvstore.DB { 152 var err error 153 testingStore, err = kvstore.OpenStore("test") 154 if err != nil { 155 t.Fatal(err) 156 } 157 158 db, err := testingStore.NewDB("db1") 159 if err != nil { 160 t.Fatal(err) 161 } 162 163 return db 164 } 165 166 func testOpenStoreTable[T any](t *testing.T, tableName string, encoder kvstore.ValueEncoder[T]) *kvstore.Table[T] { 167 var err error 168 169 var before = time.Now() 170 testingStore, err = kvstore.OpenStore("test") 171 if err != nil { 172 t.Fatal(err) 173 } 174 t.Log("store open cost:", time.Since(before).Seconds()*1000, "ms") 175 176 db, err := testingStore.NewDB("db1") 177 if err != nil { 178 t.Fatal(err) 179 } 180 181 table, err := kvstore.NewTable[T](tableName, encoder) 182 if err != nil { 183 t.Fatal(err) 184 } 185 db.AddTable(table) 186 187 return table 188 } 189 190 func testOpenStoreTableForBenchmark[T any](t *testing.B, tableName string, encoder kvstore.ValueEncoder[T]) *kvstore.Table[T] { 191 var err error 192 testingStore, err = kvstore.OpenStore("test") 193 if err != nil { 194 t.Fatal(err) 195 } 196 197 db, err := testingStore.NewDB("db1") 198 if err != nil { 199 t.Fatal(err) 200 } 201 202 table, err := kvstore.NewTable[T](tableName, encoder) 203 if err != nil { 204 t.Fatal(err) 205 } 206 db.AddTable(table) 207 208 return table 209 } 210 211 func testCountStore(t *testing.T) { 212 var err error 213 testingStore, err = kvstore.OpenStore("test") 214 if err != nil { 215 t.Fatal(err) 216 } 217 var count int 218 it, err := testingStore.RawDB().NewIter(&pebble.IterOptions{}) 219 if err != nil { 220 t.Fatal(err) 221 } 222 defer func() { 223 _ = it.Close() 224 }() 225 for it.First(); it.Valid(); it.Next() { 226 count++ 227 } 228 t.Log("count:", count) 229 }