Skip to content

Commit

Permalink
fix json forcing; add test (arangodb#12947)
Browse files Browse the repository at this point in the history
  • Loading branch information
dothebart authored Oct 30, 2020
1 parent a6b139c commit 3207f59
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 29 deletions.
7 changes: 7 additions & 0 deletions arangosh/Shell/V8ClientConnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1748,6 +1748,9 @@ v8::Local<v8::Value> V8ClientConnection::requestData(
req->header.acceptType(fu::ContentType::VPack);
}
}
else if (_forceJson && (req->header.acceptType() == fu::ContentType::VPack)) {
req->header.acceptType(fu::ContentType::Json);
}
req->timeout(
correctTimeoutToExecutionDeadline(
std::chrono::duration_cast<std::chrono::milliseconds>(_requestTimeout)));
Expand Down Expand Up @@ -1827,6 +1830,10 @@ v8::Local<v8::Value> V8ClientConnection::requestDataRaw(
if (req->header.acceptType() == fu::ContentType::Unset) {
req->header.acceptType(fu::ContentType::VPack);
}
if (_forceJson && (req->header.acceptType() == fu::ContentType::VPack)) {
req->header.acceptType(fu::ContentType::Json);
}

req->timeout(
correctTimeoutToExecutionDeadline(
std::chrono::duration_cast<std::chrono::milliseconds>(_requestTimeout)));
Expand Down
97 changes: 69 additions & 28 deletions js/client/modules/@arangodb/testsuites/endpoints.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ function endpoints (options) {
const keyFile = fs.join(tu.pathForTesting('.'), '..', '..', 'UnitTests', 'server.pem');
let endpoints = {
ssl: {
skip: function () { return options.skipEndpointsSSL; },
serverArgs: function () {
return {
'server.endpoint': 'ssl://127.0.0.1:' + pu.findFreePort(options.minPort, options.maxPort),
Expand All @@ -72,55 +73,71 @@ function endpoints (options) {
{
name: 'tcp',
endpoint: function (endpoint) { return endpoint; },
success: true
success: true,
forceJson: false
},
{
name: 'any',
endpoint: function (endpoint) { return endpoint.replace(/^ssl:\/\/.*:/, 'ssl://0.0.0.0:'); },
success: false
success: false,
forceJson: false
},
{
name: 'vst',
endpoint: function (endpoint) { return endpoint.replace(/^ssl:\/\//, 'vst+ssl://'); },
success: true
success: true,
forceJson: false
},
{
name: 'h2',
endpoint: function (endpoint) { return endpoint.replace(/^tcp:\/\//, 'h2+ssl://'); },
success: true
success: true,
forceJson: false
},
{
name: 'non-ssl',
endpoint: function (endpoint) { return endpoint.replace(/^ssl:\/\//, 'tcp://'); },
success: false
success: false,
forceJson: false
},
],
},

tcpv4: {
skip: function () { return options.skipEndpointsIpv4; },
serverArgs: function () {
return 'tcp://127.0.0.1:' + pu.findFreePort(options.minPort, options.maxPort);
},
shellTests: [
{
name: 'tcp-json',
endpoint: function (endpoint) { return endpoint; },
success: true,
forceJson: true
},
{
name: 'tcp',
endpoint: function (endpoint) { return endpoint; },
success: true
success: true,
forceJson: false
},
{
name: 'tcp-any',
endpoint: function (endpoint) { return endpoint.replace(/^tcp:\/\/.*:/, 'tcp://0.0.0.0:'); },
success: false
success: false,
forceJson: false
},
{
name: 'vst',
endpoint: function (endpoint) { return endpoint.replace(/^tcp:\/\//, 'vst://'); },
success: true
success: true,
forceJson: false
},
{
name: 'h2',
endpoint: function (endpoint) { return endpoint.replace(/^tcp:\/\//, 'h2://'); },
success: true
success: true,
forceJson: false
},
{
name: 'ssl',
Expand All @@ -136,30 +153,41 @@ function endpoints (options) {
return 'tcp://[::1]:' + pu.findFreePort(options.minPort, options.maxPort);
},
shellTests: [
{
name: 'tcp-json',
endpoint: function (endpoint) { return endpoint; },
success: true,
forceJson: false
},
{
name: 'tcp',
endpoint: function (endpoint) { return endpoint; },
success: true
success: true,
forceJson: false
},
{
name: 'tcp-any',
endpoint: function (endpoint) { return endpoint.replace(/^tcp:\/\/\[::1\]:/, 'tcp://[::]:'); },
success: false
success: false,
forceJson: false
},
{
name: 'vst',
endpoint: function (endpoint) { return endpoint.replace(/^tcp:\/\//, 'vst://'); },
success: true
success: true,
forceJson: false
},
{
name: 'h2',
endpoint: function (endpoint) { return endpoint.replace(/^tcp:\/\//, 'h2://'); },
success: true
success: true,
forceJson: false
},
{
name: 'ssl',
endpoint: function (endpoint) { return endpoint.replace(/^tcp:\/\//, 'ssl://'); },
success: false
success: false,
forceJson: false
},
],
},
Expand Down Expand Up @@ -208,22 +236,33 @@ function endpoints (options) {
}

const specFile = testPaths.endpoints[0];

let filtered = {};

testCase.shellTests.forEach(function(testCase) {
let old = instanceInfo.endpoint;
let shellEndpoint = testCase.endpoint(serverArgs['server.endpoint']);
instanceInfo.endpoint = shellEndpoint;
try {
let result = tu.runInArangosh(options, instanceInfo, specFile, { 'server.connection-timeout': 2, 'server.request-timeout': 2 });
let success = result.status === testCase.success;
results[endpointName + '-' + testCase.name] = { status: success };
if (!success) {
// arangosh or the test returned an error
results[endpointName + '-' + testCase.name].message = result.message;
results.failed += 1;
if (tu.filterTestcaseByOptions(testCase.name, options, filtered)) {
let old = instanceInfo.endpoint;
let shellEndpoint = testCase.endpoint(serverArgs['server.endpoint']);
instanceInfo.endpoint = shellEndpoint;
try {
let arangoshOpts = { 'server.connection-timeout': 2, 'server.request-timeout': 2 };
if (testCase.forceJson) {
arangoshOpts['server.force-json'] = true;
}
let result = tu.runInArangosh(options, instanceInfo, specFile, arangoshOpts);
let success = result.status === testCase.success;
results[endpointName + '-' + testCase.name] = { status: success };
if (!success) {
// arangosh or the test returned an error
results[endpointName + '-' + testCase.name].message = result.message;
results.failed += 1;
}
} finally {
instanceInfo.endpoint = old;
}
} else {
if (options.extremeVerbosity) {
print('Skipped ' + testCase.name + ' because of ' + filtered.filter);
}
} finally {
instanceInfo.endpoint = old;
}
});

Expand All @@ -248,6 +287,8 @@ exports.setup = function (testFns, defaultFns, opts, fnDocs, optionsDoc, allTest

opts['skipEndpoints'] = false;
opts['skipEndpointsIpv6'] = false;
opts['skipEndpointsIpv4'] = false;
opts['skipEndpointsSSL'] = false;
opts['skipEndpointsUnix'] = (platform.substr(0, 3) === 'win');

defaultFns.push('endpoints');
Expand Down
8 changes: 7 additions & 1 deletion tests/js/client/endpoint-spec.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* global db, describe, it, beforeEach, afterEach*/
/* global db, describe, it, beforeEach, afterEach, arango */
'use strict';

// //////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -34,4 +34,10 @@ describe('Endpoint Connection test', function() {
it('should be able to connect', function() {
expect(db._version()).to.not.be.undefined;
});
if (require('internal').options()['server.force-json']) {
it('should have plain json documents', function() {
let req = arango.GET_RAW('/_api/version');
expect(req.headers['content-type']).not.to.equal('application/x-velocypack');
});
}
});

0 comments on commit 3207f59

Please sign in to comment.