You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
5.4 KiB
215 lines
5.4 KiB
package bolt
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/stretchr/testify/assert"
|
|
"go.etcd.io/bbolt"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestIndex(t *testing.T) {
|
|
ns := time.Now().Nanosecond()
|
|
path := fmt.Sprintf("/tmp/stufflog_idx_test_%s_%d.db", time.Now().Format("20060102150405"), ns)
|
|
db, err := bbolt.Open(path, 0744, nil)
|
|
if err != nil {
|
|
t.Fatal("Failed to open db:", err)
|
|
}
|
|
|
|
idx, err := newIndex(db, "idx", "stuff", "things")
|
|
idx2, err := newIndex(db, "idx", "stuff2", "things")
|
|
|
|
testId := []byte("Test")
|
|
test2Id := []byte("Test2")
|
|
test3Id := []byte("Test3")
|
|
test4Id := []byte("Test4")
|
|
|
|
t.Run("Insert Initial", func(t *testing.T) {
|
|
_ = db.Update(func(tx *bbolt.Tx) error {
|
|
itx := idx.WithTx(tx)
|
|
itx2 := idx2.WithTx(tx)
|
|
|
|
assert.NoError(t, itx.Set(testId, "A", "B", "C", "D", "E"))
|
|
assert.NoError(t, itx.Set(test2Id, "B", "C"))
|
|
assert.NoError(t, itx.Set(test3Id, "A", "C", "D"))
|
|
assert.NoError(t, itx.Set(test4Id, "A", "C", "D"))
|
|
assert.NoError(t, itx2.Set(testId, "user_0"))
|
|
assert.NoError(t, itx2.Set(test2Id, "user_1"))
|
|
assert.NoError(t, itx2.Set(test3Id, "user_2"))
|
|
|
|
assert.NoError(t, itx.Set(testId, "A", "B", "C"))
|
|
assert.NoError(t, itx.Set(testId, "A", "C"))
|
|
assert.NoError(t, itx.Set(test4Id))
|
|
|
|
return nil
|
|
})
|
|
})
|
|
if t.Failed() {
|
|
return
|
|
}
|
|
|
|
t.Run("Check Initial", func(t *testing.T) {
|
|
_ = db.View(func(tx *bbolt.Tx) error {
|
|
itx := idx.WithTx(tx)
|
|
itx2 := idx2.WithTx(tx)
|
|
|
|
ids, err := itx.Get("A")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, [][]byte{testId, test3Id}, ids)
|
|
ids, err = itx.Get("B")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, [][]byte{test2Id}, ids)
|
|
ids, err = itx.Get("C")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, [][]byte{testId, test2Id, test3Id}, ids)
|
|
ids, err = itx.Get("D")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, [][]byte{test3Id}, ids)
|
|
|
|
ids, err = itx2.Get("user_0")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, [][]byte{testId}, ids)
|
|
ids, err = itx2.Get("user_1")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, [][]byte{test2Id}, ids)
|
|
ids, err = itx2.Get("user_2")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, [][]byte{test3Id}, ids)
|
|
|
|
return nil
|
|
})
|
|
})
|
|
if t.Failed() {
|
|
return
|
|
}
|
|
|
|
t.Run("Check Initial Reverse", func(t *testing.T) {
|
|
_ = db.View(func(tx *bbolt.Tx) error {
|
|
itx := idx.WithTx(tx)
|
|
itx2 := idx2.WithTx(tx)
|
|
|
|
values, err := itx.Reverse(testId)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, []string{"A", "C"}, values)
|
|
values, err = itx.Reverse(test2Id)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, []string{"B", "C"}, values)
|
|
values, err = itx.Reverse(test3Id)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, []string{"A", "C", "D"}, values)
|
|
values, err = itx.Reverse(test4Id)
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, values)
|
|
|
|
values, err = itx2.Reverse(testId)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, []string{"user_0"}, values)
|
|
values, err = itx2.Reverse(test2Id)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, []string{"user_1"}, values)
|
|
values, err = itx2.Reverse(test3Id)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, []string{"user_2"}, values)
|
|
|
|
return nil
|
|
})
|
|
})
|
|
if t.Failed() {
|
|
return
|
|
}
|
|
|
|
t.Run("Nuke 'n Pave", func(t *testing.T) {
|
|
_ = db.Update(func(tx *bbolt.Tx) error {
|
|
assert.NoError(t, idx.Reset(tx))
|
|
assert.NoError(t, idx2.Reset(tx))
|
|
|
|
itx := idx.WithTx(tx)
|
|
itx2 := idx2.WithTx(tx)
|
|
|
|
assert.NoError(t, itx.Set(testId, "pave"))
|
|
assert.NoError(t, itx.Set(test2Id, "pave"))
|
|
assert.NoError(t, itx.Set(test3Id, "pave"))
|
|
assert.NoError(t, itx2.Set(testId, "pave2"))
|
|
assert.NoError(t, itx2.Set(test3Id, "pave2"))
|
|
|
|
return nil
|
|
})
|
|
})
|
|
if t.Failed() {
|
|
return
|
|
}
|
|
|
|
t.Run("Check Nuke 'n Pave", func(t *testing.T) {
|
|
_ = db.View(func(tx *bbolt.Tx) error {
|
|
itx := idx.WithTx(tx)
|
|
itx2 := idx2.WithTx(tx)
|
|
|
|
ids, err := itx.Get("A")
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, ids)
|
|
ids, err = itx.Get("B")
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, ids)
|
|
ids, err = itx.Get("C")
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, ids)
|
|
ids, err = itx.Get("D")
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, ids)
|
|
|
|
ids, err = itx2.Get("user_0")
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, ids)
|
|
ids, err = itx2.Get("user_1")
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, ids)
|
|
ids, err = itx2.Get("user_2")
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, ids)
|
|
|
|
ids, err = itx.Get("pave")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, [][]byte{testId, test2Id, test3Id}, ids)
|
|
ids, err = itx2.Get("pave2")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, [][]byte{testId, test3Id}, ids)
|
|
|
|
return nil
|
|
})
|
|
})
|
|
if t.Failed() {
|
|
return
|
|
}
|
|
|
|
t.Run("Check Nuke 'n Pave Reverse", func(t *testing.T) {
|
|
_ = db.View(func(tx *bbolt.Tx) error {
|
|
itx := idx.WithTx(tx)
|
|
itx2 := idx2.WithTx(tx)
|
|
|
|
values, err := itx.Reverse(testId)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, []string{"pave"}, values)
|
|
values, err = itx.Reverse(test2Id)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, []string{"pave"}, values)
|
|
values, err = itx.Reverse(test3Id)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, []string{"pave"}, values)
|
|
|
|
values, err = itx2.Reverse(testId)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, []string{"pave2"}, values)
|
|
values, err = itx2.Reverse(test2Id)
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, values)
|
|
values, err = itx2.Reverse(test3Id)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, []string{"pave2"}, values)
|
|
|
|
return nil
|
|
})
|
|
})
|
|
if t.Failed() {
|
|
return
|
|
}
|
|
}
|