blob: 93e1b6e843a33d7d136f37a5efc6b71cd2e36948 [file] [log] [blame]
package autoroll
import (
"testing"
"time"
"github.com/golang/protobuf/ptypes"
"github.com/golang/protobuf/ptypes/timestamp"
"github.com/stretchr/testify/require"
buildbucketpb "go.chromium.org/luci/buildbucket/proto"
"go.skia.org/infra/go/comment"
"go.skia.org/infra/go/deepequal/assertdeep"
"go.skia.org/infra/go/github"
"go.skia.org/infra/go/testutils/unittest"
)
func TestAutoRollIssueCopy(t *testing.T) {
unittest.SmallTest(t)
roll := &AutoRollIssue{
Closed: true,
Comments: []*comment.Comment{
{
Id: "123",
Message: "hello world",
Timestamp: time.Now(),
User: "me@google.com",
},
},
Committed: true,
Created: time.Now(),
CqFinished: true,
CqSuccess: true,
DryRunFinished: true,
DryRunSuccess: true,
IsDryRun: true,
Issue: 123,
Modified: time.Now(),
Patchsets: []int64{1},
Result: ROLL_RESULT_SUCCESS,
RollingFrom: "abc123",
RollingTo: "def456",
Subject: "Roll src/third_party/skia abc123..def456 (3 commits).",
TryResults: []*TryResult{
{
Builder: "build",
Category: "cats",
Created: time.Now(),
Result: TRYBOT_RESULT_SUCCESS,
Status: TRYBOT_STATUS_COMPLETED,
Url: "http://build/cats",
},
},
}
assertdeep.Copy(t, roll, roll.Copy())
}
func ts(t time.Time) *timestamp.Timestamp {
rv, err := ptypes.TimestampProto(t)
if err != nil {
panic(err)
}
return rv
}
func TestTrybotResults(t *testing.T) {
unittest.SmallTest(t)
// Create a fake roll with one in-progress trybot.
roll := &AutoRollIssue{
Closed: false,
Committed: false,
Created: time.Now(),
Issue: 123,
Modified: time.Now(),
Patchsets: []int64{1},
Subject: "Roll src/third_party/skia abc123..def456 (3 commits).",
}
roll.Result = RollResult(roll)
trybot := &buildbucketpb.Build{
Builder: &buildbucketpb.BuilderID{
Project: "skia",
Bucket: "fake",
Builder: "fake-builder",
},
CreateTime: ts(time.Now().UTC()),
Status: buildbucketpb.Status_STARTED,
Tags: []*buildbucketpb.StringPair{
{
Key: "user_agent",
Value: "cq",
},
{
Key: "cq_experimental",
Value: "false",
},
},
}
tryResult, err := TryResultFromBuildbucket(trybot)
require.NoError(t, err)
roll.TryResults = []*TryResult{tryResult}
require.False(t, roll.AllTrybotsFinished())
require.False(t, roll.AllTrybotsSucceeded())
// Trybot failed.
tryResult.Status = TRYBOT_STATUS_COMPLETED
tryResult.Result = TRYBOT_RESULT_FAILURE
require.True(t, roll.AllTrybotsFinished())
require.False(t, roll.AllTrybotsSucceeded())
retry := &buildbucketpb.Build{
Builder: &buildbucketpb.BuilderID{
Project: "skia",
Bucket: "fake",
Builder: "fake-builder",
},
CreateTime: ts(time.Now().UTC()),
Status: buildbucketpb.Status_STARTED,
Tags: []*buildbucketpb.StringPair{
{
Key: "user_agent",
Value: "cq",
},
{
Key: "cq_experimental",
Value: "false",
},
},
}
tryResult, err = TryResultFromBuildbucket(retry)
require.NoError(t, err)
roll.TryResults = append(roll.TryResults, tryResult)
require.False(t, roll.AllTrybotsFinished())
require.False(t, roll.AllTrybotsSucceeded())
// The second try result, a retry of the first, succeeded.
tryResult.Status = TRYBOT_STATUS_COMPLETED
tryResult.Result = TRYBOT_RESULT_SUCCESS
require.True(t, roll.AllTrybotsFinished())
require.True(t, roll.AllTrybotsSucceeded())
// Verify that the ordering of try results does not matter.
roll.TryResults[0], roll.TryResults[1] = roll.TryResults[1], roll.TryResults[0]
require.True(t, roll.AllTrybotsFinished())
require.True(t, roll.AllTrybotsSucceeded())
// Verify that an "experimental" trybot doesn't count against us.
exp := &buildbucketpb.Build{
Builder: &buildbucketpb.BuilderID{
Project: "skia",
Bucket: "fake",
Builder: "fake-builder",
},
CreateTime: ts(time.Now().UTC()),
Status: buildbucketpb.Status_STARTED,
Tags: []*buildbucketpb.StringPair{
{
Key: "user_agent",
Value: "cq",
},
{
Key: "cq_experimental",
Value: "true",
},
},
}
tryResult, err = TryResultFromBuildbucket(exp)
require.NoError(t, err)
roll.TryResults = append(roll.TryResults, tryResult)
require.True(t, roll.AllTrybotsFinished())
require.True(t, roll.AllTrybotsSucceeded())
}
func TestTryResultsFromGithubChecks(t *testing.T) {
unittest.SmallTest(t)
// Create local vars since you cannot take address of a const.
pendingState := github.CHECK_STATE_PENDING
failureState := github.CHECK_STATE_FAILURE
errorState := github.CHECK_STATE_ERROR
successState := github.CHECK_STATE_SUCCESS
id1 := int64(1)
id2 := int64(2)
id3 := int64(3)
id4 := int64(4)
context1 := "Check1"
context2 := "Check2"
context3 := "Check3"
context4 := "Check4"
checks := []*github.Check{
// Pending check.
{ID: id1, Name: context1, State: pendingState},
// Failed check.
{ID: id2, Name: context2, State: failureState},
// Error check.
{ID: id3, Name: context3, State: errorState},
// Success check.
{ID: id4, Name: context4, State: successState},
}
// Assert all try results.
tryResults := TryResultsFromGithubChecks(checks, []string{})
require.True(t, len(tryResults) == 4)
require.Equal(t, "Check1 #1", tryResults[0].Builder)
require.Equal(t, "cq", tryResults[0].Category)
require.Equal(t, "", tryResults[0].Result)
require.Equal(t, TRYBOT_STATUS_STARTED, tryResults[0].Status)
require.Equal(t, "Check2 #2", tryResults[1].Builder)
require.Equal(t, "cq", tryResults[1].Category)
require.Equal(t, TRYBOT_RESULT_FAILURE, tryResults[1].Result)
require.Equal(t, TRYBOT_STATUS_COMPLETED, tryResults[1].Status)
require.Equal(t, "Check3 #3", tryResults[2].Builder)
require.Equal(t, "cq", tryResults[2].Category)
require.Equal(t, TRYBOT_RESULT_FAILURE, tryResults[2].Result)
require.Equal(t, TRYBOT_STATUS_COMPLETED, tryResults[2].Status)
require.Equal(t, "Check4 #4", tryResults[3].Builder)
require.Equal(t, "cq", tryResults[3].Category)
require.Equal(t, TRYBOT_RESULT_SUCCESS, tryResults[3].Result)
require.Equal(t, TRYBOT_STATUS_COMPLETED, tryResults[3].Status)
// Specify a check to wait for and assert.
tryResults = TryResultsFromGithubChecks(checks, []string{context3})
require.True(t, len(tryResults) == 4)
require.Equal(t, "Check3 #3", tryResults[2].Builder)
require.Equal(t, "cq", tryResults[2].Category)
require.Equal(t, "", tryResults[2].Result)
require.Equal(t, TRYBOT_STATUS_STARTED, tryResults[2].Status)
}