// 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"

	testing "testing"

	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)

	var r0 []byte
	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)
		}
	}

	var r1 error
	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)

	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()

	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)

	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 cleanup function to assert the mocks expectations.
func NewGCSClient(t testing.TB) *GCSClient {
	mock := &GCSClient{}

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

	return mock
}
