From d7cefa63b65e45d6bf288a381b7aa4fdcc271ac8 Mon Sep 17 00:00:00 2001 From: cuiruibin Date: Sat, 9 Aug 2025 16:12:25 +0800 Subject: [PATCH] =?UTF-8?q?DFS.AI=E5=91=8A=E8=AD=A6=E5=A4=84=E7=90=86=20Si?= =?UTF-8?q?gned-off-by:=20cuiruibin=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/copy/trans_listener.cpp | 7 ++- .../src/distributed_file_daemon_proxy.cpp | 21 ++++++-- .../distributedfiledaemon/src/ipc/daemon.cpp | 7 +-- .../src/ipc/daemon_stub.cpp | 5 +- .../src/network/kernel_talker.cpp | 6 +-- .../test/unittest/ipc/daemon/daemon_test.cpp | 4 +- .../daemon_stub_sup_test.cpp | 23 ++++++++ .../copy/trans_listener_test.cpp | 7 +++ .../distributed_file_daemon_proxy_test.cpp | 53 +++++++++++++++++-- 9 files changed, 118 insertions(+), 15 deletions(-) diff --git a/frameworks/native/distributed_file_inner/src/copy/trans_listener.cpp b/frameworks/native/distributed_file_inner/src/copy/trans_listener.cpp index 6305ef507..72808cb13 100644 --- a/frameworks/native/distributed_file_inner/src/copy/trans_listener.cpp +++ b/frameworks/native/distributed_file_inner/src/copy/trans_listener.cpp @@ -171,7 +171,12 @@ std::string TransListener::GetFileName(const std::string &path) std::string TransListener::GetNetworkIdFromUri(const std::string &uri) { - return uri.substr(uri.find(TRANS_NETWORK_PARA) + TRANS_NETWORK_PARA.size(), uri.size()); + size_t pos = uri.find(TRANS_NETWORK_PARA); + if (pos != std::string::npos) { + return uri.substr(pos + TRANS_NETWORK_PARA.size(), uri.size()); + } + LOGE("netWorkId is null"); + return ""; } int32_t TransListener::Cancel(const std::string &srcUri, const std::string &destUri) diff --git a/frameworks/native/distributed_file_inner/src/distributed_file_daemon_proxy.cpp b/frameworks/native/distributed_file_inner/src/distributed_file_daemon_proxy.cpp index c8be94148..b01aead1e 100644 --- a/frameworks/native/distributed_file_inner/src/distributed_file_daemon_proxy.cpp +++ b/frameworks/native/distributed_file_inner/src/distributed_file_daemon_proxy.cpp @@ -530,7 +530,12 @@ int32_t DistributedFileDaemonProxy::PushAsset(int32_t userId, LOGE("UnRegisterAssetCallback failed, ret = %{public}d", ret); return OHOS::FileManagement::E_BROKEN_IPC; } - return reply.ReadInt32(); + int32_t result = -1; + if (!reply.ReadInt32(result)) { + LOGE("Failed to read result"); + return OHOS::FileManagement::E_INVAL_ARG; + } + return result; } int32_t DistributedFileDaemonProxy::RegisterAssetCallback(const sptr &recvCallback) @@ -562,7 +567,12 @@ int32_t DistributedFileDaemonProxy::RegisterAssetCallback(const sptr &recvCallback) @@ -594,7 +604,12 @@ int32_t DistributedFileDaemonProxy::UnRegisterAssetCallback(const sptr &uriList, diff --git a/services/distributedfiledaemon/src/ipc/daemon.cpp b/services/distributedfiledaemon/src/ipc/daemon.cpp index 333ee17fc..fd5f6880a 100644 --- a/services/distributedfiledaemon/src/ipc/daemon.cpp +++ b/services/distributedfiledaemon/src/ipc/daemon.cpp @@ -157,9 +157,6 @@ void Daemon::OnStop() if (!subRet) { LOGE("UnSubscribe common event failed"); } - subScriber_ = nullptr; - daemonExecute_ = nullptr; - eventHandler_ = nullptr; SoftBusHandlerAsset::GetInstance().DeleteAssetLocalSessionServer(); AllConnectManager::GetInstance().UnInitAllConnectManager(); LOGI("Stop finished successfully"); @@ -467,6 +464,10 @@ int32_t Daemon::PrepareSession(const std::string &srcUri, const sptr &listener, HmdfsInfo &info) { + if (srcDeviceId.empty()) { + LOGE("srcDeviceId is nullptr"); + return EINVAL; + } auto listenerCallback = iface_cast(listener); if (listenerCallback == nullptr) { LOGE("ListenerCallback is nullptr"); diff --git a/services/distributedfiledaemon/src/ipc/daemon_stub.cpp b/services/distributedfiledaemon/src/ipc/daemon_stub.cpp index acf73d0a5..3860bd2a6 100644 --- a/services/distributedfiledaemon/src/ipc/daemon_stub.cpp +++ b/services/distributedfiledaemon/src/ipc/daemon_stub.cpp @@ -271,7 +271,10 @@ int32_t DaemonStub::HandleRequestSendFile(MessageParcel &data, MessageParcel &re return E_IPC_READ_FAILED; } auto res = RequestSendFile(srcUri, dstPath, dstDeviceId, sessionName); - reply.WriteInt32(res); + if (!reply.WriteInt32(res)) { + LOGE("WriteInt32 failed"); + return E_IPC_WRITE_FAILED; + } LOGD("End RequestSendFile, ret = %{public}d.", res); return res; } diff --git a/services/distributedfiledaemon/src/network/kernel_talker.cpp b/services/distributedfiledaemon/src/network/kernel_talker.cpp index 57381becd..0566aeae4 100644 --- a/services/distributedfiledaemon/src/network/kernel_talker.cpp +++ b/services/distributedfiledaemon/src/network/kernel_talker.cpp @@ -90,7 +90,7 @@ void KernelTalker::SinkSessionTokernel(shared_ptr session, const st .devsl = 0, .status = status, }; - if (memcpy_s(cmd.masterKey, KEY_MAX_LEN, masterkey.data(), KEY_MAX_LEN) != EOK) { + if (memcpy_s(cmd.masterKey, KEY_MAX_LEN, masterkey.data(), masterkey.size()) != EOK) { return; } @@ -110,7 +110,7 @@ void KernelTalker::SinkDevslTokernel(const std::string &cid, uint32_t devsl) .devsl = devsl, }; - if (memcpy_s(cmd.cid, CID_MAX_LEN, cid.c_str(), CID_MAX_LEN)) { + if (memcpy_s(cmd.cid, CID_MAX_LEN, cid.c_str(), cid.length())) { return; } SetCmd(cmd); @@ -127,7 +127,7 @@ void KernelTalker::SinkOfflineCmdToKernel(string cid) return; } - if (memcpy_s(cmd.remoteCid, CID_MAX_LEN, cid.c_str(), CID_MAX_LEN) != EOK) { + if (memcpy_s(cmd.remoteCid, CID_MAX_LEN, cid.c_str(), cid.length()) != EOK) { return; } SetCmd(cmd); diff --git a/services/distributedfiledaemon/test/unittest/ipc/daemon/daemon_test.cpp b/services/distributedfiledaemon/test/unittest/ipc/daemon/daemon_test.cpp index 85fd35d67..8f1ed8253 100644 --- a/services/distributedfiledaemon/test/unittest/ipc/daemon/daemon_test.cpp +++ b/services/distributedfiledaemon/test/unittest/ipc/daemon/daemon_test.cpp @@ -790,7 +790,7 @@ HWTEST_F(DaemonTest, DaemonTest_PrepareSession_001, TestSize.Level1) ASSERT_TRUE(listener != nullptr) << "监听器创建失败"; // 测试用例 1: 空监听器 - EXPECT_EQ(daemon_->PrepareSession("", "", "", nullptr, hmdfsInfo), E_NULLPTR); + EXPECT_EQ(daemon_->PrepareSession("", "", NETWORKID_ONE, nullptr, hmdfsInfo), E_NULLPTR); // 测试用例 2: 有效 URI,物理路径无效 g_getPhysicalPath = ERR_BAD_VALUE; @@ -821,6 +821,8 @@ HWTEST_F(DaemonTest, DaemonTest_PrepareSession_001, TestSize.Level1) // 测试用例 6: DFS 有效 URI,物理路径有效,stat 成功,DFS 版本获取失败,文件大小 < 1GB, CopyBaseOnRPC EXPECT_EQ(daemon_->PrepareSession(srcUri, dstUri, "invalidDevice", listener, hmdfsInfo), E_SA_LOAD_FAILED); + // 测试用例 7: DFS 有效 URI,物理路径有效,stat 成功,srcDeviceId 为空 + EXPECT_EQ(daemon_->PrepareSession(srcUri, dstUri, "", listener, hmdfsInfo), EINVAL); // 清理 if (std::filesystem::exists(g_physicalPath)) { std::filesystem::remove(g_physicalPath); diff --git a/test/unittests/distributed_file_daemon/daemon_stub_sup_test.cpp b/test/unittests/distributed_file_daemon/daemon_stub_sup_test.cpp index bc11759f1..813a14028 100644 --- a/test/unittests/distributed_file_daemon/daemon_stub_sup_test.cpp +++ b/test/unittests/distributed_file_daemon/daemon_stub_sup_test.cpp @@ -413,6 +413,29 @@ HWTEST_F(DaemonStubSupPTest, DaemonStubSupHandleRequestSendFileTest001, TestSize GTEST_LOG_(INFO) << "DaemonStubSupHandleRequestSendFileTest001 End"; } +/** + * @tc.name: DaemonStubSupHandleRequestSendFileTest002 + * @tc.desc: Verify the HandleRequestSendFile function + * @tc.type: FUNC + * @tc.require: I7M6L1 + */ +HWTEST_F(DaemonStubSupPTest, DaemonStubSupHandleRequestSendFileTest002, TestSize.Level0) +{ + GTEST_LOG_(INFO) << "DaemonStubSupHandleRequestSendFileTest002 Start"; + UID = DAEMON_UID; + MessageParcel data; + MessageParcel reply; + + g_getCallingUidTrue = true; + EXPECT_CALL(*messageParcelMock_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(true)).WillOnce(Return(true)); + EXPECT_CALL(*daemonStub_, RequestSendFile(_, _, _, _)).WillOnce(Return(E_INVAL_ARG)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)); + auto ret = daemonStub_->HandleRequestSendFile(data, reply); + EXPECT_EQ(ret, E_INVAL_ARG); + GTEST_LOG_(INFO) << "DaemonStubSupHandleRequestSendFileTest002 End"; +} + /** * @tc.name: DaemonStubSupHandleGetRemoteCopyInfoTest001 * @tc.desc: Verify the HandleGetRemoteCopyInfo function diff --git a/test/unittests/distributed_file_inner/copy/trans_listener_test.cpp b/test/unittests/distributed_file_inner/copy/trans_listener_test.cpp index f4c8f83a8..79f54d513 100644 --- a/test/unittests/distributed_file_inner/copy/trans_listener_test.cpp +++ b/test/unittests/distributed_file_inner/copy/trans_listener_test.cpp @@ -546,6 +546,13 @@ HWTEST_F(TransListenerTest, TransListener_0013, TestSize.Level0) string networkId = ptr->GetNetworkIdFromUri(desturi); EXPECT_EQ(networkId, "12345"); // Expect correct network ID extraction + // Set up URI with network ID is null + desturi = "file://docs/storage/media/100/local/files/Docs/aa1/"; + ptr = std::make_shared(desturi, listener); + + // Test network ID extraction + networkId = ptr->GetNetworkIdFromUri(desturi); + EXPECT_EQ(networkId, ""); // Expect correct network ID extraction GTEST_LOG_(INFO) << "TransListener_0013 End"; } diff --git a/test/unittests/distributed_file_inner/distributed_file_daemon_proxy_test.cpp b/test/unittests/distributed_file_inner/distributed_file_daemon_proxy_test.cpp index ea9b1eb68..f424cbc76 100644 --- a/test/unittests/distributed_file_inner/distributed_file_daemon_proxy_test.cpp +++ b/test/unittests/distributed_file_inner/distributed_file_daemon_proxy_test.cpp @@ -29,6 +29,7 @@ namespace { bool g_writeBatchUrisTrue = true; int32_t g_readBatchUris = OHOS::FileManagement::E_OK; std::string g_context = "1"; + constexpr int32_t E_DEFAULT_FAIL = -1; } namespace OHOS::Storage::DistributedFile { bool IpcWrapper::WriteUriByRawData(MessageParcel &data, const std::vector &uriVec) @@ -720,8 +721,9 @@ HWTEST_F(DistributedFileDaemonProxyTest, DistributedFileDaemon_PushAsset_0200, T .WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(E_OK)); EXPECT_CALL(*messageParcelMock_, ReadInt32()).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(true)); auto ret = proxy_->PushAsset(100, assetObj, callbackmock); - EXPECT_EQ(ret, E_OK); + EXPECT_EQ(ret, E_DEFAULT_FAIL); GTEST_LOG_(INFO) << "DistributedFileDaemon_PushAsset_0200 End"; } @@ -748,6 +750,31 @@ HWTEST_F(DistributedFileDaemonProxyTest, DistributedFileDaemon_PushAsset_0300, T GTEST_LOG_(INFO) << "DistributedFileDaemon_PushAsset_0300 End"; } +/** + * @tc.name: DistributedFileDaemon_PushAsset_0400 + * @tc.desc: verify PushAsset. + * @tc.type: FUNC + * @tc.require: I7TDJK + */ +HWTEST_F(DistributedFileDaemonProxyTest, DistributedFileDaemon_PushAsset_0400, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "DistributedFileDaemon_PushAsset_0400 Start"; + auto assetObj (new (std::nothrow) AssetObj()); + auto callbackmock = sptr(new IAssetSendCallbackMock()); + + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteInt32(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteParcelable(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteRemoteObject(An&>())) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, ReadInt32()).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(false)); + auto ret = proxy_->PushAsset(100, assetObj, callbackmock); + EXPECT_EQ(ret, E_INVAL_ARG); + GTEST_LOG_(INFO) << "DistributedFileDaemon_PushAsset_0400 End"; +} + /** * @tc.name: DistributedFileDaemon_RegisterAssetCallback_0100 * @tc.desc: verify RegisterAssetCallback. @@ -785,8 +812,18 @@ HWTEST_F(DistributedFileDaemonProxyTest, DistributedFileDaemon_RegisterAssetCall .WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(E_OK)); EXPECT_CALL(*messageParcelMock_, ReadInt32()).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(true)); ret = proxy_->RegisterAssetCallback(recvCallback); - EXPECT_EQ(ret, E_OK); + EXPECT_EQ(ret, E_DEFAULT_FAIL); + + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteRemoteObject(An&>())) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, ReadInt32()).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(false)); + ret = proxy_->RegisterAssetCallback(recvCallback); + EXPECT_EQ(ret, E_INVAL_ARG); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteRemoteObject(An&>())) @@ -835,8 +872,18 @@ HWTEST_F(DistributedFileDaemonProxyTest, DistributedFileDaemon_UnRegisterAssetCa .WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(E_OK)); EXPECT_CALL(*messageParcelMock_, ReadInt32()).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(true)); ret = proxy_->UnRegisterAssetCallback(recvCallback); - EXPECT_EQ(ret, E_OK); + EXPECT_EQ(ret, E_DEFAULT_FAIL); + + EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock_, WriteRemoteObject(An&>())) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, ReadInt32()).WillOnce(Return(E_OK)); + EXPECT_CALL(*messageParcelMock_, ReadInt32(_)).WillOnce(Return(false)); + ret = proxy_->UnRegisterAssetCallback(recvCallback); + EXPECT_EQ(ret, E_INVAL_ARG); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteRemoteObject(An&>())) -- Gitee