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

#include <csignal>
#include <iostream>

#include "battery_info.h"
#include "battery_service.h"
#include "power_mgr_client.h"
#include "test_utils.h"

using namespace testing::ext;
using namespace OHOS::PowerMgr;
using namespace OHOS::HDI::Battery;
using namespace OHOS;
using namespace std;

namespace {
bool g_isMock = false;
static sptr<BatteryService> g_service;
const std::string MOCK_BATTERY_PATH = "/data/service/el0/battery/";
} // namespace

void BatteryPluggedWakeupTest::SetUpTestCase()
{
    g_service = DelayedSpSingleton<BatteryService>::GetInstance();
    g_service->OnStart();
    g_isMock = TestUtils::IsMock();
    GTEST_LOG_(INFO) << " g_isMock: " << g_isMock;
}

void BatteryPluggedWakeupTest::TearDownTestCase()
{
    g_isMock = false;
    TestUtils::ResetOnline();
}

void BatteryPluggedWakeupTest::SetUp() {}

void BatteryPluggedWakeupTest::TearDown() {}

namespace {
/**
 * @tc.name: BatteryPluggedWakeupTest001
 * @tc.desc: Test function of wakeup_device when USB plugged.
 * @tc.type: FUNC
 */
HWTEST_F(BatteryPluggedWakeupTest, BatteryPluggedWakeupTest001, TestSize.Level0)
{
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest001 start.");
    if (g_isMock) {
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "0");
        g_service->Reset();
        auto& powerMgrClient = OHOS::PowerMgr::PowerMgrClient::GetInstance();
        powerMgrClient.SuspendDevice();
        bool isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_FALSE(isScreenOnNow);
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "1");
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/type", "USB");
        g_service->Reset();
        isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_TRUE(isScreenOnNow);
    }
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest001 end.");
}

/**
 * @tc.name: BatteryPluggedWakeupTest002
 * @tc.desc: Test function of wakeup_device when USB unplugged.
 * @tc.type: FUNC
 */
HWTEST_F(BatteryPluggedWakeupTest, BatteryPluggedWakeupTest002, TestSize.Level0)
{
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest002 start.");
    if (g_isMock) {
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "1");
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/type", "USB");
        g_service->Reset();
        auto& powerMgrClient = OHOS::PowerMgr::PowerMgrClient::GetInstance();
        powerMgrClient.SuspendDevice();
        bool isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_FALSE(isScreenOnNow);
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "0");
        g_service->Reset();
        isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_TRUE(isScreenOnNow);
    }
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest002 end.");
}

/**
 * @tc.name: BatteryPluggedWakeupTest003
 * @tc.desc: Test function of wakeup_device when WIRELESS plugged.
 * @tc.type: FUNC
 */
HWTEST_F(BatteryPluggedWakeupTest, BatteryPluggedWakeupTest003, TestSize.Level0)
{
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest003 start.");
    if (g_isMock) {
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "0");
        g_service->Reset();
        auto& powerMgrClient = OHOS::PowerMgr::PowerMgrClient::GetInstance();
        powerMgrClient.SuspendDevice();
        bool isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_FALSE(isScreenOnNow);
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "1");
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/type", "Wireless");
        g_service->Reset();
        isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_TRUE(isScreenOnNow);
    }
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest003 end.");
}

/**
 * @tc.name: BatteryPluggedWakeupTest004
 * @tc.desc: Test function of wakeup_device when WIRELESS unplugged.
 * @tc.type: FUNC
 */
HWTEST_F(BatteryPluggedWakeupTest, BatteryPluggedWakeupTest004, TestSize.Level0)
{
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest004 start.");
    if (g_isMock) {
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "1");
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/type", "Wireless");
        g_service->Reset();
        auto& powerMgrClient = OHOS::PowerMgr::PowerMgrClient::GetInstance();
        powerMgrClient.SuspendDevice();
        bool isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_FALSE(isScreenOnNow);
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "0");
        g_service->Reset();
        isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_TRUE(isScreenOnNow);
    }
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest004 end.");
}

/**
 * @tc.name: BatteryPluggedWakeupTest005
 * @tc.desc: Test function of wakeup_device when AC plugged.
 * @tc.type: FUNC
 */
HWTEST_F(BatteryPluggedWakeupTest, BatteryPluggedWakeupTest005, TestSize.Level0)
{
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest005 start.");
    if (g_isMock) {
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "0");
        g_service->Reset();
        auto& powerMgrClient = OHOS::PowerMgr::PowerMgrClient::GetInstance();
        powerMgrClient.SuspendDevice();
        bool isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_FALSE(isScreenOnNow);
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "1");
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/type", "Mains");
        g_service->Reset();
        isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_TRUE(isScreenOnNow);
    }
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest005 end.");
}

/**
 * @tc.name: BatteryPluggedWakeupTest006
 * @tc.desc: Test function of wakeup_device when AC unplugged.
 * @tc.type: FUNC
 */
HWTEST_F(BatteryPluggedWakeupTest, BatteryPluggedWakeupTest006, TestSize.Level0)
{
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest006 start.");
    if (g_isMock) {
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "1");
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/type", "Mains");
        g_service->Reset();
        auto& powerMgrClient = OHOS::PowerMgr::PowerMgrClient::GetInstance();
        powerMgrClient.SuspendDevice();
        bool isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_FALSE(isScreenOnNow);
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "0");
        g_service->Reset();
        isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_TRUE(isScreenOnNow);
    }
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest006 end.");
}

/**
 * @tc.name: BatteryPluggedWakeupTest007
 * @tc.desc: Test function of wakeup_device when Unknown plugged.
 * @tc.type: FUNC
 */
HWTEST_F(BatteryPluggedWakeupTest, BatteryPluggedWakeupTest007, TestSize.Level0)
{
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest007 start.");
    if (g_isMock) {
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "0");
        g_service->Reset();
        auto& powerMgrClient = OHOS::PowerMgr::PowerMgrClient::GetInstance();
        powerMgrClient.SuspendDevice();
        bool isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_FALSE(isScreenOnNow);
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "1");
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/type", "Unknown");
        g_service->Reset();
        isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_FALSE(isScreenOnNow);
    }
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest007 end.");
}

/**
 * @tc.name: BatteryPluggedWakeupTest008
 * @tc.desc: Test function of wakeup_device when Unknown unplugged.
 * @tc.type: FUNC
 */
HWTEST_F(BatteryPluggedWakeupTest, BatteryPluggedWakeupTest008, TestSize.Level0)
{
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest008 start.");
    if (g_isMock) {
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "1");
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/type", "Unknown");
        g_service->Reset();
        auto& powerMgrClient = OHOS::PowerMgr::PowerMgrClient::GetInstance();
        powerMgrClient.SuspendDevice();
        bool isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_FALSE(isScreenOnNow);
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "0");
        g_service->Reset();
        isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_FALSE(isScreenOnNow);
    }
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest008 end.");
}

/**
 * @tc.name: BatteryPluggedWakeupTest009
 * @tc.desc: the situation of PLUGGED_TYPE_NONE to PLUGGED_TYPE_NONE.
 * @tc.type: FUNC
 */
HWTEST_F(BatteryPluggedWakeupTest, BatteryPluggedWakeupTest009, TestSize.Level0)
{
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest009 start.");
    if (g_isMock) {
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "0");
        g_service->Reset();
        auto& powerMgrClient = OHOS::PowerMgr::PowerMgrClient::GetInstance();
        powerMgrClient.SuspendDevice();
        bool isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_FALSE(isScreenOnNow);
        TestUtils::WriteMock(MOCK_BATTERY_PATH + "/ohos_charger/online", "0");
        g_service->Reset();
        isScreenOnNow = powerMgrClient.IsScreenOn();
        EXPECT_FALSE(isScreenOnNow);
    }
    BATTERY_HILOGD(LABEL_TEST, "BatteryPluggedWakeupTest009 end.");
}
}