OLD | NEW |
1 package db | 1 package db |
2 | 2 |
3 import ( | 3 import ( |
| 4 "bytes" |
| 5 "encoding/gob" |
4 "fmt" | 6 "fmt" |
| 7 "sort" |
5 "testing" | 8 "testing" |
6 "time" | 9 "time" |
7 | 10 |
8 "github.com/luci/luci-go/common/api/swarming/swarming/v1" | 11 "github.com/luci/luci-go/common/api/swarming/swarming/v1" |
9 assert "github.com/stretchr/testify/require" | 12 assert "github.com/stretchr/testify/require" |
10 | 13 |
11 "go.skia.org/infra/go/testutils" | 14 "go.skia.org/infra/go/testutils" |
12 ) | 15 ) |
13 | 16 |
14 func TestUpdateFromSwarming(t *testing.T) { | 17 func TestUpdateFromSwarming(t *testing.T) { |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 Id: "C", | 167 Id: "C", |
165 Name: "C", | 168 Name: "C", |
166 Repo: "C", | 169 Repo: "C", |
167 Revision: "C", | 170 Revision: "C", |
168 Created: now.Add(2 * time.Hour), | 171 Created: now.Add(2 * time.Hour), |
169 Status: TASK_STATUS_FAILURE, | 172 Status: TASK_STATUS_FAILURE, |
170 IsolatedOutput: "D", | 173 IsolatedOutput: "D", |
171 Swarming: s, | 174 Swarming: s, |
172 }) | 175 }) |
173 } | 176 } |
| 177 |
| 178 // Test that sort.Sort(TaskSlice(...)) works correctly. |
| 179 func TestSort(t *testing.T) { |
| 180 tasks := []*Task{} |
| 181 addTask := func(ts time.Time) { |
| 182 task := &Task{ |
| 183 Created: ts, |
| 184 } |
| 185 tasks = append(tasks, task) |
| 186 } |
| 187 |
| 188 // Add tasks with various creation timestamps. |
| 189 addTask(time.Date(2008, time.August, 8, 8, 8, 8, 8, time.UTC))
// 0 |
| 190 addTask(time.Date(1776, time.July, 4, 13, 0, 0, 0, time.UTC))
// 1 |
| 191 addTask(time.Date(2016, time.December, 31, 23, 59, 59, 999999999, time.U
TC)) // 2 |
| 192 addTask(time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC))
// 3 |
| 193 |
| 194 // Manually sort. |
| 195 expected := []*Task{tasks[1], tasks[3], tasks[0], tasks[2]} |
| 196 |
| 197 sort.Sort(TaskSlice(tasks)) |
| 198 |
| 199 testutils.AssertDeepEqual(t, expected, tasks) |
| 200 } |
| 201 |
| 202 func TestTaskEncoder(t *testing.T) { |
| 203 // TODO(benjaminwagner): Is there any way to cause an error? |
| 204 e := TaskEncoder{} |
| 205 expectedTasks := map[*Task][]byte{} |
| 206 for i := 0; i < 25; i++ { |
| 207 task := &Task{} |
| 208 task.Id = fmt.Sprintf("Id-%d", i) |
| 209 task.Name = "Bingo-was-his-name-o" |
| 210 task.Commits = []string{fmt.Sprintf("a%d", i), fmt.Sprintf("b%d"
, i+1)} |
| 211 var buf bytes.Buffer |
| 212 err := gob.NewEncoder(&buf).Encode(task) |
| 213 assert.NoError(t, err) |
| 214 expectedTasks[task] = buf.Bytes() |
| 215 assert.True(t, e.Process(task)) |
| 216 } |
| 217 |
| 218 actualTasks := map[*Task][]byte{} |
| 219 for task, serialized, err := e.Next(); task != nil; task, serialized, er
r = e.Next() { |
| 220 assert.NoError(t, err) |
| 221 actualTasks[task] = serialized |
| 222 } |
| 223 testutils.AssertDeepEqual(t, expectedTasks, actualTasks) |
| 224 } |
| 225 |
| 226 func TestTaskEncoderNoTasks(t *testing.T) { |
| 227 e := TaskEncoder{} |
| 228 task, serialized, err := e.Next() |
| 229 assert.NoError(t, err) |
| 230 assert.Nil(t, task) |
| 231 assert.Nil(t, serialized) |
| 232 } |
| 233 |
| 234 func TestTaskDecoder(t *testing.T) { |
| 235 d := TaskDecoder{} |
| 236 expectedTasks := map[string]*Task{} |
| 237 for i := 0; i < 25; i++ { |
| 238 task := &Task{} |
| 239 task.Id = fmt.Sprintf("Id-%d", i) |
| 240 task.Name = "Bingo-was-his-name-o" |
| 241 task.Commits = []string{fmt.Sprintf("a%d", i), fmt.Sprintf("b%d"
, i+1)} |
| 242 var buf bytes.Buffer |
| 243 err := gob.NewEncoder(&buf).Encode(task) |
| 244 assert.NoError(t, err) |
| 245 expectedTasks[task.Id] = task |
| 246 assert.True(t, d.Process(buf.Bytes())) |
| 247 } |
| 248 |
| 249 actualTasks := map[string]*Task{} |
| 250 result, err := d.Result() |
| 251 assert.NoError(t, err) |
| 252 assert.Equal(t, len(expectedTasks), len(result)) |
| 253 for _, task := range result { |
| 254 actualTasks[task.Id] = task |
| 255 } |
| 256 testutils.AssertDeepEqual(t, expectedTasks, actualTasks) |
| 257 } |
| 258 |
| 259 func TestTaskDecoderNoTasks(t *testing.T) { |
| 260 d := TaskDecoder{} |
| 261 result, err := d.Result() |
| 262 assert.NoError(t, err) |
| 263 assert.Equal(t, 0, len(result)) |
| 264 } |
| 265 |
| 266 func TestTaskDecoderError(t *testing.T) { |
| 267 task := &Task{} |
| 268 task.Id = "Id" |
| 269 var buf bytes.Buffer |
| 270 err := gob.NewEncoder(&buf).Encode(task) |
| 271 assert.NoError(t, err) |
| 272 serialized := buf.Bytes() |
| 273 invalid := append([]byte("Hi Mom!"), serialized...) |
| 274 |
| 275 d := TaskDecoder{} |
| 276 // Process should return true before it encounters an invalid result. |
| 277 assert.True(t, d.Process(serialized)) |
| 278 assert.True(t, d.Process(serialized)) |
| 279 // Process may return true or false after encountering an invalid value. |
| 280 _ = d.Process(invalid) |
| 281 _ = d.Process(serialized) |
| 282 |
| 283 // Result should return error. |
| 284 result, err := d.Result() |
| 285 assert.Error(t, err) |
| 286 assert.Equal(t, 0, len(result)) |
| 287 } |
OLD | NEW |