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

package mocks

import (
	context "context"
	testing "testing"

	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)

	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
}

// NewImageSource creates a new instance of ImageSource. It also registers a cleanup function to assert the mocks expectations.
func NewImageSource(t testing.TB) *ImageSource {
	mock := &ImageSource{}

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

	return mock
}
