| Index: build_scheduler/go/db/task_test.go
|
| diff --git a/build_scheduler/go/db/task_test.go b/build_scheduler/go/db/task_test.go
|
| index 6552978df7e3d3e681a3af201ac68ea2a18f7ea2..889f224a827e1ac24f482d53744c45b7892129d6 100644
|
| --- a/build_scheduler/go/db/task_test.go
|
| +++ b/build_scheduler/go/db/task_test.go
|
| @@ -1,7 +1,10 @@
|
| package db
|
|
|
| import (
|
| + "bytes"
|
| + "encoding/gob"
|
| "fmt"
|
| + "sort"
|
| "testing"
|
| "time"
|
|
|
| @@ -171,3 +174,114 @@ func TestUpdateFromSwarming(t *testing.T) {
|
| Swarming: s,
|
| })
|
| }
|
| +
|
| +// Test that sort.Sort(TaskSlice(...)) works correctly.
|
| +func TestSort(t *testing.T) {
|
| + tasks := []*Task{}
|
| + addTask := func(ts time.Time) {
|
| + task := &Task{
|
| + Created: ts,
|
| + }
|
| + tasks = append(tasks, task)
|
| + }
|
| +
|
| + // Add tasks with various creation timestamps.
|
| + addTask(time.Date(2008, time.August, 8, 8, 8, 8, 8, time.UTC)) // 0
|
| + addTask(time.Date(1776, time.July, 4, 13, 0, 0, 0, time.UTC)) // 1
|
| + addTask(time.Date(2016, time.December, 31, 23, 59, 59, 999999999, time.UTC)) // 2
|
| + addTask(time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC)) // 3
|
| +
|
| + // Manually sort.
|
| + expected := []*Task{tasks[1], tasks[3], tasks[0], tasks[2]}
|
| +
|
| + sort.Sort(TaskSlice(tasks))
|
| +
|
| + testutils.AssertDeepEqual(t, expected, tasks)
|
| +}
|
| +
|
| +func TestTaskEncoder(t *testing.T) {
|
| + // TODO(benjaminwagner): Is there any way to cause an error?
|
| + e := TaskEncoder{}
|
| + expectedTasks := map[*Task][]byte{}
|
| + for i := 0; i < 25; i++ {
|
| + task := &Task{}
|
| + task.Id = fmt.Sprintf("Id-%d", i)
|
| + task.Name = "Bingo-was-his-name-o"
|
| + task.Commits = []string{fmt.Sprintf("a%d", i), fmt.Sprintf("b%d", i+1)}
|
| + var buf bytes.Buffer
|
| + err := gob.NewEncoder(&buf).Encode(task)
|
| + assert.NoError(t, err)
|
| + expectedTasks[task] = buf.Bytes()
|
| + assert.True(t, e.Process(task))
|
| + }
|
| +
|
| + actualTasks := map[*Task][]byte{}
|
| + for task, serialized, err := e.Next(); task != nil; task, serialized, err = e.Next() {
|
| + assert.NoError(t, err)
|
| + actualTasks[task] = serialized
|
| + }
|
| + testutils.AssertDeepEqual(t, expectedTasks, actualTasks)
|
| +}
|
| +
|
| +func TestTaskEncoderNoTasks(t *testing.T) {
|
| + e := TaskEncoder{}
|
| + task, serialized, err := e.Next()
|
| + assert.NoError(t, err)
|
| + assert.Nil(t, task)
|
| + assert.Nil(t, serialized)
|
| +}
|
| +
|
| +func TestTaskDecoder(t *testing.T) {
|
| + d := TaskDecoder{}
|
| + expectedTasks := map[string]*Task{}
|
| + for i := 0; i < 25; i++ {
|
| + task := &Task{}
|
| + task.Id = fmt.Sprintf("Id-%d", i)
|
| + task.Name = "Bingo-was-his-name-o"
|
| + task.Commits = []string{fmt.Sprintf("a%d", i), fmt.Sprintf("b%d", i+1)}
|
| + var buf bytes.Buffer
|
| + err := gob.NewEncoder(&buf).Encode(task)
|
| + assert.NoError(t, err)
|
| + expectedTasks[task.Id] = task
|
| + assert.True(t, d.Process(buf.Bytes()))
|
| + }
|
| +
|
| + actualTasks := map[string]*Task{}
|
| + result, err := d.Result()
|
| + assert.NoError(t, err)
|
| + assert.Equal(t, len(expectedTasks), len(result))
|
| + for _, task := range result {
|
| + actualTasks[task.Id] = task
|
| + }
|
| + testutils.AssertDeepEqual(t, expectedTasks, actualTasks)
|
| +}
|
| +
|
| +func TestTaskDecoderNoTasks(t *testing.T) {
|
| + d := TaskDecoder{}
|
| + result, err := d.Result()
|
| + assert.NoError(t, err)
|
| + assert.Equal(t, 0, len(result))
|
| +}
|
| +
|
| +func TestTaskDecoderError(t *testing.T) {
|
| + task := &Task{}
|
| + task.Id = "Id"
|
| + var buf bytes.Buffer
|
| + err := gob.NewEncoder(&buf).Encode(task)
|
| + assert.NoError(t, err)
|
| + serialized := buf.Bytes()
|
| + invalid := append([]byte("Hi Mom!"), serialized...)
|
| +
|
| + d := TaskDecoder{}
|
| + // Process should return true before it encounters an invalid result.
|
| + assert.True(t, d.Process(serialized))
|
| + assert.True(t, d.Process(serialized))
|
| + // Process may return true or false after encountering an invalid value.
|
| + _ = d.Process(invalid)
|
| + _ = d.Process(serialized)
|
| +
|
| + // Result should return error.
|
| + result, err := d.Result()
|
| + assert.Error(t, err)
|
| + assert.Equal(t, 0, len(result))
|
| +}
|
|
|