/services/sync/tests/unit/test_collection_inc_get.js

http://github.com/zpao/v8monkey · JavaScript · 184 lines · 177 code · 7 blank · 0 comment · 1 complexity · 6734ca8865883c85420719fd0bee1769 MD5 · raw file

  1. _("Make sure Collection can correctly incrementally parse GET requests");
  2. Cu.import("resource://services-sync/record.js");
  3. function run_test() {
  4. let base = "http://fake/";
  5. let coll = new Collection("http://fake/uri/", WBORecord);
  6. let stream = { _data: "" };
  7. let called, recCount, sum;
  8. _("Not-JSON, string payloads are strings");
  9. called = false;
  10. stream._data = '{"id":"hello","payload":"world"}\n';
  11. coll.recordHandler = function(rec) {
  12. called = true;
  13. _("Got record:", JSON.stringify(rec));
  14. rec.collection = "uri"; // This would be done by an engine, so do it here.
  15. do_check_eq(rec.collection, "uri");
  16. do_check_eq(rec.id, "hello");
  17. do_check_eq(rec.uri(base).spec, "http://fake/uri/hello");
  18. do_check_eq(rec.payload, "world");
  19. };
  20. coll._onProgress.call(stream);
  21. do_check_eq(stream._data, '');
  22. do_check_true(called);
  23. _("\n");
  24. _("Parse record with payload");
  25. called = false;
  26. stream._data = '{"payload":"{\\"value\\":123}"}\n';
  27. coll.recordHandler = function(rec) {
  28. called = true;
  29. _("Got record:", JSON.stringify(rec));
  30. do_check_eq(rec.payload.value, 123);
  31. };
  32. coll._onProgress.call(stream);
  33. do_check_eq(stream._data, '');
  34. do_check_true(called);
  35. _("\n");
  36. _("Parse multiple records in one go");
  37. called = false;
  38. recCount = 0;
  39. sum = 0;
  40. stream._data = '{"id":"hundred","payload":"{\\"value\\":100}"}\n{"id":"ten","payload":"{\\"value\\":10}"}\n{"id":"one","payload":"{\\"value\\":1}"}\n';
  41. coll.recordHandler = function(rec) {
  42. called = true;
  43. _("Got record:", JSON.stringify(rec));
  44. recCount++;
  45. sum += rec.payload.value;
  46. _("Incremental status: count", recCount, "sum", sum);
  47. rec.collection = "uri";
  48. switch (recCount) {
  49. case 1:
  50. do_check_eq(rec.id, "hundred");
  51. do_check_eq(rec.uri(base).spec, "http://fake/uri/hundred");
  52. do_check_eq(rec.payload.value, 100);
  53. do_check_eq(sum, 100);
  54. break;
  55. case 2:
  56. do_check_eq(rec.id, "ten");
  57. do_check_eq(rec.uri(base).spec, "http://fake/uri/ten");
  58. do_check_eq(rec.payload.value, 10);
  59. do_check_eq(sum, 110);
  60. break;
  61. case 3:
  62. do_check_eq(rec.id, "one");
  63. do_check_eq(rec.uri(base).spec, "http://fake/uri/one");
  64. do_check_eq(rec.payload.value, 1);
  65. do_check_eq(sum, 111);
  66. break;
  67. default:
  68. do_throw("unexpected number of record counts", recCount);
  69. break;
  70. }
  71. };
  72. coll._onProgress.call(stream);
  73. do_check_eq(recCount, 3);
  74. do_check_eq(sum, 111);
  75. do_check_eq(stream._data, '');
  76. do_check_true(called);
  77. _("\n");
  78. _("Handle incremental data incoming");
  79. called = false;
  80. recCount = 0;
  81. sum = 0;
  82. stream._data = '{"payl';
  83. coll.recordHandler = function(rec) {
  84. called = true;
  85. do_throw("shouldn't have gotten a record..");
  86. };
  87. coll._onProgress.call(stream);
  88. _("shouldn't have gotten anything yet");
  89. do_check_eq(recCount, 0);
  90. do_check_eq(sum, 0);
  91. _("leading array bracket should have been trimmed");
  92. do_check_eq(stream._data, '{"payl');
  93. do_check_false(called);
  94. _();
  95. _("adding more data enough for one record..");
  96. called = false;
  97. stream._data += 'oad":"{\\"value\\":100}"}\n';
  98. coll.recordHandler = function(rec) {
  99. called = true;
  100. _("Got record:", JSON.stringify(rec));
  101. recCount++;
  102. sum += rec.payload.value;
  103. };
  104. coll._onProgress.call(stream);
  105. _("should have 1 record with sum 100");
  106. do_check_eq(recCount, 1);
  107. do_check_eq(sum, 100);
  108. _("all data should have been consumed including trailing comma");
  109. do_check_eq(stream._data, '');
  110. do_check_true(called);
  111. _();
  112. _("adding more data..");
  113. called = false;
  114. stream._data += '{"payload":"{\\"value\\":10}"';
  115. coll.recordHandler = function(rec) {
  116. called = true;
  117. do_throw("shouldn't have gotten a record..");
  118. };
  119. coll._onProgress.call(stream);
  120. _("should still have 1 record with sum 100");
  121. do_check_eq(recCount, 1);
  122. do_check_eq(sum, 100);
  123. _("should almost have a record");
  124. do_check_eq(stream._data, '{"payload":"{\\"value\\":10}"');
  125. do_check_false(called);
  126. _();
  127. _("add data for two records..");
  128. called = false;
  129. stream._data += '}\n{"payload":"{\\"value\\":1}"}\n';
  130. coll.recordHandler = function(rec) {
  131. called = true;
  132. _("Got record:", JSON.stringify(rec));
  133. recCount++;
  134. sum += rec.payload.value;
  135. switch (recCount) {
  136. case 2:
  137. do_check_eq(rec.payload.value, 10);
  138. do_check_eq(sum, 110);
  139. break;
  140. case 3:
  141. do_check_eq(rec.payload.value, 1);
  142. do_check_eq(sum, 111);
  143. break;
  144. default:
  145. do_throw("unexpected number of record counts", recCount);
  146. break;
  147. }
  148. };
  149. coll._onProgress.call(stream);
  150. _("should have gotten all 3 records with sum 111");
  151. do_check_eq(recCount, 3);
  152. do_check_eq(sum, 111);
  153. _("should have consumed all data");
  154. do_check_eq(stream._data, '');
  155. do_check_true(called);
  156. _();
  157. _("add no extra data");
  158. called = false;
  159. stream._data += '';
  160. coll.recordHandler = function(rec) {
  161. called = true;
  162. do_throw("shouldn't have gotten a record..");
  163. };
  164. coll._onProgress.call(stream);
  165. _("should still have 3 records with sum 111");
  166. do_check_eq(recCount, 3);
  167. do_check_eq(sum, 111);
  168. _("should have consumed nothing but still have nothing");
  169. do_check_eq(stream._data, "");
  170. do_check_false(called);
  171. _("\n");
  172. }