487 lines
11 KiB
Go
487 lines
11 KiB
Go
package test
|
|
|
|
import (
|
|
"blackforestbytes.com/simplecloudnotifier/db/impl/logs"
|
|
"blackforestbytes.com/simplecloudnotifier/db/impl/primary"
|
|
"blackforestbytes.com/simplecloudnotifier/db/impl/requests"
|
|
"blackforestbytes.com/simplecloudnotifier/db/schema"
|
|
"blackforestbytes.com/simplecloudnotifier/db/simplectx"
|
|
tt "blackforestbytes.com/simplecloudnotifier/test/util"
|
|
"context"
|
|
"fmt"
|
|
"github.com/jmoiron/sqlx"
|
|
"gogs.mikescher.com/BlackForestBytes/goext/sq"
|
|
"testing"
|
|
)
|
|
|
|
func TestPrimaryDB_Current(t *testing.T) {
|
|
dbf1, dbf2, dbf3, conf, stop := tt.StartSimpleTestspace(t)
|
|
defer stop()
|
|
|
|
ctx := context.Background()
|
|
|
|
tt.AssertAny(dbf1)
|
|
tt.AssertAny(dbf2)
|
|
tt.AssertAny(dbf3)
|
|
tt.AssertAny(conf)
|
|
|
|
{
|
|
db1, err := primary.NewPrimaryDatabase(conf)
|
|
tt.TestFailIfErr(t, err)
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema1, err := db1.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema1", 0, schema1)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
err = db1.Migrate(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema2, err := db1.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema2", schema.PrimarySchemaVersion, schema2)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
err = db1.Migrate(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema2, err := db1.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema2", schema.PrimarySchemaVersion, schema2)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
err = db1.Stop(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
db1New, err := primary.NewPrimaryDatabase(conf)
|
|
tt.TestFailIfErr(t, err)
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema3, err := db1New.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema3", schema.PrimarySchemaVersion, schema3)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
err = db1New.Migrate(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema4, err := db1New.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema4", schema.PrimarySchemaVersion, schema4)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestLogsDB_Current(t *testing.T) {
|
|
dbf1, dbf2, dbf3, conf, stop := tt.StartSimpleTestspace(t)
|
|
defer stop()
|
|
|
|
ctx := context.Background()
|
|
|
|
tt.AssertAny(dbf1)
|
|
tt.AssertAny(dbf2)
|
|
tt.AssertAny(dbf3)
|
|
tt.AssertAny(conf)
|
|
|
|
{
|
|
db1, err := logs.NewLogsDatabase(conf)
|
|
tt.TestFailIfErr(t, err)
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema1, err := db1.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema1", 0, schema1)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
err = db1.Migrate(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema2, err := db1.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema2", schema.LogsSchemaVersion, schema2)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
err = db1.Migrate(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema2, err := db1.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema2", schema.LogsSchemaVersion, schema2)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
err = db1.Stop(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
db1New, err := logs.NewLogsDatabase(conf)
|
|
tt.TestFailIfErr(t, err)
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema3, err := db1New.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema3", schema.LogsSchemaVersion, schema3)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
err = db1New.Migrate(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema4, err := db1New.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema4", schema.LogsSchemaVersion, schema4)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestRequestsDB_Current(t *testing.T) {
|
|
dbf1, dbf2, dbf3, conf, stop := tt.StartSimpleTestspace(t)
|
|
defer stop()
|
|
|
|
ctx := context.Background()
|
|
|
|
tt.AssertAny(dbf1)
|
|
tt.AssertAny(dbf2)
|
|
tt.AssertAny(dbf3)
|
|
tt.AssertAny(conf)
|
|
|
|
{
|
|
db1, err := requests.NewRequestsDatabase(conf)
|
|
tt.TestFailIfErr(t, err)
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema1, err := db1.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema1", 0, schema1)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
err = db1.Migrate(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema2, err := db1.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema2", schema.RequestsSchemaVersion, schema2)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
err = db1.Migrate(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema2, err := db1.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema2", schema.RequestsSchemaVersion, schema2)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
err = db1.Stop(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
db1New, err := requests.NewRequestsDatabase(conf)
|
|
tt.TestFailIfErr(t, err)
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema3, err := db1New.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema3", schema.RequestsSchemaVersion, schema3)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
err = db1New.Migrate(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema4, err := db1New.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema4", schema.RequestsSchemaVersion, schema4)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestPrimaryDB_Migrate_from_3(t *testing.T) {
|
|
dbf1, dbf2, dbf3, conf, stop := tt.StartSimpleTestspace(t)
|
|
defer stop()
|
|
|
|
ctx := context.Background()
|
|
|
|
tt.AssertAny(dbf1)
|
|
tt.AssertAny(dbf2)
|
|
tt.AssertAny(dbf3)
|
|
tt.AssertAny(conf)
|
|
|
|
{
|
|
url := fmt.Sprintf("file:%s", dbf1)
|
|
|
|
xdb, err := sqlx.Open("sqlite3", url)
|
|
tt.TestFailIfErr(t, err)
|
|
|
|
qqdb := sq.NewDB(xdb, sq.DBOptions{})
|
|
|
|
schemavers := 3
|
|
|
|
dbschema := schema.PrimarySchema[schemavers]
|
|
|
|
_, err = qqdb.Exec(ctx, dbschema.SQL, sq.PP{})
|
|
tt.TestFailIfErr(t, err)
|
|
|
|
_, err = qqdb.Exec(ctx, "INSERT INTO meta (meta_key, value_int) VALUES (:key, :val) ON CONFLICT(meta_key) DO UPDATE SET value_int = :val", sq.PP{
|
|
"key": "schema",
|
|
"val": schemavers,
|
|
})
|
|
|
|
_, err = qqdb.Exec(ctx, "INSERT INTO meta (meta_key, value_txt) VALUES (:key, :val) ON CONFLICT(meta_key) DO UPDATE SET value_txt = :val", sq.PP{
|
|
"key": "schema_hash",
|
|
"val": dbschema.Hash,
|
|
})
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
schemHashDB, err := sq.HashSqliteDatabase(tctx, qqdb)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schemHashDB", dbschema.Hash, schemHashDB)
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
err = qqdb.Exit()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
db1, err := primary.NewPrimaryDatabase(conf)
|
|
tt.TestFailIfErr(t, err)
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema1, err := db1.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema1", 3, schema1)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
//================================================
|
|
{
|
|
err = db1.Migrate(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
//================================================
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema2, err := db1.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema2", schema.PrimarySchemaVersion, schema2)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
schemHashDB, err := sq.HashSqliteDatabase(tctx, db1.DB())
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schemHashDB", schema.PrimarySchema[schema.PrimarySchemaVersion].Hash, schemHashDB)
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
err = db1.Stop(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
}
|
|
|
|
func TestPrimaryDB_Migrate_from_4(t *testing.T) {
|
|
dbf1, dbf2, dbf3, conf, stop := tt.StartSimpleTestspace(t)
|
|
defer stop()
|
|
|
|
ctx := context.Background()
|
|
|
|
tt.AssertAny(dbf1)
|
|
tt.AssertAny(dbf2)
|
|
tt.AssertAny(dbf3)
|
|
tt.AssertAny(conf)
|
|
|
|
{
|
|
url := fmt.Sprintf("file:%s", dbf1)
|
|
|
|
xdb, err := sqlx.Open("sqlite3", url)
|
|
tt.TestFailIfErr(t, err)
|
|
|
|
qqdb := sq.NewDB(xdb, sq.DBOptions{})
|
|
|
|
schemavers := 4
|
|
|
|
dbschema := schema.PrimarySchema[schemavers]
|
|
|
|
_, err = qqdb.Exec(ctx, dbschema.SQL, sq.PP{})
|
|
tt.TestFailIfErr(t, err)
|
|
|
|
_, err = qqdb.Exec(ctx, "INSERT INTO meta (meta_key, value_int) VALUES (:key, :val) ON CONFLICT(meta_key) DO UPDATE SET value_int = :val", sq.PP{
|
|
"key": "schema",
|
|
"val": schemavers,
|
|
})
|
|
|
|
_, err = qqdb.Exec(ctx, "INSERT INTO meta (meta_key, value_txt) VALUES (:key, :val) ON CONFLICT(meta_key) DO UPDATE SET value_txt = :val", sq.PP{
|
|
"key": "schema_hash",
|
|
"val": dbschema.Hash,
|
|
})
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
schemHashDB, err := sq.HashSqliteDatabase(tctx, qqdb)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schemHashDB", dbschema.Hash, schemHashDB)
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
err = qqdb.Exit()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
db1, err := primary.NewPrimaryDatabase(conf)
|
|
tt.TestFailIfErr(t, err)
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema1, err := db1.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema1", 4, schema1)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
//================================================
|
|
{
|
|
err = db1.Migrate(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
//================================================
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
|
|
schema2, err := db1.ReadSchema(tctx)
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schema2", schema.PrimarySchemaVersion, schema2)
|
|
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
{
|
|
tctx := simplectx.CreateSimpleContext(ctx, nil)
|
|
schemHashDB, err := sq.HashSqliteDatabase(tctx, db1.DB())
|
|
tt.TestFailIfErr(t, err)
|
|
tt.AssertEqual(t, "schemHashDB", schema.PrimarySchema[schema.PrimarySchemaVersion].Hash, schemHashDB)
|
|
err = tctx.CommitTransaction()
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
|
|
err = db1.Stop(ctx)
|
|
tt.TestFailIfErr(t, err)
|
|
}
|
|
}
|