UNPKG

12.1 kBtext/coffeescriptView Raw
1process.env.NODE_ENV = 'test'
2
3path = require 'path'
4assert = require 'assert'
5async = require 'async'
6LindaClient = require(path.resolve()).Client
7TestServer = require './server'
8
9port = process.env.PORT-0 || 13000
10
11## start server
12server = new TestServer().listen(port)
13setTimeout ->
14 server.close()
15, 10000
16
17## client
18create_client = ->
19 socket = require('socket.io-client').connect("http://localhost:#{port}")
20 return new LindaClient().connect(socket)
21
22
23describe '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 # watch same tuple
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# it 'should have remote-address in "from" property', (done) ->
327# linda = create_client()
328# ts = linda.tuplespace('tuple_from')
329# async.parallel [
330# (async_done) ->
331# ts.read {a:1}, (err, tuple) ->
332# assert.ok /^\d+\.\d+\.\d+\.\d+$/.test tuple.from
333# async_done(null)
334# (async_done) ->
335# ts.watch {a:1}, (err, tuple) ->
336# assert.ok /^\d+\.\d+\.\d+\.\d+$/.test tuple.from
337# async_done(null)
338# (async_done) ->
339# ts.take {a:1}, (err, tuple) ->
340# assert.ok /^\d+\.\d+\.\d+\.\d+$/.test tuple.from
341# async_done(null)
342# ], (err) ->
343# done()
344#
345# ts.write {a:1, b:2}
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}")