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