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

#include <iostream>
#include <string>
#include <unistd.h>

#include "device_manager_service_listener.h"
#include "dm_anonymous.h"
#include "dm_constants.h"
#include "dm_log.h"
#include "ipc_server_listener.h"
#include "softbus_bus_center.h"
#include "softbus_error_code.h"

namespace OHOS {
namespace DistributedHardware {
void DiscoveryManagerTest::SetUp()
{
}

void DiscoveryManagerTest::TearDown()
{
}

void DiscoveryManagerTest::SetUpTestCase()
{
}

void DiscoveryManagerTest::TearDownTestCase()
{
}

namespace {
    std::shared_ptr<SoftbusListener> softbusListener = std::make_shared<SoftbusListener>();
    std::shared_ptr<IDeviceManagerServiceListener> listener = std::make_shared<DeviceManagerServiceListener>();
    std::shared_ptr<DiscoveryManager> manager = std::make_shared<DiscoveryManager>(softbusListener, listener);

bool checkSoftbusRes(int32_t ret)
{
    return ret == SOFTBUS_INVALID_PARAM || ret == SOFTBUS_NETWORK_NOT_INIT || ret == SOFTBUS_NETWORK_LOOPER_ERR;
}

HWTEST_F(DiscoveryManagerTest, DisableDiscoveryListener_002, testing::ext::TestSize.Level0)
{
    std::string pkgName = "pkgName";
    std::map<std::string, std::string> extraParam;
    extraParam.insert(std::pair<std::string, std::string>("META_TYPE", "ohos.test"));
    extraParam.insert(std::pair<std::string, std::string>("SUBSCRIBE_ID", "ohos.test"));
    int32_t ret = manager->DisableDiscoveryListener(pkgName, extraParam);
    EXPECT_EQ(ret, ERR_DM_INPUT_PARA_INVALID);
}

HWTEST_F(DiscoveryManagerTest, DisableDiscoveryListener_003, testing::ext::TestSize.Level0)
{
    std::string pkgName = "pkgName";
    std::map<std::string, std::string> extraParam;
    int32_t ret = manager->DisableDiscoveryListener(pkgName, extraParam);
    EXPECT_EQ(ret, ERR_DM_INPUT_PARA_INVALID);
}

HWTEST_F(DiscoveryManagerTest, StartDiscovering_001, testing::ext::TestSize.Level0)
{
    std::string pkgName;
    std::map<std::string, std::string> discoverParam;
    std::map<std::string, std::string> filterOptions;
    int32_t ret = manager->StartDiscovering(pkgName, discoverParam, filterOptions);
    EXPECT_EQ(ret, ERR_DM_INPUT_PARA_INVALID);
}

HWTEST_F(DiscoveryManagerTest, StartDiscovering_002, testing::ext::TestSize.Level0)
{
    std::string pkgName = "pkgName";
    std::map<std::string, std::string> discoverParam;
    discoverParam.insert(std::pair<std::string, std::string>("SUBSCRIBE_ID", "ohos.test"));
    discoverParam.insert(std::pair<std::string, std::string>("DISC_MEDIUM", "ohos.test"));
    discoverParam.insert(std::pair<std::string, std::string>("META_TYPE", "ohos.test"));
    discoverParam.insert(std::pair<std::string, std::string>("FILTER_OPTIONS", "ohos.test"));
    std::map<std::string, std::string> filterOptions;
    int32_t ret = manager->StartDiscovering(pkgName, discoverParam, filterOptions);
    EXPECT_EQ(true, checkSoftbusRes(ret));
}

HWTEST_F(DiscoveryManagerTest, StartDiscovering_003, testing::ext::TestSize.Level0)
{
    std::string pkgName = "pkgName";
    std::map<std::string, std::string> discoverParam;
    std::map<std::string, std::string> filterOptions;
    int32_t ret = manager->StartDiscovering(pkgName, discoverParam, filterOptions);
    EXPECT_EQ(ret, ERR_DM_DISCOVERY_REPEATED);
}

HWTEST_F(DiscoveryManagerTest, StartDiscovering_004, testing::ext::TestSize.Level0)
{
    std::string pkgName = "pkgName_test1";
    std::map<std::string, std::string> discoverParam;
    std::map<std::string, std::string> filterOptions;
    discoverParam.insert(std::pair<std::string, std::string>("SUBSCRIBE_ID", "test_value1"));
    discoverParam.insert(std::pair<std::string, std::string>("DISC_MEDIUM", "test_value2"));
    filterOptions.insert(std::pair<std::string, std::string>("PARAM_KEY_FILTER_OPTIONS", "test_value3"));
    int32_t ret = manager->StartDiscovering(pkgName, discoverParam, filterOptions);
    EXPECT_EQ(true, checkSoftbusRes(ret));
}

HWTEST_F(DiscoveryManagerTest, StartDiscovering4MineLibary_001, testing::ext::TestSize.Level0)
{
    std::string pkgName = "pkgName";
    DmSubscribeInfo dmSubInfo;
    std::string searchJson = "searchJson";
    int32_t ret = manager->StartDiscovering4MineLibary(pkgName, dmSubInfo, searchJson);
    EXPECT_EQ(ret, ERR_DM_JSON_PARSE_STRING);
}

HWTEST_F(DiscoveryManagerTest, StartDiscoveringNoMetaType_001, testing::ext::TestSize.Level0)
{
    DmSubscribeInfo dmSubInfo;
    std::string pkgName = "pkgNameTest01";
    std::map<std::string, std::string> param;
    param.insert(std::pair<std::string, std::string>("META_TYPE", std::to_string(MetaNodeType::PROXY_SHARE)));
    int32_t ret = manager->StartDiscoveringNoMetaType(pkgName, dmSubInfo, param);
    EXPECT_NE(ret, DM_OK);
}

HWTEST_F(DiscoveryManagerTest, StartDiscoveringNoMetaType_002, testing::ext::TestSize.Level0)
{
    DmSubscribeInfo dmSubInfo;
    std::string pkgName = "pkgNameTest02";
    std::map<std::string, std::string> param;
    param.insert(std::pair<std::string, std::string>("META_TYPE", std::to_string(MetaNodeType::PROXY_WEAR)));
    int32_t ret = manager->StartDiscoveringNoMetaType(pkgName, dmSubInfo, param);
    EXPECT_NE(ret, DM_OK);
}

HWTEST_F(DiscoveryManagerTest, StartDiscoveringNoMetaType_003, testing::ext::TestSize.Level0)
{
    DmSubscribeInfo dmSubInfo;
    std::string pkgName = "pkgNameTest03";
    std::map<std::string, std::string> param;
    param.insert(std::pair<std::string, std::string>("META_TYPE", std::to_string(MetaNodeType::PROXY_CASTPLUS)));
    int32_t ret = manager->StartDiscoveringNoMetaType(pkgName, dmSubInfo, param);
    EXPECT_NE(ret, DM_OK);
}

HWTEST_F(DiscoveryManagerTest, StartDiscoveringNoMetaType_004, testing::ext::TestSize.Level0)
{
    DmSubscribeInfo dmSubInfo;
    std::string pkgName = "pkgNameTest04";
    std::map<std::string, std::string> param;
    int32_t ret = manager->StartDiscoveringNoMetaType(pkgName, dmSubInfo, param);
    EXPECT_NE(ret, DM_OK);
}

HWTEST_F(DiscoveryManagerTest, StartDiscovering4MetaType_001, testing::ext::TestSize.Level0)
{
    DmSubscribeInfo dmSubInfo;
    std::string pkgName = "pkgNameTest01";
    std::map<std::string, std::string> param;
    param.emplace("META_TYPE", "4");
    int32_t ret = manager->StartDiscovering4MetaType(pkgName, dmSubInfo, param);
    EXPECT_NE(ret, DM_OK);
}

HWTEST_F(DiscoveryManagerTest, StartDiscovering4MetaType_002, testing::ext::TestSize.Level0)
{
    DmSubscribeInfo dmSubInfo;
    std::string pkgName = "pkgNameTest02";
    std::map<std::string, std::string> param;
    param.emplace("META_TYPE", "7");
    int32_t ret = manager->StartDiscovering4MetaType(pkgName, dmSubInfo, param);
    EXPECT_NE(ret, DM_OK);
}

HWTEST_F(DiscoveryManagerTest, StartDiscovering4MetaType_003, testing::ext::TestSize.Level0)
{
    DmSubscribeInfo dmSubInfo;
    std::string pkgName = "pkgNameTest03";
    std::map<std::string, std::string> param;
    param.emplace("META_TYPE", "5");
    int32_t ret = manager->StartDiscovering4MetaType(pkgName, dmSubInfo, param);
    EXPECT_NE(ret, DM_OK);
}

HWTEST_F(DiscoveryManagerTest, StartDiscovering4MetaType_004, testing::ext::TestSize.Level0)
{
    DmSubscribeInfo dmSubInfo;
    std::string pkgName = "pkgNameTest04";
    std::map<std::string, std::string> param;
    param.emplace("META_TYPE", "1234");
    int32_t ret = manager->StartDiscovering4MetaType(pkgName, dmSubInfo, param);
    EXPECT_EQ(ret, ERR_DM_UNSUPPORTED_METHOD);
}

HWTEST_F(DiscoveryManagerTest, StopDiscovering_001, testing::ext::TestSize.Level0)
{
    std::string pkgName;
    uint16_t subscribeId = 0;
    int32_t ret = manager->StopDiscovering(pkgName, subscribeId);
    EXPECT_EQ(ret, ERR_DM_INPUT_PARA_INVALID);
}

HWTEST_F(DiscoveryManagerTest, StopDiscovering_002, testing::ext::TestSize.Level0)
{
    std::string pkgName = "pkgName";
    uint16_t subscribeId = 0;
    manager->pkgNameSet_.insert(pkgName);
    DiscoveryContext context;
    manager->discoveryContextMap_.emplace(pkgName, context);
    int32_t ret = manager->StopDiscovering(pkgName, subscribeId);
    EXPECT_EQ(true, checkSoftbusRes(ret));
}

HWTEST_F(DiscoveryManagerTest, OnDeviceFound_001, testing::ext::TestSize.Level0)
{
    std::string pkgName = "pkgName";
    DmDeviceInfo info;
    bool isOnline = false;
    manager->OnDeviceFound(pkgName, info, isOnline);
    EXPECT_EQ(manager->discoveryContextMap_.empty(), false);
}

HWTEST_F(DiscoveryManagerTest, OnDeviceFound_002, testing::ext::TestSize.Level0)
{
    std::string pkgName = "pkgName";
    DmDeviceInfo info;
    bool isOnline = true;
    manager->OnDeviceFound(pkgName, info, isOnline);
    EXPECT_EQ(manager->discoveryContextMap_.empty(), false);
}

HWTEST_F(DiscoveryManagerTest, OnDiscoveringResult_001, testing::ext::TestSize.Level0)
{
    std::string pkgName;
    int32_t subscribeId = 1;
    int32_t result = 0;
    manager->OnDiscoveringResult(pkgName, subscribeId, result);
    EXPECT_EQ(manager->discoveryContextMap_.empty(), false);
}

HWTEST_F(DiscoveryManagerTest, OnDiscoveringResult_002, testing::ext::TestSize.Level0)
{
    std::string pkgName = "pkgName";
    int32_t subscribeId = 1;
    int32_t result = 0;
    manager->listener_ = nullptr;
    manager->OnDiscoveringResult(pkgName, subscribeId, result);
    EXPECT_EQ(manager->discoveryContextMap_.empty(), false);
}

HWTEST_F(DiscoveryManagerTest, StartDiscoveryTimer_001, testing::ext::TestSize.Level0)
{
    manager->timer_ = nullptr;
    std::string pkgName = "timeTest";
    manager->StartDiscoveryTimer(pkgName);
    EXPECT_EQ(manager->discoveryContextMap_.empty(), false);
}

HWTEST_F(DiscoveryManagerTest, HandleDiscoveryQueue_001, testing::ext::TestSize.Level0)
{
    std::string pkgName = "pkgName";
    uint16_t subscribeId = 0;
    std::map<std::string, std::string> filterOps;
    filterOps.insert(std::pair<std::string, std::string>("FILTER_OPTIONS", pkgName));
    int32_t ret = manager->HandleDiscoveryQueue(pkgName, subscribeId, filterOps);
    EXPECT_NE(ret, DM_OK);
}

HWTEST_F(DiscoveryManagerTest, HandleDiscoveryTimeout_001, testing::ext::TestSize.Level0)
{
    std::string name = "nameTest01";
    std::set<std::string> emptySet;
    manager->pkgNameSet_ = emptySet;
    manager->HandleDiscoveryTimeout(name);
    EXPECT_EQ(manager->pkgNameSet_.empty(), true);
}

HWTEST_F(DiscoveryManagerTest, HandleDiscoveryTimeout_002, testing::ext::TestSize.Level0)
{
    std::string name = "nameTest02";
    manager->pkgNameSet_.insert(name);
    manager->discoveryContextMap_.clear();
    manager->HandleDiscoveryTimeout(name);
    EXPECT_EQ(manager->pkgNameSet_.empty(), false);
}

HWTEST_F(DiscoveryManagerTest, HandleDiscoveryTimeout_003, testing::ext::TestSize.Level0)
{
    manager->pkgNameSet_.clear();
    std::string name = "nameTest03";
    manager->pkgNameSet_.insert(name);
    DiscoveryContext context;
    manager->discoveryContextMap_.emplace(name, context);
    manager->HandleDiscoveryTimeout(name);
    EXPECT_EQ(manager->pkgNameSet_.empty(), false);
}

HWTEST_F(DiscoveryManagerTest, GetDeviceAclParam_001, testing::ext::TestSize.Level0)
{
    std::string pkgName;
    std::string deviceId;
    bool isonline = true;
    int32_t authForm = 0;
    int32_t ret = manager->GetDeviceAclParam(pkgName, 100, deviceId, isonline, authForm);
    EXPECT_EQ(ret, DM_OK);
}

HWTEST_F(DiscoveryManagerTest, GetCommonDependencyObj_001, testing::ext::TestSize.Level0)
{
    auto ret = manager->GetCommonDependencyObj();
    EXPECT_NE(ret, nullptr);
}

HWTEST_F(DiscoveryManagerTest, IsCommonDependencyReady_001, testing::ext::TestSize.Level0)
{
    manager->isSoLoaded_ = false;
    bool ret = manager->IsCommonDependencyReady();
    EXPECT_EQ(ret, true);
}

HWTEST_F(DiscoveryManagerTest, CloseCommonDependencyObj_001, testing::ext::TestSize.Level0)
{
    manager->isSoLoaded_ = false;
    manager->dpConnector_ = nullptr;
    manager->dpConnectorHandle_ = nullptr;
    bool ret = manager->CloseCommonDependencyObj();
    EXPECT_EQ(ret, true);
}

HWTEST_F(DiscoveryManagerTest, CloseCommonDependencyObj_002, testing::ext::TestSize.Level0)
{
    bool ret = manager->CloseCommonDependencyObj();
    EXPECT_EQ(ret, true);
}

/* *
 * @tc.name: StopDiscoveringByInnerSubId_001
 * @tc.desc: Test StopDiscoveringByInnerSubId
 * @tc.type: FUNC
 * @tc.require:
 */
HWTEST_F(DiscoveryManagerTest, StopDiscoveringByInnerSubId_001, testing::ext::TestSize.Level0)
{
    std::string pkgName;
    uint16_t subscribeId = 0;
    int32_t ret = manager->StopDiscoveringByInnerSubId(pkgName, subscribeId);
    EXPECT_EQ(ret, ERR_DM_INPUT_PARA_INVALID);
}

/* *
 * @tc.name: StopDiscoveringByInnerSubId_002
 * @tc.desc: Test StopDiscoveringByInnerSubId
 * @tc.type: FUNC
 * @tc.require:
 */
HWTEST_F(DiscoveryManagerTest, StopDiscoveringByInnerSubId_002, testing::ext::TestSize.Level0)
{
    std::string pkgName = "pkgName";
    uint16_t subscribeId = 0;
    manager->pkgNameSet_.insert(pkgName);
    DiscoveryContext context;
    manager->discoveryContextMap_.emplace(pkgName, context);
    int32_t ret = manager->StopDiscoveringByInnerSubId(pkgName, subscribeId);

    EXPECT_EQ(checkSoftbusRes(ret), false);
}
} // namespace
} // namespace DistributedHardware
} // namespace OHOS