on xenial help sign in
tst_ShellWithPin: Replace loader with temporary object
c81a2f4Dalton Durst
tests/qmltests/tst_ShellWithPin.qml+67−81
@@ -1,5 +1,6 @@
1/*
1/*
2 * Copyright (C) 2014-2016 Canonical, Ltd.
2 * Copyright (C) 2014-2016 Canonical, Ltd.
3+ * Copyright (C) 2021 UBports Foundation
3 *
4 *
4 * This program is free software; you can redistribute it and/or modify
5 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * it under the terms of the GNU General Public License as published by
@@ -36,7 +37,6 @@ Item {
36 Component.onCompleted: {
37 Component.onCompleted: {
37 // must set the mock mode before loading the Shell
38 // must set the mock mode before loading the Shell
38 LightDMController.userMode = "single-pin";
39 LightDMController.userMode = "single-pin";
39− shellLoader.active = true;
40 }
40 }
41
41
42 QtObject {
42 QtObject {
@@ -55,35 +55,43 @@ Item {
55 }
55 }
56 }
56 }
57
57
58+ property var tryShell: null
59+
60+ Component {
61+ id: shellComponent
62+ Shell {
63+ anchors.fill: parent
64+ hasTouchscreen: true
65+ }
66+ }
67+
58 Row {
68 Row {
59 id: contentRow
69 id: contentRow
60
70
61− Loader {
71+ Rectangle {
62− id: shellLoader
72+ id: shellRect
63− active: false
73+ color: "black"
64−
65 width: units.gu(40)
74 width: units.gu(40)
66 height: units.gu(71)
75 height: units.gu(71)
67−
68− property bool itemDestroyed: false
69− sourceComponent: Component {
70− Shell {
71− hasTouchscreen: true
72− Component.onDestruction: {
73− shellLoader.itemDestroyed = true
74− }
75− }
76− }
77 }
76 }
78
77
79 Rectangle {
78 Rectangle {
80 color: "white"
79 color: "white"
81 width: units.gu(30)
80 width: units.gu(30)
82− height: shellLoader.height
81+ height: shellRect.height
83
82
84 Column {
83 Column {
85 anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
84 anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
86 spacing: units.gu(1)
85 spacing: units.gu(1)
86+ Button {
87+ anchors { left: parent.left; right: parent.right }
88+ text: "Load shell"
89+ onClicked: {
90+ if (root.tryShell === null) {
91+ root.tryShell = shellComponent.createObject(shellRect);
92+ }
93+ }
94+ }
87 Button {
95 Button {
88 anchors { left: parent.left; right: parent.right }
96 anchors { left: parent.left; right: parent.right }
89 text: "Show Greeter"
97 text: "Show Greeter"
@@ -122,13 +130,13 @@ Item {
122 name: "ShellWithPin"
130 name: "ShellWithPin"
123 when: windowShown
131 when: windowShown
124
132
125− property Item shell: shellLoader.status === Loader.Ready ? shellLoader.item : null
126−
127− function init() {
133+ function createShell() {
134+ var shell = createTemporaryObject(shellComponent, shellRect);
135+ removeTimeConstraintsFromSwipeAreas(shell);
128 tryCompare(shell, "waitingOnGreeter", false); // will be set when greeter is all ready
136 tryCompare(shell, "waitingOnGreeter", false); // will be set when greeter is all ready
129 var greeter = findChild(shell, "greeter");
137 var greeter = findChild(shell, "greeter");
130 sessionSpy.target = greeter;
138 sessionSpy.target = greeter;
131− swipeAwayGreeter(true);
139+ swipeAwayGreeter(true, shell);
132 greeter.failedLoginsDelayAttempts = -1;
140 greeter.failedLoginsDelayAttempts = -1;
133
141
134 var launcher = findChild(shell, "launcher");
142 var launcher = findChild(shell, "launcher");
@@ -140,44 +148,20 @@ Item {
140 stage = findChild(shell, "stage");
148 stage = findChild(shell, "stage");
141 topLevelSurfaceList = findInvisibleChild(shell, "topLevelSurfaceList");
149 topLevelSurfaceList = findInvisibleChild(shell, "topLevelSurfaceList");
142 verify(topLevelSurfaceList);
150 verify(topLevelSurfaceList);
151+ return shell;
143 }
152 }
144
153
145 function cleanup() {
154 function cleanup() {
146− tryCompare(shell, "waitingOnGreeter", false); // make sure greeter didn't leave us in disabled state
147−
148 topLevelSurfaceList = null;
155 topLevelSurfaceList = null;
149−
150− shellLoader.itemDestroyed = false
151−
152− shellLoader.active = false
153−
154− tryCompare(shellLoader, "status", Loader.Null)
155− tryCompare(shellLoader, "item", null)
156− // Loader.status might be Loader.Null and Loader.item might be null but the Loader
157− // item might still be alive. So if we set Loader.active back to true
158− // again right now we will get the very same Shell instance back. So no reload
159− // actually took place. Likely because Loader waits until the next event loop
160− // iteration to do its work. So to ensure the reload, we will wait until the
161− // Shell instance gets destroyed.
162− tryCompare(shellLoader, "itemDestroyed", true)
163−
164− // kill all (fake) running apps
165− killApps()
156+ killApps();
166−
167− AccountsService.enableLauncherWhileLocked = true
157+ AccountsService.enableLauncherWhileLocked = true;
168− AccountsService.enableIndicatorsWhileLocked = true
158+ AccountsService.enableIndicatorsWhileLocked = true;
169− AccountsService.demoEdges = false
159+ AccountsService.demoEdges = false;
170− callManager.foregroundCall = null
160+ callManager.foregroundCall = null;
171 LightDM.Greeter.authenticate(""); // reset greeter
161 LightDM.Greeter.authenticate(""); // reset greeter
172−
173− // reload our test subject to get it in a fresh state once again
174− shellLoader.active = true
175−
176− tryCompare(shellLoader, "status", Loader.Ready)
177− removeTimeConstraintsFromSwipeAreas(shellLoader.item)
178 }
162 }
179
163
180− function swipeAwayGreeter(waitForCoverPage) {
164+ function swipeAwayGreeter(waitForCoverPage, shell) {
181 var greeter = findChild(shell, "greeter");
165 var greeter = findChild(shell, "greeter");
182 waitForRendering(greeter)
166 waitForRendering(greeter)
183 var coverPage = findChild(shell, "coverPage");
167 var coverPage = findChild(shell, "coverPage");
@@ -198,7 +182,7 @@ Item {
198 typeString(pin);
182 typeString(pin);
199 }
183 }
200
184
201− function showGreeter() {
185+ function showGreeter(shell) {
202 LightDM.Greeter.showGreeter();
186 LightDM.Greeter.showGreeter();
203 tryCompare(shell, "waitingOnGreeter", false);
187 tryCompare(shell, "waitingOnGreeter", false);
204 var coverPage = findChild(shell, "coverPage");
188 var coverPage = findChild(shell, "coverPage");
@@ -206,7 +190,7 @@ Item {
206 removeTimeConstraintsFromSwipeAreas(shell);
190 removeTimeConstraintsFromSwipeAreas(shell);
207 }
191 }
208
192
209− function confirmLockedApp(app) {
193+ function confirmLockedApp(app, shell) {
210 var greeter = findChild(shell, "greeter")
194 var greeter = findChild(shell, "greeter")
211 tryCompare(greeter, "shown", false)
195 tryCompare(greeter, "shown", false)
212 tryCompare(greeter, "hasLockedApp", true)
196 tryCompare(greeter, "hasLockedApp", true)
@@ -218,13 +202,14 @@ Item {
218 function test_greeterChangesIndicatorProfile() {
202 function test_greeterChangesIndicatorProfile() {
219 skip("Not supported yet, waiting on design for new settings panel");
203 skip("Not supported yet, waiting on design for new settings panel");
220
204
205+ var shell = createShell();
221 var panel = findChild(shell, "panel");
206 var panel = findChild(shell, "panel");
222 tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile + "_greeter");
207 tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile + "_greeter");
223
208
224 LightDM.Greeter.hideGreeter();
209 LightDM.Greeter.hideGreeter();
225 tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile);
210 tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile);
226
211
227− showGreeter();
212+ showGreeter(shell);
228 tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile + "_greeter");
213 tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile + "_greeter");
229
214
230 LightDM.Greeter.hideGreeter();
215 LightDM.Greeter.hideGreeter();
@@ -232,6 +217,7 @@ Item {
232 }
217 }
233
218
234 function test_login() {
219 function test_login() {
220+ var shell = createShell();
235 sessionSpy.clear()
221 sessionSpy.clear()
236 tryCompare(sessionSpy, "count", 0)
222 tryCompare(sessionSpy, "count", 0)
237 enterPin("1234")
223 enterPin("1234")
@@ -239,6 +225,7 @@ Item {
239 }
225 }
240
226
241 function test_disabledEdges() {
227 function test_disabledEdges() {
228+ var shell = createShell();
242 var launcher = findChild(shell, "launcher")
229 var launcher = findChild(shell, "launcher")
243 tryCompare(launcher, "available", true)
230 tryCompare(launcher, "available", true)
244 AccountsService.enableLauncherWhileLocked = false
231 AccountsService.enableLauncherWhileLocked = false
@@ -251,6 +238,7 @@ Item {
251 }
238 }
252
239
253 function test_emergencyCall() {
240 function test_emergencyCall() {
241+ var shell = createShell();
254 var greeter = findChild(shell, "greeter")
242 var greeter = findChild(shell, "greeter")
255 var panel = findChild(shell, "panel")
243 var panel = findChild(shell, "panel")
256 var indicators = findChild(shell, "indicators")
244 var indicators = findChild(shell, "indicators")
@@ -269,7 +257,7 @@ Item {
269
257
270 // Cancel emergency mode, and go back to normal
258 // Cancel emergency mode, and go back to normal
271 waitForRendering(greeter)
259 waitForRendering(greeter)
272− showGreeter()
260+ showGreeter(shell);
273
261
274 tryCompare(greeter, "shown", true)
262 tryCompare(greeter, "shown", true)
275 tryCompare(greeter, "lockedApp", "")
263 tryCompare(greeter, "lockedApp", "")
@@ -282,7 +270,7 @@ Item {
282 }
270 }
283
271
284 function test_emergencyCallCrash() {
272 function test_emergencyCallCrash() {
285− skip("Failing on Qt 5.12 with other tests skipped");
273+ var shell = createShell();
286 var dialerSurfaceId = topLevelSurfaceList.nextId;
274 var dialerSurfaceId = topLevelSurfaceList.nextId;
287 var greeter = findChild(shell, "greeter");
275 var greeter = findChild(shell, "greeter");
288 var emergencyButton = findChild(greeter, "emergencyCallLabel");
276 var emergencyButton = findChild(greeter, "emergencyCallLabel");
@@ -298,7 +286,7 @@ Item {
298 }
286 }
299
287
300 function test_emergencyCallAppLaunch() {
288 function test_emergencyCallAppLaunch() {
301− skip("Failing on Qt 5.12");
289+ var shell = createShell();
302 var greeter = findChild(shell, "greeter");
290 var greeter = findChild(shell, "greeter");
303 var emergencyButton = findChild(greeter, "emergencyCallLabel");
291 var emergencyButton = findChild(greeter, "emergencyCallLabel");
304 tap(emergencyButton)
292 tap(emergencyButton)
@@ -309,6 +297,7 @@ Item {
309 }
297 }
310
298
311 function test_emergencyCallPausesTutorial() {
299 function test_emergencyCallPausesTutorial() {
300+ var shell = createShell();
312 var greeter = findChild(shell, "greeter");
301 var greeter = findChild(shell, "greeter");
313 var tutorial = findChild(shell, "tutorial");
302 var tutorial = findChild(shell, "tutorial");
314
303
@@ -316,15 +305,16 @@ Item {
316 enterPin("1234");
305 enterPin("1234");
317 tryCompare(tutorial, "paused", false);
306 tryCompare(tutorial, "paused", false);
318
307
319− showGreeter();
308+ showGreeter(shell);
320 verify(tutorial.paused);
309 verify(tutorial.paused);
321
310
322− swipeAwayGreeter(true);
311+ swipeAwayGreeter(true, shell);
323 tap(findChild(greeter, "emergencyCallLabel"));
312 tap(findChild(greeter, "emergencyCallLabel"));
324 verify(tutorial.paused);
313 verify(tutorial.paused);
325 }
314 }
326
315
327 function test_failedLoginsCount() {
316 function test_failedLoginsCount() {
317+ var shell = createShell();
328 AccountsService.failedLogins = 0
318 AccountsService.failedLogins = 0
329
319
330 enterPin("1111")
320 enterPin("1111")
@@ -335,6 +325,7 @@ Item {
335 }
325 }
336
326
337 function test_wrongEntries() {
327 function test_wrongEntries() {
328+ var shell = createShell();
338 var greeter = findChild(shell, "greeter");
329 var greeter = findChild(shell, "greeter");
339 greeter.failedLoginsDelayAttempts = 3;
330 greeter.failedLoginsDelayAttempts = 3;
340
331
@@ -359,14 +350,14 @@ Item {
359 // dialer to a side stage and give access to other apps. So just
350 // dialer to a side stage and give access to other apps. So just
360 // confirm that such an attack doesn't work.
351 // confirm that such an attack doesn't work.
361
352
362− skip("Failing on Qt 5.12 with other tests skipped");
353+ var shell = createShell();
363 var stage = findChild(shell, "stage")
354 var stage = findChild(shell, "stage")
364
355
365 // We start in phone mode
356 // We start in phone mode
366 compare(stage.usageScenario, "phone");
357 compare(stage.usageScenario, "phone");
367
358
368 tap(findChild(shell, "emergencyCallLabel"));
359 tap(findChild(shell, "emergencyCallLabel"));
369− confirmLockedApp("dialer-app")
360+ confirmLockedApp("dialer-app", shell);
370
361
371 // OK, we're in. Now try (but fail) to switch to tablet mode
362 // OK, we're in. Now try (but fail) to switch to tablet mode
372 shell.usageScenario = "tablet";
363 shell.usageScenario = "tablet";
@@ -380,9 +371,9 @@ Item {
380 }
371 }
381
372
382 function test_emergencyDialerIncoming() {
373 function test_emergencyDialerIncoming() {
383− skip("Failing on Qt 5.12 with other tests skipped");
374+ var shell = createShell();
384 callManager.foregroundCall = phoneCall
375 callManager.foregroundCall = phoneCall
385− confirmLockedApp("dialer-app")
376+ confirmLockedApp("dialer-app", shell);
386 }
377 }
387
378
388 function test_emergencyDialerActiveCallPanel() {
379 function test_emergencyDialerActiveCallPanel() {
@@ -392,14 +383,14 @@ Item {
392 // - Click on active call panel
383 // - Click on active call panel
393 // - Should be back in emergency mode dialer
384 // - Should be back in emergency mode dialer
394
385
395− skip("Failing on Qt 5.12");
386+ var shell = createShell();
396 var greeter = findChild(shell, "greeter");
387 var greeter = findChild(shell, "greeter");
397
388
398 tap(findChild(shell, "emergencyCallLabel"));
389 tap(findChild(shell, "emergencyCallLabel"));
399− confirmLockedApp("dialer-app");
390+ confirmLockedApp("dialer-app", shell);
400 callManager.foregroundCall = phoneCall;
391 callManager.foregroundCall = phoneCall;
401
392
402− showGreeter();
393+ showGreeter(shell);
403 var lockscreen = findChild(shell, "lockscreen");
394 var lockscreen = findChild(shell, "lockscreen");
404 tryCompare(lockscreen, "shown", true);
395 tryCompare(lockscreen, "shown", true);
405 tryCompare(greeter, "hasLockedApp", false);
396 tryCompare(greeter, "hasLockedApp", false);
@@ -407,7 +398,7 @@ Item {
407 // simulate a callHint press, the real thing requires dialer: url support
398 // simulate a callHint press, the real thing requires dialer: url support
408 ApplicationManager.requestFocusApplication("dialer-app");
399 ApplicationManager.requestFocusApplication("dialer-app");
409
400
410− confirmLockedApp("dialer-app");
401+ confirmLockedApp("dialer-app", shell);
411 }
402 }
412
403
413 function test_normalDialerActiveCallPanel() {
404 function test_normalDialerActiveCallPanel() {
@@ -419,7 +410,7 @@ Item {
419 // - Should be back in normal dialer
410 // - Should be back in normal dialer
420 // (we've had a bug where we locked screen in this case)
411 // (we've had a bug where we locked screen in this case)
421
412
422− skip("Failing on Qt 5.12");
413+ var shell = createShell();
423 startApplication("gallery-app");
414 startApplication("gallery-app");
424
415
425 var greeter = findChild(shell, "greeter");
416 var greeter = findChild(shell, "greeter");
@@ -448,8 +439,8 @@ Item {
448 }
439 }
449
440
450 function test_focusRequestedHidesCoverPage() {
441 function test_focusRequestedHidesCoverPage() {
451− skip("Failing on Qt 5.12");
442+ var shell = createShell();
452− showGreeter();
443+ showGreeter(shell);
453
444
454 startApplication("gallery-app");
445 startApplication("gallery-app");
455
446
@@ -459,7 +450,7 @@ Item {
459 tryCompare(coverPage, "showProgress", 0);
450 tryCompare(coverPage, "showProgress", 0);
460 tryCompare(greeter, "fullyShown", true);
451 tryCompare(greeter, "fullyShown", true);
461
452
462− showGreeter();
453+ showGreeter(shell);
463
454
464 // Make sure focusing same app triggers same behavior
455 // Make sure focusing same app triggers same behavior
465 ApplicationManager.requestFocusApplication("gallery-app");
456 ApplicationManager.requestFocusApplication("gallery-app");
@@ -468,6 +459,7 @@ Item {
468 }
459 }
469
460
470 function test_suspend() {
461 function test_suspend() {
462+ var shell = createShell();
471 var greeter = findChild(shell, "greeter");
463 var greeter = findChild(shell, "greeter");
472 var stage = findChild(shell, "stage")
464 var stage = findChild(shell, "stage")
473
465
@@ -482,7 +474,7 @@ Item {
482 tryCompare(greeter, "fullyShown", true);
474 tryCompare(greeter, "fullyShown", true);
483
475
484 // Swipe away greeter to focus app
476 // Swipe away greeter to focus app
485− swipeAwayGreeter(true);
477+ swipeAwayGreeter(true, shell);
486
478
487 // We have a lockscreen, make sure we're still suspended
479 // We have a lockscreen, make sure we're still suspended
488 tryCompare(stage, "suspended", true);
480 tryCompare(stage, "suspended", true);
@@ -497,14 +489,7 @@ Item {
497 loaded, they would be able to get into the session before the
489 loaded, they would be able to get into the session before the
498 lockscreen appeared. Make sure that doesn't happen. */
490 lockscreen appeared. Make sure that doesn't happen. */
499 function test_earlyDisable() {
491 function test_earlyDisable() {
500− // Kill current shell
492+ var shell = createTemporaryObject(shellComponent, shellRect);
501− shellLoader.itemDestroyed = false;
502− shellLoader.active = false;
503− tryCompare(shellLoader, "itemDestroyed", true);
504−
505− // Create new shell
506− shellLoader.active = true;
507− tryCompareFunction(function() {return shell !== null}, true);
508
493
509 // Confirm that we start disabled
494 // Confirm that we start disabled
510 compare(LightDM.Prompts.count, 0);
495 compare(LightDM.Prompts.count, 0);
@@ -520,6 +505,7 @@ Item {
520 }
505 }
521
506
522 function test_bfbOnLockedDevice() {
507 function test_bfbOnLockedDevice() {
508+ var shell = createShell();
523 var launcher = findChild(shell, "launcher");
509 var launcher = findChild(shell, "launcher");
524 touchFlick(shell, units.gu(.5), shell.height / 2, units.gu(10), shell.height / 2);
510 touchFlick(shell, units.gu(.5), shell.height / 2, units.gu(10), shell.height / 2);
525
511
@@ -541,7 +527,7 @@ Item {
541 appear over the Greeter. This was caused by logic that would normally
527 appear over the Greeter. This was caused by logic that would normally
542 cause the Launcher to be shown over the empty Background. */
528 cause the Launcher to be shown over the empty Background. */
543 function test_launcherShowCulledWhenLocked() {
529 function test_launcherShowCulledWhenLocked() {
544− skip("Failing on Qt 5.12");
530+ var shell = createShell();
545 var launcher = findChild(shell, "launcher");
531 var launcher = findChild(shell, "launcher");
546
532
547 // Ensure the Launcher is sane
533 // Ensure the Launcher is sane