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
=== modified file 'src/user-list.vala'
--- src/user-list.vala 2012-10-02 17:20:34 +0000
+++ src/user-list.vala 2013-02-11 07:47:20 +0000
@@ -172,15 +172,35 @@
172 return "*remote_directory*" + remote_server.url;172 return "*remote_directory*" + remote_server.url;
173 }173 }
174174
175 private string username_from_remote_server_fields(RemoteServer remote_server)
176 {
177 var username = "";
178 foreach (var f in remote_server.fields)
179 {
180 if (f.type == "username" && f.default_value != null)
181 {
182 username = f.default_value.get_string();
183 break;
184 }
185 }
186 return username;
187 }
188
175 private string user_list_name_for_remote_login_server (RemoteServer remote_server)189 private string user_list_name_for_remote_login_server (RemoteServer remote_server)
176 {190 {
177 return "*remote_login*" + remote_server.url;191 var username = username_from_remote_server_fields(remote_server);
192 return "*remote_login*" + remote_server.url+"*"+username;
178 }193 }
179194
180 private string url_from_remote_loding_server_list_name (string remote_server_list_name)195 private string url_from_remote_loding_server_list_name (string remote_server_list_name)
181 {196 {
182 return remote_server_list_name.split ("*")[2];197 return remote_server_list_name.split ("*")[2];
183 }198 }
199
200 private string username_from_remote_loding_server_list_name (string remote_server_list_name)
201 {
202 return remote_server_list_name.split ("*")[3];
203 }
184204
185 private void set_remote_directory_servers (RemoteServer[] server_list)205 private void set_remote_directory_servers (RemoteServer[] server_list)
186 {206 {
@@ -398,6 +418,11 @@
398 login_success = true;418 login_success = true;
399 Timeout.add (5000, () => { remote_login_changed (currently_browsing_server_url, currently_browsing_server_email); return false; });419 Timeout.add (5000, () => { remote_login_changed (currently_browsing_server_url, currently_browsing_server_email); return false; });
400 }420 }
421 else if (password_field.text == "duplicate")
422 {
423 test_fill_remote_login_servers_duplicate_entries (out server_list);
424 login_success = true;
425 }
401 }426 }
402 else427 else
403 {428 {
@@ -589,9 +614,12 @@
589 {614 {
590 current_remote_fields = new HashTable<string, Gtk.Widget> (str_hash, str_equal);615 current_remote_fields = new HashTable<string, Gtk.Widget> (str_hash, str_equal);
591 var url = url_from_remote_loding_server_list_name (selected_entry.id);616 var url = url_from_remote_loding_server_list_name (selected_entry.id);
617 var username = username_from_remote_loding_server_list_name(selected_entry.id);
618
592 foreach (var remote_server in server_list)619 foreach (var remote_server in server_list)
593 {620 {
594 if (remote_server.url == url)621 var remote_username = username_from_remote_server_fields(remote_server);
622 if (remote_server.url == url && (username == null || username == remote_username))
595 {623 {
596 if (selected_entry.id.has_prefix ("*remote_login"))624 if (selected_entry.id.has_prefix ("*remote_login"))
597 {625 {
@@ -1236,6 +1264,50 @@
1236 server_list[3] = remote_server4;1264 server_list[3] = remote_server4;
1237 }1265 }
12381266
1267 private void test_fill_remote_login_servers_duplicate_entries (out RemoteServer[] server_list)
1268 {
1269 //Create two remote servers with same url but different username and domain.
1270 server_list = {};
1271
1272 RemoteServer remote_server2 = RemoteServer ();
1273 remote_server2.type = "rdp";
1274 remote_server2.name = "RDP server with default username, and editable domain";
1275 remote_server2.url = "http://rdpdefaultusername.com";
1276 remote_server2.last_used_server = false;
1277 remote_server2.fields = {};
1278 RemoteServerField field21 = RemoteServerField ();
1279 field21.type = "username";
1280 field21.default_value = new Variant.string ("alowl1");
1281 RemoteServerField field22 = RemoteServerField ();
1282 field22.type = "password";
1283 field22.default_value = new Variant.string ("duplicate1");
1284 RemoteServerField field23 = RemoteServerField ();
1285 field23.type = "domain";
1286 field23.default_value = new Variant.string ("SCANNERS");
1287 remote_server2.fields = {field21, field22, field23};
1288
1289 RemoteServer remote_server5 = RemoteServer ();
1290 remote_server5.type = "rdp";
1291 remote_server5.name = "RDP server with default username, and editable domain";
1292 remote_server5.url = "http://rdpdefaultusername.com";
1293 remote_server5.last_used_server = false;
1294 remote_server5.fields = {};
1295 RemoteServerField field51 = RemoteServerField ();
1296 field51.type = "username";
1297 field51.default_value = new Variant.string ("alowl2");
1298 RemoteServerField field52 = RemoteServerField ();
1299 field52.type = "password";
1300 field52.default_value = new Variant.string ("duplicate2");
1301 RemoteServerField field53 = RemoteServerField ();
1302 field53.type = "domain";
1303 field53.default_value = new Variant.string ("PRINTERS");
1304 remote_server5.fields = {field51, field52, field53};
1305
1306 server_list.resize (2);
1307 server_list[0] = remote_server2;
1308 server_list[1] = remote_server5;
1309 }
1310
1239 private bool test_key_press_cb (Gdk.EventKey event)1311 private bool test_key_press_cb (Gdk.EventKey event)
1240 {1312 {
1241 if ((event.state & Gdk.CONTROL_MASK) == 0)1313 if ((event.state & Gdk.CONTROL_MASK) == 0)
12421314
=== modified file 'tests/test.vala'
--- tests/test.vala 2013-01-04 15:28:54 +0000
+++ tests/test.vala 2013-02-11 07:47:20 +0000
@@ -183,7 +183,7 @@
183 pwd.text = "password";183 pwd.text = "password";
184 list.selected_entry.respond ({});184 list.selected_entry.respond ({});
185 GLib.assert (!list.selected_entry.has_errors);185 GLib.assert (!list.selected_entry.has_errors);
186 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");186 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
187 wait_for_scrolling_end (list);187 wait_for_scrolling_end (list);
188188
189 // Go back to the remote_directory entry and write the same password but an invalid email189 // Go back to the remote_directory entry and write the same password but an invalid email
@@ -215,7 +215,7 @@
215 pwd.text = "delay1";215 pwd.text = "delay1";
216 list.selected_entry.respond ({});216 list.selected_entry.respond ({});
217 GLib.assert (!list.selected_entry.has_errors);217 GLib.assert (!list.selected_entry.has_errors);
218 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");218 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
219219
220 bool done = false;220 bool done = false;
221 // The delay1 code triggers at 5 seconds221 // The delay1 code triggers at 5 seconds
@@ -253,7 +253,7 @@
253 pwd.text = "delay1";253 pwd.text = "delay1";
254 list.selected_entry.respond ({});254 list.selected_entry.respond ({});
255 GLib.assert (!list.selected_entry.has_errors);255 GLib.assert (!list.selected_entry.has_errors);
256 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");256 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
257 wait_for_scrolling_end (list);257 wait_for_scrolling_end (list);
258258
259 while (list.selected_entry.id.has_prefix("*remote_"))259 while (list.selected_entry.id.has_prefix("*remote_"))
@@ -299,7 +299,7 @@
299 pwd.text = "delay2";299 pwd.text = "delay2";
300 list.selected_entry.respond ({});300 list.selected_entry.respond ({});
301 GLib.assert (!list.selected_entry.has_errors);301 GLib.assert (!list.selected_entry.has_errors);
302 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");302 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
303303
304 bool done = false;304 bool done = false;
305 // The delay2 code triggers at 5 seconds305 // The delay2 code triggers at 5 seconds
@@ -307,7 +307,7 @@
307 {307 {
308 // If the login server we were disappears we get moved to a different one308 // If the login server we were disappears we get moved to a different one
309 wait_for_scrolling_end (list);309 wait_for_scrolling_end (list);
310 GLib.assert (list.selected_entry.id == "*remote_login*http://megacoolrdpserver.com");310 GLib.assert (list.selected_entry.id == "*remote_login*http://megacoolrdpserver.com*");
311 done = true;311 done = true;
312 return false;312 return false;
313 }313 }
@@ -336,10 +336,10 @@
336 pwd.text = "delay2";336 pwd.text = "delay2";
337 list.selected_entry.respond ({});337 list.selected_entry.respond ({});
338 GLib.assert (!list.selected_entry.has_errors);338 GLib.assert (!list.selected_entry.has_errors);
339 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");339 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
340340
341 // Move to a server that won't be removed341 // Move to a server that won't be removed
342 while (list.selected_entry.id != "*remote_login*http://coolrdpserver.com")342 while (list.selected_entry.id != "*remote_login*http://coolrdpserver.com*")
343 do_scroll (list, GreeterList.ScrollTarget.UP);343 do_scroll (list, GreeterList.ScrollTarget.UP);
344344
345 bool done = false;345 bool done = false;
@@ -348,7 +348,7 @@
348 {348 {
349 // If the login server we were did not disappear we are still in the same one349 // If the login server we were did not disappear we are still in the same one
350 wait_for_scrolling_end (list);350 wait_for_scrolling_end (list);
351 GLib.assert (list.selected_entry.id == "*remote_login*http://coolrdpserver.com");351 GLib.assert (list.selected_entry.id == "*remote_login*http://coolrdpserver.com*");
352 done = true;352 done = true;
353 return false;353 return false;
354 }354 }
@@ -377,7 +377,7 @@
377 pwd.text = "delay3";377 pwd.text = "delay3";
378 list.selected_entry.respond ({});378 list.selected_entry.respond ({});
379 GLib.assert (!list.selected_entry.has_errors);379 GLib.assert (!list.selected_entry.has_errors);
380 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");380 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
381381
382 bool done = false;382 bool done = false;
383 // The delay3 code triggers at 5 seconds383 // The delay3 code triggers at 5 seconds
@@ -419,7 +419,7 @@
419 pwd.text = "delay3";419 pwd.text = "delay3";
420 list.selected_entry.respond ({});420 list.selected_entry.respond ({});
421 GLib.assert (!list.selected_entry.has_errors);421 GLib.assert (!list.selected_entry.has_errors);
422 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");422 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
423 wait_for_scrolling_end (list);423 wait_for_scrolling_end (list);
424424
425 while (list.selected_entry.id.has_prefix("*remote_"))425 while (list.selected_entry.id.has_prefix("*remote_"))
@@ -473,7 +473,7 @@
473 pwd.text = "password";473 pwd.text = "password";
474 list.selected_entry.respond ({});474 list.selected_entry.respond ({});
475 GLib.assert (!list.selected_entry.has_errors);475 GLib.assert (!list.selected_entry.has_errors);
476 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");476 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
477 wait_for_scrolling_end (list);477 wait_for_scrolling_end (list);
478478
479 UnityGreeter.singleton.session_started = false;479 UnityGreeter.singleton.session_started = false;
@@ -503,7 +503,7 @@
503 pwd.text = "password";503 pwd.text = "password";
504 list.selected_entry.respond ({});504 list.selected_entry.respond ({});
505 GLib.assert (!list.selected_entry.has_errors);505 GLib.assert (!list.selected_entry.has_errors);
506 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com");506 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername2.com*lwola");
507 wait_for_scrolling_end (list);507 wait_for_scrolling_end (list);
508508
509 UnityGreeter.singleton.session_started = false;509 UnityGreeter.singleton.session_started = false;
@@ -520,6 +520,49 @@
520 mw.hide ();520 mw.hide ();
521 }521 }
522522
523 public static void remote_login_duplicate_entries()
524 {
525 MainWindow mw = setup ();
526 TestList list = mw.stack.top () as TestList;
527
528 scroll_to_remote_login (list); //Wait until remote login appears.
529 GLib.assert (list.selected_entry.id == "*remote_directory*http://crazyurl.com");
530 GLib.assert (!list.selected_entry.has_errors);
531
532 // If we answer without filling in any field -> error
533 list.selected_entry.respond ({});
534 GLib.assert (list.selected_entry.has_errors);
535
536 // Go to first and back to last to clear the error
537 do_scroll (list, GreeterList.ScrollTarget.START);
538 do_scroll (list, GreeterList.ScrollTarget.END);
539 GLib.assert (!list.selected_entry.has_errors);
540
541 // Fill in a valid email and password
542 // Check there is no error and we moved to the last logged in server
543 var email = remote_directory_entry_email_field (list);
544 var pwd = remote_directory_entry_password_field (list);
545 email.text = "a@canonical.com";
546 pwd.text = "duplicate";
547 list.selected_entry.respond ({});
548 GLib.assert (!list.selected_entry.has_errors);
549 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername.com*alowl2");
550
551 var username = remote_login_entry_username_field(list);
552 var domain = remote_login_entry_domain_field(list);
553 var password = remote_login_entry_password_field(list);
554 GLib.assert (username.text == "alowl2" && domain.text == "PRINTERS" && password.text == "duplicate2");
555
556 do_scroll (list, GreeterList.ScrollTarget.DOWN);
557 GLib.assert (list.selected_entry.id == "*remote_login*http://rdpdefaultusername.com*alowl1");
558 username = remote_login_entry_username_field(list);
559 domain = remote_login_entry_domain_field(list);
560 password = remote_login_entry_password_field(list);
561 GLib.assert (username.text == "alowl1" && domain.text == "SCANNERS" && password.text == "duplicate1");
562 wait_for_scrolling_end (list);
563 mw.hide ();
564 }
565
523 public static void email_autocomplete ()566 public static void email_autocomplete ()
524 {567 {
525 MainWindow mw = setup ();568 MainWindow mw = setup ();
@@ -587,7 +630,7 @@
587 list.selected_entry.respond ({});630 list.selected_entry.respond ({});
588 wait_for_scrolling_end (list);631 wait_for_scrolling_end (list);
589632
590 while (list.selected_entry.id != "*remote_login*http://coolrdpserver.com")633 while (list.selected_entry.id != "*remote_login*http://coolrdpserver.com*")
591 do_scroll (list, GreeterList.ScrollTarget.UP);634 do_scroll (list, GreeterList.ScrollTarget.UP);
592635
593 var domain = remote_login_entry_domain_field (list);636 var domain = remote_login_entry_domain_field (list);
@@ -626,7 +669,7 @@
626 list.selected_entry.respond ({});669 list.selected_entry.respond ({});
627 wait_for_scrolling_end (list);670 wait_for_scrolling_end (list);
628671
629 while (list.selected_entry.id != "*remote_login*http://notsupportedserver.com")672 while (list.selected_entry.id != "*remote_login*http://notsupportedserver.com*")
630 do_scroll (list, GreeterList.ScrollTarget.UP);673 do_scroll (list, GreeterList.ScrollTarget.UP);
631674
632 GLib.assert (list.selected_entry.has_errors);675 GLib.assert (list.selected_entry.has_errors);
@@ -675,6 +718,7 @@
675718
676 GLib.Test.add_func ("/Simple Navigation", simple_navigation);719 GLib.Test.add_func ("/Simple Navigation", simple_navigation);
677 GLib.Test.add_func ("/Remote Login", remote_login);720 GLib.Test.add_func ("/Remote Login", remote_login);
721 GLib.Test.add_func ("/Remote Login duplicate entries", remote_login_duplicate_entries);
678 GLib.Test.add_func ("/Remote Login with Servers Updated signal", remote_login_servers_updated_signal);722 GLib.Test.add_func ("/Remote Login with Servers Updated signal", remote_login_servers_updated_signal);
679 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);723 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);
680 GLib.Test.add_func ("/Remote Login with Login Servers Updated signal", remote_login_login_servers_updated_signal);724 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