blob: 961fad431b055712160de745e16cbdd8c709e504 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
var test = require('prova');
var serve = require('./serve');
var Promise = require('../../src/lib/promise');
test('Test sync dispatcher the echos suffixes - ' +
'dispatcher/echo/<suffix>', function(assert) {
serve({
name: 'dispatcherServiceName',
dispatcher: callbackDispatcher,
autoBind: false
}, function(err, res) {
if (err) {
return assert.end(err);
}
var client = res.runtime.newClient();
var ctx = res.runtime.getContext();
client.bindTo(ctx, 'dispatcherServiceName/echo/bar',
function(err, service) {
if (err) {
assert.error(err);
res.end(assert);
return;
}
service.echo(ctx, function(err, result) {
assert.error(err);
assert.equal(result, 'bar');
res.end(assert);
});
});
});
});
test('Test sync dispatcher that counts length of suffix - ' +
'dispatcherServiceName/count/<suffix> - one suffix', function(assert) {
serve({
name: 'dispatcherServiceName',
dispatcher: promiseDispatcher,
autoBind: false
}, function(err, res) {
if (err) {
return assert.end(err);
}
var client = res.runtime.newClient();
var ctx = res.runtime.getContext();
client.bindTo(ctx, 'dispatcherServiceName/count/bar',
function(err, service) {
if (err) {
return assert.end(err);
}
service.count(ctx, function(err, result) {
assert.error(err);
assert.equal(result, 3);
res.end(assert);
});
});
});
});
test('Test sync dispatcher that counts length of suffix - ' +
'dispatcherServiceName/count/<suffix> - two different suffixes',
function(assert) {
serve({
name: 'dispatcherServiceName',
dispatcher: promiseDispatcher,
autoBind: false
}, function(err, res) {
if (err) {
return assert.end(err);
}
var client = res.runtime.newClient();
var ctx = res.runtime.getContext();
var promises = [
client.bindTo(ctx, 'dispatcherServiceName/count/bar')
.then(function(client) {
return client.count(ctx);
}),
client.bindTo(ctx, 'dispatcherServiceName/count/longer')
.then(function(client) {
return client.count(ctx);
})
];
Promise.all(promises).then(function(results) {
assert.equal(results[0], 3);
assert.equal(results[1], 6);
res.end(assert);
})
.catch(function(err) {
assert.error(err);
res.end(assert);
});
});
});
test('Test unknown suffix should return error - ' +
'dispatcherServiceName/unknown', function(assert) {
serve({
name: 'dispatcherServiceName',
dispatcher: callbackDispatcher,
autoBind: false
}, function(err, res) {
if (err) {
return assert.end(err);
}
var client = res.runtime.newClient();
var ctx = res.runtime.getContext();
client.bindTo(ctx, 'dispatcherServiceName/unknown',
function(err, service) {
assert.ok(err, 'should fail');
res.end(assert);
});
});
});
test('Test async dispatcher using promises - ' +
'dispatcher/promise ' +
'- success case', function(assert) {
serve({
name: 'dispatcherServiceName',
dispatcher: promiseDispatcher,
autoBind: false
}, function(err, res) {
if (err) {
return assert.end(err);
}
var ctx = res.runtime.getContext();
var name = 'dispatcherServiceName/promise/whatever';
var client = res.runtime.newClient();
client.bindTo(ctx, name, function(err, service) {
if (err) {
return assert.end(err);
}
service.echo(ctx, function(err, result) {
assert.error(err);
assert.equal(result, 'promise/whatever');
res.end(assert);
});
});
});
});
test('Test async dispatcher using promises - ' +
'dispatcherServiceName/promise/fail ' +
'- failure case', function(assert) {
serve({
name: 'dispatcherServiceName',
dispatcher: promiseDispatcher,
autoBind: false
}, function(err, res) {
if (err) {
return assert.end(err);
}
var client = res.runtime.newClient();
var ctx = res.runtime.getContext();
client.bindTo(ctx, 'dispatcherServiceName/promise/fail',
function(err, service) {
assert.ok(err, 'should fail');
res.end(assert);
});
});
});
test('Test async dispatcher using callbacks - ' +
'dispatcherServiceName/callback ' +
'- success case', function(assert) {
serve({
name: 'dispatcherServiceName',
dispatcher: callbackDispatcher,
autoBind: false
}, function(err, res) {
if (err) {
return assert.end(err);
}
var ctx = res.runtime.getContext();
var name = 'dispatcherServiceName/callback/whatever';
var client = res.runtime.newClient();
client.bindTo(ctx, name, function(err, service) {
if (err) {
return assert.end(err);
}
service.echo(ctx, function(err, result) {
assert.error(err);
assert.equal(result, 'callback/whatever');
res.end(assert);
});
});
});
});
test('Test async dispatcher using callbacks - '+
'dispatcherServiceName/callback/fail ' +
'- failure case', function(assert) {
serve({
name: 'dispatcherServiceName',
dispatcher: callbackDispatcher,
autoBind: false
}, function(err, res) {
if (err) {
return assert.end(err);
}
var client = res.runtime.newClient();
var ctx = res.runtime.getContext();
client.bindTo(ctx, 'dispatcherServiceName/callback/fail',
function(err, service) {
assert.ok(err, 'should fail');
res.end(assert);
});
});
});
function Counter(string) {
this.string = string;
}
Counter.prototype.count = function(ctx, serverCall) {
return this.string.length;
};
function Echoer(string) {
this.string = string;
}
Echoer.prototype.echo = function(ctx, serverCall) {
return this.string;
};
function promiseDispatcher(suffix) {
// dispatcher/echo/:string
if (suffix.indexOf('echo/') === 0) {
return {
service: new Echoer(suffix.substr(5))
};
// dispatcher/count/:string
} else if (suffix.indexOf('count/') === 0) {
return {
service: new Counter(suffix.substr(6))
};
// dispatcher/promise/fail
} else if (suffix.indexOf('promise/fail') === 0) {
return Promise.reject(new Error('bad'));
// dispatcher/promise/:string
} else if (suffix.indexOf('promise') === 0) {
return Promise.resolve({
service: new Echoer(suffix)
});
}
throw new Error('unknown suffix');
}
function callbackDispatcher(suffix, cb) {
// dispatcher/echo/:string
if (suffix.indexOf('echo/') === 0) {
cb(null, {
service: new Echoer(suffix.substr(5))
});
return;
// dispatcher/count/:string
} else if (suffix.indexOf('count/') === 0) {
cb(null, {
service: new Counter(suffix.substr(6))
});
return;
// dispatcher/callback/fail
} else if (suffix.indexOf('callback/fail') === 0) {
cb(new Error('errorback'));
return;
// dispatcher/callback/:string
} else if (suffix.indexOf('callback') === 0) {
cb(null, { service: new Echoer(suffix)});
return;
}
throw new Error('unknown suffix');
}