From 2a0a7393aff12ff318fafb50403f33761cfd007e Mon Sep 17 00:00:00 2001 From: Chuxiong_KOU Date: Fri, 16 Jan 2026 19:33:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0tdd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: kou-chuxiong --- .../src/sa_load_on_demand.cpp | 4 +- .../src/group_operation/group_operation.c | 2 +- .../src/session/v2/dev_session_v2.c | 1 + test/unittest/deviceauth/BUILD.gn | 5 +- .../deviceauth/source/ipc_adapt_test.cpp | 467 ++++++++++++++++++ 5 files changed, 475 insertions(+), 4 deletions(-) create mode 100644 test/unittest/deviceauth/source/ipc_adapt_test.cpp diff --git a/frameworks/sdk/sa_load_on_demand/src/sa_load_on_demand.cpp b/frameworks/sdk/sa_load_on_demand/src/sa_load_on_demand.cpp index 89856511..d0a663a5 100644 --- a/frameworks/sdk/sa_load_on_demand/src/sa_load_on_demand.cpp +++ b/frameworks/sdk/sa_load_on_demand/src/sa_load_on_demand.cpp @@ -163,7 +163,7 @@ static void ClearCallbackInfo(DevAuthCallbackInfo *callbackInfo) } static bool UpdateCallback(DevAuthCallbackInfo *callbackInfo, const DeviceAuthCallback *callback, - const DataChangeListener *dataChangeListener, CredChangeListener *listener, uint32_t index) + const DataChangeListener *dataChangeListener, CredChangeListener *listener) { DevAuthCallbackInfo tmpCallbackInfo; tmpCallbackInfo.callbackType = callbackInfo->callbackType; @@ -189,7 +189,7 @@ static bool UpdateCallbackInfoIfExist(const char *appId, const DeviceAuthCallbac if (IsStrEqual(entry->appId, appId) && entry->callbackType == callbackType) { LOGI("[SDK]:start to update callback, appId: %" LOG_PUB "s, callbackType: %" LOG_PUB "d", appId, callbackType); - bool ret = UpdateCallback(entry, callback, dataChangeListener, listener, index); + bool ret = UpdateCallback(entry, callback, dataChangeListener, listener); return ret; } } diff --git a/services/legacy/group_manager/src/group_operation/group_operation.c b/services/legacy/group_manager/src/group_operation/group_operation.c index 87d2a686..2a410342 100644 --- a/services/legacy/group_manager/src/group_operation/group_operation.c +++ b/services/legacy/group_manager/src/group_operation/group_operation.c @@ -980,7 +980,7 @@ static int32_t RequestAddMemberToGroup(int32_t osAccountId, int64_t requestId, c static int32_t CreateAppIdJsonString(const char *appId, char **reqParames) { CJson *reqJson = CreateJson(); - if ((reqJson == NULL) || (reqParames == NULL)) { + if (reqJson == NULL) { LOGE("Failed to create json!"); return HC_ERR_JSON_CREATE; } diff --git a/services/session_manager/src/session/v2/dev_session_v2.c b/services/session_manager/src/session/v2/dev_session_v2.c index 0231c7db..d8e6c635 100644 --- a/services/session_manager/src/session/v2/dev_session_v2.c +++ b/services/session_manager/src/session/v2/dev_session_v2.c @@ -1302,6 +1302,7 @@ static int32_t GetSharedSecret(SessionImpl *impl, const CJson *inputData, Identi } if (impl->isCredAuth && (!HasAccountPlugin())) { LOGE("The account plugin used by IS is missing!"); + DestroyCertInfo(&peerCert); return HC_ERR_NOT_SUPPORT; } // verify and set psk "SHARED_KEY_ALIAS" diff --git a/test/unittest/deviceauth/BUILD.gn b/test/unittest/deviceauth/BUILD.gn index 9385d3cc..a47bec85 100644 --- a/test/unittest/deviceauth/BUILD.gn +++ b/test/unittest/deviceauth/BUILD.gn @@ -524,7 +524,10 @@ ohos_unittest("device_auth_interface_test") { ] sources += identity_manager_files include_dirs += identity_manager_inc - sources += [ "source/deviceauth_interface_test.cpp" ] + sources += [ + "source/deviceauth_interface_test.cpp", + "source/ipc_adapt_test.cpp", + ] cflags = [ "-DHILOG_ENABLE" ] cflags += [ diff --git a/test/unittest/deviceauth/source/ipc_adapt_test.cpp b/test/unittest/deviceauth/source/ipc_adapt_test.cpp new file mode 100644 index 00000000..ac1ae5ac --- /dev/null +++ b/test/unittest/deviceauth/source/ipc_adapt_test.cpp @@ -0,0 +1,467 @@ +/* + * 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 "device_auth_defines.h" +#include "ipc_sdk_defines.h" +#include "ipc_adapt.h" + +using namespace testing::ext; + +namespace { +class IpcAdaptParamTest : public testing::Test { +public: + IpcAdaptParamTest() = default; // 显式声明默认构造函数 + ~IpcAdaptParamTest() = default; // 显式声明默认析构函数 +}; +// 测试 GetAndValSize32Param 函数 +HWTEST_F(IpcAdaptParamTest, GetAndValSize32Param_ValidParam, TestSize.Level0) +{ + int32_t testValue = 12345; + IpcDataInfo testParams[1]; + testParams[0].type = PARAM_TYPE_REQID; + testParams[0].val = reinterpret_cast(&testValue); + testParams[0].valSz = sizeof(testValue); + testParams[0].idx = 0; + + int32_t result; + int32_t size = sizeof(result); + EXPECT_EQ(HC_SUCCESS, + GetAndValSize32Param(testParams, 1, PARAM_TYPE_REQID, reinterpret_cast(&result), &size)); + EXPECT_EQ(testValue, result); +} + +HWTEST_F(IpcAdaptParamTest, GetAndValSize32Param_InvalidSize, TestSize.Level0) +{ + int64_t testValue = 12345; + IpcDataInfo testParams[1]; + testParams[0].type = PARAM_TYPE_REQID; + testParams[0].val = reinterpret_cast(&testValue); + testParams[0].valSz = sizeof(testValue); + testParams[0].idx = 0; + + int32_t result; + int32_t size = sizeof(result); + EXPECT_EQ(HC_ERR_IPC_BAD_PARAM, + GetAndValSize32Param(testParams, 1, PARAM_TYPE_REQID, reinterpret_cast(&result), &size)); +} + +HWTEST_F(IpcAdaptParamTest, GetAndValSize32Param_NotFound, TestSize.Level0) +{ + int32_t testValue = 12345; + IpcDataInfo testParams[1]; + testParams[0].type = PARAM_TYPE_REQID; + testParams[0].val = reinterpret_cast(&testValue); + testParams[0].valSz = sizeof(testValue); + testParams[0].idx = 0; + + int32_t result; + int32_t size = sizeof(result); + EXPECT_EQ(HC_ERR_IPC_BAD_PARAM, + GetAndValSize32Param(testParams, 1, PARAM_TYPE_OPCODE, reinterpret_cast(&result), &size)); +} + +// 测试 GetAndValSize64Param 函数 +HWTEST_F(IpcAdaptParamTest, GetAndValSize64Param_ValidParam, TestSize.Level0) +{ + int64_t testValue = 1234567890LL; + IpcDataInfo testParams[1]; + testParams[0].type = PARAM_TYPE_REQID; + testParams[0].val = reinterpret_cast(&testValue); + testParams[0].valSz = sizeof(testValue); + testParams[0].idx = 0; + + int64_t result; + int32_t size = sizeof(result); + EXPECT_EQ(HC_SUCCESS, + GetAndValSize64Param(testParams, 1, PARAM_TYPE_REQID, reinterpret_cast(&result), &size)); + EXPECT_EQ(testValue, result); +} + +HWTEST_F(IpcAdaptParamTest, GetAndValSize64Param_InvalidSize, TestSize.Level0) +{ + int32_t testValue = 12345; + IpcDataInfo testParams[1]; + testParams[0].type = PARAM_TYPE_REQID; + testParams[0].val = reinterpret_cast(&testValue); + testParams[0].valSz = sizeof(testValue); + testParams[0].idx = 0; + + int64_t result; + int32_t size = sizeof(result); + EXPECT_EQ(HC_ERR_IPC_BAD_PARAM, + GetAndValSize64Param(testParams, 1, PARAM_TYPE_REQID, reinterpret_cast(&result), &size)); +} + +HWTEST_F(IpcAdaptParamTest, GetAndValSize64Param_NotFound, TestSize.Level0) +{ + int64_t testValue = 1234567890LL; + IpcDataInfo testParams[1]; + testParams[0].type = PARAM_TYPE_REQID; + testParams[0].val = reinterpret_cast(&testValue); + testParams[0].valSz = sizeof(testValue); + testParams[0].idx = 0; + + int64_t result; + int32_t size = sizeof(result); + EXPECT_EQ(HC_ERR_IPC_BAD_PARAM, + GetAndValSize64Param(testParams, 1, PARAM_TYPE_OPCODE, reinterpret_cast(&result), &size)); +} + +// 测试 GetAndValSizeCbParam 函数 +HWTEST_F(IpcAdaptParamTest, GetAndValSizeCbParam_ValidParam, TestSize.Level0) +{ + DeviceAuthCallback testCallback = { + .onTransmit = nullptr, + .onSessionKeyReturned = nullptr, + .onFinish = nullptr, + .onError = nullptr, + .onRequest = nullptr + }; + IpcDataInfo testParams[1]; + testParams[0].type = PARAM_TYPE_DEV_AUTH_CB; + testParams[0].val = reinterpret_cast(&testCallback); + testParams[0].valSz = sizeof(testCallback); + testParams[0].idx = 0; + + DeviceAuthCallback result; + int32_t size = sizeof(result); + EXPECT_EQ(HC_SUCCESS, + GetAndValSizeCbParam(testParams, 1, PARAM_TYPE_DEV_AUTH_CB, reinterpret_cast(&result), &size)); +} + +HWTEST_F(IpcAdaptParamTest, GetAndValSizeCbParam_InvalidSize, TestSize.Level0) +{ + int32_t testValue = 12345; + IpcDataInfo testParams[1]; + testParams[0].type = PARAM_TYPE_DEV_AUTH_CB; + testParams[0].val = reinterpret_cast(&testValue); + testParams[0].valSz = sizeof(testValue); + testParams[0].idx = 0; + + DeviceAuthCallback result; + int32_t size = sizeof(result); + EXPECT_EQ(HC_ERR_IPC_BAD_PARAM, + GetAndValSizeCbParam(testParams, 1, PARAM_TYPE_DEV_AUTH_CB, reinterpret_cast(&result), &size)); +} + +HWTEST_F(IpcAdaptParamTest, GetAndValSizeCbParam_NotFound, TestSize.Level0) +{ + DeviceAuthCallback testCallback = { + .onTransmit = nullptr, + .onSessionKeyReturned = nullptr, + .onFinish = nullptr, + .onError = nullptr, + .onRequest = nullptr + }; + IpcDataInfo testParams[1]; + testParams[0].type = PARAM_TYPE_DEV_AUTH_CB; + testParams[0].val = reinterpret_cast(&testCallback); + testParams[0].valSz = sizeof(testCallback); + testParams[0].idx = 0; + + DeviceAuthCallback result; + int32_t size = sizeof(result); + EXPECT_EQ(HC_ERR_IPC_BAD_PARAM, + GetAndValSizeCbParam(testParams, 1, PARAM_TYPE_OPCODE, reinterpret_cast(&result), &size)); +} + +// 测试 GetAndValNullParam 函数 +HWTEST_F(IpcAdaptParamTest, GetAndValNullParam_ValidString, TestSize.Level0) +{ + char testString[] = "test_string"; + + IpcDataInfo testParams[1]; + testParams[0].type = PARAM_TYPE_APPID; + testParams[0].val = reinterpret_cast(testString); + testParams[0].valSz = static_cast(strlen(testString)) + 1; + testParams[0].idx = 0; + + char *result; + EXPECT_EQ(HC_SUCCESS, + GetAndValNullParam(testParams, 1, PARAM_TYPE_APPID, reinterpret_cast(&result), nullptr)); + EXPECT_STREQ("test_string", result); +} + +HWTEST_F(IpcAdaptParamTest, GetAndValNullParam_NullParam, TestSize.Level0) +{ + IpcDataInfo testParams[1]; + testParams[0].type = PARAM_TYPE_APPID; + testParams[0].val = nullptr; + testParams[0].valSz = 0; + testParams[0].idx = 0; + + char *result; + EXPECT_EQ(HC_ERR_IPC_BAD_PARAM, + GetAndValNullParam(testParams, 1, PARAM_TYPE_APPID, reinterpret_cast(&result), nullptr)); +} + +HWTEST_F(IpcAdaptParamTest, GetAndValNullParam_EmptyString, TestSize.Level0) +{ + char emptyString[] = ""; + + IpcDataInfo testParams[1]; + testParams[0].type = PARAM_TYPE_APPID; + testParams[0].val = reinterpret_cast(emptyString); + testParams[0].valSz = 1; + testParams[0].idx = 0; + + char *result; + EXPECT_EQ(HC_SUCCESS, + GetAndValNullParam(testParams, 1, PARAM_TYPE_APPID, reinterpret_cast(&result), nullptr)); +} + +HWTEST_F(IpcAdaptParamTest, GetAndValNullParam_InvalidStringNoNullTerminator, TestSize.Level0) +{ + char testString[] = {'t', 'e', 's', 't'}; // 没有null终止符 + + IpcDataInfo testParams[1]; + testParams[0].type = PARAM_TYPE_APPID; + testParams[0].val = reinterpret_cast(testString); + testParams[0].valSz = sizeof(testString); + testParams[0].idx = 0; + + char *result; + EXPECT_EQ(HC_ERR_IPC_BAD_PARAM, + GetAndValNullParam(testParams, 1, PARAM_TYPE_APPID, reinterpret_cast(&result), nullptr)); +} + +HWTEST_F(IpcAdaptParamTest, GetAndValNullParam_NotFound, TestSize.Level0) +{ + char testString[] = "test_string"; + + IpcDataInfo testParams[1]; + testParams[0].type = PARAM_TYPE_APPID; + testParams[0].val = reinterpret_cast(testString); + testParams[0].valSz = static_cast(strlen(testString)) + 1; + testParams[0].idx = 0; + + char *result; + EXPECT_EQ(HC_ERR_IPC_BAD_PARAM, + GetAndValNullParam(testParams, 1, PARAM_TYPE_OPCODE, reinterpret_cast(&result), nullptr)); +} + +HWTEST_F(IpcAdaptParamTest, GetAndValNullParam_ZeroSize, TestSize.Level0) +{ + char testString[] = "test"; + + IpcDataInfo testParams[1]; + testParams[0].type = PARAM_TYPE_APPID; + testParams[0].val = reinterpret_cast(testString); + testParams[0].valSz = 0; + testParams[0].idx = 0; + + char *result; + EXPECT_EQ(HC_ERR_IPC_BAD_PARAM, + GetAndValNullParam(testParams, 1, PARAM_TYPE_APPID, reinterpret_cast(&result), nullptr)); +} + +class IpcDevAuthCredListenerTest : public testing::Test { +public: + IpcDevAuthCredListenerTest() = default; // 显式声明默认构造函数 + ~IpcDevAuthCredListenerTest() = default; // 显式声明默认析构函数 + void SetUp(); + void TearDown(); +}; + +void IpcDevAuthCredListenerTest::SetUp() +{ + // 初始化回调列表 + ASSERT_EQ(HC_SUCCESS, InitIpcCallBackList()); +} + +void IpcDevAuthCredListenerTest::TearDown() +{ + // 清理回调列表 + DeInitIpcCallBackList(); +} + +// 添加凭据监听器回调 +static void AddCredListenerCallback() +{ + CredChangeListener credListener = { + .onCredAdd = nullptr, + .onCredDelete = nullptr, + .onCredUpdate = nullptr + }; + + IpcDataInfo testParams[1]; + testParams[0].type = CB_TYPE_CRED_LISTENER; + testParams[0].val = reinterpret_cast(&credListener); + testParams[0].valSz = sizeof(credListener); + testParams[0].idx = 0; + + // 添加凭据监听器 + ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", reinterpret_cast(&credListener), + sizeof(credListener), CB_TYPE_CRED_LISTENER)); +} + +// 测试 InitDevAuthCredListenerCbCtx 函数 +HWTEST_F(IpcDevAuthCredListenerTest, InitDevAuthCredListenerCbCtx_Valid, TestSize.Level0) +{ + CredChangeListener credListener; + + // 初始化凭据监听器回调上下文 + InitDevAuthCredListenerCbCtx(nullptr); + InitDevAuthCredListenerCbCtx(&credListener); + + // 验证所有回调函数都已正确设置 + EXPECT_NE(credListener.onCredAdd, nullptr); + EXPECT_NE(credListener.onCredDelete, nullptr); + EXPECT_NE(credListener.onCredUpdate, nullptr); +} + + +// 测试通过 credListener 调用 IpcOnCredAdd +HWTEST_F(IpcDevAuthCredListenerTest, CredListenerOnCredAdd_Valid, TestSize.Level0) +{ + // 添加凭据监听器回调 + AddCredListenerCallback(); + + // 设置回调函数 + CredChangeListener credListener; + InitDevAuthCredListenerCbCtx(&credListener); + + // 更新回调 + ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", reinterpret_cast(&credListener), + sizeof(credListener), CB_TYPE_CRED_LISTENER)); + + // 添加回调对象 + AddIpcCbObjByAppId("test.app.id", 0, CB_TYPE_CRED_LISTENER); + + // 通过 credListener 调用 onCredAdd + char credId[] = "test_cred_id"; + char credInfo[] = "test_cred_info"; + if (credListener.onCredAdd != nullptr) { + credListener.onCredAdd(credId, credInfo); + } +} + +HWTEST_F(IpcDevAuthCredListenerTest, CredListenerOnCredAdd_NullCredId, TestSize.Level0) +{ + // 添加凭据监听器回调 + AddCredListenerCallback(); + + // 设置回调函数 + CredChangeListener credListener; + InitDevAuthCredListenerCbCtx(&credListener); + + // 更新回调 + ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", reinterpret_cast(&credListener), + sizeof(credListener), CB_TYPE_CRED_LISTENER)); + + // 添加回调对象 + AddIpcCbObjByAppId("test.app.id", 0, CB_TYPE_CRED_LISTENER); + + // 通过 credListener 调用 onCredAdd,使用空 credId + if (credListener.onCredAdd != nullptr) { + credListener.onCredAdd(nullptr, "test_cred_info"); + } +} + +// 测试通过 credListener 调用 IpcOnCredDelete +HWTEST_F(IpcDevAuthCredListenerTest, CredListenerOnCredDelete_Valid, TestSize.Level0) +{ + // 添加凭据监听器回调 + AddCredListenerCallback(); + + // 设置回调函数 + CredChangeListener credListener; + InitDevAuthCredListenerCbCtx(&credListener); + + // 更新回调 + ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", reinterpret_cast(&credListener), + sizeof(credListener), CB_TYPE_CRED_LISTENER)); + + // 添加回调对象 + AddIpcCbObjByAppId("test.app.id", 0, CB_TYPE_CRED_LISTENER); + + // 通过 credListener 调用 onCredDelete + char credId[] = "test_cred_id"; + char credInfo[] = "test_cred_info"; + if (credListener.onCredDelete != nullptr) { + credListener.onCredDelete(credId, credInfo); + } +} + +HWTEST_F(IpcDevAuthCredListenerTest, CredListenerOnCredDelete_NullCredId, TestSize.Level0) +{ + // 添加凭据监听器回调 + AddCredListenerCallback(); + + // 设置回调函数 + CredChangeListener credListener; + InitDevAuthCredListenerCbCtx(&credListener); + + // 更新回调 + ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", reinterpret_cast(&credListener), + sizeof(credListener), CB_TYPE_CRED_LISTENER)); + + // 添加回调对象 + AddIpcCbObjByAppId("test.app.id", 0, CB_TYPE_CRED_LISTENER); + + // 通过 credListener 调用 onCredDelete,使用空 credId + if (credListener.onCredDelete != nullptr) { + credListener.onCredDelete(nullptr, "test_cred_info"); + } +} + +// 测试通过 credListener 调用 IpcOnCredUpdate +HWTEST_F(IpcDevAuthCredListenerTest, CredListenerOnCredUpdate_Valid, TestSize.Level0) +{ + // 添加凭据监听器回调 + AddCredListenerCallback(); + + // 设置回调函数 + CredChangeListener credListener; + InitDevAuthCredListenerCbCtx(&credListener); + + // 更新回调 + ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", reinterpret_cast(&credListener), + sizeof(credListener), CB_TYPE_CRED_LISTENER)); + + // 添加回调对象 + AddIpcCbObjByAppId("test.app.id", 0, CB_TYPE_CRED_LISTENER); + + // 通过 credListener 调用 onCredUpdate + char credId[] = "test_cred_id"; + char credInfo[] = "test_cred_info"; + if (credListener.onCredUpdate != nullptr) { + credListener.onCredUpdate(credId, credInfo); + } +} + +HWTEST_F(IpcDevAuthCredListenerTest, CredListenerOnCredUpdate_NullCredId, TestSize.Level0) +{ + // 添加凭据监听器回调 + AddCredListenerCallback(); + + // 设置回调函数 + CredChangeListener credListener; + InitDevAuthCredListenerCbCtx(&credListener); + + // 更新回调 + ASSERT_EQ(HC_SUCCESS, AddIpcCallBackByAppId("test.app.id", reinterpret_cast(&credListener), + sizeof(credListener), CB_TYPE_CRED_LISTENER)); + + // 添加回调对象 + AddIpcCbObjByAppId("test.app.id", 0, CB_TYPE_CRED_LISTENER); + + // 通过 credListener 调用 onCredUpdate,使用空 credId + if (credListener.onCredUpdate != nullptr) { + credListener.onCredUpdate(nullptr, "test_cred_info"); + } +} +} \ No newline at end of file