grpc-node/test/api/interop_extra_test.js

139 lines
4.7 KiB
JavaScript

/*
*
* Copyright 2019 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';
const assert = require('assert');
const fs = require('fs');
const path = require('path');
const interopServer = require('../interop/interop_server.js');
const anyGrpc = require('../any_grpc');
const grpc = anyGrpc.client;
var protoLoader = require('../../packages/proto-loader');
const protoPackage = protoLoader.loadSync(
'src/proto/grpc/testing/test.proto',
{keepCase: true,
defaults: true,
enums: String,
includeDirs: [__dirname + '/../../packages/grpc-native-core/deps/grpc']});
const testProto = grpc.loadPackageDefinition(protoPackage).grpc.testing;
function multiDone(done, count) {
return function() {
count -= 1;
if (count <= 0) {
done();
}
};
}
function echoMetadataGenerator(options, callback) {
const metadata = new grpc.Metadata();
metadata.set('x-grpc-test-echo-initial', 'test_initial_metadata_value');
console.log('Adding metadata');
console.log(metadata);
callback(null, metadata);
}
const credentials = grpc.credentials.createFromMetadataGenerator(echoMetadataGenerator);
describe(`${anyGrpc.clientName} client -> ${anyGrpc.serverName} server`, function() {
describe('Interop-adjacent tests', function() {
let server;
let client;
before(function(done) {
interopServer.getServer(0, true, (err, serverObj) => {
if (err) {
done(err);
} else {
server = serverObj.server;
server.start();
const ca_path = path.join(__dirname, '../data/ca.pem');
const ca_data = fs.readFileSync(ca_path);
const creds = grpc.credentials.createSsl(ca_data);
const options = {
'grpc.ssl_target_name_override': 'foo.test.google.fr',
'grpc.default_authority': 'foo.test.google.fr'
};
client = new testProto.TestService(`localhost:${serverObj.port}`, creds, options);
done();
}
});
});
after(function() {
server.forceShutdown();
});
it('Should be able to start many concurrent calls', function(done) {
const callCount = 100;
done = multiDone(done, callCount);
for (let i = 0; i < callCount; i++) {
client.unaryCall({}, (error, result) => {
assert.ifError(error);
done();
});
}
});
it('Should echo metadata from call credentials', function(done) {
done = multiDone(done, 2);
const call = client.unaryCall({}, {credentials}, (error, result) => {
assert.ifError(error);
done();
});
call.on('metadata', (metadata) => {
assert.deepEqual(metadata.get('x-grpc-test-echo-initial'),
['test_initial_metadata_value']);
done();
});
});
it('Should be able to send the same metadata on two calls with call creds', function(done) {
done = multiDone(done, 5);
const metadata = new grpc.Metadata();
metadata.set('x-grpc-test-echo-trailing-bin', Buffer.from('ababab', 'hex'));
const call1 = client.unaryCall({}, metadata, {credentials}, (error, result) => {
assert.ifError(error);
const call2 = client.unaryCall({}, metadata, {credentials}, (error, result) => {
assert.ifError(error);
done();
});
call2.on('metadata', (metadata) => {
assert.deepEqual(metadata.get('x-grpc-test-echo-initial'),
['test_initial_metadata_value']);
done();
});
call2.on('status', function(status) {
var echo_trailer = status.metadata.get('x-grpc-test-echo-trailing-bin');
assert(echo_trailer.length === 1);
assert.strictEqual(echo_trailer[0].toString('hex'), 'ababab');
done();
});
});
call1.on('metadata', (metadata) => {
assert.deepEqual(metadata.get('x-grpc-test-echo-initial'),
['test_initial_metadata_value']);
done();
});
call1.on('status', function(status) {
var echo_trailer = status.metadata.get('x-grpc-test-echo-trailing-bin');
assert(echo_trailer.length === 1);
assert.strictEqual(echo_trailer[0].toString('hex'), 'ababab');
done();
});
});
});
});