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

package mocks

import (
	context "context"

	mock "github.com/stretchr/testify/mock"
	types "go.skia.org/infra/golden/go/types"
)

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

// GetImage provides a mock function with given fields: ctx, digest
func (_m *ImageSource) 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
}

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

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

	return mock
}
