//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//

// Code generated by MockGen. DO NOT EDIT.
// Source: ./cloudstack/ResourcemetadataService.go
//
// Generated by this command:
//
//	mockgen -destination=./cloudstack/ResourcemetadataService_mock.go -package=cloudstack -copyright_file=header.txt -source=./cloudstack/ResourcemetadataService.go
//

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

import (
	reflect "reflect"

	gomock "go.uber.org/mock/gomock"
)

// MockResourcemetadataServiceIface is a mock of ResourcemetadataServiceIface interface.
type MockResourcemetadataServiceIface struct {
	ctrl     *gomock.Controller
	recorder *MockResourcemetadataServiceIfaceMockRecorder
	isgomock struct{}
}

// MockResourcemetadataServiceIfaceMockRecorder is the mock recorder for MockResourcemetadataServiceIface.
type MockResourcemetadataServiceIfaceMockRecorder struct {
	mock *MockResourcemetadataServiceIface
}

// NewMockResourcemetadataServiceIface creates a new mock instance.
func NewMockResourcemetadataServiceIface(ctrl *gomock.Controller) *MockResourcemetadataServiceIface {
	mock := &MockResourcemetadataServiceIface{ctrl: ctrl}
	mock.recorder = &MockResourcemetadataServiceIfaceMockRecorder{mock}
	return mock
}

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

// AddResourceDetail mocks base method.
func (m *MockResourcemetadataServiceIface) AddResourceDetail(p *AddResourceDetailParams) (*AddResourceDetailResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "AddResourceDetail", p)
	ret0, _ := ret[0].(*AddResourceDetailResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// AddResourceDetail indicates an expected call of AddResourceDetail.
func (mr *MockResourcemetadataServiceIfaceMockRecorder) AddResourceDetail(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddResourceDetail", reflect.TypeOf((*MockResourcemetadataServiceIface)(nil).AddResourceDetail), p)
}

// GetVolumeSnapshotDetails mocks base method.
func (m *MockResourcemetadataServiceIface) GetVolumeSnapshotDetails(p *GetVolumeSnapshotDetailsParams) (*GetVolumeSnapshotDetailsResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "GetVolumeSnapshotDetails", p)
	ret0, _ := ret[0].(*GetVolumeSnapshotDetailsResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// GetVolumeSnapshotDetails indicates an expected call of GetVolumeSnapshotDetails.
func (mr *MockResourcemetadataServiceIfaceMockRecorder) GetVolumeSnapshotDetails(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetVolumeSnapshotDetails", reflect.TypeOf((*MockResourcemetadataServiceIface)(nil).GetVolumeSnapshotDetails), p)
}

// ListDetailOptions mocks base method.
func (m *MockResourcemetadataServiceIface) ListDetailOptions(p *ListDetailOptionsParams) (*ListDetailOptionsResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListDetailOptions", p)
	ret0, _ := ret[0].(*ListDetailOptionsResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// ListDetailOptions indicates an expected call of ListDetailOptions.
func (mr *MockResourcemetadataServiceIfaceMockRecorder) ListDetailOptions(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListDetailOptions", reflect.TypeOf((*MockResourcemetadataServiceIface)(nil).ListDetailOptions), p)
}

// ListResourceDetails mocks base method.
func (m *MockResourcemetadataServiceIface) ListResourceDetails(p *ListResourceDetailsParams) (*ListResourceDetailsResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListResourceDetails", p)
	ret0, _ := ret[0].(*ListResourceDetailsResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// ListResourceDetails indicates an expected call of ListResourceDetails.
func (mr *MockResourcemetadataServiceIfaceMockRecorder) ListResourceDetails(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListResourceDetails", reflect.TypeOf((*MockResourcemetadataServiceIface)(nil).ListResourceDetails), p)
}

// NewAddResourceDetailParams mocks base method.
func (m *MockResourcemetadataServiceIface) NewAddResourceDetailParams(details map[string]string, resourceid, resourcetype string) *AddResourceDetailParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewAddResourceDetailParams", details, resourceid, resourcetype)
	ret0, _ := ret[0].(*AddResourceDetailParams)
	return ret0
}

// NewAddResourceDetailParams indicates an expected call of NewAddResourceDetailParams.
func (mr *MockResourcemetadataServiceIfaceMockRecorder) NewAddResourceDetailParams(details, resourceid, resourcetype any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewAddResourceDetailParams", reflect.TypeOf((*MockResourcemetadataServiceIface)(nil).NewAddResourceDetailParams), details, resourceid, resourcetype)
}

// NewGetVolumeSnapshotDetailsParams mocks base method.
func (m *MockResourcemetadataServiceIface) NewGetVolumeSnapshotDetailsParams(snapshotid string) *GetVolumeSnapshotDetailsParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewGetVolumeSnapshotDetailsParams", snapshotid)
	ret0, _ := ret[0].(*GetVolumeSnapshotDetailsParams)
	return ret0
}

// NewGetVolumeSnapshotDetailsParams indicates an expected call of NewGetVolumeSnapshotDetailsParams.
func (mr *MockResourcemetadataServiceIfaceMockRecorder) NewGetVolumeSnapshotDetailsParams(snapshotid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewGetVolumeSnapshotDetailsParams", reflect.TypeOf((*MockResourcemetadataServiceIface)(nil).NewGetVolumeSnapshotDetailsParams), snapshotid)
}

// NewListDetailOptionsParams mocks base method.
func (m *MockResourcemetadataServiceIface) NewListDetailOptionsParams(resourcetype string) *ListDetailOptionsParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewListDetailOptionsParams", resourcetype)
	ret0, _ := ret[0].(*ListDetailOptionsParams)
	return ret0
}

// NewListDetailOptionsParams indicates an expected call of NewListDetailOptionsParams.
func (mr *MockResourcemetadataServiceIfaceMockRecorder) NewListDetailOptionsParams(resourcetype any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewListDetailOptionsParams", reflect.TypeOf((*MockResourcemetadataServiceIface)(nil).NewListDetailOptionsParams), resourcetype)
}

// NewListResourceDetailsParams mocks base method.
func (m *MockResourcemetadataServiceIface) NewListResourceDetailsParams(resourcetype string) *ListResourceDetailsParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewListResourceDetailsParams", resourcetype)
	ret0, _ := ret[0].(*ListResourceDetailsParams)
	return ret0
}

// NewListResourceDetailsParams indicates an expected call of NewListResourceDetailsParams.
func (mr *MockResourcemetadataServiceIfaceMockRecorder) NewListResourceDetailsParams(resourcetype any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewListResourceDetailsParams", reflect.TypeOf((*MockResourcemetadataServiceIface)(nil).NewListResourceDetailsParams), resourcetype)
}

// NewRemoveResourceDetailParams mocks base method.
func (m *MockResourcemetadataServiceIface) NewRemoveResourceDetailParams(resourceid, resourcetype string) *RemoveResourceDetailParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewRemoveResourceDetailParams", resourceid, resourcetype)
	ret0, _ := ret[0].(*RemoveResourceDetailParams)
	return ret0
}

// NewRemoveResourceDetailParams indicates an expected call of NewRemoveResourceDetailParams.
func (mr *MockResourcemetadataServiceIfaceMockRecorder) NewRemoveResourceDetailParams(resourceid, resourcetype any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewRemoveResourceDetailParams", reflect.TypeOf((*MockResourcemetadataServiceIface)(nil).NewRemoveResourceDetailParams), resourceid, resourcetype)
}

// RemoveResourceDetail mocks base method.
func (m *MockResourcemetadataServiceIface) RemoveResourceDetail(p *RemoveResourceDetailParams) (*RemoveResourceDetailResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "RemoveResourceDetail", p)
	ret0, _ := ret[0].(*RemoveResourceDetailResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// RemoveResourceDetail indicates an expected call of RemoveResourceDetail.
func (mr *MockResourcemetadataServiceIfaceMockRecorder) RemoveResourceDetail(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveResourceDetail", reflect.TypeOf((*MockResourcemetadataServiceIface)(nil).RemoveResourceDetail), p)
}
