1 | var zetta = require('../');
|
2 | var assert = require('assert');
|
3 | var http = require('http');
|
4 | var WebSocket = require('ws');
|
5 | var Scout = require('./fixture/example_scout');
|
6 | var zettacluster = require('zetta-cluster');
|
7 |
|
8 | describe('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);
|
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 | });
|