// Code generated by mockery v2.4.0. DO NOT EDIT.

package mocks

import (
	context "context"

	mock "github.com/stretchr/testify/mock"
	machine "go.skia.org/infra/machine/go/machine"

	store "go.skia.org/infra/machine/go/machine/store"
)

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

// Delete provides a mock function with given fields: ctx, machineID
func (_m *Store) Delete(ctx context.Context, machineID string) error {
	ret := _m.Called(ctx, machineID)

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context, string) error); ok {
		r0 = rf(ctx, machineID)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// List provides a mock function with given fields: ctx
func (_m *Store) List(ctx context.Context) ([]machine.Description, error) {
	ret := _m.Called(ctx)

	var r0 []machine.Description
	if rf, ok := ret.Get(0).(func(context.Context) []machine.Description); ok {
		r0 = rf(ctx)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).([]machine.Description)
		}
	}

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

	return r0, r1
}

// Update provides a mock function with given fields: ctx, machineID, updateCallback
func (_m *Store) Update(ctx context.Context, machineID string, updateCallback store.UpdateCallback) error {
	ret := _m.Called(ctx, machineID, updateCallback)

	var r0 error
	if rf, ok := ret.Get(0).(func(context.Context, string, store.UpdateCallback) error); ok {
		r0 = rf(ctx, machineID, updateCallback)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// Watch provides a mock function with given fields: ctx, machineID
func (_m *Store) Watch(ctx context.Context, machineID string) <-chan machine.Description {
	ret := _m.Called(ctx, machineID)

	var r0 <-chan machine.Description
	if rf, ok := ret.Get(0).(func(context.Context, string) <-chan machine.Description); ok {
		r0 = rf(ctx, machineID)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(<-chan machine.Description)
		}
	}

	return r0
}

// WatchForPowerCycle provides a mock function with given fields: ctx
func (_m *Store) WatchForPowerCycle(ctx context.Context) <-chan string {
	ret := _m.Called(ctx)

	var r0 <-chan string
	if rf, ok := ret.Get(0).(func(context.Context) <-chan string); ok {
		r0 = rf(ctx)
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(<-chan string)
		}
	}

	return r0
}
