1/*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include <chrono>
17#include <cstdio>
18#include <gtest/gtest.h>
19#include <iostream>
20#include <sys/types.h>
21#include <unistd.h>
22#include <string>
23
24#include "accesstoken_kit.h"
25#include "syspara/parameter.h"
26#include "system_ability_definition.h"
27#include "ui_appearance_ability.h"
28#include "ui_appearance_log.h"
29
30using namespace testing::ext;
31static constexpr int UISERVER_UID = 3050;
32
33namespace OHOS {
34namespace ArkUi::UiAppearance {
35class UiAppearanceAbilityTest : public UiAppearanceAbility {
36public:
37    UiAppearanceAbilityTest() : UiAppearanceAbility(ARKUI_UI_APPEARANCE_SERVICE_ID, true) {}
38    ~UiAppearanceAbilityTest() {}
39    void OnStart() override
40    {
41        return;
42    }
43};
44
45class DarkModeTest : public testing::Test {
46public:
47    static void SetUpTestCase(void);
48    static void TearDownTestCase(void);
49    void SetUp();
50    void TearDown();
51
52    static sptr<UiAppearanceAbilityTest> GetUiAppearanceAbilityTest()
53    {
54        return new UiAppearanceAbilityTest;
55    }
56
57private:
58    int userId_;
59};
60
61void DarkModeTest::SetUpTestCase(void) {}
62
63void DarkModeTest::TearDownTestCase(void) {}
64
65void DarkModeTest::SetUp(void)
66{
67    userId_ = geteuid();
68    seteuid(UISERVER_UID);
69}
70
71void DarkModeTest::TearDown(void)
72{
73    seteuid(userId_);
74}
75
76/**
77 * @tc.name: ui_appearance_test_001
78 * @tc.desc: Test SetDarkMode and GetDarkMode APIs when setting dark/light.
79 * @tc.type: FUNC
80 */
81HWTEST_F(DarkModeTest, ui_appearance_test_001, TestSize.Level0)
82{
83    LOGI("Test SetDarkMode and GetDarkMode APIs when setting dark/light.");
84
85    auto test = DarkModeTest::GetUiAppearanceAbilityTest();
86    auto result = test->SetDarkMode(UiAppearanceAbilityInterface::DarkMode::ALWAYS_DARK);
87    EXPECT_EQ(result, 0);
88    auto mode = test->GetDarkMode();
89    EXPECT_EQ(mode, UiAppearanceAbilityInterface::DarkMode::ALWAYS_DARK);
90
91    result = test->SetDarkMode(UiAppearanceAbilityInterface::DarkMode::ALWAYS_LIGHT);
92    EXPECT_EQ(result, 0);
93    mode = test->GetDarkMode();
94    EXPECT_EQ(mode, UiAppearanceAbilityInterface::DarkMode::ALWAYS_LIGHT);
95}
96
97/**
98 * @tc.name: ui_appearance_test_002
99 * @tc.desc: Test SetDarkMode and GetDarkMode APIs when repeatedly setting dark/light.
100 * @tc.type: FUNC
101 */
102HWTEST_F(DarkModeTest, ui_appearance_test_002, TestSize.Level0)
103{
104    LOGI("Test SetDarkMode and GetDarkMode APIs when repeatedly setting dark/light.");
105
106    auto test = DarkModeTest::GetUiAppearanceAbilityTest();
107    auto result = test->SetDarkMode(UiAppearanceAbilityInterface::DarkMode::ALWAYS_DARK);
108    EXPECT_EQ(result, UiAppearanceAbilityInterface::ErrCode::SUCCEEDED);
109    auto mode = test->GetDarkMode();
110    EXPECT_EQ(mode, UiAppearanceAbilityInterface::DarkMode::ALWAYS_DARK);
111
112    result = test->SetDarkMode(UiAppearanceAbilityInterface::DarkMode::ALWAYS_DARK);
113    EXPECT_EQ(result, UiAppearanceAbilityInterface::ErrCode::SYS_ERR);
114    mode = test->GetDarkMode();
115    EXPECT_EQ(mode, UiAppearanceAbilityInterface::DarkMode::ALWAYS_DARK);
116
117    result = test->SetDarkMode(UiAppearanceAbilityInterface::DarkMode::ALWAYS_LIGHT);
118    EXPECT_EQ(result, UiAppearanceAbilityInterface::ErrCode::SUCCEEDED);
119    mode = test->GetDarkMode();
120    EXPECT_EQ(mode, UiAppearanceAbilityInterface::DarkMode::ALWAYS_LIGHT);
121
122    result = test->SetDarkMode(UiAppearanceAbilityInterface::DarkMode::ALWAYS_LIGHT);
123    EXPECT_EQ(result, UiAppearanceAbilityInterface::ErrCode::SYS_ERR);
124    mode = test->GetDarkMode();
125    EXPECT_EQ(mode, UiAppearanceAbilityInterface::DarkMode::ALWAYS_LIGHT);
126}
127
128/**
129 * @tc.name: ui_appearance_test_003
130 * @tc.desc: Test the SetDarkMode API when setting an unexpected value
131 * @tc.type: FUNC
132 */
133HWTEST_F(DarkModeTest, ui_appearance_test_003, TestSize.Level0)
134{
135    LOGI("Test the SetDarkMode API when setting an unexpected value.");
136
137    int result =
138        DarkModeTest::GetUiAppearanceAbilityTest()->SetDarkMode(UiAppearanceAbilityInterface::DarkMode::UNKNOWN);
139    EXPECT_NE(result, 0);
140}
141
142/**
143 * @tc.name: ui_appearance_test_004
144 * @tc.desc: Test the font API
145 * @tc.type: FUNC
146 */
147HWTEST_F(DarkModeTest, ui_appearance_test_004, TestSize.Level0)
148{
149    LOGI("Test the font API");
150
151    std::string fontScale;
152    int result =
153        DarkModeTest::GetUiAppearanceAbilityTest()->GetFontScale(fontScale);
154    EXPECT_EQ(result, 0);
155
156    std::string fontWeightScale;
157    result =
158        DarkModeTest::GetUiAppearanceAbilityTest()->GetFontWeightScale(fontWeightScale);
159    EXPECT_EQ(result, 0);
160}
161} // namespace ArkUi::UiAppearance
162} // namespace OHOS
163