* Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.
* MindIE is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
#include <libgen.h>
#include <sys/stat.h>
#include <gtest/gtest.h>
#include "mockcpp/mockcpp.hpp"
#include "config_manager.h"
#include "file_utils.h"
#include "common_util.h"
#include "dt_tools.h"
#include "base_config_manager.h"
using OrderedJson = nlohmann::ordered_json;
using Json = nlohmann::json;
using namespace mindie_llm;
namespace mindie_llm {
class ServerConfigManagerTest : public testing::Test {
protected:
void SetUp()
{
jsonPath = GetCwdDirectory() + "/conf/config.json";
jsonPathError = GetCwdDirectory() + "/conf/config_er.json";
}
void TearDown()
{
}
std::string jsonPath;
std::string jsonPathError;
};
void ModifyConfigJson(const std::string &inputFile, const std::string &outputFile)
{
mode_t fileMode = 0640;
chmod(outputFile.c_str(), fileMode);
std::ifstream file(inputFile);
if (!file.is_open()) {
std::cerr << "Failed to open source config json file." << std::endl;
return;
}
OrderedJson data;
try {
file >> data;
} catch (const std::exception& e) {
std::cerr << "Failed to parse json file." << e.what() << std::endl;
return;
}
file.close();
data["ServerConfig"]["httpsEnabled"] = true;
data["ServerConfig"]["interCommTLSEnabled"] = true;
std::ofstream out_file(outputFile);
if (!out_file.is_open()) {
std::cerr << "Failed to open modified config json file." << std::endl;
return;
}
size_t indent = 4;
try {
out_file << data.dump(indent);
} catch (const std::exception& e) {
std::cerr << "Failed to write json file." << e.what() << std::endl;
return;
}
out_file.close();
}
TEST_F(ServerConfigManagerTest, testParamFuncsSuccess)
{
ServerConfigManager serverConfigManager(jsonPath);
EXPECT_TRUE(serverConfigManager.InitFromJson());
EXPECT_TRUE(serverConfigManager.CheckParam());
auto serverConfig = serverConfigManager.GetParam();
int32_t expectedPort = 1025;
EXPECT_EQ(serverConfig.port, expectedPort);
EXPECT_TRUE(serverConfigManager.GetDecodeStatus());
}
TEST_F(ServerConfigManagerTest, testParamFuncsFail)
{
std::string newJsonPath = GetCwdDirectory() + "/conf/newConfig.json";
std::unordered_map<std::string, OrderedJson> updates = {
{"ServerConfig", {{"httpsEnabled", true}}}
};
UpdateConfigJson(jsonPathError, newJsonPath, updates);
ServerConfigManager serverConfigManager(newJsonPath);
MOCKER(static_cast<bool(*)(const std::string&, std::string&, bool, mode_t, bool, uint64_t)>(FileUtils::IsFileValid))
.stubs().will(returnValue(true));
MOCKER(static_cast<bool(*)(const std::string&, const std::string&, std::string&, bool, std::string&)>(FileUtils::RegularFilePath))
.stubs().will(returnValue(true));
EXPECT_TRUE(serverConfigManager.InitFromJson());
EXPECT_FALSE(serverConfigManager.CheckParam());
auto serverConfig = serverConfigManager.GetParam();
int32_t expectedPort = 3006;
EXPECT_FALSE(serverConfig.port == expectedPort);
GlobalMockObject::verify();
}
TEST_F(ServerConfigManagerTest, InitFromJson)
{
const char* envVal = std::getenv("MINDIE_LLM_HOME_PATH");
if (envVal != nullptr) {
std::cout << "MINDIE_LLM_HOME_PATH is: " << envVal << std::endl;
}
std::string homePath;
GetHomePath(homePath);
std::string inputFile = GetCwdDirectory() + "/conf/config.json";
std::string outputFile = GetCwdDirectory() + "/conf/modifiedConfig.json";
ModifyConfigJson(inputFile, outputFile);
ServerConfigManager serverConfigManager(outputFile);
MOCKER(static_cast<bool(*)(const std::string&, std::string&, bool, mode_t, bool, uint64_t)>(FileUtils::IsFileValid))
.stubs().will(returnValue(true));
MOCKER(static_cast<bool(*)(const std::string&, const std::string&, std::string&, bool, std::string&)>(FileUtils::RegularFilePath))
.stubs().will(returnValue(true));
EXPECT_TRUE(serverConfigManager.InitFromJson());
MOCKER(ParamChecker::CheckJsonArray).stubs().will(returnValue(false));
EXPECT_TRUE(serverConfigManager.InitFromJson());
GlobalMockObject::verify();
}
TEST_F(ServerConfigManagerTest, InitHttpsConfigFromJson_HandlesEmptyJson)
{
Json emptyJson = Json::object();
ServerConfigManager manager(jsonPath);
manager.InitHttpsConfigFromJson(emptyJson, false);
EXPECT_TRUE(manager.serverConfig_.tlsCaPath.empty());
EXPECT_TRUE(manager.serverConfig_.tlsCaFile.empty());
EXPECT_TRUE(manager.jsonDecodeSuccess_);
}
TEST_F(ServerConfigManagerTest, SetsTlsCaPath)
{
ServerConfigManager manager(jsonPath);
Json json = {{"tlsCaPath", "/etc/certs/ca.pem"}};
manager.InitHttpsConfigFromJson(json, false);
EXPECT_EQ(manager.serverConfig_.tlsCaPath, "/etc/certs/ca.pem");
EXPECT_TRUE(manager.serverConfig_.tlsCaFile.empty());
}
TEST_F(ServerConfigManagerTest, AddsTlsCaFiles)
{
ServerConfigManager manager(jsonPath);
Json json = {{"tlsCaFile", {"file1.pem", "file2.pem"}}};
manager.InitHttpsConfigFromJson(json, false);
std::set<std::string> expected = {"file1.pem", "file2.pem"};
EXPECT_EQ(manager.serverConfig_.tlsCaFile, expected);
}
TEST_F(ServerConfigManagerTest, InitHttpsConfigFromJson_HandlesInvalidTlsCaFileType)
{
ServerConfigManager manager(jsonPath);
Json json = {{"tlsCaFile", {1, 2, 3}}};
manager.InitHttpsConfigFromJson(json, false);
EXPECT_TRUE(manager.serverConfig_.tlsCaFile.empty());
EXPECT_FALSE(manager.jsonDecodeSuccess_);
}
TEST_F(ServerConfigManagerTest, SetsBothTlsConfigs)
{
ServerConfigManager manager(jsonPath);
Json json = {
{"tlsCaPath", "/etc/certs/ca.pem"},
{"tlsCaFile", {"file1.pem", "file2.pem"}}
};
manager.InitHttpsConfigFromJson(json, false);
EXPECT_EQ(manager.serverConfig_.tlsCaPath, "/etc/certs/ca.pem");
std::set<std::string> expectedFiles = {"file1.pem", "file2.pem"};
EXPECT_EQ(manager.serverConfig_.tlsCaFile, expectedFiles);
}
TEST_F(ServerConfigManagerTest, InitHttpsBusinessConfigFromJson_HandlesEmptyJson)
{
ServerConfigManager manager(jsonPath);
Json json = Json::object();
manager.InitHttpsBusinessConfigFromJson(json);
EXPECT_TRUE(manager.serverConfig_.tlsCert.empty());
EXPECT_TRUE(manager.serverConfig_.tlsCrlPath.empty());
EXPECT_TRUE(manager.serverConfig_.tlsCrlFiles.empty());
EXPECT_TRUE(manager.serverConfig_.tlsCaFile.empty());
EXPECT_TRUE(manager.serverConfig_.tlsPk.empty());
EXPECT_TRUE(manager.jsonDecodeSuccess_);
}
TEST_F(ServerConfigManagerTest, InitHttpsBusinessConfigFromJson_SetsAllValidFields)
{
ServerConfigManager manager(jsonPath);
Json json = {
{"tlsCert", "server.crt"},
{"tlsCrlPath", "/crl/path"},
{"tlsCrlFiles", {"crl1.pem", "crl2.pem"}},
{"tlsCaFile", {"ca1.pem", "ca2.pem"}},
{"tlsPk", "private.key"},
};
manager.InitHttpsBusinessConfigFromJson(json);
EXPECT_EQ(manager.serverConfig_.tlsCert, "server.crt");
EXPECT_EQ(manager.serverConfig_.tlsCrlPath, "/crl/path");
EXPECT_EQ(manager.serverConfig_.tlsCrlFiles,
(std::set<std::string>{"crl1.pem", "crl2.pem"}));
EXPECT_EQ(manager.serverConfig_.tlsCaFile,
(std::set<std::string>{"ca1.pem", "ca2.pem"}));
EXPECT_EQ(manager.serverConfig_.tlsPk, "private.key");
EXPECT_TRUE(manager.jsonDecodeSuccess_);
}
TEST_F(ServerConfigManagerTest, HandlesInvalidTlsCrlFilesType)
{
ServerConfigManager manager(jsonPath);
Json json = {
{"tlsCrlFiles", {1, 2, 3}},
{"tlsPk", "should-not-be-set.key"}
};
manager.InitHttpsBusinessConfigFromJson(json);
EXPECT_TRUE(manager.serverConfig_.tlsCrlFiles.empty());
EXPECT_TRUE(manager.serverConfig_.tlsPk.empty());
EXPECT_FALSE(manager.jsonDecodeSuccess_);
}
TEST_F(ServerConfigManagerTest, InitHttpsBusinessConfigFromJson_HandlesInvalidTlsCaFileType)
{
ServerConfigManager manager(jsonPath);
Json json = {
{"tlsCaFile", true},
};
manager.InitHttpsBusinessConfigFromJson(json);
EXPECT_TRUE(manager.serverConfig_.tlsCaFile.empty());
EXPECT_FALSE(manager.jsonDecodeSuccess_);
}
TEST_F(ServerConfigManagerTest, InitHttpsBusinessConfigFromJson_SetsPartialFields)
{
ServerConfigManager manager(jsonPath);
Json json = {
{"tlsCert", "partial.crt"},
{"tlsPk", "partial.key"}
};
manager.InitHttpsBusinessConfigFromJson(json);
EXPECT_EQ(manager.serverConfig_.tlsCert, "partial.crt");
EXPECT_EQ(manager.serverConfig_.tlsPk, "partial.key");
EXPECT_TRUE(manager.serverConfig_.tlsCrlPath.empty());
EXPECT_TRUE(manager.serverConfig_.tlsCrlFiles.empty());
EXPECT_TRUE(manager.jsonDecodeSuccess_);
}
TEST_F(ServerConfigManagerTest, InitHttpsBusinessConfigFromJson_OrderHandlingWhenCrlFilesInvalid)
{
ServerConfigManager manager(jsonPath);
Json json = {
{"tlsCert", "should-be-set.crt"},
{"tlsCrlFiles", {1, 2}},
{"tlsPk", "should-not-be-set.key"}
};
manager.InitHttpsBusinessConfigFromJson(json);
EXPECT_EQ(manager.serverConfig_.tlsCert, "should-be-set.crt");
EXPECT_TRUE(manager.serverConfig_.tlsPk.empty());
EXPECT_FALSE(manager.jsonDecodeSuccess_);
}
TEST_F(ServerConfigManagerTest, InitHttpsManagementConfigFromJson_HandlesEmptyJson)
{
ServerConfigManager manager(jsonPath);
Json json = Json::object();
manager.InitHttpsManagementConfigFromJson(json);
EXPECT_TRUE(manager.serverConfig_.managementTlsCert.empty());
EXPECT_TRUE(manager.serverConfig_.managementTlsCrlPath.empty());
EXPECT_TRUE(manager.serverConfig_.managementTlsCrlFiles.empty());
EXPECT_TRUE(manager.serverConfig_.managementTlsCaFile.empty());
EXPECT_TRUE(manager.serverConfig_.managementTlsPk.empty());
EXPECT_TRUE(manager.jsonDecodeSuccess_);
}
TEST_F(ServerConfigManagerTest, InitHttpsManagementConfigFromJson_SetsAllValidFields)
{
ServerConfigManager manager(jsonPath);
Json json = {
{"managementTlsCert", "mgmt.crt"},
{"managementTlsCrlPath", "/mgmt/crl/path"},
{"managementTlsCrlFiles", {"mgmt_crl1.pem", "mgmt_crl2.pem"}},
{"managementTlsCaFile", {"mgmt_ca1.pem", "mgmt_ca2.pem"}},
{"managementTlsPk", "mgmt_private.key"},
};
manager.InitHttpsManagementConfigFromJson(json);
EXPECT_EQ(manager.serverConfig_.managementTlsCert, "mgmt.crt");
EXPECT_EQ(manager.serverConfig_.managementTlsCrlPath, "/mgmt/crl/path");
EXPECT_EQ(manager.serverConfig_.managementTlsCrlFiles,
(std::set<std::string>{"mgmt_crl1.pem", "mgmt_crl2.pem"}));
EXPECT_EQ(manager.serverConfig_.managementTlsCaFile,
(std::set<std::string>{"mgmt_ca1.pem", "mgmt_ca2.pem"}));
EXPECT_EQ(manager.serverConfig_.managementTlsPk, "mgmt_private.key");
EXPECT_TRUE(manager.jsonDecodeSuccess_);
}
TEST_F(ServerConfigManagerTest, HandlesInvalidManagementTlsCrlFilesType)
{
ServerConfigManager manager(jsonPath);
Json json = {
{"managementTlsCrlFiles", {1, 2, 3}},
{"managementTlsPk", "should-not-be-set.key"}
};
manager.InitHttpsManagementConfigFromJson(json);
EXPECT_TRUE(manager.serverConfig_.managementTlsCrlFiles.empty());
EXPECT_TRUE(manager.serverConfig_.managementTlsPk.empty());
EXPECT_FALSE(manager.jsonDecodeSuccess_);
}
TEST_F(ServerConfigManagerTest, HandlesInvalidManagementTlsCaFileType)
{
ServerConfigManager manager(jsonPath);
Json json = {
{"managementTlsCaFile", true},
};
manager.InitHttpsManagementConfigFromJson(json);
EXPECT_TRUE(manager.serverConfig_.managementTlsCaFile.empty());
EXPECT_FALSE(manager.jsonDecodeSuccess_);
}
TEST_F(ServerConfigManagerTest, InitHttpsManagementConfigFromJson_SetsPartialFields)
{
ServerConfigManager manager(jsonPath);
Json json = {
{"managementTlsCert", "partial_mgmt.crt"},
{"managementTlsPk", "partial_mgmt.key"}
};
manager.InitHttpsManagementConfigFromJson(json);
EXPECT_EQ(manager.serverConfig_.managementTlsCert, "partial_mgmt.crt");
EXPECT_EQ(manager.serverConfig_.managementTlsPk, "partial_mgmt.key");
EXPECT_TRUE(manager.serverConfig_.managementTlsCrlPath.empty());
EXPECT_TRUE(manager.serverConfig_.managementTlsCrlFiles.empty());
EXPECT_TRUE(manager.jsonDecodeSuccess_);
}
TEST_F(ServerConfigManagerTest, InitHttpsManagementConfigFromJson_OrderHandlingWhenCrlFilesInvalid)
{
ServerConfigManager manager(jsonPath);
Json json = {
{"managementTlsCert", "should-be-set.crt"},
{"managementTlsCrlFiles", {1, 2}},
{"managementTlsPk", "should-not-be-set.key"}
};
manager.InitHttpsManagementConfigFromJson(json);
EXPECT_EQ(manager.serverConfig_.managementTlsCert, "should-be-set.crt");
EXPECT_TRUE(manager.serverConfig_.managementTlsPk.empty());
EXPECT_FALSE(manager.jsonDecodeSuccess_);
}
TEST_F(ServerConfigManagerTest, OrderHandlingWhenCaFileInvalid)
{
ServerConfigManager manager(jsonPath);
Json json = {
{"managementTlsCert", "should-be-set.crt"},
{"managementTlsCrlPath", "/crl/path"},
{"managementTlsCaFile", 123},
{"managementTlsPk", "should-not-be-set.key"}
};
manager.InitHttpsManagementConfigFromJson(json);
EXPECT_EQ(manager.serverConfig_.managementTlsCert, "should-be-set.crt");
EXPECT_EQ(manager.serverConfig_.managementTlsCrlPath, "/crl/path");
EXPECT_TRUE(manager.serverConfig_.managementTlsCaFile.empty());
EXPECT_TRUE(manager.serverConfig_.managementTlsPk.empty());
EXPECT_FALSE(manager.jsonDecodeSuccess_);
}
TEST_F(ServerConfigManagerTest, CheckHttpsConfig)
{
std::string inputFile = GetCwdDirectory() + "/conf/config.json";
std::string outputFile = GetCwdDirectory() + "/conf/modifiedConfig.json";
ModifyConfigJson(inputFile, outputFile);
MOCKER(static_cast<bool(*)(const std::string&, std::string&, bool, mode_t, bool, uint64_t)>(FileUtils::IsFileValid))
.stubs().will(returnValue(true));
MOCKER(static_cast<bool(*)(const std::string&, const std::string&, std::string&, bool, std::string&)>(FileUtils::RegularFilePath))
.stubs().will(returnValue(true));
MOCKER(ParamChecker::CheckPath).stubs().will(returnValue(true));
MOCKER(FileUtils::CheckFileExists).stubs().will(returnValue(true));
MOCKER(FileUtils::CheckDirectoryExists).stubs().will(returnValue(false));
ServerConfigManager serverConfigManager(outputFile);
EXPECT_TRUE(serverConfigManager.InitFromJson());
EXPECT_TRUE(serverConfigManager.CheckHttpsConfig(true));
}
TEST_F(ServerConfigManagerTest, TestIpAddressParamFuncsSucc)
{
std::string jsonPath = GetCwdDirectory() + "/conf/config.json";
std::string newJsonPath = GetCwdDirectory() + "/conf/newConfig1.json";
std::unordered_map<std::string, OrderedJson> updates = { \
{"ServerConfig", \
{{"layerwiseDisaggregated",true},\
{"layerwiseDisaggregatedRoleType","slave"},\
{"layerwiseDisaggregatedDataPort",10001},\
{"layerwiseDisaggregatedCrtlPort",{10001,10002}},\
{"layerwiseDisaggregatedMasterIpAddress", "76.76.26.197"}, \
{"layerwiseDisaggregatedSlaveIpAddress", {"76.76.26.198"}}}}
};
UpdateConfigJson(jsonPath, newJsonPath, updates);
ServerConfigManager serverConfigManager(newJsonPath);
MOCKER(static_cast<bool(*)(const std::string&, std::string&, bool, mode_t, bool, uint64_t)>(FileUtils::IsFileValid))
.stubs().will(returnValue(true));
MOCKER(static_cast<bool(*)(const std::string&, const std::string&, std::string&, bool, std::string&)>(FileUtils::RegularFilePath))
.stubs().will(returnValue(true));
EXPECT_TRUE(serverConfigManager.InitFromJson());
EXPECT_TRUE(serverConfigManager.CheckParam());
auto serverConfig = serverConfigManager.GetParam();
std::string edgeIpAddress = "76.76.26.197";
std::vector<std::string> cloudIpAddress = {"76.76.26.198"};
EXPECT_TRUE(serverConfig.layerwiseDisaggregatedMasterIpAddress == edgeIpAddress);
EXPECT_TRUE(serverConfig.layerwiseDisaggregatedSlaveIpAddress[0] == cloudIpAddress[0]);
GlobalMockObject::verify();
}
TEST_F(ServerConfigManagerTest, TestIpAddressParamFuncsFail)
{
std::string jsonPath = GetCwdDirectory() + "/conf/config.json";
std::string newJsonPath = GetCwdDirectory() + "/conf/newConfig.json";
std::unordered_map<std::string, OrderedJson> updates = { \
{"ServerConfig", \
{{"layerwiseDisaggregated",true},\
{"layerwiseDisaggregatedRoleType","slave"},\
{"layerwiseDisaggregatedDataPort",102},\
{"layerwiseDisaggregatedCrtlPort",{102,103}},\
{"layerwiseDisaggregatedMasterIpAddress", "76.76.26.197.1"}, \
{"layerwiseDisaggregatedSlaveIpAddress", {"76.76.26.198.2"}}}}
};
UpdateConfigJson(jsonPath, newJsonPath, updates);
ServerConfigManager serverConfigManager(newJsonPath);
MOCKER(static_cast<bool(*)(const std::string&, std::string&, bool, mode_t, bool, uint64_t)>(FileUtils::IsFileValid))
.stubs().will(returnValue(true));
MOCKER(static_cast<bool(*)(const std::string&, const std::string&, std::string&, bool, std::string&)>(FileUtils::RegularFilePath))
.stubs().will(returnValue(true));
EXPECT_TRUE(serverConfigManager.InitFromJson());
auto serverConfig = serverConfigManager.GetParam();
if (serverConfig.layerwiseDisaggregated) {
EXPECT_FALSE(serverConfigManager.CheckParam());
}
GlobalMockObject::verify();
}
TEST_F(ServerConfigManagerTest, TestLayerwiseDisaggregatedFuncsSucc)
{
std::string jsonPath = GetCwdDirectory() + "/conf/config.json";
std::string newJsonPath = GetCwdDirectory() + "/conf/newConfig.json";
std::unordered_map<std::string, OrderedJson> updates = { \
{"ServerConfig", \
{{"layerwiseDisaggregated",true},\
{"layerwiseDisaggregatedRoleType","slave"},\
{"layerwiseDisaggregatedDataPort",10001},\
{"layerwiseDisaggregatedCrtlPort",{10001,10002}},\
{"layerwiseDisaggregatedMasterIpAddress", "76.76.26.197"}, \
{"layerwiseDisaggregatedSlaveIpAddress", {"76.76.26.198"}}}}
};
UpdateConfigJson(jsonPath, newJsonPath, updates);
ServerConfigManager serverConfigManager(newJsonPath);
MOCKER(static_cast<bool(*)(const std::string&, std::string&, bool, mode_t, bool, uint64_t)>(FileUtils::IsFileValid))
.stubs().will(returnValue(true));
MOCKER(static_cast<bool(*)(const std::string&, const std::string&, std::string&, bool, std::string&)>(FileUtils::RegularFilePath))
.stubs().will(returnValue(true));
EXPECT_TRUE(serverConfigManager.InitFromJson());
auto serverConfig = serverConfigManager.GetParam();
EXPECT_TRUE(serverConfig.layerwiseDisaggregated == true);
EXPECT_TRUE(serverConfig.layerwiseDisaggregatedRoleType == "slave");
EXPECT_TRUE(serverConfigManager.CheckParam());
GlobalMockObject::verify();
}
TEST_F(ServerConfigManagerTest, TestLayerwiseDisaggregatedFuncsFail)
{
std::string jsonPath = GetCwdDirectory() + "/conf/config.json";
std::string newJsonPath = GetCwdDirectory() + "/conf/newConfig.json";
std::unordered_map<std::string, OrderedJson> updates = { \
{"ServerConfig", \
{{"layerwiseDisaggregated",true},\
{"layerwiseDisaggregatedRoleType","test"},\
{"layerwiseDisaggregatedDataPort",10001},\
{"layerwiseDisaggregatedCrtlPort",{10001,10002}},\
{"layerwiseDisaggregatedMasterIpAddress", "76.76.26.197"}, \
{"layerwiseDisaggregatedSlaveIpAddress", {"76.76.26.198"}}}}
};
UpdateConfigJson(jsonPath, newJsonPath, updates);
ServerConfigManager serverConfigManager(newJsonPath);
MOCKER(static_cast<bool(*)(const std::string&, std::string&, bool, mode_t, bool, uint64_t)>(FileUtils::IsFileValid))
.stubs().will(returnValue(true));
MOCKER(static_cast<bool(*)(const std::string&, const std::string&, std::string&, bool, std::string&)>(FileUtils::RegularFilePath))
.stubs().will(returnValue(true));
EXPECT_TRUE(serverConfigManager.InitFromJson());
auto serverConfig = serverConfigManager.GetParam();
EXPECT_TRUE(serverConfig.layerwiseDisaggregated == true);
EXPECT_TRUE(serverConfig.layerwiseDisaggregatedRoleType == "test");
EXPECT_FALSE(serverConfigManager.CheckParam());
GlobalMockObject::verify();
}
}