services/common/tests/unit/test_storageservice_client.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* Any copyright is dedicated to the Public Domain.
     2  * http://creativecommons.org/publicdomain/zero/1.0/ */
     4 Cu.import("resource://services-common/storageservice.js");
     5 Cu.import("resource://testing-common/services-common/storageserver.js");
     7 function run_test() {
     8   initTestLogging("Trace");
    10   run_next_test();
    11 }
    13 function getRandomUser() {
    14   return "" + (Math.floor(Math.random() * 100000) + 1);
    15 }
    17 function getEmptyServer(user=getRandomUser(), password="password") {
    18   let users = {};
    19   users[user] = password;
    21   return storageServerForUsers(users, {
    22     meta:    {},
    23     clients: {},
    24     crypto:  {},
    25   });
    26 }
    28 function getClient(server, user=getRandomUser(), password="password") {
    29   let identity = server.server.identity;
    30   let url = identity.primaryScheme + "://" + identity.primaryHost + ":" +
    31             identity.primaryPort + "/2.0/" + user;
    32   let client = new StorageServiceClient(url);
    33   client.addListener({
    34     onDispatch: function onDispatch(request) {
    35       let up = user + ":" + password;
    36       request.request.setHeader("authorization", "Basic " + btoa(up));
    37     }
    38   });
    40   return client;
    41 }
    43 function getServerAndClient(user=getRandomUser(), password="password") {
    44   let server = getEmptyServer(user, password);
    45   let client = getClient(server, user, password);
    47   return [server, client, user, password];
    48 }
    50 add_test(function test_auth_failure_listener() {
    51   _("Ensure the onAuthFailure listener is invoked.");
    53   let server = getEmptyServer();
    54   let client = getClient(server, "324", "INVALID");
    55   client.addListener({
    56     onAuthFailure: function onAuthFailure(client, request) {
    57       _("onAuthFailure");
    58       server.stop(run_next_test);
    59     }
    60   });
    62   let request = client.getCollectionInfo();
    63   request.dispatch();
    64 });
    66 add_test(function test_duplicate_listeners() {
    67   _("Ensure that duplicate listeners aren't installed multiple times.");
    69   let server = getEmptyServer();
    70   let client = getClient(server, "1234567", "BAD_PASSWORD");
    72   let invokeCount = 0;
    73   let listener = {
    74     onAuthFailure: function onAuthFailure() {
    75       invokeCount++;
    76     }
    77   };
    79   client.addListener(listener);
    80   // No error expected.
    81   client.addListener(listener);
    83   let request = client.getCollectionInfo();
    84   request.dispatch(function onComplete() {
    85     do_check_eq(invokeCount, 1);
    87     server.stop(run_next_test);
    88   });
    89 });
    91 add_test(function test_handler_object() {
    92   _("Ensure that installed handlers get their callbacks invoked.");
    94   let [server, client] = getServerAndClient();
    96   let onCompleteCount = 0;
    97   let onDispatchCount = 0;
    99   let handler = {
   100     onComplete: function onComplete() {
   101       onCompleteCount++;
   103       do_check_eq(onDispatchCount, 1);
   104       do_check_eq(onCompleteCount, 1);
   106       server.stop(run_next_test);
   107     },
   109     onDispatch: function onDispatch() {
   110       onDispatchCount++;
   111     },
   112   };
   113   let request = client.getCollectionInfo();
   114   request.handler = handler;
   115   request.dispatch();
   116 });
   118 add_test(function test_info_collections() {
   119   _("Ensure requests to /info/collections work as expected.");
   121   let [server, client] = getServerAndClient();
   123   let request = client.getCollectionInfo();
   124   request.dispatch(function onComplete(error, req) {
   125     do_check_null(error);
   126     do_check_eq("object", typeof req.resultObj);
   127     do_check_attribute_count(req.resultObj, 3);
   128     do_check_true("meta" in req.resultObj);
   130     server.stop(run_next_test);
   131   });
   132 });
   134 add_test(function test_info_collections_conditional_not_modified() {
   135   _("Ensure conditional getCollectionInfo requests work.");
   137   let [server, client, username] = getServerAndClient();
   138   let user = server.user(username);
   140   let now = Date.now();
   142   user.createCollection("testcoll", {
   143     foo: new ServerBSO("foo", "payload", now)
   144   });
   146   let request = client.getCollectionInfo();
   147   request.locallyModifiedVersion = now + 10;
   148   request.dispatch(function onComplete(error, req) {
   149     do_check_null(error);
   150     do_check_true(req.notModified);
   152     server.stop(run_next_test);
   153   });
   154 });
   156 add_test(function test_info_collections_conditional_modified() {
   157   _("Ensure conditional getCollectionInfo requests work.");
   159   let [server, client, username] = getServerAndClient();
   160   let user = server.user(username);
   162   let now = Date.now();
   164   user.createCollection("testcoll", {
   165     foo: new ServerBSO("foo", "payload", now)
   166   });
   168   let request = client.getCollectionInfo();
   169   request.locallyModifiedVersion = now - 10;
   170   request.dispatch(function onComplete(error, req) {
   171     do_check_null(error);
   172     do_check_false(req.notModified);
   174     server.stop(run_next_test);
   175   });
   176 });
   178 add_test(function test_get_quota() {
   179   _("Ensure quota requests work.");
   181   let [server, client] = getServerAndClient();
   183   let request = client.getQuota();
   184   request.dispatch(function onComplete(error, req) {
   185     do_check_null(error);
   187     do_check_eq(req.resultObj.quota, 1048576);
   189     server.stop(run_next_test);
   190   });
   191 });
   193 add_test(function test_get_quota_conditional_not_modified() {
   194   _("Ensure conditional getQuota requests work.");
   196   let [server, client, username] = getServerAndClient();
   197   let user = server.user(username);
   199   let now = Date.now();
   201   user.createCollection("testcoll", {
   202     foo: new ServerBSO("foo", "payload", now)
   203   });
   205   let request = client.getQuota();
   206   request.locallyModifiedVersion = now + 10;
   207   request.dispatch(function onComplete(error, req) {
   208     do_check_null(error);
   209     do_check_true(req.notModified);
   211     server.stop(run_next_test);
   212   });
   213 });
   215 add_test(function test_get_quota_conditional_modified() {
   216   _("Ensure conditional getQuota requests work.");
   218   let [server, client, username] = getServerAndClient();
   219   let user = server.user(username);
   221   let now = Date.now();
   223   user.createCollection("testcoll", {
   224     foo: new ServerBSO("foo", "payload", now)
   225   });
   227   let request = client.getQuota();
   228   request.locallyModifiedVersion = now - 10;
   229   request.dispatch(function onComplete(error, req) {
   230     do_check_null(error);
   231     do_check_false(req.notModified);
   233     server.stop(run_next_test);
   234   });
   235 });
   237 add_test(function test_get_collection_usage() {
   238   _("Ensure info/collection_usage requests work.");
   240   let [server, client, username] = getServerAndClient();
   241   let user = server.user(username);
   243   user.createCollection("testcoll", {
   244     abc123: new ServerBSO("abc123", "payload", Date.now())
   245   });
   247   let request = client.getCollectionUsage();
   248   request.dispatch(function onComplete(error, req) {
   249     do_check_null(error);
   251     let usage = req.resultObj;
   252     do_check_true("testcoll" in usage);
   253     do_check_eq(usage.testcoll, "payload".length);
   255     server.stop(run_next_test);
   256   });
   257 });
   259 add_test(function test_get_usage_conditional_not_modified() {
   260   _("Ensure conditional getCollectionUsage requests work.");
   262   let [server, client, username] = getServerAndClient();
   263   let user = server.user(username);
   265   let now = Date.now();
   267   user.createCollection("testcoll", {
   268     foo: new ServerBSO("foo", "payload", now)
   269   });
   271   let request = client.getCollectionUsage();
   272   request.locallyModifiedVersion = now + 10;
   273   request.dispatch(function onComplete(error, req) {
   274     do_check_null(error);
   275     do_check_true(req.notModified);
   277     server.stop(run_next_test);
   278   });
   279 });
   281 add_test(function test_get_usage_conditional_modified() {
   282   _("Ensure conditional getCollectionUsage requests work.");
   284   let [server, client, username] = getServerAndClient();
   285   let user = server.user(username);
   287   let now = Date.now();
   289   user.createCollection("testcoll", {
   290     foo: new ServerBSO("foo", "payload", now)
   291   });
   293   let request = client.getCollectionUsage();
   294   request.locallyModifiedVersion = now - 10;
   295   request.dispatch(function onComplete(error, req) {
   296     do_check_null(error);
   297     do_check_false(req.notModified);
   299     server.stop(run_next_test);
   300   });
   301 });
   303 add_test(function test_get_collection_counts() {
   304   _("Ensure info/collection_counts requests work.");
   306   let [server, client, username] = getServerAndClient();
   307   let user = server.user(username);
   309   user.createCollection("testcoll", {
   310     foo: new ServerBSO("foo", "payload0", Date.now()),
   311     bar: new ServerBSO("bar", "payload1", Date.now())
   312   });
   314   let request = client.getCollectionCounts();
   315   request.dispatch(function onComplete(error, req) {
   316     do_check_null(error);
   318     let counts = req.resultObj;
   319     do_check_true("testcoll" in counts);
   320     do_check_eq(counts.testcoll, 2);
   322     server.stop(run_next_test);
   323   });
   324 });
   326 add_test(function test_get_counts_conditional_not_modified() {
   327   _("Ensure conditional getCollectionCounts requests work.");
   329   let [server, client, username] = getServerAndClient();
   330   let user = server.user(username);
   332   let now = Date.now();
   334   user.createCollection("testcoll", {
   335     foo: new ServerBSO("foo", "payload", now)
   336   });
   338   let request = client.getCollectionCounts();
   339   request.locallyModifiedVersion = now + 10;
   340   request.dispatch(function onComplete(error, req) {
   341     do_check_null(error);
   342     do_check_true(req.notModified);
   344     server.stop(run_next_test);
   345   });
   346 });
   348 add_test(function test_get_counts_conditional_modified() {
   349   _("Ensure conditional getCollectionCounts requests work.");
   351   let [server, client, username] = getServerAndClient();
   352   let user = server.user(username);
   354   let now = Date.now();
   356   user.createCollection("testcoll", {
   357     foo: new ServerBSO("foo", "payload", now)
   358   });
   360   let request = client.getCollectionCounts();
   361   request.locallyModifiedVersion = now - 10;
   362   request.dispatch(function onComplete(error, req) {
   363     do_check_null(error);
   364     do_check_false(req.notModified);
   366     server.stop(run_next_test);
   367   });
   368 });
   370 add_test(function test_get_collection_simple() {
   371   _("Ensure basic collection retrieval works.");
   373   let [server, client, username] = getServerAndClient();
   374   let user = server.user(username);
   376   user.createCollection("testcoll", {
   377     foo: new ServerBSO("foo", "payload0", Date.now()),
   378     bar: new ServerBSO("bar", "payload1", Date.now())
   379   });
   381   let request = client.getCollection("testcoll");
   382   let bsos = [];
   383   request.handler = {
   384     onBSORecord: function onBSORecord(request, bso) {
   385       bsos.push(bso);
   386     },
   388     onComplete: function onComplete(error, request) {
   389       do_check_null(error);
   391       do_check_eq(bsos.length, 2);
   392       do_check_eq(bsos[0], "foo");
   393       do_check_eq(bsos[1], "bar");
   395       server.stop(run_next_test);
   396     }
   397   };
   398   request.dispatch();
   399 });
   401 add_test(function test_get_collection_conditional_not_modified() {
   402   _("Ensure conditional requests with no new data to getCollection work.");
   404   let [server, client, username] = getServerAndClient();
   405   let user = server.user(username);
   407   let now = Date.now();
   409   user.createCollection("testcoll", {
   410     foo: new ServerBSO("foo", "payload0", now)
   411   });
   413   let request = client.getCollection("testcoll");
   414   request.locallyModifiedVersion = now + 1;
   416   request.dispatch(function onComplete(error, req) {
   417     do_check_null(error);
   419     do_check_true(req.notModified);
   421     server.stop(run_next_test);
   422   });
   423 });
   425 add_test(function test_get_collection_conditional_modified() {
   426   _("Ensure conditional requests with new data to getCollection work.");
   428   let [server, client, username] = getServerAndClient();
   429   let user = server.user(username);
   431   let now = Date.now();
   433   user.createCollection("testcoll", {
   434     foo: new ServerBSO("foo", "payload0", now)
   435   });
   437   let request = client.getCollection("testcoll");
   438   request.locallyModifiedVersion = now - 1;
   440   let bsoCount = 0;
   441   request.handler = {
   442     onBSORecord: function onBSORecord() {
   443       bsoCount++;
   444     },
   446     onComplete: function onComplete(error, req) {
   447       do_check_null(error);
   449       do_check_false(req.notModified);
   450       do_check_eq(bsoCount, 1);
   452       server.stop(run_next_test);
   453     }
   454   };
   455   request.dispatch();
   456 });
   458 // This is effectively a sanity test for query string generation.
   459 add_test(function test_get_collection_newer() {
   460   _("Ensure query string for newer and full work together.");
   462   let [server, client, username] = getServerAndClient();
   464   let date0 = Date.now();
   465   let date1 = date0 + 500;
   467   let user = server.user(username);
   468   user.createCollection("testcoll", {
   469     foo: new ServerBSO("foo", "payload0", date0),
   470     bar: new ServerBSO("bar", "payload1", date1)
   471   });
   473   let request = client.getCollection("testcoll");
   474   request.full = true;
   475   request.newer = date0;
   477   let bsos = [];
   478   request.handler = {
   479     onBSORecord: function onBSORecord(request, bso) {
   480       bsos.push(bso);
   481     },
   483     onComplete: function onComplete(error, req) {
   484       do_check_null(error);
   486       do_check_eq(bsos.length, 1);
   487       let bso = bsos[0];
   489       do_check_eq(bso.id, "bar");
   490       do_check_eq(bso.payload, "payload1");
   492       server.stop(run_next_test);
   493     }
   494   };
   495   request.dispatch();
   496 });
   498 add_test(function test_get_bso() {
   499   _("Ensure that simple BSO fetches work.");
   501   let [server, client, username] = getServerAndClient();
   503   server.createCollection(username, "testcoll", {
   504     abc123: new ServerBSO("abc123", "payload", Date.now())
   505   });
   507   let request = client.getBSO("testcoll", "abc123");
   508   request.dispatch(function(error, req) {
   509     do_check_null(error);
   510     do_check_true(req.resultObj instanceof BasicStorageObject);
   512     let bso = req.resultObj;
   513     do_check_eq(bso.id, "abc123");
   514     do_check_eq(bso.payload, "payload");
   516     server.stop(run_next_test);
   517   });
   518 });
   520 add_test(function test_bso_conditional() {
   521   _("Ensure conditional requests for an individual BSO work.");
   523   let [server, client, username] = getServerAndClient();
   525   let user = server.user(username);
   526   let now = Date.now();
   527   user.createCollection("testcoll", {
   528     foo: new ServerBSO("foo", "payload", now)
   529   });
   531   let request = client.getBSO("testcoll", "foo");
   532   request.locallyModifiedVersion = now;
   534   request.dispatch(function onComplete(error, req) {
   535     do_check_null(error);
   536     do_check_true(req.notModified);
   538     server.stop(run_next_test);
   539   });
   540 });
   542 add_test(function test_set_bso() {
   543   _("Ensure simple BSO PUT works.");
   545   let [server, client] = getServerAndClient();
   547   let id = "mnas08h3f3r2351";
   549   let bso = new BasicStorageObject(id, "testcoll");
   550   bso.payload = "my test payload";
   552   let request = client.setBSO(bso);
   553   request.dispatch(function(error, req) {
   554     do_check_eq(error, null);
   555     do_check_eq(req.resultObj, null);
   557     server.stop(run_next_test);
   558   });
   559 });
   562 add_test(function test_set_bso_conditional() {
   563   _("Ensure conditional setting a BSO is properly rejected.");
   565   let [server, client, username] = getServerAndClient();
   566   let user = server.user(username);
   568   let now = Date.now();
   569   user.createCollection("testcoll", {
   570     foo: new ServerBSO("foo", "payload0", now + 1000)
   571   });
   573   // Should get an mtime newer than server's.
   574   let bso = new BasicStorageObject("foo", "testcoll");
   575   bso.payload = "payload1";
   577   let request = client.setBSO(bso);
   578   request.locallyModifiedVersion = now;
   579   request.dispatch(function onComplete(error, req) {
   580     do_check_true(error instanceof StorageServiceRequestError);
   581     do_check_true(error.serverModified);
   583     server.stop(run_next_test);
   584   });
   585 });
   587 add_test(function test_set_bso_argument_errors() {
   588   _("Ensure BSO set detects invalid arguments.");
   590   let server = getEmptyServer();
   591   let bso = new BasicStorageObject();
   592   let client = getClient(server);
   594   let threw = false;
   595   try {
   596     client.setBSO(bso);
   597   } catch (ex) {
   598     threw = true;
   599     do_check_eq(ex.name, "Error");
   600     do_check_neq(ex.message.indexOf("does not have collection defined"), -1);
   601   } finally {
   602     do_check_true(threw);
   603     threw = false;
   604   }
   606   bso = new BasicStorageObject("id");
   607   try {
   608     client.setBSO(bso);
   609   } catch (ex) {
   610     threw = true;
   611     do_check_eq(ex.name, "Error");
   612     do_check_neq(ex.message.indexOf("does not have collection defined"), -1);
   613   } finally {
   614     do_check_true(threw);
   615     threw = false;
   616   }
   618   bso = new BasicStorageObject(null, "coll");
   619   try {
   620     client.setBSO(bso);
   621   } catch (ex) {
   622     threw = true;
   623     do_check_eq(ex.name, "Error");
   624     do_check_neq(ex.message.indexOf("does not have ID defined"), -1);
   625   } finally {
   626     do_check_true(threw);
   627     threw = false;
   628   }
   630   server.stop(run_next_test);
   631 });
   633 add_test(function test_set_bsos_simple() {
   634   _("Ensure setBSOs with basic options works.");
   636   let [server, client, username] = getServerAndClient();
   637   let user = server.user(username);
   639   let bso0 = new BasicStorageObject("foo");
   640   bso0.payload = "payload0";
   642   let bso1 = new BasicStorageObject("bar");
   643   bso1.payload = "payload1";
   645   let request = client.setBSOs("testcollection");
   646   request.addBSO(bso0);
   647   request.addBSO(bso1);
   649   request.dispatch(function onComplete(error, req) {
   650     do_check_null(error);
   652     let successful = req.successfulIDs;
   653     do_check_eq(successful.length, 2);
   654     do_check_eq(successful.indexOf(bso0.id), 0);
   655     do_check_true(successful.indexOf(bso1.id), 1);
   657     server.stop(run_next_test);
   658   });
   659 });
   661 add_test(function test_set_bsos_invalid_bso() {
   662   _("Ensure that adding an invalid BSO throws.");
   664   let server = getEmptyServer();
   665   let client = getClient(server);
   666   let request = client.setBSOs("testcoll");
   668   let threw = false;
   670   // Empty argument is invalid.
   671   try {
   672     request.addBSO(null);
   673   } catch (ex) {
   674     threw = true;
   675   } finally {
   676     do_check_true(threw);
   677     threw = false;
   678   }
   680   try {
   681     let bso = new BasicStorageObject();
   682     request.addBSO(bso);
   683   } catch (ex) {
   684     threw = true;
   685   } finally {
   686     do_check_true(threw);
   687     threw = false;
   688   }
   690   server.stop(run_next_test);
   691 });
   693 add_test(function test_set_bsos_newline() {
   694   _("Ensure that newlines in BSO payloads are formatted properly.");
   696   let [server, client, username] = getServerAndClient();
   697   let user = server.user(username);
   699   let request = client.setBSOs("testcoll");
   701   let bso0 = new BasicStorageObject("bso0");
   702   bso0.payload = "hello\nworld";
   703   request.addBSO(bso0);
   705   let bso1 = new BasicStorageObject("bso1");
   706   bso1.payload = "foobar";
   707   request.addBSO(bso1);
   709   request.dispatch(function onComplete(error, request) {
   710     do_check_null(error);
   711     do_check_eq(request.successfulIDs.length, 2);
   713     let coll = user.collection("testcoll");
   714     do_check_eq(coll.bso("bso0").payload, bso0.payload);
   715     do_check_eq(coll.bso("bso1").payload, bso1.payload);
   717     server.stop(run_next_test);
   718   });
   719 });
   721 add_test(function test_delete_bso_simple() {
   722   _("Ensure deletion of individual BSOs works.");
   724   let [server, client, username] = getServerAndClient();
   726   let user = server.user(username);
   727   let coll = user.createCollection("testcoll", {
   728     foo: new ServerBSO("foo", "payload0", Date.now()),
   729     bar: new ServerBSO("bar", "payload1", Date.now())
   730   });
   732   let request = client.deleteBSO("testcoll", "foo");
   733   request.dispatch(function onComplete(error, req) {
   734     do_check_null(error);
   735     do_check_eq(req.statusCode, 204);
   737     do_check_eq(coll.count(), 1);
   739     server.stop(run_next_test);
   740   });
   741 });
   743 add_test(function test_delete_bso_conditional_failed() {
   744   _("Ensure deletion of an individual BSO with older modification fails.");
   746   let [server, client, username] = getServerAndClient();
   747   let user = server.user(username);
   749   let now = Date.now();
   750   user.createCollection("testcoll", {
   751     foo: new ServerBSO("foo", "payload0", now)
   752   });
   754   let request = client.deleteBSO("testcoll", "foo");
   755   request.locallyModifiedVersion = now - 10;
   757   request.dispatch(function onComplete(error, req) {
   758     do_check_true(error instanceof StorageServiceRequestError);
   759     do_check_true(error.serverModified);
   761     server.stop(run_next_test);
   762   });
   763 });
   765 add_test(function test_delete_bso_conditional_success() {
   766   _("Ensure deletion of an individual BSO with newer modification works.");
   768   let [server, client, username] = getServerAndClient();
   769   let user = server.user(username);
   771   let now = Date.now();
   772   user.createCollection("testcoll", {
   773     foo: new ServerBSO("foo", "payload0", now)
   774   });
   776   let request = client.deleteBSO("testcoll", "foo");
   777   request.locallyModifiedVersion = now;
   779   request.dispatch(function onComplete(error, req) {
   780     do_check_null(error);
   781     do_check_eq(req.statusCode, 204);
   783     server.stop(run_next_test);
   784   });
   785 });
   787 add_test(function test_delete_bsos_simple() {
   788   _("Ensure deletion of multiple BSOs works.");
   790   let [server, client, username] = getServerAndClient();
   791   let user = server.user(username);
   793   let coll = user.createCollection("testcoll", {
   794     foo: new ServerBSO("foo", "payload0", Date.now()),
   795     bar: new ServerBSO("bar", "payload1", Date.now()),
   796     baz: new ServerBSO("baz", "payload2", Date.now())
   797   });
   799   let request = client.deleteBSOs("testcoll", ["foo", "baz"]);
   800   request.dispatch(function onComplete(error, req) {
   801     do_check_null(error);
   802     do_check_eq(req.statusCode, 204);
   804     do_check_eq(coll.count(), 1);
   806     server.stop(run_next_test);
   807   });
   808 });
   810 add_test(function test_delete_bsos_conditional_failed() {
   811   _("Ensure deletion of BSOs with server modifications fails.");
   813   let [server, client, username] = getServerAndClient();
   814   let user = server.user(username);
   816   let now = Date.now();
   817   let coll = user.createCollection("testcoll", {
   818     foo: new ServerBSO("foo", "payload0", now)
   819   });
   821   let request = client.deleteBSOs("testcoll", ["foo"]);
   822   request.locallyModifiedVersion = coll.timestamp - 1;
   824   request.dispatch(function onComplete(error, req) {
   825     do_check_true(error instanceof StorageServiceRequestError);
   826     do_check_true(error.serverModified);
   828     server.stop(run_next_test);
   829   });
   830 });
   832 add_test(function test_delete_bsos_conditional_success() {
   833   _("Ensure conditional deletion of BSOs without server modifications works.");
   835   let [server, client, username] = getServerAndClient();
   836   let user = server.user(username);
   838   let now = Date.now();
   839   let coll = user.createCollection("testcoll", {
   840     foo: new ServerBSO("foo", "payload0", now),
   841     bar: new ServerBSO("bar", "payload1", now - 10)
   842   });
   844   let request = client.deleteBSOs("testcoll", ["bar"]);
   845   request.locallyModifiedVersion = coll.timestamp;
   847   request.dispatch(function onComplete(error, req) {
   848     do_check_null(error);
   850     do_check_eq(req.statusCode, 204);
   852     server.stop(run_next_test);
   853   });
   854 });
   856 add_test(function test_delete_collection() {
   857   _("Ensure deleteCollection() works.");
   859   let [server, client, username] = getServerAndClient();
   860   let user = server.user(username);
   862   user.createCollection("testcoll", {
   863     foo: new ServerBSO("foo", "payload0", Date.now())
   864   });
   866   let request = client.deleteCollection("testcoll");
   867   request.dispatch(function onComplete(error, req) {
   868     do_check_null(error);
   870     do_check_eq(user.collection("testcoll", undefined));
   872     server.stop(run_next_test);
   873   });
   874 });
   876 add_test(function test_delete_collection_conditional_failed() {
   877   _("Ensure conditional deletes with server modifications fail.");
   879   let [server, client, username] = getServerAndClient();
   880   let user = server.user(username);
   882   let now = Date.now();
   884   let coll = user.createCollection("testcoll", {
   885     foo: new ServerBSO("foo", "payload0", now)
   886   });
   888   let request = client.deleteCollection("testcoll");
   889   request.locallyModifiedVersion = coll.timestamp - 1;
   891   request.dispatch(function onComplete(error, req) {
   892     do_check_true(error instanceof StorageServiceRequestError);
   893     do_check_true(error.serverModified);
   895     server.stop(run_next_test);
   896   });
   897 });
   899 add_test(function test_delete_collection_conditional_success() {
   900   _("Ensure conditional delete of collection works when it's supposed to.");
   902   let [server, client, username] = getServerAndClient();
   903   let user = server.user(username);
   905   let now = Date.now();
   907   let coll = user.createCollection("testcoll", {
   908     foo: new ServerBSO("foo", "payload0", now)
   909   });
   911   let request = client.deleteCollection("testcoll");
   912   request.locallyModifiedVersion = coll.timestamp;
   914   request.dispatch(function onComplete(error, req) {
   915     do_check_null(error);
   917     do_check_eq(user.collection("testcoll"), undefined);
   919     server.stop(run_next_test);
   920   });
   921 });
   923 add_test(function test_delete_collections() {
   924   _("Ensure deleteCollections() works.");
   926   let [server, client, username] = getServerAndClient();
   927   let user = server.user(username);
   929   user.createCollection("testColl", {
   930     foo: new ServerBSO("foo", "payload0", Date.now())
   931   });
   933   let request = client.deleteCollections();
   934   request.dispatch(function onComplete(error, req) {
   935     do_check_null(error);
   937     do_check_eq(user.collection("testcoll"), undefined);
   939     server.stop(run_next_test);
   940   });
   941 });
   943 add_test(function test_network_error_captured() {
   944   _("Ensure network errors are captured.");
   946   // Network errors should result in .networkError being set on request.
   947   let client = new StorageServiceClient("http://rnewman-is-splendid.badtld/");
   949   let request = client.getCollectionInfo();
   950   request.dispatch(function(error, req) {
   951     do_check_neq(error, null);
   952     do_check_neq(error.network, null);
   954     run_next_test();
   955   });
   956 });
   958 add_test(function test_network_error_listener() {
   959   _("Ensure the onNetworkError listener is invoked on network errors.");
   961   let listenerCalled = false;
   963   let client = new StorageServiceClient("http://philikon-is-too.badtld/");
   964   client.addListener({
   965     onNetworkError: function(client, request) {
   966       listenerCalled = true;
   967     }
   968   });
   969   let request = client.getCollectionInfo();
   970   request.dispatch(function() {
   971     do_check_true(listenerCalled);
   972     run_next_test();
   973   });
   974 });
   976 add_test(function test_batching_set_too_large() {
   977   _("Ensure we throw when attempting to add a BSO that is too large to fit.");
   979   let [server, client, username] = getServerAndClient();
   981   let request = client.setBSOsBatching("testcoll");
   982   let payload = "";
   984   // The actual length of the payload is a little less. But, this ensures we
   985   // exceed it.
   986   for (let i = 0; i < client.REQUEST_SIZE_LIMIT; i++) {
   987     payload += i;
   988   }
   990   let bso = new BasicStorageObject("bso");
   991   bso.payload = payload;
   992   do_check_throws(function add() { request.addBSO(bso); });
   994   server.stop(run_next_test);
   995 });
   997 add_test(function test_batching_set_basic() {
   998   _("Ensure batching set works with single requests.");
  1000   let [server, client, username] = getServerAndClient();
  1002   let request = client.setBSOsBatching("testcoll");
  1003   for (let i = 0; i < 10; i++) {
  1004     let bso = new BasicStorageObject("bso" + i);
  1005     bso.payload = "payload" + i;
  1006     request.addBSO(bso);
  1009   request.finish(function onFinish(request) {
  1010     do_check_eq(request.successfulIDs.length, 10);
  1012     let collection = server.user(username).collection("testcoll");
  1013     do_check_eq(collection.timestamp, request.serverModifiedVersion);
  1015     server.stop(run_next_test);
  1016   });
  1017 });
  1019 add_test(function test_batching_set_batch_count() {
  1020   _("Ensure multiple outgoing request batching works when count is exceeded.");
  1022   let [server, client, username] = getServerAndClient();
  1023   let requestCount = 0;
  1024   server.callback.onRequest = function onRequest() {
  1025     requestCount++;
  1028   let request = client.setBSOsBatching("testcoll");
  1029   for (let i = 1; i <= 300; i++) {
  1030     let bso = new BasicStorageObject("bso" + i);
  1031     bso.payload = "XXXXXXX";
  1032     request.addBSO(bso);
  1035   request.finish(function onFinish(request) {
  1036     do_check_eq(request.successfulIDs.length, 300);
  1037     do_check_eq(requestCount, 3);
  1039     let collection = server.user(username).collection("testcoll");
  1040     do_check_eq(collection.timestamp, request.serverModifiedVersion);
  1042     server.stop(run_next_test);
  1043   });
  1044 });
  1046 add_test(function test_batching_set_batch_size() {
  1047   _("Ensure outgoing requests batch when size is exceeded.");
  1049   let [server, client, username] = getServerAndClient();
  1050   let requestCount = 0;
  1051   server.callback.onRequest = function onRequest() {
  1052     requestCount++;
  1053   };
  1055   let limit = client.REQUEST_SIZE_LIMIT;
  1057   let request = client.setBSOsBatching("testcoll");
  1059   // JavaScript: Y U NO EASY REPETITION FUNCTIONALITY?
  1060   let data = [];
  1061   for (let i = (limit / 2) - 100; i; i -= 1) {
  1062     data.push("X");
  1065   let payload = data.join("");
  1067   for (let i = 0; i < 4; i++) {
  1068     let bso = new BasicStorageObject("bso" + i);
  1069     bso.payload = payload;
  1070     request.addBSO(bso);
  1073   request.finish(function onFinish(request) {
  1074     do_check_eq(request.successfulIDs.length, 4);
  1075     do_check_eq(requestCount, 2);
  1077     let collection = server.user(username).collection("testcoll");
  1078     do_check_eq(collection.timestamp, request.serverModifiedVersion);
  1080     server.stop(run_next_test);
  1081   });
  1082 });
  1084 add_test(function test_batching_set_flush() {
  1085   _("Ensure flushing batch sets works.");
  1087   let [server, client, username] = getServerAndClient();
  1089   let requestCount = 0;
  1090   server.callback.onRequest = function onRequest() {
  1091     requestCount++;
  1094   let request = client.setBSOsBatching("testcoll");
  1095   for (let i = 1; i < 101; i++) {
  1096     let bso = new BasicStorageObject("bso" + i);
  1097     bso.payload = "foo";
  1098     request.addBSO(bso);
  1100     if (i % 10 == 0) {
  1101       request.flush();
  1105   request.finish(function onFinish(request) {
  1106     do_check_eq(request.successfulIDs.length, 100);
  1107     do_check_eq(requestCount, 10);
  1109     let collection = server.user(username).collection("testcoll");
  1110     do_check_eq(collection.timestamp, request.serverModifiedVersion);
  1112     server.stop(run_next_test);
  1113   });
  1114 });
  1116 add_test(function test_batching_set_conditional_success() {
  1117   _("Ensure conditional requests for batched sets work properly.");
  1119   let [server, client, username] = getServerAndClient();
  1121   let collection = server.user(username).createCollection("testcoll");
  1123   let lastServerVersion = Date.now();
  1124   collection.insertBSO(new ServerBSO("foo", "bar", lastServerVersion));
  1125   collection.timestamp = lastServerVersion;
  1126   do_check_eq(collection.timestamp, lastServerVersion);
  1128   let requestCount = 0;
  1129   server.callback.onRequest = function onRequest() {
  1130     requestCount++;
  1133   let request = client.setBSOsBatching("testcoll");
  1134   request.locallyModifiedVersion = collection.timestamp;
  1136   for (let i = 1; i < 251; i++) {
  1137     let bso = new BasicStorageObject("bso" + i);
  1138     bso.payload = "foo" + i;
  1139     request.addBSO(bso);
  1142   request.finish(function onFinish(request) {
  1143     do_check_eq(requestCount, 3);
  1145     do_check_eq(collection.timestamp, request.serverModifiedVersion);
  1146     do_check_eq(collection.timestamp, request.locallyModifiedVersion);
  1148     server.stop(run_next_test);
  1149   });
  1150 });
  1152 add_test(function test_batching_set_initial_failure() {
  1153   _("Ensure that an initial request failure setting BSOs is handled properly.");
  1155   let [server, client, username] = getServerAndClient();
  1157   let collection = server.user(username).createCollection("testcoll");
  1158   collection.timestamp = Date.now();
  1160   let requestCount = 0;
  1161   server.callback.onRequest = function onRequest() {
  1162     requestCount++;
  1165   let request = client.setBSOsBatching("testcoll");
  1166   request.locallyModifiedVersion = collection.timestamp - 1;
  1168   for (let i = 1; i < 250; i++) {
  1169     let bso = new BasicStorageObject("bso" + i);
  1170     bso.payload = "foo" + i;
  1171     request.addBSO(bso);
  1174   request.finish(function onFinish(request) {
  1175     do_check_eq(requestCount, 1);
  1177     do_check_eq(request.successfulIDs.length, 0);
  1178     do_check_eq(Object.keys(request.failures).length, 0);
  1180     server.stop(run_next_test);
  1181   });
  1182 });
  1184 add_test(function test_batching_set_subsequent_failure() {
  1185   _("Ensure a non-initial failure during batching set is handled properly.");
  1187   let [server, client, username] = getServerAndClient();
  1188   let collection = server.user(username).createCollection("testcoll");
  1189   collection.timestamp = Date.now();
  1191   let requestCount = 0;
  1192   server.callback.onRequest = function onRequest() {
  1193     requestCount++;
  1195     if (requestCount == 1) {
  1196       return;
  1199     collection.timestamp++;
  1202   let request = client.setBSOsBatching("testcoll");
  1203   request.locallyModifiedVersion = collection.timestamp;
  1205   for (let i = 0; i < 250; i++) {
  1206     let bso = new BasicStorageObject("bso" + i);
  1207     bso.payload = "foo" + i;
  1208     request.addBSO(bso);
  1211   request.finish(function onFinish(request) {
  1212     do_check_eq(requestCount, 2);
  1213     do_check_eq(request.successfulIDs.length, 100);
  1214     do_check_eq(Object.keys(request.failures).length, 0);
  1216     server.stop(run_next_test);
  1217   });
  1218 });
  1220 function getBatchedDeleteData(collection="testcoll") {
  1221   let [server, client, username] = getServerAndClient();
  1223   let serverBSOs = {};
  1224   for (let i = 1000; i; i -= 1) {
  1225     serverBSOs["bso" + i] = new ServerBSO("bso" + i, "payload" + i);
  1228   let user = server.user(username);
  1229   user.createCollection(collection, serverBSOs);
  1231   return [server, client, username, collection];
  1234 add_test(function test_batched_delete_single() {
  1235   _("Ensure batched delete with single request works.");
  1237   let [server, client, username, collection] = getBatchedDeleteData();
  1239   let requestCount = 0;
  1240   server.callback.onRequest = function onRequest() {
  1241     requestCount += 1;
  1244   let request = client.deleteBSOsBatching(collection);
  1245   for (let i = 1; i < 51; i += 1) {
  1246     request.addID("bso" + i);
  1249   request.finish(function onFinish(request) {
  1250     do_check_eq(requestCount, 1);
  1251     do_check_eq(request.errors.length, 0);
  1253     let coll = server.user(username).collection(collection);
  1254     do_check_eq(coll.count(), 950);
  1256     do_check_eq(request.serverModifiedVersion, coll.timestamp);
  1258     server.stop(run_next_test);
  1259   });
  1260 });
  1262 add_test(function test_batched_delete_multiple() {
  1263   _("Ensure batched delete splits requests properly.");
  1265   let [server, client, username, collection] = getBatchedDeleteData();
  1267   let requestCount = 0;
  1268   server.callback.onRequest = function onRequest() {
  1269     requestCount += 1;
  1272   let request = client.deleteBSOsBatching(collection);
  1273   for (let i = 1; i < 251; i += 1) {
  1274     request.addID("bso" + i);
  1277   request.finish(function onFinish(request) {
  1278     do_check_eq(requestCount, 3);
  1279     do_check_eq(request.errors.length, 0);
  1281     let coll = server.user(username).collection(collection);
  1282     do_check_eq(coll.count(), 750);
  1284     do_check_eq(request.serverModifiedVersion, coll.timestamp);
  1286     server.stop(run_next_test);
  1287   });
  1288 });
  1290 add_test(function test_batched_delete_conditional_success() {
  1291   _("Ensure conditional batched delete all work.");
  1293   let [server, client, username, collection] = getBatchedDeleteData();
  1295   let requestCount = 0;
  1296   server.callback.onRequest = function onRequest() {
  1297     requestCount++;
  1300   let serverCollection = server.user(username).collection(collection);
  1301   let initialTimestamp = serverCollection.timestamp;
  1303   let request = client.deleteBSOsBatching(collection);
  1304   request.locallyModifiedVersion = initialTimestamp;
  1306   for (let i = 1; i < 251; i += 1) {
  1307     request.addID("bso" + 1);
  1310   request.finish(function onFinish(request) {
  1311     do_check_eq(requestCount, 3);
  1312     do_check_eq(request.errors.length, 0);
  1314     do_check_true(request.locallyModifiedVersion > initialTimestamp);
  1316     server.stop(run_next_test);
  1317   });
  1318 });
  1320 add_test(function test_batched_delete_conditional_initial_failure() {
  1321   _("Ensure conditional batched delete failure on initial request works.");
  1323   // The client needs to issue multiple requests but the first one was
  1324   // rejected. The client should only issue that initial request.
  1325   let [server, client, username, collection] = getBatchedDeleteData();
  1327   let requestCount = 0;
  1328   server.callback.onRequest = function onRequest() {
  1329     requestCount++;
  1332   let serverCollection = server.user(username).collection(collection);
  1333   let request = client.deleteBSOsBatching(collection);
  1334   request.locallyModifiedVersion = serverCollection.timestamp - 1;
  1336   for (let i = 1; i < 251; i += 1) {
  1337     request.addID("bso" + i);
  1340   request.finish(function onFinish(request) {
  1341     do_check_eq(requestCount, 1);
  1342     do_check_eq(request.errors.length, 1);
  1344     server.stop(run_next_test);
  1345   });
  1346 });
  1348 add_test(function test_batched_delete_conditional_subsequent_failure() {
  1349   _("Ensure conditional batched delete failure on non-initial request.");
  1351   let [server, client, username, collection] = getBatchedDeleteData();
  1353   let serverCollection = server.user(username).collection(collection);
  1355   let requestCount = 0;
  1356   server.callback.onRequest = function onRequest() {
  1357     requestCount++;
  1359     if (requestCount <= 1) {
  1360       return;
  1363     // Advance collection's timestamp on subsequent requests so request is
  1364     // rejected.
  1365     serverCollection.timestamp++;
  1368   let request = client.deleteBSOsBatching(collection);
  1369   request.locallyModifiedVersion = serverCollection.timestamp;
  1371   for (let i = 1; i < 251; i += 1) {
  1372     request.addID("bso" + i);
  1375   request.finish(function onFinish(request) {
  1376     do_check_eq(requestCount, 2);
  1377     do_check_eq(request.errors.length, 1);
  1379     server.stop(run_next_test);
  1380   });
  1381 });

mercurial