// Code generated by mockery v1.0.0 (and then touched up by hand)
package swarming

import (
	mock "github.com/stretchr/testify/mock"

	time "time"

	v1 "go.chromium.org/luci/common/api/swarming/swarming/v1"
)

// MockCommonImpl is a mock of swarming.ApiClient. All the methods are mocked using
// testify's mocking library.
type MockApiClient struct {
	mock.Mock
}

// NewAPIClient returns a pointer to a newly created struct.  We return the pointer because we want to
// make sure the methods on mock.Mock stay accessible, e.g. m.On()
func NewMockApiClient() *MockApiClient {
	return &MockApiClient{}
}

// CancelTask provides a mock function with given fields: id
func (_m *MockApiClient) CancelTask(id string, killRunning bool) error {
	ret := _m.Called(id)

	var r0 error
	if rf, ok := ret.Get(0).(func(string) error); ok {
		r0 = rf(id)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// GetStates provides a mock function with given fields: ids
func (_m *MockApiClient) GetStates(ids []string) ([]string, error) {
	ret := _m.Called(ids)

	var r0 []string
	if rf, ok := ret.Get(0).(func([]string) []string); ok {
		r0 = rf(ids)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]string)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func([]string) error); ok {
		r1 = rf(ids)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// GetStdoutOfTask provides a mock function with given fields: id
func (_m *MockApiClient) GetStdoutOfTask(id string) (*v1.SwarmingRpcsTaskOutput, error) {
	ret := _m.Called(id)

	var r0 *v1.SwarmingRpcsTaskOutput
	if rf, ok := ret.Get(0).(func(string) *v1.SwarmingRpcsTaskOutput); ok {
		r0 = rf(id)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*v1.SwarmingRpcsTaskOutput)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(string) error); ok {
		r1 = rf(id)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// GetTask provides a mock function with given fields: id, includePerformanceStats
func (_m *MockApiClient) GetTask(id string, includePerformanceStats bool) (*v1.SwarmingRpcsTaskResult, error) {
	ret := _m.Called(id, includePerformanceStats)

	var r0 *v1.SwarmingRpcsTaskResult
	if rf, ok := ret.Get(0).(func(string, bool) *v1.SwarmingRpcsTaskResult); ok {
		r0 = rf(id, includePerformanceStats)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*v1.SwarmingRpcsTaskResult)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(string, bool) error); ok {
		r1 = rf(id, includePerformanceStats)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// GetTaskMetadata provides a mock function with given fields: id
func (_m *MockApiClient) GetTaskMetadata(id string) (*v1.SwarmingRpcsTaskRequestMetadata, error) {
	ret := _m.Called(id)

	var r0 *v1.SwarmingRpcsTaskRequestMetadata
	if rf, ok := ret.Get(0).(func(string) *v1.SwarmingRpcsTaskRequestMetadata); ok {
		r0 = rf(id)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*v1.SwarmingRpcsTaskRequestMetadata)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(string) error); ok {
		r1 = rf(id)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// DeleteBots provides a mock function with given fields: bots
func (_m *MockApiClient) DeleteBots(bots []string) error {
	ret := _m.Called(bots)

	var r0 error
	if rf, ok := ret.Get(0).(func([]string) error); ok {
		r0 = rf(bots)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// GracefullyShutdownBot provides a mock function with given fields: id
func (_m *MockApiClient) GracefullyShutdownBot(id string) (*v1.SwarmingRpcsTerminateResponse, error) {
	ret := _m.Called(id)

	var r0 *v1.SwarmingRpcsTerminateResponse
	if rf, ok := ret.Get(0).(func(string) *v1.SwarmingRpcsTerminateResponse); ok {
		r0 = rf(id)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*v1.SwarmingRpcsTerminateResponse)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(string) error); ok {
		r1 = rf(id)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// ListBots provides a mock function with given fields: dimensions
func (_m *MockApiClient) ListBots(dimensions map[string]string) ([]*v1.SwarmingRpcsBotInfo, error) {
	ret := _m.Called(dimensions)

	var r0 []*v1.SwarmingRpcsBotInfo
	if rf, ok := ret.Get(0).(func(map[string]string) []*v1.SwarmingRpcsBotInfo); ok {
		r0 = rf(dimensions)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*v1.SwarmingRpcsBotInfo)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(map[string]string) error); ok {
		r1 = rf(dimensions)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// ListBotsForPool provides a mock function with given fields: pool
func (_m *MockApiClient) ListBotsForPool(pool string) ([]*v1.SwarmingRpcsBotInfo, error) {
	ret := _m.Called(pool)

	var r0 []*v1.SwarmingRpcsBotInfo
	if rf, ok := ret.Get(0).(func(string) []*v1.SwarmingRpcsBotInfo); ok {
		r0 = rf(pool)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*v1.SwarmingRpcsBotInfo)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(string) error); ok {
		r1 = rf(pool)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// ListDownBots provides a mock function with given fields: pool
func (_m *MockApiClient) ListDownBots(pool string) ([]*v1.SwarmingRpcsBotInfo, error) {
	ret := _m.Called(pool)

	var r0 []*v1.SwarmingRpcsBotInfo
	if rf, ok := ret.Get(0).(func(string) []*v1.SwarmingRpcsBotInfo); ok {
		r0 = rf(pool)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*v1.SwarmingRpcsBotInfo)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(string) error); ok {
		r1 = rf(pool)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// ListFreeBots provides a mock function with given fields: pool
func (_m *MockApiClient) ListFreeBots(pool string) ([]*v1.SwarmingRpcsBotInfo, error) {
	ret := _m.Called(pool)

	var r0 []*v1.SwarmingRpcsBotInfo
	if rf, ok := ret.Get(0).(func(string) []*v1.SwarmingRpcsBotInfo); ok {
		r0 = rf(pool)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*v1.SwarmingRpcsBotInfo)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(string) error); ok {
		r1 = rf(pool)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// ListSkiaTasks provides a mock function with given fields: start, end
func (_m *MockApiClient) ListSkiaTasks(start time.Time, end time.Time) ([]*v1.SwarmingRpcsTaskRequestMetadata, error) {
	ret := _m.Called(start, end)

	var r0 []*v1.SwarmingRpcsTaskRequestMetadata
	if rf, ok := ret.Get(0).(func(time.Time, time.Time) []*v1.SwarmingRpcsTaskRequestMetadata); ok {
		r0 = rf(start, end)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*v1.SwarmingRpcsTaskRequestMetadata)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(time.Time, time.Time) error); ok {
		r1 = rf(start, end)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// ListTaskResults provides a mock function with given fields: start, end, tags, state, includePerformanceStats
func (_m *MockApiClient) ListTaskResults(start time.Time, end time.Time, tags []string, state string, includePerformanceStats bool) ([]*v1.SwarmingRpcsTaskResult, error) {
	ret := _m.Called(start, end, tags, state, includePerformanceStats)

	var r0 []*v1.SwarmingRpcsTaskResult
	if rf, ok := ret.Get(0).(func(time.Time, time.Time, []string, string, bool) []*v1.SwarmingRpcsTaskResult); ok {
		r0 = rf(start, end, tags, state, includePerformanceStats)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*v1.SwarmingRpcsTaskResult)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(time.Time, time.Time, []string, string, bool) error); ok {
		r1 = rf(start, end, tags, state, includePerformanceStats)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// ListBotTasks provides a mock function with given fields: botID, limit
func (_m *MockApiClient) ListBotTasks(botID string, limit int) ([]*v1.SwarmingRpcsTaskResult, error) {
	ret := _m.Called(botID, limit)

	var r0 []*v1.SwarmingRpcsTaskResult
	if rf, ok := ret.Get(0).(func(string, int) []*v1.SwarmingRpcsTaskResult); ok {
		r0 = rf(botID, limit)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*v1.SwarmingRpcsTaskResult)
		}
	}

	return r0, ret.Error(1)
}

// ListTasks provides a mock function with given fields: start, end, tags, state
func (_m *MockApiClient) ListTasks(start time.Time, end time.Time, tags []string, state string) ([]*v1.SwarmingRpcsTaskRequestMetadata, error) {
	ret := _m.Called(start, end, tags, state)

	var r0 []*v1.SwarmingRpcsTaskRequestMetadata
	if rf, ok := ret.Get(0).(func(time.Time, time.Time, []string, string) []*v1.SwarmingRpcsTaskRequestMetadata); ok {
		r0 = rf(start, end, tags, state)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*v1.SwarmingRpcsTaskRequestMetadata)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(time.Time, time.Time, []string, string) error); ok {
		r1 = rf(start, end, tags, state)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// RetryTask provides a mock function with given fields: t
func (_m *MockApiClient) RetryTask(t *v1.SwarmingRpcsTaskRequestMetadata) (*v1.SwarmingRpcsTaskRequestMetadata, error) {
	ret := _m.Called(t)

	var r0 *v1.SwarmingRpcsTaskRequestMetadata
	if rf, ok := ret.Get(0).(func(*v1.SwarmingRpcsTaskRequestMetadata) *v1.SwarmingRpcsTaskRequestMetadata); ok {
		r0 = rf(t)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*v1.SwarmingRpcsTaskRequestMetadata)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(*v1.SwarmingRpcsTaskRequestMetadata) error); ok {
		r1 = rf(t)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// SwarmingService provides a mock function with given fields:
func (_m *MockApiClient) SwarmingService() *v1.Service {
	ret := _m.Called()

	var r0 *v1.Service
	if rf, ok := ret.Get(0).(func() *v1.Service); ok {
		r0 = rf()
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*v1.Service)
		}
	}

	return r0
}

// TriggerTask provides a mock function with given fields: t
func (_m *MockApiClient) TriggerTask(t *v1.SwarmingRpcsNewTaskRequest) (*v1.SwarmingRpcsTaskRequestMetadata, error) {
	ret := _m.Called(t)

	var r0 *v1.SwarmingRpcsTaskRequestMetadata
	if rf, ok := ret.Get(0).(func(*v1.SwarmingRpcsNewTaskRequest) *v1.SwarmingRpcsTaskRequestMetadata); ok {
		r0 = rf(t)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*v1.SwarmingRpcsTaskRequestMetadata)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(*v1.SwarmingRpcsNewTaskRequest) error); ok {
		r1 = rf(t)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// Make sure MockApiClient fulfills ApiClient
var _ ApiClient = (*MockApiClient)(nil)
