blob: 25ad310c5f7c0fda95272f5044357f69120ef635 [file]
package internal
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"go.skia.org/infra/go/skerr"
"go.skia.org/infra/go/swarming"
"go.skia.org/infra/pinpoint/go/run_benchmark"
"go.skia.org/infra/pinpoint/go/workflows"
"github.com/stretchr/testify/require"
apipb "go.chromium.org/luci/swarming/proto/api_v2"
"go.temporal.io/sdk/testsuite"
)
var mockCas = &apipb.CASReference{
CasInstance: "fake-instance",
}
func TestRunBenchmark_GivenSuccessfulRun_ShouldReturnCas(t *testing.T) {
testSuite := &testsuite.WorkflowTestSuite{}
env := testSuite.NewTestWorkflowEnvironment()
var rba *RunBenchmarkActivity
const fakeTaskID = "fake-task"
const state = run_benchmark.State(swarming.TASK_STATE_COMPLETED)
env.OnActivity(rba.ScheduleTaskActivity, mock.Anything, mock.Anything).Return(fakeTaskID, nil).Once()
env.OnActivity(rba.WaitTaskPendingActivity, mock.Anything, fakeTaskID).Return(state, nil).Once()
env.OnActivity(rba.WaitTaskFinishedActivity, mock.Anything, fakeTaskID).Return(state, nil).Once()
env.OnActivity(rba.RetrieveTestCASActivity, mock.Anything, fakeTaskID).Return(mockCas, nil).Once()
env.ExecuteWorkflow(RunBenchmarkWorkflow, &RunBenchmarkParams{})
require.True(t, env.IsWorkflowCompleted())
require.NoError(t, env.GetWorkflowError())
var result *workflows.TestRun
require.NoError(t, env.GetWorkflowResult(&result))
require.EqualExportedValues(t, workflows.TestRun{
TaskID: fakeTaskID,
Status: state,
CAS: mockCas,
}, *result)
env.AssertExpectations(t)
}
func TestRunBenchmark_GivenUnsuccessfulRun_ShouldNotReturnCas(t *testing.T) {
testSuite := &testsuite.WorkflowTestSuite{}
env := testSuite.NewTestWorkflowEnvironment()
var rba *RunBenchmarkActivity
const fakeTaskID = "fake-task"
const state = run_benchmark.State(swarming.TASK_STATE_BOT_DIED)
env.OnActivity(rba.ScheduleTaskActivity, mock.Anything, mock.Anything).Return(fakeTaskID, nil).Once()
env.OnActivity(rba.WaitTaskPendingActivity, mock.Anything, fakeTaskID).Return(state, nil).Once()
env.OnActivity(rba.WaitTaskFinishedActivity, mock.Anything, fakeTaskID).Return(state, nil).Once()
env.ExecuteWorkflow(RunBenchmarkWorkflow, &RunBenchmarkParams{})
require.True(t, env.IsWorkflowCompleted())
require.NoError(t, env.GetWorkflowError())
var result *workflows.TestRun
require.NoError(t, env.GetWorkflowResult(&result))
require.EqualExportedValues(t, workflows.TestRun{
TaskID: fakeTaskID,
Status: state,
CAS: nil,
}, *result)
env.AssertExpectations(t)
}
func TestRunBenchmark_ReturnsNoResource_TriesAgain(t *testing.T) {
testSuite := &testsuite.WorkflowTestSuite{}
env := testSuite.NewTestWorkflowEnvironment()
var rba *RunBenchmarkActivity
const (
fakeTaskID1 = "fake-task"
fakeTaskID2 = "fake-task2"
state_no_resource = run_benchmark.State(swarming.TASK_STATE_NO_RESOURCE)
state_completed = run_benchmark.State(swarming.TASK_STATE_COMPLETED)
)
env.OnActivity(rba.ScheduleTaskActivity, mock.Anything, mock.Anything).Return(fakeTaskID1, nil).Once()
env.OnActivity(rba.WaitTaskPendingActivity, mock.Anything, fakeTaskID1).Return(state_no_resource, nil).Once()
env.OnActivity(rba.ScheduleTaskActivity, mock.Anything, mock.Anything).Return(fakeTaskID2, nil).Once()
env.OnActivity(rba.WaitTaskPendingActivity, mock.Anything, fakeTaskID2).Return(state_completed, nil).Once()
env.OnActivity(rba.WaitTaskFinishedActivity, mock.Anything, fakeTaskID2).Return(state_completed, nil).Once()
env.OnActivity(rba.RetrieveTestCASActivity, mock.Anything, fakeTaskID2).Return(mockCas, nil).Once()
env.ExecuteWorkflow(RunBenchmarkWorkflow, &RunBenchmarkParams{})
require.True(t, env.IsWorkflowCompleted())
require.NoError(t, env.GetWorkflowError())
var result *workflows.TestRun
require.NoError(t, env.GetWorkflowResult(&result))
require.EqualExportedValues(t, workflows.TestRun{
TaskID: fakeTaskID2,
Status: state_completed,
CAS: mockCas,
}, *result)
env.AssertExpectations(t)
}
func TestRunBenchmark_ReturnsNoResourceTooManyTimes_ErrorsOut(t *testing.T) {
testSuite := &testsuite.WorkflowTestSuite{}
env := testSuite.NewTestWorkflowEnvironment()
var rba *RunBenchmarkActivity
const (
fakeTaskID = "fake-task"
state_no_resource = run_benchmark.State(swarming.TASK_STATE_NO_RESOURCE)
)
env.OnActivity(rba.ScheduleTaskActivity, mock.Anything, mock.Anything).Return(fakeTaskID, nil).Times(maxRetry)
env.OnActivity(rba.WaitTaskPendingActivity, mock.Anything, fakeTaskID).Return(state_no_resource, nil).Times(maxRetry)
env.OnActivity(rba.WaitTaskFinishedActivity, mock.Anything, fakeTaskID).Return(state_no_resource, nil).Once()
env.ExecuteWorkflow(RunBenchmarkWorkflow, &RunBenchmarkParams{})
require.True(t, env.IsWorkflowCompleted())
require.NoError(t, env.GetWorkflowError())
var result *workflows.TestRun
require.NoError(t, env.GetWorkflowResult(&result))
require.EqualExportedValues(t, workflows.TestRun{
TaskID: fakeTaskID,
Status: state_no_resource,
CAS: nil,
}, *result)
env.AssertExpectations(t)
}
func TestRunBenchmarkPairwise_HappyPath_ReturnsCAS(t *testing.T) {
testSuite := &testsuite.WorkflowTestSuite{}
env := testSuite.NewTestWorkflowEnvironment()
var rba *RunBenchmarkActivity
p1 := &RunBenchmarkParams{Dimensions: map[string]string{"value": "bot-123"}}
p2 := &RunBenchmarkParams{Dimensions: map[string]string{"value": "bot-123"}}
mockTaskID1, mockTaskID2 := "fake-task1", "fake-task2"
state := run_benchmark.State(swarming.TASK_STATE_COMPLETED)
env.OnActivity(rba.ScheduleTaskActivity, mock.Anything, mock.Anything).Return(mockTaskID1, nil).Once()
env.OnActivity(rba.WaitTaskAcceptedActivity, mock.Anything, mockTaskID1).Return(state, nil).Once()
env.OnActivity(rba.ScheduleTaskActivity, mock.Anything, mock.Anything).Return(mockTaskID2, nil).Once()
env.OnActivity(rba.WaitTaskPendingActivity, mock.Anything, mockTaskID1).Return(state, nil).Once()
env.OnActivity(rba.WaitTaskPendingActivity, mock.Anything, mockTaskID2).Return(state, nil).Once()
env.OnActivity(rba.WaitTaskFinishedActivity, mock.Anything, mockTaskID1).Return(state, nil).Once()
env.OnActivity(rba.WaitTaskFinishedActivity, mock.Anything, mockTaskID2).Return(state, nil).Once()
env.OnActivity(rba.RetrieveTestCASActivity, mock.Anything, mockTaskID1).Return(mockCas, nil).Once()
env.OnActivity(rba.RetrieveTestCASActivity, mock.Anything, mockTaskID2).Return(mockCas, nil).Once()
env.ExecuteWorkflow(RunBenchmarkPairwiseWorkflow, p1, p2, workflows.LeftThenRight)
require.True(t, env.IsWorkflowCompleted())
require.NoError(t, env.GetWorkflowError())
var result *workflows.PairwiseTestRun
require.NoError(t, env.GetWorkflowResult(&result))
assert.EqualExportedValues(t, workflows.PairwiseTestRun{
FirstTestRun: &workflows.TestRun{
TaskID: mockTaskID1,
Status: state,
CAS: mockCas,
},
SecondTestRun: &workflows.TestRun{
TaskID: mockTaskID2,
Status: state,
CAS: mockCas,
},
}, *result)
env.AssertExpectations(t)
}
func TestRunBenchmarkPairwise_NoResources_ReturnsError(t *testing.T) {
testSuite := &testsuite.WorkflowTestSuite{}
env := testSuite.NewTestWorkflowEnvironment()
var rba *RunBenchmarkActivity
p1 := &RunBenchmarkParams{Dimensions: map[string]string{"value": "bot-123"}}
p2 := &RunBenchmarkParams{Dimensions: map[string]string{"value": "bot-123"}}
mockTaskID1 := "fake-task1"
noResourceState := run_benchmark.State(swarming.TASK_STATE_NO_RESOURCE)
expectedErr := skerr.Fmt("Failed to wait for task %s to be accepted", mockTaskID1)
env.OnActivity(rba.ScheduleTaskActivity, mock.Anything, mock.Anything).Return(mockTaskID1, nil).Once()
env.OnActivity(rba.WaitTaskAcceptedActivity, mock.Anything, mockTaskID1).Return(noResourceState, expectedErr).Times(int(runBenchmarkPendingActivityOption.RetryPolicy.MaximumAttempts))
env.ExecuteWorkflow(RunBenchmarkPairwiseWorkflow, p1, p2, workflows.RightThenLeft)
require.True(t, env.IsWorkflowCompleted())
require.Error(t, env.GetWorkflowError())
var result *workflows.PairwiseTestRun
require.Error(t, env.GetWorkflowResult(&result))
assert.Nil(t, result)
env.AssertExpectations(t)
}