// Code generated by mockery v1.0.0. 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
}

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