msgflo
Version:
Polyglot FBP runtime based on message queues
170 lines (145 loc) • 5.26 kB
text/coffeescript
msgflo = require '../'
participants = require './fixtures/participants'
foreignParticipants = require './fixtures/foreign'
async = require 'async'
chai = require 'chai' unless chai
path = require 'path'
fixturePath = (name) ->
path.join __dirname, 'fixtures', name
fixtureGraph = (name, callback) ->
p = fixturePath name
msgflo.common.readGraph p, callback
linesContaining = (lines, str) =>
lines = lines.split '\n'
containing = lines.filter (s) -> s.indexOf(str) != -1
describe 'Setup functions', ->
bindings = null
graph = null
beforeEach (done) ->
fixtureGraph 'imgflo-server.fbp', (err, gr) ->
graph = gr
chai.expect(err).to.not.exist
bindings = msgflo.setup.graphBindings graph
done()
describe 'Extracting from imgflo-server.fbp', ->
it 'should have one binding per non-roundrobin connection or IIP', () ->
chai.expect(bindings.length).to.equal graph.connections.length-3
it 'should extract all pubsub bindings', () ->
pubsubs = bindings.filter (b) -> b.type == 'pubsub'
chai.expect(pubsubs).to.have.length 1
it 'should extract roundrobin binding', () ->
roundrobins = bindings.filter (b) -> b.type == 'roundrobin'
chai.expect(roundrobins).to.have.length 1
describe 'Pretty formatting bindings', ->
pretty = null
beforeEach () ->
pretty = msgflo.setup.prettyFormatBindings bindings
it 'should return one line per binding', () ->
chai.expect(pretty.split('\n')).to.have.length bindings.length+1
it 'should have one roundrobin', () ->
match = linesContaining pretty, 'ROUNDROBIN'
chai.expect(match).to.have.length 1
it 'should have one deadletter', () ->
match = linesContaining pretty, 'DEADLETTER'
chai.expect(match).to.have.length 1
it 'should have one pubsub', () ->
match = linesContaining pretty, 'PUBSUB'
chai.expect(match).to.have.length 1
describe 'Setup bindings', ->
address = 'amqp://localhost'
options = null
client = null
bindings = null
participants = null
beforeEach (done) ->
@timeout 8000
options =
graphfile: fixturePath 'simple.fbp'
libraryfile: fixturePath 'library-simple.json'
broker: address
forward: 'stderr,stdout'
client = msgflo.transport.getClient address
setupParticipants = (callback) ->
msgflo.setup.participants options, (err, p) ->
participants = p
return callback err
setupBindings = (callback) ->
msgflo.setup.bindings options, (err, b, graph) ->
bindings = b if b
return callback err
async.series [
setupParticipants
client.connect.bind client
setupBindings
], (err) ->
chai.expect(err).to.not.exist
done()
afterEach (done) ->
@timeout 4000
killParticipants = (callback) ->
return msgflo.setup.killProcesses participants, 'SIGKILL', callback
async.series [
client.disconnect.bind client
killParticipants
], (err) ->
chai.expect(err).to.not.exist
done()
describe 'Setting up simple FBP graph', ->
it 'should return bindings made', (done) ->
chai.expect(bindings).to.be.an 'array'
chai.expect(bindings.length).to.equal 4-2
pretty = msgflo.setup.prettyFormatBindings bindings
done()
it 'should have set up src->tgt binding', (done) ->
input =
foo: 'bar'
onMessage = (msg) ->
chai.expect(msg.data).to.eql input
done()
client.createQueue 'inqueue', 's_worker.OUT', (err) ->
chai.expect(err).to.not.exist
client.subscribeToQueue 's_worker.OUT', onMessage, (err) ->
chai.expect(err).to.not.exist
client.sendTo 'inqueue', 's_api.IN', input, (err) ->
chai.expect(err).to.not.exist
it 'should have set up deadlettering'
describe 'foreign MQTT participants', () ->
address = 'mqtt://localhost'
toggleswitch = new foreignParticipants.ToggleSwitch address
lightbulb = new foreignParticipants.LightBulb address
before (done) ->
toggleswitch.start (err) ->
chai.expect(err).to.not.exist
lightbulb.start (err) ->
chai.expect(err).to.not.exist
return done err
after (done) ->
toggleswitch.stop (err) ->
chai.expect(err).to.not.exist
lightbulb.stop (err) ->
chai.expect(err).to.not.exist
return done err
it 'should setup OK', (done) ->
@timeout 2000
options =
graphfile: fixturePath 'mqtt-switch.fbp'
broker: address
discover: true
msgflo.setup.bindings options, (err, b) ->
chai.expect(err).to.not.exist
done()
setTimeout () ->
foreignParticipants.sendDeclarations address, (err) ->
chai.expect(err).to.not.exist
, 1000
it 'switch should be toggling lightbulb on/off', (done) ->
observer = msgflo.transport.getClient address
outtopic = '/mylightbulb/ffo/1/is-on'
handler = (message) =>
chai.expect(message.data.data).to.be.a 'boolean'
observer.ackMessage message
done()
observer.connect (err) ->
chai.expect(err).to.not.exist
observer.subscribeToQueue outtopic, handler, (err) ->
chai.expect(err).to.not.exist