UNPKG

2.57 kBJavaScriptView Raw
1var assert = require('assert');
2
3var Frames = require('../lib/frame');
4var HEARTBEAT = Frames.HEARTBEAT;
5var Stream = require('stream');
6var PassThrough = Stream.PassThrough ||
7 require('readable-stream/passthrough');
8
9var defs = require('../lib/defs');
10
11// We'll need to supply a stream which we manipulate ourselves
12
13function inputs() {
14 return new PassThrough();
15}
16
17var HB = new Buffer([defs.constants.FRAME_HEARTBEAT,
18 0, 0, // channel 0
19 0, 0, 0, 0, // zero size
20 defs.constants.FRAME_END]);
21
22suite("Explicit parsing", function() {
23
24 test('Parse heartbeat', function() {
25 var input = inputs();
26 var frames = new Frames(input);
27 input.write(HB);
28 assert(frames.recvFrame() === HEARTBEAT);
29 assert(!frames.recvFrame());
30 });
31
32 test('Parse partitioned', function() {
33 var input = inputs();
34 var frames = new Frames(input);
35 input.write(HB.slice(0, 3));
36 assert(!frames.recvFrame());
37 input.write(HB.slice(3));
38 assert(frames.recvFrame() === HEARTBEAT);
39 assert(!frames.recvFrame());
40 });
41});
42
43// Now for a bit more fun.
44
45var amqp = require('./data');
46var claire = require('claire');
47var choice = claire.choice;
48var forAll = claire.forAll;
49var repeat = claire.repeat;
50var label = claire.label;
51
52var Trace = label('frame trace',
53 repeat(choice.apply(choice, amqp.methods)));
54
55suite("Parsing", function() {
56
57 function testPartitioning(partition) {
58 return forAll(Trace).satisfy(function(t) {
59 var bufs = [];
60 var input = inputs();
61 var frames = new Frames(input);
62 var i = 0;
63 frames.accept = function(f) {
64 assert.deepEqual(f, t[i]);
65 i++;
66 };
67
68 t.forEach(function(f) {
69 f.channel = 0;
70 bufs.push(defs.encodeMethod(f.id, 0, f.fields));
71 });
72
73 partition(bufs).forEach(input.write.bind(input));
74 frames.run();
75 return i === t.length;
76 }).asTest({times: 20})
77 };
78
79 test("Parse trace of methods",
80 testPartitioning(function(bufs) { return bufs; }));
81
82 test("Parse concat'd methods",
83 testPartitioning(function(bufs) {
84 return [Buffer.concat(bufs)];
85 }));
86
87 test("Parse partitioned methods",
88 testPartitioning(function(bufs) {
89 var full = Buffer.concat(bufs);
90 var onethird = Math.floor(full.length / 3);
91 var twothirds = 2 * onethird;
92 return [
93 full.slice(0, onethird),
94 full.slice(onethird, twothirds),
95 full.slice(twothirds)
96 ];
97 }));
98});