// Code generated by mockery v1.0.0. DO NOT EDIT.

package mocks

import (
	http "net/http"

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

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

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

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

// Get provides a mock function with given fields: priority, mainDigest, rightDigests
func (_m *DiffStore) Get(priority int64, mainDigest types.Digest, rightDigests types.DigestSlice) (map[types.Digest]interface{}, error) {
	ret := _m.Called(priority, mainDigest, rightDigests)

	var r0 map[types.Digest]interface{}
	if rf, ok := ret.Get(0).(func(int64, types.Digest, types.DigestSlice) map[types.Digest]interface{}); ok {
		r0 = rf(priority, mainDigest, rightDigests)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(map[types.Digest]interface{})
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(int64, types.Digest, types.DigestSlice) error); ok {
		r1 = rf(priority, mainDigest, rightDigests)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// ImageHandler provides a mock function with given fields: urlPrefix
func (_m *DiffStore) ImageHandler(urlPrefix string) (http.Handler, error) {
	ret := _m.Called(urlPrefix)

	var r0 http.Handler
	if rf, ok := ret.Get(0).(func(string) http.Handler); ok {
		r0 = rf(urlPrefix)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(http.Handler)
		}
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(string) error); ok {
		r1 = rf(urlPrefix)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

// PurgeDigests provides a mock function with given fields: digests, purgeGCS
func (_m *DiffStore) PurgeDigests(digests types.DigestSlice, purgeGCS bool) error {
	ret := _m.Called(digests, purgeGCS)

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

	return r0
}

// UnavailableDigests provides a mock function with given fields:
func (_m *DiffStore) UnavailableDigests() map[types.Digest]*diff.DigestFailure {
	ret := _m.Called()

	var r0 map[types.Digest]*diff.DigestFailure
	if rf, ok := ret.Get(0).(func() map[types.Digest]*diff.DigestFailure); ok {
		r0 = rf()
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(map[types.Digest]*diff.DigestFailure)
		}
	}

	return r0
}

// WarmDiffs provides a mock function with given fields: priority, leftDigests, rightDigests
func (_m *DiffStore) WarmDiffs(priority int64, leftDigests types.DigestSlice, rightDigests types.DigestSlice) {
	_m.Called(priority, leftDigests, rightDigests)
}

// WarmDigests provides a mock function with given fields: priority, digests, sync
func (_m *DiffStore) WarmDigests(priority int64, digests types.DigestSlice, sync bool) {
	_m.Called(priority, digests, sync)
}
