blob: 30b8274ec2d03b2a249f047e237edeb4e536f6aa [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('tape');
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);
});
}
test('var struct = ec.fromNativeValue(err)', function(assert) {
var err = new Error(message);
// Add properties that NodeJS errors commonly have.
Object.defineProperties(err, {
arguments: {
value: undefined,
writable: true,
enumerable: false,
configurable: true
},
type: {
value: undefined,
writable: true,
enumerable: false,
configurable: true
},
errno: {
value: 34,
writable: true,
enumerable: true,
configurable: true
},
code: {
value: 'ENOENT',
writable: true,
enumerable: true,
configurable: true
},
path: {
value: '',
writable: true,
enumerable: true,
configurable: true
}
});
var verr = ec.fromNativeValue(err, 'app', 'call');
verr.paramList = deepUnwrapParamList(verr.paramList);
// Check that verr has the correct enumerable properties.
var expectedError = new verror.UnknownError(null);
expectedError.message = err.message;
expectedError.msg = err.message;
expectedError.paramList = ['app', 'call', err.message];
assert.deepEqual(verr, expectedError);
// Check that verr has the same properties (including non-enumerable
// properties) as the native error.
Object.getOwnPropertyNames(err).forEach(function(propName) {
assert.ok(verr.hasOwnProperty(propName), 'verror has expected property');
if (propName !== 'stack') {
// err.stack is a getter that returns different strings based on the
// error value, so we cannot check equality.
assert.equals(verr[propName], err[propName],
'property matches original error');
}
});
// Check that 'code' and 'errno' properties are preserved from original
// error, and are not enumerable.
(['code', 'errno']).forEach(function(prop) {
assert.equal(verr[prop], err[prop], 'has the correct value for ' + prop );
assert.equal(Object.getOwnPropertyDescriptor(verr, 'code').enumerable,
false, 'property ' + prop + ' is not enumerable');
});
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 unknownError = new verror.UnknownError(null);
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();
});