1 /*
2 * Copyright (c) 2025-2025 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 #include <gtest/gtest.h>
16
17 #define private public
18 #include "suspend_manager_base_observer.h"
19 #include "suspend_manager_base_client.h"
20 #include "suspend_state_observer_base_stub.h"
21 #include "suspend_state_observer_base_proxy.h"
22 #include "accesstoken_kit.h"
23 #include "token_setproc.h"
24 #include "singleton.h"
25 #include "res_sched_service.h"
26 #include "suspend_manager_base_log.h"
27
28 using namespace testing;
29 using namespace testing::ext;
30
31 namespace OHOS {
32 namespace ResourceSchedule {
33 namespace {
34 static const std::string FOUNDATION_NAME = "foundation";
35 }
36
37 class SuspendStateObserverBaseStubTestObj : public SuspendStateObserverBaseStub {
38 public:
39 std::vector<int32_t> pidList_;
40 int32_t uid_;
41 States state_ = States::ACTIVE_STATE;
42 public:
OnActive(const std::vector<int32_t> & pidList,int32_t uid)43 ErrCode OnActive(const std::vector<int32_t> &pidList, int32_t uid)
44 {
45 SUSPEND_MANAGER_LOGI("SuspendStateObserverBaseStubTestObj register OnActive");
46 pidList_ = pidList;
47 uid_ = uid;
48 state_ = States::ACTIVE_STATE;
49 return ERR_OK;
50 }
OnDoze(const std::vector<int32_t> & pidList,int32_t uid)51 ErrCode OnDoze(const std::vector<int32_t> &pidList, int32_t uid)
52 {
53 SUSPEND_MANAGER_LOGI("SuspendStateObserverBaseStubTestObj register OnDoze");
54 pidList_ = pidList;
55 uid_ = uid;
56 state_ = States::DOZE_STATE;
57 return ERR_OK;
58 }
OnFrozen(const std::vector<int32_t> & pidList,int32_t uid)59 ErrCode OnFrozen(const std::vector<int32_t> &pidList, int32_t uid)
60 {
61 SUSPEND_MANAGER_LOGI("SuspendStateObserverBaseStubTestObj register OnFrozen");
62 pidList_ = pidList;
63 uid_ = uid;
64 state_ = States::FROZEN_STATE;
65 return ERR_OK;
66 }
67 };
68
69 class SuspendStateObserverTest : public testing::Test {
70 public:
SetUpTestCase()71 static void SetUpTestCase() {}
TearDownTestCase()72 static void TearDownTestCase() {}
73 void SetUp();
74 void TearDown();
75 };
76
SetUp()77 void SuspendStateObserverTest::SetUp()
78 {}
79
TearDown()80 void SuspendStateObserverTest::TearDown()
81 {}
82
GetNativeToken(const std::string & name)83 void GetNativeToken(const std::string &name)
84 {
85 auto tokenId = Security::AccessToken::AccessTokenKit::GetNativeTokenId(name);
86 EXPECT_EQ(0, SetSelfTokenID(tokenId));
87 }
88
89 /**
90 * @tc.name: RegisterSuspendObserverTest_001
91 * @tc.desc: client侧注册去注册全流程实现.
92 * @tc.type: FUNC
93 * @tc.require: ICQKUB
94 */
95 HWTEST_F(SuspendStateObserverTest, RegisterSuspendObserverTest_001, TestSize.Level1)
96 {
97 auto selfTokenId = GetSelfTokenID();
98 GetNativeToken(FOUNDATION_NAME);
99 /* 构造一个观察者对象 */
100 sptr<SuspendStateObserverBaseStub> suspendObservers_;
101 /* 注册空对象,失败 */
102 SuspendManagerBaseClient::GetInstance().RegisterSuspendObserver(suspendObservers_);
103 suspendObservers_ = sptr<SuspendStateObserverBaseStub>(new SuspendStateObserverBaseStubTestObj());
104 EXPECT_NE(suspendObservers_, nullptr);
105 /* 注册该对象,成功 */
106 SuspendManagerBaseClient::GetInstance().RegisterSuspendObserver(suspendObservers_);
107 /* 再次注册该对象,失败 */
108 SuspendManagerBaseClient::GetInstance().RegisterSuspendObserver(suspendObservers_);
109 /* 去注册空对象,失败 */
110 SuspendManagerBaseClient::GetInstance().UnregisterSuspendObserver(nullptr);
111 /* 去注册该对象,成功 */
112 SuspendManagerBaseClient::GetInstance().UnregisterSuspendObserver(suspendObservers_);
113 /* 再次去注册该对象,失败 */
114 SuspendManagerBaseClient::GetInstance().UnregisterSuspendObserver(suspendObservers_);
115
116 EXPECT_EQ(0, SetSelfTokenID(selfTokenId));
117 }
118
119 /**
120 * @tc.name: RegisterSuspendObserverTest_002
121 * @tc.desc: service中序列化反序列化全流程实现.
122 * @tc.type: FUNC
123 * @tc.require: ICQKUB
124 */
125 HWTEST_F(SuspendStateObserverTest, RegisterSuspendObserverTest_002, TestSize.Level1)
126 {
127 sptr<SuspendStateObserverBaseStubTestObj> suspendObservers_ =
128 sptr<SuspendStateObserverBaseStubTestObj>(new SuspendStateObserverBaseStubTestObj());
129 EXPECT_NE(suspendObservers_, nullptr);
130
131 auto suspendManagerService_ = DelayedSingleton<ResSchedService>::GetInstance();
132 EXPECT_NE(suspendManagerService_, nullptr);
133
134 MessageParcel data;
135 ASSERT_TRUE(data.WriteInterfaceToken(ResSchedService::GetDescriptor()));
136 ASSERT_TRUE(data.WriteRemoteObject(suspendObservers_->AsObject()));
137 MessageParcel reply;
138 MessageOption option;
139 uint32_t code = static_cast<uint32_t>(IResSchedServiceIpcCode::COMMAND_REGISTER_SUSPEND_OBSERVER);
140 ErrCode ret = suspendManagerService_->OnRemoteRequest(code, data, reply, option);
141 EXPECT_EQ(ret, ERR_OK);
142
143 ASSERT_TRUE(data.WriteInterfaceToken(ResSchedService::GetDescriptor()));
144 ASSERT_TRUE(data.WriteRemoteObject(suspendObservers_->AsObject()));
145 code = static_cast<uint32_t>(IResSchedServiceIpcCode::COMMAND_UNREGISTER_SUSPEND_OBSERVER);
146 ret = suspendManagerService_->OnRemoteRequest(code, data, reply, option);
147 EXPECT_EQ(ret, ERR_OK);
148 }
149
150 /**
151 * @tc.name: RegisterSuspendObserverTest_003
152 * @tc.desc: implement中注册去注册边界实现.
153 * @tc.type: FUNC
154 * @tc.require: ICQKUB
155 */
156 HWTEST_F(SuspendStateObserverTest, RegisterSuspendObserverTest_003, TestSize.Level1)
157 {
158 sptr<SuspendStateObserverBaseStubTestObj> suspendObservers_ =
159 sptr<SuspendStateObserverBaseStubTestObj>(new SuspendStateObserverBaseStubTestObj());
160 EXPECT_NE(suspendObservers_, nullptr);
161
162 int32_t ret = SuspendManagerBaseObserver::GetInstance().RegisterSuspendObserverInner(nullptr);
163 EXPECT_EQ(ret, ERR_INVALID_VALUE);
164
165 ret = SuspendManagerBaseObserver::GetInstance().UnregisterSuspendObserverInner(nullptr);
166 EXPECT_EQ(ret, ERR_INVALID_VALUE);
167
168 ret = SuspendManagerBaseObserver::GetInstance().UnregisterSuspendObserverInner(suspendObservers_);
169 EXPECT_EQ(ret, ERR_OK);
170 }
171
172 /**
173 * @tc.name: RegisterSuspendObserverTest_004
174 * @tc.desc: implement中注册去注册边界实现.
175 * @tc.type: FUNC
176 * @tc.require: ICQKUB
177 */
178 HWTEST_F(SuspendStateObserverTest, RegisterSuspendObserverTest_004, TestSize.Level1)
179 {
180 sptr<SuspendStateObserverBaseStubTestObj> suspendObservers_ =
181 sptr<SuspendStateObserverBaseStubTestObj>(new SuspendStateObserverBaseStubTestObj());
182 EXPECT_NE(suspendObservers_, nullptr);
183
184 int32_t ret = SuspendManagerBaseObserver::GetInstance().RegisterSuspendObserverInner(nullptr);
185 EXPECT_EQ(ret, ERR_INVALID_VALUE);
186
187 ret = SuspendManagerBaseObserver::GetInstance().UnregisterSuspendObserverInner(nullptr);
188 EXPECT_EQ(ret, ERR_INVALID_VALUE);
189 }
190
191 /**
192 * @tc.name: UpdateSuspendObserverTest_001
193 * @tc.desc: 正常注册,观察者状态变化.
194 * @tc.type: FUNC
195 * @tc.require: ICQKUB
196 */
197 HWTEST_F(SuspendStateObserverTest, UpdateSuspendObserverTest_001, TestSize.Level1)
198 {
199 /* 构造一个观察者对象 */
200 sptr<SuspendStateObserverBaseStubTestObj> suspendObservers_ =
201 sptr<SuspendStateObserverBaseStubTestObj>(new SuspendStateObserverBaseStubTestObj());
202 EXPECT_NE(suspendObservers_, nullptr);
203
204 /* 注册观察者对象 */
205 int32_t ret = SuspendManagerBaseObserver::GetInstance().RegisterSuspendObserverInner(suspendObservers_);
206 EXPECT_EQ(ret, ERR_OK);
207
208 /* 校验观察者初始值 */
209 EXPECT_EQ(suspendObservers_->state_, States::ACTIVE_STATE);
210 EXPECT_EQ(suspendObservers_->uid_, 0);
211 EXPECT_TRUE(suspendObservers_->pidList_.empty());
212
213 /* 通知观察者frozen信息 */
214 States state = States::FROZEN_STATE;
215 int32_t uid = 100;
216 std::vector<int32_t> pidList = {10, 20, 30};
217 ret = SuspendManagerBaseObserver::GetInstance().UpdateSuspendObserver(state, uid, pidList);
218 EXPECT_EQ(ret, ERR_OK);
219 EXPECT_EQ(suspendObservers_->state_, state);
220 EXPECT_EQ(suspendObservers_->uid_, uid);
221 EXPECT_EQ(suspendObservers_->pidList_, pidList);
222
223 /* 通知观察者active信息 */
224 state = States::ACTIVE_STATE;
225 uid = 200;
226 pidList = {40, 50, 60};
227 ret = SuspendManagerBaseObserver::GetInstance().UpdateSuspendObserver(state, uid, pidList);
228 EXPECT_EQ(ret, ERR_OK);
229 EXPECT_EQ(suspendObservers_->state_, state);
230 EXPECT_EQ(suspendObservers_->uid_, uid);
231 EXPECT_EQ(suspendObservers_->pidList_, pidList);
232
233 /* 通知观察者doze信息 */
234 state = States::DOZE_STATE;
235 uid = 300;
236 pidList = {70, 80, 90};
237 ret = SuspendManagerBaseObserver::GetInstance().UpdateSuspendObserver(state, uid, pidList);
238 EXPECT_EQ(ret, ERR_OK);
239 EXPECT_EQ(suspendObservers_->state_, state);
240 EXPECT_EQ(suspendObservers_->uid_, uid);
241 EXPECT_EQ(suspendObservers_->pidList_, pidList);
242
243 /* 去注册观察者对象 */
244 ret = SuspendManagerBaseObserver::GetInstance().UnregisterSuspendObserverInner(suspendObservers_);
245 EXPECT_EQ(ret, ERR_OK);
246
247 /* 通知观察者frozen信息 */
248 state = States::FROZEN_STATE;
249 uid = 100;
250 pidList = {10, 20, 30};
251 ret = SuspendManagerBaseObserver::GetInstance().UpdateSuspendObserver(state, uid, pidList);
252 EXPECT_EQ(ret, ERR_OK);
253
254 /* 观察者信息不再变化 */
255 EXPECT_NE(suspendObservers_->state_, state);
256 EXPECT_NE(suspendObservers_->uid_, uid);
257 EXPECT_NE(suspendObservers_->pidList_, pidList);
258 }
259
260 /**
261 * @tc.name: UpdateSuspendObserverTest_002
262 * @tc.desc: 未注册场景观察者状态变化.
263 * @tc.type: FUNC
264 * @tc.require: ICQKUB
265 */
266 HWTEST_F(SuspendStateObserverTest, UpdateSuspendObserverTest_002, TestSize.Level1)
267 {
268 /* 构造一个观察者对象 */
269 sptr<SuspendStateObserverBaseStubTestObj> suspendObservers_ =
270 sptr<SuspendStateObserverBaseStubTestObj>(new SuspendStateObserverBaseStubTestObj());
271 EXPECT_NE(suspendObservers_, nullptr);
272
273 /* 注册空的观察者对象 */
274 int32_t ret = SuspendManagerBaseObserver::GetInstance().RegisterSuspendObserverInner(nullptr);
275 EXPECT_EQ(ret, ERR_INVALID_VALUE);
276
277 /* 校验观察者初始值 */
278 EXPECT_EQ(suspendObservers_->state_, States::ACTIVE_STATE);
279 EXPECT_EQ(suspendObservers_->uid_, 0);
280 EXPECT_TRUE(suspendObservers_->pidList_.empty());
281
282 /* 通知观察者frozen信息 */
283 States state = States::FROZEN_STATE;
284 int32_t uid = 100;
285 std::vector<int32_t> pidList = {10, 20, 30};
286 ret = SuspendManagerBaseObserver::GetInstance().UpdateSuspendObserver(state, uid, pidList);
287 EXPECT_EQ(ret, ERR_OK);
288 /* 观察者信息无变化 */
289 EXPECT_EQ(suspendObservers_->state_, States::ACTIVE_STATE);
290 EXPECT_EQ(suspendObservers_->uid_, 0);
291 EXPECT_TRUE(suspendObservers_->pidList_.empty());
292 }
293
294 /**
295 * @tc.name: UpdateSuspendObserverTest_003
296 * @tc.desc: 动态注册场景观察者状态变化.
297 * @tc.type: FUNC
298 * @tc.require: ICQKUB
299 */
300 HWTEST_F(SuspendStateObserverTest, UpdateSuspendObserverTest_003, TestSize.Level1)
301 {
302 /* 构造两个观察者对象 */
303 sptr<SuspendStateObserverBaseStubTestObj> suspendObservers1_ =
304 sptr<SuspendStateObserverBaseStubTestObj>(new SuspendStateObserverBaseStubTestObj());
305 EXPECT_NE(suspendObservers1_, nullptr);
306 sptr<SuspendStateObserverBaseStubTestObj> suspendObservers2_ =
307 sptr<SuspendStateObserverBaseStubTestObj>(new SuspendStateObserverBaseStubTestObj());
308 EXPECT_NE(suspendObservers2_, nullptr);
309
310 /* 注册一个观察者对象 */
311 int32_t ret = SuspendManagerBaseObserver::GetInstance().RegisterSuspendObserverInner(suspendObservers1_);
312 EXPECT_EQ(ret, ERR_OK);
313
314 /* 校验观察者初始值 */
315 EXPECT_EQ(suspendObservers1_->state_, States::ACTIVE_STATE);
316 EXPECT_EQ(suspendObservers1_->uid_, 0);
317 EXPECT_TRUE(suspendObservers1_->pidList_.empty());
318 EXPECT_EQ(suspendObservers2_->state_, States::ACTIVE_STATE);
319 EXPECT_EQ(suspendObservers2_->uid_, 0);
320 EXPECT_TRUE(suspendObservers2_->pidList_.empty());
321
322 /* 通知观察者frozen1信息 */
323 States stateFrozen1 = States::FROZEN_STATE;
324 int32_t uidFrozen1 = 100;
325 std::vector<int32_t> pidListFrozen1 = {10, 20, 30};
326 ret = SuspendManagerBaseObserver::GetInstance().UpdateSuspendObserver(stateFrozen1, uidFrozen1, pidListFrozen1);
327 EXPECT_EQ(ret, ERR_OK);
328 /* 注册观察者信息变化 */
329 EXPECT_EQ(suspendObservers1_->state_, stateFrozen1);
330 EXPECT_EQ(suspendObservers1_->uid_, uidFrozen1);
331 EXPECT_EQ(suspendObservers1_->pidList_, pidListFrozen1);
332 /* 未注册观察者信息无变化 */
333 EXPECT_EQ(suspendObservers2_->state_, States::ACTIVE_STATE);
334 EXPECT_EQ(suspendObservers2_->uid_, 0);
335 EXPECT_TRUE(suspendObservers2_->pidList_.empty());
336
337 /* 注册第二个观察者对象 */
338 ret = SuspendManagerBaseObserver::GetInstance().RegisterSuspendObserverInner(suspendObservers2_);
339 EXPECT_EQ(ret, ERR_OK);
340
341 /* 通知观察者frozen2信息 */
342 States stateFrozen2 = States::FROZEN_STATE;
343 int32_t uidFrozen2 = 200;
344 std::vector<int32_t> pidListFrozen2 = {10, 20, 30};
345 ret = SuspendManagerBaseObserver::GetInstance().UpdateSuspendObserver(stateFrozen2, uidFrozen2, pidListFrozen2);
346 EXPECT_EQ(ret, ERR_OK);
347 /* 注册观察者信息变化 */
348 EXPECT_EQ(suspendObservers1_->state_, stateFrozen2);
349 EXPECT_EQ(suspendObservers1_->uid_, uidFrozen2);
350 EXPECT_EQ(suspendObservers1_->pidList_, pidListFrozen2);
351 EXPECT_EQ(suspendObservers2_->state_, stateFrozen2);
352 EXPECT_EQ(suspendObservers2_->uid_, uidFrozen2);
353 EXPECT_EQ(suspendObservers2_->pidList_, pidListFrozen2);
354
355 /* 去注册两个观察者对象 */
356 ret = SuspendManagerBaseObserver::GetInstance().UnregisterSuspendObserverInner(suspendObservers1_);
357 EXPECT_EQ(ret, ERR_OK);
358 ret = SuspendManagerBaseObserver::GetInstance().UnregisterSuspendObserverInner(suspendObservers2_);
359 EXPECT_EQ(ret, ERR_OK);
360 }
361
362 /**
363 * @tc.name: UpdateSuspendObserverTest_004
364 * @tc.desc: 动态去注册场景观察者状态变化.
365 * @tc.type: FUNC
366 * @tc.require: ICQKUB
367 */
368 HWTEST_F(SuspendStateObserverTest, UpdateSuspendObserverTest_004, TestSize.Level1)
369 {
370 /* 构造两个观察者对象 */
371 sptr<SuspendStateObserverBaseStubTestObj> suspendObservers1_ =
372 sptr<SuspendStateObserverBaseStubTestObj>(new SuspendStateObserverBaseStubTestObj());
373 EXPECT_NE(suspendObservers1_, nullptr);
374 sptr<SuspendStateObserverBaseStubTestObj> suspendObservers2_ =
375 sptr<SuspendStateObserverBaseStubTestObj>(new SuspendStateObserverBaseStubTestObj());
376 EXPECT_NE(suspendObservers2_, nullptr);
377
378 /* 注册两个观察者对象 */
379 int32_t ret = SuspendManagerBaseObserver::GetInstance().RegisterSuspendObserverInner(suspendObservers1_);
380 EXPECT_EQ(ret, ERR_OK);
381 ret = SuspendManagerBaseObserver::GetInstance().RegisterSuspendObserverInner(suspendObservers2_);
382 EXPECT_EQ(ret, ERR_OK);
383
384 /* 通知观察者frozen1信息 */
385 States stateFrozen1 = States::FROZEN_STATE;
386 int32_t uidFrozen1 = 100;
387 std::vector<int32_t> pidListFrozen1 = {10, 20, 30};
388 ret = SuspendManagerBaseObserver::GetInstance().UpdateSuspendObserver(stateFrozen1, uidFrozen1, pidListFrozen1);
389
390 /* 去注册第一个观察者对象 */
391 ret = SuspendManagerBaseObserver::GetInstance().UnregisterSuspendObserverInner(suspendObservers1_);
392 EXPECT_EQ(ret, ERR_OK);
393
394 /* 通知观察者active信息 */
395 States stateActive = States::ACTIVE_STATE;
396 int32_t uidActive = 300;
397 std::vector<int32_t> pidListActive = {40, 50, 60};
398 ret = SuspendManagerBaseObserver::GetInstance().UpdateSuspendObserver(stateActive, uidActive, pidListActive);
399 EXPECT_EQ(ret, ERR_OK);
400
401 /* 未注册观察者信息无变化 */
402 EXPECT_EQ(suspendObservers1_->state_, stateFrozen1);
403 EXPECT_EQ(suspendObservers1_->uid_, uidFrozen1);
404 EXPECT_EQ(suspendObservers1_->pidList_, pidListFrozen1);
405 /* 注册观察者信息变化 */
406 EXPECT_EQ(suspendObservers2_->state_, stateActive);
407 EXPECT_EQ(suspendObservers2_->uid_, uidActive);
408 EXPECT_EQ(suspendObservers2_->pidList_, pidListActive);
409
410 /* 去注册第二个观察者对象 */
411 ret = SuspendManagerBaseObserver::GetInstance().UnregisterSuspendObserverInner(suspendObservers2_);
412 EXPECT_EQ(ret, ERR_OK);
413
414 /* 全去注册后再通知观察者doze信息 */
415 States stateDoze = States::DOZE_STATE;
416 int32_t uidDoze = 400;
417 std::vector<int32_t> pidListDoze = {70, 80, 90};
418 ret = SuspendManagerBaseObserver::GetInstance().UpdateSuspendObserver(stateDoze, uidDoze, pidListDoze);
419 EXPECT_EQ(ret, ERR_OK);
420 /* 未注册观察者信息无变化 */
421 EXPECT_EQ(suspendObservers1_->state_, stateFrozen1);
422 EXPECT_EQ(suspendObservers1_->uid_, uidFrozen1);
423 EXPECT_EQ(suspendObservers1_->pidList_, pidListFrozen1);
424 EXPECT_EQ(suspendObservers2_->state_, stateActive);
425 EXPECT_EQ(suspendObservers2_->uid_, uidActive);
426 EXPECT_EQ(suspendObservers2_->pidList_, pidListActive);
427
428 /* 已完全去注册,无法继续去注册 */
429 ret = SuspendManagerBaseObserver::GetInstance().UnregisterSuspendObserverInner(suspendObservers1_);
430 EXPECT_EQ(ret, ERR_OK);
431 ret = SuspendManagerBaseObserver::GetInstance().UnregisterSuspendObserverInner(suspendObservers2_);
432 EXPECT_EQ(ret, ERR_OK);
433 }
434
435 /**
436 * @tc.name: UpdateSuspendObserverTest_005
437 * @tc.desc: 正常注册,观察者状态变化.
438 * @tc.type: FUNC
439 * @tc.require: ICQKUB
440 */
441 HWTEST_F(SuspendStateObserverTest, UpdateSuspendObserverTest_005, TestSize.Level1)
442 {
443 /* 构造一个观察者对象 */
444 sptr<SuspendStateObserverBaseStubTestObj> suspendObservers_ =
445 sptr<SuspendStateObserverBaseStubTestObj>(new SuspendStateObserverBaseStubTestObj());
446 EXPECT_NE(suspendObservers_, nullptr);
447
448 /* 注册观察者对象 */
449 int32_t ret = SuspendManagerBaseObserver::GetInstance().RegisterSuspendObserverInner(suspendObservers_);
450 EXPECT_EQ(ret, ERR_OK);
451
452 /* 校验观察者初始值 */
453 EXPECT_EQ(suspendObservers_->state_, States::ACTIVE_STATE);
454 EXPECT_EQ(suspendObservers_->uid_, 0);
455 EXPECT_TRUE(suspendObservers_->pidList_.empty());
456
457 /* 通知观察者frozen信息 */
458 States state = static_cast<States>(5);
459 int32_t uid = 100;
460 std::vector<int32_t> pidList = {10, 20, 30};
461 ret = SuspendManagerBaseObserver::GetInstance().UpdateSuspendObserver(state, uid, pidList);
462 EXPECT_EQ(ret, ERR_INVALID_VALUE);
463 EXPECT_EQ(suspendObservers_->state_, States::ACTIVE_STATE);
464 EXPECT_EQ(suspendObservers_->uid_, 0);
465 EXPECT_TRUE(suspendObservers_->pidList_.empty());
466 }
467
468 /**
469 * @tc.name: SuspendStateObserverBaseStubTest_001
470 * @tc.desc: SuspendStateObserverBaseStub状态变化,测试active消息解析.
471 * @tc.type: FUNC
472 * @tc.require: ICQKUB
473 */
474 HWTEST_F(SuspendStateObserverTest, SuspendStateObserverBaseStubTest_001, TestSize.Level1)
475 {
476 sptr<SuspendStateObserverBaseStubTestObj> suspendObservers_ =
477 sptr<SuspendStateObserverBaseStubTestObj>(new SuspendStateObserverBaseStubTestObj());
478 EXPECT_NE(suspendObservers_, nullptr);
479 sptr<SuspendStateObserverBaseProxy> proxy = new SuspendStateObserverBaseProxy(suspendObservers_);
480 EXPECT_NE(proxy, nullptr);
481 int32_t uid = 100;
482 std::vector<int32_t> pidList = {10, 20, 30};
483 MessageParcel data;
484 const uint32_t message = static_cast<uint32_t>(ISuspendStateObserverBaseIpcCode::COMMAND_ON_ACTIVE);
485 MessageParcel reply;
486 MessageOption option(MessageOption::TF_ASYNC);
487 /* 非法data解析失败 */
488 ErrCode ret = suspendObservers_->OnRemoteRequest(message, data, reply, option);
489 EXPECT_NE(ret, ERR_OK);
490 /* 合法data解析成功 */
491 proxy->OnActive(pidList, uid);
492 EXPECT_EQ(suspendObservers_->state_, States::ACTIVE_STATE);
493 EXPECT_EQ(suspendObservers_->uid_, uid);
494 EXPECT_EQ(suspendObservers_->pidList_, pidList);
495 }
496
497 /**
498 * @tc.name: SuspendStateObserverBaseStubTest_002
499 * @tc.desc: SuspendStateObserverBaseStub状态变化,测试Frozen消息解析.
500 * @tc.type: FUNC
501 * @tc.require: ICQKUB
502 */
503 HWTEST_F(SuspendStateObserverTest, SuspendStateObserverBaseStubTest_002, TestSize.Level1)
504 {
505 sptr<SuspendStateObserverBaseStubTestObj> suspendObservers_ =
506 sptr<SuspendStateObserverBaseStubTestObj>(new SuspendStateObserverBaseStubTestObj());
507 EXPECT_NE(suspendObservers_, nullptr);
508 sptr<SuspendStateObserverBaseProxy> proxy = new SuspendStateObserverBaseProxy(suspendObservers_);
509 EXPECT_NE(proxy, nullptr);
510 int32_t uid = 100;
511 std::vector<int32_t> pidList = {10, 20, 30};
512 MessageParcel data;
513 MessageParcel reply;
514 MessageOption option(MessageOption::TF_ASYNC);
515 const uint32_t message = static_cast<uint32_t>(ISuspendStateObserverBaseIpcCode::COMMAND_ON_FROZEN);
516 /* 非法data解析失败 */
517 ErrCode ret = suspendObservers_->OnRemoteRequest(message, data, reply, option);
518 EXPECT_NE(ret, ERR_OK);
519 proxy->OnFrozen(pidList, uid);
520 /* 合法data解析成功 */
521 EXPECT_EQ(suspendObservers_->state_, States::FROZEN_STATE);
522 EXPECT_EQ(suspendObservers_->uid_, uid);
523 EXPECT_EQ(suspendObservers_->pidList_, pidList);
524 }
525
526 /**
527 * @tc.name: SuspendStateObserverBaseStubTest_003
528 * @tc.desc: SuspendStateObserverBaseStub状态变化,测试Doze消息解析.
529 * @tc.type: FUNC
530 * @tc.require: ICQKUB
531 */
532 HWTEST_F(SuspendStateObserverTest, SuspendStateObserverBaseStubTest_003, TestSize.Level1)
533 {
534 sptr<SuspendStateObserverBaseStubTestObj> suspendObservers_ =
535 sptr<SuspendStateObserverBaseStubTestObj>(new SuspendStateObserverBaseStubTestObj());
536 EXPECT_NE(suspendObservers_, nullptr);
537 sptr<SuspendStateObserverBaseProxy> proxy = new SuspendStateObserverBaseProxy(suspendObservers_);
538 EXPECT_NE(proxy, nullptr);
539 int32_t uid = 100;
540 std::vector<int32_t> pidList = {10, 20, 30};
541 MessageParcel data;
542 const uint32_t message = static_cast<uint32_t>(ISuspendStateObserverBaseIpcCode::COMMAND_ON_DOZE);
543 MessageParcel reply;
544 MessageOption option(MessageOption::TF_ASYNC);
545 /* 非法data解析失败 */
546 ErrCode ret = suspendObservers_->OnRemoteRequest(message, data, reply, option);
547 EXPECT_NE(ret, ERR_OK);
548 proxy->OnDoze(pidList, uid);
549 /* 合法data解析成功 */
550 EXPECT_EQ(suspendObservers_->state_, States::DOZE_STATE);
551 EXPECT_EQ(suspendObservers_->uid_, uid);
552 EXPECT_EQ(suspendObservers_->pidList_, pidList);
553 }
554
555 /**
556 * @tc.name: SuspendStateObserverBaseStubTest_004
557 * @tc.desc: test SuspendStateObserverBaseStub.
558 * @tc.type: FUNC
559 * @tc.require: ICQKUB
560 */
561 HWTEST_F(SuspendStateObserverTest, SuspendStateObserverBaseStubTest_004, TestSize.Level1)
562 {
563 sptr<SuspendStateObserverBaseStubTestObj> suspendObservers_ =
564 sptr<SuspendStateObserverBaseStubTestObj>(new SuspendStateObserverBaseStubTestObj());
565 EXPECT_NE(suspendObservers_, nullptr);
566 int32_t uid = 100;
567 MessageParcel data;
568 const uint32_t message = static_cast<uint32_t>(ISuspendStateObserverBaseIpcCode::COMMAND_ON_FROZEN);
569 MessageParcel reply;
570 MessageOption option(MessageOption::TF_ASYNC);
571 /* 非法data解析失败 */
572 ErrCode ret = suspendObservers_->OnRemoteRequest(message, data, reply, option);
573 EXPECT_NE(ret, ERR_OK);
574
575 /* 空方法接口覆盖 */
576 std::vector<int32_t> pidList = {10, 20, 30};
577 suspendObservers_->OnActive(pidList, uid);
578 suspendObservers_->OnDoze(pidList, uid);
579 suspendObservers_->OnFrozen(pidList, uid);
580 }
581 } // namespace ResourceSchedule
582 } // namespace OHOS