memorystream.test.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. var MemoryStream = require('../index.js'),
  2. expect = require('expect.js'),
  3. STREAM = require('stream'),
  4. Q = require('q'),
  5. FS = require('fs');
  6. describe('Test memory streams', function() {
  7. var writeToStream = function (mem_stream, test_data, frequency) {
  8. var result = Q(),
  9. i = 0;
  10. frequency = frequency || 0;
  11. test_data.forEach(function (chunk) {
  12. var f = Q.nfbind(function (chunk,n, cb) {
  13. setTimeout(function () {
  14. if (n >= (test_data.length - 1) ) {
  15. mem_stream.end(chunk);
  16. } else {
  17. mem_stream.write(chunk, cb);
  18. }
  19. }, frequency);
  20. }, chunk ,i++);
  21. result = result.then(function() { return f(); });
  22. });
  23. result.done();
  24. };
  25. var writeToStream2 = function (mem_stream, test_data) {
  26. var i;
  27. for (i = 0; i < test_data.length ; i++) {
  28. setTimeout((function(n) {
  29. return function () {
  30. if (n >= (test_data.length - 1) ) {
  31. mem_stream.end(test_data[n]);
  32. } else {
  33. mem_stream.write(test_data[n]);
  34. }
  35. }
  36. })(i), i * 2);
  37. }
  38. };
  39. describe("constructor", function() {
  40. it('should have a MemoryStream class', function () {
  41. expect(MemoryStream).to.be.ok();
  42. });
  43. it('should create Readable stream', function () {
  44. var memory_stream = new MemoryStream([], {writable : false});
  45. expect(memory_stream).to.be.ok();
  46. expect(memory_stream).to.be.a(STREAM.Readable);
  47. memory_stream = MemoryStream.createReadStream([]);
  48. expect(memory_stream).to.be.a(STREAM.Readable);
  49. });
  50. it('should create Writable stream', function () {
  51. var memory_stream = new MemoryStream([], {readable : false});
  52. expect(memory_stream).to.be.ok();
  53. expect(memory_stream).to.be.a(STREAM.Writable);
  54. memory_stream = MemoryStream.createWriteStream([]);
  55. expect(memory_stream).to.be.a(STREAM.Writable);
  56. });
  57. it('should create Duplex stream', function () {
  58. var memory_stream = new MemoryStream([]);
  59. expect(memory_stream).to.be.ok();
  60. expect(memory_stream).to.be.a(STREAM.Duplex);
  61. });
  62. });
  63. describe("readable stream", function () {
  64. var test_data = 'abcdefghijklmnopqrstuvwxyz',
  65. frequence = 50;
  66. it("should read data from stream", function (done) {
  67. var mem_stream = MemoryStream.createReadStream(test_data.split(''));
  68. var data = '', chunks = 0;
  69. mem_stream.on('data',function(chunk){
  70. data += chunk;
  71. ++chunks;
  72. });
  73. mem_stream.on('end',function () {
  74. expect(chunks).to.be(test_data.length);
  75. expect(data).to.be(test_data);
  76. done();
  77. });
  78. });
  79. it("should read data from stream with frequency", function (done) {
  80. var mem_stream = new MemoryStream(test_data.split(''), {
  81. writable : false,
  82. frequence: frequence
  83. });
  84. var start_time = Date.now();
  85. var data = '';
  86. mem_stream.on('data',function(chunk){
  87. data += chunk;
  88. });
  89. mem_stream.on('end',function(){
  90. var execution_time = Date.now() - start_time;
  91. expect(data).to.be(test_data);
  92. expect(execution_time >= frequence * test_data.length).to.be(true);
  93. done();
  94. });
  95. });
  96. it("should read data pause/resume", function (done) {
  97. var mem_stream = MemoryStream.createReadStream(test_data.split(''));
  98. var start_time = Date.now();
  99. var data = '', chunks = 0;
  100. mem_stream.on('data',function(chunk){
  101. data += chunk;
  102. ++chunks;
  103. if (! (chunks % 10) ) {
  104. mem_stream.pause();
  105. setTimeout(function () {
  106. mem_stream.resume();
  107. },frequence);
  108. }
  109. });
  110. mem_stream.on('end',function() {
  111. var execution_time = Date.now() - start_time;
  112. expect(data).to.be(test_data);
  113. expect(execution_time >= frequence).to.be(true);
  114. done();
  115. });
  116. });
  117. });
  118. describe("writable stream", function () {
  119. var test_data = 'abcdefghijklmnopqrstuvwxyz';
  120. it("should write data to Writable", function (done) {
  121. var mem_stream = MemoryStream.createWriteStream(),
  122. i = 0;
  123. writeToStream(mem_stream, test_data.split(''));
  124. mem_stream.on('finish',function () {
  125. expect(mem_stream.toString()).to.be(test_data);
  126. done();
  127. });
  128. });
  129. it("should not write data to readable stream", function (done) {
  130. var mem_stream = new MemoryStream([], {writable : false});
  131. expect(function () {
  132. mem_stream.write("test");
  133. }).to.throwError();
  134. expect(function () {
  135. mem_stream.end("test");
  136. }).to.throwError();
  137. done();
  138. });
  139. it("#toString", function (done) {
  140. var mem_stream = new MemoryStream(null, {readable : false});
  141. writeToStream(mem_stream, test_data.split(''));
  142. mem_stream.on('finish',function () {
  143. expect(mem_stream.toString()).to.be(test_data);
  144. done();
  145. });
  146. });
  147. it("#toBuffer", function (done) {
  148. var mem_stream = new MemoryStream(null, {readable : false});
  149. writeToStream(mem_stream, test_data.split(''));
  150. mem_stream.on('finish',function () {
  151. expect(mem_stream.toBuffer().toString('utf-8')).to.be(test_data);
  152. done();
  153. });
  154. });
  155. it("#toBuffer all data in one buffer", function (done) {
  156. var i = 0,
  157. mem_stream = new MemoryStream(null, {readable : false}),
  158. arr_test_data = [],
  159. str_test_data = '';
  160. for (i = 0; i < 20; i++) {
  161. var b = new Buffer([i]);
  162. arr_test_data.push(b);
  163. str_test_data += b.toString('hex');
  164. }
  165. writeToStream(mem_stream, arr_test_data, 10);
  166. mem_stream.on('finish',function () {
  167. expect(mem_stream.toBuffer().toString('hex')).to.be(str_test_data);
  168. done();
  169. });
  170. });
  171. it("not write data to the overflowed buffer", function (done) {
  172. var mem_stream = new MemoryStream('data1'.split(''), {
  173. readable : false,
  174. maxbufsize : 10
  175. });
  176. mem_stream.write('data2', function (err) {
  177. expect(err).to.not.be.ok();
  178. expect(mem_stream.toString()).to.be('data1data2');
  179. mem_stream.write('data3', function (err) {
  180. expect(err).to.not.be.ok();
  181. expect(mem_stream.toString()).to.be('data1data2');
  182. done();
  183. });
  184. });
  185. });
  186. it("should process error for overflowed buffer", function (done) {
  187. var mem_stream = new MemoryStream('data1'.split(''), {
  188. readable : false,
  189. maxbufsize : 10,
  190. bufoverflow : true
  191. });
  192. mem_stream.write('data2', function (err) {
  193. expect(err).to.not.be.ok();
  194. expect(mem_stream.toString()).to.be('data1data2');
  195. mem_stream.write('data3', function (err) {
  196. expect(err).to.be.ok();
  197. expect(mem_stream.toString()).to.be('data1data2');
  198. done();
  199. });
  200. });
  201. mem_stream.on('error', function () {
  202. });
  203. });
  204. });
  205. describe("duplex stream", function () {
  206. var test_data = 'abcdefghijklmnopqrstuvwxyz';
  207. it("should write/read",function (done) {
  208. var mem_stream = new MemoryStream();
  209. var data = '';
  210. mem_stream.on('data',function(chunk){
  211. data += chunk;
  212. });
  213. writeToStream(mem_stream, test_data.split(''));
  214. mem_stream.on('end', function () {
  215. expect(data).to.be(test_data);
  216. done();
  217. });
  218. });
  219. it("should write/read data with init buffer", function (done) {
  220. var l = Math.floor(test_data.length / 2);
  221. var test_data1 = test_data.substr(0, l),
  222. test_data2 = test_data.substr(l);
  223. var mem_stream = new MemoryStream(test_data1.split(''));
  224. var data = '';
  225. mem_stream.on('data',function(chunk){
  226. data += chunk;
  227. });
  228. writeToStream2(mem_stream, test_data2);
  229. mem_stream.on('end', function() {
  230. expect(data).to.be(test_data);
  231. done();
  232. });
  233. });
  234. it("should piping data", function (done) {
  235. var src_mem_stream = MemoryStream.createReadStream(test_data.split(''), {frequency : 25});
  236. var dst_mem_stream = MemoryStream.createWriteStream();
  237. src_mem_stream.pipe(dst_mem_stream);
  238. dst_mem_stream.on('finish',function(){
  239. expect(dst_mem_stream.toString()).to.be(test_data);
  240. done();
  241. });
  242. });
  243. it("should readable/piping data", function (done) {
  244. var src_mem_stream = MemoryStream.createReadStream(test_data.split(''), {frequency : 25});
  245. var dst_mem_stream = MemoryStream.createWriteStream();
  246. src_mem_stream.once('readable', function () {
  247. src_mem_stream.pipe(dst_mem_stream);
  248. });
  249. dst_mem_stream.on('finish',function(){
  250. expect(dst_mem_stream.toString()).to.be(test_data);
  251. done();
  252. });
  253. });
  254. });
  255. });