| 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)) |
| } |