/services/sync/tests/unit/test_service_wipeServer.js

http://github.com/zpao/v8monkey · JavaScript · 221 lines · 172 code · 40 blank · 9 comment · 2 complexity · 3db066a42186b4fdf5029c0e3557c535 MD5 · raw file

  1. Cu.import("resource://services-sync/util.js");
  2. Cu.import("resource://services-sync/record.js");
  3. Cu.import("resource://services-sync/resource.js");
  4. Svc.DefaultPrefs.set("registerEngines", "");
  5. Cu.import("resource://services-sync/service.js");
  6. function FakeCollection() {
  7. this.deleted = false;
  8. }
  9. FakeCollection.prototype = {
  10. handler: function() {
  11. let self = this;
  12. return function(request, response) {
  13. let body = "";
  14. self.timestamp = new_timestamp();
  15. let timestamp = "" + self.timestamp;
  16. if (request.method == "DELETE") {
  17. body = timestamp;
  18. self.deleted = true;
  19. }
  20. response.setHeader("X-Weave-Timestamp", timestamp);
  21. response.setStatusLine(request.httpVersion, 200, "OK");
  22. response.bodyOutputStream.write(body, body.length);
  23. };
  24. }
  25. };
  26. function setUpTestFixtures() {
  27. let cryptoService = new FakeCryptoService();
  28. Service.clusterURL = "http://localhost:8080/";
  29. Service.username = "johndoe";
  30. Service.passphrase = "aabcdeabcdeabcdeabcdeabcde";
  31. }
  32. function run_test() {
  33. initTestLogging("Trace");
  34. run_next_test();
  35. }
  36. add_test(function test_wipeServer_list_success() {
  37. _("Service.wipeServer() deletes collections given as argument.");
  38. let steam_coll = new FakeCollection();
  39. let diesel_coll = new FakeCollection();
  40. let server = httpd_setup({
  41. "/1.1/johndoe/storage/steam": steam_coll.handler(),
  42. "/1.1/johndoe/storage/diesel": diesel_coll.handler(),
  43. "/1.1/johndoe/storage/petrol": httpd_handler(404, "Not Found")
  44. });
  45. try {
  46. setUpTestFixtures();
  47. _("Confirm initial environment.");
  48. do_check_false(steam_coll.deleted);
  49. do_check_false(diesel_coll.deleted);
  50. _("wipeServer() will happily ignore the non-existent collection and use the timestamp of the last DELETE that was successful.");
  51. let timestamp = Service.wipeServer(["steam", "diesel", "petrol"]);
  52. do_check_eq(timestamp, diesel_coll.timestamp);
  53. _("wipeServer stopped deleting after encountering an error with the 'petrol' collection, thus only 'steam' has been deleted.");
  54. do_check_true(steam_coll.deleted);
  55. do_check_true(diesel_coll.deleted);
  56. } finally {
  57. server.stop(run_next_test);
  58. Svc.Prefs.resetBranch("");
  59. }
  60. });
  61. add_test(function test_wipeServer_list_503() {
  62. _("Service.wipeServer() deletes collections given as argument.");
  63. let steam_coll = new FakeCollection();
  64. let diesel_coll = new FakeCollection();
  65. let server = httpd_setup({
  66. "/1.1/johndoe/storage/steam": steam_coll.handler(),
  67. "/1.1/johndoe/storage/petrol": httpd_handler(503, "Service Unavailable"),
  68. "/1.1/johndoe/storage/diesel": diesel_coll.handler()
  69. });
  70. try {
  71. setUpTestFixtures();
  72. _("Confirm initial environment.");
  73. do_check_false(steam_coll.deleted);
  74. do_check_false(diesel_coll.deleted);
  75. _("wipeServer() will happily ignore the non-existent collection, delete the 'steam' collection and abort after an receiving an error on the 'petrol' collection.");
  76. let error;
  77. try {
  78. Service.wipeServer(["non-existent", "steam", "petrol", "diesel"]);
  79. do_throw("Should have thrown!");
  80. } catch(ex) {
  81. error = ex;
  82. }
  83. _("wipeServer() threw this exception: " + error);
  84. do_check_eq(error.status, 503);
  85. _("wipeServer stopped deleting after encountering an error with the 'petrol' collection, thus only 'steam' has been deleted.");
  86. do_check_true(steam_coll.deleted);
  87. do_check_false(diesel_coll.deleted);
  88. } finally {
  89. server.stop(run_next_test);
  90. Svc.Prefs.resetBranch("");
  91. }
  92. });
  93. add_test(function test_wipeServer_all_success() {
  94. _("Service.wipeServer() deletes all the things.");
  95. /**
  96. * Handle the bulk DELETE request sent by wipeServer.
  97. */
  98. let deleted = false;
  99. let serverTimestamp;
  100. function storageHandler(request, response) {
  101. do_check_eq("DELETE", request.method);
  102. do_check_true(request.hasHeader("X-Confirm-Delete"));
  103. deleted = true;
  104. serverTimestamp = return_timestamp(request, response);
  105. }
  106. let server = httpd_setup({
  107. "/1.1/johndoe/storage": storageHandler
  108. });
  109. setUpTestFixtures();
  110. _("Try deletion.");
  111. let returnedTimestamp = Service.wipeServer();
  112. do_check_true(deleted);
  113. do_check_eq(returnedTimestamp, serverTimestamp);
  114. server.stop(run_next_test);
  115. Svc.Prefs.resetBranch("");
  116. });
  117. add_test(function test_wipeServer_all_404() {
  118. _("Service.wipeServer() accepts a 404.");
  119. /**
  120. * Handle the bulk DELETE request sent by wipeServer. Returns a 404.
  121. */
  122. let deleted = false;
  123. let serverTimestamp;
  124. function storageHandler(request, response) {
  125. do_check_eq("DELETE", request.method);
  126. do_check_true(request.hasHeader("X-Confirm-Delete"));
  127. deleted = true;
  128. serverTimestamp = new_timestamp();
  129. response.setHeader("X-Weave-Timestamp", "" + serverTimestamp);
  130. response.setStatusLine(request.httpVersion, 404, "Not Found");
  131. }
  132. let server = httpd_setup({
  133. "/1.1/johndoe/storage": storageHandler
  134. });
  135. setUpTestFixtures();
  136. _("Try deletion.");
  137. let returnedTimestamp = Service.wipeServer();
  138. do_check_true(deleted);
  139. do_check_eq(returnedTimestamp, serverTimestamp);
  140. server.stop(run_next_test);
  141. Svc.Prefs.resetBranch("");
  142. });
  143. add_test(function test_wipeServer_all_503() {
  144. _("Service.wipeServer() throws if it encounters a non-200/404 response.");
  145. /**
  146. * Handle the bulk DELETE request sent by wipeServer. Returns a 503.
  147. */
  148. function storageHandler(request, response) {
  149. do_check_eq("DELETE", request.method);
  150. do_check_true(request.hasHeader("X-Confirm-Delete"));
  151. response.setStatusLine(request.httpVersion, 503, "Service Unavailable");
  152. }
  153. let server = httpd_setup({
  154. "/1.1/johndoe/storage": storageHandler
  155. });
  156. setUpTestFixtures();
  157. _("Try deletion.");
  158. let error;
  159. try {
  160. Service.wipeServer();
  161. do_throw("Should have thrown!");
  162. } catch (ex) {
  163. error = ex;
  164. }
  165. do_check_eq(error.status, 503);
  166. server.stop(run_next_test);
  167. Svc.Prefs.resetBranch("");
  168. });
  169. add_test(function test_wipeServer_all_connectionRefused() {
  170. _("Service.wipeServer() throws if it encounters a network problem.");
  171. setUpTestFixtures();
  172. _("Try deletion.");
  173. try {
  174. Service.wipeServer();
  175. do_throw("Should have thrown!");
  176. } catch (ex) {
  177. do_check_eq(ex.result, Cr.NS_ERROR_CONNECTION_REFUSED);
  178. }
  179. run_next_test();
  180. Svc.Prefs.resetBranch("");
  181. });