/* * Copyright (C) 2012-2015 DataStax Inc. * * 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. */ package com.datastax.driver.core; import com.datastax.driver.core.exceptions.UnsupportedProtocolVersionException; import com.datastax.driver.core.utils.CassandraVersion; import org.testng.SkipException; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import static com.datastax.driver.core.ProtocolVersion.*; import static org.assertj.core.api.Assertions.assertThat; public class ProtocolVersionRenegotiationTest extends CCMTestsSupport { private ProtocolVersion protocolVersion; @BeforeMethod(groups = "short") public void setUp() { protocolVersion = ccm().getProtocolVersion(); } /** * @jira_ticket JAVA-1367 */ @Test(groups = "short") public void should_succeed_when_version_provided_and_matches() throws Exception { Cluster cluster = connectWithVersion(protocolVersion); assertThat(actualProtocolVersion(cluster)).isEqualTo(protocolVersion); } /** * @jira_ticket JAVA-1367 */ @Test(groups = "short") @CassandraVersion("3.8") public void should_fail_when_version_provided_and_too_low_3_8_plus() throws Exception { UnsupportedProtocolVersionException e = connectWithUnsupportedVersion(V1); assertThat(e.getUnsupportedVersion()).isEqualTo(V1); // post-CASSANDRA-11464: server replies with client's version assertThat(e.getServerVersion()).isEqualTo(V1); } /** * @jira_ticket JAVA-1367 */ @Test(groups = "short") public void should_fail_when_version_provided_and_too_high() throws Exception { if (ccm().getCassandraVersion().compareTo(VersionNumber.parse("2.2")) >= 0) { throw new SkipException("Server supports protocol V4"); } UnsupportedProtocolVersionException e = connectWithUnsupportedVersion(V4); assertThat(e.getUnsupportedVersion()).isEqualTo(V4); // pre-CASSANDRA-11464: server replies with its own version assertThat(e.getServerVersion()).isEqualTo(protocolVersion); } /** * @jira_ticket JAVA-1367 */ @Test(groups = "short") public void should_fail_when_beta_allowed_and_too_high() throws Exception { if (ccm().getCassandraVersion().compareTo(VersionNumber.parse("3.10")) >= 0) { throw new SkipException("Server supports protocol protocol V5 beta"); } UnsupportedProtocolVersionException e = connectWithUnsupportedBetaVersion(); assertThat(e.getUnsupportedVersion()).isEqualTo(V5); } /** * @jira_ticket JAVA-1367 */ @Test(groups = "short") @CCMConfig(version = "2.1.16", createCluster = false) public void should_negotiate_when_no_version_provided() throws Exception { if (protocolVersion.compareTo(ProtocolVersion.NEWEST_SUPPORTED) >= 0) { throw new SkipException("Server supports newest protocol version driver supports"); } Cluster cluster = connectWithoutVersion(); assertThat(actualProtocolVersion(cluster)).isEqualTo(protocolVersion); } private UnsupportedProtocolVersionException connectWithUnsupportedVersion(ProtocolVersion version) { Cluster cluster = register(Cluster.builder() .addContactPoints(getContactPoints()) .withPort(ccm().getBinaryPort()) .withProtocolVersion(version) .build()); return initWithUnsupportedVersion(cluster); } private UnsupportedProtocolVersionException connectWithUnsupportedBetaVersion() { Cluster cluster = register(Cluster.builder() .addContactPoints(getContactPoints()) .withPort(ccm().getBinaryPort()) .allowBetaProtocolVersion() .build()); return initWithUnsupportedVersion(cluster); } private UnsupportedProtocolVersionException initWithUnsupportedVersion(Cluster cluster) { Throwable t = null; try { cluster.init(); } catch (Throwable t2) { t = t2; } if (t instanceof UnsupportedProtocolVersionException) { return (UnsupportedProtocolVersionException) t; } else { throw new AssertionError("Expected UnsupportedProtocolVersionException, got " + t); } } private Cluster connectWithVersion(ProtocolVersion version) { Cluster cluster = register(Cluster.builder() .addContactPoints(getContactPoints()) .withPort(ccm().getBinaryPort()) .withProtocolVersion(version) .build()); cluster.init(); return cluster; } private Cluster connectWithoutVersion() { Cluster cluster = register(Cluster.builder() .addContactPoints(getContactPoints()) .withPort(ccm().getBinaryPort()) .build()); cluster.init(); return cluster; } private ProtocolVersion actualProtocolVersion(Cluster cluster) { return cluster.getConfiguration().getProtocolOptions().getProtocolVersion(); } }