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

package mocks

import (
	context "context"

	config "go.skia.org/infra/perf/go/config"

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

	redispb "cloud.google.com/go/redis/apiv1/redispb"

	time "time"
)

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

// ListRedisInstances provides a mock function with given fields: _a0, _a1
func (_m *RedisWrapper) ListRedisInstances(_a0 context.Context, _a1 string) []*redispb.Instance {
	ret := _m.Called(_a0, _a1)

	if len(ret) == 0 {
		panic("no return value specified for ListRedisInstances")
	}

	var r0 []*redispb.Instance
	if rf, ok := ret.Get(0).(func(context.Context, string) []*redispb.Instance); ok {
		r0 = rf(_a0, _a1)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]*redispb.Instance)
		}
	}

	return r0
}

// StartRefreshRoutine provides a mock function with given fields: _a0, _a1, _a2
func (_m *RedisWrapper) StartRefreshRoutine(_a0 context.Context, _a1 time.Duration, _a2 *config.InstanceConfig) error {
	ret := _m.Called(_a0, _a1, _a2)

	if len(ret) == 0 {
		panic("no return value specified for StartRefreshRoutine")
	}

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context, time.Duration, *config.InstanceConfig) error); ok {
		r0 = rf(_a0, _a1, _a2)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

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

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

	return mock
}
