1 | process.env.NODE_ENV = 'test'
|
2 |
|
3 | path = require 'path'
|
4 | assert = require 'assert'
|
5 | async = require 'async'
|
6 | LindaClient = require(path.resolve()).Client
|
7 | TestServer = require './server'
|
8 |
|
9 | port = process.env.PORT-0 || 13000
|
10 |
|
11 |
|
12 | server = new TestServer().listen(port)
|
13 | setTimeout ->
|
14 | server.close()
|
15 | , 10000
|
16 |
|
17 |
|
18 | create_client = ->
|
19 | socket = require('socket.io-client').connect("http://localhost:#{port}")
|
20 | return new LindaClient().connect(socket)
|
21 |
|
22 |
|
23 | describe 'instance of LindaClient', ->
|
24 |
|
25 | it 'should have method "connect"', ->
|
26 | assert.equal typeof new LindaClient()['connect'], 'function'
|
27 |
|
28 | it 'should have property "io"', ->
|
29 | assert.ok create_client().hasOwnProperty('io')
|
30 |
|
31 | it 'should have socket.io connection', (done) ->
|
32 | linda = create_client()
|
33 | ts = linda.tuplespace('chat')
|
34 |
|
35 | linda.io.on 'connect', ->
|
36 | assert.ok true
|
37 | done()
|
38 |
|
39 | it 'should have method "requestKeepalive"', ->
|
40 | assert.equal typeof new LindaClient()['requestKeepalive'], 'function'
|
41 |
|
42 | it 'should have method "tuplespace"', ->
|
43 | assert.equal typeof new LindaClient()['tuplespace'], 'function'
|
44 |
|
45 |
|
46 | describe 'method "tuplespace"', ->
|
47 |
|
48 | it 'should have property "name"', ->
|
49 | ts = create_client().tuplespace('test')
|
50 | assert.equal ts.name, 'test'
|
51 |
|
52 | it 'should have method "create_callback_id"', ->
|
53 | ts = create_client().tuplespace('test')
|
54 | assert.equal typeof ts['create_callback_id'], 'function'
|
55 |
|
56 | it 'should have method "create_watch_callback_id"', ->
|
57 | ts = create_client().tuplespace('test')
|
58 | assert.equal typeof ts['create_watch_callback_id'], 'function'
|
59 |
|
60 | it 'should have method "write"', ->
|
61 | ts = create_client().tuplespace('test')
|
62 | assert.equal typeof ts['write'], 'function'
|
63 |
|
64 | it 'should have method "read"', ->
|
65 | ts = create_client().tuplespace('test')
|
66 | assert.equal typeof ts['read'], 'function'
|
67 |
|
68 | it 'should have method "take"', ->
|
69 | ts = create_client().tuplespace('test')
|
70 | assert.equal typeof ts['take'], 'function'
|
71 |
|
72 | it 'should have method "watch"', ->
|
73 | ts = create_client().tuplespace('test')
|
74 | assert.equal typeof ts['watch'], 'function'
|
75 |
|
76 | it 'should have method "cancel"', ->
|
77 | ts = create_client().tuplespace('test')
|
78 | assert.equal typeof ts['cancel'], 'function'
|
79 |
|
80 | describe 'method "write"', ->
|
81 |
|
82 | it 'should write Tuple', (done) ->
|
83 | linda = create_client()
|
84 | ts = linda.tuplespace('write')
|
85 |
|
86 | msg = "hello world #{new Date()}"
|
87 |
|
88 | assert.equal server.linda.tuplespace('write').size, 0
|
89 | linda.tuplespace('write').write {type: "chat", message: msg}
|
90 | server.linda.tuplespace('write').read {type: "chat"}, (err, tuple) ->
|
91 | assert.deepEqual tuple.data, {type: "chat", message: msg}
|
92 | assert.equal server.linda.tuplespace('write').size, 1
|
93 | done()
|
94 |
|
95 | it 'should have "expire" option', (done) ->
|
96 | @timeout(5000)
|
97 | linda = create_client()
|
98 | ts = linda.tuplespace('write_expire')
|
99 | server_ts = server.linda.tuplespace('write_expire')
|
100 |
|
101 | ts.write {foo: "bar"}, {expire: 2}
|
102 | ts.read {foo: "bar"}, (err, tuple) ->
|
103 | assert.deepEqual tuple.data, {foo: "bar"}
|
104 | assert.equal server_ts.size, 1
|
105 | setTimeout ->
|
106 | server_ts.check_expire()
|
107 | assert.equal server_ts.size, 0
|
108 | done()
|
109 | , 3000
|
110 |
|
111 |
|
112 | describe 'method "watch"', ->
|
113 |
|
114 | it 'should return cancel_id', ->
|
115 | cid = create_client().tuplespace('watch_cancel').watch {}, ->
|
116 | assert.ok cid > 0
|
117 |
|
118 | it 'should return matched Tuple', (done) ->
|
119 | writer = create_client()
|
120 | watcher = create_client()
|
121 | val_a = Math.random()
|
122 | val_b = Math.random()
|
123 |
|
124 | count = 0
|
125 | watcher.tuplespace('watch').watch {sensor: "light"}, (err, tuple) ->
|
126 | count += 1
|
127 | switch count
|
128 | when 1
|
129 | assert.deepEqual tuple.data, {sensor: "light", value: val_a}
|
130 | when 2
|
131 | assert.deepEqual tuple.data, {sensor: "light", value: val_b}
|
132 | done()
|
133 |
|
134 | writer.tuplespace('watch').write {sensor: "foo", value: 20}
|
135 | writer.tuplespace('watch').write {sensor: "light", value: val_a}
|
136 | writer.tuplespace('watch').write {name: "shokai", age: 29}
|
137 | writer.tuplespace('watch').write {sensor: "light", value: val_b}
|
138 |
|
139 |
|
140 | it 'should not return Tuple if canceled', (done) ->
|
141 | linda = create_client()
|
142 | ts = linda.tuplespace('watch_cancel_test')
|
143 | cid = null
|
144 | async.parallel [
|
145 | (async_done) ->
|
146 | cid_ = ts.watch {a:1}, (err, tuple) ->
|
147 | assert.deepEqual tuple.data, {a:1, b:2}
|
148 | async_done(null, cid_)
|
149 | (async_done) ->
|
150 | cid = ts.watch {}, (err, tuple) ->
|
151 | assert.equal err, "cancel"
|
152 | async_done(null, cid)
|
153 | ], (err, callback_ids) ->
|
154 | assert.notEqual callback_ids[0], callback_ids[1]
|
155 | assert.equal server_ts.callbacks.length, 1
|
156 | done()
|
157 |
|
158 | server_ts = server.linda.tuplespace('watch_cancel_test')
|
159 | assert.equal server_ts.callbacks.length, 0
|
160 | ts.cancel cid
|
161 | ts.write {a:1, b:2}
|
162 |
|
163 | it 'should use same callback_id for same Tuple watch', (done) ->
|
164 | linda = create_client()
|
165 | ts = linda.tuplespace('watch_callback_id')
|
166 | server_ts = server.linda.tuplespace('watch_callback_id')
|
167 | assert.equal server_ts.callbacks.length, 0
|
168 |
|
169 | async.parallel [
|
170 | (async_done) ->
|
171 | cid = ts.watch {sensor: "light"}, (err, tuple) ->
|
172 | assert.deepEqual tuple.data, {sensor: "light", value: 8}
|
173 | async_done(null, cid)
|
174 | (async_done) ->
|
175 |
|
176 | cid = ts.watch {sensor: "light"}, (err, tuple) ->
|
177 | assert.deepEqual tuple.data, {sensor: "light", value: 8}
|
178 | async_done(null, cid)
|
179 | (async_done) ->
|
180 | cid = ts.watch {sensor: "temperature"}, (err, tuple) ->
|
181 | assert.deepEqual tuple.data, {sensor: "temperature", value: 19}
|
182 | async_done(null, cid)
|
183 | ], (err, callback_ids) ->
|
184 | assert.equal callback_ids[0], callback_ids[1]
|
185 | assert.notEqual callback_ids[0], callback_ids[2]
|
186 | assert.equal server_ts.callbacks.length, 2
|
187 | done()
|
188 |
|
189 | ts.write {sensor: "light", value: 8}
|
190 | ts.write {sensor: "temperature", value: 19}
|
191 |
|
192 |
|
193 | describe 'method "read"', ->
|
194 |
|
195 | it 'should return cancel_id', ->
|
196 | cid = create_client().tuplespace('read_cancel').read {}, ->
|
197 | assert.ok cid > 0
|
198 |
|
199 | it 'should return matched Tuple', (done) ->
|
200 | reader = create_client()
|
201 | writer = create_client()
|
202 |
|
203 | msg = "hello world #{new Date}"
|
204 | writer.tuplespace('read').write {type: "chat", message: msg}
|
205 | async.parallel [
|
206 | (async_done) ->
|
207 | reader.tuplespace('read').read {type: "chat"}, (err, tuple) ->
|
208 | assert.deepEqual tuple.data, {type: "chat", message: msg}
|
209 | async_done()
|
210 | (async_done) ->
|
211 | reader.tuplespace('read').read {type: "foobar"}, (err, tuple) ->
|
212 | assert.ok false
|
213 | async_done()
|
214 | setTimeout ->
|
215 | assert.ok true
|
216 | async_done()
|
217 | , 500
|
218 | ], (err, results) ->
|
219 | assert.equal server.linda.tuplespace('read').size, 1
|
220 | assert.equal server.linda.tuplespace('read').callbacks.length, 1
|
221 | done()
|
222 |
|
223 |
|
224 | it 'should wait if Tuple not found', (done) ->
|
225 | reader = create_client()
|
226 | writer = create_client()
|
227 |
|
228 | msg = "hello world #{new Date}"
|
229 | reader.tuplespace('read_callback').read {type: "chat"}, (err, tuple) ->
|
230 | assert.deepEqual tuple.data, {type: "chat", message: msg}
|
231 | done()
|
232 |
|
233 | writer.tuplespace('read_callback').write {type: "chat", message: msg}
|
234 |
|
235 | it 'should not return Tuple if canceled', (done) ->
|
236 | linda = create_client()
|
237 | ts = linda.tuplespace('read_cancel_test')
|
238 | cid = null
|
239 | async.parallel [
|
240 | (async_done) ->
|
241 | cid_ = ts.read {a:1}, (err, tuple) ->
|
242 | assert.deepEqual tuple.data, {a:1, b:2}
|
243 | async_done(null, cid_)
|
244 | (async_done) ->
|
245 | cid = ts.read {}, (err, tuple) ->
|
246 | assert.equal err, "cancel"
|
247 | async_done(null, cid)
|
248 | ], (err, callback_ids) ->
|
249 | assert.notEqual callback_ids[0], callback_ids[1]
|
250 | assert.equal server_ts.callbacks.length, 0
|
251 | done()
|
252 |
|
253 | server_ts = server.linda.tuplespace('read_cancel_test')
|
254 | assert.equal server_ts.callbacks.length, 0
|
255 | ts.cancel cid
|
256 | ts.write {a:1, b:2}
|
257 |
|
258 |
|
259 | describe 'method "take"', ->
|
260 |
|
261 | it 'should return cancel_id', ->
|
262 | cid = create_client().tuplespace('take_cancel').take {}, ->
|
263 | assert.ok cid > 0
|
264 |
|
265 | it 'should return matched Tuple and delete', (done) ->
|
266 | taker = create_client()
|
267 | writer = create_client()
|
268 |
|
269 | msg = "hello world #{new Date}"
|
270 | writer.tuplespace('take').write {type: "chat", message: msg}
|
271 | async.parallel [
|
272 | (async_done) ->
|
273 | taker.tuplespace('take').take {type: "chat"}, (err, tuple) ->
|
274 | assert.deepEqual tuple.data, {type: "chat", message: msg}
|
275 | async_done()
|
276 | (async_done) ->
|
277 | taker.tuplespace('take').take {type: "foobar"}, (err, tuple) ->
|
278 | assert.ok false
|
279 | async_done()
|
280 | setTimeout ->
|
281 | assert.ok true
|
282 | async_done()
|
283 | , 500
|
284 | ], (err, results) ->
|
285 | assert.equal server.linda.tuplespace('take').size, 0
|
286 | assert.equal server.linda.tuplespace('take').callbacks.length, 1
|
287 | done()
|
288 |
|
289 |
|
290 | it 'should wait if Tuple not found', (done) ->
|
291 | taker = create_client()
|
292 | writer = create_client()
|
293 |
|
294 | msg = "hello world #{new Date}"
|
295 | taker.tuplespace('take_callback').read {type: "chat"}, (err, tuple) ->
|
296 | assert.deepEqual tuple.data, {type: "chat", message: msg}
|
297 | done()
|
298 |
|
299 | writer.tuplespace('take_callback').write {type: "chat", message: msg}
|
300 |
|
301 | it 'should not return Tuple if canceled', (done) ->
|
302 | linda = create_client()
|
303 | ts = linda.tuplespace('take_cancel_test')
|
304 | cid = null
|
305 | async.parallel [
|
306 | (async_done) ->
|
307 | cid_ = ts.take {a:1}, (err, tuple) ->
|
308 | assert.deepEqual tuple.data, {a:1, b:2}
|
309 | async_done(null, cid_)
|
310 | (async_done) ->
|
311 | cid = ts.take {}, (err, tuple) ->
|
312 | assert.equal err, "cancel"
|
313 | async_done(null, cid)
|
314 | ], (err, callback_ids) ->
|
315 | assert.notEqual callback_ids[0], callback_ids[1]
|
316 | assert.equal server_ts.callbacks.length, 0
|
317 | done()
|
318 |
|
319 | server_ts = server.linda.tuplespace('take_cancel_test')
|
320 | assert.equal server_ts.callbacks.length, 0
|
321 | ts.cancel cid
|
322 | ts.write {a:1, b:2}
|
323 |
|
324 | describe 'returned Tuple', ->
|
325 |
|
326 |
|
327 |
|
328 |
|
329 |
|
330 |
|
331 |
|
332 |
|
333 |
|
334 |
|
335 |
|
336 |
|
337 |
|
338 |
|
339 |
|
340 |
|
341 |
|
342 |
|
343 |
|
344 |
|
345 |
|
346 |
|
347 | describe 'method "requestKeepalive"', ->
|
348 |
|
349 | it 'should receive keepalive HTTP-Request', (done) ->
|
350 |
|
351 | server.once 'request', (req)->
|
352 | assert.ok /keepalive/.test req.url
|
353 | done()
|
354 |
|
355 | create_client().requestKeepalive("http://localhost:#{port}")
|