Create Schema Manager and propagate contexts into the DB calls downstream. Add checks at controller startup and database init for correct schema version and schema migration dirty bit being set.
92 lines
2.2 KiB
Go
92 lines
2.2 KiB
Go
package oplog
|
|
|
|
import (
|
|
"context"
|
|
"crypto/rand"
|
|
"database/sql"
|
|
"testing"
|
|
|
|
"github.com/hashicorp/boundary/internal/db/schema"
|
|
"github.com/hashicorp/boundary/internal/docker"
|
|
"github.com/hashicorp/boundary/internal/oplog/oplog_test"
|
|
wrapping "github.com/hashicorp/go-kms-wrapping"
|
|
"github.com/hashicorp/go-kms-wrapping/wrappers/aead"
|
|
"github.com/hashicorp/go-uuid"
|
|
"github.com/jinzhu/gorm"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func testCleanup(t *testing.T, cleanupFunc func() error, db *gorm.DB) {
|
|
t.Helper()
|
|
err := cleanupFunc()
|
|
assert.NoError(t, err)
|
|
err = db.Close()
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
func testUser(t *testing.T, db *gorm.DB, name, phoneNumber, email string) *oplog_test.TestUser {
|
|
t.Helper()
|
|
u := &oplog_test.TestUser{
|
|
Name: name,
|
|
PhoneNumber: phoneNumber,
|
|
Email: email,
|
|
}
|
|
w := GormWriter{db}
|
|
|
|
err := w.Create(&u)
|
|
require.NoError(t, err)
|
|
return u
|
|
}
|
|
|
|
func testFindUser(t *testing.T, db *gorm.DB, userId uint32) *oplog_test.TestUser {
|
|
t.Helper()
|
|
var foundUser oplog_test.TestUser
|
|
err := db.Where("id = ?", userId).First(&foundUser).Error
|
|
require.NoError(t, err)
|
|
return &foundUser
|
|
}
|
|
|
|
func testId(t *testing.T) string {
|
|
t.Helper()
|
|
id, err := uuid.GenerateUUID()
|
|
require.NoError(t, err)
|
|
return id
|
|
}
|
|
|
|
func testInitDbInDocker(t *testing.T) (cleanup func() error, retURL string, err error) {
|
|
t.Helper()
|
|
cleanup, retURL, _, err = docker.StartDbInDocker("postgres")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
testInitStore(t, cleanup, retURL)
|
|
return
|
|
}
|
|
|
|
// testWrapper initializes an AEAD wrapping.Wrapper for testing the oplog
|
|
func testWrapper(t *testing.T) wrapping.Wrapper {
|
|
t.Helper()
|
|
rootKey := make([]byte, 32)
|
|
n, err := rand.Read(rootKey)
|
|
require.NoError(t, err)
|
|
require.Equal(t, n, 32)
|
|
root := aead.NewWrapper(nil)
|
|
err = root.SetAESGCMKeyBytes(rootKey)
|
|
require.NoError(t, err)
|
|
return root
|
|
}
|
|
|
|
// testInitStore will execute the migrations needed to initialize the store for tests
|
|
func testInitStore(t *testing.T, cleanup func() error, url string) {
|
|
t.Helper()
|
|
ctx := context.Background()
|
|
dialect := "postgres"
|
|
|
|
d, err := sql.Open(dialect, url)
|
|
require.NoError(t, err)
|
|
sm, err := schema.NewManager(ctx, dialect, d)
|
|
require.NoError(t, err)
|
|
require.NoError(t, sm.RollForward(ctx))
|
|
}
|