Merge lp:~iahmad/unity-greeter/duplicate-entry-bug1092425 into lp:unity-greeter

Proposed by I Ahmad
Status: Merged
Approved by: Robert Ancell
Approved revision: 753
Merged at revision: 761
Proposed branch: lp:~iahmad/unity-greeter/duplicate-entry-bug1092425
Merge into: lp:unity-greeter
Diff against target: 300 lines (+132/-16)
2 files modified
src/user-list.vala (+74/-2)
tests/test.vala (+58/-14)
To merge this branch: bzr merge lp:~iahmad/unity-greeter/duplicate-entry-bug1092425
Reviewer Review Type Date Requested Status
Robert Ancell Approve
David Barth (community) Approve
Review via email: mp+147602@code.launchpad.net

This proposal supersedes a proposal from 2013-02-06.

Description of the change

Fixed the comments form David and Robert, Also Added a unit test case to test the defect fix as well as fixed the existing remote login unit test cases broken due to the duplicate entry fix. Please see the results below

UBUNTU_MENUPROXY=0 top_srcdir=.. . xvfb-run ./unity-greeter-test
/Simple Navigation: OK
/Remote Login: OK
/Remote Login duplicate entries: OK
/Remote Login with Servers Updated signal: OK
/Remote Login with Servers Updated signal and not in remote server: OK
/Remote Login with Login Servers Updated signal: OK
/Remote Login with Login Servers Updated signal and not in removed server: OK
/Remote Login with Remote Login Changed signal: OK
/Remote Login with Remote Login Changed signal and not in changed server: OK
/Remote Login authentication: OK
/Remote Login cancel authentication: OK
/Email Autocomplete: OK
/Greeter Communication: OK
/Unsupported server type: OK

To post a comment you must log in.
Revision history for this message
David Barth (dbarth) wrote : Posted in a previous version of this proposal

The code looks fine, but i'd prefer to have a unit test to verify that the bug is indeed gone.

The foreach loop could also be factorized under a new function with a name explaining that it generates a unique id for the user + url combination.

Revision history for this message
Robert Ancell (robert-ancell) wrote : Posted in a previous version of this proposal

You have tab characters instead of four spaces in the branch.

review: Needs Fixing
Revision history for this message
David Barth (dbarth) wrote :

The code looks good to me now.

Approving, as much as remote login is concerned.

review: Approve
Revision history for this message
Robert Ancell (robert-ancell) wrote :

Pushed with some coding style fixes

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/user-list.vala'
2--- src/user-list.vala 2012-10-02 17:20:34 +0000
3+++ src/user-list.vala 2013-02-11 07:47:20 +0000
4@@ -172,15 +172,35 @@
5 return "*remote_directory*" + remote_server.url;
6 }
7
8+ private string username_from_remote_server_fields(RemoteServer remote_server)
9+ {
10+ var username = "";
11+ foreach (var f in remote_server.fields)
12+ {
13+ if (f.type == "username" && f.default_value != null)
14+ {
15+ username = f.default_value.get_string();
16+ break;
17+ }
18+ }
19+ return username;
20+ }
21+
22 private string user_list_name_for_remote_login_server (RemoteServer remote_server)
23 {
24- return "*remote_login*" + remote_server.url;
25+ var username = username_from_remote_server_fields(remote_server);
26+ return "*remote_login*" + remote_server.url+"*"+username;
27 }
28
29 private string url_from_remote_loding_server_list_name (string remote_server_list_name)
30 {
31 return remote_server_list_name.split ("*")[2];
32 }
33+
34+ private string username_from_remote_loding_server_list_name (string remote_server_list_name)
35+ {
36+ return remote_server_list_name.split ("*")[3];
37+ }
38
39 private void set_remote_directory_servers (RemoteServer[] server_list)
40 {
41@@ -398,6 +418,11 @@
42 login_success = true;
43 Timeout.add (5000, () => { remote_login_changed (currently_browsing_server_url, currently_browsing_server_email); return false; });
44 }
45+ else if (password_field.text == "duplicate")
46+ {
47+ test_fill_remote_login_servers_duplicate_entries (out server_list);
48+ login_success = true;
49+ }
50 }
51 else
52 {
53@@ -589,9 +614,12 @@
54 {
55 current_remote_fields = new HashTable<string, Gtk.Widget> (str_hash, str_equal);
56 var url = url_from_remote_loding_server_list_name (selected_entry.id);
57+ var username = username_from_remote_loding_server_list_name(selected_entry.id);
58+
59 foreach (var remote_server in server_list)
60 {
61- if (remote_server.url == url)
62+ var remote_username = username_from_remote_server_fields(remote_server);
63+ if (remote_server.url == url && (username == null || username == remote_username))
64 {
65 if (selected_entry.id.has_prefix ("*remote_login"))
66 {
67@@ -1236,6 +1264,50 @@
68 server_list[3] = remote_server4;
69 }
70
71+ private void test_fill_remote_login_servers_duplicate_entries (out RemoteServer[] server_list)
72+ {
73+ //Create two remote servers with same url but different username and domain.
74+ server_list = {};
75+
76+ RemoteServer remote_server2 = RemoteServer ();
77+ remote_server2.type = "rdp";
78+ remote_server2.name = "RDP server with default username, and editable domain";
79+ remote_server2.url = "http://rdpdefaultusername.com";
80+ remote_server2.last_used_server = false;
81+ remote_server2.fields = {};
82+ RemoteServerField field21 = RemoteServerField ();
83+ field21.type = "username";
84+ field21.default_value = new Variant.string ("alowl1");
85+ RemoteServerField field22 = RemoteServerField ();
86+ field22.type = "password";
87+ field22.default_value = new Variant.string ("duplicate1");
88+ RemoteServerField field23 = RemoteServerField ();
89+ field23.type = "domain";
90+ field23.default_value = new Variant.string ("SCANNERS");
91+ remote_server2.fields = {field21, field22, field23};
92+
93+ RemoteServer remote_server5 = RemoteServer ();
94+ remote_server5.type = "rdp";
95+ remote_server5.name = "RDP server with default username, and editable domain";
96+ remote_server5.url = "http://rdpdefaultusername.com";
97+ remote_server5.last_used_server = false;
98+ remote_server5.fields = {};
99+ RemoteServerField field51 = RemoteServerField ();
100+ field51.type = "username";
101+ field51.default_value = new Variant.string ("alowl2");
102+ RemoteServerField field52 = RemoteServerField ();
103+ field52.type = "password";
104+ field52.default_value = new Variant.string ("duplicate2");
105+ RemoteServerField field53 = RemoteServerField ();
106+ field53.type = "domain";
107+ field53.default_value = new Variant.string ("PRINTERS");
108+ remote_server5.fields = {field51, field52, field53};
109+
110+ server_list.resize (2);
111+ server_list[0] = remote_server2;
112+ server_list[1] = remote_server5;
113+ }
114+
115 private bool test_key_press_cb (Gdk.EventKey event)
116 {
117 if ((event.state & Gdk.CONTROL_MASK) == 0)
118
119=== modified file 'tests/test.vala'
120--- tests/test.vala 2013-01-04 15:28:54 +0000
121+++ tests/test.vala 2013-02-11 07:47:20 +0000
122@@ -183,7 +183,7 @@
123 pwd.text = "password";
124 list.selected_entry.respond ({});
125 GLib.assert (!list.selected_entry.has_errors);
126- GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");
127+ GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
128 wait_for_scrolling_end (list);
129
130 // Go back to the remote_directory entry and write the same password but an invalid email
131@@ -215,7 +215,7 @@
132 pwd.text = "delay1";
133 list.selected_entry.respond ({});
134 GLib.assert (!list.selected_entry.has_errors);
135- GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");
136+ GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
137
138 bool done = false;
139 // The delay1 code triggers at 5 seconds
140@@ -253,7 +253,7 @@
141 pwd.text = "delay1";
142 list.selected_entry.respond ({});
143 GLib.assert (!list.selected_entry.has_errors);
144- GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");
145+ GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
146 wait_for_scrolling_end (list);
147
148 while (list.selected_entry.id.has_prefix("*remote_"))
149@@ -299,7 +299,7 @@
150 pwd.text = "delay2";
151 list.selected_entry.respond ({});
152 GLib.assert (!list.selected_entry.has_errors);
153- GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");
154+ GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
155
156 bool done = false;
157 // The delay2 code triggers at 5 seconds
158@@ -307,7 +307,7 @@
159 {
160 // If the login server we were disappears we get moved to a different one
161 wait_for_scrolling_end (list);
162- GLib.assert (list.selected_entry.id == "*remote_login*http://megacoolrdpserver.com");
163+ GLib.assert (list.selected_entry.id == "*remote_login*http://megacoolrdpserver.com*");
164 done = true;
165 return false;
166 }
167@@ -336,10 +336,10 @@
168 pwd.text = "delay2";
169 list.selected_entry.respond ({});
170 GLib.assert (!list.selected_entry.has_errors);
171- GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");
172+ GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
173
174 // Move to a server that won't be removed
175- while (list.selected_entry.id != "*remote_login*http://coolrdpserver.com")
176+ while (list.selected_entry.id != "*remote_login*http://coolrdpserver.com*")
177 do_scroll (list, GreeterList.ScrollTarget.UP);
178
179 bool done = false;
180@@ -348,7 +348,7 @@
181 {
182 // If the login server we were did not disappear we are still in the same one
183 wait_for_scrolling_end (list);
184- GLib.assert (list.selected_entry.id == "*remote_login*http://coolrdpserver.com");
185+ GLib.assert (list.selected_entry.id == "*remote_login*http://coolrdpserver.com*");
186 done = true;
187 return false;
188 }
189@@ -377,7 +377,7 @@
190 pwd.text = "delay3";
191 list.selected_entry.respond ({});
192 GLib.assert (!list.selected_entry.has_errors);
193- GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");
194+ GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
195
196 bool done = false;
197 // The delay3 code triggers at 5 seconds
198@@ -419,7 +419,7 @@
199 pwd.text = "delay3";
200 list.selected_entry.respond ({});
201 GLib.assert (!list.selected_entry.has_errors);
202- GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");
203+ GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
204 wait_for_scrolling_end (list);
205
206 while (list.selected_entry.id.has_prefix("*remote_"))
207@@ -473,7 +473,7 @@
208 pwd.text = "password";
209 list.selected_entry.respond ({});
210 GLib.assert (!list.selected_entry.has_errors);
211- GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");
212+ GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
213 wait_for_scrolling_end (list);
214
215 UnityGreeter.singleton.session_started = false;
216@@ -503,7 +503,7 @@
217 pwd.text = "password";
218 list.selected_entry.respond ({});
219 GLib.assert (!list.selected_entry.has_errors);
220- GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");
221+ GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
222 wait_for_scrolling_end (list);
223
224 UnityGreeter.singleton.session_started = false;
225@@ -520,6 +520,49 @@
226 mw.hide ();
227 }
228
229+ public static void remote_login_duplicate_entries()
230+ {
231+ MainWindow mw = setup ();
232+ TestList list = mw.stack.top () as TestList;
233+
234+ scroll_to_remote_login (list); //Wait until remote login appears.
235+ GLib.assert (list.selected_entry.id == "*remote_directory*http://crazyurl.com");
236+ GLib.assert (!list.selected_entry.has_errors);
237+
238+ // If we answer without filling in any field -> error
239+ list.selected_entry.respond ({});
240+ GLib.assert (list.selected_entry.has_errors);
241+
242+ // Go to first and back to last to clear the error
243+ do_scroll (list, GreeterList.ScrollTarget.START);
244+ do_scroll (list, GreeterList.ScrollTarget.END);
245+ GLib.assert (!list.selected_entry.has_errors);
246+
247+ // Fill in a valid email and password
248+ // Check there is no error and we moved to the last logged in server
249+ var email = remote_directory_entry_email_field (list);
250+ var pwd = remote_directory_entry_password_field (list);
251+ email.text = "a@canonical.com";
252+ pwd.text = "duplicate";
253+ list.selected_entry.respond ({});
254+ GLib.assert (!list.selected_entry.has_errors);
255+ GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername.com*alowl2");
256+
257+ var username = remote_login_entry_username_field(list);
258+ var domain = remote_login_entry_domain_field(list);
259+ var password = remote_login_entry_password_field(list);
260+ GLib.assert (username.text == "alowl2" && domain.text == "PRINTERS" && password.text == "duplicate2");
261+
262+ do_scroll (list, GreeterList.ScrollTarget.DOWN);
263+ GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername.com*alowl1");
264+ username = remote_login_entry_username_field(list);
265+ domain = remote_login_entry_domain_field(list);
266+ password = remote_login_entry_password_field(list);
267+ GLib.assert (username.text == "alowl1" && domain.text == "SCANNERS" && password.text == "duplicate1");
268+ wait_for_scrolling_end (list);
269+ mw.hide ();
270+ }
271+
272 public static void email_autocomplete ()
273 {
274 MainWindow mw = setup ();
275@@ -587,7 +630,7 @@
276 list.selected_entry.respond ({});
277 wait_for_scrolling_end (list);
278
279- while (list.selected_entry.id != "*remote_login*http://coolrdpserver.com")
280+ while (list.selected_entry.id != "*remote_login*http://coolrdpserver.com*")
281 do_scroll (list, GreeterList.ScrollTarget.UP);
282
283 var domain = remote_login_entry_domain_field (list);
284@@ -626,7 +669,7 @@
285 list.selected_entry.respond ({});
286 wait_for_scrolling_end (list);
287
288- while (list.selected_entry.id != "*remote_login*http://notsupportedserver.com")
289+ while (list.selected_entry.id != "*remote_login*http://notsupportedserver.com*")
290 do_scroll (list, GreeterList.ScrollTarget.UP);
291
292 GLib.assert (list.selected_entry.has_errors);
293@@ -675,6 +718,7 @@
294
295 GLib.Test.add_func ("/Simple Navigation", simple_navigation);
296 GLib.Test.add_func ("/Remote Login", remote_login);
297+ GLib.Test.add_func ("/Remote Login duplicate entries", remote_login_duplicate_entries);
298 GLib.Test.add_func ("/Remote Login with Servers Updated signal", remote_login_servers_updated_signal);
299 GLib.Test.add_func ("/Remote Login with Servers Updated signal and not in remote server", remote_login_servers_updated_signal_focus_not_in_remote_server);
300 GLib.Test.add_func ("/Remote Login with Login Servers Updated signal", remote_login_login_servers_updated_signal);

Subscribers

People subscribed via source and target branches