package crdb
import (
"context"
"database/sql"
"flag"
"os"
"sync"
"testing"
"github.com/cockroachdb/cockroach-go/v2/testserver"
"k8s.io/klog/v2"
"github.com/google/trillian/storage/testdb"
)
var testDBs sync.Map
type testDBHandle struct {
db *sql.DB
done func(context.Context)
}
func (db *testDBHandle) GetDB() *sql.DB {
return db.db
}
func TestMain(m *testing.M) {
flag.Parse()
ts, err := testserver.NewTestServer(testserver.CustomVersionOpt("v22.2.7"))
if err != nil {
klog.Exitf("Failed to start test server: %v", err)
}
defer ts.Stop()
dburl := ts.PGURL()
dburl.Path = "/"
if err := os.Setenv(testdb.CockroachDBURIEnv, dburl.String()); err != nil {
klog.Exitf("Failed to SetEnv CockroachDBURIEnv: %v", err)
}
if !testdb.CockroachDBAvailable() {
klog.Errorf("CockroachDB not available, skipping all CockroachDB storage tests")
return
}
status := m.Run()
testDBs.Range(func(key, value interface{}) bool {
testName := key.(string)
klog.Infof("Cleaning up database for test %s", testName)
db := value.(*testDBHandle)
db.done(context.Background())
return true
})
os.Exit(status)
}
func getDBID(t *testing.T) string {
t.Helper()
return t.Name()
}
func openTestDBOrDie(t *testing.T) *testDBHandle {
t.Helper()
db, done, err := testdb.NewTrillianDB(context.TODO(), testdb.DriverCockroachDB)
if err != nil {
panic(err)
}
handle := &testDBHandle{
db: db,
done: done,
}
testDBs.Store(getDBID(t), handle)
return handle
}