aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/node/interop/interop_client.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/node/interop/interop_client.js')
-rw-r--r--src/node/interop/interop_client.js621
1 files changed, 0 insertions, 621 deletions
diff --git a/src/node/interop/interop_client.js b/src/node/interop/interop_client.js
deleted file mode 100644
index f321d58aa6..0000000000
--- a/src/node/interop/interop_client.js
+++ /dev/null
@@ -1,621 +0,0 @@
-/*
- *
- * Copyright 2015 gRPC authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-'use strict';
-
-var fs = require('fs');
-var path = require('path');
-var grpc = require('..');
-var testProto = grpc.load({
- root: __dirname + '/../../..',
- file: 'src/proto/grpc/testing/test.proto'}).grpc.testing;
-var GoogleAuth = require('google-auth-library');
-
-var assert = require('assert');
-
-var SERVICE_ACCOUNT_EMAIL;
-try {
- SERVICE_ACCOUNT_EMAIL = require(
- process.env.GOOGLE_APPLICATION_CREDENTIALS).client_email;
-} catch (e) {
- // This will cause the tests to fail if they need that string
- SERVICE_ACCOUNT_EMAIL = null;
-}
-
-var ECHO_INITIAL_KEY = 'x-grpc-test-echo-initial';
-var ECHO_TRAILING_KEY = 'x-grpc-test-echo-trailing-bin';
-
-/**
- * Create a buffer filled with size zeroes
- * @param {number} size The length of the buffer
- * @return {Buffer} The new buffer
- */
-function zeroBuffer(size) {
- var zeros = new Buffer(size);
- zeros.fill(0);
- return zeros;
-}
-
-/**
- * This is used for testing functions with multiple asynchronous calls that
- * can happen in different orders. This should be passed the number of async
- * function invocations that can occur last, and each of those should call this
- * function's return value
- * @param {function()} done The function that should be called when a test is
- * complete.
- * @param {number} count The number of calls to the resulting function if the
- * test passes.
- * @return {function()} The function that should be called at the end of each
- * sequence of asynchronous functions.
- */
-function multiDone(done, count) {
- return function() {
- count -= 1;
- if (count <= 0) {
- done();
- }
- };
-}
-
-/**
- * Run the empty_unary test
- * @param {Client} client The client to test against
- * @param {function} done Callback to call when the test is completed. Included
- * primarily for use with mocha
- */
-function emptyUnary(client, done) {
- client.emptyCall({}, function(err, resp) {
- assert.ifError(err);
- if (done) {
- done();
- }
- });
-}
-
-/**
- * Run the large_unary test
- * @param {Client} client The client to test against
- * @param {function} done Callback to call when the test is completed. Included
- * primarily for use with mocha
- */
-function largeUnary(client, done) {
- var arg = {
- response_type: 'COMPRESSABLE',
- response_size: 314159,
- payload: {
- body: zeroBuffer(271828)
- }
- };
- client.unaryCall(arg, function(err, resp) {
- assert.ifError(err);
- assert.strictEqual(resp.payload.type, 'COMPRESSABLE');
- assert.strictEqual(resp.payload.body.length, 314159);
- if (done) {
- done();
- }
- });
-}
-
-/**
- * Run the client_streaming test
- * @param {Client} client The client to test against
- * @param {function} done Callback to call when the test is completed. Included
- * primarily for use with mocha
- */
-function clientStreaming(client, done) {
- var call = client.streamingInputCall(function(err, resp) {
- assert.ifError(err);
- assert.strictEqual(resp.aggregated_payload_size, 74922);
- if (done) {
- done();
- }
- });
- var payload_sizes = [27182, 8, 1828, 45904];
- for (var i = 0; i < payload_sizes.length; i++) {
- call.write({payload: {body: zeroBuffer(payload_sizes[i])}});
- }
- call.end();
-}
-
-/**
- * Run the server_streaming test
- * @param {Client} client The client to test against
- * @param {function} done Callback to call when the test is completed. Included
- * primarily for use with mocha
- */
-function serverStreaming(client, done) {
- var arg = {
- response_type: 'COMPRESSABLE',
- response_parameters: [
- {size: 31415},
- {size: 9},
- {size: 2653},
- {size: 58979}
- ]
- };
- var call = client.streamingOutputCall(arg);
- var resp_index = 0;
- call.on('data', function(value) {
- assert(resp_index < 4);
- assert.strictEqual(value.payload.type, 'COMPRESSABLE');
- assert.strictEqual(value.payload.body.length,
- arg.response_parameters[resp_index].size);
- resp_index += 1;
- });
- call.on('end', function() {
- assert.strictEqual(resp_index, 4);
- if (done) {
- done();
- }
- });
- call.on('status', function(status) {
- assert.strictEqual(status.code, grpc.status.OK);
- });
-}
-
-/**
- * Run the ping_pong test
- * @param {Client} client The client to test against
- * @param {function} done Callback to call when the test is completed. Included
- * primarily for use with mocha
- */
-function pingPong(client, done) {
- var payload_sizes = [27182, 8, 1828, 45904];
- var response_sizes = [31415, 9, 2653, 58979];
- var call = client.fullDuplexCall();
- call.on('status', function(status) {
- assert.strictEqual(status.code, grpc.status.OK);
- if (done) {
- done();
- }
- });
- var index = 0;
- call.write({
- response_type: 'COMPRESSABLE',
- response_parameters: [
- {size: response_sizes[index]}
- ],
- payload: {body: zeroBuffer(payload_sizes[index])}
- });
- call.on('data', function(response) {
- assert.strictEqual(response.payload.type, 'COMPRESSABLE');
- assert.equal(response.payload.body.length, response_sizes[index]);
- index += 1;
- if (index === 4) {
- call.end();
- } else {
- call.write({
- response_type: 'COMPRESSABLE',
- response_parameters: [
- {size: response_sizes[index]}
- ],
- payload: {body: zeroBuffer(payload_sizes[index])}
- });
- }
- });
-}
-
-/**
- * Run the empty_stream test.
- * @param {Client} client The client to test against
- * @param {function} done Callback to call when the test is completed. Included
- * primarily for use with mocha
- */
-function emptyStream(client, done) {
- var call = client.fullDuplexCall();
- call.on('status', function(status) {
- assert.strictEqual(status.code, grpc.status.OK);
- if (done) {
- done();
- }
- });
- call.on('data', function(value) {
- assert.fail(value, null, 'No data should have been received', '!==');
- });
- call.end();
-}
-
-/**
- * Run the cancel_after_begin test.
- * @param {Client} client The client to test against
- * @param {function} done Callback to call when the test is completed. Included
- * primarily for use with mocha
- */
-function cancelAfterBegin(client, done) {
- var call = client.streamingInputCall(function(err, resp) {
- assert.strictEqual(err.code, grpc.status.CANCELLED);
- done();
- });
- call.cancel();
-}
-
-/**
- * Run the cancel_after_first_response test.
- * @param {Client} client The client to test against
- * @param {function} done Callback to call when the test is completed. Included
- * primarily for use with mocha
- */
-function cancelAfterFirstResponse(client, done) {
- var call = client.fullDuplexCall();
- call.write({
- response_type: 'COMPRESSABLE',
- response_parameters: [
- {size: 31415}
- ],
- payload: {body: zeroBuffer(27182)}
- });
- call.on('data', function(data) {
- call.cancel();
- });
- call.on('error', function(error) {
- assert.strictEqual(error.code, grpc.status.CANCELLED);
- done();
- });
-}
-
-function timeoutOnSleepingServer(client, done) {
- var deadline = new Date();
- deadline.setMilliseconds(deadline.getMilliseconds() + 1);
- var call = client.fullDuplexCall({deadline: deadline});
- call.write({
- payload: {body: zeroBuffer(27182)}
- });
- call.on('data', function() {});
- call.on('error', function(error) {
-
- assert(error.code === grpc.status.DEADLINE_EXCEEDED ||
- error.code === grpc.status.INTERNAL);
- done();
- });
-}
-
-function customMetadata(client, done) {
- done = multiDone(done, 5);
- var metadata = new grpc.Metadata();
- metadata.set(ECHO_INITIAL_KEY, 'test_initial_metadata_value');
- metadata.set(ECHO_TRAILING_KEY, new Buffer('ababab', 'hex'));
- var arg = {
- response_type: 'COMPRESSABLE',
- response_size: 314159,
- payload: {
- body: zeroBuffer(271828)
- }
- };
- var streaming_arg = {
- response_parameters: [
- {size: 314159}
- ],
- payload: {
- body: zeroBuffer(271828)
- }
- };
- var unary = client.unaryCall(arg, metadata, function(err, resp) {
- assert.ifError(err);
- done();
- });
- unary.on('metadata', function(metadata) {
- assert.deepEqual(metadata.get(ECHO_INITIAL_KEY),
- ['test_initial_metadata_value']);
- done();
- });
- unary.on('status', function(status) {
- var echo_trailer = status.metadata.get(ECHO_TRAILING_KEY);
- assert(echo_trailer.length > 0);
- assert.strictEqual(echo_trailer[0].toString('hex'), 'ababab');
- done();
- });
- var stream = client.fullDuplexCall(metadata);
- stream.on('metadata', function(metadata) {
- assert.deepEqual(metadata.get(ECHO_INITIAL_KEY),
- ['test_initial_metadata_value']);
- done();
- });
- stream.on('data', function() {});
- stream.on('status', function(status) {
- var echo_trailer = status.metadata.get(ECHO_TRAILING_KEY);
- assert(echo_trailer.length > 0);
- assert.strictEqual(echo_trailer[0].toString('hex'), 'ababab');
- done();
- });
- stream.write(streaming_arg);
- stream.end();
-}
-
-function statusCodeAndMessage(client, done) {
- done = multiDone(done, 2);
- var arg = {
- response_status: {
- code: 2,
- message: 'test status message'
- }
- };
- client.unaryCall(arg, function(err, resp) {
- assert(err);
- assert.strictEqual(err.code, 2);
- assert.strictEqual(err.message, 'test status message');
- done();
- });
- var duplex = client.fullDuplexCall();
- duplex.on('data', function() {});
- duplex.on('status', function(status) {
- assert(status);
- assert.strictEqual(status.code, 2);
- assert.strictEqual(status.details, 'test status message');
- done();
- });
- duplex.on('error', function(){});
- duplex.write(arg);
- duplex.end();
-}
-
-// NOTE: the client param to this function is from UnimplementedService
-function unimplementedService(client, done) {
- client.unimplementedCall({}, function(err, resp) {
- assert(err);
- assert.strictEqual(err.code, grpc.status.UNIMPLEMENTED);
- done();
- });
-}
-
-// NOTE: the client param to this function is from TestService
-function unimplementedMethod(client, done) {
- client.unimplementedCall({}, function(err, resp) {
- assert(err);
- assert.strictEqual(err.code, grpc.status.UNIMPLEMENTED);
- done();
- });
-}
-
-/**
- * Run one of the authentication tests.
- * @param {string} expected_user The expected username in the response
- * @param {Client} client The client to test against
- * @param {?string} scope The scope to apply to the credentials
- * @param {function} done Callback to call when the test is completed. Included
- * primarily for use with mocha
- */
-function authTest(expected_user, scope, client, done) {
- var arg = {
- response_type: 'COMPRESSABLE',
- response_size: 314159,
- payload: {
- body: zeroBuffer(271828)
- },
- fill_username: true,
- fill_oauth_scope: true
- };
- client.unaryCall(arg, function(err, resp) {
- assert.ifError(err);
- assert.strictEqual(resp.payload.type, 'COMPRESSABLE');
- assert.strictEqual(resp.payload.body.length, 314159);
- assert.strictEqual(resp.username, expected_user);
- if (scope) {
- assert(scope.indexOf(resp.oauth_scope) > -1);
- }
- if (done) {
- done();
- }
- });
-}
-
-function computeEngineCreds(client, done, extra) {
- authTest(extra.service_account, null, client, done);
-}
-
-function serviceAccountCreds(client, done, extra) {
- authTest(SERVICE_ACCOUNT_EMAIL, extra.oauth_scope, client, done);
-}
-
-function jwtTokenCreds(client, done, extra) {
- authTest(SERVICE_ACCOUNT_EMAIL, null, client, done);
-}
-
-function oauth2Test(client, done, extra) {
- var arg = {
- fill_username: true,
- fill_oauth_scope: true
- };
- client.unaryCall(arg, function(err, resp) {
- assert.ifError(err);
- assert.strictEqual(resp.username, SERVICE_ACCOUNT_EMAIL);
- assert(extra.oauth_scope.indexOf(resp.oauth_scope) > -1);
- if (done) {
- done();
- }
- });
-}
-
-function perRpcAuthTest(client, done, extra) {
- (new GoogleAuth()).getApplicationDefault(function(err, credential) {
- assert.ifError(err);
- var arg = {
- fill_username: true,
- fill_oauth_scope: true
- };
- var scope = extra.oauth_scope;
- if (credential.createScopedRequired() && scope) {
- credential = credential.createScoped(scope);
- }
- var creds = grpc.credentials.createFromGoogleCredential(credential);
- client.unaryCall(arg, {credentials: creds}, function(err, resp) {
- assert.ifError(err);
- assert.strictEqual(resp.username, SERVICE_ACCOUNT_EMAIL);
- assert(extra.oauth_scope.indexOf(resp.oauth_scope) > -1);
- if (done) {
- done();
- }
- });
- });
-}
-
-function getApplicationCreds(scope, callback) {
- (new GoogleAuth()).getApplicationDefault(function(err, credential) {
- if (err) {
- callback(err);
- return;
- }
- if (credential.createScopedRequired() && scope) {
- credential = credential.createScoped(scope);
- }
- callback(null, grpc.credentials.createFromGoogleCredential(credential));
- });
-}
-
-function getOauth2Creds(scope, callback) {
- (new GoogleAuth()).getApplicationDefault(function(err, credential) {
- if (err) {
- callback(err);
- return;
- }
- credential = credential.createScoped(scope);
- credential.getAccessToken(function(err, token) {
- if (err) {
- callback(err);
- return;
- }
- var updateMd = function(service_url, callback) {
- var metadata = new grpc.Metadata();
- metadata.add('authorization', 'Bearer ' + token);
- callback(null, metadata);
- };
- callback(null, grpc.credentials.createFromMetadataGenerator(updateMd));
- });
- });
-}
-
-/**
- * Map from test case names to test functions
- */
-var test_cases = {
- empty_unary: {run: emptyUnary,
- Client: testProto.TestService},
- large_unary: {run: largeUnary,
- Client: testProto.TestService},
- client_streaming: {run: clientStreaming,
- Client: testProto.TestService},
- server_streaming: {run: serverStreaming,
- Client: testProto.TestService},
- ping_pong: {run: pingPong,
- Client: testProto.TestService},
- empty_stream: {run: emptyStream,
- Client: testProto.TestService},
- cancel_after_begin: {run: cancelAfterBegin,
- Client: testProto.TestService},
- cancel_after_first_response: {run: cancelAfterFirstResponse,
- Client: testProto.TestService},
- timeout_on_sleeping_server: {run: timeoutOnSleepingServer,
- Client: testProto.TestService},
- custom_metadata: {run: customMetadata,
- Client: testProto.TestService},
- status_code_and_message: {run: statusCodeAndMessage,
- Client: testProto.TestService},
- unimplemented_service: {run: unimplementedService,
- Client: testProto.UnimplementedService},
- unimplemented_method: {run: unimplementedMethod,
- Client: testProto.TestService},
- compute_engine_creds: {run: computeEngineCreds,
- Client: testProto.TestService,
- getCreds: getApplicationCreds},
- service_account_creds: {run: serviceAccountCreds,
- Client: testProto.TestService,
- getCreds: getApplicationCreds},
- jwt_token_creds: {run: jwtTokenCreds,
- Client: testProto.TestService,
- getCreds: getApplicationCreds},
- oauth2_auth_token: {run: oauth2Test,
- Client: testProto.TestService,
- getCreds: getOauth2Creds},
- per_rpc_creds: {run: perRpcAuthTest,
- Client: testProto.TestService}
-};
-
-exports.test_cases = test_cases;
-
-/**
- * Execute a single test case.
- * @param {string} address The address of the server to connect to, in the
- * format 'hostname:port'
- * @param {string} host_overrirde The hostname of the server to use as an SSL
- * override
- * @param {string} test_case The name of the test case to run
- * @param {bool} tls Indicates that a secure channel should be used
- * @param {function} done Callback to call when the test is completed. Included
- * primarily for use with mocha
- * @param {object=} extra Extra options for some tests
- */
-function runTest(address, host_override, test_case, tls, test_ca, done, extra) {
- // TODO(mlumish): enable TLS functionality
- var options = {};
- var creds;
- if (tls) {
- var ca_path;
- if (test_ca) {
- ca_path = path.join(__dirname, '../test/data/ca.pem');
- var ca_data = fs.readFileSync(ca_path);
- creds = grpc.credentials.createSsl(ca_data);
- } else {
- creds = grpc.credentials.createSsl();
- }
- if (host_override) {
- options['grpc.ssl_target_name_override'] = host_override;
- options['grpc.default_authority'] = host_override;
- }
- } else {
- creds = grpc.credentials.createInsecure();
- }
- var test = test_cases[test_case];
-
- var execute = function(err, creds) {
- assert.ifError(err);
- var client = new test.Client(address, creds, options);
- test.run(client, done, extra);
- };
-
- if (test.getCreds) {
- test.getCreds(extra.oauth_scope, function(err, new_creds) {
- assert.ifError(err);
- execute(err, grpc.credentials.combineChannelCredentials(
- creds, new_creds));
- });
- } else {
- execute(null, creds);
- }
-}
-
-if (require.main === module) {
- var parseArgs = require('minimist');
- var argv = parseArgs(process.argv, {
- string: ['server_host', 'server_host_override', 'server_port', 'test_case',
- 'use_tls', 'use_test_ca', 'default_service_account', 'oauth_scope',
- 'service_account_key_file']
- });
- var extra_args = {
- service_account: argv.default_service_account,
- oauth_scope: argv.oauth_scope
- };
- runTest(argv.server_host + ':' + argv.server_port, argv.server_host_override,
- argv.test_case, argv.use_tls === 'true', argv.use_test_ca === 'true',
- function () {
- console.log('OK:', argv.test_case);
- }, extra_args);
-}
-
-/**
- * See docs for runTest
- */
-exports.runTest = runTest;