// Code generated by mockery v0.0.0-dev. DO NOT EDIT.

package mocks

import (
	context "context"

	buildbucketpb "go.chromium.org/luci/buildbucket/proto"

	grpc "google.golang.org/grpc"

	mock "github.com/stretchr/testify/mock"
)

// BuildBucketInterface is an autogenerated mock type for the BuildBucketInterface type
type BuildBucketInterface struct {
	mock.Mock
}

// CancelBuild provides a mock function with given fields: ctx, buildID, summaryMarkdown
func (_m *BuildBucketInterface) CancelBuild(ctx context.Context, buildID int64, summaryMarkdown string) (*buildbucketpb.Build, error) {
	ret := _m.Called(ctx, buildID, summaryMarkdown)

	if len(ret) == 0 {
		panic("no return value specified for CancelBuild")
	}

	var r0 *buildbucketpb.Build
	var r1 error
	if rf, ok := ret.Get(0).(func(context.Context, int64, string) (*buildbucketpb.Build, error)); ok {
		return rf(ctx, buildID, summaryMarkdown)
	}
	if rf, ok := ret.Get(0).(func(context.Context, int64, string) *buildbucketpb.Build); ok {
		r0 = rf(ctx, buildID, summaryMarkdown)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*buildbucketpb.Build)
		}
	}

	if rf, ok := ret.Get(1).(func(context.Context, int64, string) error); ok {
		r1 = rf(ctx, buildID, summaryMarkdown)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// CancelBuilds provides a mock function with given fields: ctx, buildIDs, summaryMarkdown
func (_m *BuildBucketInterface) CancelBuilds(ctx context.Context, buildIDs []int64, summaryMarkdown string) ([]*buildbucketpb.Build, error) {
	ret := _m.Called(ctx, buildIDs, summaryMarkdown)

	if len(ret) == 0 {
		panic("no return value specified for CancelBuilds")
	}

	var r0 []*buildbucketpb.Build
	var r1 error
	if rf, ok := ret.Get(0).(func(context.Context, []int64, string) ([]*buildbucketpb.Build, error)); ok {
		return rf(ctx, buildIDs, summaryMarkdown)
	}
	if rf, ok := ret.Get(0).(func(context.Context, []int64, string) []*buildbucketpb.Build); ok {
		r0 = rf(ctx, buildIDs, summaryMarkdown)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*buildbucketpb.Build)
		}
	}

	if rf, ok := ret.Get(1).(func(context.Context, []int64, string) error); ok {
		r1 = rf(ctx, buildIDs, summaryMarkdown)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// GetBuild provides a mock function with given fields: ctx, buildId
func (_m *BuildBucketInterface) GetBuild(ctx context.Context, buildId int64) (*buildbucketpb.Build, error) {
	ret := _m.Called(ctx, buildId)

	if len(ret) == 0 {
		panic("no return value specified for GetBuild")
	}

	var r0 *buildbucketpb.Build
	var r1 error
	if rf, ok := ret.Get(0).(func(context.Context, int64) (*buildbucketpb.Build, error)); ok {
		return rf(ctx, buildId)
	}
	if rf, ok := ret.Get(0).(func(context.Context, int64) *buildbucketpb.Build); ok {
		r0 = rf(ctx, buildId)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*buildbucketpb.Build)
		}
	}

	if rf, ok := ret.Get(1).(func(context.Context, int64) error); ok {
		r1 = rf(ctx, buildId)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// GetBuilder provides a mock function with given fields: ctx, in, opts
func (_m *BuildBucketInterface) GetBuilder(ctx context.Context, in *buildbucketpb.GetBuilderRequest, opts ...grpc.CallOption) (*buildbucketpb.BuilderItem, error) {
	_va := make([]interface{}, len(opts))
	for _i := range opts {
		_va[_i] = opts[_i]
	}
	var _ca []interface{}
	_ca = append(_ca, ctx, in)
	_ca = append(_ca, _va...)
	ret := _m.Called(_ca...)

	if len(ret) == 0 {
		panic("no return value specified for GetBuilder")
	}

	var r0 *buildbucketpb.BuilderItem
	var r1 error
	if rf, ok := ret.Get(0).(func(context.Context, *buildbucketpb.GetBuilderRequest, ...grpc.CallOption) (*buildbucketpb.BuilderItem, error)); ok {
		return rf(ctx, in, opts...)
	}
	if rf, ok := ret.Get(0).(func(context.Context, *buildbucketpb.GetBuilderRequest, ...grpc.CallOption) *buildbucketpb.BuilderItem); ok {
		r0 = rf(ctx, in, opts...)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(*buildbucketpb.BuilderItem)
		}
	}

	if rf, ok := ret.Get(1).(func(context.Context, *buildbucketpb.GetBuilderRequest, ...grpc.CallOption) error); ok {
		r1 = rf(ctx, in, opts...)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// GetTrybotsForCL provides a mock function with given fields: ctx, issue, patchset, gerritUrl, tags
func (_m *BuildBucketInterface) GetTrybotsForCL(ctx context.Context, issue int64, patchset int64, gerritUrl string, tags map[string]string) ([]*buildbucketpb.Build, error) {
	ret := _m.Called(ctx, issue, patchset, gerritUrl, tags)

	if len(ret) == 0 {
		panic("no return value specified for GetTrybotsForCL")
	}

	var r0 []*buildbucketpb.Build
	var r1 error
	if rf, ok := ret.Get(0).(func(context.Context, int64, int64, string, map[string]string) ([]*buildbucketpb.Build, error)); ok {
		return rf(ctx, issue, patchset, gerritUrl, tags)
	}
	if rf, ok := ret.Get(0).(func(context.Context, int64, int64, string, map[string]string) []*buildbucketpb.Build); ok {
		r0 = rf(ctx, issue, patchset, gerritUrl, tags)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*buildbucketpb.Build)
		}
	}

	if rf, ok := ret.Get(1).(func(context.Context, int64, int64, string, map[string]string) error); ok {
		r1 = rf(ctx, issue, patchset, gerritUrl, tags)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// ScheduleBuilds provides a mock function with given fields: ctx, builds, buildsToTags, issue, patchset, gerritUrl, repo, bbProject, bbBucket
func (_m *BuildBucketInterface) ScheduleBuilds(ctx context.Context, builds []string, buildsToTags map[string]map[string]string, issue int64, patchset int64, gerritUrl string, repo string, bbProject string, bbBucket string) ([]*buildbucketpb.Build, error) {
	ret := _m.Called(ctx, builds, buildsToTags, issue, patchset, gerritUrl, repo, bbProject, bbBucket)

	if len(ret) == 0 {
		panic("no return value specified for ScheduleBuilds")
	}

	var r0 []*buildbucketpb.Build
	var r1 error
	if rf, ok := ret.Get(0).(func(context.Context, []string, map[string]map[string]string, int64, int64, string, string, string, string) ([]*buildbucketpb.Build, error)); ok {
		return rf(ctx, builds, buildsToTags, issue, patchset, gerritUrl, repo, bbProject, bbBucket)
	}
	if rf, ok := ret.Get(0).(func(context.Context, []string, map[string]map[string]string, int64, int64, string, string, string, string) []*buildbucketpb.Build); ok {
		r0 = rf(ctx, builds, buildsToTags, issue, patchset, gerritUrl, repo, bbProject, bbBucket)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*buildbucketpb.Build)
		}
	}

	if rf, ok := ret.Get(1).(func(context.Context, []string, map[string]map[string]string, int64, int64, string, string, string, string) error); ok {
		r1 = rf(ctx, builds, buildsToTags, issue, patchset, gerritUrl, repo, bbProject, bbBucket)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// Search provides a mock function with given fields: ctx, pred
func (_m *BuildBucketInterface) Search(ctx context.Context, pred *buildbucketpb.BuildPredicate) ([]*buildbucketpb.Build, error) {
	ret := _m.Called(ctx, pred)

	if len(ret) == 0 {
		panic("no return value specified for Search")
	}

	var r0 []*buildbucketpb.Build
	var r1 error
	if rf, ok := ret.Get(0).(func(context.Context, *buildbucketpb.BuildPredicate) ([]*buildbucketpb.Build, error)); ok {
		return rf(ctx, pred)
	}
	if rf, ok := ret.Get(0).(func(context.Context, *buildbucketpb.BuildPredicate) []*buildbucketpb.Build); ok {
		r0 = rf(ctx, pred)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*buildbucketpb.Build)
		}
	}

	if rf, ok := ret.Get(1).(func(context.Context, *buildbucketpb.BuildPredicate) error); ok {
		r1 = rf(ctx, pred)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// StartBuild provides a mock function with given fields: ctx, buildId, taskId, token
func (_m *BuildBucketInterface) StartBuild(ctx context.Context, buildId int64, taskId string, token string) (string, error) {
	ret := _m.Called(ctx, buildId, taskId, token)

	if len(ret) == 0 {
		panic("no return value specified for StartBuild")
	}

	var r0 string
	var r1 error
	if rf, ok := ret.Get(0).(func(context.Context, int64, string, string) (string, error)); ok {
		return rf(ctx, buildId, taskId, token)
	}
	if rf, ok := ret.Get(0).(func(context.Context, int64, string, string) string); ok {
		r0 = rf(ctx, buildId, taskId, token)
	} else {
		r0 = ret.Get(0).(string)
	}

	if rf, ok := ret.Get(1).(func(context.Context, int64, string, string) error); ok {
		r1 = rf(ctx, buildId, taskId, token)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// UpdateBuild provides a mock function with given fields: ctx, build, token
func (_m *BuildBucketInterface) UpdateBuild(ctx context.Context, build *buildbucketpb.Build, token string) error {
	ret := _m.Called(ctx, build, token)

	if len(ret) == 0 {
		panic("no return value specified for UpdateBuild")
	}

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context, *buildbucketpb.Build, string) error); ok {
		r0 = rf(ctx, build, token)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// NewBuildBucketInterface creates a new instance of BuildBucketInterface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewBuildBucketInterface(t interface {
	mock.TestingT
	Cleanup(func())
}) *BuildBucketInterface {
	mock := &BuildBucketInterface{}
	mock.Mock.Test(t)

	t.Cleanup(func() { mock.AssertExpectations(t) })

	return mock
}
