1 /*
2   Copyright (c) DataStax, Inc.
3 
4   Licensed under the Apache License, Version 2.0 (the "License");
5   you may not use this file except in compliance with the License.
6   You may obtain a copy of the License at
7 
8   http://www.apache.org/licenses/LICENSE-2.0
9 
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15 */
16 
17 #include <gtest/gtest.h>
18 
19 #include "unit.hpp"
20 
21 #include "cassandra.h"
22 #include "protocol.hpp"
23 
24 using datastax::internal::core::ProtocolVersion;
25 
26 class ProtocolVersionUnitTest : public Unit {};
27 
TEST_F(ProtocolVersionUnitTest,LowestSupported)28 TEST_F(ProtocolVersionUnitTest, LowestSupported) {
29   EXPECT_EQ(ProtocolVersion(CASS_PROTOCOL_VERSION_V3), ProtocolVersion::lowest_supported());
30 }
31 
TEST_F(ProtocolVersionUnitTest,HighestSupported)32 TEST_F(ProtocolVersionUnitTest, HighestSupported) {
33   EXPECT_EQ(ProtocolVersion(CASS_PROTOCOL_VERSION_DSEV2), ProtocolVersion::highest_supported());
34 }
35 
TEST_F(ProtocolVersionUnitTest,NewestBeta)36 TEST_F(ProtocolVersionUnitTest, NewestBeta) {
37   EXPECT_EQ(ProtocolVersion(CASS_PROTOCOL_VERSION_V5), ProtocolVersion::newest_beta());
38 }
39 
TEST_F(ProtocolVersionUnitTest,IsValid)40 TEST_F(ProtocolVersionUnitTest, IsValid) {
41   { // Invalid
42     ProtocolVersion invalid;
43     EXPECT_FALSE(invalid.is_valid());
44   }
45 
46   { // Invalid
47     ProtocolVersion zero(0);
48     EXPECT_FALSE(zero.is_valid());
49   }
50 
51   { // Invalid (no longer supported)
52     ProtocolVersion v1(CASS_PROTOCOL_VERSION_V1);
53     EXPECT_FALSE(v1.is_valid());
54   }
55 
56   { // Invalid (no longer supported)
57     ProtocolVersion v2(CASS_PROTOCOL_VERSION_V2);
58     EXPECT_FALSE(v2.is_valid());
59   }
60 
61   { // Valid
62     ProtocolVersion v3(CASS_PROTOCOL_VERSION_V3);
63     EXPECT_TRUE(v3.is_valid());
64   }
65 
66   { // Valid
67     ProtocolVersion v4(CASS_PROTOCOL_VERSION_V4);
68     EXPECT_TRUE(v4.is_valid());
69   }
70 
71   { // Invalid (Cassandra beta version)
72     ProtocolVersion v5(CASS_PROTOCOL_VERSION_V5);
73     EXPECT_FALSE(v5.is_valid());
74   }
75 
76   { // Valid
77     ProtocolVersion vDSE1(CASS_PROTOCOL_VERSION_DSEV1);
78     EXPECT_TRUE(vDSE1.is_valid());
79   }
80 
81   { // Valid (Latest DSE protocol version)
82     ProtocolVersion vDSE2(CASS_PROTOCOL_VERSION_DSEV2);
83     EXPECT_TRUE(vDSE2.is_valid());
84   }
85 }
86 
TEST_F(ProtocolVersionUnitTest,IsBeta)87 TEST_F(ProtocolVersionUnitTest, IsBeta) {
88   { // Not valid beta
89     ProtocolVersion invalid;
90     EXPECT_FALSE(invalid.is_beta());
91   }
92 
93   { // Invalid beta (Latest DSE protocol version)
94     ProtocolVersion vDSE2(CASS_PROTOCOL_VERSION_DSEV2);
95     EXPECT_FALSE(vDSE2.is_beta());
96   }
97 
98   { // Valid beta
99     ProtocolVersion v5(CASS_PROTOCOL_VERSION_V5);
100     EXPECT_TRUE(v5.is_beta());
101   }
102 }
103 
TEST_F(ProtocolVersionUnitTest,ToString)104 TEST_F(ProtocolVersionUnitTest, ToString) {
105   {
106     ProtocolVersion invalid;
107     EXPECT_EQ(invalid.to_string(), "<invalid>");
108   }
109 
110   {
111     ProtocolVersion v4(CASS_PROTOCOL_VERSION_V4);
112     EXPECT_EQ(v4.to_string(), "v4");
113   }
114 
115   {
116     ProtocolVersion v5(CASS_PROTOCOL_VERSION_V5);
117     EXPECT_EQ(v5.to_string(), "v5");
118   }
119 
120   {
121     ProtocolVersion DSEv1(CASS_PROTOCOL_VERSION_DSEV1);
122     EXPECT_EQ(DSEv1.to_string(), "DSEv1");
123   }
124 }
125 
TEST_F(ProtocolVersionUnitTest,AttemptLowerSupported)126 TEST_F(ProtocolVersionUnitTest, AttemptLowerSupported) {
127   ProtocolVersion version(CASS_PROTOCOL_VERSION_DSEV2);
128   EXPECT_EQ(ProtocolVersion(CASS_PROTOCOL_VERSION_DSEV2), version);
129 
130   EXPECT_TRUE((version = version.previous()).is_valid());
131   EXPECT_EQ(ProtocolVersion(CASS_PROTOCOL_VERSION_DSEV1), version);
132 
133   EXPECT_TRUE((version = version.previous()).is_valid());
134   EXPECT_EQ(ProtocolVersion(CASS_PROTOCOL_VERSION_V4), version);
135 
136   EXPECT_TRUE((version = version.previous()).is_valid());
137   EXPECT_EQ(ProtocolVersion(CASS_PROTOCOL_VERSION_V3), version);
138 
139   EXPECT_FALSE(version.previous().is_valid()); // Can't go any lower
140   EXPECT_EQ(ProtocolVersion(CASS_PROTOCOL_VERSION_V3), version);
141 }
142 
TEST_F(ProtocolVersionUnitTest,SupportsSetKeyspace)143 TEST_F(ProtocolVersionUnitTest, SupportsSetKeyspace) {
144   { // Supported
145     ProtocolVersion v5(CASS_PROTOCOL_VERSION_V5);
146     EXPECT_TRUE(v5.supports_set_keyspace());
147   }
148 
149   { // Supported
150     ProtocolVersion DSEv2(CASS_PROTOCOL_VERSION_DSEV2);
151     EXPECT_TRUE(DSEv2.supports_set_keyspace());
152   }
153 
154   { // Not supported
155     ProtocolVersion DSEv1(CASS_PROTOCOL_VERSION_DSEV1);
156     EXPECT_FALSE(DSEv1.supports_set_keyspace());
157 
158     for (int i = CASS_PROTOCOL_VERSION_V1; i <= CASS_PROTOCOL_VERSION_V4; ++i) {
159       ProtocolVersion version(i);
160       EXPECT_FALSE(version.supports_set_keyspace());
161     }
162   }
163 }
164 
TEST_F(ProtocolVersionUnitTest,SupportsResultMetadataId)165 TEST_F(ProtocolVersionUnitTest, SupportsResultMetadataId) {
166   { // Supported
167     ProtocolVersion v5(CASS_PROTOCOL_VERSION_V5);
168     EXPECT_TRUE(v5.supports_result_metadata_id());
169   }
170 
171   { // Supported
172     ProtocolVersion DSEv2(CASS_PROTOCOL_VERSION_DSEV2);
173     EXPECT_TRUE(DSEv2.supports_result_metadata_id());
174   }
175 
176   { // Not supported
177     ProtocolVersion DSEv1(CASS_PROTOCOL_VERSION_DSEV1);
178     EXPECT_FALSE(DSEv1.supports_result_metadata_id());
179 
180     for (int i = CASS_PROTOCOL_VERSION_V1; i <= CASS_PROTOCOL_VERSION_V4; ++i) {
181       ProtocolVersion version(i);
182       EXPECT_FALSE(version.supports_result_metadata_id());
183     }
184   }
185 }
186