/*
 * 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 "UTTest_dm_device_state_manager_two.h"

#include <iostream>

#include "device_manager_service_listener.h"
#include "dm_constants.h"
#include "dm_device_state_manager.h"
#include "dm_log.h"
#include "hichain_connector.h"
#include "ipc_notify_auth_result_req.h"
#include "ipc_notify_device_found_req.h"
#include "ipc_notify_device_state_req.h"
#include "ipc_notify_discover_result_req.h"

using namespace testing;
using namespace testing::ext;
namespace OHOS {
namespace DistributedHardware {
const uint32_t AUTH_ONCE_STATE_TIMER_MAX = 510;
constexpr const char* FILED_AUTHORIZED_APP_LIST = "authorizedAppList";
void DmDeviceStateManagerTestTwo::SetUp()
{
}

void DmDeviceStateManagerTestTwo::TearDown()
{
    Mock::VerifyAndClearExpectations(softbusConnectorMock_.get());
    Mock::VerifyAndClearExpectations(cryptoMock_.get());
    Mock::VerifyAndClearExpectations(hiChainConnectorMock_.get());
    Mock::VerifyAndClearExpectations(deviceProfileConnectorMock_.get());
    Mock::VerifyAndClearExpectations(multipleUserConnectorMock_.get());
    Mock::VerifyAndClearExpectations(hiChainAuthConnectorMock_.get());
}

void DmDeviceStateManagerTestTwo::SetUpTestCase()
{
    DmSoftbusConnector::dmSoftbusConnector = softbusConnectorMock_;
    DmCrypto::dmCrypto = cryptoMock_;
    DmHiChainConnector::dmHiChainConnector = hiChainConnectorMock_;
    DmDeviceProfileConnector::dmDeviceProfileConnector = deviceProfileConnectorMock_;
    DmMultipleUserConnector::dmMultipleUserConnector = multipleUserConnectorMock_;
    DmHiChainAuthConnector::dmHiChainAuthConnector = hiChainAuthConnectorMock_;
}

void DmDeviceStateManagerTestTwo::TearDownTestCase()
{
    DmSoftbusConnector::dmSoftbusConnector = nullptr;
    DmCrypto::dmCrypto = nullptr;
    DmHiChainConnector::dmHiChainConnector = nullptr;
    DmDeviceProfileConnector::dmDeviceProfileConnector = nullptr;
    DmMultipleUserConnector::dmMultipleUserConnector = nullptr;
    DmHiChainAuthConnector::dmHiChainAuthConnector = nullptr;
}
namespace {
std::shared_ptr<HiChainConnector> hiChainConnector_ = std::make_shared<HiChainConnector>();
std::shared_ptr<SoftbusConnector> softbusConnector = std::make_shared<SoftbusConnector>();
std::shared_ptr<DeviceManagerServiceListener> listener_ = std::make_shared<DeviceManagerServiceListener>();
std::shared_ptr<HiChainAuthConnector> hiChainAuthConnector = std::make_shared<HiChainAuthConnector>();
std::shared_ptr<DmDeviceStateManager> dmDeviceStateManager =
    std::make_shared<DmDeviceStateManager>(softbusConnector, listener_, hiChainConnector_, hiChainAuthConnector);

HWTEST_F(DmDeviceStateManagerTestTwo, HandleDeviceStatusChange_001, testing::ext::TestSize.Level0)
{
    DmDeviceInfo info = {
        .deviceId = "123",
        .deviceName = "asda",
        .deviceTypeId = 1,
    };
    std::vector<ProcessInfo> processInfoVec;
    auto softbusConnector = dmDeviceStateManager->softbusConnector_;
    dmDeviceStateManager->softbusConnector_ = nullptr;
    dmDeviceStateManager->HandleDeviceStatusChange(DmDeviceState::DEVICE_STATE_OFFLINE, info, processInfoVec,
        "123", true);
    dmDeviceStateManager->softbusConnector_ = softbusConnector;
    EXPECT_CALL(*softbusConnectorMock_, GetUdidByNetworkId(_, _)).WillOnce(Return(ERR_DM_FAILED));
    dmDeviceStateManager->HandleDeviceStatusChange(DmDeviceState::DEVICE_STATE_OFFLINE, info, processInfoVec,
        "123", true);
    EXPECT_NE(dmDeviceStateManager->softbusConnector_, nullptr);
}

HWTEST_F(DmDeviceStateManagerTestTwo, ProcessDeviceStateChange_001, testing::ext::TestSize.Level0)
{
    ProcessInfo info;
    DmDeviceInfo devInfo;
    std::vector<ProcessInfo> processInfoVec;
    processInfoVec.push_back(info);
    dmDeviceStateManager->ProcessDeviceStateChange(DmDeviceState::DEVICE_STATE_OFFLINE, devInfo, processInfoVec, true);
    EXPECT_NE(dmDeviceStateManager->softbusConnector_, nullptr);
}

HWTEST_F(DmDeviceStateManagerTestTwo, OnDeviceOnline_001, testing::ext::TestSize.Level0)
{
    DmDeviceInfo info = {
        .deviceId = "123",
        .deviceName = "asda",
        .deviceTypeId = 1,
    };
    std::vector<ProcessInfo> processInfoVec;
    EXPECT_CALL(*softbusConnectorMock_, GetDeviceInfoByDeviceId("123", _)).WillOnce(Return(info));
    EXPECT_CALL(*softbusConnectorMock_, GetProcessInfo()).WillOnce(Return(processInfoVec));
    dmDeviceStateManager->OnDeviceOnline("123", 0);
    EXPECT_CALL(*softbusConnectorMock_, GetDeviceInfoByDeviceId("123", _)).WillOnce(Return(info));
    EXPECT_CALL(*softbusConnectorMock_, GetProcessInfo()).WillOnce(Return(processInfoVec));
    dmDeviceStateManager->stateDeviceInfos_["123"] = info;
    dmDeviceStateManager->OnDeviceOnline("123", 0);
    EXPECT_NE(dmDeviceStateManager->softbusConnector_, nullptr);
    dmDeviceStateManager->stateDeviceInfos_.clear();
}

HWTEST_F(DmDeviceStateManagerTestTwo, RegisterOffLineTimer_002, testing::ext::TestSize.Level0)
{
    DmDeviceInfo info = {
        .deviceId = "123",
        .deviceName = "asda",
        .deviceTypeId = 1,
    };
    std::string peerUdid = "peerUdid";
    EXPECT_CALL(*softbusConnectorMock_, GetUdidByNetworkId(_, _))
        .WillOnce(DoAll(SetArgReferee<1>(peerUdid), Return(DM_OK)));
    int32_t localUserId = 100;
    int32_t peerUserId = 100;
    EXPECT_CALL(*multipleUserConnectorMock_, GetCurrentAccountUserID()).WillOnce(Return(localUserId));
    std::unordered_set<int32_t> peerUserIds;
    EXPECT_CALL(*deviceProfileConnectorMock_, GetActiveAuthOncePeerUserId(_, _)).WillOnce(Return(peerUserIds));
    dmDeviceStateManager->stateTimerInfoMap_.clear();
    dmDeviceStateManager->RegisterOffLineTimer(info);
    std::string key = peerUdid + "_" + std::to_string(peerUserId) + "_" + std::to_string(localUserId);
    EXPECT_EQ(dmDeviceStateManager->stateTimerInfoMap_.count(key), 0);
    dmDeviceStateManager->stateTimerInfoMap_.clear();
}

HWTEST_F(DmDeviceStateManagerTestTwo, RegisterOffLineTimer_003, testing::ext::TestSize.Level0)
{
    DmDeviceInfo info = {
        .deviceId = "123",
        .deviceName = "asda",
        .deviceTypeId = 1,
    };
    std::string peerUdid = "peerUdid";
    EXPECT_CALL(*softbusConnectorMock_, GetUdidByNetworkId(_, _))
        .WillOnce(DoAll(SetArgReferee<1>(peerUdid), Return(DM_OK)));
    int32_t localUserId = 100;
    int32_t peerUserId = 100;
    EXPECT_CALL(*multipleUserConnectorMock_, GetCurrentAccountUserID()).WillOnce(Return(localUserId));
    std::unordered_set<int32_t> peerUserIds {peerUserId};
    EXPECT_CALL(*deviceProfileConnectorMock_, GetActiveAuthOncePeerUserId(_, _)).WillOnce(Return(peerUserIds));
    dmDeviceStateManager->stateTimerInfoMap_.clear();
    auto timer = dmDeviceStateManager->timer_;
    dmDeviceStateManager->timer_ = nullptr;
    for (uint32_t i = 0; i < AUTH_ONCE_STATE_TIMER_MAX; i++) {
        StateTimerInfo stateTimerInfo;
        dmDeviceStateManager->stateTimerInfoMap_[std::to_string(i)] = stateTimerInfo;
    }
    dmDeviceStateManager->RegisterOffLineTimer(info);
    std::string key = peerUdid + "_" + std::to_string(peerUserId) + "_" + std::to_string(localUserId);
    EXPECT_EQ(dmDeviceStateManager->stateTimerInfoMap_.count(key), 0);
    EXPECT_NE(dmDeviceStateManager->timer_, nullptr);
    dmDeviceStateManager->timer_->DeleteAll();
    dmDeviceStateManager->timer_ = timer;
    dmDeviceStateManager->stateTimerInfoMap_.clear();
}

HWTEST_F(DmDeviceStateManagerTestTwo, RegisterOffLineTimer_004, testing::ext::TestSize.Level0)
{
    DmDeviceInfo info = {
        .deviceId = "123",
        .deviceName = "asda",
        .deviceTypeId = 1,
    };
    std::string peerUdid = "peerUdid";
    EXPECT_CALL(*softbusConnectorMock_, GetUdidByNetworkId(_, _))
        .WillOnce(DoAll(SetArgReferee<1>(peerUdid), Return(DM_OK)));
    int32_t localUserId = 100;
    int32_t peerUserId = 100;
    EXPECT_CALL(*multipleUserConnectorMock_, GetCurrentAccountUserID()).WillOnce(Return(localUserId));
    std::unordered_set<int32_t> peerUserIds {peerUserId};
    EXPECT_CALL(*deviceProfileConnectorMock_, GetActiveAuthOncePeerUserId(_, _)).WillOnce(Return(peerUserIds));
    dmDeviceStateManager->stateTimerInfoMap_.clear();
    auto timer = dmDeviceStateManager->timer_;
    dmDeviceStateManager->timer_ = nullptr;
    StateTimerInfo stateTimerInfo = {.isStart = true};
    std::string key = peerUdid + "_" + std::to_string(peerUserId) + "_" + std::to_string(localUserId);
    dmDeviceStateManager->stateTimerInfoMap_[key] = stateTimerInfo;
    dmDeviceStateManager->RegisterOffLineTimer(info);
    EXPECT_FALSE(dmDeviceStateManager->stateTimerInfoMap_[key].isStart);
    EXPECT_NE(dmDeviceStateManager->timer_, nullptr);
    dmDeviceStateManager->timer_->DeleteAll();
    dmDeviceStateManager->timer_ = timer;
    dmDeviceStateManager->stateTimerInfoMap_.clear();
}

HWTEST_F(DmDeviceStateManagerTestTwo, StartOffLineTimer_001, testing::ext::TestSize.Level0)
{
    std::string peerUdid = "";
    std::unordered_set<AuthOnceAclInfo, AuthOnceAclInfoHash> authOnceAclInfos;
    EXPECT_CALL(*deviceProfileConnectorMock_, GetAuthOnceAclInfos(_)).WillOnce(Return(authOnceAclInfos));
    dmDeviceStateManager->StartOffLineTimer(peerUdid);
}

HWTEST_F(DmDeviceStateManagerTestTwo, StartOffLineTimer_002, testing::ext::TestSize.Level0)
{
    std::string peerUdid = "peerUdid";
    AuthOnceAclInfo aclInfo1 = { .peerUdid = peerUdid, .peerUserId = 100, .localUserId = 100, };
    AuthOnceAclInfo aclInfo2 = { .peerUdid = peerUdid, .peerUserId = 100, .localUserId = 101, };
    AuthOnceAclInfo aclInfo3 = { .peerUdid = peerUdid, .peerUserId = 101, .localUserId = 100, };
    std::unordered_set<AuthOnceAclInfo, AuthOnceAclInfoHash> authOnceAclInfos {aclInfo1, aclInfo2, aclInfo3};
    EXPECT_CALL(*deviceProfileConnectorMock_, GetAuthOnceAclInfos(_)).WillOnce(Return(authOnceAclInfos));
    auto timer = dmDeviceStateManager->timer_;
    dmDeviceStateManager->timer_ = nullptr;
    dmDeviceStateManager->stateTimerInfoMap_.clear();
    StateTimerInfo stateTimerInfo1 = {
        .timerName = "timerName",
        .peerUdid = peerUdid,
        .peerUserId = 100,
        .localUserId = 100,
        .isStart = false,
    };
    auto key = stateTimerInfo1.peerUdid + "_" + std::to_string(stateTimerInfo1.peerUserId) + "_" +
        std::to_string(stateTimerInfo1.localUserId);
    dmDeviceStateManager->stateTimerInfoMap_[key] = stateTimerInfo1;
    StateTimerInfo stateTimerInfo2 = {
        .timerName = "timerName",
        .peerUdid = peerUdid,
        .peerUserId = 100,
        .localUserId = 101,
        .isStart = true,
    };
    key = stateTimerInfo2.peerUdid + "_" + std::to_string(stateTimerInfo2.peerUserId) + "_" +
        std::to_string(stateTimerInfo2.localUserId);
    dmDeviceStateManager->stateTimerInfoMap_[key] = stateTimerInfo2;
    dmDeviceStateManager->StartOffLineTimer(peerUdid);
    key = stateTimerInfo1.peerUdid + "_" + std::to_string(stateTimerInfo1.peerUserId) + "_" +
        std::to_string(stateTimerInfo1.localUserId);
    EXPECT_TRUE(dmDeviceStateManager->stateTimerInfoMap_[key].isStart);
    EXPECT_NE(dmDeviceStateManager->timer_, nullptr);
    dmDeviceStateManager->timer_->DeleteAll();
    dmDeviceStateManager->timer_ = timer;
    dmDeviceStateManager->stateTimerInfoMap_.clear();
}

HWTEST_F(DmDeviceStateManagerTestTwo, DeleteOffLineTimer_001, testing::ext::TestSize.Level0)
{
    std::string peerUdid = "peerUdid";
    auto timer = dmDeviceStateManager->timer_;
    dmDeviceStateManager->timer_ = nullptr;
    auto size = dmDeviceStateManager->stateTimerInfoMap_.size();
    dmDeviceStateManager->DeleteOffLineTimer(peerUdid);
    EXPECT_EQ(dmDeviceStateManager->stateTimerInfoMap_.size(), size);
    dmDeviceStateManager->timer_ = timer;
}

HWTEST_F(DmDeviceStateManagerTestTwo, DeleteOffLineTimer_002, testing::ext::TestSize.Level0)
{
    std::string peerUdid;
    if (dmDeviceStateManager->timer_ == nullptr) {
        dmDeviceStateManager->timer_ = std::make_shared<DmTimer>();
    }
    auto size = dmDeviceStateManager->stateTimerInfoMap_.size();
    dmDeviceStateManager->DeleteOffLineTimer(peerUdid);
    EXPECT_EQ(dmDeviceStateManager->stateTimerInfoMap_.size(), size);
}

HWTEST_F(DmDeviceStateManagerTestTwo, DeleteOffLineTimer_003, testing::ext::TestSize.Level0)
{
    std::string peerUdid = "peerUdid";
    if (dmDeviceStateManager->timer_ == nullptr) {
        dmDeviceStateManager->timer_ = std::make_shared<DmTimer>();
    }
    std::unordered_set<int32_t> peerUserIds;
    EXPECT_CALL(*deviceProfileConnectorMock_, GetActiveAuthOncePeerUserId(_, _)).WillOnce(Return(peerUserIds));
    auto size = dmDeviceStateManager->stateTimerInfoMap_.size();
    dmDeviceStateManager->DeleteOffLineTimer(peerUdid);
    EXPECT_EQ(dmDeviceStateManager->stateTimerInfoMap_.size(), size);
}

HWTEST_F(DmDeviceStateManagerTestTwo, DeleteOffLineTimer_004, testing::ext::TestSize.Level0)
{
    std::string peerUdid = "peerUdid";
    if (dmDeviceStateManager->timer_ == nullptr) {
        dmDeviceStateManager->timer_ = std::make_shared<DmTimer>();
    }
    int32_t localUserId = 100;
    EXPECT_CALL(*multipleUserConnectorMock_, GetCurrentAccountUserID()).WillOnce(Return(100));
    std::unordered_set<int32_t> peerUserIds{100};
    EXPECT_CALL(*deviceProfileConnectorMock_, GetActiveAuthOncePeerUserId(_, _)).WillOnce(Return(peerUserIds));
    dmDeviceStateManager->stateTimerInfoMap_.clear();
    StateTimerInfo stateTimerInfo1 = {
        .timerName = "timerName",
        .peerUdid = "peerUdid",
        .peerUserId = 100,
        .localUserId = 100,
        .isStart = true,
    };
    auto key = stateTimerInfo1.peerUdid + "_" + std::to_string(stateTimerInfo1.peerUserId) + "_" +
        std::to_string(stateTimerInfo1.localUserId);
    dmDeviceStateManager->stateTimerInfoMap_[key] = stateTimerInfo1;
    StateTimerInfo stateTimerInfo2 = {
        .timerName = "timerName",
        .peerUdid = "peerUdid",
        .peerUserId = 101,
        .localUserId = 101,
        .isStart = true,
    };
    key = stateTimerInfo2.peerUdid + "_" + std::to_string(stateTimerInfo2.peerUserId) + "_" +
        std::to_string(stateTimerInfo2.localUserId);
    dmDeviceStateManager->stateTimerInfoMap_[key] = stateTimerInfo2;
    dmDeviceStateManager->DeleteOffLineTimer(peerUdid);
    EXPECT_EQ(dmDeviceStateManager->stateTimerInfoMap_.size(), 1);
    dmDeviceStateManager->stateTimerInfoMap_.clear();
}

HWTEST_F(DmDeviceStateManagerTestTwo, RunTask_001, testing::ext::TestSize.Level0)
{
    std::shared_ptr<NotifyEvent> task = std::make_shared<NotifyEvent>(1, "");
    dmDeviceStateManager->RunTask(task);
    EXPECT_NE(dmDeviceStateManager->softbusConnector_, nullptr);
}

HWTEST_F(DmDeviceStateManagerTestTwo, GetAuthForm_001, testing::ext::TestSize.Level0)
{
    EXPECT_CALL(*softbusConnectorMock_, GetUdidByNetworkId(_, _)).WillOnce(Return(DM_OK));
    dmDeviceStateManager->GetAuthForm("task");
    EXPECT_NE(dmDeviceStateManager->softbusConnector_, nullptr);
}

HWTEST_F(DmDeviceStateManagerTestTwo, ChangeDeviceInfo_001, testing::ext::TestSize.Level0)
{
    std::string deviceId = "123";
    DmDeviceInfo info = {
        .deviceId = "123",
        .deviceName = "asda",
        .deviceTypeId = 1,
    };
    dmDeviceStateManager->stateDeviceInfos_.clear();
    dmDeviceStateManager->stateDeviceInfos_["123"] = info;
    dmDeviceStateManager->ChangeDeviceInfo(info);
    strcpy_s(info.deviceId, DM_MAX_DEVICE_ID_LEN, "456");
    dmDeviceStateManager->ChangeDeviceInfo(info);
    EXPECT_NE(dmDeviceStateManager->softbusConnector_, nullptr);
}

HWTEST_F(DmDeviceStateManagerTestTwo, CheckIsOnline_001, testing::ext::TestSize.Level0)
{
    DmDeviceInfo info = {
        .deviceId = "123",
        .deviceName = "asda",
        .deviceTypeId = 1,
    };
    dmDeviceStateManager->stateDeviceInfos_["123"] = info;
    bool ret = dmDeviceStateManager->CheckIsOnline("123");
    EXPECT_EQ(ret, true);
}

HWTEST_F(DmDeviceStateManagerTestTwo, GetUdidByNetWorkId_001, testing::ext::TestSize.Level0)
{
    DmDeviceInfo info = {
        .deviceId = "123",
        .deviceName = "asda",
        .deviceTypeId = 1,
        .networkId = "123"
    };
    dmDeviceStateManager->stateDeviceInfos_["123"] = info;
    std::string ret = dmDeviceStateManager->GetUdidByNetWorkId("123");
    EXPECT_EQ(ret, "123");
    ret = dmDeviceStateManager->GetUdidByNetWorkId("test");
    EXPECT_EQ(ret, "");
}

HWTEST_F(DmDeviceStateManagerTestTwo, StartDelTimerByDP_001, testing::ext::TestSize.Level0)
{
    std::string peerUdid = "peerUdid";
    int32_t peerUserId = 100;
    int32_t localUserId = 100;
    StateTimerInfo stateTimerInfo = {
        .timerName = "timerName",
        .peerUdid = peerUdid,
        .peerUserId = peerUserId,
        .localUserId = localUserId,
        .isStart = true,
    };
    auto key = peerUdid + "_" + std::to_string(peerUserId) + "_" + std::to_string(localUserId);
    dmDeviceStateManager->stateTimerInfoMap_[key] = stateTimerInfo;
    dmDeviceStateManager->StartDelTimerByDP(peerUdid, peerUserId, localUserId);
    EXPECT_TRUE(dmDeviceStateManager->stateTimerInfoMap_[key].isStart);
    dmDeviceStateManager->stateTimerInfoMap_.clear();
}

HWTEST_F(DmDeviceStateManagerTestTwo, StartDelTimerByDP_002, testing::ext::TestSize.Level0)
{
    std::string peerUdid = "peerUdid";
    int32_t peerUserId = 100;
    int32_t localUserId = 100;
    dmDeviceStateManager->stateTimerInfoMap_.clear();
    for (uint32_t i = 0; i < AUTH_ONCE_STATE_TIMER_MAX; i++) {
        StateTimerInfo stateTimerInfo;
        dmDeviceStateManager->stateTimerInfoMap_[std::to_string(i)] = stateTimerInfo;
    }
    dmDeviceStateManager->StartDelTimerByDP(peerUdid, peerUserId, localUserId);
    auto key = peerUdid + "_" + std::to_string(peerUserId) + "_" + std::to_string(localUserId);
    EXPECT_EQ(dmDeviceStateManager->stateTimerInfoMap_.count(key), 0);
    dmDeviceStateManager->stateTimerInfoMap_.clear();
}

HWTEST_F(DmDeviceStateManagerTestTwo, StartDelTimerByDP_003, testing::ext::TestSize.Level0)
{
    std::string peerUdid = "peerUdid";
    int32_t peerUserId = 100;
    int32_t localUserId = 100;
    dmDeviceStateManager->stateTimerInfoMap_.clear();
    StateTimerInfo stateTimerInfo = {
        .timerName = "timerName",
        .peerUdid = peerUdid,
        .peerUserId = peerUserId,
        .localUserId = localUserId,
        .isStart = false,
    };
    auto timer = dmDeviceStateManager->timer_;
    dmDeviceStateManager->timer_ = nullptr;
    dmDeviceStateManager->StartDelTimerByDP(peerUdid, peerUserId, localUserId);
    auto key = peerUdid + "_" + std::to_string(peerUserId) + "_" + std::to_string(localUserId);
    EXPECT_TRUE(dmDeviceStateManager->stateTimerInfoMap_[key].isStart);
    dmDeviceStateManager->stateTimerInfoMap_.clear();
    EXPECT_NE(dmDeviceStateManager->timer_, nullptr);
    dmDeviceStateManager->timer_->DeleteAll();
    dmDeviceStateManager->timer_ = timer;
}

HWTEST_F(DmDeviceStateManagerTestTwo, DeleteGroupByDP_001, testing::ext::TestSize.Level0)
{
    std::vector<DistributedDeviceProfile::AccessControlProfile> profiles;
    EXPECT_CALL(*deviceProfileConnectorMock_, GetAccessControlProfileByUserId(_)).WillOnce(Return(profiles));
    int32_t ret = dmDeviceStateManager->DeleteGroupByDP("peerUdid", 100, 100);
    EXPECT_EQ(ret, DM_OK);
}

DistributedDeviceProfile::AccessControlProfile GenerateAccessControlProfile(
    const std::string &peerUdid, int32_t authType,
    const std::string &accesserBundleName, const std::string &accesserUdId, int32_t accesserUserId,
    const std::string &accesseeBundleName, const std::string &accesseeUdId, int32_t accesseeUserId)
{
    DistributedDeviceProfile::AccessControlProfile accessControlProfile;
    accessControlProfile.SetTrustDeviceId(peerUdid);
    accessControlProfile.SetAuthenticationType(authType);
    DistributedDeviceProfile::Accesser accesser;
    accesser.SetAccesserBundleName(accesserBundleName);
    accesser.SetAccesserDeviceId(accesserUdId);
    accesser.SetAccesserUserId(accesserUserId);
    accessControlProfile.SetAccesser(accesser);
    DistributedDeviceProfile::Accessee accessee;
    accessee.SetAccesseeBundleName(accesseeBundleName);
    accessee.SetAccesseeDeviceId(accesseeUdId);
    accessee.SetAccesseeUserId(accesseeUserId);
    accessControlProfile.SetAccessee(accessee);
    return accessControlProfile;
}

HWTEST_F(DmDeviceStateManagerTestTwo, DeleteGroupByDP_002, testing::ext::TestSize.Level0)
{
    std::string peerUdid = "peerUdid";
    int32_t peerUserId = 100;
    int32_t localUserId = 100;
    auto aclProfile1 = GenerateAccessControlProfile(peerUdid, ALLOW_AUTH_ONCE, "BundleName", peerUdid, peerUserId,
        "BundleName", "localUdid", localUserId);
    std::vector<DistributedDeviceProfile::AccessControlProfile> profiles {aclProfile1};
    EXPECT_CALL(*deviceProfileConnectorMock_, GetAccessControlProfileByUserId(_)).WillOnce(Return(profiles));
    auto hichainConnector = dmDeviceStateManager->hiChainConnector_;
    dmDeviceStateManager->hiChainConnector_ = nullptr;
    int32_t ret = dmDeviceStateManager->DeleteGroupByDP(peerUdid, peerUserId, localUserId);
    EXPECT_EQ(ret, ERR_DM_POINT_NULL);
    dmDeviceStateManager->hiChainConnector_ = hichainConnector;
}

HWTEST_F(DmDeviceStateManagerTestTwo, DeleteCredential_001, testing::ext::TestSize.Level0)
{
    DmOfflineParam offlineParam;
    std::string peerUdid = "peerUdid";
    int32_t localUserId = 100;
    EXPECT_CALL(*hiChainAuthConnectorMock_, DeleteCredential(_, _, _)).WillOnce(Return(0));
    dmDeviceStateManager->DeleteCredential(offlineParam, peerUdid, localUserId);
}

HWTEST_F(DmDeviceStateManagerTestTwo, DeleteCredential_101, testing::ext::TestSize.Level0)
{
    DmAclIdParam acl = { .credId = "", .userId = 0, };
    EXPECT_CALL(*hiChainAuthConnectorMock_, QueryCredInfoByCredId(_, _, _))
        .WillOnce(Return(-1));
    dmDeviceStateManager->DeleteCredential(acl);
}

HWTEST_F(DmDeviceStateManagerTestTwo, DeleteCredential_102, testing::ext::TestSize.Level0)
{
    DmAclIdParam acl = { .credId = "credId", .userId = 0, };
    JsonObject credJson;
    EXPECT_CALL(*hiChainAuthConnectorMock_, QueryCredInfoByCredId(_, _, _))
        .WillOnce(Invoke([&credJson](int a, const std::string &b, JsonObject &result) {
            result.Duplicate(credJson);
            return DM_OK;
        }));
    dmDeviceStateManager->DeleteCredential(acl);
}

HWTEST_F(DmDeviceStateManagerTestTwo, DeleteCredential_103, testing::ext::TestSize.Level0)
{
    DmAclIdParam acl = { .credId = "credId", .userId = 0, };
    JsonObject credInfoJson;
    JsonObject credJson;
    credJson.Insert(acl.credId, credInfoJson);
    EXPECT_CALL(*hiChainAuthConnectorMock_, QueryCredInfoByCredId(_, _, _))
        .WillOnce(Invoke([&credJson](int a, const std::string &b, JsonObject &result) {
            result.Duplicate(credJson);
            return DM_OK;
        }));
    EXPECT_CALL(*hiChainAuthConnectorMock_, DeleteCredential(_, _)).WillOnce(Return(-1));
    dmDeviceStateManager->DeleteCredential(acl);
}

HWTEST_F(DmDeviceStateManagerTestTwo, DeleteCredential_104, testing::ext::TestSize.Level0)
{
    std::unordered_set<int64_t> tokenIds{1, 2};
    DmAclIdParam acl = { .userId = 100, .credId = "credId", .tokenIds = tokenIds };
    std::string credInfoJsonStr = R"({"authorizedAppList":["1", "2"]})";
    JsonObject credInfoJson(credInfoJsonStr);
    JsonObject credJson;
    credJson.Insert(acl.credId, credInfoJson);
    EXPECT_CALL(*hiChainAuthConnectorMock_, QueryCredInfoByCredId(_, _, _))
        .WillOnce(Invoke([&credJson](int a, const std::string &b, JsonObject &result) {
            result.Duplicate(credJson);
            return DM_OK;
        }));
    EXPECT_CALL(*hiChainAuthConnectorMock_, DeleteCredential(_, _)).WillOnce(Return(-1));
    dmDeviceStateManager->DeleteCredential(acl);
}

HWTEST_F(DmDeviceStateManagerTestTwo, DeleteCredential_105, testing::ext::TestSize.Level0)
{
    std::unordered_set<int64_t> tokenIds{1, 2};
    DmAclIdParam acl = { .userId = 100, .credId = "credId", .tokenIds = tokenIds };
    std::string credInfoJsonStr = R"({"authorizedAppList": ["1", "2", "3"]})";
    JsonObject credInfoJson(credInfoJsonStr);
    JsonObject credJson;
    credJson.Insert(acl.credId, credInfoJson);
    EXPECT_CALL(*hiChainAuthConnectorMock_, QueryCredInfoByCredId(_, _, _))
        .WillOnce(Invoke([&credJson](int a, const std::string &b, JsonObject &result) {
            result.Duplicate(credJson);
            return DM_OK;
        }));
    EXPECT_CALL(*hiChainAuthConnectorMock_, UpdateCredential(_, _, _)).WillOnce(Return(-1));
    dmDeviceStateManager->DeleteCredential(acl);
}
} // namespace
} // namespace DistributedHardware
} // namespace OHOS