UNPKG

4.91 kBJavaScriptView Raw
1var zetta = require('../');
2var assert = require('assert');
3var http = require('http');
4var WebSocket = require('ws');
5var Scout = require('./fixture/example_scout');
6var zettacluster = require('zetta-cluster');
7
8describe('Event Websocket Proxied Through Peer', function() {
9 var base = null;
10 var cluster = null;
11 var device = null;
12
13 beforeEach(function(done) {
14 cluster = zettacluster({ zetta: zetta })
15 .server('cloud deploy')
16 .server('detroit 1', [Scout], ['cloud deploy'])
17 .on('ready', function(){
18 var id = cluster.servers['detroit 1'].id;
19 base = 'localhost:' + cluster.servers['cloud deploy']._testPort + '/servers/' + cluster.servers['cloud deploy'].locatePeer(id);
20 var did = Object.keys(cluster.servers['detroit 1'].runtime._jsDevices)[0];
21 device = cluster.servers['detroit 1'].runtime._jsDevices[did];
22 setTimeout(done, 300);
23 })
24 .run(function(err) {
25 if (err) {
26 done(err);
27 }
28 });
29 });
30
31 afterEach(function(done) {
32 cluster.stop();
33 setTimeout(done, 10); // fix issues with server not being closed before a new one starts
34 });
35
36 describe('Basic Connection', function() {
37
38 it('http resource should exist with statusCode 200', function(done) {
39 http.get('http://' + base + '/devices/' + device.id, function(res) {
40 assert.equal(res.statusCode, 200);
41 done();
42 }).on('error', done);
43 });
44
45 it('websocket should connect', function(done) {
46 var url = 'ws://' + base + '/events?topic=testdriver/'+device.id+'/bar';
47 var socket = new WebSocket(url);
48 socket.on('open', done);
49 });
50 });
51
52
53
54 describe('Receive json messages', function() {
55
56 it('websocket should connect and recv data in json form', function(done) {
57 var url = 'ws://' + base + '/events?topic=testdriver/'+device.id+'/bar';
58 var socket = new WebSocket(url);
59 socket.on('open', function(err) {
60 var recv = 0;
61 socket.on('message', function(buf, flags) {
62 var msg = JSON.parse(buf);
63 recv++;
64 assert(msg.timestamp);
65 assert(msg.topic);
66 assert.equal(msg.data, recv);
67 if (recv === 3) {
68 done();
69 }
70 });
71
72 setTimeout(function() {
73 device.incrementStreamValue();
74 device.incrementStreamValue();
75 device.incrementStreamValue();
76 }, 100);
77 });
78 });
79
80 it('websocket should recv only one set of messages when reconnecting', function(done) {
81 var url = 'ws://' + base + '/events?topic=testdriver/'+device.id+'/bar';
82
83 function openAndClose(cb) {
84 var s1 = new WebSocket(url);
85 s1.on('open', function(err) {
86 s1.close();
87 s1.on('close', function(){
88 cb();
89 });
90 });
91 }
92 openAndClose(function(){
93 var s2 = new WebSocket(url);
94 s2.on('open', function(err) {
95 var count = 0;
96 s2.on('message', function(buf, flags) {
97 count++;
98 });
99
100 setTimeout(function() {
101 device.incrementStreamValue();
102
103 setTimeout(function() {
104 assert.equal(count, 1, 'Should have only received 1 message. Received: ' + count);
105 done();
106 }, 500);
107 }, 100);
108 });
109 });
110
111 return;
112 });
113
114
115 it('websocket should connect and recv device log events', function(done) {
116 var url = 'ws://' + base + '/events?topic=testdriver/'+device.id+'/logs';
117 var socket = new WebSocket(url);
118 socket.on('open', function(err) {
119 socket.on('message', function(buf, flags) {
120 var msg = JSON.parse(buf);
121 assert(msg.timestamp);
122 assert(msg.topic);
123 assert(msg.actions.filter(function(action) {
124 return action.name === 'prepare';
125 }).length > 0);
126
127 assert.equal(msg.actions[0].href.replace('http://',''), base + '/devices/' + device.id)
128 done();
129 });
130
131 setTimeout(function() {
132 device.call('change');
133 }, 100);
134 });
135 });
136
137 });
138
139
140
141
142
143
144 describe('Receive binary messages', function() {
145
146 it('websocket should connect and recv data in binary form', function(done) {
147 var url = 'ws://' + base + '/events?topic=testdriver/'+device.id+'/foobar';
148 var socket = new WebSocket(url);
149 socket.on('open', function(err) {
150 var recv = 0;
151 socket.on('message', function(buf, flags) {
152 assert(Buffer.isBuffer(buf));
153 assert(flags.binary);
154 recv++;
155 assert.equal(buf[0], recv);
156 if (recv === 3) {
157 done();
158 }
159 });
160
161 setTimeout(function() {
162 device.incrementFooBar();
163 device.incrementFooBar();
164 device.incrementFooBar();
165 }, 100);
166 });
167 });
168
169 });
170
171
172
173});