blob: 373c9549c730eae3adcd3cbbece9c1f5f0c63c0b [file] [log] [blame]
package catapult
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
swarmingV1 "go.chromium.org/luci/common/api/swarming/swarming/v1"
"go.skia.org/infra/pinpoint/go/compare"
"go.skia.org/infra/pinpoint/go/midpoint"
"go.skia.org/infra/pinpoint/go/workflows"
"go.skia.org/infra/pinpoint/go/workflows/internal"
pinpoint_proto "go.skia.org/infra/pinpoint/proto/v1"
"go.temporal.io/sdk/testsuite"
"go.temporal.io/sdk/workflow"
)
func TestParseImprovementDirection_Up_0(t *testing.T) {
assert.Equal(t, int32(0), parseImprovementDir(compare.Up))
}
func TestParseImprovementDirection_Down_1(t *testing.T) {
assert.Equal(t, int32(1), parseImprovementDir(compare.Down))
}
func TestParseImprovementDirection_UnknownDir_4(t *testing.T) {
assert.Equal(t, int32(4), parseImprovementDir(compare.UnknownDir))
}
// mockParseRunDataWorkflow is a helper function to wrap parseRunData() under a workflow to mock the FetchTaskActivity calls.
func mockParseRunDataWorkflow(ctx workflow.Context, runData []*internal.BisectRun) (*pinpoint_proto.LegacyJobResponse, error) {
ctx = workflow.WithChildOptions(ctx, childWorkflowOptions)
ctx = workflow.WithActivityOptions(ctx, regularActivityOptions)
commitToAttempts, bots, _ := parseRunData(ctx, runData)
resp := &pinpoint_proto.LegacyJobResponse{
Bots: bots,
State: []*pinpoint_proto.LegacyJobResponse_State{},
}
for _, attempts := range commitToAttempts {
state := &pinpoint_proto.LegacyJobResponse_State{
Attempts: attempts,
}
resp.State = append(resp.State, state)
}
return resp, nil
}
func TestParseRunData_RunData_StatesAndAttempts(t *testing.T) {
swarmingTaskID := "69067f22f5cc6710"
botID := "build123-h1"
bisectRuns := []*internal.BisectRun{
{
CommitRun: internal.CommitRun{
Build: &workflows.Build{
BuildChromeParams: workflows.BuildChromeParams{
Commit: midpoint.NewCombinedCommit(midpoint.NewChromiumCommit("d9ac8dd553c566b8fe107dd8c8b2275c2c9c27f1")),
},
},
Runs: []*workflows.TestRun{
{
TaskID: swarmingTaskID,
CAS: &swarmingV1.SwarmingRpcsCASReference{
CasInstance: "projects/chrome-swarming/instances/default_instance",
Digest: &swarmingV1.SwarmingRpcsDigest{
Hash: "25009b847133c029dc585020ed7b60b6573fe12123559319ea5c04fec3b6e06c",
SizeBytes: int64(183),
},
},
},
},
},
},
}
testSuite := &testsuite.WorkflowTestSuite{}
env := testSuite.NewTestWorkflowEnvironment()
env.RegisterWorkflow(mockParseRunDataWorkflow)
env.RegisterActivity(FetchTaskActivity)
env.OnActivity(FetchTaskActivity, mock.Anything, swarmingTaskID).Return(&swarmingV1.SwarmingRpcsTaskResult{
BotId: botID,
TaskId: swarmingTaskID,
}, nil)
env.ExecuteWorkflow(mockParseRunDataWorkflow, bisectRuns)
require.True(t, env.IsWorkflowCompleted())
require.NoError(t, env.GetWorkflowError())
var actual *pinpoint_proto.LegacyJobResponse
require.NoError(t, env.GetWorkflowResult(&actual))
require.NotNil(t, actual)
assert.Equal(t, 1, len(actual.State))
executions := actual.State[0].Attempts[0].Executions
// TODO(jeffyoon@) - add checks for execution[0], which is the Build quest detail once Build is appended to CommitRun.
testQuestDetail := executions[1].Details
assert.Equal(t, botID, testQuestDetail[0].Value)
assert.Equal(t, swarmingTaskID, testQuestDetail[1].Value)
assert.Equal(t, 1, len(actual.Bots))
assert.Equal(t, botID, actual.Bots[0])
}