From 73927b00900194d2b5ba5462f0b37965bac608da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=9D=E5=AE=9D=E5=A4=A9=E9=BE=99?= Date: Tue, 10 Jun 2025 11:40:12 +0800 Subject: [PATCH] Add silk UT Signed-off-by: tianbaolin --- modules/common/appspawn_common.c | 2 +- modules/common/appspawn_silk.c | 102 +++++++++--------- modules/common/appspawn_silk.h | 9 +- .../unittest/app_spawn_standard_test/BUILD.gn | 1 + .../app_spawn_silk_test.cpp | 77 +++++++++++++ 5 files changed, 134 insertions(+), 57 deletions(-) create mode 100644 test/unittest/app_spawn_standard_test/app_spawn_silk_test.cpp diff --git a/modules/common/appspawn_common.c b/modules/common/appspawn_common.c index 844f2833..9ea849a2 100644 --- a/modules/common/appspawn_common.c +++ b/modules/common/appspawn_common.c @@ -469,7 +469,7 @@ static void SpawnLoadSilk(const AppSpawnMgr *content, const AppSpawningCtx *prop { const char *processName = GetBundleName(property); APPSPAWN_CHECK(processName != NULL, return, "Can not get bundle name"); - LoadSilkLibrary(processName); + (void)LoadSilkLibrary(processName); } static int SpawnSetProperties(AppSpawnMgr *content, AppSpawningCtx *property) diff --git a/modules/common/appspawn_silk.c b/modules/common/appspawn_silk.c index 8a2ff48d..ee349404 100644 --- a/modules/common/appspawn_silk.c +++ b/modules/common/appspawn_silk.c @@ -32,34 +32,52 @@ #define SILK_JSON_MAX 128 #define SILK_JSON_NAME_MAX 256 -struct SilkConfig { - char **configItems; - int configCursor; -}; +APPSPAWN_STATIC struct SilkConfig g_silkConfig = {0}; -static struct SilkConfig g_silkConfig = {0}; +static void FreeSilkConfigItems(void) +{ + for (int i = 0; i < g_silkConfig.configCursor; i++) { + if (g_silkConfig.configItems[i] != NULL) { + free(g_silkConfig.configItems[i]); + g_silkConfig.configItems[i] = NULL; + } + } +} -static void ParseSilkConfig(const cJSON *root, struct SilkConfig *config) +static void FreeSilkConfig(void) { + free(g_silkConfig.configItems); + g_silkConfig.configItems = NULL; + g_silkConfig.configCursor = 0; +} + +static void FreeAllSilkConfig(void) +{ + FreeSilkConfigItems(); + FreeSilkConfig(); +} + +APPSPAWN_STATIC bool ParseSilkConfig(const cJSON *root, struct SilkConfig *config) +{ + bool isSuccess = false; cJSON *silkJson = cJSON_GetObjectItemCaseSensitive(root, SILK_JSON_ENABLE_ITEM); if (silkJson == NULL) { - return; + return isSuccess; } uint32_t configCount = (uint32_t)cJSON_GetArraySize(silkJson); APPSPAWN_CHECK(configCount <= SILK_JSON_MAX, configCount = SILK_JSON_MAX, "config count %{public}u is larger than %{public}d", configCount, SILK_JSON_MAX); config->configItems = (char **)malloc(configCount * sizeof(char *)); - APPSPAWN_CHECK(config->configItems != NULL, return, "Alloc for silk config items failed"); + APPSPAWN_CHECK(config->configItems != NULL, return isSuccess, "Alloc for silk config items failed"); int ret = memset_s(config->configItems, configCount * sizeof(char *), 0, configCount * sizeof(char *)); APPSPAWN_CHECK(ret == 0, free(config->configItems); - config->configItems = NULL; return, + config->configItems = NULL; return isSuccess, "Memset silk config items failed"); - bool abnormal = false; + for (uint32_t i = 0; i < configCount; ++i) { const char *appName = cJSON_GetStringValue(cJSON_GetArrayItem(silkJson, i)); - APPSPAWN_CHECK(appName != NULL, - abnormal = true; break, "appName is NULL"); + APPSPAWN_CHECK(appName != NULL, break, "appName is NULL"); APPSPAWN_LOGI("Enable silk appName %{public}s", appName); int len = strlen(appName) + 1; @@ -67,75 +85,47 @@ static void ParseSilkConfig(const cJSON *root, struct SilkConfig *config) "appName %{public}s is larger than the maximum limit", appName); char **item = &config->configItems[config->configCursor]; *item = (char *)malloc(len * sizeof(char)); - APPSPAWN_CHECK(*item != NULL, - abnormal = true; break, "Alloc for config item failed"); + APPSPAWN_CHECK(*item != NULL, break, "Alloc for config item failed"); ret = memset_s(*item, len * sizeof(char), 0, len * sizeof(char)); APPSPAWN_CHECK(ret == 0, free(*item); - *item = NULL; - abnormal = true; break, + *item = NULL; break, "Memset config item %{public}s failed", appName); ret = strncpy_s(*item, len, appName, len - 1); APPSPAWN_CHECK(ret == 0, free(*item); - *item = NULL; - abnormal = true; break, + *item = NULL; break, "Copy config item %{public}s failed", appName); config->configCursor++; - } - if (abnormal) { - for (uint32_t i = 0; i < config->configCursor; ++i) { - char **item = &config->configItems[i]; - free(*item); - *item = NULL; + if (i == configCount -1) { + isSuccess = true; } - free(config->configItems); - config->configItems = NULL; - config->configCursor = 0; } + if (!isSuccess) { + FreeAllSilkConfig(); + } + return isSuccess; } void LoadSilkConfig(void) { cJSON *root = GetJsonObjFromFile(SILK_JSON_CONFIG_PATH); APPSPAWN_CHECK(root != NULL, return, "Failed to load silk config"); - ParseSilkConfig(root, &g_silkConfig); + (void)ParseSilkConfig(root, &g_silkConfig); cJSON_Delete(root); } -static void FreeSilkConfigItems(void) -{ - for (int i = 0; i < g_silkConfig.configCursor; i++) { - if (g_silkConfig.configItems[i] != NULL) { - free(g_silkConfig.configItems[i]); - g_silkConfig.configItems[i] = NULL; - } - } -} - -static void FreeSilkConfig(void) -{ - free(g_silkConfig.configItems); - g_silkConfig.configItems = NULL; - g_silkConfig.configCursor = 0; -} - -static void FreeAllSilkConfig(void) -{ - FreeSilkConfigItems(); - FreeSilkConfig(); -} - -void LoadSilkLibrary(const char *packageName) +bool LoadSilkLibrary(const char *packageName) { + bool isSuccess = false; if (g_silkConfig.configItems == NULL) { APPSPAWN_LOGV("ConfigItems is NULL"); - return; + return isSuccess; } if (packageName == NULL) { APPSPAWN_LOGV("PackageName is NULL"); FreeAllSilkConfig(); - return; + return isSuccess; } char **appName = NULL; void *handle = NULL; @@ -146,6 +136,9 @@ void LoadSilkLibrary(const char *packageName) } if (handle == NULL && strcmp(*appName, packageName) == 0) { handle = dlopen(SILK_JSON_LIBRARY_PATH, RTLD_NOW); + if (handle != NULL) { + isSuccess = true; + } APPSPAWN_LOGI("Enable Silk AppName %{public}s result:%{public}s", *appName, handle ? "success" : "failed"); } @@ -153,4 +146,5 @@ void LoadSilkLibrary(const char *packageName) *appName = NULL; } FreeSilkConfig(); + return isSuccess; } \ No newline at end of file diff --git a/modules/common/appspawn_silk.h b/modules/common/appspawn_silk.h index e95a6bf8..073ae087 100644 --- a/modules/common/appspawn_silk.h +++ b/modules/common/appspawn_silk.h @@ -16,7 +16,12 @@ #ifndef APPSPAWN_SILK_CPP #define APPSPAWN_SILK_CPP +struct SilkConfig { + char **configItems; + int configCursor; +}; + void LoadSilkConfig(void); -void LoadSilkLibrary(const char *packageName); +bool LoadSilkLibrary(const char *packageName); -#endif \ No newline at end of file +#endif diff --git a/test/unittest/app_spawn_standard_test/BUILD.gn b/test/unittest/app_spawn_standard_test/BUILD.gn index 92ece3b5..7c3414ae 100644 --- a/test/unittest/app_spawn_standard_test/BUILD.gn +++ b/test/unittest/app_spawn_standard_test/BUILD.gn @@ -133,6 +133,7 @@ ohos_unittest("AppSpawn_ut") { "${appspawn_path}/test/unittest/app_spawn_standard_test/app_spawn_module_interface_test.cpp", "${appspawn_path}/test/unittest/app_spawn_standard_test/app_spawn_sandboxmgr_test.cpp", "${appspawn_path}/test/unittest/app_spawn_standard_test/app_spawn_service_test.cpp", + "${appspawn_path}/test/unittest/app_spawn_standard_test/app_spawn_silk_test.cpp", "${appspawn_path}/test/unittest/app_spawn_standard_test/nweb_spawn_service_test.cpp", "${appspawn_path}/test/unittest/app_spawn_test_helper.cpp", ] diff --git a/test/unittest/app_spawn_standard_test/app_spawn_silk_test.cpp b/test/unittest/app_spawn_standard_test/app_spawn_silk_test.cpp new file mode 100644 index 00000000..a95e9db0 --- /dev/null +++ b/test/unittest/app_spawn_standard_test/app_spawn_silk_test.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * 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 + * + * 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. + */ + +#include + +#include "appspawn_utils.h" + +#ifdef __cplusplus +extern "C" { +#endif +#include "cJSON.h" +#include "appspawn_silk.h" + +extern struct SilkConfig g_silkConfig; +APPSPAWN_STATIC bool ParseSilkConfig(const cJSON *root, struct SilkConfig *config); +#ifdef __cplusplus +} +#endif + +using namespace testing; +using namespace testing::ext; + +class ParseSilkConfigTest : public ::testing::Test { +protected: + void SetUp() override {} + void TearDown() override {} +}; + +/** + * @brief 模拟测试,正常解析json文件并且正常使能silk + * + */ +HWTEST_F(ParseSilkConfigTest, Parse_Silk_Config_001, TestSize.Level0) +{ + const char *silkJsonStr = "{\"enabled_app_list\":[\"com.taobao.taobao\",\"com.tencent.mm\"]}"; + cJSON *root = cJSON_Parse(silkJsonStr); + const char* testEnableSilkProcessName = "com.taobao.taobao"; + bool ret = ParseSilkConfig(root, &g_silkConfig); + cJSON_Delete(root); + ASSERT_EQ(ret, true); + ASSERT_EQ(g_silkConfig.configCursor, 2); + ret = LoadSilkLibrary(testEnableSilkProcessName); + ASSERT_EQ(ret, true); + ASSERT_EQ(g_silkConfig.configItems, NULL); + ASSERT_EQ(g_silkConfig.configCursor, 0); +} + +/** + * @brief 模拟测试,processName为NULL的情况 + * + */ +HWTEST_F(ParseSilkConfigTest, Parse_Silk_Config_002, TestSize.Level0) +{ + const char *silkJsonStr = "{\"enabled_app_list\":[\"com.taobao.taobao\",\"com.tencent.mm\"]}"; + cJSON *root = cJSON_Parse(silkJsonStr); + const char* testEnableSilkProcessName = NULL; + bool ret = ParseSilkConfig(root, &g_silkConfig); + cJSON_Delete(root); + ASSERT_EQ(ret, true); + ASSERT_EQ(g_silkConfig.configCursor, 2); + ret = LoadSilkLibrary(testEnableSilkProcessName); + ASSERT_EQ(ret, false); + ASSERT_EQ(g_silkConfig.configItems, NULL); + ASSERT_EQ(g_silkConfig.configCursor, 0); +} -- Gitee