cql-rb 1.2.2 → 2.0.0.pre0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +4 -0
- data/README.md +139 -17
- data/lib/cql/client.rb +237 -8
- data/lib/cql/client/asynchronous_client.rb +138 -54
- data/lib/cql/client/asynchronous_prepared_statement.rb +41 -6
- data/lib/cql/client/authenticators.rb +46 -0
- data/lib/cql/client/batch.rb +115 -0
- data/lib/cql/client/connector.rb +255 -0
- data/lib/cql/client/execute_options_decoder.rb +25 -9
- data/lib/cql/client/keyspace_changer.rb +5 -5
- data/lib/cql/client/peer_discovery.rb +33 -0
- data/lib/cql/client/query_result.rb +124 -1
- data/lib/cql/client/request_runner.rb +4 -2
- data/lib/cql/client/synchronous_client.rb +14 -2
- data/lib/cql/client/synchronous_prepared_statement.rb +19 -1
- data/lib/cql/future.rb +97 -50
- data/lib/cql/io/connection.rb +0 -1
- data/lib/cql/io/io_reactor.rb +1 -1
- data/lib/cql/protocol.rb +8 -1
- data/lib/cql/protocol/cql_protocol_handler.rb +2 -2
- data/lib/cql/protocol/decoding.rb +10 -15
- data/lib/cql/protocol/frame_decoder.rb +2 -1
- data/lib/cql/protocol/frame_encoder.rb +5 -4
- data/lib/cql/protocol/requests/auth_response_request.rb +31 -0
- data/lib/cql/protocol/requests/batch_request.rb +59 -0
- data/lib/cql/protocol/requests/credentials_request.rb +1 -1
- data/lib/cql/protocol/requests/execute_request.rb +45 -17
- data/lib/cql/protocol/requests/options_request.rb +1 -1
- data/lib/cql/protocol/requests/prepare_request.rb +1 -1
- data/lib/cql/protocol/requests/query_request.rb +97 -5
- data/lib/cql/protocol/requests/register_request.rb +1 -1
- data/lib/cql/protocol/requests/startup_request.rb +4 -4
- data/lib/cql/protocol/response.rb +2 -2
- data/lib/cql/protocol/responses/auth_challenge_response.rb +25 -0
- data/lib/cql/protocol/responses/auth_success_response.rb +25 -0
- data/lib/cql/protocol/responses/authenticate_response.rb +1 -1
- data/lib/cql/protocol/responses/detailed_error_response.rb +1 -1
- data/lib/cql/protocol/responses/error_response.rb +3 -2
- data/lib/cql/protocol/responses/event_response.rb +3 -2
- data/lib/cql/protocol/responses/prepared_result_response.rb +10 -6
- data/lib/cql/protocol/responses/raw_rows_result_response.rb +27 -0
- data/lib/cql/protocol/responses/ready_response.rb +1 -1
- data/lib/cql/protocol/responses/result_response.rb +2 -2
- data/lib/cql/protocol/responses/rows_result_response.rb +43 -23
- data/lib/cql/protocol/responses/schema_change_event_response.rb +1 -1
- data/lib/cql/protocol/responses/schema_change_result_response.rb +1 -1
- data/lib/cql/protocol/responses/set_keyspace_result_response.rb +1 -1
- data/lib/cql/protocol/responses/status_change_event_response.rb +1 -1
- data/lib/cql/protocol/responses/supported_response.rb +1 -1
- data/lib/cql/protocol/responses/void_result_response.rb +1 -1
- data/lib/cql/protocol/type_converter.rb +2 -2
- data/lib/cql/uuid.rb +2 -2
- data/lib/cql/version.rb +1 -1
- data/spec/cql/client/asynchronous_client_spec.rb +493 -50
- data/spec/cql/client/asynchronous_prepared_statement_spec.rb +193 -11
- data/spec/cql/client/authenticators_spec.rb +56 -0
- data/spec/cql/client/batch_spec.rb +277 -0
- data/spec/cql/client/connector_spec.rb +606 -0
- data/spec/cql/client/execute_options_decoder_spec.rb +95 -0
- data/spec/cql/client/keyspace_changer_spec.rb +8 -8
- data/spec/cql/client/peer_discovery_spec.rb +92 -0
- data/spec/cql/client/query_result_spec.rb +352 -0
- data/spec/cql/client/request_runner_spec.rb +31 -5
- data/spec/cql/client/synchronous_client_spec.rb +44 -1
- data/spec/cql/client/synchronous_prepared_statement_spec.rb +63 -1
- data/spec/cql/future_spec.rb +50 -2
- data/spec/cql/protocol/cql_protocol_handler_spec.rb +16 -5
- data/spec/cql/protocol/decoding_spec.rb +16 -6
- data/spec/cql/protocol/encoding_spec.rb +3 -1
- data/spec/cql/protocol/frame_encoder_spec.rb +99 -50
- data/spec/cql/protocol/requests/auth_response_request_spec.rb +62 -0
- data/spec/cql/protocol/requests/batch_request_spec.rb +155 -0
- data/spec/cql/protocol/requests/credentials_request_spec.rb +1 -1
- data/spec/cql/protocol/requests/execute_request_spec.rb +184 -71
- data/spec/cql/protocol/requests/options_request_spec.rb +1 -1
- data/spec/cql/protocol/requests/prepare_request_spec.rb +1 -1
- data/spec/cql/protocol/requests/query_request_spec.rb +255 -32
- data/spec/cql/protocol/requests/register_request_spec.rb +1 -1
- data/spec/cql/protocol/requests/startup_request_spec.rb +12 -6
- data/spec/cql/protocol/responses/auth_challenge_response_spec.rb +31 -0
- data/spec/cql/protocol/responses/auth_success_response_spec.rb +31 -0
- data/spec/cql/protocol/responses/authenticate_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/detailed_error_response_spec.rb +14 -7
- data/spec/cql/protocol/responses/error_response_spec.rb +4 -2
- data/spec/cql/protocol/responses/event_response_spec.rb +7 -4
- data/spec/cql/protocol/responses/prepared_result_response_spec.rb +89 -34
- data/spec/cql/protocol/responses/raw_rows_result_response_spec.rb +66 -0
- data/spec/cql/protocol/responses/ready_response_spec.rb +1 -1
- data/spec/cql/protocol/responses/result_response_spec.rb +19 -7
- data/spec/cql/protocol/responses/rows_result_response_spec.rb +56 -11
- data/spec/cql/protocol/responses/schema_change_event_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/schema_change_result_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/set_keyspace_result_response_spec.rb +1 -1
- data/spec/cql/protocol/responses/status_change_event_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/supported_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/topology_change_event_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/void_result_response_spec.rb +1 -1
- data/spec/cql/protocol/type_converter_spec.rb +21 -4
- data/spec/cql/uuid_spec.rb +10 -3
- data/spec/integration/client_spec.rb +251 -28
- data/spec/integration/protocol_spec.rb +213 -62
- data/spec/integration/regression_spec.rb +4 -1
- data/spec/integration/uuid_spec.rb +4 -1
- data/spec/support/fake_io_reactor.rb +5 -5
- metadata +36 -7
- data/lib/cql/client/connection_helper.rb +0 -181
- data/spec/cql/client/connection_helper_spec.rb +0 -429
@@ -14,7 +14,7 @@ module Cql
|
|
14
14
|
|
15
15
|
describe '#write' do
|
16
16
|
it 'encodes a PREPARE request frame' do
|
17
|
-
bytes = PrepareRequest.new('UPDATE users SET email = ? WHERE user_name = ?').write('')
|
17
|
+
bytes = PrepareRequest.new('UPDATE users SET email = ? WHERE user_name = ?').write(1, '')
|
18
18
|
bytes.should == "\x00\x00\x00\x2eUPDATE users SET email = ? WHERE user_name = ?"
|
19
19
|
end
|
20
20
|
end
|
@@ -8,93 +8,316 @@ module Cql
|
|
8
8
|
describe QueryRequest do
|
9
9
|
describe '#initialize' do
|
10
10
|
it 'raises an error when the CQL is nil' do
|
11
|
-
expect { QueryRequest.new(nil, :one) }.to raise_error(ArgumentError)
|
11
|
+
expect { QueryRequest.new(nil, [], [], :one, nil, nil, nil, false) }.to raise_error(ArgumentError)
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'raises an error when the consistency is nil' do
|
15
|
-
expect { QueryRequest.new('USE system', nil) }.to raise_error(ArgumentError)
|
15
|
+
expect { QueryRequest.new('USE system', [], [], nil, nil, nil, nil, false) }.to raise_error(ArgumentError)
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'raises an error when the consistency is invalid' do
|
19
|
-
expect { QueryRequest.new('USE system', :hello) }.to raise_error(ArgumentError)
|
19
|
+
expect { QueryRequest.new('USE system', [], [], :hello, nil, nil, nil, false) }.to raise_error(ArgumentError)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'raises an error when the serial consistency is invalid' do
|
23
|
+
expect { QueryRequest.new('USE system', [], [], :quorum, :fantastic_serial, nil, nil, false) }.to raise_error(ArgumentError)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'raises an error when there are not the same number of type hints as bound values' do
|
27
|
+
expect { QueryRequest.new('SELECT * FROM foo WHERE a = ? AND b = ?', ['x', 'y'], [:string], :quorum, nil, nil, nil, false) }.to raise_error(ArgumentError)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'raises an error when a paging state is given but no page size' do
|
31
|
+
expect { QueryRequest.new('USE system', [], [], :quorum, nil, nil, 'foo', false) }.to raise_error(ArgumentError)
|
20
32
|
end
|
21
33
|
end
|
22
34
|
|
23
35
|
describe '#write' do
|
24
|
-
|
25
|
-
|
26
|
-
|
36
|
+
context 'when the protocol version is 1' do
|
37
|
+
let :frame_bytes do
|
38
|
+
QueryRequest.new('USE system', [], [], :all, nil, nil, nil, false).write(1, '')
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'encodes the CQL' do
|
42
|
+
frame_bytes.to_s[0, 14].should == "\x00\x00\x00\x0aUSE system"
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'encodes the consistency' do
|
46
|
+
frame_bytes.to_s[14, 999].should == "\x00\x05"
|
47
|
+
end
|
27
48
|
end
|
28
49
|
|
29
|
-
|
30
|
-
|
31
|
-
|
50
|
+
context 'when the protocol version is 2' do
|
51
|
+
context 'and there are no bound values' do
|
52
|
+
let :frame_bytes do
|
53
|
+
QueryRequest.new('USE system', [], [], :all, nil, nil, nil, false).write(2, '')
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'encodes the CQL' do
|
57
|
+
frame_bytes.to_s[0, 14].should == "\x00\x00\x00\x0aUSE system"
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'encodes the consistency' do
|
61
|
+
frame_bytes.to_s[14, 2].should == "\x00\x05"
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'encodes an empty flag field' do
|
65
|
+
frame_bytes.to_s[16, 999].should == "\x00"
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'accepts that the bound values list is nil' do
|
69
|
+
frame_bytes = QueryRequest.new('USE system', nil, [], :all, nil, nil, nil, false).write(2, '')
|
70
|
+
frame_bytes.to_s[16, 999].should == "\x00"
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'accepts that the type hints list is nil' do
|
74
|
+
expect { QueryRequest.new('SELECT * FROM foo WHERE a = ? AND b = ?', ['x', 'y'], nil, :all, nil, nil, nil, false).write(2, '') }.to_not raise_error
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'and there are bound values' do
|
79
|
+
let :cql do
|
80
|
+
'SELECT * FROM something WHERE id = ?'
|
81
|
+
end
|
82
|
+
|
83
|
+
let :frame_bytes do
|
84
|
+
QueryRequest.new(cql, ['foobar'], nil, :all, nil, nil, nil, false).write(2, '')
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'encodes the CQL' do
|
88
|
+
frame_bytes.to_s[0, 40].should == "\x00\x00\x00\x24SELECT * FROM something WHERE id = ?"
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'encodes the consistency' do
|
92
|
+
frame_bytes.to_s[40, 2].should == "\x00\x05"
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'encodes a flags field with the values flag set' do
|
96
|
+
frame_bytes.to_s[42, 1].should == "\x01"
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'encodes the number of bound values' do
|
100
|
+
frame_bytes.to_s[43, 2].should == "\x00\x01"
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'encodes the bound values' do
|
104
|
+
frame_bytes.to_s[45, 999].should == "\x00\x00\x00\x06foobar"
|
105
|
+
end
|
106
|
+
|
107
|
+
[
|
108
|
+
['foobar', 'VARCHAR', "\x00\x00\x00\x06foobar"],
|
109
|
+
[765438000, 'BIGINT', "\x00\x00\x00\x08\x00\x00\x00\x00\x2d\x9f\xa8\x30"],
|
110
|
+
[Math::PI, 'DOUBLE', "\x00\x00\x00\x08\x40\x09\x21\xfb\x54\x44\x2d\x18"],
|
111
|
+
[67890656781923123918798273492834712837198237, 'VARINT', "\x00\x00\x00\x13\x03\x0b\x58\xb5\x74\x0a\xce\x65\x95\xb4\x03\x26\x7b\x6b\x6a\x6e\x08\x91\x9d"],
|
112
|
+
[BigDecimal.new('1313123123.234234234234234234123'), 'DECIMAL', "\x00\x00\x00\x11\x00\x00\x00\x15\x10\x92\xed\xfd\x4b\x93\x4b\xd7\xa2\xc1\x0c\x65\x0b"],
|
113
|
+
[true, 'BOOLEAN', "\x00\x00\x00\x01\x01"],
|
114
|
+
[nil, 'null', "\xff\xff\xff\xff"],
|
115
|
+
[Uuid.new('00b69180-d0e1-11e2-8b8b-0800200c9a66'), 'UUID', "\x00\x00\x00\x10\x00\xb6\x91\x80\xd0\xe1\x11\xe2\x8b\x8b\x08\x00\x20\x0c\x9a\x66"],
|
116
|
+
[IPAddr.new('200.199.198.197'), 'INET', "\x00\x00\x00\x04\xc8\xc7\xc6\xc5"],
|
117
|
+
[IPAddr.new('2001:0db8:85a3:0000:0000:8a2e:0370:7334'), 'INET', "\x00\x00\x00\x10\x20\x01\x0d\xb8\x85\xa3\x00\x00\x00\x00\x8a\x2e\x03\x70\x73\x34"],
|
118
|
+
[Time.utc(2013, 12, 11, 10, 9, 8), 'TIMESTAMP', "\x00\x00\x00\x08\x00\x00\x01\x42\xe1\x21\xa5\xa0"],
|
119
|
+
[{'foo' => true}, 'MAP<STRING,BOOLEAN>', "\x00\x00\x00\x0a\x00\x01\x00\x03foo\x00\x01\x01"],
|
120
|
+
[[1, 2], 'LIST<BIGINT>', "\x00\x00\x00\x16\x00\x02\x00\x08\x00\x00\x00\x00\x00\x00\x00\x01\x00\x08\x00\x00\x00\x00\x00\x00\x00\x02"],
|
121
|
+
[[Math::PI, Math::PI/2].to_set, 'SET<DOUBLE>', "\x00\x00\x00\x16\x00\x02\x00\x08\x40\x09\x21\xfb\x54\x44\x2d\x18\x00\x08\x3f\xf9\x21\xfb\x54\x44\x2d\x18"],
|
122
|
+
].each do |value, cql_type, expected_bytes|
|
123
|
+
it "encodes bound #{value.class}s as #{cql_type}" do
|
124
|
+
frame_bytes = QueryRequest.new(cql, [value], nil, :all, nil, nil, nil, false).write(2, '')
|
125
|
+
frame_bytes.to_s[45, 999].should == expected_bytes
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'complains if it cannot guess the type to encode a value as' do
|
130
|
+
expect { QueryRequest.new(cql, [self], nil, :all, nil, nil, nil, false).write(2, '') }.to raise_error(EncodingError)
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'uses the type hints to encode values' do
|
134
|
+
frame_bytes = QueryRequest.new(cql, [4, 3.14], [:int, :float], :all, nil, nil, nil, false).write(2, '')
|
135
|
+
frame_bytes.to_s[45, 8].should == "\x00\x00\x00\x04\x00\x00\x00\x04"
|
136
|
+
frame_bytes.to_s[45 + 8, 8].should == "\x00\x00\x00\x04\x40\x48\xf5\xc3"
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'accepts that some hints are nil and defaults to guessing' do
|
140
|
+
frame_bytes = QueryRequest.new(cql, [4, 4], [:int, nil], :all, nil, nil, nil, false).write(2, '')
|
141
|
+
frame_bytes.to_s[45, 8].should == "\x00\x00\x00\x04\x00\x00\x00\x04"
|
142
|
+
frame_bytes.to_s[45 + 8, 12].should == "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x04"
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
context 'and the serial consistency is LOCAL_SERIAL' do
|
147
|
+
it 'sets the serial flag' do
|
148
|
+
frame_bytes = QueryRequest.new('UPDATE x SET y = 3 WHERE z = 4 IF w = 6', nil, nil, :two, :local_serial, nil, nil, false).write(2, '')
|
149
|
+
frame_bytes.to_s[43, 2].should == "\x00\x02"
|
150
|
+
frame_bytes.to_s[45, 1].should == "\x10"
|
151
|
+
frame_bytes.to_s[46, 2].should == "\x00\x09"
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context 'and page size and/or page state is set' do
|
156
|
+
it 'sets the page size flag and includes the page size' do
|
157
|
+
frame_bytes = QueryRequest.new('SELECT * FROM users', nil, nil, :one, nil, 10, nil, false).write(2, '')
|
158
|
+
frame_bytes.to_s[25, 1].should == "\x04"
|
159
|
+
frame_bytes.to_s[26, 4].should == "\x00\x00\x00\x0a"
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'sets both the page size and paging state flags and includes both the page size and the paging state' do
|
163
|
+
frame_bytes = QueryRequest.new('SELECT * FROM users', nil, nil, :one, nil, 10, 'foo', false).write(2, '')
|
164
|
+
frame_bytes.to_s[25, 1].should == "\x0c"
|
165
|
+
frame_bytes.to_s[26, 4].should == "\x00\x00\x00\x0a"
|
166
|
+
frame_bytes.to_s[30, 7].should == "\x00\x00\x00\x03foo"
|
167
|
+
end
|
168
|
+
end
|
32
169
|
end
|
33
170
|
|
34
|
-
|
35
|
-
|
36
|
-
|
171
|
+
context 'with multibyte characters' do
|
172
|
+
it 'correctly encodes the frame' do
|
173
|
+
bytes = QueryRequest.new("INSERT INTO users (user_id, first, last, age) VALUES ('test', 'ümlaut', 'test', 1)", nil, nil, :all, nil, nil, nil, false).write(1, '')
|
174
|
+
bytes.should eql_bytes("\x00\x00\x00SINSERT INTO users (user_id, first, last, age) VALUES ('test', '\xC3\xBCmlaut', 'test', 1)\x00\x05")
|
175
|
+
end
|
37
176
|
end
|
38
177
|
end
|
39
178
|
|
40
179
|
describe '#to_s' do
|
41
180
|
it 'returns a pretty string' do
|
42
|
-
request = QueryRequest.new('SELECT * FROM system.peers', :local_quorum)
|
181
|
+
request = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :local_quorum, nil, nil, nil, false)
|
43
182
|
request.to_s.should == 'QUERY "SELECT * FROM system.peers" LOCAL_QUORUM'
|
44
183
|
end
|
45
184
|
end
|
46
185
|
|
47
186
|
describe '#eql?' do
|
48
187
|
it 'returns true when the CQL and consistency are the same' do
|
49
|
-
q1 = QueryRequest.new('SELECT * FROM system.peers', :two)
|
50
|
-
q2 = QueryRequest.new('SELECT * FROM system.peers', :two)
|
188
|
+
q1 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, nil, nil, false)
|
189
|
+
q2 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, nil, nil, false)
|
51
190
|
q2.should eql(q2)
|
52
191
|
end
|
53
192
|
|
193
|
+
it 'returns false when the CQL is different' do
|
194
|
+
q1 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, nil, nil, false)
|
195
|
+
q2 = QueryRequest.new('SELECT * FROM peers', nil, nil, :two, nil, nil, nil, false)
|
196
|
+
q1.should_not eql(q2)
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'returns false when the values are different' do
|
200
|
+
q1 = QueryRequest.new('SELECT * FROM peers WHERE data_center = ?', ['dc1'], nil, :two, nil, nil, nil, false)
|
201
|
+
q2 = QueryRequest.new('SELECT * FROM peers WHERE data_center = ?', ['dc2'], nil, :two, nil, nil, nil, false)
|
202
|
+
q1.should_not eql(q2)
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'returns false when the type hints are different' do
|
206
|
+
q1 = QueryRequest.new('SELECT * FROM peers WHERE data_center = ?', ['dc1'], [:text], :two, nil, nil, nil, false)
|
207
|
+
q2 = QueryRequest.new('SELECT * FROM peers WHERE data_center = ?', ['dc1'], [:varchar], :two, nil, nil, nil, false)
|
208
|
+
q1.should_not eql(q2)
|
209
|
+
end
|
210
|
+
|
54
211
|
it 'returns false when the consistency is different' do
|
55
|
-
q1 = QueryRequest.new('SELECT * FROM system.peers', :two)
|
56
|
-
q2 = QueryRequest.new('SELECT * FROM system.peers', :three)
|
212
|
+
q1 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, nil, nil, false)
|
213
|
+
q2 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :three, nil, nil, nil, false)
|
57
214
|
q1.should_not eql(q2)
|
58
215
|
end
|
59
216
|
|
60
|
-
it 'returns false when the
|
61
|
-
q1 = QueryRequest.new('SELECT * FROM
|
62
|
-
q2 = QueryRequest.new('SELECT * FROM peers', :two)
|
217
|
+
it 'returns false when the serial consistency is different' do
|
218
|
+
q1 = QueryRequest.new('SELECT * FROM peers', nil, nil, :two, :local_serial, nil, nil, false)
|
219
|
+
q2 = QueryRequest.new('SELECT * FROM peers', nil, nil, :two, :serial, nil, nil, false)
|
220
|
+
q1.should_not eql(q2)
|
221
|
+
end
|
222
|
+
|
223
|
+
it 'returns false when the page size is different' do
|
224
|
+
q1 = QueryRequest.new('SELECT * FROM peers', nil, nil, :two, nil, 10, nil, false)
|
225
|
+
q2 = QueryRequest.new('SELECT * FROM peers', nil, nil, :two, nil, 20, nil, false)
|
226
|
+
q1.should_not eql(q2)
|
227
|
+
end
|
228
|
+
|
229
|
+
it 'returns false when the paging state is different' do
|
230
|
+
q1 = QueryRequest.new('SELECT * FROM peers', nil, nil, :two, nil, 10, 'foo', false)
|
231
|
+
q2 = QueryRequest.new('SELECT * FROM peers', nil, nil, :two, nil, 10, 'bar', false)
|
63
232
|
q1.should_not eql(q2)
|
64
233
|
end
|
65
234
|
|
66
235
|
it 'does not know about CQL syntax' do
|
67
|
-
q1 = QueryRequest.new('SELECT * FROM system.peers', :two)
|
68
|
-
q2 = QueryRequest.new('SELECT * FROM system.peers', :two)
|
236
|
+
q1 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, nil, nil, false)
|
237
|
+
q2 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, nil, nil, false)
|
69
238
|
q1.should_not eql(q2)
|
70
239
|
end
|
71
240
|
|
241
|
+
it 'does not make a difference between an empty values array and nil' do
|
242
|
+
q1 = QueryRequest.new('SELECT * FROM peers', [], nil, :two, nil, nil, nil, false)
|
243
|
+
q2 = QueryRequest.new('SELECT * FROM peers', nil, nil, :two, nil, nil, nil, false)
|
244
|
+
q1.should eql(q2)
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'does not make a difference between an empty type hints array and nil' do
|
248
|
+
q1 = QueryRequest.new('SELECT * FROM peers', nil, [], :two, nil, nil, nil, false)
|
249
|
+
q2 = QueryRequest.new('SELECT * FROM peers', nil, nil, :two, nil, nil, nil, false)
|
250
|
+
q1.should eql(q2)
|
251
|
+
end
|
252
|
+
|
72
253
|
it 'is aliased as ==' do
|
73
|
-
q1 = QueryRequest.new('SELECT * FROM system.peers', :two)
|
74
|
-
q2 = QueryRequest.new('SELECT * FROM system.peers', :two)
|
254
|
+
q1 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, nil, nil, false)
|
255
|
+
q2 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, nil, nil, false)
|
75
256
|
q1.should == q2
|
76
257
|
end
|
77
258
|
end
|
78
259
|
|
79
260
|
describe '#hash' do
|
80
261
|
it 'has the same hash code as another identical object' do
|
81
|
-
q1 = QueryRequest.new('SELECT * FROM system.peers', :two)
|
82
|
-
q2 = QueryRequest.new('SELECT * FROM system.peers', :two)
|
262
|
+
q1 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, nil, nil, false)
|
263
|
+
q2 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, nil, nil, false)
|
83
264
|
q1.hash.should == q2.hash
|
84
265
|
end
|
85
266
|
|
267
|
+
it 'does not have the same hash code when the CQL is different' do
|
268
|
+
q1 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, nil, nil, false)
|
269
|
+
q2 = QueryRequest.new('SELECT * FROM peers', nil, nil, :two, nil, nil, nil, false)
|
270
|
+
q1.hash.should_not == q2.hash
|
271
|
+
end
|
272
|
+
|
273
|
+
it 'does not have the same hash code when the values are different' do
|
274
|
+
q1 = QueryRequest.new('SELECT * FROM peers WHERE data_center = ?', ['dc1'], nil, :two, nil, nil, nil, false)
|
275
|
+
q2 = QueryRequest.new('SELECT * FROM peers WHERE data_center = ?', ['dc2'], nil, :two, nil, nil, nil, false)
|
276
|
+
q1.hash.should_not == q2.hash
|
277
|
+
end
|
278
|
+
|
279
|
+
it 'does not have the same hash code when the type hints are different' do
|
280
|
+
q1 = QueryRequest.new('SELECT * FROM peers WHERE data_center = ?', ['dc1'], [:text], :two, nil, nil, nil, false)
|
281
|
+
q2 = QueryRequest.new('SELECT * FROM peers WHERE data_center = ?', ['dc1'], [:varchar], :two, nil, nil, nil, false)
|
282
|
+
q1.hash.should_not == q2.hash
|
283
|
+
end
|
284
|
+
|
86
285
|
it 'does not have the same hash code when the consistency is different' do
|
87
|
-
q1 = QueryRequest.new('SELECT * FROM system.peers', :two)
|
88
|
-
q2 = QueryRequest.new('SELECT * FROM system.peers', :three)
|
286
|
+
q1 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, nil, nil, false)
|
287
|
+
q2 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :three, nil, nil, nil, false)
|
89
288
|
q1.hash.should_not == q2.hash
|
90
289
|
end
|
91
290
|
|
92
|
-
it 'does not have the same hash code when the
|
93
|
-
q1 = QueryRequest.new('SELECT * FROM system.peers', :two)
|
94
|
-
q2 = QueryRequest.new('SELECT * FROM peers', :two)
|
291
|
+
it 'does not have the same hash code when the serial consistency is different' do
|
292
|
+
q1 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, :local_serial, nil, nil, false)
|
293
|
+
q2 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, :serial, nil, nil, false)
|
95
294
|
q1.hash.should_not == q2.hash
|
96
295
|
end
|
296
|
+
|
297
|
+
it 'does not have the same hash code when the page size is different' do
|
298
|
+
q1 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, 10, nil, false)
|
299
|
+
q2 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, 20, nil, false)
|
300
|
+
q1.hash.should_not == q2.hash
|
301
|
+
end
|
302
|
+
|
303
|
+
it 'does not have the same hash code when the paging state is different' do
|
304
|
+
q1 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, 10, 'foo', false)
|
305
|
+
q2 = QueryRequest.new('SELECT * FROM system.peers', nil, nil, :two, nil, 10, 'bar', false)
|
306
|
+
q1.hash.should_not == q2.hash
|
307
|
+
end
|
308
|
+
|
309
|
+
it 'does not make a difference between an empty values array and nil' do
|
310
|
+
q1 = QueryRequest.new('SELECT * FROM peers', [], nil, :two, nil, nil, nil, false)
|
311
|
+
q2 = QueryRequest.new('SELECT * FROM peers', nil, nil, :two, nil, nil, nil, false)
|
312
|
+
q1.hash.should == q2.hash
|
313
|
+
end
|
314
|
+
|
315
|
+
it 'does not make a difference between an empty type hints array and nil' do
|
316
|
+
q1 = QueryRequest.new('SELECT * FROM peers', nil, [], :two, nil, nil, nil, false)
|
317
|
+
q2 = QueryRequest.new('SELECT * FROM peers', nil, nil, :two, nil, nil, nil, false)
|
318
|
+
q1.hash.should == q2.hash
|
319
|
+
end
|
97
320
|
end
|
98
321
|
end
|
99
322
|
end
|
100
|
-
end
|
323
|
+
end
|
@@ -8,7 +8,7 @@ module Cql
|
|
8
8
|
describe RegisterRequest do
|
9
9
|
describe '#write' do
|
10
10
|
it 'encodes a REGISTER request frame' do
|
11
|
-
bytes = RegisterRequest.new('TOPOLOGY_CHANGE', 'STATUS_CHANGE').write('')
|
11
|
+
bytes = RegisterRequest.new('TOPOLOGY_CHANGE', 'STATUS_CHANGE').write(1, '')
|
12
12
|
bytes.should == "\x00\x02\x00\x0fTOPOLOGY_CHANGE\x00\x0dSTATUS_CHANGE"
|
13
13
|
end
|
14
14
|
end
|
@@ -6,27 +6,33 @@ require 'spec_helper'
|
|
6
6
|
module Cql
|
7
7
|
module Protocol
|
8
8
|
describe StartupRequest do
|
9
|
+
describe '#initialize' do
|
10
|
+
it 'raises an error if the CQL version is not specified' do
|
11
|
+
expect { described_class.new(nil) }.to raise_error(ArgumentError)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
9
15
|
describe '#compressable?' do
|
10
16
|
it 'is not compressable' do
|
11
|
-
described_class.new.should_not be_compressable
|
17
|
+
described_class.new('3.1.1').should_not be_compressable
|
12
18
|
end
|
13
19
|
end
|
14
20
|
|
15
21
|
describe '#write' do
|
16
22
|
it 'encodes a STARTUP request frame' do
|
17
|
-
bytes = StartupRequest.new('3.0.0', 'snappy').write('')
|
23
|
+
bytes = StartupRequest.new('3.0.0', 'snappy').write(1, '')
|
18
24
|
bytes.should == "\x00\x02\x00\x0bCQL_VERSION\x00\x053.0.0\x00\x0bCOMPRESSION\x00\x06snappy"
|
19
25
|
end
|
20
26
|
|
21
|
-
it 'defaults to
|
22
|
-
bytes = StartupRequest.new.write('')
|
23
|
-
bytes.should == "\x00\x01\x00\x0bCQL_VERSION\x00\x053.
|
27
|
+
it 'defaults to no compression' do
|
28
|
+
bytes = StartupRequest.new('3.1.1').write(1, '')
|
29
|
+
bytes.should == "\x00\x01\x00\x0bCQL_VERSION\x00\x053.1.1"
|
24
30
|
end
|
25
31
|
end
|
26
32
|
|
27
33
|
describe '#to_s' do
|
28
34
|
it 'returns a pretty string' do
|
29
|
-
request = StartupRequest.new
|
35
|
+
request = StartupRequest.new('3.0.0')
|
30
36
|
request.to_s.should == 'STARTUP {"CQL_VERSION"=>"3.0.0"}'
|
31
37
|
end
|
32
38
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: ascii-8bit
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
|
6
|
+
module Cql
|
7
|
+
module Protocol
|
8
|
+
describe AuthChallengeResponse do
|
9
|
+
describe '.decode!' do
|
10
|
+
it 'decodes the token' do
|
11
|
+
buffer = ByteBuffer.new("\x00\x00\x00\x0cbingbongpong")
|
12
|
+
response = described_class.decode!(1, buffer, buffer.length)
|
13
|
+
response.token.should == 'bingbongpong'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'decodes a nil token' do
|
17
|
+
buffer = ByteBuffer.new("\xff\xff\xff\xff")
|
18
|
+
response = described_class.decode!(1, buffer, buffer.length)
|
19
|
+
response.token.should be_nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#to_s' do
|
24
|
+
it 'returns a string with number of bytes in the token' do
|
25
|
+
response = described_class.new('bingbongpong')
|
26
|
+
response.to_s.should == 'AUTH_CHALLENGE 12'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|