@@ -18,7 +18,8 @@ import QtQuick 2.4
1818import QtTest 1.0
1919import ".."
2020import "../../../qml/Greeter"
21−import LightDM.IntegratedLightDM 0.1 as LightDM
21+import LightDMController 0.1
22+import LightDM.FullLightDM 0.1 as LightDM
2223import Ubuntu.Components 1.3
2324import Unity.Test 0.1 as UT
2425
@@ -31,12 +32,6 @@ StyledItem {
3132
3233 theme.name: "Ubuntu.Components.Themes.SuruDark"
3334
34− Binding {
35− target: LightDM.Users
36− property: "mockMode"
37− value: "full"
38− }
39−
4035 Row {
4136 anchors.fill: parent
4237 Loader {
@@ -115,28 +110,16 @@ StyledItem {
115110 Column {
116111 anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
117112 spacing: units.gu(1)
118− Row {
119− Button {
120− text: "Show Last Chance"
121− onClicked: loader.item.showLastChance()
122− }
123− }
124113 Row {
125114 Button {
126115 text: "Hide"
127116 onClicked: loader.item.hide()
128117 }
129118 }
130− Row {
131− Button {
132− text: "Reset"
133− onClicked: loader.item.reset()
134− }
135− }
136119 Row {
137120 Button {
138121 text: "Show Message"
139− onClicked: loader.item.showMessage(messageField.text)
122+ onClicked: LightDMService.prompts.append(messageField.text, LightDMService.prompts.Message)
140123 }
141124 TextField {
142125 id: messageField
@@ -147,7 +130,7 @@ StyledItem {
147130 Row {
148131 Button {
149132 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)
151134 }
152135 TextField {
153136 id: promptField
@@ -160,30 +143,14 @@ StyledItem {
160143 Label {
161144 text: "secret"
162145 }
163− CheckBox {
164− id: isDefaultPromptCheckBox
165− }
166− Label {
167− text: "default"
168− }
169146 }
170147 Row {
171148 Button {
172− text: "Authenticated"
149+ text: "Notify Auth Failure"
173150 onClicked: {
174− if (successCheckBox.checked) {
175− loader.item.notifyAuthenticationSucceeded(false);
176− } else {
177− loader.item.notifyAuthenticationFailed();
178− }
151+ loader.item.notifyAuthenticationFailed();
179152 }
180153 }
181− CheckBox {
182− id: successCheckBox
183− }
184− Label {
185− text: "success"
186− }
187154 }
188155 Row {
189156 Button {
@@ -271,15 +238,15 @@ StyledItem {
271238 id: multipleSessionsCheckbox
272239 onClicked: {
273240 if (checked) {
274− LightDM.Sessions.testScenario = "multipleSessions"
241+ LightDMController.sessionMode = "full";
275242 } else {
276− LightDM.Sessions.testScenario = "singleSession"
243+ LightDMController.sessionMode = "single";
277244 }
278245 }
279246 Connections {
280− target: LightDM.Sessions
281− onTestScenarioChanged: {
282− if (LightDM.Sessions.testScenario === "multipleSessions") {
247+ target: LightDMController
248+ onSessionModeChanged: {
249+ if (LightDMController.sessionMode === "full") {
283250 multipleSessionsCheckbox.checked = true;
284251 } else {
285252 multipleSessionsCheckbox.checked = false;
@@ -297,11 +264,11 @@ StyledItem {
297264
298265 width: units.gu(10)
299266 minimumValue: 0
300− maximumValue: LightDM.Sessions.numAvailableSessions
301− value: LightDM.Sessions.numSessions
302− visible: LightDM.Sessions.testScenario === "multipleSessions"
267+ maximumValue: LightDMController.numAvailableSessions
268+ value: LightDMController.numSessions
269+ visible: LightDMController.sessionMode === "full"
303270 Binding {
304− target: LightDM.Sessions
271+ target: LightDMController
305272 property: "numSessions"
306273 value: numSessionsSlider.value
307274 }
@@ -364,11 +331,17 @@ StyledItem {
364331
365332 function init() {
366333 selectIndex(0); // break binding with text field
334+ tryCompare(LightDMService.prompts, "count", 1);
367335 selectedSpy.clear();
368336 respondedSpy.clear();
369337 teaseSpy.clear();
370338 emergencySpy.clear();
371− LightDM.Sessions.testScenario = "multipleSessions"
339+ LightDMController.reset();
340+ LightDM.Sessions.iconSearchDirectories = [testIconDirectory];
341+
342+ waitForRendering(view);
343+ var userList = findChild(view, "userList");
344+ tryCompare(userList, "movingInternally", false);
372345 }
373346
374347 function cleanup() {
@@ -395,8 +368,14 @@ StyledItem {
395368 }
396369
397370 function selectIndex(i) {
398− view.currentIndex = i;
371+ var user = LightDM.Users.data(i, LightDM.UserRoles.NameRole);
372+ LightDM.Greeter.authenticate(user);
373+
399374 var userList = findChild(view, "userList");
375+ var promptList = findChild(view, "promptList");
376+
377+ view.currentIndex = i;
378+ tryCompare(promptList, "opacity", 1);
400379 tryCompare(userList, "movingInternally", false);
401380 }
402381
@@ -415,6 +394,19 @@ StyledItem {
415394 waitForRendering(view);
416395 }
417396
397+ function test_changingSessionSticksToUser() {
398+ var loginList = findChild(view, "loginList");
399+
400+ selectUser("invalid-session");
401+ tryCompare(loginList, "currentSession", "invalid");
402+
403+ selectUser("has-password");
404+ tryCompare(loginList, "currentSession", "ubuntu");
405+
406+ selectUser("invalid-session")
407+ tryCompare(loginList, "currentSession", "invalid");
408+ }
409+
418410 function test_tease_data() {
419411 return [
420412 {tag: "locked", x: 0, offset: 0, count: 0, locked: true},
@@ -426,10 +418,6 @@ StyledItem {
426418 }
427419
428420 function test_sessionIconsAreValid() {
429− LightDM.Sessions.testScenario = "multipleSessions"
430− var originalDirectories = LightDM.Sessions.iconSearchDirectories
431− LightDM.Sessions.iconSearchDirectories = [testIconDirectory]
432−
433421 selectUser("has-password");
434422
435423 // Test the login list icon is valid
@@ -449,12 +437,10 @@ StyledItem {
449437
450438 function test_choosingNewSessionChangesLoginListIcon() {
451439 // Ensure the default session is selected (Ubuntu)
452− loader.active = false;
453− loader.active = true;
440+ cleanup();
454441
455442 selectUser("has-password");
456443
457− LightDM.Sessions.testScenario = "multipleSessions";
458444 var sessionChooserButton = findChild(view, "sessionChooserButton");
459445 var icon = String(sessionChooserButton.icon);
460446 compare(icon.indexOf("ubuntu") > -1, true);
@@ -465,25 +451,25 @@ StyledItem {
465451 var currentDelegate = findChild(view, delegateName);
466452 var sessionKey = LightDM.Sessions.data(i,LightDM.SessionRoles.KeyRole);
467453 if (sessionKey === "gnome-classic") {
454+ waitForRendering(currentDelegate);
468455 tap(currentDelegate);
469− var sessionChooserButton = findChild(view, "sessionChooserButton");
470456 waitForRendering(sessionChooserButton);
471− var icon = String(sessionChooserButton.icon);
472457 break;
473458 }
474459 }
475460
461+ icon = String(sessionChooserButton.icon);
476462 compare(icon.indexOf("gnome") > -1, true,
477463 "Expected icon to contain gnome but it was " + icon);
478464 }
479465
480466 function test_noSessionsDoesntBreakView() {
481− LightDM.Sessions.testScenario = "noSessions"
467+ LightDMController.sessionMode = "none";
482468 compare(LightDM.Sessions.count, 0)
483469 }
484470
485471 function test_sessionIconNotShownWithOneSession() {
486− LightDM.Sessions.testScenario = "singleSession"
472+ LightDMController.sessionMode = "single";
487473 compare(LightDM.Sessions.count, 1);
488474
489475 var sessionChooserButton = findChild(view, "sessionChooserButton");
@@ -491,9 +477,6 @@ StyledItem {
491477 }
492478
493479 function test_sessionIconNotShownWithActiveUser() {
494− LightDM.Sessions.testScenario = "multipleSessions";
495− compare(LightDM.Sessions.count > 1, true);
496−
497480 selectUser("active");
498481
499482 var sessionChooserButton = findChild(view, "sessionChooserButton");
@@ -501,9 +484,6 @@ StyledItem {
501484 }
502485
503486 function test_sessionIconShownWithMultipleSessions() {
504− LightDM.Sessions.testScenario = "multipleSessions"
505− compare(LightDM.Sessions.count > 1, true);
506−
507487 selectUser("has-password");
508488
509489 var sessionChooserButton = findChild(view, "sessionChooserButton");
@@ -537,12 +517,9 @@ StyledItem {
537517 }
538518
539519 function test_respondedWithPassword() {
540− view.locked = true;
541− view.showPrompt("Prompt", true, false);
542− var passwordInput = findChild(view, "passwordInput");
543− compare(passwordInput.text, "Prompt");
544− verify(passwordInput.isSecret);
545− tap(passwordInput);
520+ selectUser("has-password");
521+ var greeterPrompt = findChild(view, "greeterPrompt0");
522+ verify(greeterPrompt.isSecret);
546523 typeString("password");
547524 keyClick(Qt.Key_Enter);
548525 compare(respondedSpy.count, 1);
@@ -550,12 +527,9 @@ StyledItem {
550527 }
551528
552529 function test_respondedWithNonSecret() {
553− view.locked = true;
554− view.showPrompt("otp", false, false);
555− var passwordInput = findChild(view, "passwordInput");
556− compare(passwordInput.text, "otp");
557− verify(!passwordInput.isSecret);
558− tap(passwordInput);
530+ selectUser("question-prompt");
531+ var greeterPrompt = findChild(view, "greeterPrompt0");
532+ verify(!greeterPrompt.isSecret);
559533 typeString("foo");
560534 keyClick(Qt.Key_Enter);
561535 compare(respondedSpy.count, 1);
@@ -580,24 +554,47 @@ StyledItem {
580554 tryCompare(view, "required", false);
581555 }
582556
583− function test_showMessage() {
584− view.showMessage("Welcome to Unity Greeter");
585− view.showMessage("<font color=\"#df382c\">This is an error</font>");
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");
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");
589− compare(infoLabel.textFormat, Text.StyledText);
557+ function test_infoPrompt() {
558+ selectUser("info-prompt");
559+
560+ var infoLabel = findChild(view, "infoLabel0");
561+ compare(infoLabel.text, "Welcome to Unity Greeter");
562+ compare(infoLabel.textFormat, Text.PlainText);
563+
564+ verify(findChild(view, "greeterPrompt1") != null);
565+ }
566+
567+ function test_longInfoPrompt() {
568+ selectUser("long-info-prompt");
569+
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.");
590572 verify(infoLabel.contentWidth > infoLabel.width);
591− verify(infoLabel.opacity < 1);
592− tryCompare(infoLabel, "opacity", 1);
573+
574+ verify(findChild(view, "greeterPrompt1") != null);
575+ }
576+
577+ function test_multiInfoPrompt() {
578+ selectUser("multi-info-prompt");
579+
580+ var infoLabel0 = findChild(view, "infoLabel0");
581+ compare(infoLabel0.text, "Welcome to Unity Greeter");
582+
583+ var infoLabel1 = findChild(view, "infoLabel1");
584+ compare(infoLabel1.text, "This is an error");
585+ compare(infoLabel1.color, theme.palette.normal.negative);
586+
587+ var infoLabel2 = findChild(view, "infoLabel2");
588+ compare(infoLabel2.text, "You should have seen three messages");
589+
590+ verify(findChild(view, "greeterPrompt3") != null);
593591 }
594592
595593 // Escape is used to reset the authentication, especially if PAM is unresponsive
596594 function test_escape() {
597− selectIndex(1);
595+ var index = selectUser("has-password");
598596 selectedSpy.clear();
599597 view.locked = true;
600− view.showPrompt("Prompt", true, true);
601598 var promptField = findChild(view, "promptField");
602599 tap(promptField);
603600 verify(promptField.activeFocus);
@@ -611,9 +608,10 @@ StyledItem {
611608 compare(selectedSpy.count, 0);
612609 keyClick(Qt.Key_Escape);
613610 compare(selectedSpy.count, 1);
614− compare(selectedSpy.signalArguments[0][0], 1);
611+ compare(selectedSpy.signalArguments[0][0], index);
615612
616− view.reset();
613+ selectIndex(index);
614+ var promptField = findChild(view, "promptField");
617615 verify(promptField.activeFocus);
618616 compare(promptField.opacity, 1);
619617 }
@@ -624,21 +622,22 @@ StyledItem {
624622 tryCompare(label, "text", "가나다라마");
625623 }
626624
627− function test_promptless() {
628− var passwordInput = findChild(view, "passwordInput");
629−
625+ function test_authError() {
626+ var index = selectUser("auth-error");
627+ var greeterPrompt = findChild(view, "greeterPrompt1"); // after error message
630628 view.locked = true;
631− compare(passwordInput.text, "Retry");
632− tap(passwordInput);
629+ compare(greeterPrompt.text, "Retry");
630+ tap(greeterPrompt);
633631 compare(respondedSpy.count, 0);
634632 compare(selectedSpy.count, 1);
635− compare(selectedSpy.signalArguments[0][0], 0);
636− selectedSpy.clear();
633+ compare(selectedSpy.signalArguments[0][0], index);
634+ }
637635
638− view.reset();
639− view.locked = false;
640− compare(passwordInput.text, "Log In");
641− tap(passwordInput);
636+ function test_noPassword() {
637+ selectUser("no-password");
638+ var greeterPrompt = findChild(view, "greeterPrompt0");
639+ compare(greeterPrompt.text, "Log In");
640+ tap(greeterPrompt);
642641 compare(selectedSpy.count, 0);
643642 compare(respondedSpy.count, 1);
644643 compare(respondedSpy.signalArguments[0][0], "");
@@ -670,8 +669,8 @@ StyledItem {
670669 }
671670
672671 function test_passphrase() {
672+ var index = selectUser("has-password");
673673 var promptField = findChild(view, "promptField");
674− view.showPrompt("", true, true);
675674
676675 verify(view.alphanumeric);
677676 compare(promptField.inputMethodHints & Qt.ImhDigitsOnly, 0);
@@ -681,8 +680,8 @@ StyledItem {
681680 }
682681
683682 function test_passcode() {
683+ var index = selectUser("has-pin");
684684 var promptField = findChild(view, "promptField");
685− view.showPrompt("", true, true);
686685
687686 view.alphanumeric = false;
688687 compare(promptField.inputMethodHints & Qt.ImhDigitsOnly, Qt.ImhDigitsOnly);
@@ -704,54 +703,59 @@ StyledItem {
704703
705704 function test_loginListMovement_data() {
706705 return [
707− {tag: "up", key: Qt.Key_Up, result: -1},
708− {tag: "down", key: Qt.Key_Down, result: 1},
706+ {tag: "up", key: Qt.Key_Up, result: 1},
707+ {tag: "down", key: Qt.Key_Down, result: 3},
709708 ]
710709 }
711710
712711 function test_loginListMovement(data) {
712+ selectIndex(2);
713+ selectedSpy.clear();
714+
713715 keyClick(data.key);
714716 compare(selectedSpy.count, 1);
715717 compare(selectedSpy.signalArguments[0][0], data.result);
716718 }
717719
718720 function test_focusStaysActive() {
719− var promptField = findChild(view, "promptField");
720− var promptButton = findChild(view, "promptButton");
721−
722− verify(promptButton.activeFocus);
721+ selectUser("no-password");
722+ var greeterPrompt = findChild(view, "greeterPrompt0");
723+ verify(greeterPrompt.activeFocus);
723724 keyClick(Qt.Key_Enter);
724725 compare(selectedSpy.count, 0);
725726 compare(respondedSpy.count, 1);
726727 compare(respondedSpy.signalArguments[0][0], "");
727− verify(promptButton.activeFocus);
728+ verify(greeterPrompt.activeFocus);
728729 keyClick(Qt.Key_Enter);
729730 compare(respondedSpy.count, 1);
730731
731− view.showPrompt("", true, true);
732− verify(promptField.activeFocus);
732+ selectUser("has-password");
733+ var greeterPrompt = findChild(view, "greeterPrompt0");
734+ verify(greeterPrompt.activeFocus);
733735 keyClick(Qt.Key_D);
734736 keyClick(Qt.Key_Enter);
735737 compare(selectedSpy.count, 0);
736738 compare(respondedSpy.count, 2);
737739 compare(respondedSpy.signalArguments[1][0], "d");
738− verify(promptField.activeFocus);
740+ verify(greeterPrompt.activeFocus);
739741 keyClick(Qt.Key_Enter);
740742 compare(respondedSpy.count, 2);
741743
742− view.reset();
744+ var index = selectUser("no-password");
745+ var greeterPrompt = findChild(view, "greeterPrompt0");
743746 view.locked = true;
744− verify(promptButton.activeFocus);
747+ verify(greeterPrompt.activeFocus);
745748 keyClick(Qt.Key_Enter);
746749 compare(respondedSpy.count, 2);
747750 compare(selectedSpy.count, 1);
748− compare(selectedSpy.signalArguments[0][0], 0);
749− verify(promptButton.activeFocus);
751+ compare(selectedSpy.signalArguments[0][0], index);
752+ verify(greeterPrompt.activeFocus);
750753 keyClick(Qt.Key_Enter);
751754 compare(selectedSpy.count, 1);
752755
753− view.showPrompt("", true, true);
754− verify(promptField.activeFocus);
756+ selectUser("no-password");
757+ var greeterPrompt = findChild(view, "greeterPrompt0");
758+ verify(greeterPrompt.activeFocus);
755759 }
756760 }
757761}