2
* Copyright 2015 Canonical Ltd.
4
* 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
* the Free Software Foundation; version 3.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU General Public License for more details.
13
* You should have received a copy of the GNU General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
20
import "../../../qml/Greeter"
21
import Ubuntu.Components 0.1
22
import AccountsService 0.1
23
import LightDM 0.1 as LightDM
24
import Unity.Test 0.1 as UT
30
property url defaultBackground: Qt.resolvedUrl("../../../qml/graphics/tablet_background.jpg")
32
Component.onCompleted: {
33
// set the mock mode before loading
34
LightDM.Greeter.mockMode = "full";
35
LightDM.Users.mockMode = "full";
45
property bool itemDestroyed: false
46
sourceComponent: Component {
50
background: defaultBackground
51
viewSource: Qt.resolvedUrl("TestView.qml")
53
Component.onDestruction: {
54
loader.itemDestroyed = true;
69
signalName: "sessionStarted"
75
signalName: "emergencyCall"
83
property Item greeter: loader.status === Loader.Ready ? loader.item : null
87
id: viewShowMessageSpy
89
signalName: "_showMessageCalled"
95
signalName: "_showPromptCalled"
99
id: viewShowLastChanceSpy
100
target: testCase.view
101
signalName: "_showLastChanceCalled"
106
target: testCase.view
107
signalName: "_hideCalled"
111
id: viewAuthenticationSucceededSpy
112
target: testCase.view
113
signalName: "_notifyAuthenticationSucceededCalled"
117
id: viewAuthenticationFailedSpy
118
target: testCase.view
119
signalName: "_notifyAuthenticationFailedCalled"
124
target: testCase.view
125
signalName: "_resetCalled"
129
id: viewTryToUnlockSpy
130
target: testCase.view
131
signalName: "_tryToUnlockCalled"
136
sessionStartedSpy.clear();
137
emergencyCallSpy.clear();
138
viewShowMessageSpy.clear();
139
viewShowPromptSpy.clear();
140
viewShowLastChanceSpy.clear();
142
viewAuthenticationSucceededSpy.clear();
143
viewAuthenticationFailedSpy.clear();
144
viewResetSpy.clear();
145
viewTryToUnlockSpy.clear();
146
tryCompare(greeter, "waiting", false);
147
view = findChild(greeter, "testView");
148
verifySelected(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
152
loader.itemDestroyed = false;
153
loader.active = false;
154
tryCompare(loader, "status", Loader.Null);
155
tryCompare(loader, "item", null);
156
tryCompare(loader, "itemDestroyed", true);
157
loader.active = true;
158
tryCompare(loader, "status", Loader.Ready);
159
removeTimeConstraintsFromDirectionalDragAreas(loader.item);
162
function getIndexOf(name) {
163
for (var i = 0; i < LightDM.Users.count; i++) {
164
if (name === LightDM.Users.data(i, LightDM.UserRoles.NameRole)) {
168
fail("Didn't find name")
172
function selectUser(name) {
173
var i = getIndexOf(name);
175
verifySelected(name);
179
function verifySelected(name) {
180
var i = getIndexOf(name);
181
compare(view.currentIndex, i);
182
compare(AccountsService.user, name);
183
compare(LightDM.Greeter.authenticationUser, name);
186
function verifyLoggedIn() {
187
tryCompare(sessionStartedSpy, "count", 1);
188
verify(viewAuthenticationSucceededSpy.count > 0);
189
compare(LightDM.Greeter.authenticated, true);
190
compare(greeter.shown, false);
193
function test_unlockPass() {
194
selectUser("has-password");
195
tryCompare(viewShowPromptSpy, "count", 1);
196
compare(viewShowPromptSpy.signalArguments[0][0], "Password");
197
compare(viewShowPromptSpy.signalArguments[0][1], true);
198
compare(viewShowPromptSpy.signalArguments[0][2], true);
200
view.responded("password");
204
function test_unlockFail() {
205
selectUser("has-password");
206
tryCompare(viewShowPromptSpy, "count", 1);
207
compare(viewShowPromptSpy.signalArguments[0][0], "Password");
208
compare(viewShowPromptSpy.signalArguments[0][1], true);
209
compare(viewShowPromptSpy.signalArguments[0][2], true);
211
view.responded("wr0ng p4ssw0rd");
212
tryCompare(viewAuthenticationFailedSpy, "count", 1);
214
tryCompare(viewShowPromptSpy, "count", 2);
215
compare(viewShowPromptSpy.signalArguments[0][0], "Password");
216
compare(viewShowPromptSpy.signalArguments[0][1], true);
217
compare(viewShowPromptSpy.signalArguments[0][2], true);
220
function test_promptless() {
221
selectUser("no-password");
222
tryCompare(viewAuthenticationSucceededSpy, "count", 1);
223
compare(sessionStartedSpy.count, 1);
224
compare(viewShowPromptSpy.count, 0);
225
compare(viewHideSpy.count, 0);
226
compare(view.locked, false);
229
function test_twoFactorPass() {
230
selectUser("two-factor");
231
tryCompare(viewShowPromptSpy, "count", 1);
232
compare(viewShowPromptSpy.signalArguments[0][0], "Password");
233
compare(viewShowPromptSpy.signalArguments[0][1], true);
234
compare(viewShowPromptSpy.signalArguments[0][2], true);
236
view.responded("password");
237
tryCompare(viewShowPromptSpy, "count", 2);
238
compare(viewShowPromptSpy.signalArguments[1][0], "otp");
239
compare(viewShowPromptSpy.signalArguments[1][1], false);
240
compare(viewShowPromptSpy.signalArguments[1][2], false);
242
view.responded("otp");
246
function test_twoFactorFailOnFirst() {
247
selectUser("two-factor");
248
tryCompare(viewShowPromptSpy, "count", 1);
249
compare(viewShowPromptSpy.signalArguments[0][0], "Password");
250
compare(viewShowPromptSpy.signalArguments[0][1], true);
251
compare(viewShowPromptSpy.signalArguments[0][2], true);
253
view.responded("wr0ng p4ssw0rd");
254
tryCompare(viewAuthenticationFailedSpy, "count", 1);
256
tryCompare(viewShowPromptSpy, "count", 2);
257
compare(viewShowPromptSpy.signalArguments[0][0], "Password");
258
compare(viewShowPromptSpy.signalArguments[0][1], true);
259
compare(viewShowPromptSpy.signalArguments[0][2], true);
262
function test_twoFactorFailOnSecond() {
263
selectUser("two-factor");
264
tryCompare(viewShowPromptSpy, "count", 1);
265
compare(viewShowPromptSpy.signalArguments[0][0], "Password");
266
compare(viewShowPromptSpy.signalArguments[0][1], true);
267
compare(viewShowPromptSpy.signalArguments[0][2], true);
269
view.responded("password");
270
tryCompare(viewShowPromptSpy, "count", 2);
271
compare(viewShowPromptSpy.signalArguments[1][0], "otp");
272
compare(viewShowPromptSpy.signalArguments[1][1], false);
273
compare(viewShowPromptSpy.signalArguments[1][2], false);
275
view.responded("wr0ng p4ssw0rd");
276
tryCompare(viewAuthenticationFailedSpy, "count", 1);
278
tryCompare(viewShowPromptSpy, "count", 3);
279
compare(viewShowPromptSpy.signalArguments[0][0], "Password");
280
compare(viewShowPromptSpy.signalArguments[0][1], true);
281
compare(viewShowPromptSpy.signalArguments[0][2], true);
284
function test_htmlInfoPrompt() {
285
selectUser("html-info-prompt");
286
tryCompare(viewShowPromptSpy, "count", 1);
287
compare(viewShowMessageSpy.count, 1);
288
compare(viewShowMessageSpy.signalArguments[0][0], "<b>&</b>");
291
function test_multiInfoPrompt() {
292
selectUser("multi-info-prompt");
293
tryCompare(viewShowPromptSpy, "count", 1);
294
compare(viewShowMessageSpy.count, 3);
295
compare(viewShowMessageSpy.signalArguments[0][0], "Welcome to Unity Greeter");
296
compare(viewShowMessageSpy.signalArguments[1][0], "<font color=\"#df382c\">This is an error</font>");
297
compare(viewShowMessageSpy.signalArguments[2][0], "You should have seen three messages");
300
function test_waiting() {
301
// Make sure we unset 'waiting' on prompt
302
selectUser("has-password");
303
compare(greeter.waiting, true);
304
tryCompare(greeter, "waiting", false);
306
// Make sure we unset 'waiting' on authentication
307
selectUser("no-password");
308
compare(greeter.waiting, true);
309
tryCompare(greeter, "waiting", false);
312
function test_locked() {
313
selectUser("has-password");
314
compare(view.locked, true);
316
LightDM.Greeter.active = false;
317
compare(view.locked, false);
318
LightDM.Greeter.active = true;
320
greeter.forcedUnlock = true;
321
compare(view.locked, false);
322
greeter.forcedUnlock = false;
324
selectUser("no-password");
325
tryCompare(view, "locked", false);
326
selectUser("has-password");
329
function test_fullyShown() {
330
compare(greeter.fullyShown, true);
332
compare(greeter.fullyShown, false);
335
function test_alphanumeric() {
336
selectUser("has-password");
337
compare(view.alphanumeric, true);
338
selectUser("has-pin");
339
compare(view.alphanumeric, false);
342
function test_background() {
343
greeter.background = "testing";
344
compare(view.background, Qt.resolvedUrl("testing"));
347
function test_notifyAboutToFocusApp() {
348
greeter.notifyAboutToFocusApp("fake-app");
349
compare(viewTryToUnlockSpy.count, 1);
350
compare(viewTryToUnlockSpy.signalArguments[0][0], false);
353
function test_notifyShowingDashFromDrag() {
354
compare(greeter.notifyShowingDashFromDrag("fake-app"), true);
355
compare(viewTryToUnlockSpy.count, 1);
356
compare(viewTryToUnlockSpy.signalArguments[0][0], true);
359
function test_dragHandleLeftMargin() {
360
compare(view.dragHandleLeftMargin, 0);
361
greeter.dragHandleLeftMargin = 5;
362
compare(view.dragHandleLeftMargin, 5);
365
function test_launcherOffset() {
366
compare(view.launcherOffset, 0);
367
greeter.launcherOffset = 5;
368
tryCompare(view, "launcherOffset", 5);
371
function test_laucherOffsetAnimation() {
372
// Our logic for smoothing launcherOffset when it suddenly goes to
373
// zero is a bit complicated. Let's just make sure it works here.
375
launcherOffsetWatcher.target = view;
377
// should follow immediately
378
launcherOffsetWatcher.values = [];
379
greeter.launcherOffset = 100;
380
compare(view.launcherOffset, 100);
381
compare(launcherOffsetWatcher.values.length, 1);
383
// should interpolate values until it reaches 0
384
launcherOffsetWatcher.values = [];
385
greeter.launcherOffset = 0;
386
tryCompare(view, "launcherOffset", 0);
387
verify(launcherOffsetWatcher.values.length > 1);
388
for (var i = 0; i < launcherOffsetWatcher.values.length - 1; ++i) {
389
verify(launcherOffsetWatcher.values[i] > 0.0);
390
verify(launcherOffsetWatcher.values[i] < 100.0);
394
id: launcherOffsetWatcher
395
property var values: []
396
onLauncherOffsetChanged: {
397
values.push(target.launcherOffset);
401
function test_backgroundTopMargin() {
402
compare(view.backgroundTopMargin, 0);
404
compare(view.backgroundTopMargin, -5);
407
function test_differentPrompt() {
408
selectUser("different-prompt");
409
tryCompare(viewShowPromptSpy, "count", 1);
410
compare(viewShowPromptSpy.signalArguments[0][0], "Secret word");
411
compare(viewShowPromptSpy.signalArguments[0][1], true);
412
compare(viewShowPromptSpy.signalArguments[0][2], false);
415
function test_authError() {
416
selectUser("auth-error");
417
tryCompare(viewAuthenticationFailedSpy, "count", 1);
418
compare(viewShowPromptSpy.count, 0);
419
compare(view.locked, true);
422
function test_statsWelcomeScreen() {
423
// Test logic in greeter that turns statsWelcomeScreen setting into infographic changes
424
selectUser("has-password");
425
compare(LightDM.Infographic.username, "has-password");
426
AccountsService.statsWelcomeScreen = false;
427
compare(LightDM.Infographic.username, "");
428
AccountsService.statsWelcomeScreen = true;
429
compare(LightDM.Infographic.username, "has-password");
432
function test_dbusRequestAuthenticationUser() {
433
selectUser("no-password");
434
LightDM.Greeter.requestAuthenticationUser("has-password");
435
verifySelected("has-password");
438
function test_dbusHideGreeter() {
439
compare(view.required, true);
440
LightDM.Greeter.hideGreeter();
441
compare(view.required, false);
442
compare(greeter.required, false);
445
function test_dbusShowGreeterFromHiddenState() {
447
compare(greeter.required, false);
449
LightDM.Greeter.showGreeter();
450
compare(greeter.required, true);
451
compare(greeter.fullyShown, true);
452
view = findChild(greeter, "testView");
453
compare(view.required, true);
455
// Can't test some of the stuff called on 'view' here because
456
// the view was torn down and created again. So the spies missed
457
// the good stuff while it down. See next test for more.
460
function test_dbusShowGreeterFromShownState() {
461
selectUser("has-password");
462
compare(viewResetSpy.count, 1);
463
tryCompare(viewShowPromptSpy, "count", 1);
465
viewResetSpy.clear();
466
viewShowPromptSpy.clear();
468
LightDM.Greeter.showGreeter();
469
compare(viewResetSpy.count, 1);