diff options
| author | Felix Hanley <felix@userspace.com.au> | 2019-03-14 01:01:55 +0000 |
|---|---|---|
| committer | Felix Hanley <felix@userspace.com.au> | 2019-03-14 01:01:55 +0000 |
| commit | d5104b2e798bb5d48035902bf480f64f2efb440d (patch) | |
| tree | 52ff471167fcc15b8213b5e018a6f47cd352666c | |
| parent | 3cdc17111faa9ac60c7e4444279cf18e66309af5 (diff) | |
| download | migrate-d5104b2e798bb5d48035902bf480f64f2efb440d.tar.gz migrate-d5104b2e798bb5d48035902bf480f64f2efb440d.tar.bz2 | |
Fix tests for race failures
| -rw-r--r-- | .drone.yml | 2 | ||||
| -rw-r--r-- | migrate_test.go | 52 |
2 files changed, 40 insertions, 14 deletions
@@ -6,4 +6,4 @@ steps: commands: - apk add --no-cache build-base ca-certificates git - go get github.com/mattn/goveralls - - goveralls -service drone.io || exit 0 + - goveralls -v -service drone.io || exit 0 diff --git a/migrate_test.go b/migrate_test.go index 17f1942..50e16e4 100644 --- a/migrate_test.go +++ b/migrate_test.go @@ -2,6 +2,8 @@ package migrate import ( "database/sql" + "fmt" + "sync" "testing" _ "github.com/mattn/go-sqlite3" @@ -12,6 +14,7 @@ const testDB = "file:test?mode=memory&cache=shared" type mig struct { version int64 sql string + cb ResultFunc } func createMigration(v int64, sql string) Migration { @@ -32,8 +35,9 @@ var testMigrations = []struct { // Out of order please {version: 2, sql: "insert into test1 (pk) values (1)"}, {version: 3, sql: "insert into test1 (pk) values (2)"}, - {version: 4, sql: "insert into nonexistant (pk) values (2)"}, + {version: 5, sql: "insert into nonexistant (pk) values (2)"}, {version: 1, sql: "create table if not exists test1 (pk bigint not null primary key)"}, + {version: 4, sql: "insert into test1 (pk) values (3)"}, } func TestMigrate(t *testing.T) { @@ -42,6 +46,8 @@ func TestMigrate(t *testing.T) { for _, m := range testMigrations { migrations = append(migrations, createMigration(m.version, m.sql)) } + var output string + var outputMutex sync.RWMutex db, err := sql.Open("sqlite3", testDB) if err != nil { @@ -53,8 +59,14 @@ func TestMigrate(t *testing.T) { migrator := Migrator{ db: db, migrations: migrations, + callback: ResultFunc(func(max, curr int64, err error) { + outputMutex.Lock() + defer outputMutex.Unlock() + output = fmt.Sprintf("Maximum: %d, Current: %d, Error: %s\n", max, curr, err) + }), } + // No version yet v, err := migrator.Version() if err != nil { t.Fatalf("Migrator.Version() failed: %v", err) @@ -63,33 +75,47 @@ func TestMigrate(t *testing.T) { t.Fatalf("Migrator.Version() should be NilVersion, got %d", v) } - err = migrator.MigrateTo(3) + // Next version + if err = migrator.MigrateTo(2); err != nil { + t.Fatalf("Migrator.MigrateTo(2) failed: %v", err) + } + v, err = migrator.Version() if err != nil { - t.Fatalf("Migrator.MigrateTo(3) failed: %v", err) + t.Fatalf("Migrator.Version() failed: %v", err) + } + if int(v) != 2 { + t.Errorf("expected migration version 2, got %d", v) } + // Previous version + if err = migrator.MigrateTo(2); err != nil { + t.Fatalf("Migrator.MigrateTo(2) failed: %v", err) + } v, err = migrator.Version() if err != nil { t.Fatalf("Migrator.Version() failed: %v", err) } - - if int(v) != len(migrations)-1 { - t.Errorf("expected migration version %d, got %d", len(migrations)-1, v) + if int(v) != 2 { + t.Errorf("expected migration version 2, got %d", v) } - err = migrator.MigrateTo(4) - if err == nil { - t.Fatalf("Migrator.MigrateTo(4) should have failed") + // All the way, with eventual failure + if err = migrator.Migrate(); err == nil { + t.Fatalf("Migrator.Migrate() should have failed") } - v, err = migrator.Version() if err != nil { t.Fatalf("Migrator.Version() failed: %v", err) } - - if int(v) != len(migrations)-1 { - t.Errorf("expected migration version %d, got %d", len(migrations)-1, v) + if int(v) != 4 { + t.Errorf("expected migration version 4, got %d", v) + } + expected := "Maximum: 5, Current: 5, Error: migration 5 failed: no such table: nonexistant\n" + outputMutex.RLock() + if output != expected { + t.Errorf("expected output %q, got %q", expected, output) } + outputMutex.RUnlock() var result int64 err = db.QueryRow(`select pk from test1`).Scan(&result) |
