| // 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. |
| |
| /** |
| * @fileoverview Tests of generating signature with multiple descriptions |
| */ |
| var test = require('prova'); |
| var createSignature = require('../../src/vdl/create-signature'); |
| var vdl = require('../../src/vdl'); |
| var stringify = require('../../src/vdl/stringify'); |
| |
| function TestService() { |
| } |
| |
| TestService.prototype.noArgsFunction = function(ctx, serverCall) {}; |
| TestService.prototype.namedFunction = NamedFunc; |
| function NamedFunc(context, serverCall, x, y, z ) {} |
| TestService.prototype.streamingFunction = function(context, |
| serverCall, $stream) {}; |
| |
| test('create signature with no description', function(t) { |
| var testService = new TestService(); |
| var sigs = createSignature(testService); |
| t.equals(sigs.length, 1); |
| var expected = { |
| name: '', |
| pkgPath: '', |
| doc: '', |
| embeds: [], |
| methods: [{ |
| doc: '', |
| name: 'NamedFunction', |
| inStream: null, |
| outStream: null, |
| inArgs: [{ |
| doc: '', |
| name: 'x', |
| type: vdl.types.JSVALUE |
| }, { |
| doc: '', |
| name: 'y', |
| type: vdl.types.JSVALUE |
| }, { |
| doc: '', |
| name: 'z', |
| type: vdl.types.JSVALUE |
| }], |
| outArgs: [{ |
| name: '', |
| doc: '', |
| type: vdl.types.JSVALUE |
| }], |
| tags: [] |
| }, { |
| doc: '', |
| name: 'NoArgsFunction', |
| inStream: null, |
| outStream: null, |
| inArgs: [], |
| outArgs: [{ |
| name: '', |
| doc: '', |
| 'type': vdl.types.JSVALUE |
| }], |
| tags: [] |
| }, { |
| doc: '', |
| name: 'StreamingFunction', |
| inArgs: [], |
| outArgs: [{ |
| name: '', |
| doc: '', |
| type: vdl.types.JSVALUE |
| }], |
| inStream: { |
| doc: '', |
| name: '', |
| type: vdl.types.JSVALUE |
| }, |
| outStream: { |
| doc: '', |
| name: '', |
| type: vdl.types.JSVALUE |
| }, |
| tags: [] |
| }] |
| }; |
| var stringifiedResult = stringify(sigs[0]); |
| var stringifiedExpected = stringify(expected); |
| t.equals(stringifiedResult, stringifiedExpected); |
| t.end(); |
| }); |
| |
| test('create signature with full description', function(t) { |
| var testService = new TestService(); |
| var desc = { |
| name: 'TestService', |
| pkgPath: 'service/test', |
| doc: 'TestServiceDoc', |
| embeds: [], |
| methods: [{ |
| name: 'NamedFunction', |
| doc: 'NamedFunctionDoc', |
| inArgs: [{ |
| name: 'x', |
| doc: 'xDoc', |
| type: vdl.types.UINT32 |
| }, { |
| name: 'y', |
| doc: 'yDoc', |
| type: vdl.types.STRING |
| }, { |
| name: 'z', |
| doc: 'zDoc', |
| type: vdl.types.COMPLEX128 |
| }], |
| outArgs: [{ |
| name: 'a', |
| doc: 'aDoc', |
| type: vdl.types.STRING |
| }, { |
| name: 'err', |
| doc: 'errDoc', |
| type: vdl.types.ERROR |
| }], |
| inStream: null, |
| outStream: null, |
| tags: [] |
| }, { |
| name: 'NoArgsFunction', |
| doc: 'NoArgsDoc', |
| inArgs: [], |
| outArgs: [], |
| inStream: null, |
| outStream: null, |
| tags: [] |
| }, { |
| name: 'StreamingFunction', |
| doc: 'StreamingFunctionDoc', |
| inArgs: [], |
| outArgs: [{ |
| name: 'err', |
| doc: 'errDoc', |
| type: vdl.types.ERROR |
| }], |
| inStream: { |
| doc: '', |
| name: '', |
| type: vdl.types.UINT32 |
| }, |
| outStream: { |
| doc: '', |
| name: '', |
| type: vdl.types.INT32 |
| }, |
| tags: [] |
| }] |
| }; |
| var sigs = createSignature(testService, desc); |
| t.equals(sigs.length, 1); |
| var stringifiedResult = stringify(sigs[0]); |
| var stringifiedExpected = stringify(desc); |
| t.equals(stringifiedResult, stringifiedExpected); |
| t.end(); |
| }); |
| |
| test('create signature with one description but extra methods', |
| function(t) { |
| var testService = new TestService(); |
| var desc = { |
| name: 'TestService', |
| pkgPath: 'service/test', |
| doc: 'TestServiceDoc', |
| embeds: [], |
| methods: [{ |
| name: 'NamedFunction', |
| doc: 'NamedFunctionDoc', |
| inArgs: [{ |
| name: 'x', |
| doc: 'xDoc', |
| type: vdl.types.UINT32 |
| }, { |
| name: 'y', |
| doc: 'yDoc', |
| type: vdl.types.STRING |
| }, { |
| name: 'z', |
| doc: 'zDoc', |
| type: vdl.types.COMPLEX128 |
| }], |
| outArgs: [{ |
| name: 'a', |
| doc: 'aDoc', |
| type: vdl.types.STRING |
| }, { |
| name: 'err', |
| doc: 'errDoc', |
| type: vdl.types.ERROR |
| }], |
| inStream: null, |
| outStream: null, |
| tags: [] |
| }, { |
| name: 'StreamingFunction', |
| doc: 'StreamingFunctionDoc', |
| inArgs: [], |
| outArgs: [], |
| inStream: { |
| doc: '', |
| name: '', |
| type: vdl.types.UINT32 |
| }, |
| outStream: { |
| doc: '', |
| name: '', |
| type: vdl.types.INT32 |
| }, |
| tags: [] |
| }] |
| }; |
| var sigs = createSignature(testService, desc); |
| t.equals(sigs.length, 2); |
| var stringifiedResult = stringify(sigs[0]); |
| var stringifiedExpected = stringify(desc); |
| t.equals(stringifiedResult, stringifiedExpected); |
| |
| var expectedExtra = { |
| name: '', |
| pkgPath: '', |
| doc: '', |
| embeds: [], |
| methods: [{ |
| name: 'NoArgsFunction', |
| doc: '', |
| inArgs: [], |
| outArgs: [{ |
| doc: '', |
| name: '', |
| type: vdl.types.JSVALUE |
| }], |
| inStream: null, |
| outStream: null, |
| tags: [] |
| }] |
| }; |
| var stringifiedResultExtra = stringify(sigs[1]); |
| var stringifiedExpectedExtra = stringify(expectedExtra); |
| t.equals(stringifiedResultExtra, stringifiedExpectedExtra); |
| |
| t.end(); |
| }); |
| |
| test('create signature with full description across multiple descs', |
| function(t) { |
| var testService = new TestService(); |
| var descs = [{ |
| name: 'TestService', |
| pkgPath: 'service/test', |
| doc: 'TestServiceDoc', |
| embeds: [], |
| methods: [{ |
| name: 'NoArgsFunction', |
| doc: 'NoArgsDoc', |
| inArgs: [], |
| outArgs: [], |
| inStream: null, |
| outStream: null, |
| tags: [] |
| }] |
| }, { |
| name: 'TestService2', |
| pkgPath: 'service2/test', |
| doc: 'TestService2Doc', |
| embeds: [], |
| methods: [{ |
| name: 'NamedFunction', |
| doc: 'NamedFunctionDoc', |
| inArgs: [{ |
| name: 'x', |
| doc: 'xDoc', |
| type: vdl.types.UINT32 |
| }, { |
| name: 'y', |
| doc: 'yDoc', |
| type: vdl.types.STRING |
| }, { |
| name: 'z', |
| doc: 'zDoc', |
| type: vdl.types.COMPLEX128 |
| }], |
| outArgs: [{ |
| name: 'a', |
| doc: 'aDoc', |
| type: vdl.types.STRING |
| }], |
| inStream: null, |
| outStream: null, |
| tags: [] |
| }] |
| }, { |
| name: 'TestService3', |
| pkgPath: 'service3/test', |
| doc: 'TestService3Doc', |
| embeds: [], |
| methods: [{ |
| name: 'StreamingFunction', |
| doc: 'StreamingFunctionDoc', |
| inArgs: [], |
| outArgs: [], |
| inStream: { |
| doc: '', |
| name: '', |
| type: vdl.types.UINT32 |
| }, |
| outStream: { |
| doc: '', |
| name: '', |
| type: vdl.types.INT32 |
| }, |
| tags: [] |
| }] |
| }]; |
| var sigs = createSignature(testService, descs); |
| t.equals(sigs.length, 3); |
| var stringifiedResult = stringify(sigs); |
| var stringifiedExpected = stringify(descs); |
| t.equals(stringifiedResult, stringifiedExpected); |
| t.end(); |
| }); |
| |
| test('create signature with multiple descs and missing methods', |
| function(t) { |
| var testService = new TestService(); |
| var descs = [{ |
| name: 'TestService2', |
| pkgPath: 'service2/test', |
| doc: 'TestService2Doc', |
| embeds: [], |
| methods: [{ |
| name: 'NamedFunction', |
| doc: 'NamedFunctionDoc', |
| inArgs: [{ |
| name: 'x', |
| doc: 'xDoc', |
| type: vdl.types.UINT32 |
| }, { |
| name: 'y', |
| doc: 'yDoc', |
| type: vdl.types.STRING |
| }, { |
| name: 'z', |
| doc: 'zDoc', |
| type: vdl.types.COMPLEX128 |
| }], |
| outArgs: [{ |
| name: 'a', |
| doc: 'aDoc', |
| type: vdl.types.STRING |
| }], |
| inStream: null, |
| outStream: null, |
| tags: [] |
| }] |
| }, { |
| name: 'TestService3', |
| pkgPath: 'service3/test', |
| doc: 'TestService3Doc', |
| embeds: [], |
| methods: [{ |
| name: 'StreamingFunction', |
| doc: 'StreamingFunctionDoc', |
| inArgs: [], |
| outArgs: [], |
| inStream: { |
| doc: '', |
| name: '', |
| type: vdl.types.UINT32 |
| }, |
| outStream: { |
| doc: '', |
| name: '', |
| type: vdl.types.INT32 |
| }, |
| tags: [] |
| }] |
| }]; |
| var sigs = createSignature(testService, descs); |
| t.equals(sigs.length, 3); |
| var expectedDescs = descs.concat([{ |
| name: '', |
| pkgPath: '', |
| doc: '', |
| embeds: [], |
| methods: [{ |
| name: 'NoArgsFunction', |
| doc: '', |
| inArgs: [], |
| outArgs: [{ |
| doc: '', |
| name: '', |
| type: vdl.types.JSVALUE |
| }], |
| inStream: null, |
| outStream: null, |
| tags: [] |
| }] |
| }]); |
| var stringifiedResult = stringify(sigs); |
| var stringifiedExpected = stringify(expectedDescs); |
| t.equals(stringifiedResult, stringifiedExpected); |
| t.end(); |
| }); |
| |
| test('create signature with full description across multiple descs' + |
| ' with duplicates', function(t) { |
| var testService = new TestService(); |
| var descs = [{ |
| name: 'TestService', |
| pkgPath: 'service/test', |
| doc: 'TestServiceDoc', |
| embeds: [], |
| methods: [{ |
| name: 'NoArgsFunction', |
| doc: 'NoArgsDoc', |
| inArgs: [], |
| outArgs: [], |
| inStream: null, |
| outStream: null, |
| tags: [] |
| }] |
| }, { |
| name: 'TestService2', |
| pkgPath: 'service2/test', |
| doc: 'TestService2Doc', |
| embeds: [], |
| methods: [{ |
| name: 'NamedFunction', |
| doc: 'NamedFunctionDoc', |
| inArgs: [{ |
| name: 'x', |
| doc: 'xDoc', |
| type: vdl.types.UINT32 |
| }, { |
| name: 'y', |
| doc: 'yDoc', |
| type: vdl.types.STRING |
| }, { |
| name: 'z', |
| doc: 'zDoc', |
| type: vdl.types.COMPLEX128 |
| }], |
| outArgs: [{ |
| name: 'a', |
| doc: 'aDoc', |
| type: vdl.types.STRING |
| }], |
| inStream: null, |
| outStream: null, |
| tags: [] |
| }] |
| }, { |
| name: 'TestService3', |
| pkgPath: 'service3/test', |
| doc: 'TestService3Doc', |
| embeds: [], |
| methods: [{ |
| name: 'NamedFunction', |
| doc: 'NamedFunctionDoc', |
| inArgs: [{ |
| name: 'x', |
| doc: 'xDoc', |
| type: vdl.types.UINT32 |
| }, { |
| name: 'y', |
| doc: 'yDoc', |
| type: vdl.types.STRING |
| }, { |
| name: 'z', |
| doc: 'zDoc', |
| type: vdl.types.COMPLEX128 |
| }], |
| outArgs: [{ |
| name: 'a', |
| doc: 'aDoc', |
| type: vdl.types.STRING |
| }], |
| inStream: null, |
| outStream: null, |
| tags: [] |
| }, { |
| name: 'StreamingFunction', |
| doc: 'StreamingFunctionDoc', |
| inArgs: [], |
| outArgs: [], |
| inStream: { |
| doc: '', |
| name: '', |
| type: vdl.types.UINT32 |
| }, |
| outStream: { |
| doc: '', |
| name: '', |
| type: vdl.types.INT32 |
| }, |
| tags: [] |
| }] |
| }]; |
| var sigs = createSignature(testService, descs); |
| t.equals(sigs.length, 3); |
| var stringifiedResult = stringify(sigs); |
| var stringifiedExpected = stringify(descs); |
| t.equals(stringifiedResult, stringifiedExpected); |
| t.end(); |
| }); |
| |
| test('create signature with full description across multiple descs' + |
| ' with incompatible methods', function(t) { |
| var testService = new TestService(); |
| var descs = [{ |
| name: 'TestService', |
| pkgPath: 'service/test', |
| doc: 'TestServiceDoc', |
| embeds: [], |
| methods: [{ |
| name: 'NoArgsFunction', |
| doc: 'NoArgsDoc', |
| inArgs: [], |
| outArgs: [], |
| }] |
| }, { |
| name: 'TestService2', |
| pkgPath: 'service2/test', |
| doc: 'TestService2Doc', |
| embeds: [], |
| methods: [{ |
| name: 'NamedFunction', |
| doc: 'NamedFunctionDoc', |
| inArgs: [{ |
| name: 'x', |
| doc: 'xDoc', |
| type: vdl.types.UINT32 |
| }, { |
| name: 'y', |
| doc: 'yDoc', |
| type: vdl.types.STRING |
| }, { |
| name: 'z', |
| doc: 'zDoc', |
| type: vdl.types.COMPLEX128 |
| }], |
| outArgs: [{ |
| name: 'a', |
| doc: 'aDoc', |
| type: vdl.types.STRING |
| }] |
| }] |
| }, { |
| name: 'TestService3', |
| pkgPath: 'service3/test', |
| doc: 'TestService3Doc', |
| embeds: [], |
| methods: [{ |
| name: 'StreamingFunction', |
| doc: 'StreamingFunctionDoc', |
| inArgs: [], |
| outArgs: [], |
| inStream: { |
| doc: '', |
| name: '', |
| type: vdl.types.UINT32 |
| }, |
| outStream: { |
| doc: '', |
| name: '', |
| type: vdl.types.INT32 |
| } |
| }, { |
| name: 'NamedFunction', |
| doc: 'NamedFunctionDoc', |
| inArgs: [{ |
| name: 'x', |
| doc: 'xDoc', |
| type: vdl.types.UINT32 |
| }, { |
| name: 'y', |
| doc: 'yDoc', |
| type: vdl.types.ANY |
| }, { |
| name: 'z', |
| doc: 'zDoc', |
| type: vdl.types.COMPLEX128 |
| }], |
| outArgs: [{ |
| name: 'a', |
| doc: 'aDoc', |
| type: vdl.types.STRING |
| }] |
| }] |
| }]; |
| t.throws(function() { |
| createSignature(testService, descs); |
| }, null, 'NamedFunction should not match'); |
| t.end(); |
| }); |