blob: 20b7ae3d0ad90a3457fe75542f082aa86b71e5c5 [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"
"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",
},
},
}
deepequal.AssertCopy(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())
}