blob: 465244aa4093e29c809f34b844aa3d672d781503 [file] [log] [blame]
package expectedschema_test
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.skia.org/infra/go/deepequal/assertdeep"
"go.skia.org/infra/go/sql/schema"
"go.skia.org/infra/perf/go/config"
"go.skia.org/infra/perf/go/sql"
"go.skia.org/infra/perf/go/sql/expectedschema"
"go.skia.org/infra/perf/go/sql/sqltest"
)
func Test_NoMigrationNeeded_Spanner(t *testing.T) {
ctx := context.Background()
// Load DB loaded with schema from schema.go
db := sqltest.NewSpannerDBForTests(t, "desc")
// Newly created schema should already be up to date, so no error should pop up.
err := expectedschema.ValidateAndMigrateNewSchema(ctx, db)
require.NoError(t, err)
err = expectedschema.UpdateTraceParamsSchema(ctx, db, config.SpannerDataStoreType, []string{})
require.NoError(t, err)
}
const CreateInvalidTableSpanner = `
DROP TABLE IF EXISTS Alerts;
CREATE TABLE IF NOT EXISTS Alerts (
alert TEXT PRIMARY KEY
);
`
func Test_InvalidSchema_Spanner(t *testing.T) {
ctx := context.Background()
db := sqltest.NewSpannerDBForTests(t, "desc")
_, err := db.Exec(ctx, CreateInvalidTableSpanner)
require.NoError(t, err)
// Live schema doesn't match next or prev schema versions. This shouldn't happen.
err = expectedschema.ValidateAndMigrateNewSchema(ctx, db)
require.Error(t, err)
err = expectedschema.UpdateTraceParamsSchema(ctx, db, config.SpannerDataStoreType, []string{})
require.NoError(t, err)
}
func Test_MigrationNeeded_Spanner(t *testing.T) {
ctx := context.Background()
db := sqltest.NewSpannerDBForTests(t, "desc")
next, err := expectedschema.Load()
require.NoError(t, err)
prev, err := expectedschema.LoadPrev()
require.NoError(t, err)
_, err = db.Exec(ctx, expectedschema.FromNextToLiveSpanner)
require.NoError(t, err)
actual, err := schema.GetDescription(ctx, db, sql.Tables{}, string(config.SpannerDataStoreType))
require.NoError(t, err)
// Current schema should now match prev.
assertdeep.Equal(t, prev, *actual)
// Since live matches the prev schema, it should get migrated to next.
err = expectedschema.ValidateAndMigrateNewSchema(ctx, db)
require.NoError(t, err)
err = expectedschema.UpdateTraceParamsSchema(ctx, db, config.SpannerDataStoreType, []string{})
require.NoError(t, err)
actual, err = schema.GetDescription(ctx, db, sql.Tables{}, string(config.SpannerDataStoreType))
require.NoError(t, err)
assertdeep.Equal(t, next, *actual)
}
func Test_TraceParamsAddColAndIdx_Spanner(t *testing.T) {
ctx := context.Background()
// Load DB loaded with schema from schema.go
db := sqltest.NewSpannerDBForTests(t, "desc")
// Insert a tilenumber and paramset to generate "bot" col from:
insertIntoParamSets := `
INSERT INTO
ParamSets (tile_number, param_key, param_value)
VALUES
( 176, 'bot', 'win-10-perf' )
ON CONFLICT (tile_number, param_key, param_value)
DO NOTHING`
_, err := db.Exec(ctx, insertIntoParamSets)
require.NoError(t, err)
// Specify that we should index traceparams on "bot":
err = expectedschema.ValidateAndMigrateNewSchema(ctx, db)
require.NoError(t, err)
err = expectedschema.UpdateTraceParamsSchema(ctx, db, config.SpannerDataStoreType, []string{"bot"})
require.NoError(t, err)
actualCols, actualIdxs, err := expectedschema.GetTraceParamsGeneratedColsAndIdxs(ctx, db, string(config.SpannerDataStoreType))
require.NoError(t, err)
assert.Equal(t, 1, len(actualCols))
assert.Equal(t, "bot", actualCols[0])
assert.Equal(t, 1, len(actualIdxs))
assert.Equal(t, "idx_traceparams_bot", actualIdxs[0])
}
func Test_TraceParamsRemoveColAndIdx_Spanner(t *testing.T) {
ctx := context.Background()
// Load DB loaded with schema from schema.go
db := sqltest.NewSpannerDBForTests(t, "desc")
// Insert a tilenumber and paramset to generate "bot" col from:
insertIntoParamSets := `
INSERT INTO
ParamSets (tile_number, param_key, param_value)
VALUES
( 176, 'bot', 'win-10-perf' )
ON CONFLICT (tile_number, param_key, param_value)
DO NOTHING`
_, err := db.Exec(ctx, insertIntoParamSets)
require.NoError(t, err)
// Specify that we should index traceparams on "bot":
err = expectedschema.ValidateAndMigrateNewSchema(ctx, db)
require.NoError(t, err)
err = expectedschema.UpdateTraceParamsSchema(ctx, db, config.SpannerDataStoreType, []string{"bot"})
require.NoError(t, err)
// Remove all paramsets so no columns are generated for traceparams:
dropFromParamsets := `DELETE FROM ParamSets`
_, err = db.Exec(ctx, dropFromParamsets)
require.NoError(t, err)
// Specify that we should NO LONGER index traceparams on "bot":
err = expectedschema.ValidateAndMigrateNewSchema(ctx, db)
require.NoError(t, err)
err = expectedschema.UpdateTraceParamsSchema(ctx, db, config.SpannerDataStoreType, []string{})
require.NoError(t, err)
actualCols, actualIdxs, err := expectedschema.GetTraceParamsGeneratedColsAndIdxs(ctx, db, string(config.SpannerDataStoreType))
require.NoError(t, err)
assert.Equal(t, 0, len(actualCols))
assert.Equal(t, 0, len(actualIdxs))
}