mirror of https://github.com/portainer/portainer
127 lines
2.7 KiB
Go
127 lines
2.7 KiB
Go
package boltdb
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
|
|
portainer "github.com/portainer/portainer/api"
|
|
"github.com/portainer/portainer/api/dataservices"
|
|
)
|
|
|
|
const testBucketName = "test-bucket"
|
|
const testId = 1234
|
|
|
|
type testStruct struct {
|
|
Key string
|
|
Value string
|
|
}
|
|
|
|
func TestTxs(t *testing.T) {
|
|
conn := DbConnection{
|
|
Path: t.TempDir(),
|
|
}
|
|
|
|
err := conn.Open()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer conn.Close()
|
|
|
|
// Error propagation
|
|
err = conn.UpdateTx(func(tx portainer.Transaction) error {
|
|
return errors.New("this is an error")
|
|
})
|
|
if err == nil {
|
|
t.Fatal("an error was expected, got nil instead")
|
|
}
|
|
|
|
// Create an object
|
|
newObj := testStruct{
|
|
Key: "key",
|
|
Value: "value",
|
|
}
|
|
|
|
err = conn.UpdateTx(func(tx portainer.Transaction) error {
|
|
err = tx.SetServiceName(testBucketName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return tx.CreateObjectWithId(testBucketName, testId, newObj)
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
obj := testStruct{}
|
|
err = conn.ViewTx(func(tx portainer.Transaction) error {
|
|
return tx.GetObject(testBucketName, conn.ConvertToKey(testId), &obj)
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if obj.Key != newObj.Key || obj.Value != newObj.Value {
|
|
t.Fatalf("expected %s:%s, got %s:%s instead", newObj.Key, newObj.Value, obj.Key, obj.Value)
|
|
}
|
|
|
|
// Update an object
|
|
updatedObj := testStruct{
|
|
Key: "updated-key",
|
|
Value: "updated-value",
|
|
}
|
|
|
|
err = conn.UpdateTx(func(tx portainer.Transaction) error {
|
|
return tx.UpdateObject(testBucketName, conn.ConvertToKey(testId), &updatedObj)
|
|
})
|
|
|
|
err = conn.ViewTx(func(tx portainer.Transaction) error {
|
|
return tx.GetObject(testBucketName, conn.ConvertToKey(testId), &obj)
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if obj.Key != updatedObj.Key || obj.Value != updatedObj.Value {
|
|
t.Fatalf("expected %s:%s, got %s:%s instead", updatedObj.Key, updatedObj.Value, obj.Key, obj.Value)
|
|
}
|
|
|
|
// Delete an object
|
|
err = conn.UpdateTx(func(tx portainer.Transaction) error {
|
|
return tx.DeleteObject(testBucketName, conn.ConvertToKey(testId))
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = conn.ViewTx(func(tx portainer.Transaction) error {
|
|
return tx.GetObject(testBucketName, conn.ConvertToKey(testId), &obj)
|
|
})
|
|
if !dataservices.IsErrObjectNotFound(err) {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Get next identifier
|
|
err = conn.UpdateTx(func(tx portainer.Transaction) error {
|
|
id1 := tx.GetNextIdentifier(testBucketName)
|
|
id2 := tx.GetNextIdentifier(testBucketName)
|
|
|
|
if id1+1 != id2 {
|
|
return errors.New("unexpected identifier sequence")
|
|
}
|
|
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Try to write in a read transaction
|
|
err = conn.ViewTx(func(tx portainer.Transaction) error {
|
|
return tx.CreateObjectWithId(testBucketName, testId, newObj)
|
|
})
|
|
if err == nil {
|
|
t.Fatal("an error was expected, got nil instead")
|
|
}
|
|
}
|