blob: 03ee3f9809eb8e40c1f56e3f77996afe4282f794 [file] [log] [blame]
package strategy
import (
"fmt"
"testing"
"github.com/stretchr/testify/require"
"go.skia.org/infra/autoroll/go/revision"
"go.skia.org/infra/go/testutils/unittest"
)
func TestStrategyBatch(t *testing.T) {
unittest.SmallTest(t)
s := StrategyBatch()
// No revisions to roll.
require.Nil(t, s.GetNextRollRev(nil))
require.Nil(t, s.GetNextRollRev([]*revision.Revision{}))
// More than one revision available. We should choose the most recent.
// Revisions are passed in reverse chronological order.
testRevs := []*revision.Revision{
{
Id: "D",
},
{
Id: "C",
},
{
Id: "B",
},
{
Id: "A",
},
}
require.Equal(t, testRevs[0], s.GetNextRollRev(testRevs))
// The most recent is not valid; we should choose the most recent valid
// revision.
testRevs[0].InvalidReason = "flu"
require.Equal(t, testRevs[1], s.GetNextRollRev(testRevs))
// No revisions are valid. We can't roll.
for _, rev := range testRevs {
rev.InvalidReason = "flu"
}
require.Nil(t, s.GetNextRollRev(testRevs))
}
func TestStrategyNBatch(t *testing.T) {
unittest.SmallTest(t)
s := StrategyNBatch()
// No revisions to roll.
require.Nil(t, s.GetNextRollRev(nil))
require.Nil(t, s.GetNextRollRev([]*revision.Revision{}))
// More than one revision available. We should choose the Nth (from the
// end of the slice, since Revisions are passed in reverse chronological
// order).
testRevs := make([]*revision.Revision, 0, N_REVISIONS+2)
for i := 0; i < N_REVISIONS+2; i++ {
testRevs = append(testRevs, &revision.Revision{
Id: fmt.Sprintf("%d", N_REVISIONS+2-i),
})
}
nthIdx := len(testRevs) - N_REVISIONS
require.Equal(t, testRevs[nthIdx], s.GetNextRollRev(testRevs))
// The above Revision is not valid; we should choose the most recent
// valid Revision *before* it.
testRevs[nthIdx].InvalidReason = "flu"
require.Equal(t, testRevs[nthIdx+1], s.GetNextRollRev(testRevs))
// No revisions are valid. We can't roll.
for _, rev := range testRevs {
rev.InvalidReason = "flu"
}
require.Nil(t, s.GetNextRollRev(testRevs))
}
func TestStrategySingle(t *testing.T) {
unittest.SmallTest(t)
s := StrategySingle()
// No revisions to roll.
require.Nil(t, s.GetNextRollRev(nil))
require.Nil(t, s.GetNextRollRev([]*revision.Revision{}))
// More than one revision available. We should choose the oldest.
// Revisions are passed in reverse chronological order.
testRevs := []*revision.Revision{
{
Id: "D",
},
{
Id: "C",
},
{
Id: "B",
},
{
Id: "A",
},
}
require.Equal(t, testRevs[len(testRevs)-1], s.GetNextRollRev(testRevs))
// The most recent is not valid; we should choose the most recent valid
// revision.
testRevs[len(testRevs)-1].InvalidReason = "flu"
require.Equal(t, testRevs[len(testRevs)-2], s.GetNextRollRev(testRevs))
// No revisions are valid. We can't roll.
for _, rev := range testRevs {
rev.InvalidReason = "flu"
}
require.Nil(t, s.GetNextRollRev(testRevs))
}