cql-rb 2.0.0.pre0 → 2.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +14 -2
- data/lib/cql.rb +8 -3
- data/lib/cql/client.rb +21 -356
- data/lib/cql/client/authenticators.rb +70 -0
- data/lib/cql/client/batch.rb +54 -0
- data/lib/cql/client/{asynchronous_client.rb → client.rb} +241 -6
- data/lib/cql/client/connector.rb +3 -2
- data/lib/cql/client/{asynchronous_prepared_statement.rb → prepared_statement.rb} +103 -0
- data/lib/cql/protocol.rb +1 -2
- data/lib/cql/protocol/cql_byte_buffer.rb +285 -0
- data/lib/cql/protocol/cql_protocol_handler.rb +3 -3
- data/lib/cql/protocol/frame_decoder.rb +3 -3
- data/lib/cql/protocol/frame_encoder.rb +2 -2
- data/lib/cql/protocol/request.rb +0 -2
- data/lib/cql/protocol/requests/auth_response_request.rb +2 -2
- data/lib/cql/protocol/requests/batch_request.rb +10 -10
- data/lib/cql/protocol/requests/credentials_request.rb +2 -2
- data/lib/cql/protocol/requests/execute_request.rb +13 -13
- data/lib/cql/protocol/requests/options_request.rb +2 -2
- data/lib/cql/protocol/requests/prepare_request.rb +2 -2
- data/lib/cql/protocol/requests/query_request.rb +13 -13
- data/lib/cql/protocol/requests/register_request.rb +2 -2
- data/lib/cql/protocol/requests/startup_request.rb +2 -2
- data/lib/cql/protocol/response.rb +2 -4
- data/lib/cql/protocol/responses/auth_challenge_response.rb +2 -2
- data/lib/cql/protocol/responses/auth_success_response.rb +2 -2
- data/lib/cql/protocol/responses/authenticate_response.rb +2 -2
- data/lib/cql/protocol/responses/detailed_error_response.rb +15 -15
- data/lib/cql/protocol/responses/error_response.rb +4 -4
- data/lib/cql/protocol/responses/event_response.rb +3 -3
- data/lib/cql/protocol/responses/prepared_result_response.rb +4 -4
- data/lib/cql/protocol/responses/raw_rows_result_response.rb +1 -1
- data/lib/cql/protocol/responses/ready_response.rb +1 -1
- data/lib/cql/protocol/responses/result_response.rb +3 -3
- data/lib/cql/protocol/responses/rows_result_response.rb +22 -22
- data/lib/cql/protocol/responses/schema_change_event_response.rb +2 -2
- data/lib/cql/protocol/responses/schema_change_result_response.rb +2 -2
- data/lib/cql/protocol/responses/set_keyspace_result_response.rb +2 -2
- data/lib/cql/protocol/responses/status_change_event_response.rb +2 -2
- data/lib/cql/protocol/responses/supported_response.rb +2 -2
- data/lib/cql/protocol/responses/void_result_response.rb +1 -1
- data/lib/cql/protocol/type_converter.rb +78 -81
- data/lib/cql/time_uuid.rb +6 -0
- data/lib/cql/uuid.rb +2 -1
- data/lib/cql/version.rb +1 -1
- data/spec/cql/client/batch_spec.rb +8 -8
- data/spec/cql/client/{asynchronous_client_spec.rb → client_spec.rb} +162 -0
- data/spec/cql/client/connector_spec.rb +13 -3
- data/spec/cql/client/{asynchronous_prepared_statement_spec.rb → prepared_statement_spec.rb} +148 -1
- data/spec/cql/client/request_runner_spec.rb +2 -2
- data/spec/cql/protocol/cql_byte_buffer_spec.rb +895 -0
- data/spec/cql/protocol/cql_protocol_handler_spec.rb +1 -1
- data/spec/cql/protocol/frame_decoder_spec.rb +14 -14
- data/spec/cql/protocol/frame_encoder_spec.rb +7 -7
- data/spec/cql/protocol/requests/auth_response_request_spec.rb +4 -4
- data/spec/cql/protocol/requests/batch_request_spec.rb +21 -21
- data/spec/cql/protocol/requests/credentials_request_spec.rb +2 -2
- data/spec/cql/protocol/requests/execute_request_spec.rb +13 -13
- data/spec/cql/protocol/requests/options_request_spec.rb +1 -1
- data/spec/cql/protocol/requests/prepare_request_spec.rb +2 -2
- data/spec/cql/protocol/requests/query_request_spec.rb +13 -13
- data/spec/cql/protocol/requests/register_request_spec.rb +2 -2
- data/spec/cql/protocol/requests/startup_request_spec.rb +4 -4
- data/spec/cql/protocol/responses/auth_challenge_response_spec.rb +5 -5
- data/spec/cql/protocol/responses/auth_success_response_spec.rb +5 -5
- data/spec/cql/protocol/responses/authenticate_response_spec.rb +3 -3
- data/spec/cql/protocol/responses/detailed_error_response_spec.rb +15 -15
- data/spec/cql/protocol/responses/error_response_spec.rb +5 -5
- data/spec/cql/protocol/responses/event_response_spec.rb +8 -8
- data/spec/cql/protocol/responses/prepared_result_response_spec.rb +7 -7
- data/spec/cql/protocol/responses/raw_rows_result_response_spec.rb +1 -1
- data/spec/cql/protocol/responses/ready_response_spec.rb +2 -2
- data/spec/cql/protocol/responses/result_response_spec.rb +16 -16
- data/spec/cql/protocol/responses/rows_result_response_spec.rb +21 -21
- data/spec/cql/protocol/responses/schema_change_event_response_spec.rb +3 -3
- data/spec/cql/protocol/responses/schema_change_result_response_spec.rb +3 -3
- data/spec/cql/protocol/responses/set_keyspace_result_response_spec.rb +2 -2
- data/spec/cql/protocol/responses/status_change_event_response_spec.rb +3 -3
- data/spec/cql/protocol/responses/supported_response_spec.rb +3 -3
- data/spec/cql/protocol/responses/topology_change_event_response_spec.rb +3 -3
- data/spec/cql/protocol/responses/void_result_response_spec.rb +2 -2
- data/spec/cql/protocol/type_converter_spec.rb +25 -13
- data/spec/cql/time_uuid_spec.rb +17 -4
- data/spec/cql/uuid_spec.rb +5 -1
- data/spec/integration/protocol_spec.rb +48 -42
- data/spec/spec_helper.rb +0 -1
- metadata +27 -39
- data/lib/cql/byte_buffer.rb +0 -177
- data/lib/cql/client/synchronous_client.rb +0 -79
- data/lib/cql/client/synchronous_prepared_statement.rb +0 -63
- data/lib/cql/future.rb +0 -515
- data/lib/cql/io.rb +0 -15
- data/lib/cql/io/connection.rb +0 -220
- data/lib/cql/io/io_reactor.rb +0 -349
- data/lib/cql/protocol/decoding.rb +0 -187
- data/lib/cql/protocol/encoding.rb +0 -114
- data/spec/cql/byte_buffer_spec.rb +0 -337
- data/spec/cql/client/synchronous_client_spec.rb +0 -170
- data/spec/cql/client/synchronous_prepared_statement_spec.rb +0 -155
- data/spec/cql/future_spec.rb +0 -737
- data/spec/cql/io/connection_spec.rb +0 -484
- data/spec/cql/io/io_reactor_spec.rb +0 -402
- data/spec/cql/protocol/decoding_spec.rb +0 -547
- data/spec/cql/protocol/encoding_spec.rb +0 -386
- data/spec/integration/io_spec.rb +0 -283
- data/spec/support/fake_server.rb +0 -106
@@ -1,402 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
|
6
|
-
module Cql
|
7
|
-
module Io
|
8
|
-
describe IoReactor do
|
9
|
-
let :reactor do
|
10
|
-
described_class.new(protocol_handler_factory, selector: selector, clock: clock)
|
11
|
-
end
|
12
|
-
|
13
|
-
let :protocol_handler_factory do
|
14
|
-
double(:protocol_handler_factory)
|
15
|
-
end
|
16
|
-
|
17
|
-
let! :selector do
|
18
|
-
IoReactorSpec::FakeSelector.new
|
19
|
-
end
|
20
|
-
|
21
|
-
let :clock do
|
22
|
-
double(:clock, now: 0)
|
23
|
-
end
|
24
|
-
|
25
|
-
describe '#start' do
|
26
|
-
after do
|
27
|
-
reactor.stop.value if reactor.running?
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'returns a future that is resolved when the reactor has started' do
|
31
|
-
reactor.start.value
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'returns a future that resolves to the reactor' do
|
35
|
-
reactor.start.value.should equal(reactor)
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'is running after being started' do
|
39
|
-
reactor.start.value
|
40
|
-
reactor.should be_running
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'cannot be started again once stopped' do
|
44
|
-
reactor.start.value
|
45
|
-
reactor.stop.value
|
46
|
-
expect { reactor.start }.to raise_error(ReactorError)
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'calls the selector' do
|
50
|
-
called = false
|
51
|
-
selector.handler { called = true; [[], [], []] }
|
52
|
-
reactor.start.value
|
53
|
-
await { called }
|
54
|
-
reactor.stop.value
|
55
|
-
called.should be_true, 'expected the selector to have been called'
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe '#stop' do
|
60
|
-
after do
|
61
|
-
reactor.stop.value if reactor.running?
|
62
|
-
end
|
63
|
-
|
64
|
-
it 'returns a future that is resolved when the reactor has stopped' do
|
65
|
-
reactor.start.value
|
66
|
-
reactor.stop.value
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'returns a future which resolves to the reactor' do
|
70
|
-
reactor.start.value
|
71
|
-
reactor.stop.value.should equal(reactor)
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'is not running after being stopped' do
|
75
|
-
reactor.start.value
|
76
|
-
reactor.stop.value
|
77
|
-
reactor.should_not be_running
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'closes all sockets' do
|
81
|
-
connection = nil
|
82
|
-
protocol_handler_factory.stub(:new) do |sh, _|
|
83
|
-
connection = sh
|
84
|
-
double(:protocol_handler)
|
85
|
-
end
|
86
|
-
reactor.start.value
|
87
|
-
reactor.connect('example.com', 9999, 5)
|
88
|
-
reactor.stop.value
|
89
|
-
connection.should be_closed
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'cancels all active timers' do
|
93
|
-
reactor.start.value
|
94
|
-
clock.stub(:now).and_return(1)
|
95
|
-
expired_timer = reactor.schedule_timer(1)
|
96
|
-
active_timer1 = reactor.schedule_timer(999)
|
97
|
-
active_timer2 = reactor.schedule_timer(111)
|
98
|
-
expired_timer.should_not_receive(:fail)
|
99
|
-
clock.stub(:now).and_return(2)
|
100
|
-
await { expired_timer.completed? }
|
101
|
-
reactor.stop.value
|
102
|
-
active_timer1.should be_failed
|
103
|
-
active_timer2.should be_failed
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
describe '#on_error' do
|
108
|
-
before do
|
109
|
-
selector.handler { raise 'Blurgh' }
|
110
|
-
end
|
111
|
-
|
112
|
-
it 'calls the listeners when the reactor crashes' do
|
113
|
-
error = nil
|
114
|
-
reactor.on_error { |e| error = e }
|
115
|
-
reactor.start
|
116
|
-
await { error }
|
117
|
-
error.message.should == 'Blurgh'
|
118
|
-
end
|
119
|
-
|
120
|
-
it 'calls the listener immediately when the reactor has already crashed' do
|
121
|
-
error = nil
|
122
|
-
reactor.start.value
|
123
|
-
await { !reactor.running? }
|
124
|
-
reactor.on_error { |e| error = e }
|
125
|
-
await { error }
|
126
|
-
end
|
127
|
-
|
128
|
-
it 'ignores errors raised by listeners' do
|
129
|
-
called = false
|
130
|
-
reactor.on_error { raise 'Blurgh' }
|
131
|
-
reactor.on_error { called = true }
|
132
|
-
reactor.start
|
133
|
-
await { called }
|
134
|
-
called.should be_true, 'expected all close listeners to have been called'
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
describe '#connect' do
|
139
|
-
let :protocol_handler do
|
140
|
-
double(:protocol_handler)
|
141
|
-
end
|
142
|
-
|
143
|
-
before do
|
144
|
-
protocol_handler_factory.stub(:call) do |connection, _|
|
145
|
-
connection.to_io.stub(:connect_nonblock)
|
146
|
-
protocol_handler.stub(:connection).and_return(connection)
|
147
|
-
protocol_handler
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
before do
|
152
|
-
selector.handler do |readables, writables, _, _|
|
153
|
-
writables.each do |writable|
|
154
|
-
fake_connected(writable)
|
155
|
-
end
|
156
|
-
[[], writables, []]
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
def fake_connected(connection)
|
161
|
-
connection.to_io.stub(:connect_nonblock)
|
162
|
-
end
|
163
|
-
|
164
|
-
after do
|
165
|
-
reactor.stop if reactor.running?
|
166
|
-
end
|
167
|
-
|
168
|
-
it 'calls #call on the protocol handler factory with the connection and the reactor itself' do
|
169
|
-
reactor.start.value
|
170
|
-
reactor.connect('example.com', 9999, 5).value
|
171
|
-
protocol_handler_factory.should have_received(:call).with(an_instance_of(Connection), reactor)
|
172
|
-
end
|
173
|
-
|
174
|
-
it 'calls #new on the protocol handler factory with the connection and the reactor itself' do
|
175
|
-
protocol_handler_factory.stub(:new)
|
176
|
-
reactor.start.value
|
177
|
-
reactor.connect('example.com', 9999, 5).value
|
178
|
-
protocol_handler_factory.should have_received(:new).with(an_instance_of(Connection), reactor)
|
179
|
-
end
|
180
|
-
|
181
|
-
it 'returns a future that resolves to a new protocol handler' do
|
182
|
-
reactor.start.value
|
183
|
-
f = reactor.connect('example.com', 9999, 5)
|
184
|
-
f.value.should equal(protocol_handler)
|
185
|
-
end
|
186
|
-
|
187
|
-
it 'returns a new protocol handler which wraps a socket handler' do
|
188
|
-
reactor.start.value
|
189
|
-
protocol_handler = reactor.connect('example.com', 9999, 5).value
|
190
|
-
protocol_handler.connection.should_not be_nil
|
191
|
-
protocol_handler.connection.host.should == 'example.com'
|
192
|
-
protocol_handler.connection.port.should == 9999
|
193
|
-
protocol_handler.connection.connection_timeout.should == 5
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
describe '#schedule_timer' do
|
198
|
-
before do
|
199
|
-
reactor.start.value
|
200
|
-
end
|
201
|
-
|
202
|
-
after do
|
203
|
-
reactor.stop.value
|
204
|
-
end
|
205
|
-
|
206
|
-
it 'returns a future that is resolved after the specified duration' do
|
207
|
-
clock.stub(:now).and_return(1)
|
208
|
-
f = reactor.schedule_timer(0.1)
|
209
|
-
clock.stub(:now).and_return(1.1)
|
210
|
-
await { f.resolved? }
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
describe '#to_s' do
|
215
|
-
context 'returns a string that' do
|
216
|
-
it 'includes the class name' do
|
217
|
-
reactor.to_s.should include('Cql::Io::IoReactor')
|
218
|
-
end
|
219
|
-
|
220
|
-
it 'includes a list of its connections' do
|
221
|
-
reactor.to_s.should include('@connections=[')
|
222
|
-
reactor.to_s.should include('#<Cql::Io::Unblocker>')
|
223
|
-
end
|
224
|
-
end
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
describe IoLoopBody do
|
229
|
-
let :loop_body do
|
230
|
-
described_class.new(selector: selector, clock: clock)
|
231
|
-
end
|
232
|
-
|
233
|
-
let :selector do
|
234
|
-
double(:selector)
|
235
|
-
end
|
236
|
-
|
237
|
-
let :clock do
|
238
|
-
double(:clock, now: 0)
|
239
|
-
end
|
240
|
-
|
241
|
-
let :socket do
|
242
|
-
double(:socket, connected?: false, connecting?: false, writable?: false, closed?: false)
|
243
|
-
end
|
244
|
-
|
245
|
-
describe '#tick' do
|
246
|
-
before do
|
247
|
-
loop_body.add_socket(socket)
|
248
|
-
end
|
249
|
-
|
250
|
-
it 'passes connected sockets as readables to the selector' do
|
251
|
-
socket.stub(:connected?).and_return(true)
|
252
|
-
selector.should_receive(:select).with([socket], anything, anything, anything).and_return([nil, nil, nil])
|
253
|
-
loop_body.tick
|
254
|
-
end
|
255
|
-
|
256
|
-
it 'passes writable sockets as writable to the selector' do
|
257
|
-
socket.stub(:writable?).and_return(true)
|
258
|
-
selector.should_receive(:select).with(anything, [socket], anything, anything).and_return([nil, nil, nil])
|
259
|
-
loop_body.tick
|
260
|
-
end
|
261
|
-
|
262
|
-
it 'passes connecting sockets as writable to the selector' do
|
263
|
-
socket.stub(:connecting?).and_return(true)
|
264
|
-
socket.stub(:connect)
|
265
|
-
selector.should_receive(:select).with(anything, [socket], anything, anything).and_return([nil, nil, nil])
|
266
|
-
loop_body.tick
|
267
|
-
end
|
268
|
-
|
269
|
-
it 'filters out closed sockets' do
|
270
|
-
socket.stub(:closed?).and_return(true)
|
271
|
-
selector.should_receive(:select).with([], [], anything, anything).and_return([nil, nil, nil])
|
272
|
-
loop_body.tick
|
273
|
-
socket.stub(:connected?).and_return(true)
|
274
|
-
selector.should_receive(:select).with([], [], anything, anything).and_return([nil, nil, nil])
|
275
|
-
loop_body.tick
|
276
|
-
end
|
277
|
-
|
278
|
-
it 'calls #read on all readable sockets returned by the selector' do
|
279
|
-
socket.stub(:connected?).and_return(true)
|
280
|
-
socket.should_receive(:read)
|
281
|
-
selector.stub(:select) do |r, w, _, _|
|
282
|
-
[[socket], nil, nil]
|
283
|
-
end
|
284
|
-
loop_body.tick
|
285
|
-
end
|
286
|
-
|
287
|
-
it 'calls #connect on all connecting sockets' do
|
288
|
-
socket.stub(:connecting?).and_return(true)
|
289
|
-
socket.should_receive(:connect)
|
290
|
-
selector.stub(:select).and_return([nil, nil, nil])
|
291
|
-
loop_body.tick
|
292
|
-
end
|
293
|
-
|
294
|
-
it 'calls #flush on all writable sockets returned by the selector' do
|
295
|
-
socket.stub(:writable?).and_return(true)
|
296
|
-
socket.should_receive(:flush)
|
297
|
-
selector.stub(:select) do |r, w, _, _|
|
298
|
-
[nil, [socket], nil]
|
299
|
-
end
|
300
|
-
loop_body.tick
|
301
|
-
end
|
302
|
-
|
303
|
-
it 'allows the caller to specify a custom timeout' do
|
304
|
-
selector.should_receive(:select).with(anything, anything, anything, 99).and_return([[], [], []])
|
305
|
-
loop_body.tick(99)
|
306
|
-
end
|
307
|
-
|
308
|
-
it 'completes timers that have expired' do
|
309
|
-
selector.stub(:select).and_return([nil, nil, nil])
|
310
|
-
clock.stub(:now).and_return(1)
|
311
|
-
promise = Promise.new
|
312
|
-
loop_body.schedule_timer(1, promise)
|
313
|
-
loop_body.tick
|
314
|
-
promise.future.should_not be_completed
|
315
|
-
clock.stub(:now).and_return(2)
|
316
|
-
loop_body.tick
|
317
|
-
promise.future.should be_completed
|
318
|
-
end
|
319
|
-
|
320
|
-
it 'clears out timers that have expired' do
|
321
|
-
selector.stub(:select).and_return([nil, nil, nil])
|
322
|
-
clock.stub(:now).and_return(1)
|
323
|
-
promise = Promise.new
|
324
|
-
loop_body.schedule_timer(1, promise)
|
325
|
-
clock.stub(:now).and_return(2)
|
326
|
-
loop_body.tick
|
327
|
-
promise.future.should be_completed
|
328
|
-
promise.should_not_receive(:fulfill)
|
329
|
-
loop_body.tick
|
330
|
-
end
|
331
|
-
end
|
332
|
-
|
333
|
-
describe '#close_sockets' do
|
334
|
-
it 'closes all sockets' do
|
335
|
-
socket1 = double(:socket1, closed?: false)
|
336
|
-
socket2 = double(:socket2, closed?: false)
|
337
|
-
socket1.should_receive(:close)
|
338
|
-
socket2.should_receive(:close)
|
339
|
-
loop_body.add_socket(socket1)
|
340
|
-
loop_body.add_socket(socket2)
|
341
|
-
loop_body.close_sockets
|
342
|
-
end
|
343
|
-
|
344
|
-
it 'closes all sockets, even when one of them raises an error' do
|
345
|
-
socket1 = double(:socket1, closed?: false)
|
346
|
-
socket2 = double(:socket2, closed?: false)
|
347
|
-
socket1.stub(:close).and_raise('Blurgh')
|
348
|
-
socket2.should_receive(:close)
|
349
|
-
loop_body.add_socket(socket1)
|
350
|
-
loop_body.add_socket(socket2)
|
351
|
-
loop_body.close_sockets
|
352
|
-
end
|
353
|
-
|
354
|
-
it 'does not close already closed sockets' do
|
355
|
-
socket.stub(:closed?).and_return(true)
|
356
|
-
socket.should_not_receive(:close)
|
357
|
-
loop_body.add_socket(socket)
|
358
|
-
loop_body.close_sockets
|
359
|
-
end
|
360
|
-
end
|
361
|
-
|
362
|
-
describe '#cancel_timers' do
|
363
|
-
before do
|
364
|
-
selector.stub(:select).and_return([nil, nil, nil])
|
365
|
-
end
|
366
|
-
|
367
|
-
it 'fails all active timers with a CancelledError' do
|
368
|
-
p1 = Promise.new
|
369
|
-
p2 = Promise.new
|
370
|
-
p3 = Promise.new
|
371
|
-
clock.stub(:now).and_return(1)
|
372
|
-
loop_body.schedule_timer(1, p1)
|
373
|
-
loop_body.schedule_timer(3, p2)
|
374
|
-
loop_body.schedule_timer(3, p3)
|
375
|
-
clock.stub(:now).and_return(2)
|
376
|
-
loop_body.tick
|
377
|
-
loop_body.cancel_timers
|
378
|
-
p1.future.should be_completed
|
379
|
-
p2.future.should be_failed
|
380
|
-
p3.future.should be_failed
|
381
|
-
expect { p3.future.value }.to raise_error(CancelledError)
|
382
|
-
end
|
383
|
-
end
|
384
|
-
end
|
385
|
-
end
|
386
|
-
end
|
387
|
-
|
388
|
-
module IoReactorSpec
|
389
|
-
class FakeSelector
|
390
|
-
def initialize
|
391
|
-
handler { [[], [], []] }
|
392
|
-
end
|
393
|
-
|
394
|
-
def handler(&body)
|
395
|
-
@body = body
|
396
|
-
end
|
397
|
-
|
398
|
-
def select(*args)
|
399
|
-
@body.call(*args)
|
400
|
-
end
|
401
|
-
end
|
402
|
-
end
|
@@ -1,547 +0,0 @@
|
|
1
|
-
# encoding: ascii-8bit
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
|
6
|
-
module Cql
|
7
|
-
module Protocol
|
8
|
-
describe Decoding do
|
9
|
-
describe '#read_byte!' do
|
10
|
-
let :buffer do
|
11
|
-
ByteBuffer.new("\xab")
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'decodes a raw byte' do
|
15
|
-
Decoding.read_byte!(buffer).should == 0xab
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'consumes the byte' do
|
19
|
-
Decoding.read_byte!(buffer)
|
20
|
-
buffer.should be_empty
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'raises an error when there is no byte available' do
|
24
|
-
expect { Decoding.read_byte!(ByteBuffer.new) }.to raise_error(DecodingError)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe '#read_varint!' do
|
29
|
-
it 'decodes a variable length integer' do
|
30
|
-
buffer = ByteBuffer.new("\x03\x9EV \x15\f\x03\x9DK\x18\xCDI\\$?\a[")
|
31
|
-
Decoding.read_varint!(buffer, 17).should == 1231312312331283012830129382342342412123
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'decodes a negative variable length integer' do
|
35
|
-
buffer = ByteBuffer.new("\xC9v\x8D:\x86")
|
36
|
-
Decoding.read_varint!(buffer, 5).should == -234234234234
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'decodes an unsigned variable length integer' do
|
40
|
-
buffer = ByteBuffer.new("\xC9v\x8D:\x86")
|
41
|
-
Decoding.read_varint!(buffer, 5, false).should == 865277393542
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'consumes the bytes' do
|
45
|
-
buffer = ByteBuffer.new("\x03\x9EV \x15\f\x03\x9DK\x18\xCDI\\$?\a[\x01\x02\x03")
|
46
|
-
Decoding.read_varint!(buffer, 17)
|
47
|
-
buffer.should eql_bytes("\x01\x02\x03")
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'raises an error when there is not enough bytes available' do
|
51
|
-
buffer = ByteBuffer.new("\xC9v\x8D:")
|
52
|
-
expect { Decoding.read_varint!(buffer, 7) }.to raise_error(DecodingError)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
describe '#read_decimal!' do
|
57
|
-
let :buffer do
|
58
|
-
ByteBuffer.new("\x00\x00\x00\x12\r'\xFDI\xAD\x80f\x11g\xDCfV\xAA")
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'decodes a decimal to a BigDecimal' do
|
62
|
-
Decoding.read_decimal!(buffer).should == BigDecimal.new('1042342234234.123423435647768234')
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'decodes a negative decimal' do
|
66
|
-
buffer = ByteBuffer.new("\x00\x00\x00\x12\xF2\xD8\x02\xB6R\x7F\x99\xEE\x98#\x99\xA9V")
|
67
|
-
Decoding.read_decimal!(buffer).should == BigDecimal.new('-1042342234234.123423435647768234')
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'decodes a positive decimal with only fractions' do
|
71
|
-
buffer = ByteBuffer.new("\x00\x00\x00\x13*\xF8\xC4\xDF\xEB]o")
|
72
|
-
Decoding.read_decimal!(buffer).should == BigDecimal.new('0.0012095473475870063')
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'decodes a negative decimal with only fractions' do
|
76
|
-
buffer = ByteBuffer.new("\x00\x00\x00\x13\xD5\a;\x20\x14\xA2\x91")
|
77
|
-
Decoding.read_decimal!(buffer).should == BigDecimal.new('-0.0012095473475870063')
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'consumes the bytes' do
|
81
|
-
buffer << 'HELLO'
|
82
|
-
Decoding.read_decimal!(buffer, buffer.length - 5)
|
83
|
-
buffer.should eql_bytes('HELLO')
|
84
|
-
end
|
85
|
-
|
86
|
-
it 'defaults to using the buffer length' do
|
87
|
-
Decoding.read_decimal!(buffer.dup).should == Decoding.read_decimal!(buffer, buffer.length)
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'raises an error when there is not enough bytes available' do
|
91
|
-
b = ByteBuffer.new(buffer.read(3))
|
92
|
-
expect { Decoding.read_decimal!(b, 7) }.to raise_error(DecodingError)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
describe '#read_long!' do
|
97
|
-
it 'decodes a positive long' do
|
98
|
-
buffer = ByteBuffer.new("\x00\x00\xca\xfe\xba\xbe\x00\x00")
|
99
|
-
Decoding.read_long!(buffer).should == 0x0000cafebabe0000
|
100
|
-
end
|
101
|
-
|
102
|
-
it 'decodes a negative long' do
|
103
|
-
buffer = ByteBuffer.new("\xff\xee\xdd\xcc\xbb\xaa\x99\x88")
|
104
|
-
Decoding.read_long!(buffer).should == 0xffeeddccbbaa9988 - 0x10000000000000000
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'consumes the bytes' do
|
108
|
-
buffer = ByteBuffer.new("\xca\xfe\xba\xbe\xca\xfe\xba\xbe\xca\xfe\xba\xbe")
|
109
|
-
Decoding.read_long!(buffer)
|
110
|
-
buffer.should eql_bytes("\xca\xfe\xba\xbe")
|
111
|
-
end
|
112
|
-
|
113
|
-
it 'raises an error when there is not enough bytes available' do
|
114
|
-
buffer = ByteBuffer.new("\xca\xfe\xba\xbe\x00")
|
115
|
-
expect { Decoding.read_long!(buffer) }.to raise_error(DecodingError)
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
describe '#read_double!' do
|
120
|
-
it 'decodes a double' do
|
121
|
-
buffer = ByteBuffer.new("@\xC3\x88\x0F\xC2\x7F\x9DU")
|
122
|
-
Decoding.read_double!(buffer).should == 10000.123123123
|
123
|
-
end
|
124
|
-
|
125
|
-
it 'consumes the bytes' do
|
126
|
-
buffer = ByteBuffer.new("@\xC3\x88\x0F\xC2\x7F\x9DUxyz")
|
127
|
-
Decoding.read_double!(buffer)
|
128
|
-
buffer.should eql_bytes('xyz')
|
129
|
-
end
|
130
|
-
|
131
|
-
it 'raises an error when there is not enough bytes available' do
|
132
|
-
buffer = ByteBuffer.new("@\xC3\x88\x0F")
|
133
|
-
expect { Decoding.read_double!(buffer) }.to raise_error(DecodingError)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
describe '#read_float!' do
|
138
|
-
it 'decodes a float' do
|
139
|
-
buffer = ByteBuffer.new("AB\x14{")
|
140
|
-
Decoding.read_float!(buffer).should be_within(0.00001).of(12.13)
|
141
|
-
end
|
142
|
-
|
143
|
-
it 'consumes the bytes' do
|
144
|
-
buffer = ByteBuffer.new("AB\x14{xyz")
|
145
|
-
Decoding.read_float!(buffer)
|
146
|
-
buffer.should eql_bytes('xyz')
|
147
|
-
end
|
148
|
-
|
149
|
-
it 'raises an error when there is not enough bytes available' do
|
150
|
-
buffer = ByteBuffer.new("\x0F")
|
151
|
-
expect { Decoding.read_float!(buffer) }.to raise_error(DecodingError)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
describe '#read_int!' do
|
156
|
-
let :buffer do
|
157
|
-
ByteBuffer.new("\x00\xff\x00\xff")
|
158
|
-
end
|
159
|
-
|
160
|
-
it 'decodes a positive int' do
|
161
|
-
Decoding.read_int!(buffer).should == 0x00ff00ff
|
162
|
-
end
|
163
|
-
|
164
|
-
it 'decodes a negative int' do
|
165
|
-
buffer = ByteBuffer.new("\xff\xee\xdd\xcc")
|
166
|
-
Decoding.read_int!(buffer).should == 0xffeeddcc - 0x100000000
|
167
|
-
end
|
168
|
-
|
169
|
-
it 'consumes the bytes' do
|
170
|
-
buffer << "\xab\xcd"
|
171
|
-
Decoding.read_int!(buffer)
|
172
|
-
buffer.should eql_bytes("\xab\xcd")
|
173
|
-
end
|
174
|
-
|
175
|
-
it 'raises an error when there are not enough bytes in the buffer' do
|
176
|
-
buffer = ByteBuffer.new("\x01\xab")
|
177
|
-
expect { Decoding.read_int!(buffer) }.to raise_error(DecodingError)
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
describe '#read_short!' do
|
182
|
-
let :buffer do
|
183
|
-
ByteBuffer.new("\x00\x02")
|
184
|
-
end
|
185
|
-
|
186
|
-
it 'decodes a short' do
|
187
|
-
Decoding.read_short!(buffer).should == 2
|
188
|
-
end
|
189
|
-
|
190
|
-
it 'consumes the bytes' do
|
191
|
-
buffer << "\xff\xff"
|
192
|
-
Decoding.read_short!(buffer)
|
193
|
-
buffer.should eql_bytes("\xff\xff")
|
194
|
-
end
|
195
|
-
|
196
|
-
it 'raises an error when there are not enough bytes in the buffer' do
|
197
|
-
buffer = ByteBuffer.new("\x01")
|
198
|
-
expect { Decoding.read_short!(buffer) }.to raise_error(DecodingError)
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
describe '#read_string!' do
|
203
|
-
let :buffer do
|
204
|
-
ByteBuffer.new("\x00\x0bhej och hå")
|
205
|
-
end
|
206
|
-
|
207
|
-
it 'decodes a string' do
|
208
|
-
Decoding.read_string!(buffer).should == 'hej och hå'.force_encoding(::Encoding::UTF_8)
|
209
|
-
end
|
210
|
-
|
211
|
-
it 'decodes a string as UTF-8' do
|
212
|
-
Decoding.read_string!(buffer).encoding.should == ::Encoding::UTF_8
|
213
|
-
end
|
214
|
-
|
215
|
-
it 'decodes an empty string' do
|
216
|
-
buffer = ByteBuffer.new("\x00\x00")
|
217
|
-
Decoding.read_string!(buffer).should be_empty
|
218
|
-
end
|
219
|
-
|
220
|
-
it 'consumes the bytes' do
|
221
|
-
buffer << "\xff\xff"
|
222
|
-
Decoding.read_string!(buffer)
|
223
|
-
buffer.should eql_bytes("\xff\xff")
|
224
|
-
end
|
225
|
-
|
226
|
-
it 'raises an error when there are not enough bytes in the buffer' do
|
227
|
-
b = ByteBuffer.new(buffer.read(5))
|
228
|
-
expect { Decoding.read_string!(b) }.to raise_error(DecodingError)
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
describe '#read_long_string!' do
|
233
|
-
let :buffer do
|
234
|
-
ByteBuffer.new("\x00\x01\x00\00" << ('x' * 0x10000))
|
235
|
-
end
|
236
|
-
|
237
|
-
it 'decodes a string' do
|
238
|
-
Decoding.read_long_string!(buffer.dup).should start_with('xxx')
|
239
|
-
Decoding.read_long_string!(buffer).length.should == 0x10000
|
240
|
-
end
|
241
|
-
|
242
|
-
it 'decodes a string as UTF-8' do
|
243
|
-
Decoding.read_long_string!(buffer).encoding.should == ::Encoding::UTF_8
|
244
|
-
end
|
245
|
-
|
246
|
-
it 'consumes the bytes' do
|
247
|
-
buffer << "\xff\xff"
|
248
|
-
Decoding.read_long_string!(buffer)
|
249
|
-
buffer.should eql_bytes("\xff\xff")
|
250
|
-
end
|
251
|
-
|
252
|
-
it 'raises an error when there are not enough bytes in the buffer' do
|
253
|
-
b = ByteBuffer.new(buffer.read(246))
|
254
|
-
expect { Decoding.read_long_string!(b) }.to raise_error(DecodingError)
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
|
-
describe '#read_uuid!' do
|
259
|
-
let :buffer do
|
260
|
-
ByteBuffer.new("\xA4\xA7\t\x00$\xE1\x11\xDF\x89$\x00\x1F\xF3Y\x17\x11")
|
261
|
-
end
|
262
|
-
|
263
|
-
it 'decodes a UUID as a Cql::Uuid' do
|
264
|
-
Decoding.read_uuid!(buffer).should == Uuid.new('a4a70900-24e1-11df-8924-001ff3591711')
|
265
|
-
end
|
266
|
-
|
267
|
-
it 'decodes a UUID as a Cql::TimeUuid' do
|
268
|
-
uuid = Decoding.read_uuid!(buffer, TimeUuid)
|
269
|
-
uuid.should == TimeUuid.new('a4a70900-24e1-11df-8924-001ff3591711')
|
270
|
-
uuid.should be_a(TimeUuid)
|
271
|
-
end
|
272
|
-
|
273
|
-
it 'consumes the bytes' do
|
274
|
-
Decoding.read_uuid!(buffer)
|
275
|
-
buffer.should be_empty
|
276
|
-
end
|
277
|
-
|
278
|
-
it 'raises an error when there a not enough bytes in the buffer' do
|
279
|
-
b = ByteBuffer.new(buffer.discard(2).read(5))
|
280
|
-
expect { Decoding.read_uuid!(b) }.to raise_error(DecodingError)
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
describe '#read_string_list!' do
|
285
|
-
let :buffer do
|
286
|
-
ByteBuffer.new("\x00\x02\x00\x05hello\x00\x05world")
|
287
|
-
end
|
288
|
-
|
289
|
-
it 'decodes a string list' do
|
290
|
-
Decoding.read_string_list!(buffer).should == %w[hello world]
|
291
|
-
end
|
292
|
-
|
293
|
-
it 'decodes an empty string list' do
|
294
|
-
buffer = ByteBuffer.new("\x00\x00")
|
295
|
-
Decoding.read_string_list!(buffer).should == []
|
296
|
-
end
|
297
|
-
|
298
|
-
it 'consumes the bytes' do
|
299
|
-
buffer << "\xff\xff"
|
300
|
-
Decoding.read_string_list!(buffer)
|
301
|
-
buffer.should eql_bytes("\xff\xff")
|
302
|
-
end
|
303
|
-
|
304
|
-
it 'raises an error when there are not enough bytes in the buffer' do
|
305
|
-
b = ByteBuffer.new(buffer.read(13))
|
306
|
-
expect { Decoding.read_string_list!(b) }.to raise_error(DecodingError)
|
307
|
-
end
|
308
|
-
end
|
309
|
-
|
310
|
-
describe '#read_bytes!' do
|
311
|
-
let :buffer do
|
312
|
-
ByteBuffer.new("\x00\x01\x00\x00" << ("\x42" * 0x10000))
|
313
|
-
end
|
314
|
-
|
315
|
-
it 'decodes a byte array' do
|
316
|
-
Decoding.read_bytes!(buffer).should eql_bytes("\x42" * 0x10000)
|
317
|
-
end
|
318
|
-
|
319
|
-
it 'decodes an empty byte array' do
|
320
|
-
buffer = ByteBuffer.new("\x00\x00\x00\x00")
|
321
|
-
Decoding.read_bytes!(buffer).should be_empty
|
322
|
-
end
|
323
|
-
|
324
|
-
it 'decodes null' do
|
325
|
-
buffer = ByteBuffer.new("\x80\x00\x00\x00")
|
326
|
-
Decoding.read_bytes!(buffer).should be_nil
|
327
|
-
end
|
328
|
-
|
329
|
-
it 'consumes the bytes' do
|
330
|
-
buffer << "\xab\xcd"
|
331
|
-
Decoding.read_bytes!(buffer)
|
332
|
-
buffer.should eql_bytes("\xab\xcd")
|
333
|
-
end
|
334
|
-
|
335
|
-
it 'raises an error when there are not enough bytes in the buffer' do
|
336
|
-
b = ByteBuffer.new(buffer.read(10))
|
337
|
-
expect { Decoding.read_bytes!(b) }.to raise_error(DecodingError)
|
338
|
-
end
|
339
|
-
end
|
340
|
-
|
341
|
-
describe '#read_short_bytes!' do
|
342
|
-
let :buffer do
|
343
|
-
ByteBuffer.new("\x01\x00" << ("\x42" * 0x100))
|
344
|
-
end
|
345
|
-
|
346
|
-
it 'decodes a byte array' do
|
347
|
-
Decoding.read_short_bytes!(buffer).should eql_bytes("\x42" * 0x100)
|
348
|
-
end
|
349
|
-
|
350
|
-
it 'decodes an empty byte array' do
|
351
|
-
buffer = ByteBuffer.new("\x00\x00\x00\x00")
|
352
|
-
Decoding.read_short_bytes!(buffer).should be_empty
|
353
|
-
end
|
354
|
-
|
355
|
-
it 'decodes null' do
|
356
|
-
buffer = ByteBuffer.new("\x80\x00")
|
357
|
-
Decoding.read_short_bytes!(buffer).should be_nil
|
358
|
-
end
|
359
|
-
|
360
|
-
it 'consumes the bytes' do
|
361
|
-
buffer << "\xab\xcd"
|
362
|
-
Decoding.read_short_bytes!(buffer)
|
363
|
-
buffer.should eql_bytes("\xab\xcd")
|
364
|
-
end
|
365
|
-
|
366
|
-
it 'raises an error when there are not enough bytes in the buffer' do
|
367
|
-
b = ByteBuffer.new(buffer.read(10))
|
368
|
-
expect { Decoding.read_short_bytes!(b) }.to raise_error(DecodingError)
|
369
|
-
end
|
370
|
-
end
|
371
|
-
|
372
|
-
describe '#read_option!' do
|
373
|
-
it 'decodes an option ID and value with instructions from a block' do
|
374
|
-
buffer = ByteBuffer.new("\x00\x01\x00\x03foo")
|
375
|
-
id, value = Decoding.read_option!(buffer) do |id, buffer|
|
376
|
-
Decoding.read_string!(buffer)
|
377
|
-
end
|
378
|
-
id.should == 1
|
379
|
-
value.should == 'foo'
|
380
|
-
end
|
381
|
-
|
382
|
-
it 'decodes an option ID and nil value when there is no block' do
|
383
|
-
buffer = ByteBuffer.new("\xaa\xbb")
|
384
|
-
id, value = Decoding.read_option!(buffer)
|
385
|
-
id.should == 0xaabb
|
386
|
-
value.should be_nil
|
387
|
-
end
|
388
|
-
|
389
|
-
it 'consumes the bytes' do
|
390
|
-
buffer = ByteBuffer.new("\x00\x01\x00\x03\xab")
|
391
|
-
id, value = Decoding.read_option!(buffer) do |id, buffer|
|
392
|
-
Decoding.read_short!(buffer)
|
393
|
-
end
|
394
|
-
buffer.should eql_bytes("\xab")
|
395
|
-
end
|
396
|
-
|
397
|
-
it 'raises an error when there are not enough bytes in the buffer' do
|
398
|
-
buffer = ByteBuffer.new("\xaa")
|
399
|
-
expect { Decoding.read_option!(buffer) }.to raise_error(DecodingError)
|
400
|
-
end
|
401
|
-
end
|
402
|
-
|
403
|
-
describe '#read_inet!' do
|
404
|
-
it 'decodes an IPv4 + port pair' do
|
405
|
-
buffer = ByteBuffer.new("\x04\x00\x00\x00\x00\x00\x00#R")
|
406
|
-
ip_addr, port = Decoding.read_inet!(buffer)
|
407
|
-
ip_addr.should == IPAddr.new('0.0.0.0')
|
408
|
-
port.should == 9042
|
409
|
-
end
|
410
|
-
|
411
|
-
it 'decodes an IPv6 + port pair' do
|
412
|
-
buffer = ByteBuffer.new("\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00#R")
|
413
|
-
ip_addr, port = Decoding.read_inet!(buffer)
|
414
|
-
ip_addr.should == IPAddr.new('::1')
|
415
|
-
port.should == 9042
|
416
|
-
end
|
417
|
-
|
418
|
-
it 'consumes the bytes' do
|
419
|
-
buffer = ByteBuffer.new("\x04\x00\x00\x00\x00\x00\x00#R\xff\xaa")
|
420
|
-
Decoding.read_inet!(buffer)
|
421
|
-
buffer.should eql_bytes("\xff\xaa")
|
422
|
-
end
|
423
|
-
|
424
|
-
it 'raises an error when there are not enough bytes in the buffer' do
|
425
|
-
buffer1 = ByteBuffer.new("\x04\x00\x00\x00\x00\x00\x00")
|
426
|
-
expect { Decoding.read_inet!(buffer1) }.to raise_error(DecodingError)
|
427
|
-
buffer2 = ByteBuffer.new("\x04\x00\x00\x00")
|
428
|
-
expect { Decoding.read_inet!(buffer2) }.to raise_error(DecodingError)
|
429
|
-
end
|
430
|
-
end
|
431
|
-
|
432
|
-
describe '#read_consistency!' do
|
433
|
-
it 'decodes ANY' do
|
434
|
-
buffer = ByteBuffer.new("\x00\x00")
|
435
|
-
Decoding.read_consistency!(buffer).should == :any
|
436
|
-
end
|
437
|
-
|
438
|
-
it 'decodes ONE' do
|
439
|
-
buffer = ByteBuffer.new("\x00\x01")
|
440
|
-
Decoding.read_consistency!(buffer).should == :one
|
441
|
-
end
|
442
|
-
|
443
|
-
it 'decodes TWO' do
|
444
|
-
buffer = ByteBuffer.new("\x00\x02")
|
445
|
-
Decoding.read_consistency!(buffer).should == :two
|
446
|
-
end
|
447
|
-
|
448
|
-
it 'decodes THREE' do
|
449
|
-
buffer = ByteBuffer.new("\x00\x03")
|
450
|
-
Decoding.read_consistency!(buffer).should == :three
|
451
|
-
end
|
452
|
-
|
453
|
-
it 'decodes QUORUM' do
|
454
|
-
buffer = ByteBuffer.new("\x00\x04")
|
455
|
-
Decoding.read_consistency!(buffer).should == :quorum
|
456
|
-
end
|
457
|
-
|
458
|
-
it 'decodes ALL' do
|
459
|
-
buffer = ByteBuffer.new("\x00\x05")
|
460
|
-
Decoding.read_consistency!(buffer).should == :all
|
461
|
-
end
|
462
|
-
|
463
|
-
it 'decodes LOCAL_QUORUM' do
|
464
|
-
buffer = ByteBuffer.new("\x00\x06")
|
465
|
-
Decoding.read_consistency!(buffer).should == :local_quorum
|
466
|
-
end
|
467
|
-
|
468
|
-
it 'decodes EACH_QUORUM' do
|
469
|
-
buffer = ByteBuffer.new("\x00\x07")
|
470
|
-
Decoding.read_consistency!(buffer).should == :each_quorum
|
471
|
-
end
|
472
|
-
|
473
|
-
it 'decodes SERIAL' do
|
474
|
-
buffer = ByteBuffer.new("\x00\x08")
|
475
|
-
Decoding.read_consistency!(buffer).should == :serial
|
476
|
-
end
|
477
|
-
|
478
|
-
it 'decodes LOCAL_SERIAL' do
|
479
|
-
buffer = ByteBuffer.new("\x00\x09")
|
480
|
-
Decoding.read_consistency!(buffer).should == :local_serial
|
481
|
-
end
|
482
|
-
|
483
|
-
it 'decodes LOCAL_ONE' do
|
484
|
-
buffer = ByteBuffer.new("\x00\x0a")
|
485
|
-
Decoding.read_consistency!(buffer).should == :local_one
|
486
|
-
end
|
487
|
-
|
488
|
-
it 'raises an exception for an unknown consistency' do
|
489
|
-
expect { Decoding.read_consistency!(ByteBuffer.new("\xff\xff")) }.to raise_error(DecodingError)
|
490
|
-
expect { Decoding.read_consistency!(ByteBuffer.new("\x00\x0f")) }.to raise_error(DecodingError)
|
491
|
-
end
|
492
|
-
end
|
493
|
-
|
494
|
-
describe '#read_string_map!' do
|
495
|
-
let :buffer do
|
496
|
-
ByteBuffer.new("\x00\x02\x00\x05hello\x00\x05world\x00\x03foo\x00\x03bar")
|
497
|
-
end
|
498
|
-
|
499
|
-
it 'decodes a string multimap' do
|
500
|
-
Decoding.read_string_map!(buffer).should == {'hello' => 'world', 'foo' => 'bar'}
|
501
|
-
end
|
502
|
-
|
503
|
-
it 'decodes an empty string map' do
|
504
|
-
buffer = ByteBuffer.new("\x00\x00")
|
505
|
-
Decoding.read_string_map!(buffer).should == {}
|
506
|
-
end
|
507
|
-
|
508
|
-
it 'consumes the bytes' do
|
509
|
-
buffer << "\xff"
|
510
|
-
Decoding.read_string_map!(buffer)
|
511
|
-
buffer.should eql_bytes("\xff")
|
512
|
-
end
|
513
|
-
|
514
|
-
it 'raises an error when there are not enough bytes in the buffer' do
|
515
|
-
b = ByteBuffer.new(buffer.read(20))
|
516
|
-
expect { Decoding.read_string_map!(b) }.to raise_error(DecodingError)
|
517
|
-
end
|
518
|
-
end
|
519
|
-
|
520
|
-
describe '#read_string_multimap!' do
|
521
|
-
let :buffer do
|
522
|
-
ByteBuffer.new("\x00\x02\x00\x0bCQL_VERSION\x00\x01\x00\x053.0.0\x00\x0bCOMPRESSION\x00\x02\x00\x06snappy\x00\x04gzip")
|
523
|
-
end
|
524
|
-
|
525
|
-
it 'decodes a string multimap' do
|
526
|
-
Decoding.read_string_multimap!(buffer).should == {'CQL_VERSION' => ['3.0.0'], 'COMPRESSION' => ['snappy', 'gzip']}
|
527
|
-
end
|
528
|
-
|
529
|
-
it 'decodes an empty string multimap' do
|
530
|
-
buffer = ByteBuffer.new("\x00\x00")
|
531
|
-
Decoding.read_string_multimap!(buffer).should == {}
|
532
|
-
end
|
533
|
-
|
534
|
-
it 'consumes the bytes' do
|
535
|
-
buffer << "\xff"
|
536
|
-
Decoding.read_string_multimap!(buffer)
|
537
|
-
buffer.should eql_bytes("\xff")
|
538
|
-
end
|
539
|
-
|
540
|
-
it 'raises an error when there are not enough bytes in the buffer' do
|
541
|
-
b = ByteBuffer.new(buffer.read(40))
|
542
|
-
expect { Decoding.read_string_multimap!(b) }.to raise_error(DecodingError)
|
543
|
-
end
|
544
|
-
end
|
545
|
-
end
|
546
|
-
end
|
547
|
-
end
|