blob: 8ae0cdfdb66e1776c29d4f2339d7d0c81ab148c2 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Tests that the migrations succeed up and down.
//
// NOTE: These tests cannot be run in parallel on the same machine because they
// interact with a fixed database on the machine.
package storage
import (
"fmt"
"testing"
"github.com/rubenv/sql-migrate"
"v.io/x/lib/dbutil"
)
var (
dataSourceName = "playground_test@tcp(localhost:3306)/playground_test?parseTime=true"
)
// Tests that migrations can be applied to a database and rolled back multiple
// times.
func TestMigrationsUpAndDown(t *testing.T) {
// TODO(nlacasse): This setup is very similar to the setup() func in
// model_test.go. Consider combining them.
migrationSource := &migrate.FileMigrationSource{
Dir: "../../migrations",
}
migrate.SetTable("migrations")
sqlConfig := dbutil.SqlConfig{
DataSourceName: dataSourceName,
TLSDisable: true,
}
activeSqlConfig, err := sqlConfig.Activate("")
db, err := activeSqlConfig.NewSqlDBConn("SERIALIZABLE")
if err != nil {
t.Fatalf("Error opening database: %v", err)
}
// Remove any existing tables.
tableNames := []string{"bundle_link", "bundle_data", "migrations"}
for _, tableName := range tableNames {
db.Exec("DROP TABLE " + tableName)
}
// Run all migrations up and down three times.
for i := 0; i < 3; i++ {
up, err := migrate.Exec(db, "mysql", migrationSource, migrate.Up)
if err != nil {
t.Fatalf("Error migrating up: %v", err)
}
fmt.Printf("Applied %v migration up.\n", up)
down, err := migrate.Exec(db, "mysql", migrationSource, migrate.Down)
if err != nil {
t.Fatalf("Error migrating down: %v", err)
}
fmt.Printf("Applied %v migration down.\n", down)
}
// Run each migration up, down, up individually.
migrations, err := migrationSource.FindMigrations()
if err != nil {
t.Fatalf("migrationSource.FindMigrations() failed: %v", err)
}
for i, migration := range migrations {
memMigrationSource := &migrate.MemoryMigrationSource{
Migrations: []*migrate.Migration{migration},
}
// Migrate up.
if _, err := migrate.Exec(db, "mysql", memMigrationSource, migrate.Up); err != nil {
t.Fatalf("Error migrating migration %v up: %v", i, err)
}
fmt.Printf("Applied migration %v up.\n", i)
// Migrate down.
if _, err := migrate.Exec(db, "mysql", memMigrationSource, migrate.Down); err != nil {
t.Fatalf("Error migrating migration %v down: %v", i, err)
}
fmt.Printf("Applied migration %v down.\n", i)
// Migrate up.
if _, err := migrate.Exec(db, "mysql", memMigrationSource, migrate.Up); err != nil {
t.Fatalf("Error migrating migration %v up: %v", i, err)
}
fmt.Printf("Applied migration %v up.\n", i)
}
}