on xenial help sign in
Merge josh's ported-session-test
commitd31f30149a7ba7727e495ba988c549394585cf5e authorMichael Terry <mike@mterry.name> dateThu 19 Jan 2017, 10:23 (10 years ago) parentea7d2302a3c8ec
7 files changed+110−20
qml/Greeter/LoginList.qml−2 qml/Greeter/WideView.qml+1−4 tests/mocks/liblightdm/MockController.cpp+24 tests/mocks/liblightdm/MockController.h+15 tests/mocks/liblightdm/MockUsersModel.cpp+37−14 tests/mocks/liblightdm/MockUsersModel.h+2 tests/qmltests/Greeter/tst_WideView.qml+31
qml/Greeter/LoginList.qml−2
@@ -36,12 +36,10 @@ StyledItem {
3636 readonly property int cellHeight: units.gu(5)
3737 readonly property int highlightedHeight: units.gu(15)
3838 readonly property int moveDuration: UbuntuAnimation.FastDuration
39− property string selectedSession
4039 property string currentSession
4140 readonly property string currentUser: userList.currentItem.username
4241 property bool wasPrompted: false
4342
44− signal loginListSessionChanged(string session)
4543 signal responded(string response)
4644 signal selected(int index)
4745 signal sessionChooserButtonClicked()
qml/Greeter/WideView.qml+1−4
@@ -125,8 +125,6 @@ FocusScope {
125125 id: loginList
126126 objectName: "loginList"
127127
128− property int selectedUserIndex: 0
129−
130128 width: units.gu(40)
131129 anchors {
132130 left: parent.left
@@ -141,11 +139,10 @@ FocusScope {
141139 Behavior on boxVerticalOffset { UbuntuNumberAnimation {} }
142140
143141 model: root.userModel
144− currentSession: LightDMService.users.data(selectedUserIndex, LightDMService.userRoles.SessionRole);
145142 onResponded: root.responded(response)
146143 onSelected: {
147144 root.selected(index)
148− loginList.selectedUserIndex = index;
145+ currentSession = LightDMService.users.data(index, LightDMService.userRoles.SessionRole);
149146 }
150147 onSessionChooserButtonClicked: parent.state = "SessionsList"
151148
tests/mocks/liblightdm/MockController.cpp+24
@@ -124,6 +124,30 @@ void MockController::setUserMode(const QString &userMode)
124124 }
125125}
126126
127+QString MockController::sessionName() const
128+{
129+ return QString("INVALID - Please read directly from the UserModel");
130+}
131+
132+void MockController::setSessionName(const QString &sessionName)
133+{
134+ // Let the user model deal with this
135+ Q_EMIT sessionNameChanged(sessionName, m_currentUsername);
136+}
137+
138+QString MockController::currentUsername() const
139+{
140+ return m_currentUsername;
141+}
142+
143+void MockController::setCurrentUsername(const QString &username)
144+{
145+ if (m_currentUsername != username) {
146+ m_currentUsername = username;
147+ Q_EMIT currentUsernameChanged();
148+ }
149+}
150+
127151QString MockController::sessionMode() const
128152{
129153 return m_sessionMode;
tests/mocks/liblightdm/MockController.h+15
@@ -36,6 +36,11 @@ class Q_DECL_EXPORT MockController : public QObject
3636 // single, none, full
3737 Q_PROPERTY(QString sessionMode READ sessionMode WRITE setSessionMode NOTIFY sessionModeChanged)
3838
39+ // This would be best as a Q_INVOKABLE, but using a property allows for
40+ // keeping the mock cleaner
41+ Q_PROPERTY(QString sessionName READ sessionName WRITE setSessionName NOTIFY sessionNameChanged)
42+ Q_PROPERTY(QString currentUsername READ currentUsername WRITE setCurrentUsername NOTIFY currentUsernameChanged)
43+
3944 Q_PROPERTY(int numAvailableSessions READ numFullSessions CONSTANT)
4045 Q_PROPERTY(int numSessions READ numSessions WRITE setNumSessions NOTIFY numSessionsChanged)
4146
@@ -60,6 +65,12 @@ public:
6065 QString sessionMode() const;
6166 void setSessionMode(const QString &sessionMode);
6267
68+ QString sessionName() const;
69+ void setSessionName(const QString &userIndex);
70+
71+ QString currentUsername() const;
72+ void setCurrentUsername(const QString &username);
73+
6374 class SessionItem
6475 {
6576 public:
@@ -73,16 +84,20 @@ public:
7384 void setNumSessions(int numSessions);
7485
7586Q_SIGNALS:
87+ void currentUsernameChanged();
7688 void selectUserHintChanged();
7789 void selectGuestHintChanged();
7890 void hasGuestAccountHintChanged();
7991 void userModeChanged();
8092 void sessionModeChanged();
8193 void numSessionsChanged();
94+ void sessionNameChanged(const QString &sessionName, const QString &username);
8295
8396private:
8497 explicit MockController(QObject* parent=0);
8598
99+ QString m_currentUsername;
100+ QString m_sessionName;
86101 QString m_selectUserHint;
87102 bool m_selectGuestHint;
88103 bool m_hasGuestAccountHint;
tests/mocks/liblightdm/MockUsersModel.cpp+37−14
@@ -69,6 +69,8 @@ UsersModel::UsersModel(QObject *parent)
6969 this, &UsersModel::resetEntries);
7070 connect(MockController::instance(), &MockController::userModeChanged,
7171 this, &UsersModel::resetEntries);
72+ connect(MockController::instance(), &MockController::sessionNameChanged,
73+ this, &UsersModel::setCurrentSessionName);
7274 resetEntries();
7375}
7476
@@ -77,6 +79,22 @@ UsersModel::~UsersModel()
7779 delete d_ptr;
7880}
7981
82+void UsersModel::setCurrentSessionName(const QString &sessionName, const QString &username)
83+{
84+ Q_D(UsersModel);
85+
86+ int usersIndex = 0;
87+ for (auto &entry : d->entries) {
88+ if (username == entry.username) {
89+ entry.session = sessionName;
90+ break;
91+ }
92+ usersIndex++;
93+ }
94+
95+ dataChanged(index(usersIndex, 0), index(usersIndex, 0), QVector<int>(SessionRole));
96+}
97+
8098int UsersModel::rowCount(const QModelIndex &parent) const
8199{
82100 Q_D(const UsersModel);
@@ -140,28 +158,33 @@ void UsersModel::resetEntries()
140158 } else if (userMode == "single-pin") {
141159 d->entries = {{"has-pin", "Has PIN", "", 0, false, false, "ubuntu", 0}};
142160 } else if (userMode == "full") {
161+ /*
162+ * Since the real model sorts these entries alphabetically, the model indices
163+ * don't line up correctly. The easiest way to fix this is to ensure that this
164+ * list of entries REMAINS IN ALPHABETICAL ORDER at all times.
165+ */
143166 d->entries = {
167+ { "active", "Active Account", 0, 0, true, false, "ubuntu", 0 },
168+ { "auth-error", "Auth Error", 0, 0, false, false, "ubuntu", 0 },
169+ { "black-background", "Black Background", "#000000", 0, false, false, "ubuntu", 0 },
170+ { "color-background", "Color Background", "#E95420", 0, false, false, "ubuntu", 0 },
171+ { "different-prompt", "Different Prompt", 0, 0, false, false, "ubuntu", 0 },
172+ { "empty-name", "", 0, 0, false, false, "ubuntu", 0 },
144173 { "has-password", "Has Password", 0, 0, false, false, "ubuntu", 0 },
145174 { "has-pin", "Has PIN", 0, 0, false, false, "ubuntu", 0 },
146− { "different-prompt", "Different Prompt", 0, 0, false, false, "ubuntu", 0 },
147− { "no-password", "No Password", 0, 0, false, false, "ubuntu", 0 },
148− { "auth-error", "Auth Error", 0, 0, false, false, "ubuntu", 0 },
149− { "two-factor", "Two Factor", 0, 0, false, false, "ubuntu", 0 },
150− { "info-prompt", "Info Prompt", 0, 0, false, false, "ubuntu", 0 },
151175 { "html-info-prompt", "HTML Info Prompt", 0, 0, false, false, "ubuntu", 0 },
176+ { "info-prompt", "Info Prompt", 0, 0, false, false, "ubuntu", 0 },
152177 { "long-info-prompt", "Long Info Prompt", 0, 0, false, false, "ubuntu", 0 },
153− { "wide-info-prompt", "Wide Info Prompt", 0, 0, false, false, "ubuntu", 0 },
154− { "multi-info-prompt", "Multi Info Prompt", 0, 0, false, false, "ubuntu", 0 },
155178 { "long-name", "Long name (far far too long to fit, seriously this would never fit on the screen, you will never see this part of the name)", 0, 0, false, false, "ubuntu", 0 },
156− { "color-background", "Color Background", "#E95420", 0, false, false, "ubuntu", 0 },
157− // white and black are a bit redundant, but useful for manually testing if UI is still readable
158− { "white-background", "White Background", "#ffffff", 0, false, false, "ubuntu", 0 },
159− { "black-background", "Black Background", "#000000", 0, false, false, "ubuntu", 0 },
179+ { "multi-info-prompt", "Multi Info Prompt", 0, 0, false, false, "ubuntu", 0 },
160180 { "no-background", "No Background", "", 0, false, false, "ubuntu", 0 },
161− { "unicode", "가나다라마", 0, 0, false, false, "ubuntu", 0 },
181+ { "no-password", "No Password", 0, 0, false, false, "ubuntu", 0 },
162182 { "no-response", "No Response", 0, 0, false, false, "ubuntu", 0 },
163− { "empty-name", "", 0, 0, false, false, "ubuntu", 0 },
164− { "active", "Active Account", 0, 0, true, false, "ubuntu", 0 },
183+ { "two-factor", "Two Factor", 0, 0, false, false, "ubuntu", 0 },
184+ { "unicode", "가나다라마", 0, 0, false, false, "ubuntu", 0 },
185+ // white and black are a bit redundant, but useful for manually testing if UI is still readable
186+ { "white-background", "White Background", "#ffffff", 0, false, false, "ubuntu", 0 },
187+ { "wide-info-prompt", "Wide Info Prompt", 0, 0, false, false, "ubuntu", 0 }
165188 };
166189 }
167190
tests/mocks/liblightdm/MockUsersModel.h+2
@@ -48,6 +48,8 @@ public:
4848 int rowCount(const QModelIndex &parent) const override;
4949 QVariant data(const QModelIndex &index, int role) const override;
5050
51+ void setCurrentSessionName(const QString &sessionName, const QString &username);
52+
5153private Q_SLOTS:
5254 void resetEntries();
5355
tests/qmltests/Greeter/tst_WideView.qml+31
@@ -411,6 +411,37 @@ StyledItem {
411411 waitForRendering(view);
412412 }
413413
414+ function test_changingSessionSticksToUser() {
415+ LightDMController.sessionMode = "full";
416+
417+ var loginList = findChild(view, "loginList");
418+ var fakeSession1 = "ASessionWillNeverBeCalledThis";
419+ var fakeSession2 = "ASessionWillAlsoNeverBeCalledThis";
420+
421+ // For this test to work, a user has to be selected and the
422+ // mock must be made aware of that user
423+ selectUser("has-password")
424+ LightDMController.currentUsername = "has-password"
425+ compare(LightDM.Sessions.count > 1, true);
426+ compare(loginList.currentSession != fakeSession1, true);
427+ LightDMController.sessionName = fakeSession1;
428+
429+ selectUser("has-pin")
430+ LightDMController.currentUsername = "has-pin"
431+ compare(loginList.currentSession != fakeSession2, true);
432+ LightDMController.sessionName = fakeSession2;
433+
434+ selectUser("has-password")
435+ tryCompare(loginList, "currentSession", fakeSession1);
436+
437+ selectUser("has-pin")
438+ tryCompare(loginList, "currentSession", fakeSession2);
439+
440+ // Force a model reset
441+ LightDMController.userMode = "single";
442+ LightDMController.userMode = "full";
443+ }
444+
414445 function test_tease_data() {
415446 return [
416447 {tag: "locked", x: 0, offset: 0, count: 0, locked: true},