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  }