cql-rb 1.1.3 → 1.2.0.pre0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -11
- data/lib/cql.rb +1 -0
- data/lib/cql/client.rb +41 -9
- data/lib/cql/client/asynchronous_client.rb +9 -4
- data/lib/cql/client/asynchronous_prepared_statement.rb +2 -2
- data/lib/cql/client/connection_helper.rb +43 -20
- data/lib/cql/client/execute_options_decoder.rb +4 -1
- data/lib/cql/client/query_result.rb +7 -3
- data/lib/cql/client/query_trace.rb +46 -0
- data/lib/cql/client/request_runner.rb +7 -2
- data/lib/cql/client/void_result.rb +42 -0
- data/lib/cql/compression.rb +53 -0
- data/lib/cql/compression/snappy_compressor.rb +42 -0
- data/lib/cql/io/io_reactor.rb +9 -4
- data/lib/cql/protocol.rb +5 -3
- data/lib/cql/protocol/cql_protocol_handler.rb +14 -9
- data/lib/cql/protocol/frame_decoder.rb +106 -0
- data/lib/cql/protocol/frame_encoder.rb +31 -0
- data/lib/cql/protocol/request.rb +7 -11
- data/lib/cql/protocol/requests/execute_request.rb +2 -2
- data/lib/cql/protocol/requests/options_request.rb +4 -0
- data/lib/cql/protocol/requests/prepare_request.rb +2 -2
- data/lib/cql/protocol/requests/query_request.rb +2 -2
- data/lib/cql/protocol/requests/startup_request.rb +12 -5
- data/lib/cql/protocol/response.rb +13 -2
- data/lib/cql/protocol/responses/authenticate_response.rb +5 -1
- data/lib/cql/protocol/responses/detailed_error_response.rb +2 -2
- data/lib/cql/protocol/responses/error_response.rb +7 -2
- data/lib/cql/protocol/responses/event_response.rb +4 -2
- data/lib/cql/protocol/responses/prepared_result_response.rb +20 -4
- data/lib/cql/protocol/responses/ready_response.rb +5 -1
- data/lib/cql/protocol/responses/result_response.rb +10 -2
- data/lib/cql/protocol/responses/rows_result_response.rb +5 -4
- data/lib/cql/protocol/responses/schema_change_event_response.rb +1 -1
- data/lib/cql/protocol/responses/schema_change_result_response.rb +5 -4
- data/lib/cql/protocol/responses/set_keyspace_result_response.rb +4 -3
- data/lib/cql/protocol/responses/{status_change_event_result_response.rb → status_change_event_response.rb} +1 -1
- data/lib/cql/protocol/responses/supported_response.rb +5 -1
- data/lib/cql/protocol/responses/{topology_change_event_result_response.rb → topology_change_event_response.rb} +0 -0
- data/lib/cql/protocol/responses/void_result_response.rb +2 -2
- data/lib/cql/version.rb +1 -1
- data/spec/cql/client/asynchronous_client_spec.rb +52 -31
- data/spec/cql/client/asynchronous_prepared_statement_spec.rb +16 -2
- data/spec/cql/client/connection_helper_spec.rb +90 -12
- data/spec/cql/client/query_trace_spec.rb +138 -0
- data/spec/cql/client/request_runner_spec.rb +44 -7
- data/spec/cql/client/void_result_spec.rb +43 -0
- data/spec/cql/compression/compression_common.rb +59 -0
- data/spec/cql/compression/snappy_compressor_spec.rb +23 -0
- data/spec/cql/io/io_reactor_spec.rb +8 -1
- data/spec/cql/protocol/cql_protocol_handler_spec.rb +40 -0
- data/spec/cql/protocol/frame_decoder_spec.rb +132 -0
- data/spec/cql/protocol/frame_encoder_spec.rb +105 -0
- data/spec/cql/protocol/requests/credentials_request_spec.rb +2 -4
- data/spec/cql/protocol/requests/execute_request_spec.rb +5 -5
- data/spec/cql/protocol/requests/options_request_spec.rb +10 -4
- data/spec/cql/protocol/requests/prepare_request_spec.rb +3 -3
- data/spec/cql/protocol/requests/query_request_spec.rb +10 -5
- data/spec/cql/protocol/requests/register_request_spec.rb +3 -3
- data/spec/cql/protocol/requests/startup_request_spec.rb +11 -5
- data/spec/cql/protocol/responses/authenticate_response_spec.rb +27 -0
- data/spec/cql/protocol/responses/detailed_error_response_spec.rb +78 -0
- data/spec/cql/protocol/responses/error_response_spec.rb +36 -0
- data/spec/cql/protocol/responses/event_response_spec.rb +40 -0
- data/spec/cql/protocol/responses/prepared_result_response_spec.rb +108 -0
- data/spec/cql/protocol/responses/ready_response_spec.rb +39 -0
- data/spec/cql/protocol/responses/result_response_spec.rb +57 -0
- data/spec/cql/protocol/responses/rows_result_response_spec.rb +273 -0
- data/spec/cql/protocol/responses/schema_change_event_response_spec.rb +93 -0
- data/spec/cql/protocol/responses/schema_change_result_response_spec.rb +51 -19
- data/spec/cql/protocol/responses/set_keyspace_result_response_spec.rb +34 -0
- data/spec/cql/protocol/responses/status_change_event_response_spec.rb +35 -0
- data/spec/cql/protocol/responses/supported_response_spec.rb +27 -0
- data/spec/cql/protocol/responses/topology_change_event_response_spec.rb +35 -0
- data/spec/cql/protocol/responses/void_result_response_spec.rb +29 -0
- data/spec/integration/client_spec.rb +45 -0
- data/spec/integration/protocol_spec.rb +46 -0
- data/spec/spec_helper.rb +2 -1
- data/spec/support/fake_io_reactor.rb +1 -1
- metadata +51 -10
- data/lib/cql/protocol/response_frame.rb +0 -129
- data/spec/cql/protocol/request_spec.rb +0 -45
- data/spec/cql/protocol/response_frame_spec.rb +0 -811
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
|
6
|
+
shared_examples 'compressor' do |algorithm|
|
7
|
+
describe '#algorithm' do
|
8
|
+
it %(returns "#{algorithm}") do
|
9
|
+
described_class.new.algorithm.should == algorithm
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#compress?' do
|
14
|
+
it 'returns true for arguments larger than 64 bytes' do
|
15
|
+
described_class.new.compress?('x' * 65).should be_true
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'returns false for arguments smaller than 64 bytes' do
|
19
|
+
described_class.new.compress?('x' * 64).should be_false
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'is customizable via a constructor argument' do
|
23
|
+
described_class.new(89).compress?('x' * 90).should be_true
|
24
|
+
described_class.new(89).compress?('x' * 89).should be_false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#compress/#decompress' do
|
29
|
+
let :compressor do
|
30
|
+
described_class.new
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'compresses strings' do
|
34
|
+
input = 'hello' * 100
|
35
|
+
compressed = compressor.compress(input)
|
36
|
+
compressed.bytesize.should be < input.bytesize
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'decompresses compressed strings' do
|
40
|
+
input = "\x19\x10helloN\x05\x00"
|
41
|
+
decompressed = compressor.decompress(input)
|
42
|
+
decompressed.should == 'hellohellohellohellohello'
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'decompresses its own compressed output' do
|
46
|
+
input = 'Ķ' * 100
|
47
|
+
output = compressor.decompress(compressor.compress(input))
|
48
|
+
output.force_encoding(::Encoding::UTF_8)
|
49
|
+
output.should == input
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'returns binary strings' do
|
53
|
+
compressed = compressor.compress('hello' * 100)
|
54
|
+
decompressed = compressor.decompress(compressed)
|
55
|
+
compressed.encoding.should == ::Encoding::BINARY
|
56
|
+
decompressed.encoding.should == ::Encoding::BINARY
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'cql/compression/compression_common'
|
5
|
+
|
6
|
+
|
7
|
+
module Cql
|
8
|
+
module Compression
|
9
|
+
begin
|
10
|
+
require 'cql/compression/snappy_compressor'
|
11
|
+
|
12
|
+
describe SnappyCompressor do
|
13
|
+
include_examples 'compressor', 'snappy'
|
14
|
+
end
|
15
|
+
rescue LoadError => e
|
16
|
+
describe 'SnappyCompressor' do
|
17
|
+
it 'supports Snappy' do
|
18
|
+
pending e.message
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -141,7 +141,7 @@ module Cql
|
|
141
141
|
end
|
142
142
|
|
143
143
|
before do
|
144
|
-
protocol_handler_factory.stub(:
|
144
|
+
protocol_handler_factory.stub(:call) do |connection, _|
|
145
145
|
connection.to_io.stub(:connect_nonblock)
|
146
146
|
protocol_handler.stub(:connection).and_return(connection)
|
147
147
|
protocol_handler
|
@@ -165,7 +165,14 @@ module Cql
|
|
165
165
|
reactor.stop if reactor.running?
|
166
166
|
end
|
167
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
|
+
|
168
174
|
it 'calls #new on the protocol handler factory with the connection and the reactor itself' do
|
175
|
+
protocol_handler_factory.stub(:new)
|
169
176
|
reactor.start.value
|
170
177
|
reactor.connect('example.com', 9999, 5).value
|
171
178
|
protocol_handler_factory.should have_received(:new).with(an_instance_of(Connection), reactor)
|
@@ -112,6 +112,46 @@ module Cql
|
|
112
112
|
futures[128].should be_resolved
|
113
113
|
end
|
114
114
|
|
115
|
+
context 'when a compressor is specified' do
|
116
|
+
let :protocol_handler do
|
117
|
+
described_class.new(connection, scheduler, compressor)
|
118
|
+
end
|
119
|
+
|
120
|
+
let :compressor do
|
121
|
+
double(:compressor)
|
122
|
+
end
|
123
|
+
|
124
|
+
let :request do
|
125
|
+
Protocol::PrepareRequest.new('SELECT * FROM things')
|
126
|
+
end
|
127
|
+
|
128
|
+
before do
|
129
|
+
compressor.stub(:compress?).and_return(true)
|
130
|
+
compressor.stub(:compress).and_return('FAKECOMPRESSEDBODY')
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'compresses request frames' do
|
134
|
+
protocol_handler.send_request(request)
|
135
|
+
buffer.to_s.should == [1, 1, 0, 9, 18].pack('C4N') + 'FAKECOMPRESSEDBODY'
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'compresses queued request frames' do
|
139
|
+
130.times { protocol_handler.send_request(request) }
|
140
|
+
compressor.should have_received(:compress).exactly(130).times
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'decompresses response frames' do
|
144
|
+
id = "\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/".force_encoding(::Encoding::BINARY)
|
145
|
+
compressor.stub(:decompress).with('FAKECOMPRESSEDBODY').and_return("\x00\x00\x00\x04" + "\x00\x10" + id + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\ncql_rb_911\x00\x05users\x00\tuser_name\x00\r")
|
146
|
+
f1 = protocol_handler.send_request(request)
|
147
|
+
f2 = protocol_handler.send_request(request)
|
148
|
+
connection.data_listener.call("\x81\x01\x00\x08\x00\x00\x00\x12FAKECOMPRESSEDBODY")
|
149
|
+
connection.data_listener.call("\x81\x01\x01\x08\x00\x00\x00\x12FAKECOMPRESSEDBODY")
|
150
|
+
f1.value.should == Protocol::PreparedResultResponse.new(id, [["cql_rb_911", "users", "user_name", :varchar]], nil)
|
151
|
+
f2.value.should == Protocol::PreparedResultResponse.new(id, [["cql_rb_911", "users", "user_name", :varchar]], nil)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
115
155
|
context 'when the protocol handler closes' do
|
116
156
|
it 'fails all requests waiting for a reply' do
|
117
157
|
futures = Array.new(5) { protocol_handler.send_request(request) }
|
@@ -0,0 +1,132 @@
|
|
1
|
+
# encoding: ascii-8bit
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
|
6
|
+
module Cql
|
7
|
+
module Protocol
|
8
|
+
describe FrameDecoder do
|
9
|
+
let :decoder do
|
10
|
+
described_class.new
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#decode_frame' do
|
14
|
+
context 'with an uncompressed frame' do
|
15
|
+
it 'returns a partial frame when not all the frame\'s bytes are in the buffer' do
|
16
|
+
frame = decoder.decode_frame(ByteBuffer.new)
|
17
|
+
frame.should_not be_complete
|
18
|
+
frame = decoder.decode_frame(ByteBuffer.new("\x81\x00\x00\x02\x00\x00\x00\x16"))
|
19
|
+
frame.should_not be_complete
|
20
|
+
frame = decoder.decode_frame(ByteBuffer.new("\x81\x00\x00\x02\x00\x00\x00\x16\x01\x23\x45"))
|
21
|
+
frame.should_not be_complete
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'returns a complete frame when all bytes are in the buffer' do
|
25
|
+
buffer = ByteBuffer.new
|
26
|
+
buffer << "\x81\x00\x00\x06\x00\x00\x00\x27"
|
27
|
+
buffer << "\x00\x02\x00\x0bCQL_VERSION\x00\x01\x00\x053.0.0\x00\x0bCOMPRESSION\x00\x00"
|
28
|
+
frame = decoder.decode_frame(buffer)
|
29
|
+
frame.should be_complete
|
30
|
+
frame.body.should be_a(Response)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'returns the stream ID' do
|
34
|
+
buffer = ByteBuffer.new("\x81\x00\x03\x02\x00\x00\x00\x00")
|
35
|
+
frame = decoder.decode_frame(buffer)
|
36
|
+
frame.stream_id.should == 3
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns the stream ID when it is negative' do
|
40
|
+
buffer = ByteBuffer.new("\x81\x00\xff\x02\x00\x00\x00\x00")
|
41
|
+
frame = decoder.decode_frame(buffer)
|
42
|
+
frame.stream_id.should == -1
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'first returns a partial frame, then a complete frame' do
|
46
|
+
buffer = ByteBuffer.new
|
47
|
+
buffer << "\x81\x00\x00\x06\x00\x00\x00\x27"
|
48
|
+
frame = decoder.decode_frame(buffer)
|
49
|
+
buffer << "\x00\x02\x00\x0bCQL_VERSION"
|
50
|
+
frame = decoder.decode_frame(buffer, frame)
|
51
|
+
buffer << "\x00\x01\x00\x053.0.0\x00\x0bCOMPRESSION\x00\x00"
|
52
|
+
frame = decoder.decode_frame(buffer, frame)
|
53
|
+
frame.should be_complete
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'leaves extra bytes in the buffer' do
|
57
|
+
buffer = ByteBuffer.new
|
58
|
+
buffer << "\x81\x00\x00\x06\x00\x00\x00\x27"
|
59
|
+
buffer << "\x00\x02\x00\x0bCQL_VERSION\x00\x01\x00\x053.0.0\x00\x0bCOMPRESSION\x00\x00\xca\xfe"
|
60
|
+
frame = decoder.decode_frame(buffer)
|
61
|
+
frame.should be_complete
|
62
|
+
buffer.to_s.should == "\xca\xfe"
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'consumes the number of bytes specified in the frame header' do
|
66
|
+
buffer = ByteBuffer.new
|
67
|
+
buffer << "\x81\x00\x00\x06\x00\x00\x00\x29"
|
68
|
+
buffer << "\x00\x02\x00\x0bCQL_VERSION\x00\x01\x00\x053.0.0\x00\x0bCOMPRESSION\x00\x00\xca\xfe"
|
69
|
+
frame = decoder.decode_frame(buffer)
|
70
|
+
frame.should be_complete
|
71
|
+
buffer.to_s.should be_empty
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'extracts a trace ID' do
|
75
|
+
buffer = ByteBuffer.new
|
76
|
+
buffer << "\x81\x02\x00\x08\x00\x00\x00\x14\a\xE4\xBE\x10?\x03\x11\xE3\x951\xFBr\xEF\xF0_\xBB\x00\x00\x00\x01"
|
77
|
+
frame = decoder.decode_frame(buffer)
|
78
|
+
frame.body.trace_id.should == Uuid.new('07e4be10-3f03-11e3-9531-fb72eff05fbb')
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'complains when the frame is a request frame' do
|
82
|
+
expect { decoder.decode_frame(ByteBuffer.new("\x01\x00\x00\x05\x00\x00\x00\x00")) }.to raise_error(UnsupportedFrameTypeError)
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'complains when the opcode is unknown' do
|
86
|
+
expect { decoder.decode_frame(ByteBuffer.new("\x81\x00\x00\xff\x00\x00\x00\x00")) }.to raise_error(UnsupportedOperationError)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'with a compressed frame' do
|
91
|
+
let :decoder do
|
92
|
+
described_class.new(compressor)
|
93
|
+
end
|
94
|
+
|
95
|
+
let :compressor do
|
96
|
+
double(:compressor)
|
97
|
+
end
|
98
|
+
|
99
|
+
let :buffer do
|
100
|
+
ByteBuffer.new("\x81\x01\x00\x06\x00\x00\x00\x12FAKECOMPRESSEDBODY")
|
101
|
+
end
|
102
|
+
|
103
|
+
before do
|
104
|
+
compressor.stub(:decompress).with('FAKECOMPRESSEDBODY').and_return("\x00\x02\x00\x0bCQL_VERSION\x00\x01\x00\x053.0.0\x00\x0bCOMPRESSION\x00\x00")
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'decompresses the body bytes' do
|
108
|
+
frame = decoder.decode_frame(buffer)
|
109
|
+
frame.body.should be_a(Response)
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'leaves extra bytes in the buffer' do
|
113
|
+
buffer << 'EXTRABYTES'
|
114
|
+
frame = decoder.decode_frame(buffer)
|
115
|
+
buffer.to_s.should == 'EXTRABYTES'
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'extracts a trace ID' do
|
119
|
+
buffer.update(1, "\x03\x00\x08")
|
120
|
+
compressor.stub(:decompress).with('FAKECOMPRESSEDBODY').and_return("\a\xE4\xBE\x10?\x03\x11\xE3\x951\xFBr\xEF\xF0_\xBB\x00\x00\x00\x01")
|
121
|
+
frame = decoder.decode_frame(buffer)
|
122
|
+
frame.body.trace_id.should == Uuid.new('07e4be10-3f03-11e3-9531-fb72eff05fbb')
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'complains when there is no compressor' do
|
126
|
+
expect { described_class.new.decode_frame(buffer) }.to raise_error(UnexpectedCompressionError)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# encoding: ascii-8bit
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
|
6
|
+
module Cql
|
7
|
+
module Protocol
|
8
|
+
describe FrameEncoder do
|
9
|
+
let :encoder do
|
10
|
+
described_class.new
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#encode_frame' do
|
14
|
+
it 'returns a rendered request frame for the specified channel' do
|
15
|
+
request = PrepareRequest.new('SELECT * FROM things')
|
16
|
+
stream_id = 3
|
17
|
+
encoded_frame = encoder.encode_frame(request, stream_id)
|
18
|
+
encoded_frame.to_s.should == "\x01\x00\x03\x09\x00\x00\x00\x18\x00\x00\x00\x14SELECT * FROM things"
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'appends a rendered request frame to the specified buffer' do
|
22
|
+
buffer = ByteBuffer.new('hello')
|
23
|
+
request = PrepareRequest.new('SELECT * FROM things')
|
24
|
+
stream_id = 3
|
25
|
+
encoded_frame = encoder.encode_frame(request, stream_id, buffer)
|
26
|
+
buffer.to_s.should == "hello\x01\x00\x03\x09\x00\x00\x00\x18\x00\x00\x00\x14SELECT * FROM things"
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'returns the specified buffer' do
|
30
|
+
buffer = ByteBuffer.new('hello')
|
31
|
+
request = PrepareRequest.new('SELECT * FROM things')
|
32
|
+
stream_id = 3
|
33
|
+
encoded_frame = encoder.encode_frame(request, stream_id, buffer)
|
34
|
+
encoded_frame.should equal(buffer)
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'with a compressor' do
|
38
|
+
let :encoder do
|
39
|
+
described_class.new(compressor)
|
40
|
+
end
|
41
|
+
|
42
|
+
let :compressor do
|
43
|
+
double(:compressor)
|
44
|
+
end
|
45
|
+
|
46
|
+
let :request do
|
47
|
+
PrepareRequest.new('SELECT * FROM things')
|
48
|
+
end
|
49
|
+
|
50
|
+
let :compressed_frame do
|
51
|
+
encoder.encode_frame(request, 3).to_s
|
52
|
+
end
|
53
|
+
|
54
|
+
before do
|
55
|
+
compressor.stub(:compress?).with("\x00\x00\x00\x14SELECT * FROM things").and_return(true)
|
56
|
+
compressor.stub(:compress).with("\x00\x00\x00\x14SELECT * FROM things").and_return('FAKECOMPRESSEDBODY')
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'sets the compression flag' do
|
60
|
+
compressed_frame[1].should == "\x01"
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'sets the size to the compressed size' do
|
64
|
+
compressed_frame[4, 4].unpack('N').first.should == 18
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'compresses the frame body' do
|
68
|
+
compressed_frame[8, 18].should == 'FAKECOMPRESSEDBODY'
|
69
|
+
compressed_frame.bytesize.should == 26
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'does not clobber the trace flag' do
|
73
|
+
request = PrepareRequest.new('SELECT * FROM things', true)
|
74
|
+
stream_id = 3
|
75
|
+
compressed_frame = encoder.encode_frame(request, stream_id)
|
76
|
+
compressed_frame.to_s[1].should == "\x03"
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'does not compress when the compressor responds to #compress? with false' do
|
80
|
+
compressor.stub(:compress?).and_return(false)
|
81
|
+
compressed_frame[1].should == "\x00"
|
82
|
+
compressed_frame.should include('SELECT * FROM things')
|
83
|
+
compressed_frame.bytesize.should == 32
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe '#change_stream_id' do
|
89
|
+
it 'changes the stream ID byte' do
|
90
|
+
buffer = ByteBuffer.new("\x01\x00\x03\x02\x00\x00\x00\x00")
|
91
|
+
encoder.change_stream_id(99, buffer)
|
92
|
+
buffer.discard(2)
|
93
|
+
buffer.read_byte.should == 99
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'changes the stream ID byte of the frame starting at the specified offset' do
|
97
|
+
buffer = ByteBuffer.new("hello foo\x01\x00\x03\x02\x00\x00\x00\x00")
|
98
|
+
encoder.change_stream_id(99, buffer, 9)
|
99
|
+
buffer.discard(11)
|
100
|
+
buffer.read_byte.should == 99
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -6,12 +6,10 @@ require 'spec_helper'
|
|
6
6
|
module Cql
|
7
7
|
module Protocol
|
8
8
|
describe CredentialsRequest do
|
9
|
-
describe '#
|
9
|
+
describe '#write' do
|
10
10
|
it 'encodes a CREDENTIALS request frame' do
|
11
|
-
bytes = CredentialsRequest.new('username' => 'cassandra', 'password' => 'ardnassac').
|
11
|
+
bytes = CredentialsRequest.new('username' => 'cassandra', 'password' => 'ardnassac').write('')
|
12
12
|
bytes.should == (
|
13
|
-
"\x01\x00\x03\04" +
|
14
|
-
"\x00\x00\x00\x2c" +
|
15
13
|
"\x00\x02" +
|
16
14
|
"\x00\x08username" +
|
17
15
|
"\x00\x09cassandra" +
|
@@ -47,10 +47,10 @@ module Cql
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
describe '#
|
50
|
+
describe '#write' do
|
51
51
|
it 'encodes an EXECUTE request frame' do
|
52
|
-
bytes = ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], :each_quorum).
|
53
|
-
bytes.should == "\
|
52
|
+
bytes = ExecuteRequest.new(id, column_metadata, ['hello', 42, 'foo'], :each_quorum).write('')
|
53
|
+
bytes.should == "\x00\x10\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/\x00\x03\x00\x00\x00\x05hello\x00\x00\x00\x04\x00\x00\x00\x2a\x00\x00\x00\x03foo\x00\x07"
|
54
54
|
end
|
55
55
|
|
56
56
|
specs = [
|
@@ -84,8 +84,8 @@ module Cql
|
|
84
84
|
specs.each do |type, value, expected_bytes|
|
85
85
|
it "encodes #{type} values" do
|
86
86
|
metadata = [['ks', 'tbl', 'id_column', type]]
|
87
|
-
buffer = ExecuteRequest.new(id, metadata, [value], :one).
|
88
|
-
buffer.discard(
|
87
|
+
buffer = ExecuteRequest.new(id, metadata, [value], :one).write(ByteBuffer.new)
|
88
|
+
buffer.discard(2 + 16 + 2)
|
89
89
|
length = buffer.read_int
|
90
90
|
result_bytes = buffer.read(length)
|
91
91
|
result_bytes.should eql_bytes(expected_bytes)
|
@@ -6,10 +6,16 @@ require 'spec_helper'
|
|
6
6
|
module Cql
|
7
7
|
module Protocol
|
8
8
|
describe OptionsRequest do
|
9
|
-
describe '#
|
10
|
-
it '
|
11
|
-
|
12
|
-
|
9
|
+
describe '#compressable?' do
|
10
|
+
it 'is not compressable' do
|
11
|
+
described_class.new.should_not be_compressable
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#write' do
|
16
|
+
it 'encodes an OPTIONS request frame (i.e. an empty body)' do
|
17
|
+
bytes = OptionsRequest.new.write('')
|
18
|
+
bytes.should be_empty
|
13
19
|
end
|
14
20
|
end
|
15
21
|
|