blob: bc5fb6a701b633fd379dd0b656ae3ab4e03bdf09 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 protocolVersion = require('../../lib/types/').protocolVersion;
const Host = require('../../lib/host').Host;
const options = require('../../lib/client-options').defaultOptions();
describe('protocolVersion', function () {
describe('#getHighestCommon()', function () {
it('should downgrade to protocol v3 with versions 3.0 & 2.1', testWithHosts(['3.0.13', '2.1.17'], 3));
it('should downgrade to protocol v3 with versions 2.2 & 2.1', testWithHosts(['2.2.11', '2.1.17'], 3));
it('should downgrade to protocol v2 with versions 2.2 & 2.0', testWithHosts(['2.2.11', '2.0.17'], 2));
it('should downgrade to protocol v1 with versions 2.2 & 1.2', testWithHosts(['2.2.11', '1.2.19'], 1));
it('should downgrade to protocol v2 with versions 2.1 & 2.0', testWithHosts(['2.1.17', '2.0.17'], 2));
it('should downgrade to protocol v1 with versions 2.1 & 1.2', testWithHosts(['2.1.17', '1.2.19'], 1));
it('should downgrade to protocol v1 with versions 2.0 & 1.2', testWithHosts(['2.0.17', '1.2.19'], 1));
// no need to downgrade since both support protocol V4.
it('should not downgrade with versions 3.0 & 2.2', testWithHosts(['3.0.13', '3.0.11', '2.2.9'], 4));
// can't downgrade because C* 3.0 does not support protocol V2.
it('should not downgrade with versions 3.0 & 2.0', testWithHosts(['3.0.13', '2.0.17'], 4));
// can't downgrade because C* 3.0 does not support protocol V1.
it('should not downgrade with versions 3.0 & 1.2', testWithHosts(['3.0.13', '1.2.19'], 4));
// since connection uses protocol v1, we should stick with v1 even if highest common is greater.
it('should use connection protocol version even if highest common is greater', testWithHosts(['1.2.19', '3.0.13'], 1));
// disregard connection protocol version if highest common is lower, this should not happen in practice.
// this is technically covered by other tests, but good to validate explicitly.
it('should use highest common even if connection protocol version is greater', testWithHosts(['2.1.17', '2.0.17'], 2, 4));
// DSE specific tests
// should downgrade when detects older dse version that doesn't support DSE protocol versions so falls back on C* version.
it('should downgrade to protocol v4 with dse versions 5.1 & 5.0', testWithHosts([['3.11.0', '5.1.5'], ['3.10.0', '5.0.11']], 4));
it('should downgrade to protocol v3 with dse versions 5.1 & 4.8', testWithHosts([['3.11.0', '5.1.5'], ['2.1.17', '4.8.12']], 3));
// DSE nodes should interop with C* nodes
it('should downgrade to protocol v4 with dse version 5.1 & cassandra 3.11', testWithHosts([['3.11.0', '5.1.5'], '3.11.0'], 4));
// can't downgrade because DSE 5.0+ (C* 3.0+) does not support protocol V2.
it('should not downgrade with dse versions 5.1 & 4.6', testWithHosts([['3.11.0', '5.1.5'], ['2.0.17', '4.6.14']], protocolVersion.dseV1));
// since connection uses protocol v4, we should stick with v4 even if highest common is a dse protocol version.
it('should use connection protocol version even if highest common is a dse protocol version', testWithHosts([['3.11.0', '5.1.5']], 4, 4));
});
});
function testWithHosts(hostVersions, expectedProtocolVersion, connectionProtocolVersion) {
const mockConnection = {
address: '192.1.1.0',
port: 9042,
protocolVersion: connectionProtocolVersion || protocolVersion.maxSupported,
};
const hosts = [];
for (let i = 0; i < hostVersions.length; i++) {
const host = new Host('192.1.1.' + i, protocolVersion.maxSupported, options);
if (typeof hostVersions[i] === 'string') {
host.cassandraVersion = hostVersions[i];
} else {
host.cassandraVersion = hostVersions[i][0];
host.dseVersion = hostVersions[i][1];
}
hosts.push(host);
}
return function (done) {
const highestVersion = protocolVersion.getHighestCommon(mockConnection, hosts);
assert.strictEqual(highestVersion, expectedProtocolVersion);
done();
};
}