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 +}