| package find_breaks |
| |
| import ( |
| "testing" |
| |
| "go.skia.org/infra/go/testutils" |
| "go.skia.org/infra/task_scheduler/go/db" |
| |
| assert "github.com/stretchr/testify/require" |
| ) |
| |
| func TestFindFailures(t *testing.T) { |
| testutils.SmallTest(t) |
| |
| t1 := &db.Task{ |
| Id: "t1", |
| Status: db.TASK_STATUS_SUCCESS, |
| Commits: []string{"a"}, |
| } |
| t2 := &db.Task{ |
| Id: "t2", |
| Status: db.TASK_STATUS_FAILURE, |
| Commits: []string{"b", "c"}, |
| } |
| t3 := &db.Task{ |
| Id: "t3", |
| Status: db.TASK_STATUS_SUCCESS, |
| Commits: []string{"d"}, |
| } |
| t4 := &db.Task{ |
| Id: "t4", |
| Status: db.TASK_STATUS_FAILURE, |
| Commits: []string{"e"}, |
| } |
| t5 := &db.Task{ |
| Id: "t5", |
| Status: db.TASK_STATUS_FAILURE, |
| Commits: []string{"f", "g"}, |
| } |
| t6 := &db.Task{ |
| Id: "t6", |
| Status: db.TASK_STATUS_MISHAP, |
| Commits: []string{"e"}, |
| } |
| t7 := &db.Task{ |
| Id: "t7", |
| Status: db.TASK_STATUS_SUCCESS, |
| Commits: []string{"f", "g"}, |
| } |
| t8 := &db.Task{ |
| Id: "t8", |
| Status: db.TASK_STATUS_FAILURE, |
| Commits: []string{"d"}, |
| } |
| t9 := &db.Task{ |
| Id: "t9", |
| Status: db.TASK_STATUS_SUCCESS, |
| Commits: []string{"c"}, |
| } |
| t10 := &db.Task{ |
| Id: "t10", |
| Status: db.TASK_STATUS_SUCCESS, |
| Commits: []string{"h"}, |
| } |
| t11 := &db.Task{ |
| Id: "t11", |
| Status: db.TASK_STATUS_FAILURE, |
| Commits: []string{"h"}, |
| } |
| t12 := &db.Task{ |
| Id: "t12", |
| Status: db.TASK_STATUS_FAILURE, |
| Commits: []string{"g"}, |
| } |
| t13 := &db.Task{ |
| Id: "t13", |
| Status: db.TASK_STATUS_MISHAP, |
| Commits: []string{"f"}, |
| } |
| t14 := &db.Task{ |
| Id: "t14", |
| Status: db.TASK_STATUS_SUCCESS, |
| Commits: []string{"g"}, |
| } |
| |
| got, err := findFailuresForSpec([]*db.Task{t1, t2, t3, t4, t5}, []string{"a", "b", "c", "d", "e", "f", "g"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 2, len(got)) |
| |
| assert.Equal(t, t2.Id, got[0].id) |
| assert.Equal(t, newSlice(1, 3), got[0].brokeIn) |
| assert.Equal(t, newSlice(1, 3), got[0].failing) |
| assert.Equal(t, newSlice(3, 4), got[0].fixedIn) |
| |
| assert.Equal(t, t4.Id, got[1].id) |
| assert.Equal(t, newSlice(4, 5), got[1].brokeIn) |
| assert.Equal(t, newSlice(4, 7), got[1].failing) |
| assert.Equal(t, newSlice(-1, -1), got[1].fixedIn) |
| |
| // brokeIn starts at the first commit. |
| got, err = findFailuresForSpec([]*db.Task{t2, t3}, []string{"b", "c", "d"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(0, 2), got[0].brokeIn) |
| assert.Equal(t, newSlice(0, 2), got[0].failing) |
| assert.Equal(t, newSlice(2, 3), got[0].fixedIn) |
| |
| // Same thing, fixedIn empty. |
| got, err = findFailuresForSpec([]*db.Task{t2}, []string{"b", "c", "d"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(0, 2), got[0].brokeIn) |
| assert.Equal(t, newSlice(0, 2), got[0].failing) |
| assert.Equal(t, newSlice(-1, -1), got[0].fixedIn) |
| |
| // Same thing, but with a gap at the beginning. |
| got, err = findFailuresForSpec([]*db.Task{t2}, []string{"a", "b", "c", "d"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(0, 3), got[0].brokeIn) |
| assert.Equal(t, newSlice(0, 3), got[0].failing) |
| assert.Equal(t, newSlice(-1, -1), got[0].fixedIn) |
| |
| // Success, mishap, success. |
| got, err = findFailuresForSpec([]*db.Task{t3, t6, t7}, []string{"d", "e", "f", "g"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 0, len(got)) |
| |
| // Failure, mishap, failure. |
| got, err = findFailuresForSpec([]*db.Task{t8, t6, t5}, []string{"d", "e", "f", "g"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(0, 1), got[0].brokeIn) |
| assert.Equal(t, newSlice(0, 4), got[0].failing) |
| assert.Equal(t, newSlice(-1, -1), got[0].fixedIn) |
| |
| // Success, failure, mishap, failure. |
| got, err = findFailuresForSpec([]*db.Task{t9, t8, t6, t5}, []string{"c", "d", "e", "f", "g"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(1, 2), got[0].brokeIn) |
| assert.Equal(t, newSlice(1, 5), got[0].failing) |
| assert.Equal(t, newSlice(-1, -1), got[0].fixedIn) |
| |
| // Success, mishap, failure. |
| got, err = findFailuresForSpec([]*db.Task{t3, t6, t5}, []string{"d", "e", "f", "g"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(1, 4), got[0].brokeIn) |
| assert.Equal(t, newSlice(1, 4), got[0].failing) |
| assert.Equal(t, newSlice(-1, -1), got[0].fixedIn) |
| |
| // Success, mishap, failure, success. |
| got, err = findFailuresForSpec([]*db.Task{t3, t6, t5, t10}, []string{"d", "e", "f", "g", "h"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(1, 4), got[0].brokeIn) |
| assert.Equal(t, newSlice(1, 4), got[0].failing) |
| assert.Equal(t, newSlice(4, 5), got[0].fixedIn) |
| |
| // Success, failure, mishap, extra untested commits. |
| got, err = findFailuresForSpec([]*db.Task{t9, t8, t6}, []string{"c", "d", "e", "f", "g"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(1, 2), got[0].brokeIn) |
| assert.Equal(t, newSlice(1, 2), got[0].failing) |
| assert.Equal(t, newSlice(-1, -1), got[0].fixedIn) |
| |
| // Success, failure, mishap, success. |
| got, err = findFailuresForSpec([]*db.Task{t9, t8, t6, t7}, []string{"c", "d", "e", "f", "g"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(1, 2), got[0].brokeIn) |
| assert.Equal(t, newSlice(1, 2), got[0].failing) |
| assert.Equal(t, newSlice(2, 5), got[0].fixedIn) |
| |
| // Success, mishap, failure, failure. |
| got, err = findFailuresForSpec([]*db.Task{t3, t6, t5, t11}, []string{"d", "e", "f", "g", "h"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(1, 4), got[0].brokeIn) |
| assert.Equal(t, newSlice(1, 5), got[0].failing) |
| assert.Equal(t, newSlice(-1, -1), got[0].fixedIn) |
| |
| // Mishap, failure. The failure could have happened at either task. |
| got, err = findFailuresForSpec([]*db.Task{t6, t5}, []string{"e", "f", "g"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(0, 3), got[0].brokeIn) |
| assert.Equal(t, newSlice(0, 3), got[0].failing) |
| assert.Equal(t, newSlice(-1, -1), got[0].fixedIn) |
| |
| // Mishap, failure, success. |
| got, err = findFailuresForSpec([]*db.Task{t6, t5, t10}, []string{"e", "f", "g", "h"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(0, 3), got[0].brokeIn) |
| assert.Equal(t, newSlice(0, 3), got[0].failing) |
| assert.Equal(t, newSlice(3, 4), got[0].fixedIn) |
| |
| // Success, gap, success. |
| got, err = findFailuresForSpec([]*db.Task{t3, t7}, []string{"d", "e", "f", "g"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 0, len(got)) |
| |
| // Success, mishap, mishap, failure. |
| got, err = findFailuresForSpec([]*db.Task{t3, t6, t13, t12}, []string{"d", "e", "f", "g"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(1, 4), got[0].brokeIn) |
| assert.Equal(t, newSlice(1, 4), got[0].failing) |
| assert.Equal(t, newSlice(-1, -1), got[0].fixedIn) |
| |
| // Failure, mishap, mishap, success. |
| got, err = findFailuresForSpec([]*db.Task{t8, t6, t13, t14}, []string{"d", "e", "f", "g"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(0, 1), got[0].brokeIn) |
| assert.Equal(t, newSlice(0, 1), got[0].failing) |
| assert.Equal(t, newSlice(1, 4), got[0].fixedIn) |
| |
| // Failure, gap, failure. |
| got, err = findFailuresForSpec([]*db.Task{t8, t5}, []string{"d", "e", "f", "g"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(0, 1), got[0].brokeIn) |
| assert.Equal(t, newSlice(0, 4), got[0].failing) |
| assert.Equal(t, newSlice(-1, -1), got[0].fixedIn) |
| |
| // Success, failure, gap, failure. |
| got, err = findFailuresForSpec([]*db.Task{t9, t8, t5}, []string{"c", "d", "e", "f", "g"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(1, 2), got[0].brokeIn) |
| assert.Equal(t, newSlice(1, 5), got[0].failing) |
| assert.Equal(t, newSlice(-1, -1), got[0].fixedIn) |
| |
| // Success, gap, failure. |
| got, err = findFailuresForSpec([]*db.Task{t3, t5}, []string{"d", "e", "f", "g"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(1, 4), got[0].brokeIn) |
| assert.Equal(t, newSlice(1, 4), got[0].failing) |
| assert.Equal(t, newSlice(-1, -1), got[0].fixedIn) |
| |
| // Success, gap, failure, success. |
| got, err = findFailuresForSpec([]*db.Task{t3, t5, t10}, []string{"d", "e", "f", "g", "h"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(1, 4), got[0].brokeIn) |
| assert.Equal(t, newSlice(1, 4), got[0].failing) |
| assert.Equal(t, newSlice(4, 5), got[0].fixedIn) |
| |
| // Success, gap, failure, failure. |
| got, err = findFailuresForSpec([]*db.Task{t3, t5, t11}, []string{"d", "e", "f", "g", "h"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(1, 4), got[0].brokeIn) |
| assert.Equal(t, newSlice(1, 5), got[0].failing) |
| assert.Equal(t, newSlice(-1, -1), got[0].fixedIn) |
| |
| // Gap, failure. |
| got, err = findFailuresForSpec([]*db.Task{t5}, []string{"e", "f", "g"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(0, 3), got[0].brokeIn) |
| assert.Equal(t, newSlice(0, 3), got[0].failing) |
| assert.Equal(t, newSlice(-1, -1), got[0].fixedIn) |
| |
| // Gap, failure, success. |
| got, err = findFailuresForSpec([]*db.Task{t5, t10}, []string{"e", "f", "g", "h"}) |
| assert.NoError(t, err) |
| assert.Equal(t, 1, len(got)) |
| assert.Equal(t, newSlice(0, 3), got[0].brokeIn) |
| assert.Equal(t, newSlice(0, 3), got[0].failing) |
| assert.Equal(t, newSlice(3, 4), got[0].fixedIn) |
| } |