services/sync/tests/unit/test_collection_inc_get.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/services/sync/tests/unit/test_collection_inc_get.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,188 @@
     1.4 +/* Any copyright is dedicated to the Public Domain.
     1.5 +   http://creativecommons.org/publicdomain/zero/1.0/ */
     1.6 +
     1.7 +_("Make sure Collection can correctly incrementally parse GET requests");
     1.8 +Cu.import("resource://services-sync/record.js");
     1.9 +Cu.import("resource://services-sync/service.js");
    1.10 +
    1.11 +function run_test() {
    1.12 +  let base = "http://fake/";
    1.13 +  let coll = new Collection("http://fake/uri/", WBORecord, Service);
    1.14 +  let stream = { _data: "" };
    1.15 +  let called, recCount, sum;
    1.16 +
    1.17 +  _("Not-JSON, string payloads are strings");
    1.18 +  called = false;
    1.19 +  stream._data = '{"id":"hello","payload":"world"}\n';
    1.20 +  coll.recordHandler = function(rec) {
    1.21 +    called = true;
    1.22 +    _("Got record:", JSON.stringify(rec));
    1.23 +    rec.collection = "uri";           // This would be done by an engine, so do it here.
    1.24 +    do_check_eq(rec.collection, "uri");
    1.25 +    do_check_eq(rec.id, "hello");
    1.26 +    do_check_eq(rec.uri(base).spec, "http://fake/uri/hello");
    1.27 +    do_check_eq(rec.payload, "world");
    1.28 +  };
    1.29 +  coll._onProgress.call(stream);
    1.30 +  do_check_eq(stream._data, '');
    1.31 +  do_check_true(called);
    1.32 +  _("\n");
    1.33 +
    1.34 +
    1.35 +  _("Parse record with payload");
    1.36 +  called = false;
    1.37 +  stream._data = '{"payload":"{\\"value\\":123}"}\n';
    1.38 +  coll.recordHandler = function(rec) {
    1.39 +    called = true;
    1.40 +    _("Got record:", JSON.stringify(rec));
    1.41 +    do_check_eq(rec.payload.value, 123);
    1.42 +  };
    1.43 +  coll._onProgress.call(stream);
    1.44 +  do_check_eq(stream._data, '');
    1.45 +  do_check_true(called);
    1.46 +  _("\n");
    1.47 +
    1.48 +
    1.49 +  _("Parse multiple records in one go");
    1.50 +  called = false;
    1.51 +  recCount = 0;
    1.52 +  sum = 0;
    1.53 +  stream._data = '{"id":"hundred","payload":"{\\"value\\":100}"}\n{"id":"ten","payload":"{\\"value\\":10}"}\n{"id":"one","payload":"{\\"value\\":1}"}\n';
    1.54 +  coll.recordHandler = function(rec) {
    1.55 +    called = true;
    1.56 +    _("Got record:", JSON.stringify(rec));
    1.57 +    recCount++;
    1.58 +    sum += rec.payload.value;
    1.59 +    _("Incremental status: count", recCount, "sum", sum);
    1.60 +    rec.collection = "uri";
    1.61 +    switch (recCount) {
    1.62 +      case 1:
    1.63 +        do_check_eq(rec.id, "hundred");
    1.64 +        do_check_eq(rec.uri(base).spec, "http://fake/uri/hundred");
    1.65 +        do_check_eq(rec.payload.value, 100);
    1.66 +        do_check_eq(sum, 100);
    1.67 +        break;
    1.68 +      case 2:
    1.69 +        do_check_eq(rec.id, "ten");
    1.70 +        do_check_eq(rec.uri(base).spec, "http://fake/uri/ten");
    1.71 +        do_check_eq(rec.payload.value, 10);
    1.72 +        do_check_eq(sum, 110);
    1.73 +        break;
    1.74 +      case 3:
    1.75 +        do_check_eq(rec.id, "one");
    1.76 +        do_check_eq(rec.uri(base).spec, "http://fake/uri/one");
    1.77 +        do_check_eq(rec.payload.value, 1);
    1.78 +        do_check_eq(sum, 111);
    1.79 +        break;
    1.80 +      default:
    1.81 +        do_throw("unexpected number of record counts", recCount);
    1.82 +        break;
    1.83 +    }
    1.84 +  };
    1.85 +  coll._onProgress.call(stream);
    1.86 +  do_check_eq(recCount, 3);
    1.87 +  do_check_eq(sum, 111);
    1.88 +  do_check_eq(stream._data, '');
    1.89 +  do_check_true(called);
    1.90 +  _("\n");
    1.91 +
    1.92 +
    1.93 +  _("Handle incremental data incoming");
    1.94 +  called = false;
    1.95 +  recCount = 0;
    1.96 +  sum = 0;
    1.97 +  stream._data = '{"payl';
    1.98 +  coll.recordHandler = function(rec) {
    1.99 +    called = true;
   1.100 +    do_throw("shouldn't have gotten a record..");
   1.101 +  };
   1.102 +  coll._onProgress.call(stream);
   1.103 +  _("shouldn't have gotten anything yet");
   1.104 +  do_check_eq(recCount, 0);
   1.105 +  do_check_eq(sum, 0);
   1.106 +  _("leading array bracket should have been trimmed");
   1.107 +  do_check_eq(stream._data, '{"payl');
   1.108 +  do_check_false(called);
   1.109 +  _();
   1.110 +
   1.111 +  _("adding more data enough for one record..");
   1.112 +  called = false;
   1.113 +  stream._data += 'oad":"{\\"value\\":100}"}\n';
   1.114 +  coll.recordHandler = function(rec) {
   1.115 +    called = true;
   1.116 +    _("Got record:", JSON.stringify(rec));
   1.117 +    recCount++;
   1.118 +    sum += rec.payload.value;
   1.119 +  };
   1.120 +  coll._onProgress.call(stream);
   1.121 +  _("should have 1 record with sum 100");
   1.122 +  do_check_eq(recCount, 1);
   1.123 +  do_check_eq(sum, 100);
   1.124 +  _("all data should have been consumed including trailing comma");
   1.125 +  do_check_eq(stream._data, '');
   1.126 +  do_check_true(called);
   1.127 +  _();
   1.128 +
   1.129 +  _("adding more data..");
   1.130 +  called = false;
   1.131 +  stream._data += '{"payload":"{\\"value\\":10}"';
   1.132 +  coll.recordHandler = function(rec) {
   1.133 +    called = true;
   1.134 +    do_throw("shouldn't have gotten a record..");
   1.135 +  };
   1.136 +  coll._onProgress.call(stream);
   1.137 +  _("should still have 1 record with sum 100");
   1.138 +  do_check_eq(recCount, 1);
   1.139 +  do_check_eq(sum, 100);
   1.140 +  _("should almost have a record");
   1.141 +  do_check_eq(stream._data, '{"payload":"{\\"value\\":10}"');
   1.142 +  do_check_false(called);
   1.143 +  _();
   1.144 +
   1.145 +  _("add data for two records..");
   1.146 +  called = false;
   1.147 +  stream._data += '}\n{"payload":"{\\"value\\":1}"}\n';
   1.148 +  coll.recordHandler = function(rec) {
   1.149 +    called = true;
   1.150 +    _("Got record:", JSON.stringify(rec));
   1.151 +    recCount++;
   1.152 +    sum += rec.payload.value;
   1.153 +    switch (recCount) {
   1.154 +      case 2:
   1.155 +        do_check_eq(rec.payload.value, 10);
   1.156 +        do_check_eq(sum, 110);
   1.157 +        break;
   1.158 +      case 3:
   1.159 +        do_check_eq(rec.payload.value, 1);
   1.160 +        do_check_eq(sum, 111);
   1.161 +        break;
   1.162 +      default:
   1.163 +        do_throw("unexpected number of record counts", recCount);
   1.164 +        break;
   1.165 +    }
   1.166 +  };
   1.167 +  coll._onProgress.call(stream);
   1.168 +  _("should have gotten all 3 records with sum 111");
   1.169 +  do_check_eq(recCount, 3);
   1.170 +  do_check_eq(sum, 111);
   1.171 +  _("should have consumed all data");
   1.172 +  do_check_eq(stream._data, '');
   1.173 +  do_check_true(called);
   1.174 +  _();
   1.175 +
   1.176 +  _("add no extra data");
   1.177 +  called = false;
   1.178 +  stream._data += '';
   1.179 +  coll.recordHandler = function(rec) {
   1.180 +    called = true;
   1.181 +    do_throw("shouldn't have gotten a record..");
   1.182 +  };
   1.183 +  coll._onProgress.call(stream);
   1.184 +  _("should still have 3 records with sum 111");
   1.185 +  do_check_eq(recCount, 3);
   1.186 +  do_check_eq(sum, 111);
   1.187 +  _("should have consumed nothing but still have nothing");
   1.188 +  do_check_eq(stream._data, "");
   1.189 +  do_check_false(called);
   1.190 +  _("\n");
   1.191 +}

mercurial