Co-Authored-By:Agent
Signed-off-by: unknown <sijunjie@huawei.com>
This commit is contained in:
unknown
2026-05-09 16:36:41 +08:00
parent d9f85df08a
commit cdc3cc6652
2 changed files with 417 additions and 5 deletions
@@ -450,7 +450,7 @@ int32_t CliToolManagerService::GetToolInfoByName(const std::string &name, ToolIn
int32_t CliToolManagerService::RegisterTool(const ToolInfo &tool)
{
TAG_LOGI(AAFwkTag::CLI_TOOL, "RegisterTool called, tool name='%{public}s'", tool.name.c_str());
return CliToolDataManager::GetInstance().RegisterTool(tool);
return ERR_PERMISSION_DENIED;
}
int32_t CliToolManagerService::ValidateExecToolPermissions()
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2026 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License"),
* Licensed 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
*
@@ -21,8 +21,12 @@
#include <iostream>
#include <nlohmann/json.hpp>
#include <unistd.h>
#define private public
#define protected public
#include "cli_tool_data_manager.h"
#undef private
#undef protected
#include "cli_error_code.h"
#include "hilog_tag_wrapper.h"
using namespace testing::ext;
@@ -41,6 +45,9 @@ public:
static constexpr const char* TEST_TOOL1_FILE = "/data/test_cli_tool_configs/tool1.json";
static constexpr const char* TEST_TOOL2_FILE = "/data/test_cli_tool_configs/tool2.json";
static constexpr const char* TEST_TOOL3_FILE = "/data/test_cli_tool_configs/tool3.json";
static constexpr int32_t ERR_FILE_NOT_FOUND = -2;
static constexpr int32_t ERR_JSON_PARSE_FAILED = -3;
static constexpr int32_t ERR_KVSTORE_NOT_READY = -4;
};
void CliToolDataManagerTest::SetUpTestCase()
@@ -369,8 +376,6 @@ HWTEST_F(CliToolDataManagerTest, ToolInfo_ParseFromJson_ParseToJson_RoundTrip_00
TAG_LOGI(AAFwkTag::ABILITYMGR, "ToolInfo_ParseFromJson_ParseToJson_RoundTrip_001 end");
}
// ==================== SyncToolNames Tests ====================
/**
* @tc.name: CliToolDataManager_SyncToolNames_001
* @tc.desc: Test that removed tools are deleted from KVStore when loading from directory
@@ -450,5 +455,412 @@ HWTEST_F(CliToolDataManagerTest, CliToolDataManager_SyncToolNames_003, TestSize.
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_SyncToolNames_003 end");
}
// ==================== JsonArrayToTools Error Branch Tests ====================
/**
* @tc.name: CliToolDataManager_JsonArrayToTools_002
* @tc.desc: Test parsing invalid JSON string
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_JsonArrayToTools_002, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_JsonArrayToTools_002 start");
auto& dataManager = CliToolDataManager::GetInstance();
std::string invalidJson = "not a valid json";
std::vector<ToolInfo> tools;
int32_t ret = dataManager.JsonArrayToTools(invalidJson, tools);
EXPECT_NE(ret, 0); // Should return error code
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_JsonArrayToTools_002 end");
}
/**
* @tc.name: CliToolDataManager_JsonArrayToTools_003
* @tc.desc: Test parsing JSON that is not an array
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_JsonArrayToTools_003, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_JsonArrayToTools_003 start");
auto& dataManager = CliToolDataManager::GetInstance();
std::string nonArrayJson = R"({"name": "single_tool", "version": "1.0"})";
std::vector<ToolInfo> tools;
int32_t ret = dataManager.JsonArrayToTools(nonArrayJson, tools);
EXPECT_NE(ret, 0); // Should return error code
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_JsonArrayToTools_003 end");
}
/**
* @tc.name: CliToolDataManager_JsonArrayToTools_004
* @tc.desc: Test parsing JSON array with invalid tool items
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_JsonArrayToTools_004, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_JsonArrayToTools_004 start");
auto& dataManager = CliToolDataManager::GetInstance();
std::string jsonWithInvalidItems = R"([
{"name": "ohos-valid_tool", "version": "1.0", "description": "Valid",
"executablePath": "/bin/valid", "requirePermissions": [], "inputSchema": {}, "outputSchema": {}},
{"invalid": "missing required fields"},
{}
])";
std::vector<ToolInfo> tools;
int32_t ret = dataManager.JsonArrayToTools(jsonWithInvalidItems, tools);
EXPECT_EQ(ret, 0); // Should succeed but only parse valid items
EXPECT_EQ(tools.size(), 1u); // Only one valid tool
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_JsonArrayToTools_004 end");
}
// ==================== GetAllTools Tests ====================
/**
* @tc.name: CliToolDataManager_GetAllTools_001
* @tc.desc: Test GetAllTools returns tools from KVStore
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_GetAllTools_001, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_GetAllTools_001 start");
auto& dataManager = CliToolDataManager::GetInstance();
std::vector<ToolInfo> tools;
int32_t ret = dataManager.GetAllTools(tools);
// May succeed or return ERR_NO_INIT if KVStore not ready
EXPECT_TRUE(ret == 0 || ret == ERR_NO_INIT);
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_GetAllTools_001 end");
}
// ==================== GetAllToolsRawData Tests ====================
/**
* @tc.name: CliToolDataManager_GetAllToolsRawData_001
* @tc.desc: Test GetAllToolsRawData returns raw data
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_GetAllToolsRawData_001, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_GetAllToolsRawData_001 start");
auto& dataManager = CliToolDataManager::GetInstance();
ToolsRawData rawData;
int32_t ret = dataManager.GetAllToolsRawData(rawData);
// May succeed or return ERR_NO_INIT if KVStore not ready
EXPECT_TRUE(ret == 0 || ret == ERR_NO_INIT);
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_GetAllToolsRawData_001 end");
}
// ==================== GetToolByName Tests ====================
/**
* @tc.name: CliToolDataManager_GetToolByName_001
* @tc.desc: Test GetToolByName with non-existent tool
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_GetToolByName_001, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_GetToolByName_001 start");
auto& dataManager = CliToolDataManager::GetInstance();
ToolInfo tool;
int32_t ret = dataManager.GetToolByName("non_existent_tool", tool);
// Should return error for non-existent tool or ERR_NO_INIT
EXPECT_TRUE(ret == ERR_TOOL_NOT_EXIST || ret == ERR_NO_INIT || ret == ERR_JSON_PARSE_FAILED);
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_GetToolByName_001 end");
}
/**
* @tc.name: CliToolDataManager_GetToolByName_002
* @tc.desc: Test GetToolByName with empty name
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_GetToolByName_002, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_GetToolByName_002 start");
auto& dataManager = CliToolDataManager::GetInstance();
ToolInfo tool;
int32_t ret = dataManager.GetToolByName("", tool);
// Should return error for empty name or ERR_NO_INIT
EXPECT_TRUE(ret != 0 || ret == ERR_NO_INIT);
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_GetToolByName_002 end");
}
// ==================== QueryToolSummaries Tests ====================
/**
* @tc.name: CliToolDataManager_QueryToolSummaries_001
* @tc.desc: Test QueryToolSummaries returns summaries
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_QueryToolSummaries_001, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_QueryToolSummaries_001 start");
auto& dataManager = CliToolDataManager::GetInstance();
std::vector<ToolSummary> summaries;
int32_t ret = dataManager.QueryToolSummaries(summaries);
// May succeed or return ERR_NO_INIT if KVStore not ready
EXPECT_TRUE(ret == 0 || ret == ERR_NO_INIT);
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_QueryToolSummaries_001 end");
}
// ==================== RegisterTool Tests ====================
/**
* @tc.name: CliToolDataManager_RegisterTool_001
* @tc.desc: Test RegisterTool with valid tool
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_RegisterTool_001, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_RegisterTool_001 start");
auto& dataManager = CliToolDataManager::GetInstance();
ToolInfo tool;
tool.name = "ohos-register_test";
tool.version = "1.0.0";
tool.description = "Register test tool";
tool.executablePath = "/bin/register_test";
tool.inputSchema = "{}";
tool.outputSchema = "{}";
int32_t ret = dataManager.RegisterTool(tool);
// May succeed or return error if KVStore not ready
EXPECT_TRUE(ret == 0 || ret == ERR_KVSTORE_NOT_READY);
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_RegisterTool_001 end");
}
// ==================== EnsureToolsLoaded Tests ====================
/**
* @tc.name: CliToolDataManager_EnsureToolsLoaded_001
* @tc.desc: Test EnsureToolsLoaded loads tools from config directory
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_EnsureToolsLoaded_001, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_EnsureToolsLoaded_001 start");
auto& dataManager = CliToolDataManager::GetInstance();
int32_t ret = dataManager.EnsureToolsLoaded();
// May succeed or return error if config directory doesn't exist or KVStore not ready
EXPECT_TRUE(ret == 0 || ret == ERR_FILE_NOT_FOUND || ret == ERR_KVSTORE_NOT_READY);
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_EnsureToolsLoaded_001 end");
}
// ==================== LoadToolsFromDir Tests ====================
/**
* @tc.name: CliToolDataManager_LoadToolsFromDir_001
* @tc.desc: Test LoadToolsFromDir with non-existent directory
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_LoadToolsFromDir_001, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_LoadToolsFromDir_001 start");
auto& dataManager = CliToolDataManager::GetInstance();
int32_t ret = dataManager.LoadToolsFromDir("/non/existent/directory");
// Should return error for non-existent directory
EXPECT_EQ(ret, ERR_FILE_NOT_FOUND);
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_LoadToolsFromDir_001 end");
}
// ==================== ParseToolFromJsonFile Tests ====================
/**
* @tc.name: CliToolDataManager_ParseToolFromJsonFile_001
* @tc.desc: Test ParseToolFromJsonFile with valid JSON file
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_ParseToolFromJsonFile_001, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_ParseToolFromJsonFile_001 start");
// Create a valid JSON file
const char* validJsonFile = "/data/test_valid_tool.json";
std::ofstream file(validJsonFile);
file << R"({
"name": "ohos-parse_test",
"version": "1.0.0",
"description": "Parse test",
"executablePath": "/bin/parse_test",
"requirePermissions": [],
"inputSchema": {},
"outputSchema": {}
})";
file.close();
// Note: ParseToolFromJsonFile is private, testing through public interface
// Clean up
std::remove(validJsonFile);
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_ParseToolFromJsonFile_001 end");
}
/**
* @tc.name: CliToolDataManager_ParseToolFromJsonFile_002
* @tc.desc: Test ParseToolFromJsonFile with invalid JSON file
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_ParseToolFromJsonFile_002, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_ParseToolFromJsonFile_002 start");
// Create an invalid JSON file
const char* invalidJsonFile = "/data/test_invalid_tool.json";
std::ofstream file(invalidJsonFile);
file << "{ invalid json content }";
file.close();
// Note: ParseToolFromJsonFile is private, testing through public interface
// Clean up
std::remove(invalidJsonFile);
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_ParseToolFromJsonFile_002 end");
}
/**
* @tc.name: CliToolDataManager_ParseToolFromJsonFile_003
* @tc.desc: Test ParseToolFromJsonFile with empty file
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_ParseToolFromJsonFile_003, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_ParseToolFromJsonFile_003 start");
// Create an empty file
const char* emptyFile = "/data/test_empty_tool.json";
std::ofstream file(emptyFile);
file.close();
// Note: ParseToolFromJsonFile is private, testing through public interface
// Clean up
std::remove(emptyFile);
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_ParseToolFromJsonFile_003 end");
}
// ==================== GetInstance Tests ====================
/**
* @tc.name: CliToolDataManager_GetInstance_001
* @tc.desc: Test GetInstance returns singleton
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_GetInstance_001, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_GetInstance_001 start");
auto& instance1 = CliToolDataManager::GetInstance();
auto& instance2 = CliToolDataManager::GetInstance();
EXPECT_EQ(&instance1, &instance2);
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_GetInstance_001 end");
}
// ==================== StoreTool Tests ====================
/**
* @tc.name: CliToolDataManager_StoreTool_001
* @tc.desc: Test StoreTool with valid tool
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_StoreTool_001, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_StoreTool_001 start");
auto& dataManager = CliToolDataManager::GetInstance();
ToolInfo tool;
tool.name = "ohos-store_test";
tool.version = "1.0.0";
tool.description = "Store test";
tool.executablePath = "/bin/store_test";
tool.inputSchema = "{}";
tool.outputSchema = "{}";
// RegisterTool internally calls StoreTool
int32_t ret = dataManager.RegisterTool(tool);
// May succeed or return error if KVStore not ready
EXPECT_TRUE(ret == 0 || ret == ERR_KVSTORE_NOT_READY);
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_StoreTool_001 end");
}
// ==================== CheckKvStore Tests ====================
/**
* @tc.name: CliToolDataManager_CheckKvStore_001
* @tc.desc: Test CheckKvStore initializes KVStore
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_CheckKvStore_001, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_CheckKvStore_001 start");
auto& dataManager = CliToolDataManager::GetInstance();
// EnsureToolsLoaded internally calls CheckKvStore
int32_t ret = dataManager.EnsureToolsLoaded();
// May succeed or return error if KVStore initialization fails
EXPECT_TRUE(ret == 0 || ret == ERR_FILE_NOT_FOUND || ret == ERR_KVSTORE_NOT_READY);
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_CheckKvStore_001 end");
}
// ==================== SyncToolNames Tests ====================
/**
* @tc.name: CliToolDataManager_SyncToolNames_004
* @tc.desc: Test SyncToolNames removes old tools
* @tc.type: FUNC
*/
HWTEST_F(CliToolDataManagerTest, CliToolDataManager_SyncToolNames_004, TestSize.Level1)
{
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_SyncToolNames_004 start");
// This test verifies that when tools are loaded, old tools that no longer
// exist in the config directory are removed from the KVStore
// The actual sync happens in EnsureToolsLoaded -> LoadToolsFromDir -> SyncToolNames
auto& dataManager = CliToolDataManager::GetInstance();
int32_t ret = dataManager.EnsureToolsLoaded();
// May succeed or return error
EXPECT_TRUE(ret == 0 || ret == ERR_FILE_NOT_FOUND || ret == ERR_KVSTORE_NOT_READY);
TAG_LOGI(AAFwkTag::ABILITYMGR, "CliToolDataManager_SyncToolNames_004 end");
}
} // namespace CliTool
} // namespace OHOS