// Copyright 2021 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Code generated by MockGen. DO NOT EDIT.
// Source: test/publish/cmd/publishserver/storage/storage_interface.go

// Package mock_storage is a generated GoMock package.
package mock_storage

import (
	context "context"
	reflect "reflect"

	storage "chromiumos/test/publish/cmd/publishserver/storage"

	gomock "github.com/golang/mock/gomock"
)

// MockStorageClientInterface is a mock of StorageClientInterface interface.
type MockStorageClientInterface struct {
	ctrl     *gomock.Controller
	recorder *MockStorageClientInterfaceMockRecorder
}

// MockStorageClientInterfaceMockRecorder is the mock recorder for MockStorageClientInterface.
type MockStorageClientInterfaceMockRecorder struct {
	mock *MockStorageClientInterface
}

// NewMockStorageClientInterface creates a new mock instance.
func NewMockStorageClientInterface(ctrl *gomock.Controller) *MockStorageClientInterface {
	mock := &MockStorageClientInterface{ctrl: ctrl}
	mock.recorder = &MockStorageClientInterfaceMockRecorder{mock}
	return mock
}

// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockStorageClientInterface) EXPECT() *MockStorageClientInterfaceMockRecorder {
	return m.recorder
}

// Close mocks base method.
func (m *MockStorageClientInterface) Close() {
	m.ctrl.T.Helper()
	m.ctrl.Call(m, "Close")
}

// Close indicates an expected call of Close.
func (mr *MockStorageClientInterfaceMockRecorder) Close() *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockStorageClientInterface)(nil).Close))
}

// Write mocks base method.
func (m *MockStorageClientInterface) Write(ctx context.Context, filePath string, gsObject storage.GSObject) error {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "Write", ctx, filePath, gsObject)
	ret0, _ := ret[0].(error)
	return ret0
}

// Write indicates an expected call of Write.
func (mr *MockStorageClientInterfaceMockRecorder) Write(ctx, filePath, gsObject interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockStorageClientInterface)(nil).Write), ctx, filePath, gsObject)
}
