cql-rb 1.1.3 → 1.2.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/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
|
|