1 /*
2 * Copyright (c) 2021 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 "ability_context_ability.h"
17 #include "app_log_wrapper.h"
18 #include "base_ability.h"
19 #include "test_utils.h"
20
21 namespace OHOS {
22 namespace AppExecFwk {
23 using namespace OHOS::EventFwk;
24 namespace {
25 constexpr int SLEEP_SECOND = 2;
26 }
27
~AbilityContextAbility()28 AbilityContextAbility::~AbilityContextAbility()
29 {
30 CommonEventManager::UnSubscribeCommonEvent(subscriber_);
31 }
32
Init(const std::shared_ptr<AbilityInfo> & abilityInfo,const std::shared_ptr<OHOSApplication> & application,std::shared_ptr<AbilityHandler> & handler,const sptr<IRemoteObject> & token)33 void AbilityContextAbility::Init(const std::shared_ptr<AbilityInfo> &abilityInfo,
34 const std::shared_ptr<OHOSApplication> &application, std::shared_ptr<AbilityHandler> &handler,
35 const sptr<IRemoteObject> &token)
36 {
37 APP_LOGI("AbilityContextAbility::Init called.");
38 BaseAbility::Init(abilityInfo, application, handler, token);
39
40 SubscribeEvent();
41 }
42
SubscribeEvent()43 bool AbilityContextAbility::SubscribeEvent()
44 {
45 MatchingSkills matchingSkills;
46 matchingSkills.AddEvent(APP_ABILITY_CONTEXT_REQ_EVENT_NAME);
47 CommonEventSubscribeInfo subscribeInfo(matchingSkills);
48 subscribeInfo.SetPriority(1);
49 subscriber_ = std::make_shared<AbilityContextAbilityEventSubscriber>(subscribeInfo);
50 subscriber_->mainAbility = *this;
51 return CommonEventManager::SubscribeCommonEvent(subscriber_);
52 }
53
OnStart(const Want & want)54 void AbilityContextAbility::OnStart(const Want &want)
55 {
56 want_ = want;
57 sequenceNumber_ = std::stoi(GetNoFromWantInfo(want));
58 APP_LOGI("AbilityContextAbility::OnStart");
59
60 BaseAbility::OnStart(want);
61 TestUtils::PublishEvent(
62 APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnStart");
63 }
64
OnStop()65 void AbilityContextAbility::OnStop()
66 {
67 APP_LOGI("AbilityContextAbility::OnStop");
68 BaseAbility::OnStop();
69 TestUtils::PublishEvent(
70 APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INITIAL, "OnStop");
71 }
72
OnActive()73 void AbilityContextAbility::OnActive()
74 {
75 APP_LOGI("AbilityContextAbility::OnActive");
76 BaseAbility::OnActive();
77 TestUtils::PublishEvent(
78 APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnActive");
79 }
80
OnInactive()81 void AbilityContextAbility::OnInactive()
82 {
83 APP_LOGI("AbilityContextAbility::OnInactive");
84 BaseAbility::OnInactive();
85 TestUtils::PublishEvent(
86 APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnInactive");
87 }
88
OnBackground()89 void AbilityContextAbility::OnBackground()
90 {
91 APP_LOGI("AbilityContextAbility::OnBackground");
92 BaseAbility::OnBackground();
93 TestUtils::PublishEvent(
94 APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::BACKGROUND, "OnBackground");
95 }
96
OnForeground(const Want & want)97 void AbilityContextAbility::OnForeground(const Want &want)
98 {
99 APP_LOGI("AbilityContextAbility::OnForeground");
100 BaseAbility::OnBackground();
101 TestUtils::PublishEvent(
102 APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnForeground");
103 }
104
OnCommand(const Want & want,bool restart,int startId)105 void AbilityContextAbility::OnCommand(const Want &want, bool restart, int startId)
106 {
107 APP_LOGI("AbilityContextAbility::OnCommand");
108
109 BaseAbility::OnCommand(want, restart, startId);
110 TestUtils::PublishEvent(
111 APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnCommand");
112 }
113
OnConnect(const Want & want)114 sptr<IRemoteObject> AbilityContextAbility::OnConnect(const Want &want)
115 {
116 APP_LOGI("AbilityContextAbility::OnConnect");
117
118 sptr<IRemoteObject> ret = BaseAbility::OnConnect(want);
119 TestUtils::PublishEvent(
120 APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnConnect");
121 return ret;
122 }
123
OnDisconnect(const Want & want)124 void AbilityContextAbility::OnDisconnect(const Want &want)
125 {
126 APP_LOGI("AbilityContextAbility::OnDisconnect");
127
128 BaseAbility::OnDisconnect(want);
129 TestUtils::PublishEvent(
130 APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::BACKGROUND, "OnDisconnect");
131 }
132
ConnectCaseIndexOne()133 void AbilityContextAbility::ConnectCaseIndexOne() {
134 stub_ = new (std::nothrow) AbilityContextConnectCallback();
135 connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
136 bool ret = BaseAbility::GetContext()->ConnectAbility(want_, connCallback_);
137 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestConnectAbility");
138 sleep(SLEEP_SECOND);
139 BaseAbility::GetContext()->DisconnectAbility(connCallback_);
140 }
141
ConnectCaseIndexTwo()142 void AbilityContextAbility::ConnectCaseIndexTwo() {
143 stub_ = new (std::nothrow) AbilityContextConnectCallback();
144 connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
145 MAP_STR_STR params;
146 Want want =
147 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKit", params);
148 bool ret = BaseAbility::GetContext()->ConnectAbility(want, connCallback_);
149 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestConnectAbility");
150 sleep(1);
151 BaseAbility::GetContext()->DisconnectAbility(connCallback_);
152 }
153
TestConnectAbility()154 void AbilityContextAbility::TestConnectAbility()
155 {
156 switch ((CaseIndex)AbilityContextAbility::sequenceNumber_) {
157 case CaseIndex::ONE: {
158 ConnectCaseIndexOne();
159 } break;
160 case CaseIndex::TWO: {
161 ConnectCaseIndexTwo();
162 } break;
163 case CaseIndex::THREE: {
164 stub_ = new (std::nothrow) AbilityContextConnectCallback();
165 connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
166 MAP_STR_STR params;
167 Want want = TestUtils::MakeWant("", "AmsStServiceAbilityA1", "com.ohos.amsst.service.appA", params);
168 bool ret = BaseAbility::GetContext()->ConnectAbility(want, connCallback_);
169 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestConnectAbility");
170 sleep(1);
171 BaseAbility::GetContext()->DisconnectAbility(connCallback_);
172 } break;
173 case CaseIndex::FOUR: {
174 for (int i = 0; i < (int)CaseIndex::THREE; i++) {
175 stub_ = new (std::nothrow) AbilityContextConnectCallback();
176 connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
177 bool ret = BaseAbility::GetContext()->ConnectAbility(want_, connCallback_);
178 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestConnectAbility");
179 sleep(1);
180 BaseAbility::GetContext()->DisconnectAbility(connCallback_);
181 }
182 } break;
183 case CaseIndex::FIVE: {
184 sptr<AbilityContextConnectCallback> stub(new (std::nothrow) AbilityContextConnectCallback());
185 sptr<AbilityConnectionProxy> connCallback(new (std::nothrow) AbilityConnectionProxy(stub));
186 bool ret = BaseAbility::GetContext()->ConnectAbility(want_, connCallback);
187 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestConnectAbility");
188 sleep(1);
189 BaseAbility::GetContext()->DisconnectAbility(connCallback_);
190 } break;
191 default:
192 break;
193 }
194 }
195
TestStopAbility()196 void AbilityContextAbility::TestStopAbility()
197 {
198 switch ((CaseIndex)AbilityContextAbility::sequenceNumber_) {
199 case CaseIndex::ONE: {
200 bool ret = BaseAbility::GetContext()->StopAbility(want_);
201 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestStopAbility");
202 } break;
203 case CaseIndex::TWO: {
204 MAP_STR_STR params;
205 Want want =
206 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKit", params);
207 bool ret = BaseAbility::GetContext()->StopAbility(want);
208 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestStopAbility");
209 } break;
210 case CaseIndex::THREE: {
211 MAP_STR_STR params;
212 Want want = TestUtils::MakeWant("", "AmsStServiceAbilityA1", "com.ohos.amsst.service.appA", params);
213 bool ret = BaseAbility::GetContext()->StopAbility(want);
214 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestStopAbility");
215 } break;
216 case CaseIndex::FOUR: {
217 for (int i = 0; i < (int)CaseIndex::THREE; i++) {
218 bool ret = BaseAbility::GetContext()->StopAbility(want_);
219 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestStopAbility");
220 }
221 } break;
222 case CaseIndex::FIVE: {
223 MAP_STR_STR params;
224 Want want =
225 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKitx", params);
226 bool ret = BaseAbility::GetContext()->StopAbility(want);
227 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestStopAbility");
228 } break;
229 default:
230 break;
231 }
232 }
233
DisconnectCaseIndexOne()234 void AbilityContextAbility::DisconnectCaseIndexOne() {
235 stub_ = new (std::nothrow) AbilityContextConnectCallback();
236 connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
237 bool ret = BaseAbility::GetContext()->ConnectAbility(want_, connCallback_);
238 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestDisconnectAbility");
239 BaseAbility::GetContext()->DisconnectAbility(connCallback_);
240 }
241
DisconnectCaseIndexTwo()242 void AbilityContextAbility::DisconnectCaseIndexTwo() {
243 MAP_STR_STR params;
244 Want want =
245 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKit", params);
246 stub_ = new (std::nothrow) AbilityContextConnectCallback();
247 connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
248 bool ret = BaseAbility::GetContext()->ConnectAbility(want, connCallback_);
249 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestDisconnectAbility");
250 sleep(SLEEP_SECOND);
251 BaseAbility::GetContext()->DisconnectAbility(connCallback_);
252 }
253
TestDisconnectAbility()254 void AbilityContextAbility::TestDisconnectAbility()
255 {
256 switch ((CaseIndex)AbilityContextAbility::sequenceNumber_) {
257 case CaseIndex::ONE: {
258 DisconnectCaseIndexOne();
259 } break;
260 case CaseIndex::TWO: {
261 DisconnectCaseIndexTwo();
262 } break;
263 case CaseIndex::THREE: {
264 MAP_STR_STR params;
265 Want want = TestUtils::MakeWant("", "AmsStServiceAbilityA1", "com.ohos.amsst.service.appA", params);
266 stub_ = new (std::nothrow) AbilityContextConnectCallback();
267 connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
268 bool ret = BaseAbility::GetContext()->ConnectAbility(want, connCallback_);
269 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestDisconnectAbility");
270 sleep(SLEEP_SECOND);
271 BaseAbility::GetContext()->DisconnectAbility(connCallback_);
272 } break;
273 case CaseIndex::FOUR: {
274 for (int i = 0; i < (int)CaseIndex::THREE; i++) {
275 stub_ = new (std::nothrow) AbilityContextConnectCallback();
276 connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
277 bool ret = BaseAbility::GetContext()->ConnectAbility(want_, connCallback_);
278 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestDisconnectAbility");
279 BaseAbility::GetContext()->DisconnectAbility(connCallback_);
280 }
281 } break;
282 case CaseIndex::FIVE: {
283 MAP_STR_STR params;
284 Want want =
285 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKitx", params);
286 stub_ = new (std::nothrow) AbilityContextConnectCallback();
287 connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
288 bool ret = BaseAbility::GetContext()->ConnectAbility(want, connCallback_);
289 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestDisconnectAbility");
290 BaseAbility::GetContext()->DisconnectAbility(connCallback_);
291 } break;
292 default:
293 break;
294 }
295 }
296
TestStartAbility()297 void AbilityContextAbility::TestStartAbility()
298 {
299 switch ((CaseIndex)AbilityContextAbility::sequenceNumber_) {
300 case CaseIndex::ONE: {
301 BaseAbility::GetContext()->StartAbility(want_, 0);
302 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestStartAbility");
303 } break;
304 case CaseIndex::TWO: {
305 MAP_STR_STR params;
306 Want want =
307 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKit", params);
308 BaseAbility::GetContext()->StartAbility(want, 0);
309 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestStartAbility");
310 sleep(SLEEP_SECOND);
311 BaseAbility::GetContext()->StopAbility(want);
312 } break;
313 case CaseIndex::THREE: {
314 MAP_STR_STR params;
315 Want want = TestUtils::MakeWant("", "AmsStServiceAbilityA1", "com.ohos.amsst.service.appA", params);
316 BaseAbility::GetContext()->StartAbility(want, 0);
317 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestStartAbility");
318 sleep(SLEEP_SECOND);
319 BaseAbility::GetContext()->StopAbility(want);
320 } break;
321 case CaseIndex::FOUR: {
322 for (int i = 0; i < (int)CaseIndex::THREE; i++) {
323 BaseAbility::GetContext()->StartAbility(want_, 0);
324 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestStartAbility");
325 }
326 } break;
327 case CaseIndex::FIVE: {
328 MAP_STR_STR params;
329 Want want =
330 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKitx", params);
331 BaseAbility::GetContext()->StartAbility(want, 0);
332 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestStartAbility");
333 } break;
334 default:
335 break;
336 }
337 }
338
TestTerminateAbility()339 void AbilityContextAbility::TestTerminateAbility()
340 {
341 switch ((CaseIndex)AbilityContextAbility::sequenceNumber_) {
342 case CaseIndex::ONE: {
343 BaseAbility::GetContext()->TerminateAbility();
344 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestTerminateAbility");
345 } break;
346 case CaseIndex::TWO: {
347 MAP_STR_STR params;
348 Want want =
349 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKit", params);
350 BaseAbility::GetContext()->StartAbility(want, 0);
351 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestTerminateAbility");
352 sleep(SLEEP_SECOND);
353 BaseAbility::GetContext()->StopAbility(want);
354 BaseAbility::GetContext()->TerminateAbility();
355 } break;
356 case CaseIndex::THREE: {
357 MAP_STR_STR params;
358 Want want = TestUtils::MakeWant("", "AmsStServiceAbilityA1", "com.ohos.amsst.service.appA", params);
359 BaseAbility::GetContext()->StartAbility(want, 0);
360 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestTerminateAbility");
361 sleep(SLEEP_SECOND);
362 BaseAbility::GetContext()->StopAbility(want);
363 BaseAbility::GetContext()->TerminateAbility();
364 } break;
365 case CaseIndex::FOUR: {
366 for (int i = 0; i < (int)CaseIndex::THREE; i++) {
367 BaseAbility::GetContext()->TerminateAbility();
368 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestTerminateAbility");
369 }
370 } break;
371 case CaseIndex::FIVE: {
372 MAP_STR_STR params;
373 Want want =
374 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKitx", params);
375 BaseAbility::GetContext()->StartAbility(want, 0);
376 BaseAbility::GetContext()->TerminateAbility();
377 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestTerminateAbility");
378 } break;
379 default:
380 break;
381 }
382 }
383
OnReceiveEvent(const CommonEventData & data)384 void AbilityContextAbilityEventSubscriber::OnReceiveEvent(const CommonEventData &data)
385 {
386 APP_LOGI(
387 "AbilityContextAbilityEventSubscriber::OnReceiveEvent:event=%{public}s", data.GetWant().GetAction().c_str());
388 APP_LOGI("AbilityContextAbilityEventSubscriber::OnReceiveEvent:data=%{public}s", data.GetData().c_str());
389 APP_LOGI("AbilityContextAbilityEventSubscriber::OnReceiveEvent:code=%{public}d", data.GetCode());
390
391 auto eventName = data.GetWant().GetAction();
392 if (std::strcmp(eventName.c_str(), APP_ABILITY_CONTEXT_REQ_EVENT_NAME.c_str()) == 0) {
393 auto target = data.GetData();
394 auto func = mapTestFunc_.find(target);
395 if (func != mapTestFunc_.end()) {
396 func->second();
397 } else {
398 APP_LOGI("AbilityContextAbilityEventSubscriber::OnReceiveEvent: CommonEventData error(%{public}s)",
399 target.c_str());
400 }
401 }
402 }
403 REGISTER_AA(AbilityContextAbility)
404 } // namespace AppExecFwk
405 } // namespace OHOS