@@ -18,7 +18,8 @@ import QtQuick 2.4
18import QtTest 1.0
18import QtTest 1.0
19import ".."
19import ".."
20import "../../../qml/Greeter"
20import "../../../qml/Greeter"
21+import LightDMController 0.1
21−import LightDM.IntegratedLightDM 0.1 as LightDM
22+import LightDM.FullLightDM 0.1 as LightDM
22import Ubuntu.Components 1.3
23import Ubuntu.Components 1.3
23import Unity.Test 0.1 as UT
24import Unity.Test 0.1 as UT
@@ -31,12 +32,6 @@ StyledItem {
32 theme.name: "Ubuntu.Components.Themes.SuruDark"
33 theme.name: "Ubuntu.Components.Themes.SuruDark"
35− target: LightDM.Users
41 anchors.fill: parent
36 anchors.fill: parent
@@ -115,28 +110,16 @@ StyledItem {
116 anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
111 anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
117 spacing: units.gu(1)
112 spacing: units.gu(1)
120− text: "Show Last Chance"
121− onClicked: loader.item.showLastChance()
126 text: "Hide"
115 text: "Hide"
127 onClicked: loader.item.hide()
116 onClicked: loader.item.hide()
133− onClicked: loader.item.reset()
138 text: "Show Message"
121 text: "Show Message"
139− onClicked: loader.item.showMessage(messageField.text)
122+ onClicked: LightDMService.prompts.append(messageField.text, LightDMService.prompts.Message)
141 TextField {
124 TextField {
142 id: messageField
125 id: messageField
@@ -147,7 +130,7 @@ StyledItem {
149 text: "Show Prompt"
132 text: "Show Prompt"
150− onClicked: loader.item.showPrompt(promptField.text, isSecretCheckBox.checked, isDefaultPromptCheckBox.checked)
133+ onClicked: LightDMService.prompts.append(promptField.text, isSecretCheckBox.checked ? LightDMService.prompts.Secret : LightDMService.prompts.Question)
152 TextField {
135 TextField {
153 id: promptField
136 id: promptField
@@ -160,30 +143,14 @@ StyledItem {
161 text: "secret"
144 text: "secret"
164− id: isDefaultPromptCheckBox
172− text: "Authenticated"
149+ text: "Notify Auth Failure"
173 onClicked: {
150 onClicked: {
174− if (successCheckBox.checked) {
175− loader.item.notifyAuthenticationSucceeded(false);
177− loader.item.notifyAuthenticationFailed();
151+ loader.item.notifyAuthenticationFailed();
@@ -271,15 +238,15 @@ StyledItem {
271 id: multipleSessionsCheckbox
238 id: multipleSessionsCheckbox
272 onClicked: {
239 onClicked: {
273 if (checked) {
240 if (checked) {
274− LightDM.Sessions.testScenario = "multipleSessions"
241+ LightDMController.sessionMode = "full";
276− LightDM.Sessions.testScenario = "singleSession"
243+ LightDMController.sessionMode = "single";
279 Connections {
246 Connections {
280− target: LightDM.Sessions
247+ target: LightDMController
281− onTestScenarioChanged: {
248+ onSessionModeChanged: {
282− if (LightDM.Sessions.testScenario === "multipleSessions") {
249+ if (LightDMController.sessionMode === "full") {
283 multipleSessionsCheckbox.checked = true;
250 multipleSessionsCheckbox.checked = true;
285 multipleSessionsCheckbox.checked = false;
252 multipleSessionsCheckbox.checked = false;
@@ -297,11 +264,11 @@ StyledItem {
298 width: units.gu(10)
265 width: units.gu(10)
299 minimumValue: 0
266 minimumValue: 0
300− maximumValue: LightDM.Sessions.numAvailableSessions
267+ maximumValue: LightDMController.numAvailableSessions
301− value: LightDM.Sessions.numSessions
268+ value: LightDMController.numSessions
302− visible: LightDM.Sessions.testScenario === "multipleSessions"
269+ visible: LightDMController.sessionMode === "full"
303 Binding {
270 Binding {
304− target: LightDM.Sessions
271+ target: LightDMController
305 property: "numSessions"
272 property: "numSessions"
306 value: numSessionsSlider.value
273 value: numSessionsSlider.value
@@ -364,11 +331,17 @@ StyledItem {
365 function init() {
332 function init() {
366 selectIndex(0); // break binding with text field
333 selectIndex(0); // break binding with text field
334+ tryCompare(LightDMService.prompts, "count", 1);
367 selectedSpy.clear();
335 selectedSpy.clear();
368 respondedSpy.clear();
336 respondedSpy.clear();
369 teaseSpy.clear();
337 teaseSpy.clear();
370 emergencySpy.clear();
338 emergencySpy.clear();
371− LightDM.Sessions.testScenario = "multipleSessions"
339+ LightDMController.reset();
340+ LightDM.Sessions.iconSearchDirectories = [testIconDirectory];
342+ waitForRendering(view);
343+ var userList = findChild(view, "userList");
344+ tryCompare(userList, "movingInternally", false);
374 function cleanup() {
347 function cleanup() {
@@ -395,8 +368,14 @@ StyledItem {
397 function selectIndex(i) {
370 function selectIndex(i) {
398− view.currentIndex = i;
371+ var user = LightDM.Users.data(i, LightDM.UserRoles.NameRole);
372+ LightDM.Greeter.authenticate(user);
399 var userList = findChild(view, "userList");
374 var userList = findChild(view, "userList");
375+ var promptList = findChild(view, "promptList");
377+ view.currentIndex = i;
378+ tryCompare(promptList, "opacity", 1);
400 tryCompare(userList, "movingInternally", false);
379 tryCompare(userList, "movingInternally", false);
@@ -415,6 +394,19 @@ StyledItem {
415 waitForRendering(view);
394 waitForRendering(view);
397+ function test_changingSessionSticksToUser() {
398+ var loginList = findChild(view, "loginList");
400+ selectUser("invalid-session");
401+ tryCompare(loginList, "currentSession", "invalid");
403+ selectUser("has-password");
404+ tryCompare(loginList, "currentSession", "ubuntu");
406+ selectUser("invalid-session")
407+ tryCompare(loginList, "currentSession", "invalid");
418 function test_tease_data() {
410 function test_tease_data() {
420 {tag: "locked", x: 0, offset: 0, count: 0, locked: true},
412 {tag: "locked", x: 0, offset: 0, count: 0, locked: true},
@@ -426,10 +418,6 @@ StyledItem {
428 function test_sessionIconsAreValid() {
420 function test_sessionIconsAreValid() {
429− LightDM.Sessions.testScenario = "multipleSessions"
430− var originalDirectories = LightDM.Sessions.iconSearchDirectories
431− LightDM.Sessions.iconSearchDirectories = [testIconDirectory]
433 selectUser("has-password");
421 selectUser("has-password");
435 // Test the login list icon is valid
423 // Test the login list icon is valid
@@ -449,12 +437,10 @@ StyledItem {
450 function test_choosingNewSessionChangesLoginListIcon() {
438 function test_choosingNewSessionChangesLoginListIcon() {
451 // Ensure the default session is selected (Ubuntu)
439 // Ensure the default session is selected (Ubuntu)
452− loader.active = false;
440+ cleanup();
453− loader.active = true;
455 selectUser("has-password");
442 selectUser("has-password");
457− LightDM.Sessions.testScenario = "multipleSessions";
458 var sessionChooserButton = findChild(view, "sessionChooserButton");
444 var sessionChooserButton = findChild(view, "sessionChooserButton");
459 var icon = String(sessionChooserButton.icon);
445 var icon = String(sessionChooserButton.icon);
460 compare(icon.indexOf("ubuntu") > -1, true);
446 compare(icon.indexOf("ubuntu") > -1, true);
@@ -465,25 +451,25 @@ StyledItem {
465 var currentDelegate = findChild(view, delegateName);
451 var currentDelegate = findChild(view, delegateName);
466 var sessionKey = LightDM.Sessions.data(i,LightDM.SessionRoles.KeyRole);
452 var sessionKey = LightDM.Sessions.data(i,LightDM.SessionRoles.KeyRole);
467 if (sessionKey === "gnome-classic") {
453 if (sessionKey === "gnome-classic") {
454+ waitForRendering(currentDelegate);
468 tap(currentDelegate);
455 tap(currentDelegate);
469− var sessionChooserButton = findChild(view, "sessionChooserButton");
470 waitForRendering(sessionChooserButton);
456 waitForRendering(sessionChooserButton);
471− var icon = String(sessionChooserButton.icon);
461+ icon = String(sessionChooserButton.icon);
476 compare(icon.indexOf("gnome") > -1, true,
462 compare(icon.indexOf("gnome") > -1, true,
477 "Expected icon to contain gnome but it was " + icon);
463 "Expected icon to contain gnome but it was " + icon);
480 function test_noSessionsDoesntBreakView() {
466 function test_noSessionsDoesntBreakView() {
481− LightDM.Sessions.testScenario = "noSessions"
467+ LightDMController.sessionMode = "none";
482 compare(LightDM.Sessions.count, 0)
468 compare(LightDM.Sessions.count, 0)
485 function test_sessionIconNotShownWithOneSession() {
471 function test_sessionIconNotShownWithOneSession() {
486− LightDM.Sessions.testScenario = "singleSession"
472+ LightDMController.sessionMode = "single";
487 compare(LightDM.Sessions.count, 1);
473 compare(LightDM.Sessions.count, 1);
489 var sessionChooserButton = findChild(view, "sessionChooserButton");
475 var sessionChooserButton = findChild(view, "sessionChooserButton");
@@ -491,9 +477,6 @@ StyledItem {
493 function test_sessionIconNotShownWithActiveUser() {
479 function test_sessionIconNotShownWithActiveUser() {
494− LightDM.Sessions.testScenario = "multipleSessions";
495− compare(LightDM.Sessions.count > 1, true);
497 selectUser("active");
480 selectUser("active");
499 var sessionChooserButton = findChild(view, "sessionChooserButton");
482 var sessionChooserButton = findChild(view, "sessionChooserButton");
@@ -501,9 +484,6 @@ StyledItem {
503 function test_sessionIconShownWithMultipleSessions() {
486 function test_sessionIconShownWithMultipleSessions() {
504− LightDM.Sessions.testScenario = "multipleSessions"
505− compare(LightDM.Sessions.count > 1, true);
507 selectUser("has-password");
487 selectUser("has-password");
509 var sessionChooserButton = findChild(view, "sessionChooserButton");
489 var sessionChooserButton = findChild(view, "sessionChooserButton");
@@ -537,12 +517,9 @@ StyledItem {
539 function test_respondedWithPassword() {
519 function test_respondedWithPassword() {
540− view.locked = true;
520+ selectUser("has-password");
541− view.showPrompt("Prompt", true, false);
521+ var greeterPrompt = findChild(view, "greeterPrompt0");
542− var passwordInput = findChild(view, "passwordInput");
543− compare(passwordInput.text, "Prompt");
544− verify(passwordInput.isSecret);
522+ verify(greeterPrompt.isSecret);
546 typeString("password");
523 typeString("password");
547 keyClick(Qt.Key_Enter);
524 keyClick(Qt.Key_Enter);
548 compare(respondedSpy.count, 1);
525 compare(respondedSpy.count, 1);
@@ -550,12 +527,9 @@ StyledItem {
552 function test_respondedWithNonSecret() {
529 function test_respondedWithNonSecret() {
553− view.locked = true;
530+ selectUser("question-prompt");
554− view.showPrompt("otp", false, false);
531+ var greeterPrompt = findChild(view, "greeterPrompt0");
555− var passwordInput = findChild(view, "passwordInput");
556− compare(passwordInput.text, "otp");
557− verify(!passwordInput.isSecret);
532+ verify(!greeterPrompt.isSecret);
559 typeString("foo");
533 typeString("foo");
560 keyClick(Qt.Key_Enter);
534 keyClick(Qt.Key_Enter);
561 compare(respondedSpy.count, 1);
535 compare(respondedSpy.count, 1);
@@ -580,24 +554,47 @@ StyledItem {
580 tryCompare(view, "required", false);
554 tryCompare(view, "required", false);
583− function test_showMessage() {
557+ function test_infoPrompt() {
584− view.showMessage("Welcome to Unity Greeter");
558+ selectUser("info-prompt");
585− view.showMessage("<font color=\"#df382c\">This is an error</font>");
559+
586− view.showMessage("You should have seen three messages and this is a really long message too. wow so long much length");
587− var infoLabel = findChild(view, "infoLabel");
560+ var infoLabel = findChild(view, "infoLabel0");
588− compare(infoLabel.text, "Welcome to Unity Greeter<br><font color=\"#df382c\">This is an error</font><br>You should have seen three messages and this is a really long message too. wow so long much length");
561+ compare(infoLabel.text, "Welcome to Unity Greeter");
589− compare(infoLabel.textFormat, Text.StyledText);
562+ compare(infoLabel.textFormat, Text.PlainText);
564+ verify(findChild(view, "greeterPrompt1") != null);
567+ function test_longInfoPrompt() {
568+ selectUser("long-info-prompt");
570+ var infoLabel = findChild(view, "infoLabel0");
571+ compare(infoLabel.text, "Welcome to Unity Greeter\n\nWe like to annoy you with super ridiculously long messages.\nLike this one\n\nThis is the last line of a multiple line message.");
590 verify(infoLabel.contentWidth > infoLabel.width);
572 verify(infoLabel.contentWidth > infoLabel.width);
591− verify(infoLabel.opacity < 1);
573+
592− tryCompare(infoLabel, "opacity", 1);
574+ verify(findChild(view, "greeterPrompt1") != null);
577+ function test_multiInfoPrompt() {
578+ selectUser("multi-info-prompt");
580+ var infoLabel0 = findChild(view, "infoLabel0");
581+ compare(infoLabel0.text, "Welcome to Unity Greeter");
583+ var infoLabel1 = findChild(view, "infoLabel1");
584+ compare(infoLabel1.text, "This is an error");
585+ compare(infoLabel1.color, theme.palette.normal.negative);
587+ var infoLabel2 = findChild(view, "infoLabel2");
588+ compare(infoLabel2.text, "You should have seen three messages");
590+ verify(findChild(view, "greeterPrompt3") != null);
595 // Escape is used to reset the authentication, especially if PAM is unresponsive
593 // Escape is used to reset the authentication, especially if PAM is unresponsive
596 function test_escape() {
594 function test_escape() {
597− selectIndex(1);
595+ var index = selectUser("has-password");
598 selectedSpy.clear();
596 selectedSpy.clear();
599 view.locked = true;
597 view.locked = true;
600− view.showPrompt("Prompt", true, true);
601 var promptField = findChild(view, "promptField");
598 var promptField = findChild(view, "promptField");
602 tap(promptField);
599 tap(promptField);
603 verify(promptField.activeFocus);
600 verify(promptField.activeFocus);
@@ -611,9 +608,10 @@ StyledItem {
611 compare(selectedSpy.count, 0);
608 compare(selectedSpy.count, 0);
612 keyClick(Qt.Key_Escape);
609 keyClick(Qt.Key_Escape);
613 compare(selectedSpy.count, 1);
610 compare(selectedSpy.count, 1);
614− compare(selectedSpy.signalArguments[0][0], 1);
611+ compare(selectedSpy.signalArguments[0][0], index);
616− view.reset();
613+ selectIndex(index);
614+ var promptField = findChild(view, "promptField");
617 verify(promptField.activeFocus);
615 verify(promptField.activeFocus);
618 compare(promptField.opacity, 1);
616 compare(promptField.opacity, 1);
@@ -624,21 +622,22 @@ StyledItem {
624 tryCompare(label, "text", "가나다라마");
622 tryCompare(label, "text", "가나다라마");
627− function test_promptless() {
625+ function test_authError() {
628− var passwordInput = findChild(view, "passwordInput");
626+ var index = selectUser("auth-error");
629−
627+ var greeterPrompt = findChild(view, "greeterPrompt1"); // after error message
630 view.locked = true;
628 view.locked = true;
631− compare(passwordInput.text, "Retry");
629+ compare(greeterPrompt.text, "Retry");
632− tap(passwordInput);
630+ tap(greeterPrompt);
633 compare(respondedSpy.count, 0);
631 compare(respondedSpy.count, 0);
634 compare(selectedSpy.count, 1);
632 compare(selectedSpy.count, 1);
635− compare(selectedSpy.signalArguments[0][0], 0);
633+ compare(selectedSpy.signalArguments[0][0], index);
636− selectedSpy.clear();
634+ }
638− view.reset();
636+ function test_noPassword() {
639− view.locked = false;
637+ selectUser("no-password");
638+ var greeterPrompt = findChild(view, "greeterPrompt0");
640− compare(passwordInput.text, "Log In");
639+ compare(greeterPrompt.text, "Log In");
641− tap(passwordInput);
640+ tap(greeterPrompt);
642 compare(selectedSpy.count, 0);
641 compare(selectedSpy.count, 0);
643 compare(respondedSpy.count, 1);
642 compare(respondedSpy.count, 1);
644 compare(respondedSpy.signalArguments[0][0], "");
643 compare(respondedSpy.signalArguments[0][0], "");
@@ -670,8 +669,8 @@ StyledItem {
672 function test_passphrase() {
671 function test_passphrase() {
672+ var index = selectUser("has-password");
673 var promptField = findChild(view, "promptField");
673 var promptField = findChild(view, "promptField");
674− view.showPrompt("", true, true);
676 verify(view.alphanumeric);
675 verify(view.alphanumeric);
677 compare(promptField.inputMethodHints & Qt.ImhDigitsOnly, 0);
676 compare(promptField.inputMethodHints & Qt.ImhDigitsOnly, 0);
@@ -681,8 +680,8 @@ StyledItem {
683 function test_passcode() {
682 function test_passcode() {
683+ var index = selectUser("has-pin");
684 var promptField = findChild(view, "promptField");
684 var promptField = findChild(view, "promptField");
685− view.showPrompt("", true, true);
687 view.alphanumeric = false;
686 view.alphanumeric = false;
688 compare(promptField.inputMethodHints & Qt.ImhDigitsOnly, Qt.ImhDigitsOnly);
687 compare(promptField.inputMethodHints & Qt.ImhDigitsOnly, Qt.ImhDigitsOnly);
@@ -704,54 +703,59 @@ StyledItem {
705 function test_loginListMovement_data() {
704 function test_loginListMovement_data() {
707− {tag: "up", key: Qt.Key_Up, result: -1},
706+ {tag: "up", key: Qt.Key_Up, result: 1},
708− {tag: "down", key: Qt.Key_Down, result: 1},
707+ {tag: "down", key: Qt.Key_Down, result: 3},
712 function test_loginListMovement(data) {
711 function test_loginListMovement(data) {
713+ selectedSpy.clear();
713 keyClick(data.key);
715 keyClick(data.key);
714 compare(selectedSpy.count, 1);
716 compare(selectedSpy.count, 1);
715 compare(selectedSpy.signalArguments[0][0], data.result);
717 compare(selectedSpy.signalArguments[0][0], data.result);
718 function test_focusStaysActive() {
720 function test_focusStaysActive() {
719− var promptField = findChild(view, "promptField");
721+ selectUser("no-password");
720− var promptButton = findChild(view, "promptButton");
722+ var greeterPrompt = findChild(view, "greeterPrompt0");
722− verify(promptButton.activeFocus);
723+ verify(greeterPrompt.activeFocus);
723 keyClick(Qt.Key_Enter);
724 keyClick(Qt.Key_Enter);
724 compare(selectedSpy.count, 0);
725 compare(selectedSpy.count, 0);
725 compare(respondedSpy.count, 1);
726 compare(respondedSpy.count, 1);
726 compare(respondedSpy.signalArguments[0][0], "");
727 compare(respondedSpy.signalArguments[0][0], "");
727− verify(promptButton.activeFocus);
728+ verify(greeterPrompt.activeFocus);
728 keyClick(Qt.Key_Enter);
729 keyClick(Qt.Key_Enter);
729 compare(respondedSpy.count, 1);
730 compare(respondedSpy.count, 1);
731− view.showPrompt("", true, true);
732+ selectUser("has-password");
733+ var greeterPrompt = findChild(view, "greeterPrompt0");
732− verify(promptField.activeFocus);
734+ verify(greeterPrompt.activeFocus);
733 keyClick(Qt.Key_D);
735 keyClick(Qt.Key_D);
734 keyClick(Qt.Key_Enter);
736 keyClick(Qt.Key_Enter);
735 compare(selectedSpy.count, 0);
737 compare(selectedSpy.count, 0);
736 compare(respondedSpy.count, 2);
738 compare(respondedSpy.count, 2);
737 compare(respondedSpy.signalArguments[1][0], "d");
739 compare(respondedSpy.signalArguments[1][0], "d");
738− verify(promptField.activeFocus);
740+ verify(greeterPrompt.activeFocus);
739 keyClick(Qt.Key_Enter);
741 keyClick(Qt.Key_Enter);
740 compare(respondedSpy.count, 2);
742 compare(respondedSpy.count, 2);
742− view.reset();
744+ var index = selectUser("no-password");
745+ var greeterPrompt = findChild(view, "greeterPrompt0");
743 view.locked = true;
746 view.locked = true;
744− verify(promptButton.activeFocus);
747+ verify(greeterPrompt.activeFocus);
745 keyClick(Qt.Key_Enter);
748 keyClick(Qt.Key_Enter);
746 compare(respondedSpy.count, 2);
749 compare(respondedSpy.count, 2);
747 compare(selectedSpy.count, 1);
750 compare(selectedSpy.count, 1);
748− compare(selectedSpy.signalArguments[0][0], 0);
751+ compare(selectedSpy.signalArguments[0][0], index);
749− verify(promptButton.activeFocus);
752+ verify(greeterPrompt.activeFocus);
750 keyClick(Qt.Key_Enter);
753 keyClick(Qt.Key_Enter);
751 compare(selectedSpy.count, 1);
754 compare(selectedSpy.count, 1);
753− view.showPrompt("", true, true);
756+ selectUser("no-password");
757+ var greeterPrompt = findChild(view, "greeterPrompt0");
754− verify(promptField.activeFocus);
758+ verify(greeterPrompt.activeFocus);