pbjsonstreamparser_test.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // Copyright 2016 The Closure Library Authors. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS-IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. goog.module('goog.net.streams.PbJsonStreamParserTest');
  15. goog.setTestOnly('goog.net.streams.PbJsonStreamParserTest');
  16. var PbJsonStreamParser = goog.require('goog.net.streams.PbJsonStreamParser');
  17. var object = goog.require('goog.object');
  18. var testSuite = goog.require('goog.testing.testSuite');
  19. /**
  20. * @param {!Array<!Object>} result The result to check
  21. * @param {number} numMessages The expected number of messages
  22. */
  23. function assertMessages(result, numMessages) {
  24. assertEquals(numMessages, result.length);
  25. for (var i = 0; i < numMessages; i++) {
  26. assertElementsEquals(['1'], object.getKeys(result[i]));
  27. }
  28. }
  29. /**
  30. * @param {!Array<!Object>} result The result to check
  31. * @param {number} numMessages The expected number of messages
  32. */
  33. function assertMessagesAndStatus(result, numMessages) {
  34. assertEquals(numMessages, result.length - 1);
  35. for (var i = 0; i < numMessages; i++) {
  36. assertElementsEquals(['1'], object.getKeys(result[i]));
  37. }
  38. assertElementsEquals(['2'], object.getKeys(result[result.length - 1]));
  39. }
  40. testSuite({
  41. testEmptyStream: function() {
  42. var parser = new PbJsonStreamParser();
  43. assertNull(parser.parse(' [ ] '));
  44. },
  45. testSingleMessage: function() {
  46. var parser = new PbJsonStreamParser();
  47. var result = parser.parse('[ [[,1,2,, "a,b[]]]"]] ]');
  48. assertMessages(result, 1);
  49. assertEquals('[,1,2,, "a,b[]]]"]', result[0][1]);
  50. },
  51. testMultipleMessages: function() {
  52. var parser = new PbJsonStreamParser();
  53. var msgs = '[[1,2] , [3,4],[{"a": "xyz"}]]';
  54. var result = parser.parse('[' + msgs + ']');
  55. assertMessages(result, 3);
  56. assertEquals('[1,2]', result[0][1]);
  57. assertEquals(' [3,4]', result[1][1]);
  58. assertEquals('[{"a": "xyz"}]', result[2][1]);
  59. },
  60. testMultipleMessagesInChunks: function() {
  61. var parser = new PbJsonStreamParser();
  62. var input1 = '[[[1,2]';
  63. var input2 = ' , [3,4';
  64. var input3 = '],[{"a": "xyz"}]]]';
  65. var result = parser.parse(input1);
  66. assertMessages(result, 1);
  67. assertEquals('[1,2]', result[0][1]);
  68. result = parser.parse(input2);
  69. assertNull(result);
  70. result = parser.parse(input3);
  71. assertMessages(result, 2);
  72. assertEquals(' [3,4]', result[0][1]);
  73. assertEquals('[{"a": "xyz"}]', result[1][1]);
  74. },
  75. testOnlyStatus: function() {
  76. var parser = new PbJsonStreamParser();
  77. var status = '[1,,"abced",[true,false]]';
  78. var result = parser.parse('[,' + status + ']');
  79. assertMessagesAndStatus(result, 0);
  80. assertEquals(status, result[0][2]);
  81. },
  82. testMessagesAndStatus: function() {
  83. var parser = new PbJsonStreamParser();
  84. var msgs = '[[1, null, 2], ["a", true],[]]';
  85. var status = '["400", "error", "bad request", {"details": null}]';
  86. var result = parser.parse('[' + msgs + ',' + status + ']');
  87. assertMessagesAndStatus(result, 3);
  88. assertEquals('[1, null, 2]', result[0][1]);
  89. assertEquals(' ["a", true]', result[1][1]);
  90. assertEquals('[]', result[2][1]);
  91. assertEquals(
  92. '["400", "error", "bad request", {"details": null}]', result[3][2]);
  93. },
  94. testMessagesAndStatusInChunks: function() {
  95. var parser = new PbJsonStreamParser();
  96. var input1 = '[[[1, null, 2], ["a", ';
  97. var input2 = 'true]], [';
  98. var input3 = '"error"]';
  99. var input4 = ']';
  100. var result = parser.parse(input1);
  101. assertMessages(result, 1);
  102. assertEquals('[1, null, 2]', result[0][1]);
  103. result = parser.parse(input2);
  104. assertMessages(result, 1);
  105. assertEquals(' ["a", true]', result[0][1]);
  106. result = parser.parse(input3);
  107. assertMessagesAndStatus(result, 0);
  108. assertEquals('["error"]', result[0][2]);
  109. result = parser.parse(input4);
  110. assertNull(result);
  111. },
  112. testInvalidInputs: function() {
  113. var parser1 = new PbJsonStreamParser();
  114. // Invalid JSON
  115. assertThrows(function() {
  116. parser1.parse('[[["a":"b"]]]');
  117. });
  118. // Stream already broken
  119. assertThrows(function() {
  120. parser1.parse('[');
  121. });
  122. var parser2 = new PbJsonStreamParser();
  123. parser2.parse('[ [[1, 2]], ["error"] ]');
  124. // Extra input
  125. assertThrows(function() {
  126. parser2.parse(',');
  127. });
  128. var parser3 = new PbJsonStreamParser();
  129. // Extra element of the wrapping array
  130. assertThrows(function() {
  131. parser3.parse('[ [[1, 2]], ["error"], ["error"] ]');
  132. });
  133. var parser4 = new PbJsonStreamParser();
  134. // Extra element of the wrapping array in chunks
  135. var result = parser4.parse('[ [[1, 2]], ["error"]');
  136. assertMessagesAndStatus(result, 1);
  137. assertEquals('[1, 2]', result[0][1]);
  138. assertEquals('["error"]', result[1][2]);
  139. assertThrows(function() {
  140. parse4.parse(', ["error"]');
  141. });
  142. }
  143. });