/*
 * Copyright (c) 2022 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_hichain_connector.h"

#include <cstdlib>
#include <ctime>
#include <functional>
#include <securec.h>

#include "parameter.h"
#include "dm_anonymous.h"
#include "dm_log.h"
#include "dm_constants.h"
#include "dm_random.h"
#include "hichain_connector.h"
#include "device_manager_service_listener.h"

namespace OHOS {
namespace DistributedHardware {
void HichainConnectorTest::SetUp()
{
}
void HichainConnectorTest::TearDown()
{
}
void HichainConnectorTest::SetUpTestCase()
{
}
void HichainConnectorTest::TearDownTestCase()
{
}
namespace {
std::shared_ptr<DeviceManagerServiceListener> listener = std::make_shared<DeviceManagerServiceListener>();
std::shared_ptr<SoftbusConnector> softbusConnector = std::make_shared<SoftbusConnector>();
std::shared_ptr<HiChainConnector> hiChainConnector = std::make_shared<HiChainConnector>();
std::shared_ptr<DmAuthManager> discoveryMgr =
    std::make_shared<DmAuthManager>(softbusConnector, listener, hiChainConnector);

/**
 * @tc.name: CreateGroup_001
 * @tc.desc: Set the deviceGroupManager_ pointer to CreateGroup to NULlptr and return ERR_DM_INPUT_PARAMETER_EMPTY
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, CreateGroup_001, testing::ext::TestSize.Level0)
{
    int64_t requestId = 123456;
    std::string groupName = "dfggg";
    hiChainConnector->deviceGroupManager_ = nullptr;
    int ret = hiChainConnector->CreateGroup(requestId, groupName);
    EXPECT_EQ(ret, ERR_DM_INPUT_PARAMETER_EMPTY);
}

/**
 * @tc.name: CreateGroup_002
 * @tc.desc: Set CreateGroup to the correct process and return DM_OK
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, CreateGroup_002, testing::ext::TestSize.Level0)
{
    int64_t requestId = 123456;
    std::string groupName = "uuiioo";
    int ret = hiChainConnector->CreateGroup(requestId, groupName);
    EXPECT_EQ(ret, ERR_DM_INPUT_PARAMETER_EMPTY);
}

/**
 * @tc.name: IsGroupInfoInvalid_001
 * @tc.desc: GroupType is GROUP_TYPE_IDENTICAL_ACCOUNT_GROUP, group.groupVisibility is not GROUP_VISIBILITY_PUBLIC.
             Group.return true
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */

HWTEST_F(HichainConnectorTest, IsGroupInfoInvalid_001, testing::ext::TestSize.Level0)
{
    GroupInfo group;
    group.groupName = "dkdkkdkdk";
    group.groupId = 1;
    group.groupOwner = "ohos.distributedhardware.devicemanager";
    group.groupType = 7;
    group.groupVisibility = 1;
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    bool ret = hiChainConnector->IsGroupInfoInvalid(group);
    EXPECT_EQ(ret, false);
}

/**
 * @tc.name: IsGroupInfoInvalid_002
 * @tc.desc: GroupType is GROUP_TYPE_IDENTICAL_ACCOUNT_GROUP, group.groupVisibility is GROUP_VISIBILITY_PUBLIC,
             Grou. groupOwner is not equal to DM_PKG_NAME. The value is true
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, IsGroupInfoInvalid_002, testing::ext::TestSize.Level0)
{
    GroupInfo group;
    group.groupName = "test";
    group.groupId = 1;
    group.groupOwner = "ohos.disware";
    group.groupType = 1;
    group.groupVisibility = -1;
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    bool ret = hichainConnector->IsGroupInfoInvalid(group);
    EXPECT_EQ(ret, true);
}

/**
 * @tc.name: DelMemberFromGroup_001
 * @tc.desc:set  groupId, deviceId null and return DM_OK
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, DelMemberFromGroup_001, testing::ext::TestSize.Level0)
{
    std::string groupId;
    std::string deviceId;
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    int ret = hichainConnector->DelMemberFromGroup(groupId, deviceId);
    EXPECT_EQ(ret, DM_OK);
}

/**
 * @tc.name: DelMemberFromGroup_002
 * @tc.desc: The groupId "34451"; The deviceId = "123"; Can be deleted correctly
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, DelMemberFromGroup_002, testing::ext::TestSize.Level0)
{
    std::string groupId = "34451";
    std::string deviceId = "123";
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    int ret = hichainConnector->DelMemberFromGroup(groupId, deviceId);
    EXPECT_EQ(ret, DM_OK);
}

/**
 * @tc.name: GenRequestId_001
 * @tc.desc:Call the GenRequestId function
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, GenRequestId_001, testing::ext::TestSize.Level0)
{
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    int ret = hichainConnector->GenRequestId();
    ASSERT_NE(ret, 0);
}

/**
 * @tc.name: from_json_001
 * @tc.desc: Pass in arguments to the from_JSON function and convert it to the correct value
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, from_json_001, testing::ext::TestSize.Level0)
{
    GroupInfo groupInfo;
    groupInfo.groupName = "aaaa";
    groupInfo.groupId = "345678";
    groupInfo.groupOwner = "lllll";
    groupInfo.groupType = 5;
    groupInfo.groupVisibility = 5;
    nlohmann::json jsonObject;
    jsonObject[FIELD_GROUP_NAME] = groupInfo.groupName;
    jsonObject[FIELD_GROUP_ID] = groupInfo.groupId;
    jsonObject[FIELD_GROUP_OWNER] = groupInfo.groupOwner;
    jsonObject[FIELD_GROUP_TYPE] = groupInfo.groupType;
    jsonObject[FIELD_GROUP_VISIBILITY] = groupInfo.groupVisibility;
    from_json(jsonObject, groupInfo);
    EXPECT_EQ(groupInfo.groupName, "aaaa");
    EXPECT_EQ(groupInfo.groupId, "345678");
    EXPECT_EQ(groupInfo.groupOwner, "lllll");
    EXPECT_EQ(groupInfo.groupType, 5);
    EXPECT_EQ(groupInfo.groupVisibility, 5);
}

/**
 * @tc.name: HiChainConnector_001
 * @tc.desc: Returns a new pointer to the HiChainConnector constructor new
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, HiChainConnector_001, testing::ext::TestSize.Level0)
{
    std::shared_ptr<HiChainConnector> m_HiChainConnector = std::make_shared<HiChainConnector>();
    ASSERT_NE(m_HiChainConnector, nullptr);
}

/**
 * @tc.name: HiChainConnector_002
 * @tc.desc: Give the HiChainConnector constructor new a new pointer and delete it
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, HiChainConnector_002, testing::ext::TestSize.Level0)
{
    std::shared_ptr<HiChainConnector> m_HiChainConnector = std::make_shared<HiChainConnector>();
    m_HiChainConnector.reset();
    EXPECT_EQ(m_HiChainConnector, nullptr);
}

/**
 * @tc.name:RegisterHiChainCallback_001
 * @tc.desc: Call the RegisterHiChainCallback function with a return value of DM_OK
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, RegisterHiChainCallback_001, testing::ext::TestSize.Level0)
{
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    int ret = hichainConnector->RegisterHiChainCallback(std::shared_ptr<IHiChainConnectorCallback>(discoveryMgr));
    EXPECT_EQ(ret, DM_OK);
}

/**
 * @tc.name: AddMember_001
 * @tc.desc: set deviceGroupManager_ = nullptr;
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, AddMember_001, testing::ext::TestSize.Level0)
{
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    hichainConnector->deviceGroupManager_ = nullptr;
    std::string deviceId;
    std::string connectInfo;
    int ret = hichainConnector->AddMember(deviceId, connectInfo);
    EXPECT_EQ(ret, ERR_DM_POINT_NULL);
}

/**
 * @tc.name: AddMember_002
 * @tc.desc: set deviceId and connectInfo = null;
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, AddMember_002, testing::ext::TestSize.Level0)
{
    std::string deviceId;
    std::string connectInfo;
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    int ret = hichainConnector->AddMember(deviceId, connectInfo);
    EXPECT_EQ(ret, ERR_DM_FAILED);
}

/**
 * @tc.name: AddMember_003
 * @tc.desc: set deviceId and connectInfo = null;
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, AddMember_003, testing::ext::TestSize.Level0)
{
    std::string deviceId = "123456";
    std::string connectInfo = "dkdkk";
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    int ret = hichainConnector->AddMember(deviceId, connectInfo);
    ASSERT_LE(ret, 1);
}

/**
 * @tc.name: onRequest_001
 * @tc.desc:set  operationCode != GroupOperationCode::MEMBER_JOIN(3);  return nullptr ;
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, onRequest_001, testing::ext::TestSize.Level0)
{
    int64_t requestId = 2;
    int32_t operationCode = 2;
    char *reqParams;
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    char *ret = hichainConnector->onRequest(requestId, operationCode, reqParams);
    EXPECT_EQ(ret, nullptr);
}

/**
 * @tc.name: GetConnectPara_001
 * @tc.desc: set para not null and go to the second master
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, GetConnectPara_001, testing::ext::TestSize.Level0)
{
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    hichainConnector->RegisterHiChainCallback(std::shared_ptr<IHiChainConnectorCallback>(discoveryMgr));
    std::string deviceId = "23445";
    std::string reqDeviceId = "234566";
    std::string p;
    std::string ret = hichainConnector->GetConnectPara(deviceId, reqDeviceId);
    EXPECT_EQ(ret, p);
}

/**
 * @tc.name: GetConnectPara_002
 * @tc.desc:Empty deviceId so that jsonObject.is_discarded is null and the value of connectAddr is returned
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, GetConnectPara_002, testing::ext::TestSize.Level0)
{
    std::string deviceId;
    std::string reqDeviceId = "234566";
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    hichainConnector->RegisterHiChainCallback(std::shared_ptr<IHiChainConnectorCallback>(discoveryMgr));
    std::string ret = hichainConnector->GetConnectPara(deviceId, reqDeviceId);
    EXPECT_EQ(ret, "");
}

/**
 * @tc.name: DeleteGroup_001
 * @tc.desc: set groupId = "34567",and return DM_OK
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, DeleteGroup_001, testing::ext::TestSize.Level0)
{
    std::string groupId = "34567";
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    int ret = hichainConnector->DeleteGroup(groupId);
    EXPECT_EQ(ret, DM_OK);
}

/**
 * @tc.name: GetRelatedGroups_001
 * @tc.desc: set DeviceId 123  groupList null and return ERR_DM_FAILED
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, GetRelatedGroups_001, testing::ext::TestSize.Level0)
{
    std::string DeviceId = "123";
    std::vector<GroupInfo> groupList;
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    int ret = hichainConnector->GetRelatedGroups(DeviceId, groupList);
    EXPECT_EQ(ret, ERR_DM_FAILED);
}

/**
 * @tc.name: GetRelatedGroups_002
 * @tc.desc: set DeviceId  = 12345,groupList null and return ERR_DM_FAILED
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, GetRelatedGroups_002, testing::ext::TestSize.Level0)
{
    std::string DeviceId = "12345";
    std::vector<GroupInfo> groupList;
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    int ret = hichainConnector->GetRelatedGroups(DeviceId, groupList);
    EXPECT_EQ(ret, ERR_DM_FAILED);
}

/**
 * @tc.name: SyncGroups_001
 * @tc.desc: set deviceId = "34567",and return DM_OK
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, SyncGroups_001, testing::ext::TestSize.Level0)
{
    std::string deviceId = "34567";
    std::vector<std::string> remoteGroupIdList;
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    int ret = hichainConnector->SyncGroups(deviceId, remoteGroupIdList);
    EXPECT_EQ(ret, DM_OK);
}

/**
 * @tc.name: GetSyncGroupList_001
 * @tc.desc: set groupList null,and return ERR_DM_FAILED
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, GetSyncGroupList_001, testing::ext::TestSize.Level0)
{
    std::vector<GroupInfo> groupList;
    std::vector<std::string> syncGroupList;
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    int ret = hichainConnector->GetSyncGroupList(groupList, syncGroupList);
    EXPECT_EQ(ret, ERR_DM_FAILED);
}

/**
 * @tc.name: GetSyncGroupList_002
 * @tc.desc: set groupList not null,and return DM_OK
 * @tc.type: FUNC
 * @tc.require: AR000GHSJK
 */
HWTEST_F(HichainConnectorTest, GetSyncGroupList_002, testing::ext::TestSize.Level0)
{
    std::vector<GroupInfo> groupList;
    GroupInfo groupList1;
    groupList1.groupName = "hichainconnector";
    groupList1.groupId = "123456";
    groupList1.groupOwner = "doftbus";
    groupList1.groupType = 1;
    groupList1.groupVisibility = 2;
    groupList.push_back(groupList1);
    std::vector<std::string> syncGroupList;
    std::shared_ptr<HiChainConnector> hichainConnector = std::make_shared<HiChainConnector>();
    int ret = hichainConnector->GetSyncGroupList(groupList, syncGroupList);
    EXPECT_EQ(ret, DM_OK);
}
} // namespace
} // namespace DistributedHardware
} // namespace OHOS