UNPKG

7.06 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 error = 0;
48 var open = false;
49 var socket = new WebSocket(url);
50 socket.on('open', function(err) {
51 open = true;
52 });
53 socket.on('close', function(err) {
54 open = false;
55 });
56 socket.on('error', function(err) {
57 error++;
58 });
59
60 setTimeout(function() {
61 socket.close();
62 assert.equal(error, 0);
63 assert.equal(open, true, 'ws should be opened');
64 done();
65 }, 20);
66 });
67
68 });
69
70
71
72 describe('Receive json messages', function() {
73
74 it('websocket should connect and recv data in json form', function(done) {
75 var url = 'ws://' + base + '/events?topic=testdriver/'+device.id+'/bar';
76 var error = 0;
77 var open = false;
78 var socket = new WebSocket(url);
79 socket.on('open', function(err) {
80 open = true;
81 });
82 socket.on('close', function(err) {
83 open = false;
84 });
85 socket.on('error', function(err) {
86 error++;
87 });
88
89 setTimeout(function() {
90 assert.equal(error, 0);
91 assert.equal(open, true, 'ws should be opened');
92
93 var timer = null;
94 var recv = 0;
95 socket.on('message', function(buf, flags) {
96 var msg = JSON.parse(buf);
97 recv++;
98 assert(msg.timestamp);
99 assert(msg.topic);
100 assert.equal(msg.data, recv);
101 if (recv === 3) {
102 clearTimeout(timer);
103 socket.close();
104 done();
105 }
106 });
107
108 device.incrementStreamValue();
109 device.incrementStreamValue();
110 device.incrementStreamValue();
111
112 timer = setTimeout(function() {
113 assert.equal(recv, 3, 'should have received 3 messages');
114 socket.close();
115 done();
116 }, 100);
117
118 }, 20);
119 });
120
121
122 it('websocket should recv only one set of messages when reconnecting', function(done) {
123 var url = 'ws://' + base + '/events?topic=testdriver/'+device.id+'/bar';
124
125 function openAndClose(cb) {
126 var s1 = new WebSocket(url);
127 s1.on('open', function(err) {
128 s1.close();
129 s1.on('close', function(){
130 cb();
131 });
132 });
133 }
134 openAndClose(function(){
135 var s2 = new WebSocket(url);
136 s2.on('open', function(err) {
137 var count = 0;
138 s2.on('message', function(buf, flags) {
139 count++;
140 });
141
142 setTimeout(function() {
143 device.incrementStreamValue();
144
145 setTimeout(function() {
146 assert.equal(count, 1, 'Should have only received 1 message. Received: ' + count);
147 done();
148 }, 100);
149 }, 100);
150 });
151 });
152
153 return;
154 });
155
156
157 it('websocket should connect and recv device log events', function(done) {
158 var url = 'ws://' + base + '/events?topic=testdriver/'+device.id+'/logs';
159
160 var error = 0;
161 var open = false;
162 var socket = new WebSocket(url);
163 socket.on('open', function(err) {
164 open = true;
165 });
166 socket.on('close', function(err) {
167 open = false;
168 });
169 socket.on('error', function(err) {
170 error++;
171 });
172
173 setTimeout(function() {
174 assert.equal(error, 0);
175 assert.equal(open, true, 'ws should be opened');
176
177 var recv = 0;
178 var timer = null;
179 socket.on('message', function(buf, flags) {
180 var msg = JSON.parse(buf);
181 recv++;
182 assert(msg.timestamp);
183 assert(msg.topic);
184 assert(msg.actions.filter(function(action) {
185 return action.name === 'prepare';
186 }).length > 0);
187
188 assert.equal(msg.actions[0].href.replace('http://',''), base + '/devices/' + device.id)
189
190 if (recv === 1) {
191 clearTimeout(timer);
192 socket.close();
193 done();
194 }
195 });
196
197 device.call('change');
198
199 timer = setTimeout(function() {
200 assert.equal(recv, 1, 'should have received 1 message');
201 socket.close();
202 done();
203 }, 100);
204 }, 20);
205 });
206
207
208
209 });
210
211
212
213
214
215
216 describe('Receive binary messages', function() {
217
218 it('websocket should connect and recv data in binary form', function(done) {
219 var url = 'ws://' + base + '/events?topic=testdriver/'+device.id+'/foobar';
220 var error = 0;
221 var open = false;
222 var socket = new WebSocket(url);
223 socket.on('open', function(err) {
224 open = true;
225 });
226 socket.on('close', function(err) {
227 open = false;
228 });
229 socket.on('error', function(err) {
230 error++;
231 });
232
233 setTimeout(function() {
234
235 assert.equal(error, 0);
236 assert.equal(open, true, 'ws should be opened');
237 var timer = null;
238 var recv = 0;
239 socket.on('message', function(buf, flags) {
240 assert(Buffer.isBuffer(buf));
241 assert(flags.binary);
242 recv++;
243 assert.equal(buf[0], recv);
244 if (recv === 3) {
245 clearTimeout(timer);
246 socket.close();
247 done();
248 }
249 });
250
251 device.incrementFooBar();
252 device.incrementFooBar();
253 device.incrementFooBar();
254
255 timer = setTimeout(function() {
256 assert.equal(recv, 3, 'should have received 3 messages');
257 socket.close();
258 done();
259 }, 100);
260
261 }, 20);
262 });
263
264 });
265
266
267
268});