OLD | NEW |
| (Empty) |
1 package db | |
2 | |
3 import ( | |
4 "net/url" | |
5 "testing" | |
6 "time" | |
7 | |
8 assert "github.com/stretchr/testify/require" | |
9 | |
10 "go.skia.org/infra/go/testutils" | |
11 ) | |
12 | |
13 func makeTask(ts time.Time, commits []string) *Task { | |
14 return &Task{ | |
15 Created: ts, | |
16 Commits: commits, | |
17 Name: "Test-Task", | |
18 } | |
19 } | |
20 | |
21 func testDB(t *testing.T, db DB) { | |
22 defer testutils.AssertCloses(t, db) | |
23 | |
24 _, err := db.GetModifiedTasks("dummy-id") | |
25 assert.True(t, IsUnknownId(err)) | |
26 | |
27 id, err := db.StartTrackingModifiedTasks() | |
28 assert.NoError(t, err) | |
29 | |
30 tasks, err := db.GetModifiedTasks(id) | |
31 assert.NoError(t, err) | |
32 assert.Equal(t, 0, len(tasks)) | |
33 | |
34 t1 := makeTask(time.Unix(0, 1470674132000000), []string{"a", "b", "c", "
d"}) | |
35 | |
36 // AssignId should fill in t1.Id. | |
37 assert.Equal(t, "", t1.Id) | |
38 assert.NoError(t, db.AssignId(t1)) | |
39 assert.NotEqual(t, "", t1.Id) | |
40 // Ids must be URL-safe. | |
41 assert.Equal(t, url.QueryEscape(t1.Id), t1.Id) | |
42 | |
43 // Task doesn't exist in DB yet. | |
44 noTask, err := db.GetTaskById(t1.Id) | |
45 assert.NoError(t, err) | |
46 assert.Nil(t, noTask) | |
47 | |
48 // Insert the task. | |
49 assert.NoError(t, db.PutTask(t1)) | |
50 | |
51 // Task can now be retrieved by Id. | |
52 t1Again, err := db.GetTaskById(t1.Id) | |
53 assert.NoError(t, err) | |
54 testutils.AssertDeepEqual(t, t1, t1Again) | |
55 | |
56 // Ensure that the task shows up in the modified list. | |
57 tasks, err = db.GetModifiedTasks(id) | |
58 assert.NoError(t, err) | |
59 testutils.AssertDeepEqual(t, []*Task{t1}, tasks) | |
60 | |
61 // Ensure that the task shows up in the correct date ranges. | |
62 timeStart := time.Time{} | |
63 t1Before := t1.Created | |
64 t1After := t1Before.Add(1 * time.Millisecond) | |
65 timeEnd := time.Now() | |
66 tasks, err = db.GetTasksFromDateRange(timeStart, t1Before) | |
67 assert.NoError(t, err) | |
68 assert.Equal(t, 0, len(tasks)) | |
69 tasks, err = db.GetTasksFromDateRange(t1Before, t1After) | |
70 assert.NoError(t, err) | |
71 testutils.AssertDeepEqual(t, []*Task{t1}, tasks) | |
72 tasks, err = db.GetTasksFromDateRange(t1After, timeEnd) | |
73 assert.NoError(t, err) | |
74 assert.Equal(t, 0, len(tasks)) | |
75 | |
76 // Insert two more tasks. | |
77 t2 := makeTask(time.Unix(0, 1470674376000000), []string{"e", "f"}) | |
78 t3 := makeTask(time.Unix(0, 1470674884000000), []string{"g", "h"}) | |
79 assert.NoError(t, db.PutTasks([]*Task{t2, t3})) | |
80 | |
81 // Check that PutTasks assigned Ids. | |
82 assert.NotEqual(t, "", t2.Id) | |
83 assert.NotEqual(t, "", t3.Id) | |
84 // Ids must be URL-safe. | |
85 assert.Equal(t, url.QueryEscape(t2.Id), t2.Id) | |
86 assert.Equal(t, url.QueryEscape(t3.Id), t3.Id) | |
87 | |
88 // Ensure that both tasks show up in the modified list. | |
89 tasks, err = db.GetModifiedTasks(id) | |
90 assert.NoError(t, err) | |
91 testutils.AssertDeepEqual(t, []*Task{t2, t3}, tasks) | |
92 | |
93 // Ensure that all tasks show up in the correct time ranges, in sorted o
rder. | |
94 t2Before := t2.Created | |
95 t2After := t2Before.Add(1 * time.Millisecond) | |
96 | |
97 t3Before := t3.Created | |
98 t3After := t3Before.Add(1 * time.Millisecond) | |
99 | |
100 tasks, err = db.GetTasksFromDateRange(timeStart, t1Before) | |
101 assert.NoError(t, err) | |
102 assert.Equal(t, 0, len(tasks)) | |
103 | |
104 tasks, err = db.GetTasksFromDateRange(timeStart, t1After) | |
105 assert.NoError(t, err) | |
106 testutils.AssertDeepEqual(t, []*Task{t1}, tasks) | |
107 | |
108 tasks, err = db.GetTasksFromDateRange(timeStart, t2Before) | |
109 assert.NoError(t, err) | |
110 testutils.AssertDeepEqual(t, []*Task{t1}, tasks) | |
111 | |
112 tasks, err = db.GetTasksFromDateRange(timeStart, t2After) | |
113 assert.NoError(t, err) | |
114 testutils.AssertDeepEqual(t, []*Task{t1, t2}, tasks) | |
115 | |
116 tasks, err = db.GetTasksFromDateRange(timeStart, t3Before) | |
117 assert.NoError(t, err) | |
118 testutils.AssertDeepEqual(t, []*Task{t1, t2}, tasks) | |
119 | |
120 tasks, err = db.GetTasksFromDateRange(timeStart, t3After) | |
121 assert.NoError(t, err) | |
122 testutils.AssertDeepEqual(t, []*Task{t1, t2, t3}, tasks) | |
123 | |
124 tasks, err = db.GetTasksFromDateRange(timeStart, timeEnd) | |
125 assert.NoError(t, err) | |
126 testutils.AssertDeepEqual(t, []*Task{t1, t2, t3}, tasks) | |
127 | |
128 tasks, err = db.GetTasksFromDateRange(t1Before, timeEnd) | |
129 assert.NoError(t, err) | |
130 testutils.AssertDeepEqual(t, []*Task{t1, t2, t3}, tasks) | |
131 | |
132 tasks, err = db.GetTasksFromDateRange(t1After, timeEnd) | |
133 assert.NoError(t, err) | |
134 testutils.AssertDeepEqual(t, []*Task{t2, t3}, tasks) | |
135 | |
136 tasks, err = db.GetTasksFromDateRange(t2Before, timeEnd) | |
137 assert.NoError(t, err) | |
138 testutils.AssertDeepEqual(t, []*Task{t2, t3}, tasks) | |
139 | |
140 tasks, err = db.GetTasksFromDateRange(t2After, timeEnd) | |
141 assert.NoError(t, err) | |
142 testutils.AssertDeepEqual(t, []*Task{t3}, tasks) | |
143 | |
144 tasks, err = db.GetTasksFromDateRange(t3Before, timeEnd) | |
145 assert.NoError(t, err) | |
146 testutils.AssertDeepEqual(t, []*Task{t3}, tasks) | |
147 | |
148 tasks, err = db.GetTasksFromDateRange(t3After, timeEnd) | |
149 assert.NoError(t, err) | |
150 testutils.AssertDeepEqual(t, []*Task{}, tasks) | |
151 } | |
152 | |
153 func testTooManyUsers(t *testing.T, db DB) { | |
154 defer testutils.AssertCloses(t, db) | |
155 | |
156 // Max out the number of modified-tasks users; ensure that we error out. | |
157 for i := 0; i < MAX_MODIFIED_BUILDS_USERS; i++ { | |
158 _, err := db.StartTrackingModifiedTasks() | |
159 assert.NoError(t, err) | |
160 } | |
161 _, err := db.StartTrackingModifiedTasks() | |
162 assert.True(t, IsTooManyUsers(err)) | |
163 } | |
164 | |
165 func TestInMemoryDB(t *testing.T) { | |
166 testDB(t, NewInMemoryDB()) | |
167 } | |
168 | |
169 func TestInMemoryTooManyUsers(t *testing.T) { | |
170 testTooManyUsers(t, NewInMemoryDB()) | |
171 } | |
OLD | NEW |