blob: f0fb717e801b4c0c4478f3e6363850d1ab2ac932 [file] [log] [blame]
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)
}