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.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -11
  3. data/lib/cql.rb +1 -0
  4. data/lib/cql/client.rb +41 -9
  5. data/lib/cql/client/asynchronous_client.rb +9 -4
  6. data/lib/cql/client/asynchronous_prepared_statement.rb +2 -2
  7. data/lib/cql/client/connection_helper.rb +43 -20
  8. data/lib/cql/client/execute_options_decoder.rb +4 -1
  9. data/lib/cql/client/query_result.rb +7 -3
  10. data/lib/cql/client/query_trace.rb +46 -0
  11. data/lib/cql/client/request_runner.rb +7 -2
  12. data/lib/cql/client/void_result.rb +42 -0
  13. data/lib/cql/compression.rb +53 -0
  14. data/lib/cql/compression/snappy_compressor.rb +42 -0
  15. data/lib/cql/io/io_reactor.rb +9 -4
  16. data/lib/cql/protocol.rb +5 -3
  17. data/lib/cql/protocol/cql_protocol_handler.rb +14 -9
  18. data/lib/cql/protocol/frame_decoder.rb +106 -0
  19. data/lib/cql/protocol/frame_encoder.rb +31 -0
  20. data/lib/cql/protocol/request.rb +7 -11
  21. data/lib/cql/protocol/requests/execute_request.rb +2 -2
  22. data/lib/cql/protocol/requests/options_request.rb +4 -0
  23. data/lib/cql/protocol/requests/prepare_request.rb +2 -2
  24. data/lib/cql/protocol/requests/query_request.rb +2 -2
  25. data/lib/cql/protocol/requests/startup_request.rb +12 -5
  26. data/lib/cql/protocol/response.rb +13 -2
  27. data/lib/cql/protocol/responses/authenticate_response.rb +5 -1
  28. data/lib/cql/protocol/responses/detailed_error_response.rb +2 -2
  29. data/lib/cql/protocol/responses/error_response.rb +7 -2
  30. data/lib/cql/protocol/responses/event_response.rb +4 -2
  31. data/lib/cql/protocol/responses/prepared_result_response.rb +20 -4
  32. data/lib/cql/protocol/responses/ready_response.rb +5 -1
  33. data/lib/cql/protocol/responses/result_response.rb +10 -2
  34. data/lib/cql/protocol/responses/rows_result_response.rb +5 -4
  35. data/lib/cql/protocol/responses/schema_change_event_response.rb +1 -1
  36. data/lib/cql/protocol/responses/schema_change_result_response.rb +5 -4
  37. data/lib/cql/protocol/responses/set_keyspace_result_response.rb +4 -3
  38. data/lib/cql/protocol/responses/{status_change_event_result_response.rb → status_change_event_response.rb} +1 -1
  39. data/lib/cql/protocol/responses/supported_response.rb +5 -1
  40. data/lib/cql/protocol/responses/{topology_change_event_result_response.rb → topology_change_event_response.rb} +0 -0
  41. data/lib/cql/protocol/responses/void_result_response.rb +2 -2
  42. data/lib/cql/version.rb +1 -1
  43. data/spec/cql/client/asynchronous_client_spec.rb +52 -31
  44. data/spec/cql/client/asynchronous_prepared_statement_spec.rb +16 -2
  45. data/spec/cql/client/connection_helper_spec.rb +90 -12
  46. data/spec/cql/client/query_trace_spec.rb +138 -0
  47. data/spec/cql/client/request_runner_spec.rb +44 -7
  48. data/spec/cql/client/void_result_spec.rb +43 -0
  49. data/spec/cql/compression/compression_common.rb +59 -0
  50. data/spec/cql/compression/snappy_compressor_spec.rb +23 -0
  51. data/spec/cql/io/io_reactor_spec.rb +8 -1
  52. data/spec/cql/protocol/cql_protocol_handler_spec.rb +40 -0
  53. data/spec/cql/protocol/frame_decoder_spec.rb +132 -0
  54. data/spec/cql/protocol/frame_encoder_spec.rb +105 -0
  55. data/spec/cql/protocol/requests/credentials_request_spec.rb +2 -4
  56. data/spec/cql/protocol/requests/execute_request_spec.rb +5 -5
  57. data/spec/cql/protocol/requests/options_request_spec.rb +10 -4
  58. data/spec/cql/protocol/requests/prepare_request_spec.rb +3 -3
  59. data/spec/cql/protocol/requests/query_request_spec.rb +10 -5
  60. data/spec/cql/protocol/requests/register_request_spec.rb +3 -3
  61. data/spec/cql/protocol/requests/startup_request_spec.rb +11 -5
  62. data/spec/cql/protocol/responses/authenticate_response_spec.rb +27 -0
  63. data/spec/cql/protocol/responses/detailed_error_response_spec.rb +78 -0
  64. data/spec/cql/protocol/responses/error_response_spec.rb +36 -0
  65. data/spec/cql/protocol/responses/event_response_spec.rb +40 -0
  66. data/spec/cql/protocol/responses/prepared_result_response_spec.rb +108 -0
  67. data/spec/cql/protocol/responses/ready_response_spec.rb +39 -0
  68. data/spec/cql/protocol/responses/result_response_spec.rb +57 -0
  69. data/spec/cql/protocol/responses/rows_result_response_spec.rb +273 -0
  70. data/spec/cql/protocol/responses/schema_change_event_response_spec.rb +93 -0
  71. data/spec/cql/protocol/responses/schema_change_result_response_spec.rb +51 -19
  72. data/spec/cql/protocol/responses/set_keyspace_result_response_spec.rb +34 -0
  73. data/spec/cql/protocol/responses/status_change_event_response_spec.rb +35 -0
  74. data/spec/cql/protocol/responses/supported_response_spec.rb +27 -0
  75. data/spec/cql/protocol/responses/topology_change_event_response_spec.rb +35 -0
  76. data/spec/cql/protocol/responses/void_result_response_spec.rb +29 -0
  77. data/spec/integration/client_spec.rb +45 -0
  78. data/spec/integration/protocol_spec.rb +46 -0
  79. data/spec/spec_helper.rb +2 -1
  80. data/spec/support/fake_io_reactor.rb +1 -1
  81. metadata +51 -10
  82. data/lib/cql/protocol/response_frame.rb +0 -129
  83. data/spec/cql/protocol/request_spec.rb +0 -45
  84. data/spec/cql/protocol/response_frame_spec.rb +0 -811
@@ -12,10 +12,10 @@ module Cql
12
12
  end
13
13
  end
14
14
 
15
- describe '#encode_frame' do
15
+ describe '#write' do
16
16
  it 'encodes a PREPARE request frame' do
17
- bytes = PrepareRequest.new('UPDATE users SET email = ? WHERE user_name = ?').encode_frame(3)
18
- bytes.should == "\x01\x00\x03\x09\x00\x00\x00\x32\x00\x00\x00\x2eUPDATE users SET email = ? WHERE user_name = ?"
17
+ bytes = PrepareRequest.new('UPDATE users SET email = ? WHERE user_name = ?').write('')
18
+ bytes.should == "\x00\x00\x00\x2eUPDATE users SET email = ? WHERE user_name = ?"
19
19
  end
20
20
  end
21
21
 
@@ -20,15 +20,20 @@ module Cql
20
20
  end
21
21
  end
22
22
 
23
- describe '#encode_frame' do
23
+ describe '#write' do
24
24
  it 'encodes a QUERY request frame' do
25
- bytes = QueryRequest.new('USE system', :all).encode_frame(3)
26
- bytes.should == "\x01\x00\x03\x07\x00\x00\x00\x10\x00\x00\x00\x0aUSE system\x00\x05"
25
+ bytes = QueryRequest.new('USE system', :all).write('')
26
+ bytes.should == "\x00\x00\x00\x0aUSE system\x00\x05"
27
+ end
28
+
29
+ it 'encodes a QUERY request frame with tracing' do
30
+ bytes = QueryRequest.new('USE system', :all, true).write('')
31
+ bytes.should == "\x00\x00\x00\x0aUSE system\x00\x05"
27
32
  end
28
33
 
29
34
  it 'correctly encodes queries with multibyte characters' do
30
- bytes = QueryRequest.new("INSERT INTO users (user_id, first, last, age) VALUES ('test', 'ümlaut', 'test', 1)", :all).encode_frame(3)
31
- bytes.should eql_bytes("\x01\x00\x03\a\x00\x00\x00Y\x00\x00\x00SINSERT INTO users (user_id, first, last, age) VALUES ('test', '\xC3\xBCmlaut', 'test', 1)\x00\x05")
35
+ bytes = QueryRequest.new("INSERT INTO users (user_id, first, last, age) VALUES ('test', 'ümlaut', 'test', 1)", :all).write('')
36
+ bytes.should eql_bytes("\x00\x00\x00SINSERT INTO users (user_id, first, last, age) VALUES ('test', '\xC3\xBCmlaut', 'test', 1)\x00\x05")
32
37
  end
33
38
  end
34
39
 
@@ -6,10 +6,10 @@ require 'spec_helper'
6
6
  module Cql
7
7
  module Protocol
8
8
  describe RegisterRequest do
9
- describe '#encode_frame' do
9
+ describe '#write' do
10
10
  it 'encodes a REGISTER request frame' do
11
- bytes = RegisterRequest.new('TOPOLOGY_CHANGE', 'STATUS_CHANGE').encode_frame(3)
12
- bytes.should == "\x01\x00\x03\x0b\x00\x00\x00\x22\x00\x02\x00\x0fTOPOLOGY_CHANGE\x00\x0dSTATUS_CHANGE"
11
+ bytes = RegisterRequest.new('TOPOLOGY_CHANGE', 'STATUS_CHANGE').write('')
12
+ bytes.should == "\x00\x02\x00\x0fTOPOLOGY_CHANGE\x00\x0dSTATUS_CHANGE"
13
13
  end
14
14
  end
15
15
 
@@ -6,15 +6,21 @@ require 'spec_helper'
6
6
  module Cql
7
7
  module Protocol
8
8
  describe StartupRequest do
9
- describe '#encode_frame' do
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
10
16
  it 'encodes a STARTUP request frame' do
11
- bytes = StartupRequest.new('3.0.0', 'snappy').encode_frame(3)
12
- bytes.should == "\x01\x00\x03\x01\x00\x00\x00\x2b\x00\x02\x00\x0bCQL_VERSION\x00\x053.0.0\x00\x0bCOMPRESSION\x00\x06snappy"
17
+ bytes = StartupRequest.new('3.0.0', 'snappy').write('')
18
+ bytes.should == "\x00\x02\x00\x0bCQL_VERSION\x00\x053.0.0\x00\x0bCOMPRESSION\x00\x06snappy"
13
19
  end
14
20
 
15
21
  it 'defaults to CQL 3.0.0 and no compression' do
16
- bytes = StartupRequest.new.encode_frame(3)
17
- bytes.should == "\x01\x00\x03\x01\x00\x00\x00\x16\x00\x01\x00\x0bCQL_VERSION\x00\x053.0.0"
22
+ bytes = StartupRequest.new.write('')
23
+ bytes.should == "\x00\x01\x00\x0bCQL_VERSION\x00\x053.0.0"
18
24
  end
19
25
  end
20
26
 
@@ -0,0 +1,27 @@
1
+ # encoding: ascii-8bit
2
+
3
+ require 'spec_helper'
4
+
5
+
6
+ module Cql
7
+ module Protocol
8
+ describe AuthenticateResponse do
9
+ describe '.decode!' do
10
+ let :response do
11
+ described_class.decode!(ByteBuffer.new("\x00\x2forg.apache.cassandra.auth.PasswordAuthenticator"))
12
+ end
13
+
14
+ it 'decodes the authentication class' do
15
+ response.authentication_class.should == 'org.apache.cassandra.auth.PasswordAuthenticator'
16
+ end
17
+ end
18
+
19
+ describe '#to_s' do
20
+ it 'returns a string with the authentication class' do
21
+ response = described_class.new('org.apache.cassandra.auth.PasswordAuthenticator')
22
+ response.to_s.should == 'AUTHENTICATE org.apache.cassandra.auth.PasswordAuthenticator'
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,78 @@
1
+ # encoding: ascii-8bit
2
+
3
+ require 'spec_helper'
4
+
5
+
6
+ module Cql
7
+ module Protocol
8
+ describe DetailedErrorResponse do
9
+ describe '.decode!' do
10
+ it 'decodes an unavailable error' do
11
+ response = described_class.decode!(0x1000, '', ByteBuffer.new("\x00\x05\x00\x00\x00\x03\x00\x00\x00\x02"))
12
+ response.details.should == {
13
+ :cl => :all,
14
+ :required => 3,
15
+ :alive => 2
16
+ }
17
+ end
18
+
19
+ it 'decodes a write_timeout error' do
20
+ response = described_class.decode!(0x1100, '', ByteBuffer.new("\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\tBATCH_LOG"))
21
+ response.details.should == {
22
+ :cl => :one,
23
+ :received => 0,
24
+ :blockfor => 1,
25
+ :write_type => 'BATCH_LOG'
26
+ }
27
+ end
28
+
29
+ it 'decodes a read_timeout error' do
30
+ response = described_class.decode!(0x1200, '', ByteBuffer.new("\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x01"))
31
+ response.details.should == {
32
+ :cl => :one,
33
+ :received => 0,
34
+ :blockfor => 1,
35
+ :data_present => true
36
+ }
37
+ response = described_class.decode!(0x1200, '', ByteBuffer.new("\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00"))
38
+ response.details.should == {
39
+ :cl => :one,
40
+ :received => 0,
41
+ :blockfor => 1,
42
+ :data_present => false
43
+ }
44
+ end
45
+
46
+ it 'decodes an already_exists error with a keyspace' do
47
+ response = described_class.decode!(0x2400, '', ByteBuffer.new("\x00\x05stuff\x00\x00"))
48
+ response.details.should == {
49
+ :ks => 'stuff',
50
+ :table => '',
51
+ }
52
+ end
53
+
54
+ it 'decodes an already_exists error with a keyspace and table' do
55
+ response = described_class.decode!(0x2400, '', ByteBuffer.new("\x00\x05stuff\x00\x06things"))
56
+ response.details.should == {
57
+ :ks => 'stuff',
58
+ :table => 'things',
59
+ }
60
+ end
61
+
62
+ it 'decodes unprepared error' do
63
+ response = described_class.decode!(0x2500, '', ByteBuffer.new("\x00\x10\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/"))
64
+ response.details.should == {
65
+ :id => "\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/"
66
+ }
67
+ end
68
+ end
69
+
70
+ describe '#to_s' do
71
+ it 'returns a string with the error code, message and details' do
72
+ response = described_class.new(0xffff, 'This is an error', {:foo => 'bar'})
73
+ response.to_s.should == 'ERROR 0xFFFF "This is an error" {:foo=>"bar"}'
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,36 @@
1
+ # encoding: ascii-8bit
2
+
3
+ require 'spec_helper'
4
+
5
+
6
+ module Cql
7
+ module Protocol
8
+ describe ErrorResponse do
9
+ describe '.decode!' do
10
+ let :response do
11
+ described_class.decode!(ByteBuffer.new("\x00\x00\x00\n\x00PProvided version 4.0.0 is not supported by this server (supported: 2.0.0, 3.0.0)"))
12
+ end
13
+
14
+ it 'decodes the error code' do
15
+ response.code.should == 10
16
+ end
17
+
18
+ it 'decodes the error message' do
19
+ response.message.should == 'Provided version 4.0.0 is not supported by this server (supported: 2.0.0, 3.0.0)'
20
+ end
21
+
22
+ it 'decodes error frames with details' do
23
+ response = described_class.decode!(ByteBuffer.new("\x00\x00\x11\x00\x000Operation timed out - received only 0 responses.\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\tBATCH_LOG"))
24
+ response.details.should_not be_nil
25
+ end
26
+ end
27
+
28
+ describe '#to_s' do
29
+ it 'returns a string with the error code and the message' do
30
+ response = described_class.new(0xffff, 'This is an error')
31
+ response.to_s.should == 'ERROR 0xFFFF "This is an error"'
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: ascii-8bit
2
+
3
+ require 'spec_helper'
4
+
5
+
6
+ module Cql
7
+ module Protocol
8
+ describe EventResponse do
9
+ describe '.decode!' do
10
+ it 'decodes a SCHEMA_CHANGE event' do
11
+ response = described_class.decode!(ByteBuffer.new("\x00\rSCHEMA_CHANGE\x00\aDROPPED\x00\ncql_rb_609\x00\x05users"))
12
+ response.type.should == 'SCHEMA_CHANGE'
13
+ response.change.should == 'DROPPED'
14
+ response.keyspace.should == 'cql_rb_609'
15
+ response.table.should == 'users'
16
+ end
17
+
18
+ it 'decodes a STATUS_CHANGE event' do
19
+ response = described_class.decode!(ByteBuffer.new("\x00\rSTATUS_CHANGE\x00\x04DOWN\x04\x00\x00\x00\x00\x00\x00#R"))
20
+ response.type.should == 'STATUS_CHANGE'
21
+ response.change.should == 'DOWN'
22
+ response.address.should == IPAddr.new('0.0.0.0')
23
+ response.port.should == 9042
24
+ end
25
+
26
+ it 'decodes a TOPOLOGY_CHANGE event' do
27
+ response = described_class.decode!(ByteBuffer.new("\x00\x0FTOPOLOGY_CHANGE\x00\fREMOVED_NODE\x04\x00\x00\x00\x00\x00\x00#R"))
28
+ response.type.should == 'TOPOLOGY_CHANGE'
29
+ response.change.should == 'REMOVED_NODE'
30
+ response.address.should == IPAddr.new('0.0.0.0')
31
+ response.port.should == 9042
32
+ end
33
+
34
+ it 'complains when asked to decode an unknown event type' do
35
+ expect { described_class.decode!(ByteBuffer.new("\x00\x04PING")) }.to raise_error(UnsupportedEventTypeError, /PING/)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,108 @@
1
+ # encoding: ascii-8bit
2
+
3
+ require 'spec_helper'
4
+
5
+
6
+ module Cql
7
+ module Protocol
8
+ describe PreparedResultResponse do
9
+ describe '.decode!' do
10
+ let :response do
11
+ described_class.decode!(ByteBuffer.new("\x00\x10\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/\x00\x00\x00\x01\x00\x00\x00\x01\x00\ncql_rb_911\x00\x05users\x00\tuser_name\x00\r"))
12
+ end
13
+
14
+ it 'decodes the ID' do
15
+ response.id.should == "\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/"
16
+ end
17
+
18
+ it 'decodes the column metadata' do
19
+ response.metadata.should == [['cql_rb_911', 'users', 'user_name', :varchar]]
20
+ end
21
+ end
22
+
23
+ describe '#void?' do
24
+ it 'is not void' do
25
+ response = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
26
+ response.should_not be_void
27
+ end
28
+ end
29
+
30
+ describe '#to_s' do
31
+ it 'returns a string with the ID and metadata' do
32
+ response = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
33
+ response.to_s.should match(/^RESULT PREPARED [0-9a-f]{32} \[\["ks", "tbl", "col", :varchar\]\]$/)
34
+ end
35
+ end
36
+
37
+ describe '#eql?' do
38
+ it 'is equal to an identical response' do
39
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
40
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
41
+ r1.should eql(r2)
42
+ end
43
+
44
+ it 'is not equal when the IDs differ' do
45
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
46
+ r2 = described_class.new("\x00" * 16, [['ks', 'tbl', 'col', :varchar]], nil)
47
+ r1.should_not eql(r2)
48
+ end
49
+
50
+ it 'is not equal when the metadata differ' do
51
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
52
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar], ['ks', 'tbl', 'col2', :uuid]], nil)
53
+ r1.should_not eql(r2)
54
+ end
55
+
56
+ it 'is not equal when one has a trace ID' do
57
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], Uuid.new('00b69180-d0e1-11e2-8b8b-0800200c9a66'))
58
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
59
+ r1.should_not eql(r2)
60
+ end
61
+
62
+ it 'is not equal when the trace IDs differ' do
63
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], Uuid.new('00b69180-d0e1-11e2-8b8b-0800200c9a66'))
64
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], Uuid.new('11111111-d0e1-11e2-8b8b-0800200c9a66'))
65
+ r1.should_not eql(r2)
66
+ end
67
+
68
+ it 'is aliased as ==' do
69
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
70
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
71
+ r1.should == r2
72
+ end
73
+ end
74
+
75
+ describe '#hash' do
76
+ it 'is the same for an identical response' do
77
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
78
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
79
+ r1.hash.should == r2.hash
80
+ end
81
+
82
+ it 'is not the same when the IDs differ' do
83
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
84
+ r2 = described_class.new("\x00" * 16, [['ks', 'tbl', 'col', :varchar]], nil)
85
+ r1.hash.should_not == r2.hash
86
+ end
87
+
88
+ it 'is not the same when the metadata differ' do
89
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
90
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar], ['ks', 'tbl', 'col2', :uuid]], nil)
91
+ r1.hash.should_not == r2.hash
92
+ end
93
+
94
+ it 'is not the same when one has a trace ID' do
95
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], Uuid.new('00b69180-d0e1-11e2-8b8b-0800200c9a66'))
96
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], nil)
97
+ r1.hash.should_not == r2.hash
98
+ end
99
+
100
+ it 'is not equal when the trace IDs differ' do
101
+ r1 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], Uuid.new('00b69180-d0e1-11e2-8b8b-0800200c9a66'))
102
+ r2 = described_class.new("\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/", [['ks', 'tbl', 'col', :varchar]], Uuid.new('11111111-d0e1-11e2-8b8b-0800200c9a66'))
103
+ r1.hash.should_not == r2.hash
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,39 @@
1
+ # encoding: ascii-8bit
2
+
3
+ require 'spec_helper'
4
+
5
+
6
+ module Cql
7
+ module Protocol
8
+ describe ReadyResponse do
9
+ describe '.decode!' do
10
+ it 'returns a new instance' do
11
+ unused_byte_buffer = nil
12
+ described_class.decode!(unused_byte_buffer).should be_a(described_class)
13
+ end
14
+ end
15
+
16
+ describe '#to_s' do
17
+ it 'returns a string' do
18
+ described_class.new.to_s.should == 'READY'
19
+ end
20
+ end
21
+
22
+ describe '#eql?' do
23
+ it 'is equal to all other ready responses' do
24
+ described_class.new.should eql(described_class.new)
25
+ end
26
+
27
+ it 'aliased as ==' do
28
+ described_class.new.should == described_class.new
29
+ end
30
+ end
31
+
32
+ describe '#hash' do
33
+ it 'has the same hash code as all other ready responses' do
34
+ described_class.new.hash.should == described_class.new.hash
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,57 @@
1
+ # encoding: ascii-8bit
2
+
3
+ require 'spec_helper'
4
+
5
+
6
+ module Cql
7
+ module Protocol
8
+ describe ResultResponse do
9
+ describe '.decode!' do
10
+ it 'decodes a set_keyspace result' do
11
+ response = described_class.decode!(ByteBuffer.new("\x00\x00\x00\x03\x00\x06system"))
12
+ response.should_not be_void
13
+ response.keyspace.should == 'system'
14
+ end
15
+
16
+ it 'decodes a schema_change CREATED result' do
17
+ response = described_class.decode!(ByteBuffer.new("\x00\x00\x00\x05\x00\aCREATED\x00\ncql_rb_477\x00\x00"))
18
+ response.should_not be_void
19
+ response.change.should == 'CREATED'
20
+ response.keyspace.should == 'cql_rb_477'
21
+ response.table.should be_empty
22
+ end
23
+
24
+ it 'decodes a schema_change UPDATED result' do
25
+ response = described_class.decode!(ByteBuffer.new("\x00\x00\x00\x05\x00\aUPDATED\x00\ncql_rb_973\x00\x05users"))
26
+ response.should_not be_void
27
+ response.change.should == 'UPDATED'
28
+ response.keyspace.should == 'cql_rb_973'
29
+ response.table.should == 'users'
30
+ end
31
+
32
+ it 'decodes a void result' do
33
+ response = described_class.decode!(ByteBuffer.new("\x00\x00\x00\x01"))
34
+ response.should be_void
35
+ end
36
+
37
+ it 'decodes a rows result' do
38
+ response = described_class.decode!(ByteBuffer.new("\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\x00\ncql_rb_126\x00\x05users\x00\tuser_name\x00\r\x00\x05email\x00\r\x00\bpassword\x00\r\x00\x00\x00\x02\x00\x00\x00\x04phil\x00\x00\x00\rphil@heck.com\xFF\xFF\xFF\xFF\x00\x00\x00\x03sue\x00\x00\x00\rsue@inter.net\xFF\xFF\xFF\xFF"))
39
+ response.should_not be_void
40
+ response.rows.size.should == 2
41
+ response.metadata.size.should == 3
42
+ end
43
+
44
+ it 'decodes a prepared result' do
45
+ response = described_class.decode!(ByteBuffer.new("\x00\x00\x00\x04\x00\x10\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/\x00\x00\x00\x01\x00\x00\x00\x01\x00\ncql_rb_911\x00\x05users\x00\tuser_name\x00\r"))
46
+ response.should_not be_void
47
+ response.id.should == "\xCAH\x7F\x1Ez\x82\xD2<N\x8A\xF35Qq\xA5/"
48
+ response.metadata.size.should == 1
49
+ end
50
+
51
+ it 'complains when asked to decode an unknown result type' do
52
+ expect { described_class.decode!(ByteBuffer.new("\x00\x00\x00\xffhello")) }.to raise_error(UnsupportedResultKindError)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end