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_audio_test.h"
17
18 #include <hisysevent.h>
19
20 #include "battery_stats_client.h"
21
22 using namespace testing::ext;
23 using namespace OHOS::HiviewDFX;
24 using namespace OHOS::PowerMgr;
25 using namespace std;
26
SetUpTestCase()27 void StatsAudioTest::SetUpTestCase()
28 {
29 ParserAveragePowerFile();
30 system("hidumper -s 3302 -a -u");
31 }
32
TearDownTestCase()33 void StatsAudioTest::TearDownTestCase()
34 {
35 system("hidumper -s 3302 -a -r");
36 }
37
SetUp()38 void StatsAudioTest::SetUp()
39 {
40 auto& statsClient = BatteryStatsClient::GetInstance();
41 statsClient.SetOnBattery(true);
42 }
43
TearDown()44 void StatsAudioTest::TearDown()
45 {
46 auto& statsClient = BatteryStatsClient::GetInstance();
47 statsClient.SetOnBattery(false);
48 }
49
50 namespace {
51 /**
52 * @tc.name: StatsAudioTest_001
53 * @tc.desc: test Reset function(Audio)
54 * @tc.type: FUNC
55 */
56 HWTEST_F (StatsAudioTest, StatsAudioTest_001, TestSize.Level0)
57 {
58 auto& statsClient = BatteryStatsClient::GetInstance();
59 statsClient.Reset();
60
61 int32_t uid = 10003;
62 int32_t pid = 3458;
63 int32_t stateRunning = 2;
64 int32_t stateStopped = 3;
65
66 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
67 "UID", uid, "STATE", stateRunning);
68 usleep(POWER_CONSUMPTION_DURATION_US);
69 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
70 "UID", uid, "STATE", stateStopped);
71
72 double powerMahBefore = statsClient.GetAppStatsMah(uid);
73 statsClient.Reset();
74 double powerMahAfter = statsClient.GetAppStatsMah(uid);
75 GTEST_LOG_(INFO) << __func__ << ": before consumption = " << powerMahBefore << " mAh";
76 GTEST_LOG_(INFO) << __func__ << ": after consumption = " << powerMahAfter << " mAh";
77 EXPECT_TRUE(powerMahBefore > StatsUtils::DEFAULT_VALUE && powerMahAfter == StatsUtils::DEFAULT_VALUE);
78 }
79
80 /**
81 * @tc.name: StatsAudioTest_002
82 * @tc.desc: test GetAppStatsMah function(Audio)
83 * @tc.type: FUNC
84 */
85 HWTEST_F (StatsAudioTest, StatsAudioTest_002, TestSize.Level0)
86 {
87 auto& statsClient = BatteryStatsClient::GetInstance();
88 statsClient.Reset();
89
90 double audioOnAverageMa = g_statsParser->GetAveragePowerMa(StatsUtils::CURRENT_AUDIO_ON);
91 int32_t uid = 10003;
92 int32_t pid = 3458;
93 int32_t stateRunning = 2;
94 int32_t stateStopped = 3;
95
96 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
97 "UID", uid, "STATE", stateRunning);
98 usleep(POWER_CONSUMPTION_DURATION_US);
99 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
100 "UID", uid, "STATE", stateStopped);
101
102 double expectedPower = POWER_CONSUMPTION_DURATION_US * audioOnAverageMa / US_PER_HOUR;
103 double actualPower = statsClient.GetAppStatsMah(uid);
104 double devPrecent = abs(expectedPower - actualPower) / expectedPower;
105 GTEST_LOG_(INFO) << __func__ << ": expected consumption = " << expectedPower << " mAh";
106 GTEST_LOG_(INFO) << __func__ << ": actual consumption = " << actualPower << " mAh";
107 EXPECT_LE(devPrecent, DEVIATION_PERCENT_THRESHOLD);
108 }
109
110 /**
111 * @tc.name: StatsAudioTest_003
112 * @tc.desc: test GetAppStatsPercent function(Audio)
113 * @tc.type: FUNC
114 */
115 HWTEST_F (StatsAudioTest, StatsAudioTest_003, TestSize.Level0)
116 {
117 auto& statsClient = BatteryStatsClient::GetInstance();
118 statsClient.Reset();
119
120 int32_t uid = 10003;
121 int32_t pid = 3458;
122 int32_t stateRunning = 2;
123 int32_t stateStopped = 3;
124 double fullPercent = 1;
125 double zeroPercent = 0;
126
127 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
128 "UID", uid, "STATE", stateRunning);
129 usleep(POWER_CONSUMPTION_DURATION_US);
130 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
131 "UID", uid, "STATE", stateStopped);
132
133 double actualPercent = statsClient.GetAppStatsPercent(uid);
134 GTEST_LOG_(INFO) << __func__ << ": actual percent = " << actualPercent;
135 EXPECT_TRUE(actualPercent >= zeroPercent && actualPercent <= fullPercent);
136 }
137
138 /**
139 * @tc.name: StatsAudioTest_004
140 * @tc.desc: test GetAppStatsMah function, Audio state composite test
141 * @tc.type: FUNC
142 */
143 HWTEST_F (StatsAudioTest, StatsAudioTest_004, TestSize.Level0)
144 {
145 auto& statsClient = BatteryStatsClient::GetInstance();
146 statsClient.Reset();
147
148 double audioOnAverageMa = g_statsParser->GetAveragePowerMa(StatsUtils::CURRENT_AUDIO_ON);
149 int32_t uid = 10003;
150 int32_t pid = 3458;
151 int32_t stateRunning = 2;
152 int32_t stateStopped = 3;
153 int32_t stateReleased = 4;
154 int32_t statePaused = 5;
155
156 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
157 "UID", uid, "STATE", stateRunning);
158 usleep(POWER_CONSUMPTION_DURATION_US);
159 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
160 "UID", uid, "STATE", stateStopped);
161
162 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
163 "UID", uid, "STATE", stateRunning);
164 usleep(POWER_CONSUMPTION_DURATION_US);
165 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
166 "UID", uid, "STATE", stateReleased);
167
168 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
169 "UID", uid, "STATE", stateRunning);
170 usleep(POWER_CONSUMPTION_DURATION_US);
171 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
172 "UID", uid, "STATE", statePaused);
173
174 double expectedPower = 3 * POWER_CONSUMPTION_DURATION_US * audioOnAverageMa / US_PER_HOUR;
175 double actualPower = statsClient.GetAppStatsMah(uid);
176 double devPrecent = abs(expectedPower - actualPower) / expectedPower;
177 GTEST_LOG_(INFO) << __func__ << ": expected consumption = " << expectedPower << " mAh";
178 GTEST_LOG_(INFO) << __func__ << ": actual consumption = " << actualPower << " mAh";
179 EXPECT_LE(devPrecent, DEVIATION_PERCENT_THRESHOLD);
180 }
181
182 /**
183 * @tc.name: StatsAudioTest_005
184 * @tc.desc: test GetAppStatsMah function, Audio abnormal state test
185 * @tc.type: FUNC
186 */
187 HWTEST_F (StatsAudioTest, StatsAudioTest_005, TestSize.Level0)
188 {
189 auto& statsClient = BatteryStatsClient::GetInstance();
190 statsClient.Reset();
191
192 double audioOnAverageMa = g_statsParser->GetAveragePowerMa(StatsUtils::CURRENT_AUDIO_ON);
193 int32_t uid = 10003;
194 int32_t pid = 3458;
195 int32_t stateRunning = 2;
196 int32_t stateStopped = 3;
197 int32_t stateInvalid = -1;
198 int32_t stateAbnormal = 101;
199
200 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
201 "UID", uid, "STATE", stateInvalid);
202 usleep(POWER_CONSUMPTION_DURATION_US);
203 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
204 "UID", uid, "STATE", stateRunning);
205 usleep(POWER_CONSUMPTION_DURATION_US);
206 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
207 "UID", uid, "STATE", stateAbnormal);
208 usleep(POWER_CONSUMPTION_DURATION_US);
209 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
210 "UID", uid, "STATE", stateStopped);
211
212 double expectedPower = 2 * POWER_CONSUMPTION_DURATION_US * audioOnAverageMa / US_PER_HOUR;
213 double actualPower = statsClient.GetAppStatsMah(uid);
214 double devPrecent = abs(expectedPower - actualPower) / expectedPower;
215 GTEST_LOG_(INFO) << __func__ << ": expected consumption = " << expectedPower << " mAh";
216 GTEST_LOG_(INFO) << __func__ << ": actual consumption = " << actualPower << " mAh";
217 EXPECT_LE(devPrecent, DEVIATION_PERCENT_THRESHOLD);
218 }
219
220 /**
221 * @tc.name: StatsAudioTest_006
222 * @tc.desc: test GetAppStatsMah(Audio) and GetAppStatsPercent(Sensor) function
223 * @tc.type: FUNC
224 */
225 HWTEST_F (StatsAudioTest, StatsAudioTest_006, TestSize.Level0)
226 {
227 auto& statsClient = BatteryStatsClient::GetInstance();
228 statsClient.Reset();
229
230 double audioOnAverageMa = g_statsParser->GetAveragePowerMa(StatsUtils::CURRENT_AUDIO_ON);
231 int32_t uid = 10003;
232 int32_t pid = 3458;
233 int32_t stateRunning = 2;
234 int32_t stateStopped = 3;
235
236 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
237 "UID", uid, "STATE", stateRunning);
238 usleep(POWER_CONSUMPTION_DURATION_US);
239 HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE", HiSysEvent::EventType::BEHAVIOR, "PID", pid,
240 "UID", uid, "STATE", stateStopped);
241
242 double expectedPower = POWER_CONSUMPTION_DURATION_US * audioOnAverageMa / US_PER_HOUR;
243 double actualPower = statsClient.GetAppStatsMah(uid);
244 double devPrecent = abs(expectedPower - actualPower) / expectedPower;
245 GTEST_LOG_(INFO) << __func__ << ": expected consumption = " << expectedPower << " mAh";
246 GTEST_LOG_(INFO) << __func__ << ": actual consumption = " << actualPower << " mAh";
247 EXPECT_LE(devPrecent, DEVIATION_PERCENT_THRESHOLD);
248
249 uid = 10004;
250 pid = 3459;
251 int32_t stateOn = 1;
252 int32_t stateOff = 0;
253 double fullPercent = 1;
254 double zeroPercent = 0;
255
256 HiSysEvent::Write(HiSysEvent::Domain::POWERMGR, "POWER_SENSOR_GRAVITY", HiSysEvent::EventType::STATISTIC, "PID",
257 pid, "UID", uid, "STATE", stateOn);
258 usleep(POWER_CONSUMPTION_DURATION_US);
259 HiSysEvent::Write(HiSysEvent::Domain::POWERMGR, "POWER_SENSOR_GRAVITY", HiSysEvent::EventType::STATISTIC, "PID",
260 pid, "UID", uid, "STATE", stateOff);
261
262 double actualPercent = statsClient.GetAppStatsPercent(uid);
263 GTEST_LOG_(INFO) << __func__ << ": actual percent = " << actualPercent;
264 EXPECT_TRUE(actualPercent >= zeroPercent && actualPercent <= fullPercent);
265 }
266 }