Index: build_scheduler/go/db/db_test.go |
diff --git a/build_scheduler/go/db/db_test.go b/build_scheduler/go/db/db_test.go |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0500b913b9cb0fa3ae51af069a59cd6046f6d2ad |
--- /dev/null |
+++ b/build_scheduler/go/db/db_test.go |
@@ -0,0 +1,153 @@ |
+package db |
+ |
+import ( |
+ "fmt" |
+ "testing" |
+ "time" |
+ |
+ "github.com/stretchr/testify/assert" |
+ |
+ "go.skia.org/infra/go/buildbucket" |
+ "go.skia.org/infra/go/testutils" |
+) |
+ |
+func makeBuild(id string, ts time.Time, commits []string) *Build { |
+ return &Build{ |
+ Build: &buildbucket.Build{ |
+ CreatedTimestamp: fmt.Sprintf("%d", ts.UnixNano()), |
+ Id: id, |
+ }, |
+ Builder: "Test-Builder", |
+ Commits: commits, |
+ } |
+} |
+ |
+func testDB(t *testing.T, db DB) { |
+ defer testutils.AssertCloses(t, db) |
+ |
+ _, err := db.GetModifiedBuilds("dummy-id") |
+ assert.True(t, IsUnknownId(err)) |
+ |
+ id, err := db.StartTrackingModifiedBuilds() |
+ assert.NoError(t, err) |
+ |
+ builds, err := db.GetModifiedBuilds(id) |
+ assert.NoError(t, err) |
+ assert.Equal(t, 0, len(builds)) |
+ |
+ // Insert a build. |
+ b1 := makeBuild("build1", time.Unix(0, 1470674132000000), []string{"a", "b", "c", "d"}) |
+ assert.NoError(t, db.PutBuild(b1)) |
+ |
+ // Ensure that the build shows up in the modified list. |
+ builds, err = db.GetModifiedBuilds(id) |
+ assert.NoError(t, err) |
+ testutils.AssertDeepEqual(t, []*Build{b1}, builds) |
+ |
+ // Ensure that the build shows up in the correct date ranges. |
+ timeStart := time.Time{} |
+ b1Before, err := b1.Created() |
+ assert.NoError(t, err) |
+ b1After := b1Before.Add(1 * time.Millisecond) |
+ timeEnd := time.Now() |
+ builds, err = db.GetBuildsFromDateRange(timeStart, b1Before) |
+ assert.NoError(t, err) |
+ assert.Equal(t, 0, len(builds)) |
+ builds, err = db.GetBuildsFromDateRange(b1Before, b1After) |
+ assert.NoError(t, err) |
+ testutils.AssertDeepEqual(t, []*Build{b1}, builds) |
+ builds, err = db.GetBuildsFromDateRange(b1After, timeEnd) |
+ assert.NoError(t, err) |
+ assert.Equal(t, 0, len(builds)) |
+ |
+ // Insert two more builds. |
+ b2 := makeBuild("build2", time.Unix(0, 1470674376000000), []string{"e", "f"}) |
+ b3 := makeBuild("build3", time.Unix(0, 1470674884000000), []string{"g", "h"}) |
+ assert.NoError(t, db.PutBuilds([]*Build{b2, b3})) |
+ |
+ // Ensure that both builds show up in the modified list. |
+ builds, err = db.GetModifiedBuilds(id) |
+ assert.NoError(t, err) |
+ testutils.AssertDeepEqual(t, []*Build{b2, b3}, builds) |
+ |
+ // Ensure that all builds show up in the correct time ranges, in sorted order. |
+ b2Before, err := b2.Created() |
+ assert.NoError(t, err) |
+ b2After := b2Before.Add(1 * time.Millisecond) |
+ |
+ b3Before, err := b3.Created() |
+ assert.NoError(t, err) |
+ b3After := b3Before.Add(1 * time.Millisecond) |
+ |
+ builds, err = db.GetBuildsFromDateRange(timeStart, b1Before) |
+ assert.NoError(t, err) |
+ assert.Equal(t, 0, len(builds)) |
+ |
+ builds, err = db.GetBuildsFromDateRange(timeStart, b1After) |
+ assert.NoError(t, err) |
+ testutils.AssertDeepEqual(t, []*Build{b1}, builds) |
+ |
+ builds, err = db.GetBuildsFromDateRange(timeStart, b2Before) |
+ assert.NoError(t, err) |
+ testutils.AssertDeepEqual(t, []*Build{b1}, builds) |
+ |
+ builds, err = db.GetBuildsFromDateRange(timeStart, b2After) |
+ assert.NoError(t, err) |
+ testutils.AssertDeepEqual(t, []*Build{b1, b2}, builds) |
+ |
+ builds, err = db.GetBuildsFromDateRange(timeStart, b3Before) |
+ assert.NoError(t, err) |
+ testutils.AssertDeepEqual(t, []*Build{b1, b2}, builds) |
+ |
+ builds, err = db.GetBuildsFromDateRange(timeStart, b3After) |
+ assert.NoError(t, err) |
+ testutils.AssertDeepEqual(t, []*Build{b1, b2, b3}, builds) |
+ |
+ builds, err = db.GetBuildsFromDateRange(timeStart, timeEnd) |
+ assert.NoError(t, err) |
+ testutils.AssertDeepEqual(t, []*Build{b1, b2, b3}, builds) |
+ |
+ builds, err = db.GetBuildsFromDateRange(b1Before, timeEnd) |
+ assert.NoError(t, err) |
+ testutils.AssertDeepEqual(t, []*Build{b1, b2, b3}, builds) |
+ |
+ builds, err = db.GetBuildsFromDateRange(b1After, timeEnd) |
+ assert.NoError(t, err) |
+ testutils.AssertDeepEqual(t, []*Build{b2, b3}, builds) |
+ |
+ builds, err = db.GetBuildsFromDateRange(b2Before, timeEnd) |
+ assert.NoError(t, err) |
+ testutils.AssertDeepEqual(t, []*Build{b2, b3}, builds) |
+ |
+ builds, err = db.GetBuildsFromDateRange(b2After, timeEnd) |
+ assert.NoError(t, err) |
+ testutils.AssertDeepEqual(t, []*Build{b3}, builds) |
+ |
+ builds, err = db.GetBuildsFromDateRange(b3Before, timeEnd) |
+ assert.NoError(t, err) |
+ testutils.AssertDeepEqual(t, []*Build{b3}, builds) |
+ |
+ builds, err = db.GetBuildsFromDateRange(b3After, timeEnd) |
+ assert.NoError(t, err) |
+ testutils.AssertDeepEqual(t, []*Build{}, builds) |
+} |
+ |
+func testTooManyUsers(t *testing.T, db DB) { |
+ defer testutils.AssertCloses(t, db) |
+ |
+ // Max out the number of modified-builds users; ensure that we error out. |
+ for i := 0; i < MAX_MODIFIED_BUILDS_USERS; i++ { |
+ _, err := db.StartTrackingModifiedBuilds() |
+ assert.NoError(t, err) |
+ } |
+ _, err := db.StartTrackingModifiedBuilds() |
+ assert.True(t, IsTooManyUsers(err)) |
+} |
+ |
+func TestInMemoryDB(t *testing.T) { |
+ testDB(t, NewInMemoryDB()) |
+} |
+ |
+func TestInMemoryTooManyUsers(t *testing.T) { |
+ testTooManyUsers(t, NewInMemoryDB()) |
+} |