github.com/safing/portbase@v0.19.5/database/storage/badger/badger_test.go (about)

     1  package badger
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"reflect"
     7  	"sync"
     8  	"testing"
     9  
    10  	"github.com/safing/portbase/database/query"
    11  	"github.com/safing/portbase/database/record"
    12  	"github.com/safing/portbase/database/storage"
    13  )
    14  
    15  var (
    16  	// Compile time interface checks.
    17  	_ storage.Interface  = &Badger{}
    18  	_ storage.Maintainer = &Badger{}
    19  )
    20  
    21  type TestRecord struct { //nolint:maligned
    22  	record.Base
    23  	sync.Mutex
    24  	S    string
    25  	I    int
    26  	I8   int8
    27  	I16  int16
    28  	I32  int32
    29  	I64  int64
    30  	UI   uint
    31  	UI8  uint8
    32  	UI16 uint16
    33  	UI32 uint32
    34  	UI64 uint64
    35  	F32  float32
    36  	F64  float64
    37  	B    bool
    38  }
    39  
    40  func TestBadger(t *testing.T) {
    41  	t.Parallel()
    42  
    43  	testDir, err := os.MkdirTemp("", "testing-")
    44  	if err != nil {
    45  		t.Fatal(err)
    46  	}
    47  	defer func() {
    48  		_ = os.RemoveAll(testDir) // clean up
    49  	}()
    50  
    51  	// start
    52  	db, err := NewBadger("test", testDir)
    53  	if err != nil {
    54  		t.Fatal(err)
    55  	}
    56  
    57  	a := &TestRecord{
    58  		S:    "banana",
    59  		I:    42,
    60  		I8:   42,
    61  		I16:  42,
    62  		I32:  42,
    63  		I64:  42,
    64  		UI:   42,
    65  		UI8:  42,
    66  		UI16: 42,
    67  		UI32: 42,
    68  		UI64: 42,
    69  		F32:  42.42,
    70  		F64:  42.42,
    71  		B:    true,
    72  	}
    73  	a.SetMeta(&record.Meta{})
    74  	a.Meta().Update()
    75  	a.SetKey("test:A")
    76  
    77  	// put record
    78  	_, err = db.Put(a)
    79  	if err != nil {
    80  		t.Fatal(err)
    81  	}
    82  
    83  	// get and compare
    84  	r1, err := db.Get("A")
    85  	if err != nil {
    86  		t.Fatal(err)
    87  	}
    88  
    89  	a1 := &TestRecord{}
    90  	err = record.Unwrap(r1, a1)
    91  	if err != nil {
    92  		t.Fatal(err)
    93  	}
    94  
    95  	if !reflect.DeepEqual(a, a1) {
    96  		t.Fatalf("mismatch, got %v", a1)
    97  	}
    98  
    99  	// test query
   100  	q := query.New("").MustBeValid()
   101  	it, err := db.Query(q, true, true)
   102  	if err != nil {
   103  		t.Fatal(err)
   104  	}
   105  	cnt := 0
   106  	for range it.Next {
   107  		cnt++
   108  	}
   109  	if it.Err() != nil {
   110  		t.Fatal(err)
   111  	}
   112  	if cnt != 1 {
   113  		t.Fatalf("unexpected query result count: %d", cnt)
   114  	}
   115  
   116  	// delete
   117  	err = db.Delete("A")
   118  	if err != nil {
   119  		t.Fatal(err)
   120  	}
   121  
   122  	// check if its gone
   123  	_, err = db.Get("A")
   124  	if err == nil {
   125  		t.Fatal("should fail")
   126  	}
   127  
   128  	// maintenance
   129  	maintainer, ok := db.(storage.Maintainer)
   130  	if ok {
   131  		err = maintainer.Maintain(context.TODO())
   132  		if err != nil {
   133  			t.Fatal(err)
   134  		}
   135  		err = maintainer.MaintainThorough(context.TODO())
   136  		if err != nil {
   137  			t.Fatal(err)
   138  		}
   139  	} else {
   140  		t.Fatal("should implement Maintainer")
   141  	}
   142  
   143  	// shutdown
   144  	err = db.Shutdown()
   145  	if err != nil {
   146  		t.Fatal(err)
   147  	}
   148  }