blob: 8e19eb130761f60b4dea6c9cf71e8c9b53583701 [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 leafDispatcher = require('../../src/rpc/leaf-dispatcher');
var serve = require('./serve');
// Test serving and making an RPC call.
// name is the name of the service to serve and cb is called after completion.
function validateCommunication(t, name, cb) {
var response = 5;
var dispatcher = leafDispatcher({
anRpc: function(context, serverCall, cb) {
cb(null, response);
}
});
serve(name, dispatcher, function(err, res) {
if (err) {
return cb(err);
}
res.service.anRpc(res.runtime.getContext(), function(err, result) {
t.error(err, 'Err expected to be null');
t.equal(result, response, 'Expected different response from anRpc()');
cb(null, res.close, res.runtime);
});
});
}
test('Test recovery from nacl plugin crash', function(t) {
if (!require('is-browser')) {
return t.end();
}
var errors = require('../../src/verror/index');
var eventProxy = require('../../src/browser/event-proxy');
// validate comunication first, partially because this initializes the
// nacl plugin.
validateCommunication(t, 'test/name1', function(err, close1, runtime) {
if (err) {
return t.end(err);
}
// Handle the crash.
runtime.once('crash', function(err) {
t.ok(err instanceof errors.ExtensionCrashError,
'Receive ExtensionCrashError object.');
// Perform another communication validation.
validateCommunication(t, 'test/name2', function(err, close2) {
if (err) {
t.error(err);
return close1(function() {
t.ok(err, 'runtime.close should error because nacl crashed.');
t.end();
});
}
close1(function(err1) {
t.ok(err1, 'First runtime.close should error because nacl crashed.');
close2(t.end);
});
});
});
// Send a message triggering a nacl plug-in crash.
eventProxy.send('intentionallyPanic');
});
});