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 }