// Code generated by MockGen. DO NOT EDIT.
// Source: fuchsia.googlesource.com/infra/infra/resultstore (interfaces: UploadClient)

// Package mock_resultstore is a generated GoMock package.
package mock_resultstore

import (
	context "context"
	resultstore "fuchsia.googlesource.com/infra/infra/resultstore"
	gomock "github.com/golang/mock/gomock"
	reflect "reflect"
)

// MockUploadClient is a mock of UploadClient interface
type MockUploadClient struct {
	ctrl     *gomock.Controller
	recorder *MockUploadClientMockRecorder
}

// MockUploadClientMockRecorder is the mock recorder for MockUploadClient
type MockUploadClientMockRecorder struct {
	mock *MockUploadClient
}

// NewMockUploadClient creates a new mock instance
func NewMockUploadClient(ctrl *gomock.Controller) *MockUploadClient {
	mock := &MockUploadClient{ctrl: ctrl}
	mock.recorder = &MockUploadClientMockRecorder{mock}
	return mock
}

// EXPECT returns an object that allows the caller to indicate expected use
func (m *MockUploadClient) EXPECT() *MockUploadClientMockRecorder {
	return m.recorder
}

// CreateConfiguration mocks base method
func (m *MockUploadClient) CreateConfiguration(arg0 context.Context, arg1 *resultstore.Configuration, arg2 string) (*resultstore.Configuration, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "CreateConfiguration", arg0, arg1, arg2)
	ret0, _ := ret[0].(*resultstore.Configuration)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// CreateConfiguration indicates an expected call of CreateConfiguration
func (mr *MockUploadClientMockRecorder) CreateConfiguration(arg0, arg1, arg2 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateConfiguration", reflect.TypeOf((*MockUploadClient)(nil).CreateConfiguration), arg0, arg1, arg2)
}

// CreateConfiguredTarget mocks base method
func (m *MockUploadClient) CreateConfiguredTarget(arg0 context.Context, arg1 *resultstore.ConfiguredTarget, arg2 string) (*resultstore.ConfiguredTarget, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "CreateConfiguredTarget", arg0, arg1, arg2)
	ret0, _ := ret[0].(*resultstore.ConfiguredTarget)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// CreateConfiguredTarget indicates an expected call of CreateConfiguredTarget
func (mr *MockUploadClientMockRecorder) CreateConfiguredTarget(arg0, arg1, arg2 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateConfiguredTarget", reflect.TypeOf((*MockUploadClient)(nil).CreateConfiguredTarget), arg0, arg1, arg2)
}

// CreateInvocation mocks base method
func (m *MockUploadClient) CreateInvocation(arg0 context.Context, arg1 *resultstore.Invocation) (*resultstore.Invocation, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "CreateInvocation", arg0, arg1)
	ret0, _ := ret[0].(*resultstore.Invocation)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// CreateInvocation indicates an expected call of CreateInvocation
func (mr *MockUploadClientMockRecorder) CreateInvocation(arg0, arg1 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateInvocation", reflect.TypeOf((*MockUploadClient)(nil).CreateInvocation), arg0, arg1)
}

// CreateTarget mocks base method
func (m *MockUploadClient) CreateTarget(arg0 context.Context, arg1 *resultstore.Target, arg2 string) (*resultstore.Target, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "CreateTarget", arg0, arg1, arg2)
	ret0, _ := ret[0].(*resultstore.Target)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// CreateTarget indicates an expected call of CreateTarget
func (mr *MockUploadClientMockRecorder) CreateTarget(arg0, arg1, arg2 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateTarget", reflect.TypeOf((*MockUploadClient)(nil).CreateTarget), arg0, arg1, arg2)
}

// CreateTestAction mocks base method
func (m *MockUploadClient) CreateTestAction(arg0 context.Context, arg1 *resultstore.TestAction, arg2 string) (*resultstore.TestAction, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "CreateTestAction", arg0, arg1, arg2)
	ret0, _ := ret[0].(*resultstore.TestAction)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// CreateTestAction indicates an expected call of CreateTestAction
func (mr *MockUploadClientMockRecorder) CreateTestAction(arg0, arg1, arg2 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateTestAction", reflect.TypeOf((*MockUploadClient)(nil).CreateTestAction), arg0, arg1, arg2)
}

// FinishConfiguredTarget mocks base method
func (m *MockUploadClient) FinishConfiguredTarget(arg0 context.Context, arg1 string) error {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "FinishConfiguredTarget", arg0, arg1)
	ret0, _ := ret[0].(error)
	return ret0
}

// FinishConfiguredTarget indicates an expected call of FinishConfiguredTarget
func (mr *MockUploadClientMockRecorder) FinishConfiguredTarget(arg0, arg1 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinishConfiguredTarget", reflect.TypeOf((*MockUploadClient)(nil).FinishConfiguredTarget), arg0, arg1)
}

// FinishInvocation mocks base method
func (m *MockUploadClient) FinishInvocation(arg0 context.Context, arg1 string) error {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "FinishInvocation", arg0, arg1)
	ret0, _ := ret[0].(error)
	return ret0
}

// FinishInvocation indicates an expected call of FinishInvocation
func (mr *MockUploadClientMockRecorder) FinishInvocation(arg0, arg1 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinishInvocation", reflect.TypeOf((*MockUploadClient)(nil).FinishInvocation), arg0, arg1)
}

// FinishTarget mocks base method
func (m *MockUploadClient) FinishTarget(arg0 context.Context, arg1 string) error {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "FinishTarget", arg0, arg1)
	ret0, _ := ret[0].(error)
	return ret0
}

// FinishTarget indicates an expected call of FinishTarget
func (mr *MockUploadClientMockRecorder) FinishTarget(arg0, arg1 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinishTarget", reflect.TypeOf((*MockUploadClient)(nil).FinishTarget), arg0, arg1)
}

// UpdateConfiguredTarget mocks base method
func (m *MockUploadClient) UpdateConfiguredTarget(arg0 context.Context, arg1 *resultstore.ConfiguredTarget, arg2 []string) (*resultstore.ConfiguredTarget, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "UpdateConfiguredTarget", arg0, arg1, arg2)
	ret0, _ := ret[0].(*resultstore.ConfiguredTarget)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// UpdateConfiguredTarget indicates an expected call of UpdateConfiguredTarget
func (mr *MockUploadClientMockRecorder) UpdateConfiguredTarget(arg0, arg1, arg2 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateConfiguredTarget", reflect.TypeOf((*MockUploadClient)(nil).UpdateConfiguredTarget), arg0, arg1, arg2)
}

// UpdateInvocation mocks base method
func (m *MockUploadClient) UpdateInvocation(arg0 context.Context, arg1 *resultstore.Invocation, arg2 []string) (*resultstore.Invocation, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "UpdateInvocation", arg0, arg1, arg2)
	ret0, _ := ret[0].(*resultstore.Invocation)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// UpdateInvocation indicates an expected call of UpdateInvocation
func (mr *MockUploadClientMockRecorder) UpdateInvocation(arg0, arg1, arg2 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateInvocation", reflect.TypeOf((*MockUploadClient)(nil).UpdateInvocation), arg0, arg1, arg2)
}

// UpdateTarget mocks base method
func (m *MockUploadClient) UpdateTarget(arg0 context.Context, arg1 *resultstore.Target, arg2 []string) (*resultstore.Target, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "UpdateTarget", arg0, arg1, arg2)
	ret0, _ := ret[0].(*resultstore.Target)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// UpdateTarget indicates an expected call of UpdateTarget
func (mr *MockUploadClientMockRecorder) UpdateTarget(arg0, arg1, arg2 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateTarget", reflect.TypeOf((*MockUploadClient)(nil).UpdateTarget), arg0, arg1, arg2)
}

// UpdateTestAction mocks base method
func (m *MockUploadClient) UpdateTestAction(arg0 context.Context, arg1 *resultstore.TestAction, arg2 []string) (*resultstore.TestAction, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "UpdateTestAction", arg0, arg1, arg2)
	ret0, _ := ret[0].(*resultstore.TestAction)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// UpdateTestAction indicates an expected call of UpdateTestAction
func (mr *MockUploadClientMockRecorder) UpdateTestAction(arg0, arg1, arg2 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateTestAction", reflect.TypeOf((*MockUploadClient)(nil).UpdateTestAction), arg0, arg1, arg2)
}
