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

package mocks

import (
	context "context"
	io "io"

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

	storage "go.skia.org/infra/golden/go/storage"

	types "go.skia.org/infra/golden/go/types"
)

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

// GetImage provides a mock function with given fields: ctx, digest
func (_m *GCSClient) GetImage(ctx context.Context, digest types.Digest) ([]byte, error) {
	ret := _m.Called(ctx, digest)

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

	var r0 []byte
	var r1 error
	if rf, ok := ret.Get(0).(func(context.Context, types.Digest) ([]byte, error)); ok {
		return rf(ctx, digest)
	}
	if rf, ok := ret.Get(0).(func(context.Context, types.Digest) []byte); ok {
		r0 = rf(ctx, digest)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]byte)
		}
	}

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

	return r0, r1
}

// LoadKnownDigests provides a mock function with given fields: ctx, w
func (_m *GCSClient) LoadKnownDigests(ctx context.Context, w io.Writer) error {
	ret := _m.Called(ctx, w)

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

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context, io.Writer) error); ok {
		r0 = rf(ctx, w)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// Options provides a mock function with given fields:
func (_m *GCSClient) Options() storage.GCSClientOptions {
	ret := _m.Called()

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

	var r0 storage.GCSClientOptions
	if rf, ok := ret.Get(0).(func() storage.GCSClientOptions); ok {
		r0 = rf()
	} else {
		r0 = ret.Get(0).(storage.GCSClientOptions)
	}

	return r0
}

// WriteKnownDigests provides a mock function with given fields: ctx, digests
func (_m *GCSClient) WriteKnownDigests(ctx context.Context, digests types.DigestSlice) error {
	ret := _m.Called(ctx, digests)

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

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context, types.DigestSlice) error); ok {
		r0 = rf(ctx, digests)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// NewGCSClient creates a new instance of GCSClient. 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 NewGCSClient(t interface {
	mock.TestingT
	Cleanup(func())
}) *GCSClient {
	mock := &GCSClient{}
	mock.Mock.Test(t)

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

	return mock
}
