blob: b24293127be026c2be20dfa53fc424922eca3d7c [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 verror = require('../../src/gen-vdl/v.io/v23/verror');
var ec = require('../../src/vdl/error-conversion');
var types = require('../../src/vdl/types');
var kind = require('../../src/vdl/kind');
var reduce = require('../../src/vdl/canonicalize').reduce;
var unwrap = require('../../src/vdl/type-util').unwrap;
var message = 'Something bad happened.';
var noAccessError = new verror.NoAccessError(null);
test('var err = ec.fromWireValue(struct)', function(assert) {
var err = ec.fromWireValue({
msg: message,
id: noAccessError.id,
retryCode: noAccessError.retryCode,
paramList: ['app', 'call'],
});
assert.equal(err.message, message);
assert.equal(err.id, noAccessError.id);
assert.equal(err.retryCode, noAccessError.retryCode);
assert.deepEqual(err.paramList, ['app', 'call']);
assert.end();
});
test('var err = ec.fromWireValue(verror)', function(assert) {
var errors = Object.keys(verror);
errors.forEach(function(name) {
var E = verror[name];
var newE = new E(null);
var err = ec.fromWireValue({
id: newE.id,
retryCode: newE.retryCode,
msg: message
});
assert.ok(err instanceof E, 'should be instanceof ' + name);
assert.ok(err instanceof Error, 'should be instanceof Error');
assert.ok(err.stack, 'should have err.stack');
assert.equal(err.message, message);
assert.equal(err.id, newE.id);
assert.equal(err.retryCode, newE.retryCode);
assert.equal(err.toString(), err.name + ': ' + err.message);
});
assert.end();
});
var anyList = {
kind: kind.LIST,
elem: types.ANY,
};
function deepUnwrapParamList(paramList) {
return reduce(paramList, anyList).val.map(function(v) {
return unwrap(v);
});
}
var unknownError = (new verror.UnknownError(null));
test('var struct = ec.fromNativeValue(err)', function(assert) {
var err = new Error(message);
var struct = ec.fromNativeValue(err, 'app', 'call');
struct.paramList = deepUnwrapParamList(struct.paramList);
var expectedError = new verror.UnknownError(null);
expectedError.message = message;
expectedError.msg = message;
expectedError.paramList = ['app', 'call', message];
assert.deepEqual(struct, expectedError);
assert.end();
});
// TODO: this should loop.
test('var struct = ec.fromNativeValue(verr)', function(assert) {
var err = verror.NoAccessError(null, 'app', 'call');
var struct = ec.fromNativeValue(err);
struct.paramList = deepUnwrapParamList(struct.paramList);
assert.deepEqual(struct, err);
assert.end();
});
test('var struct = ec.fromNativeValue(string)', function(assert) {
var struct = ec.fromNativeValue(message, 'appName', 'call');
struct.paramList = deepUnwrapParamList(struct.paramList);
var expectedError = new verror.UnknownError(null);
var msg = 'appName:call: Error: ' + message;
expectedError.message = msg;
expectedError.msg = msg;
expectedError.paramList = ['appName', 'call', message];
assert.deepEqual(struct, expectedError);
assert.end();
});
test('Error => Struct => Error', function(assert) {
var message = 'testing JS error conversion';
var original = new Error(message);
var struct = ec.fromNativeValue(original);
var converted = ec.fromWireValue(struct);
assert.equal(struct.msg, original.message);
assert.deepEqual(struct.id, unknownError.id);
assert.deepEqual(struct.retryCode, unknownError.retryCode);
assert.equal(converted.message, original.message);
assert.end();
});