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 "stats_service_core_test.h"
17 
18 #include "battery_stats_core.h"
19 #include "battery_stats_service.h"
20 
21 using namespace OHOS;
22 using namespace OHOS::PowerMgr;
23 using namespace std;
24 using namespace testing::ext;
25 
26 namespace {
27 static sptr<BatteryStatsService> g_statsService = nullptr;
28 } // namespace
29 
SetUpTestCase()30 void StatsServiceCoreTest::SetUpTestCase()
31 {
32     g_statsService = BatteryStatsService::GetInstance();
33     g_statsService->OnStart();
34 }
35 
TearDownTestCase()36 void StatsServiceCoreTest::TearDownTestCase()
37 {
38     g_statsService->OnStop();
39 }
40 
SetUp()41 void StatsServiceCoreTest::SetUp()
42 {
43     auto statsService = BatteryStatsService::GetInstance();
44     auto statsCore = statsService->GetBatteryStatsCore();
45     statsCore->Reset();
46 }
47 
TearDown()48 void StatsServiceCoreTest::TearDown()
49 {
50     auto statsService = BatteryStatsService::GetInstance();
51     auto statsCore = statsService->GetBatteryStatsCore();
52     statsCore->Reset();
53 }
54 
55 namespace {
56 /**
57  * @tc.name: StatsServiceCoreTest_001
58  * @tc.desc: test BatteryStatsCore function GetEntity
59  * @tc.type: FUNC
60  * @tc.require: issueI663DX
61  */
62 HWTEST_F (StatsServiceCoreTest, StatsServiceCoreTest_001, TestSize.Level0)
63 {
64     auto statsService = BatteryStatsService::GetInstance();
65     auto statsCore = statsService->GetBatteryStatsCore();
66     EXPECT_EQ(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_INVALID));
67     EXPECT_NE(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_APP));
68     EXPECT_NE(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_BLUETOOTH));
69     EXPECT_NE(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_IDLE));
70     EXPECT_NE(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_PHONE));
71     EXPECT_NE(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_SCREEN));
72     EXPECT_NE(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_USER));
73     EXPECT_NE(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_WIFI));
74     EXPECT_NE(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_CAMERA));
75     EXPECT_NE(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_FLASHLIGHT));
76     EXPECT_NE(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_AUDIO));
77     EXPECT_NE(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_SENSOR));
78     EXPECT_NE(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_GNSS));
79     EXPECT_NE(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_CPU));
80     EXPECT_NE(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_WAKELOCK));
81     EXPECT_NE(nullptr, statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_ALARM));
82 }
83 
84 /**
85  * @tc.name: StatsServiceCoreTest_002
86  * @tc.desc: test BatteryStatsCore function update
87  * @tc.type: FUNC
88  * @tc.require: issueI663DX
89  */
90 HWTEST_F (StatsServiceCoreTest, StatsServiceCoreTest_002, TestSize.Level0)
91 {
92     auto statsService = BatteryStatsService::GetInstance();
93     auto statsCore = statsService->GetBatteryStatsCore();
94     statsService->SetOnBattery(true);
95     int64_t time = 100;
96     int64_t data = 10;
97     statsCore->UpdateStats(StatsUtils::STATS_TYPE_WIFI_SCAN, time, data);
98     statsCore->UpdateStats(StatsUtils::STATS_TYPE_WAKELOCK_HOLD, time, data);
99     std::shared_ptr<BatteryStatsEntity> wifiEntity = statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_WIFI);
100     EXPECT_EQ(data, wifiEntity->GetConsumptionCount(StatsUtils::STATS_TYPE_WIFI_SCAN));
101 
102     statsCore->UpdateStats(StatsUtils::STATS_TYPE_WIFI_ON, StatsUtils::STATS_STATE_ACTIVATED);
103     usleep(SERVICE_POWER_CONSUMPTION_DURATION_US);
104     statsCore->UpdateStats(StatsUtils::STATS_TYPE_WIFI_SCAN, StatsUtils::STATS_STATE_DEACTIVATED);
105     usleep(SERVICE_POWER_CONSUMPTION_DURATION_US);
106     statsCore->UpdateStats(StatsUtils::STATS_TYPE_WIFI_ON, StatsUtils::STATS_STATE_DEACTIVATED);
107     EXPECT_GT(wifiEntity->GetActiveTimeMs(StatsUtils::STATS_TYPE_WIFI_ON),
108         ((2 * SERVICE_POWER_CONSUMPTION_DURATION_US) / 3) * 2 / US_PER_MS);
109     statsService->SetOnBattery(false);
110 }
111 
112 /**
113  * @tc.name: StatsServiceCoreTest_003
114  * @tc.desc: test BatteryStatsCore with entity is nullptr
115  * @tc.type: FUNC
116  * @tc.require: issueI663DX
117  */
118 HWTEST_F (StatsServiceCoreTest, StatsServiceCoreTest_003, TestSize.Level0)
119 {
120     std::shared_ptr<BatteryStatsCore> statsCore = std::make_shared<BatteryStatsCore>();
121     std::string expectedDebugInfo;
122     expectedDebugInfo.append("BATTERY STATS DUMP:\n").append("\n");
123     std::string actualDebugInfo {};
124     statsCore->DumpInfo(actualDebugInfo);
125     auto index = actualDebugInfo.find(expectedDebugInfo);
126     EXPECT_TRUE(index != string::npos);
127 }
128 
129 /**
130  * @tc.name: StatsServiceCoreTest_004
131  * @tc.desc: test Entity Function
132  * @tc.type: FUNC
133  * @tc.require: issueI663DX
134  */
135 HWTEST_F (StatsServiceCoreTest, StatsServiceCoreTest_004, TestSize.Level0)
136 {
137     auto statsService = BatteryStatsService::GetInstance();
138     auto statsCore = statsService->GetBatteryStatsCore();
139     int32_t uid = 1003;
140 
141     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
142         BatteryStatsInfo::CONSUMPTION_TYPE_ALARM)->GetConsumptionCount(StatsUtils::STATS_TYPE_INVALID));
143     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
144         BatteryStatsInfo::CONSUMPTION_TYPE_ALARM)->GetEntityPowerMah());
145     EXPECT_EQ(nullptr, statsCore->GetEntity(
146         BatteryStatsInfo::CONSUMPTION_TYPE_ALARM)->GetOrCreateCounter(StatsUtils::STATS_TYPE_INVALID));
147 
148     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
149         BatteryStatsInfo::CONSUMPTION_TYPE_AUDIO)->GetActiveTimeMs(uid, StatsUtils::STATS_TYPE_INVALID));
150     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
151         BatteryStatsInfo::CONSUMPTION_TYPE_AUDIO)->GetEntityPowerMah());
152     EXPECT_EQ(nullptr, statsCore->GetEntity(
153         BatteryStatsInfo::CONSUMPTION_TYPE_AUDIO)->GetOrCreateTimer(uid, StatsUtils::STATS_TYPE_INVALID));
154 
155     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
156         BatteryStatsInfo::CONSUMPTION_TYPE_BLUETOOTH)->GetActiveTimeMs(uid, StatsUtils::STATS_TYPE_INVALID));
157     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
158         BatteryStatsInfo::CONSUMPTION_TYPE_BLUETOOTH)->GetActiveTimeMs(StatsUtils::STATS_TYPE_INVALID));
159     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
160         BatteryStatsInfo::CONSUMPTION_TYPE_BLUETOOTH)->GetEntityPowerMah());
161     EXPECT_EQ(nullptr, statsCore->GetEntity(
162         BatteryStatsInfo::CONSUMPTION_TYPE_BLUETOOTH)->GetOrCreateTimer(uid, StatsUtils::STATS_TYPE_INVALID));
163     EXPECT_EQ(nullptr, statsCore->GetEntity(
164         BatteryStatsInfo::CONSUMPTION_TYPE_BLUETOOTH)->GetOrCreateTimer(StatsUtils::STATS_TYPE_INVALID));
165 
166     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
167         BatteryStatsInfo::CONSUMPTION_TYPE_CAMERA)->GetActiveTimeMs(uid, StatsUtils::STATS_TYPE_INVALID));
168     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
169         BatteryStatsInfo::CONSUMPTION_TYPE_CAMERA)->GetEntityPowerMah());
170     EXPECT_EQ(nullptr, statsCore->GetEntity(
171         BatteryStatsInfo::CONSUMPTION_TYPE_CAMERA)->GetOrCreateTimer(uid, StatsUtils::STATS_TYPE_INVALID));
172 
173     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
174         BatteryStatsInfo::CONSUMPTION_TYPE_FLASHLIGHT)->GetActiveTimeMs(uid, StatsUtils::STATS_TYPE_INVALID));
175     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
176         BatteryStatsInfo::CONSUMPTION_TYPE_FLASHLIGHT)->GetEntityPowerMah());
177     EXPECT_EQ(nullptr, statsCore->GetEntity(
178         BatteryStatsInfo::CONSUMPTION_TYPE_FLASHLIGHT)->GetOrCreateTimer(uid, StatsUtils::STATS_TYPE_INVALID));
179 
180     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
181         BatteryStatsInfo::CONSUMPTION_TYPE_GNSS)->GetActiveTimeMs(uid, StatsUtils::STATS_TYPE_INVALID));
182     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
183         BatteryStatsInfo::CONSUMPTION_TYPE_GNSS)->GetEntityPowerMah());
184     EXPECT_EQ(nullptr, statsCore->GetEntity(
185         BatteryStatsInfo::CONSUMPTION_TYPE_GNSS)->GetOrCreateTimer(uid, StatsUtils::STATS_TYPE_INVALID));
186 }
187 
188 /**
189  * @tc.name: StatsServiceCoreTest_005
190  * @tc.desc: test Entity Function
191  * @tc.type: FUNC
192  * @tc.require: issueI663DX
193  */
194 HWTEST_F (StatsServiceCoreTest, StatsServiceCoreTest_005, TestSize.Level0)
195 {
196     auto statsService = BatteryStatsService::GetInstance();
197     auto statsCore = statsService->GetBatteryStatsCore();
198     int32_t uid = 1003;
199 
200     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
201         BatteryStatsInfo::CONSUMPTION_TYPE_PHONE)->GetActiveTimeMs(StatsUtils::STATS_TYPE_INVALID));
202     EXPECT_EQ(nullptr, statsCore->GetEntity(
203         BatteryStatsInfo::CONSUMPTION_TYPE_PHONE)->GetOrCreateTimer(StatsUtils::STATS_TYPE_INVALID));
204 
205     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
206         BatteryStatsInfo::CONSUMPTION_TYPE_SCREEN)->GetActiveTimeMs(StatsUtils::STATS_TYPE_INVALID));
207     EXPECT_EQ(nullptr, statsCore->GetEntity(
208         BatteryStatsInfo::CONSUMPTION_TYPE_SCREEN)->GetOrCreateTimer(StatsUtils::STATS_TYPE_INVALID));
209 
210     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
211         BatteryStatsInfo::CONSUMPTION_TYPE_SENSOR)->GetActiveTimeMs(uid, StatsUtils::STATS_TYPE_INVALID));
212     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
213         BatteryStatsInfo::CONSUMPTION_TYPE_SENSOR)->GetEntityPowerMah());
214     EXPECT_EQ(nullptr, statsCore->GetEntity(
215         BatteryStatsInfo::CONSUMPTION_TYPE_SENSOR)->GetOrCreateTimer(uid, StatsUtils::STATS_TYPE_INVALID));
216 
217     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
218         BatteryStatsInfo::CONSUMPTION_TYPE_USER)->GetEntityPowerMah());
219 
220     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
221         BatteryStatsInfo::CONSUMPTION_TYPE_WAKELOCK)->GetActiveTimeMs(uid, StatsUtils::STATS_TYPE_INVALID));
222     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
223         BatteryStatsInfo::CONSUMPTION_TYPE_WAKELOCK)->GetEntityPowerMah());
224     EXPECT_EQ(nullptr, statsCore->GetEntity(
225         BatteryStatsInfo::CONSUMPTION_TYPE_WAKELOCK)->GetOrCreateTimer(uid, StatsUtils::STATS_TYPE_INVALID));
226 
227     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
228         BatteryStatsInfo::CONSUMPTION_TYPE_WIFI)->GetActiveTimeMs(StatsUtils::STATS_TYPE_INVALID));
229     EXPECT_EQ(nullptr, statsCore->GetEntity(
230         BatteryStatsInfo::CONSUMPTION_TYPE_WIFI)->GetOrCreateTimer(StatsUtils::STATS_TYPE_INVALID));
231     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, statsCore->GetEntity(
232         BatteryStatsInfo::CONSUMPTION_TYPE_WIFI)->GetConsumptionCount(StatsUtils::STATS_TYPE_INVALID));
233     EXPECT_EQ(nullptr, statsCore->GetEntity(
234         BatteryStatsInfo::CONSUMPTION_TYPE_WIFI)->GetOrCreateCounter(StatsUtils::STATS_TYPE_INVALID));
235 }
236 
237 /**
238  * @tc.name: StatsServiceCoreTest_006
239  * @tc.desc: test Cpu and Idle Entity Function
240  * @tc.type: FUNC
241  * @tc.require: issueI663DX
242  */
243 HWTEST_F (StatsServiceCoreTest, StatsServiceCoreTest_006, TestSize.Level0)
244 {
245     auto statsService = BatteryStatsService::GetInstance();
246     auto statsCore = statsService->GetBatteryStatsCore();
247     auto cpuEntity = statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_CPU);
248     auto idleEntity = statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_IDLE);
249     int32_t invalidUid = -1;
250     cpuEntity->Reset();
251     cpuEntity->UpdateCpuTime();
252     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, cpuEntity->GetCpuTimeMs(invalidUid));
253     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, cpuEntity->GetEntityPowerMah(invalidUid));
254     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, cpuEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_CPU_ACTIVE));
255     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, cpuEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_CPU_CLUSTER));
256     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, cpuEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_CPU_SPEED));
257     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, cpuEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_INVALID));
258 
259     idleEntity->Reset();
260     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, idleEntity->GetActiveTimeMs(StatsUtils::STATS_TYPE_INVALID));
261     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, idleEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_PHONE_IDLE));
262     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, idleEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_CPU_SUSPEND));
263     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, idleEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_INVALID));
264 }
265 
266 /**
267  * @tc.name: StatsServiceCoreTest_007
268  * @tc.desc: test Uid Entity Function
269  * @tc.type: FUNC
270  * @tc.require: issueI663DX
271  */
272 HWTEST_F (StatsServiceCoreTest, StatsServiceCoreTest_007, TestSize.Level0)
273 {
274     auto statsService = BatteryStatsService::GetInstance();
275     auto statsCore = statsService->GetBatteryStatsCore();
276     auto uidEntity = statsCore->GetEntity(BatteryStatsInfo::CONSUMPTION_TYPE_APP);
277     int32_t invalidUid = -1;
278     uidEntity->Reset();
279     uidEntity->UpdateUidMap(invalidUid);
280     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, uidEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_BLUETOOTH_BR_SCAN));
281     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, uidEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_BLUETOOTH_BLE_SCAN));
282     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, uidEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_CAMERA_ON));
283     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, uidEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_FLASHLIGHT_ON));
284     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, uidEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_GNSS_ON));
285     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, uidEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_SENSOR_GRAVITY_ON));
286     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, uidEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_SENSOR_PROXIMITY_ON));
287     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, uidEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_AUDIO_ON));
288     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, uidEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_WAKELOCK_HOLD));
289     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, uidEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_CPU_CLUSTER));
290     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, uidEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_CPU_SPEED));
291     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, uidEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_CPU_ACTIVE));
292     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, uidEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_ALARM));
293     EXPECT_EQ(StatsUtils::DEFAULT_VALUE, uidEntity->GetStatsPowerMah(StatsUtils::STATS_TYPE_INVALID));
294 }
295 }