OLD | NEW |
| (Empty) |
1 package db | |
2 | |
3 import ( | |
4 "testing" | |
5 "time" | |
6 | |
7 assert "github.com/stretchr/testify/require" | |
8 "go.skia.org/infra/go/testutils" | |
9 ) | |
10 | |
11 func testGetTasksForCommits(t *testing.T, c TaskCache, b *Task) { | |
12 for _, commit := range b.Commits { | |
13 found, err := c.GetTaskForCommit(DEFAULT_TEST_REPO, commit, b.Na
me) | |
14 assert.NoError(t, err) | |
15 testutils.AssertDeepEqual(t, b, found) | |
16 | |
17 tasks, err := c.GetTasksForCommits(DEFAULT_TEST_REPO, []string{c
ommit}) | |
18 assert.NoError(t, err) | |
19 testutils.AssertDeepEqual(t, map[string]map[string]*Task{ | |
20 commit: map[string]*Task{ | |
21 b.Name: b, | |
22 }, | |
23 }, tasks) | |
24 } | |
25 } | |
26 | |
27 func TestDBCache(t *testing.T) { | |
28 db := NewInMemoryDB() | |
29 defer testutils.AssertCloses(t, db) | |
30 | |
31 // Pre-load a task into the DB. | |
32 startTime := time.Now().Add(-30 * time.Minute) // Arbitrary starting poi
nt. | |
33 t1 := makeTask(startTime, []string{"a", "b", "c", "d"}) | |
34 assert.NoError(t, db.PutTask(t1)) | |
35 | |
36 // Create the cache. Ensure that the existing task is present. | |
37 c, err := NewTaskCache(db, time.Hour) | |
38 assert.NoError(t, err) | |
39 testGetTasksForCommits(t, c, t1) | |
40 | |
41 // Bisect the first task. | |
42 t2 := makeTask(startTime.Add(time.Minute), []string{"c", "d"}) | |
43 t1.Commits = []string{"a", "b"} | |
44 assert.NoError(t, db.PutTasks([]*Task{t2, t1})) | |
45 assert.NoError(t, c.Update()) | |
46 | |
47 // Ensure that t2 (and not t1) shows up for commits "c" and "d". | |
48 testGetTasksForCommits(t, c, t1) | |
49 testGetTasksForCommits(t, c, t2) | |
50 | |
51 // Insert a task on a second bot. | |
52 t3 := makeTask(startTime.Add(2*time.Minute), []string{"a", "b"}) | |
53 t3.Name = "Another-Task" | |
54 assert.NoError(t, db.PutTask(t3)) | |
55 assert.NoError(t, c.Update()) | |
56 tasks, err := c.GetTasksForCommits(DEFAULT_TEST_REPO, []string{"b"}) | |
57 assert.NoError(t, err) | |
58 testutils.AssertDeepEqual(t, map[string]map[string]*Task{ | |
59 "b": map[string]*Task{ | |
60 t1.Name: t1, | |
61 t3.Name: t3, | |
62 }, | |
63 }, tasks) | |
64 } | |
65 | |
66 func TestDBCacheMultiRepo(t *testing.T) { | |
67 db := NewInMemoryDB() | |
68 defer testutils.AssertCloses(t, db) | |
69 | |
70 // Insert several tasks with different repos. | |
71 startTime := time.Now().Add(-30 * time.Minute) // Arbitrary starting poi
nt. | |
72 t1 := makeTask(startTime, []string{"a", "b"}) // Default Repo. | |
73 t2 := makeTask(startTime, []string{"a", "b"}) | |
74 t2.Repo = "thats-what-you.git" | |
75 t3 := makeTask(startTime, []string{"b", "c"}) | |
76 t3.Repo = "never-for.git" | |
77 assert.NoError(t, db.PutTasks([]*Task{t1, t2, t3})) | |
78 | |
79 // Create the cache. | |
80 c, err := NewTaskCache(db, time.Hour) | |
81 assert.NoError(t, err) | |
82 | |
83 // Check that there's no conflict among the tasks in different repos. | |
84 { | |
85 tasks, err := c.GetTasksForCommits(t1.Repo, []string{"a", "b", "
c"}) | |
86 assert.NoError(t, err) | |
87 testutils.AssertDeepEqual(t, map[string]map[string]*Task{ | |
88 "a": map[string]*Task{ | |
89 t1.Name: t1, | |
90 }, | |
91 "b": map[string]*Task{ | |
92 t1.Name: t1, | |
93 }, | |
94 "c": map[string]*Task{}, | |
95 }, tasks) | |
96 } | |
97 | |
98 { | |
99 tasks, err := c.GetTasksForCommits(t2.Repo, []string{"a", "b", "
c"}) | |
100 assert.NoError(t, err) | |
101 testutils.AssertDeepEqual(t, map[string]map[string]*Task{ | |
102 "a": map[string]*Task{ | |
103 t1.Name: t2, | |
104 }, | |
105 "b": map[string]*Task{ | |
106 t1.Name: t2, | |
107 }, | |
108 "c": map[string]*Task{}, | |
109 }, tasks) | |
110 } | |
111 | |
112 { | |
113 tasks, err := c.GetTasksForCommits(t3.Repo, []string{"a", "b", "
c"}) | |
114 assert.NoError(t, err) | |
115 testutils.AssertDeepEqual(t, map[string]map[string]*Task{ | |
116 "a": map[string]*Task{}, | |
117 "b": map[string]*Task{ | |
118 t1.Name: t3, | |
119 }, | |
120 "c": map[string]*Task{ | |
121 t1.Name: t3, | |
122 }, | |
123 }, tasks) | |
124 } | |
125 } | |
126 | |
127 func TestDBCacheReset(t *testing.T) { | |
128 db := NewInMemoryDB() | |
129 defer testutils.AssertCloses(t, db) | |
130 | |
131 // Pre-load a task into the DB. | |
132 startTime := time.Now().Add(-30 * time.Minute) // Arbitrary starting poi
nt. | |
133 t1 := makeTask(startTime, []string{"a", "b", "c", "d"}) | |
134 assert.NoError(t, db.PutTask(t1)) | |
135 | |
136 // Create the cache. Ensure that the existing task is present. | |
137 c, err := NewTaskCache(db, time.Hour) | |
138 assert.NoError(t, err) | |
139 testGetTasksForCommits(t, c, t1) | |
140 | |
141 // Pretend the DB connection is lost. | |
142 db.StopTrackingModifiedTasks(c.(*taskCache).queryId) | |
143 | |
144 // Make an update. | |
145 t2 := makeTask(startTime.Add(time.Minute), []string{"c", "d"}) | |
146 t1.Commits = []string{"a", "b"} | |
147 assert.NoError(t, db.PutTasks([]*Task{t2, t1})) | |
148 | |
149 // Ensure cache gets reset. | |
150 assert.NoError(t, c.Update()) | |
151 testGetTasksForCommits(t, c, t1) | |
152 testGetTasksForCommits(t, c, t2) | |
153 } | |
154 | |
155 func TestCacheUnfinished(t *testing.T) { | |
156 db := NewInMemoryDB() | |
157 defer testutils.AssertCloses(t, db) | |
158 | |
159 // Insert a task. | |
160 startTime := time.Now().Add(-30 * time.Minute) | |
161 t1 := makeTask(startTime, []string{"a"}) | |
162 assert.False(t, t1.Done()) | |
163 assert.NoError(t, db.PutTask(t1)) | |
164 | |
165 // Create the cache. Ensure that the existing task is present. | |
166 c, err := NewTaskCache(db, time.Hour) | |
167 assert.NoError(t, err) | |
168 tasks, err := c.UnfinishedTasks() | |
169 assert.NoError(t, err) | |
170 testutils.AssertDeepEqual(t, []*Task{t1}, tasks) | |
171 | |
172 // Finish the task. Insert it, ensure that it's not unfinished. | |
173 t1.Status = TASK_STATUS_SUCCESS | |
174 assert.True(t, t1.Done()) | |
175 assert.NoError(t, db.PutTask(t1)) | |
176 assert.NoError(t, c.Update()) | |
177 tasks, err = c.UnfinishedTasks() | |
178 assert.NoError(t, err) | |
179 testutils.AssertDeepEqual(t, []*Task{}, tasks) | |
180 | |
181 // Already-finished task. | |
182 t2 := makeTask(time.Now(), []string{"a"}) | |
183 t2.Status = TASK_STATUS_MISHAP | |
184 assert.True(t, t2.Done()) | |
185 assert.NoError(t, db.PutTask(t2)) | |
186 assert.NoError(t, c.Update()) | |
187 tasks, err = c.UnfinishedTasks() | |
188 assert.NoError(t, err) | |
189 testutils.AssertDeepEqual(t, []*Task{}, tasks) | |
190 | |
191 // An unfinished task, created after the cache was created. | |
192 t3 := makeTask(time.Now(), []string{"b"}) | |
193 assert.False(t, t3.Done()) | |
194 assert.NoError(t, db.PutTask(t3)) | |
195 assert.NoError(t, c.Update()) | |
196 tasks, err = c.UnfinishedTasks() | |
197 assert.NoError(t, err) | |
198 testutils.AssertDeepEqual(t, []*Task{t3}, tasks) | |
199 | |
200 // Update the task. | |
201 t3.Commits = []string{"c", "d", "f"} | |
202 assert.False(t, t3.Done()) | |
203 assert.NoError(t, db.PutTask(t3)) | |
204 assert.NoError(t, c.Update()) | |
205 tasks, err = c.UnfinishedTasks() | |
206 assert.NoError(t, err) | |
207 testutils.AssertDeepEqual(t, []*Task{t3}, tasks) | |
208 } | |
OLD | NEW |