OLD | NEW |
---|---|
(Empty) | |
1 package db | |
2 | |
3 import ( | |
4 "fmt" | |
5 "testing" | |
6 "time" | |
7 | |
8 "github.com/stretchr/testify/assert" | |
9 | |
10 "go.skia.org/infra/go/buildbucket" | |
11 "go.skia.org/infra/go/testutils" | |
12 ) | |
13 | |
14 func makeBuild(id string, ts time.Time, commits []string) *Build { | |
15 return &Build{ | |
16 Build: &buildbucket.Build{ | |
17 CreatedTimestamp: fmt.Sprintf("%d", ts.UnixNano()), | |
18 Id: id, | |
19 }, | |
20 Commits: commits, | |
21 } | |
22 } | |
23 | |
24 func testDB(t *testing.T, db DB) { | |
25 defer testutils.AssertCloses(t, db) | |
26 | |
27 _, err := db.GetModifiedBuilds("dummy-id") | |
28 assert.True(t, IsUnknownId(err)) | |
29 | |
30 id, err := db.StartTrackingModifiedBuilds() | |
31 assert.NoError(t, err) | |
32 | |
33 builds, err := db.GetModifiedBuilds(id) | |
34 assert.NoError(t, err) | |
35 assert.Equal(t, 0, len(builds)) | |
36 | |
37 // Insert a build. | |
38 b1 := makeBuild("build1", time.Unix(0, 1470674132000000), []string{"a", "b", "c", "d"}) | |
39 assert.NoError(t, db.PutBuild(b1)) | |
40 | |
41 // Ensure that the build shows up in the modified list. | |
42 builds, err = db.GetModifiedBuilds(id) | |
43 assert.NoError(t, err) | |
44 testutils.AssertDeepEqual(t, []*Build{b1}, builds) | |
45 | |
46 // Ensure that the build shows up in the correct date ranges. | |
47 timeStart := time.Time{} | |
48 b1Created, err := b1.Created() | |
49 assert.NoError(t, err) | |
50 b1Before := b1Created.Add(-1 * time.Millisecond) | |
dogben
2016/08/08 19:22:38
nit: Can we make b1Before := b1Created, to test th
borenet
2016/08/08 19:51:18
Done, and fixed inMemoryDB to behave that way.
| |
51 b1After := b1Created.Add(1 * time.Millisecond) | |
52 timeEnd := time.Now() | |
53 builds, err = db.GetBuildsFromDateRange(timeStart, b1Before) | |
54 assert.NoError(t, err) | |
55 assert.Equal(t, 0, len(builds)) | |
56 builds, err = db.GetBuildsFromDateRange(b1Before, b1After) | |
57 assert.NoError(t, err) | |
58 testutils.AssertDeepEqual(t, []*Build{b1}, builds) | |
59 builds, err = db.GetBuildsFromDateRange(b1After, timeEnd) | |
60 assert.NoError(t, err) | |
61 assert.Equal(t, 0, len(builds)) | |
62 | |
63 // Insert two more builds. | |
64 b2 := makeBuild("build2", time.Unix(0, 1470674376000000), []string{"e", "f"}) | |
65 b3 := makeBuild("build3", time.Unix(0, 1470674884000000), []string{"g", "h"}) | |
66 assert.NoError(t, db.PutBuilds([]*Build{b2, b3})) | |
67 | |
68 // Ensure that both builds show up in the modified list. | |
69 builds, err = db.GetModifiedBuilds(id) | |
70 assert.NoError(t, err) | |
71 testutils.AssertDeepEqual(t, []*Build{b2, b3}, builds) | |
72 | |
73 // Ensure that all builds show up in the correct time ranges, in sorted order. | |
74 b2Created, err := b2.Created() | |
75 assert.NoError(t, err) | |
76 b2Before := b2Created.Add(-1 * time.Millisecond) | |
77 b2After := b2Created.Add(1 * time.Millisecond) | |
78 | |
79 b3Created, err := b3.Created() | |
80 assert.NoError(t, err) | |
81 b3Before := b3Created.Add(-1 * time.Millisecond) | |
82 b3After := b3Created.Add(1 * time.Millisecond) | |
83 | |
84 builds, err = db.GetBuildsFromDateRange(timeStart, b1Before) | |
85 assert.NoError(t, err) | |
86 assert.Equal(t, 0, len(builds)) | |
87 | |
88 builds, err = db.GetBuildsFromDateRange(timeStart, b1After) | |
89 assert.NoError(t, err) | |
90 testutils.AssertDeepEqual(t, []*Build{b1}, builds) | |
91 | |
92 builds, err = db.GetBuildsFromDateRange(timeStart, b2Before) | |
93 assert.NoError(t, err) | |
94 testutils.AssertDeepEqual(t, []*Build{b1}, builds) | |
95 | |
96 builds, err = db.GetBuildsFromDateRange(timeStart, b2After) | |
97 assert.NoError(t, err) | |
98 testutils.AssertDeepEqual(t, []*Build{b1, b2}, builds) | |
99 | |
100 builds, err = db.GetBuildsFromDateRange(timeStart, b3Before) | |
101 assert.NoError(t, err) | |
102 testutils.AssertDeepEqual(t, []*Build{b1, b2}, builds) | |
103 | |
104 builds, err = db.GetBuildsFromDateRange(timeStart, b3After) | |
105 assert.NoError(t, err) | |
106 testutils.AssertDeepEqual(t, []*Build{b1, b2, b3}, builds) | |
107 | |
108 builds, err = db.GetBuildsFromDateRange(timeStart, timeEnd) | |
109 assert.NoError(t, err) | |
110 testutils.AssertDeepEqual(t, []*Build{b1, b2, b3}, builds) | |
111 | |
112 builds, err = db.GetBuildsFromDateRange(b1Before, timeEnd) | |
113 assert.NoError(t, err) | |
114 testutils.AssertDeepEqual(t, []*Build{b1, b2, b3}, builds) | |
115 | |
116 builds, err = db.GetBuildsFromDateRange(b1After, timeEnd) | |
117 assert.NoError(t, err) | |
118 testutils.AssertDeepEqual(t, []*Build{b2, b3}, builds) | |
119 | |
120 builds, err = db.GetBuildsFromDateRange(b2Before, timeEnd) | |
121 assert.NoError(t, err) | |
122 testutils.AssertDeepEqual(t, []*Build{b2, b3}, builds) | |
123 | |
124 builds, err = db.GetBuildsFromDateRange(b2After, timeEnd) | |
125 assert.NoError(t, err) | |
126 testutils.AssertDeepEqual(t, []*Build{b3}, builds) | |
127 | |
128 builds, err = db.GetBuildsFromDateRange(b3Before, timeEnd) | |
129 assert.NoError(t, err) | |
130 testutils.AssertDeepEqual(t, []*Build{b3}, builds) | |
131 | |
132 builds, err = db.GetBuildsFromDateRange(b3After, timeEnd) | |
133 assert.NoError(t, err) | |
134 testutils.AssertDeepEqual(t, []*Build{}, builds) | |
135 } | |
136 | |
137 func testTooManyUsers(t *testing.T, db DB) { | |
138 defer testutils.AssertCloses(t, db) | |
139 | |
140 // Max out the number of modified-builds users; ensure that we error out . | |
141 for i := 0; i < MAX_MODIFIED_BUILDS_USERS; i++ { | |
142 _, err := db.StartTrackingModifiedBuilds() | |
143 assert.NoError(t, err) | |
144 } | |
145 _, err := db.StartTrackingModifiedBuilds() | |
146 assert.True(t, IsTooManyUsers(err)) | |
147 } | |
148 | |
149 func TestInMemoryDB(t *testing.T) { | |
150 testDB(t, NewInMemoryDB()) | |
151 } | |
152 | |
153 func TestInMemoryTooManyUsers(t *testing.T) { | |
154 testTooManyUsers(t, NewInMemoryDB()) | |
155 } | |
OLD | NEW |