amq-protocol 1.9.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -4
- data/ChangeLog.md +15 -1
- data/Gemfile +3 -2
- data/LICENSE +1 -1
- data/README.md +7 -4
- data/amq-protocol.gemspec +5 -7
- data/lib/amq/protocol/constants.rb +1 -0
- data/lib/amq/protocol/table_value_encoder.rb +4 -4
- data/lib/amq/protocol/version.rb +1 -1
- data/lib/amq/uri.rb +3 -5
- data/spec/amq/bit_set_spec.rb +40 -40
- data/spec/amq/int_allocator_spec.rb +25 -25
- data/spec/amq/pack_spec.rb +5 -5
- data/spec/amq/protocol/basic_spec.rb +58 -58
- data/spec/amq/protocol/blank_body_encoding_spec.rb +2 -2
- data/spec/amq/protocol/channel_spec.rb +22 -22
- data/spec/amq/protocol/confirm_spec.rb +5 -5
- data/spec/amq/protocol/connection_spec.rb +21 -21
- data/spec/amq/protocol/constants_spec.rb +4 -4
- data/spec/amq/protocol/exchange_spec.rb +10 -10
- data/spec/amq/protocol/frame_spec.rb +18 -18
- data/spec/amq/protocol/method_spec.rb +8 -8
- data/spec/amq/protocol/queue_spec.rb +15 -15
- data/spec/amq/protocol/table_spec.rb +50 -57
- data/spec/amq/protocol/tx_spec.rb +6 -6
- data/spec/amq/protocol/value_decoder_spec.rb +18 -18
- data/spec/amq/protocol/value_encoder_spec.rb +41 -41
- data/spec/amq/protocol_spec.rb +174 -174
- data/spec/amq/settings_spec.rb +4 -4
- data/spec/amq/uri_parsing_spec.rb +33 -33
- data/spec/spec_helper.rb +2 -9
- metadata +14 -16
@@ -12,7 +12,7 @@ module AMQ
|
|
12
12
|
Select.decode("\x01")
|
13
13
|
end
|
14
14
|
|
15
|
-
its(:nowait) { should
|
15
|
+
its(:nowait) { should be_truthy }
|
16
16
|
end
|
17
17
|
|
18
18
|
describe '.encode' do
|
@@ -20,8 +20,8 @@ module AMQ
|
|
20
20
|
channel = 1
|
21
21
|
nowait = true
|
22
22
|
method_frame = Select.encode(channel, nowait)
|
23
|
-
method_frame.payload.
|
24
|
-
method_frame.channel.
|
23
|
+
expect(method_frame.payload).to eq("\x00U\x00\n\x01")
|
24
|
+
expect(method_frame.channel).to eq(1)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
@@ -34,8 +34,8 @@ module AMQ
|
|
34
34
|
it 'encodes the parameters into a MethodFrame' do
|
35
35
|
channel = 1
|
36
36
|
method_frame = SelectOk.encode(channel)
|
37
|
-
method_frame.payload.
|
38
|
-
method_frame.channel.
|
37
|
+
expect(method_frame.payload).to eq("\000U\000\v")
|
38
|
+
expect(method_frame.channel).to eq(1)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -29,13 +29,13 @@ module AMQ
|
|
29
29
|
locale = 'en_GB'
|
30
30
|
method_frame = StartOk.encode(client_properties, mechanism, response, locale)
|
31
31
|
# the order of the table parts isn't deterministic in Ruby 1.8
|
32
|
-
method_frame.payload[0, 8].
|
33
|
-
method_frame.payload.
|
34
|
-
method_frame.payload.
|
35
|
-
method_frame.payload.
|
36
|
-
method_frame.payload.
|
37
|
-
method_frame.payload[-28, 28].
|
38
|
-
method_frame.payload.length.
|
32
|
+
expect(method_frame.payload[0, 8]).to eq("\x00\n\x00\v\x00\x00\x00x")
|
33
|
+
expect(method_frame.payload).to include("\bplatformS\x00\x00\x00\nRuby 1.9.2")
|
34
|
+
expect(method_frame.payload).to include("\aproductS\x00\x00\x00\nAMQ Client")
|
35
|
+
expect(method_frame.payload).to include("\vinformationS\x00\x00\x00&http://github.com/ruby-amqp/amq-client")
|
36
|
+
expect(method_frame.payload).to include("\aversionS\x00\x00\x00\x050.2.0")
|
37
|
+
expect(method_frame.payload[-28, 28]).to eq("\x05PLAIN\x00\x00\x00\f\x00guest\x00guest\x05en_GB")
|
38
|
+
expect(method_frame.payload.length).to eq(156)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -46,7 +46,7 @@ module AMQ
|
|
46
46
|
Secure.decode("\x00\x00\x00\x03foo")
|
47
47
|
end
|
48
48
|
|
49
|
-
its(:challenge) { should
|
49
|
+
its(:challenge) { should eq('foo') }
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -55,7 +55,7 @@ module AMQ
|
|
55
55
|
it 'encodes the parameters as a MethodFrame' do
|
56
56
|
response = 'bar'
|
57
57
|
method_frame = SecureOk.encode(response)
|
58
|
-
method_frame.payload.
|
58
|
+
expect(method_frame.payload).to eq("\x00\x0a\x00\x15\x00\x00\x00\x03bar")
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
@@ -66,9 +66,9 @@ module AMQ
|
|
66
66
|
Tune.decode("\x00\x00\x00\x02\x00\x00\x00\x00")
|
67
67
|
end
|
68
68
|
|
69
|
-
its(:channel_max) { should
|
70
|
-
its(:frame_max) { should
|
71
|
-
its(:heartbeat) { should
|
69
|
+
its(:channel_max) { should eq(0) }
|
70
|
+
its(:frame_max) { should eq(131072) }
|
71
|
+
its(:heartbeat) { should eq(0) }
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
@@ -79,7 +79,7 @@ module AMQ
|
|
79
79
|
frame_max = 65536
|
80
80
|
heartbeat = 1
|
81
81
|
method_frame = TuneOk.encode(channel_max, frame_max, heartbeat)
|
82
|
-
method_frame.payload.
|
82
|
+
expect(method_frame.payload).to eq("\x00\n\x00\x1F\x00\x00\x00\x01\x00\x00\x00\x01")
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|
@@ -89,7 +89,7 @@ module AMQ
|
|
89
89
|
it 'encodes the parameters into a MethodFrame' do
|
90
90
|
vhost = '/test'
|
91
91
|
method_frame = Open.encode(vhost)
|
92
|
-
method_frame.payload.
|
92
|
+
expect(method_frame.payload).to eq("\x00\n\x00(\x05/test\x00\x00")
|
93
93
|
end
|
94
94
|
end
|
95
95
|
end
|
@@ -100,7 +100,7 @@ module AMQ
|
|
100
100
|
OpenOk.decode("\x00")
|
101
101
|
end
|
102
102
|
|
103
|
-
its(:known_hosts) { should
|
103
|
+
its(:known_hosts) { should eq('') }
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|
@@ -111,10 +111,10 @@ module AMQ
|
|
111
111
|
Close.decode("\x00\xc8\x07KTHXBAI\x00\x05\x00\x06")
|
112
112
|
end
|
113
113
|
|
114
|
-
its(:reply_code) { should
|
115
|
-
its(:reply_text) { should
|
116
|
-
its(:class_id) { should
|
117
|
-
its(:method_id) { should
|
114
|
+
its(:reply_code) { should eq(200) }
|
115
|
+
its(:reply_text) { should eq('KTHXBAI') }
|
116
|
+
its(:class_id) { should eq(5) }
|
117
|
+
its(:method_id) { should eq(6) }
|
118
118
|
end
|
119
119
|
|
120
120
|
context 'with an error code' do
|
@@ -131,7 +131,7 @@ module AMQ
|
|
131
131
|
class_id = 0
|
132
132
|
method_id = 0
|
133
133
|
method_frame = Close.encode(reply_code, reply_text, class_id, method_id)
|
134
|
-
method_frame.payload.
|
134
|
+
expect(method_frame.payload).to eq("\x00\x0a\x002\x02\x1c\x0fNOT_IMPLEMENTED\x00\x00\x00\x00")
|
135
135
|
end
|
136
136
|
end
|
137
137
|
end
|
@@ -140,7 +140,7 @@ module AMQ
|
|
140
140
|
describe '.encode' do
|
141
141
|
it 'encodes a MethodFrame' do
|
142
142
|
method_frame = CloseOk.encode
|
143
|
-
method_frame.payload.
|
143
|
+
expect(method_frame.payload).to eq("\x00\n\x003")
|
144
144
|
end
|
145
145
|
end
|
146
146
|
end
|
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
require File.expand_path('../../../spec_helper', __FILE__)
|
4
4
|
|
5
|
-
describe "(Some)
|
5
|
+
describe "(Some) AMQ::Protocol constants" do
|
6
6
|
it "include regular port" do
|
7
|
-
AMQ::Protocol::DEFAULT_PORT.
|
7
|
+
expect(AMQ::Protocol::DEFAULT_PORT).to eq(5672)
|
8
8
|
end
|
9
9
|
|
10
10
|
it "provides TLS/SSL port" do
|
11
|
-
AMQ::Protocol::TLS_PORT.
|
12
|
-
AMQ::Protocol::SSL_PORT.
|
11
|
+
expect(AMQ::Protocol::TLS_PORT).to eq(5671)
|
12
|
+
expect(AMQ::Protocol::SSL_PORT).to eq(5671)
|
13
13
|
end
|
14
14
|
end
|
@@ -19,8 +19,8 @@ module AMQ
|
|
19
19
|
nowait = false
|
20
20
|
arguments = nil
|
21
21
|
method_frame = Declare.encode(channel, exchange, type, passive, durable, auto_delete, internal, nowait, arguments)
|
22
|
-
method_frame.payload.
|
23
|
-
method_frame.channel.
|
22
|
+
expect(method_frame.payload).to eq("\x00(\x00\n\x00\x00\x1Famqclient.adapters.em.exchange1\x06fanout\x00\x00\x00\x00\x00")
|
23
|
+
expect(method_frame.channel).to eq(1)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -38,8 +38,8 @@ module AMQ
|
|
38
38
|
nowait = false
|
39
39
|
arguments = nil
|
40
40
|
method_frame = Declare.encode(channel, exchange, type, passive, durable, auto_delete, internal, nowait, arguments)
|
41
|
-
method_frame.payload.
|
42
|
-
method_frame.channel.
|
41
|
+
expect(method_frame.payload).to eq("\x00(\x00\n\x00\x00\texchange2\x06fanout\x00\x00\x00\x00\x00")
|
42
|
+
expect(method_frame.channel).to eq(1)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -52,8 +52,8 @@ module AMQ
|
|
52
52
|
if_unused = false
|
53
53
|
nowait = false
|
54
54
|
method_frame = Delete.encode(channel, exchange, if_unused, nowait)
|
55
|
-
method_frame.payload.
|
56
|
-
method_frame.channel.
|
55
|
+
expect(method_frame.payload).to eq("\x00(\x00\x14\x00\x00\x1Eamqclient.adapters.em.exchange\x00")
|
56
|
+
expect(method_frame.channel).to eq(1)
|
57
57
|
end
|
58
58
|
end
|
59
59
|
end
|
@@ -73,8 +73,8 @@ module AMQ
|
|
73
73
|
nowait = false
|
74
74
|
arguments = nil
|
75
75
|
method_frame = Bind.encode(channel, destination, source, routing_key, nowait, arguments)
|
76
|
-
method_frame.payload.
|
77
|
-
method_frame.channel.
|
76
|
+
expect(method_frame.payload).to eq("\x00(\x00\x1E\x00\x00\x03foo\x03bar\x03xyz\x00\x00\x00\x00\x00")
|
77
|
+
expect(method_frame.channel).to eq(1)
|
78
78
|
end
|
79
79
|
end
|
80
80
|
end
|
@@ -94,8 +94,8 @@ module AMQ
|
|
94
94
|
nowait = false
|
95
95
|
arguments = nil
|
96
96
|
method_frame = Unbind.encode(channel, destination, source, routing_key, nowait, arguments)
|
97
|
-
method_frame.payload.
|
98
|
-
method_frame.channel.
|
97
|
+
expect(method_frame.payload).to eq("\x00(\x00(\x00\x00\x03foo\x03bar\x03xyz\x00\x00\x00\x00\x00")
|
98
|
+
expect(method_frame.channel).to eq(1)
|
99
99
|
end
|
100
100
|
end
|
101
101
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# encoding:
|
1
|
+
# encoding: utf-8
|
2
2
|
|
3
3
|
require File.expand_path('../../../spec_helper', __FILE__)
|
4
4
|
|
@@ -8,7 +8,7 @@ module AMQ
|
|
8
8
|
describe Frame do
|
9
9
|
describe ".encode" do
|
10
10
|
it "should raise FrameTypeError if type isn't one of: [:method, :header, :body, :heartbeat]" do
|
11
|
-
|
11
|
+
expect { Frame.encode(nil, "", 0) }.to raise_error(FrameTypeError)
|
12
12
|
end
|
13
13
|
|
14
14
|
it "should raise FrameTypeError if type isn't valid (when type is a symbol)" do
|
@@ -20,35 +20,35 @@ module AMQ
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should raise RuntimeError if channel isn't 0 or an integer in range 1..65535" do
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
expect { Frame.encode(:method, "", -1) }.to raise_error(RuntimeError, /^Channel has to be 0 or an integer in range 1\.\.65535/)
|
24
|
+
expect { Frame.encode(:method, "", 65536) }.to raise_error(RuntimeError, /^Channel has to be 0 or an integer in range 1\.\.65535/)
|
25
|
+
expect { Frame.encode(:method, "", 65535) }.not_to raise_error
|
26
|
+
expect { Frame.encode(:method, "", 0) }.not_to raise_error
|
27
|
+
expect { Frame.encode(:method, "", 1) }.not_to raise_error
|
28
28
|
end
|
29
29
|
|
30
30
|
it "should raise RuntimeError if payload is nil" do
|
31
|
-
|
31
|
+
expect { Frame.encode(:method, nil, 0) }.to raise_error(RuntimeError, "Payload can't be nil")
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should encode type" do
|
35
|
-
Frame.encode(:body, "", 0).unpack("c").first.
|
35
|
+
expect(Frame.encode(:body, "", 0).unpack("c").first).to eql(3)
|
36
36
|
end
|
37
37
|
|
38
38
|
it "should encode channel" do
|
39
|
-
Frame.encode(:body, "", 12).unpack("cn").last.
|
39
|
+
expect(Frame.encode(:body, "", 12).unpack("cn").last).to eql(12)
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should encode size" do
|
43
|
-
Frame.encode(:body, "test", 12).unpack("cnN").last.
|
43
|
+
expect(Frame.encode(:body, "test", 12).unpack("cnN").last).to eql(4)
|
44
44
|
end
|
45
45
|
|
46
46
|
it "should include payload" do
|
47
|
-
Frame.encode(:body, "test", 12)[7..-2].
|
47
|
+
expect(Frame.encode(:body, "test", 12)[7..-2]).to eql("test")
|
48
48
|
end
|
49
49
|
|
50
50
|
it "should include final octet" do
|
51
|
-
Frame.encode(:body, "test", 12).
|
51
|
+
expect(Frame.encode(:body, "test", 12).each_byte.to_a.last).to eq("CE".hex)
|
52
52
|
end
|
53
53
|
|
54
54
|
it "should encode unicode strings" do
|
@@ -76,20 +76,20 @@ module AMQ
|
|
76
76
|
subject { HeaderFrame.new("\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x98\x00\x18application/octet-stream\x02\x00", nil) }
|
77
77
|
|
78
78
|
it "should decode body_size from payload" do
|
79
|
-
subject.body_size.
|
79
|
+
expect(subject.body_size).to eq(10)
|
80
80
|
end
|
81
81
|
|
82
82
|
it "should decode klass_id from payload" do
|
83
|
-
subject.klass_id.
|
83
|
+
expect(subject.klass_id).to eq(60)
|
84
84
|
end
|
85
85
|
|
86
86
|
it "should decode weight from payload" do
|
87
|
-
subject.weight.
|
87
|
+
expect(subject.weight).to eq(0)
|
88
88
|
end
|
89
89
|
|
90
90
|
it "should decode properties from payload" do
|
91
|
-
subject.properties[:delivery_mode].
|
92
|
-
subject.properties[:priority].
|
91
|
+
expect(subject.properties[:delivery_mode]).to eq(2)
|
92
|
+
expect(subject.properties[:priority]).to eq(0)
|
93
93
|
end
|
94
94
|
end
|
95
95
|
end
|
@@ -10,8 +10,8 @@ module AMQ
|
|
10
10
|
it 'splits user defined headers into properties and headers' do
|
11
11
|
input = {:delivery_mode => 2, :content_type => 'application/octet-stream', :foo => 'bar'}
|
12
12
|
properties, headers = Method.split_headers(input)
|
13
|
-
properties.
|
14
|
-
headers.
|
13
|
+
expect(properties).to eq({:delivery_mode => 2, :content_type => 'application/octet-stream'})
|
14
|
+
expect(headers).to eq({:foo => 'bar'})
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -19,9 +19,9 @@ module AMQ
|
|
19
19
|
context 'when the body fits in a single frame' do
|
20
20
|
it 'encodes a body into a BodyFrame' do
|
21
21
|
body_frames = Method.encode_body('Hello world', 1, 131072)
|
22
|
-
body_frames.first.payload.
|
23
|
-
body_frames.first.channel.
|
24
|
-
body_frames.
|
22
|
+
expect(body_frames.first.payload).to eq('Hello world')
|
23
|
+
expect(body_frames.first.channel).to eq(1)
|
24
|
+
expect(body_frames.size).to eq(1)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -31,15 +31,15 @@ module AMQ
|
|
31
31
|
frame_size = 100
|
32
32
|
expected_payload_size = 92
|
33
33
|
body_frames = Method.encode_body(lipsum, 1, frame_size)
|
34
|
-
body_frames.map(&:payload).
|
34
|
+
expect(body_frames.map(&:payload)).to eq(lipsum.split('').each_slice(expected_payload_size).map(&:join))
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
context 'when the body fits perfectly in a single frame' do
|
39
39
|
it 'encodes a body into a single BodyFrame' do
|
40
40
|
body_frames = Method.encode_body('*' * 131064, 1, 131072)
|
41
|
-
body_frames.first.payload.
|
42
|
-
body_frames.
|
41
|
+
expect(body_frames.first.payload).to eq('*' * 131064)
|
42
|
+
expect(body_frames.size).to eq(1)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -18,8 +18,8 @@ module AMQ
|
|
18
18
|
nowait = false
|
19
19
|
arguments = nil
|
20
20
|
method_frame = Declare.encode(channel, queue, passive, durable, exclusive, auto_delete, nowait, arguments)
|
21
|
-
method_frame.payload.
|
22
|
-
method_frame.channel.
|
21
|
+
expect(method_frame.payload).to eq("\x002\x00\n\x00\x00\vhello.world\x0E\x00\x00\x00\x00")
|
22
|
+
expect(method_frame.channel).to eq(1)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -30,9 +30,9 @@ module AMQ
|
|
30
30
|
DeclareOk.decode(" amq.gen-KduGSqQrpeUo1otnU0TWSA==\x00\x00\x00\x00\x00\x00\x00\x00")
|
31
31
|
end
|
32
32
|
|
33
|
-
its(:queue) { should
|
34
|
-
its(:message_count) { should
|
35
|
-
its(:consumer_count) { should
|
33
|
+
its(:queue) { should eq('amq.gen-KduGSqQrpeUo1otnU0TWSA==') }
|
34
|
+
its(:message_count) { should eq(0) }
|
35
|
+
its(:consumer_count) { should eq(0) }
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -46,8 +46,8 @@ module AMQ
|
|
46
46
|
nowait = false
|
47
47
|
arguments = nil
|
48
48
|
method_frame = Bind.encode(channel, queue, exchange, routing_key, nowait, arguments)
|
49
|
-
method_frame.payload.
|
50
|
-
method_frame.channel.
|
49
|
+
expect(method_frame.payload).to eq("\x002\x00\x14\x00\x00\vhello.world\afoo.bar\x03xyz\x00\x00\x00\x00\x00")
|
50
|
+
expect(method_frame.channel).to eq(1)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
@@ -64,8 +64,8 @@ module AMQ
|
|
64
64
|
queue = 'hello.world'
|
65
65
|
nowait = false
|
66
66
|
method_frame = Purge.encode(channel, queue, nowait)
|
67
|
-
method_frame.payload.
|
68
|
-
method_frame.channel.
|
67
|
+
expect(method_frame.payload).to eq("\x002\x00\x1E\x00\x00\vhello.world\x00")
|
68
|
+
expect(method_frame.channel).to eq(1)
|
69
69
|
end
|
70
70
|
end
|
71
71
|
end
|
@@ -76,7 +76,7 @@ module AMQ
|
|
76
76
|
PurgeOk.decode("\x00\x00\x00\x02")
|
77
77
|
end
|
78
78
|
|
79
|
-
its(:message_count) { should
|
79
|
+
its(:message_count) { should eq(2) }
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
@@ -89,8 +89,8 @@ module AMQ
|
|
89
89
|
if_empty = false
|
90
90
|
nowait = false
|
91
91
|
method_frame = Delete.encode(channel, queue, if_unused, if_empty, nowait)
|
92
|
-
method_frame.payload.
|
93
|
-
method_frame.channel.
|
92
|
+
expect(method_frame.payload).to eq("\x002\x00(\x00\x00\vhello.world\x00")
|
93
|
+
expect(method_frame.channel).to eq(1)
|
94
94
|
end
|
95
95
|
end
|
96
96
|
end
|
@@ -101,7 +101,7 @@ module AMQ
|
|
101
101
|
DeleteOk.decode("\x00\x00\x00\x02")
|
102
102
|
end
|
103
103
|
|
104
|
-
its(:message_count) { should
|
104
|
+
its(:message_count) { should eq(2) }
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
@@ -114,8 +114,8 @@ module AMQ
|
|
114
114
|
routing_key = 'xyz'
|
115
115
|
arguments = nil
|
116
116
|
method_frame = Unbind.encode(channel, queue, exchange, routing_key, arguments)
|
117
|
-
method_frame.payload.
|
118
|
-
method_frame.channel.
|
117
|
+
expect(method_frame.payload).to eq("\x002\x002\x00\x00\vhello.world\afoo.bar\x03xyz\x00\x00\x00\x00")
|
118
|
+
expect(method_frame.channel).to eq(1)
|
119
119
|
end
|
120
120
|
end
|
121
121
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
require File.expand_path('../../../spec_helper', __FILE__)
|
4
4
|
require 'bigdecimal'
|
@@ -11,63 +11,49 @@ module AMQ
|
|
11
11
|
timestamp = Time.utc(2010, 12, 31, 23, 58, 59)
|
12
12
|
bigdecimal_1 = BigDecimal.new("1.0")
|
13
13
|
bigdecimal_2 = BigDecimal.new("5E-3")
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
DATA = if one_point_eight?
|
18
|
-
{
|
19
|
-
{} => "\000\000\000\000",
|
20
|
-
{"test" => 1} => "\000\000\000\n\004testI\000\000\000\001",
|
21
|
-
{"float" => 1.87} => "\000\000\000\017\005floatd?\375\353\205\036\270Q\354",
|
22
|
-
{"test" => "string"} => "\000\000\000\020\004testS\000\000\000\006string",
|
23
|
-
{"test" => {}} => "\000\000\000\n\004testF\000\000\000\000",
|
24
|
-
{"test" => bigdecimal_1} => "\000\000\000\v\004testD\000\000\000\000\001",
|
25
|
-
{"test" => bigdecimal_2} => "\000\000\000\v\004testD\003\000\000\000\005",
|
26
|
-
{"test" => timestamp} => "\000\000\000\016\004testT\000\000\000\000M\036nC"
|
27
|
-
}
|
28
|
-
else
|
29
|
-
{
|
14
|
+
|
15
|
+
|
16
|
+
DATA = {
|
30
17
|
{} => "\x00\x00\x00\x00",
|
31
|
-
{"test" => 1} => "\x00\x00\x00\
|
18
|
+
{"test" => 1} => "\x00\x00\x00\x0E\x04testl\x00\x00\x00\x00\x00\x00\x00\x01",
|
32
19
|
{"float" => 1.92} => "\x00\x00\x00\x0F\x05floatd?\xFE\xB8Q\xEB\x85\x1E\xB8",
|
33
20
|
{"test" => "string"} => "\x00\x00\x00\x10\x04testS\x00\x00\x00\x06string",
|
34
21
|
{"test" => {}} => "\x00\x00\x00\n\x04testF\x00\x00\x00\x00",
|
35
22
|
{"test" => bigdecimal_1} => "\x00\x00\x00\v\x04testD\x00\x00\x00\x00\x01",
|
36
23
|
{"test" => bigdecimal_2} => "\x00\x00\x00\v\x04testD\x03\x00\x00\x00\x05",
|
37
24
|
{"test" => timestamp} => "\x00\x00\x00\x0e\x04testT\x00\x00\x00\x00M\x1enC"
|
38
|
-
|
39
|
-
end
|
25
|
+
}
|
40
26
|
|
41
27
|
describe ".encode" do
|
42
28
|
it "should return \"\x00\x00\x00\x00\" for nil" do
|
43
|
-
encoded_value =
|
44
|
-
"\000\000\000\000"
|
45
|
-
else
|
46
|
-
"\x00\x00\x00\x00"
|
47
|
-
end
|
29
|
+
encoded_value = "\x00\x00\x00\x00"
|
48
30
|
|
49
|
-
Table.encode(nil).
|
31
|
+
expect(Table.encode(nil)).to eql(encoded_value)
|
50
32
|
end
|
51
33
|
|
52
34
|
it "should serialize { :test => true }" do
|
53
|
-
Table.encode(:test => true).
|
35
|
+
expect(Table.encode(:test => true)).
|
36
|
+
to eql("\x00\x00\x00\a\x04testt\x01".force_encoding(Encoding::ASCII_8BIT))
|
54
37
|
end
|
55
38
|
|
56
39
|
it "should serialize { :test => false }" do
|
57
|
-
Table.encode(:test => false).
|
40
|
+
expect(Table.encode(:test => false)).
|
41
|
+
to eql("\x00\x00\x00\a\x04testt\x00".force_encoding(Encoding::ASCII_8BIT))
|
58
42
|
end
|
59
43
|
|
60
44
|
it "should serialize { :coordinates => { :latitude => 59.35 } }" do
|
61
|
-
Table.encode(:coordinates => { :latitude => 59.35 }).
|
45
|
+
expect(Table.encode(:coordinates => { :latitude => 59.35 })).
|
46
|
+
to eql("\x00\x00\x00#\vcoordinatesF\x00\x00\x00\x12\blatituded@M\xAC\xCC\xCC\xCC\xCC\xCD".force_encoding(Encoding::ASCII_8BIT))
|
62
47
|
end
|
63
48
|
|
64
49
|
it "should serialize { :coordinates => { :longitude => 18.066667 } }" do
|
65
|
-
Table.encode(:coordinates => { :longitude => 18.066667 }).
|
50
|
+
expect(Table.encode(:coordinates => { :longitude => 18.066667 })).
|
51
|
+
to eql("\x00\x00\x00$\vcoordinatesF\x00\x00\x00\x13\tlongituded@2\x11\x11\x16\xA8\xB8\xF1".force_encoding(Encoding::ASCII_8BIT))
|
66
52
|
end
|
67
53
|
|
68
54
|
DATA.each do |data, encoded|
|
69
55
|
it "should return #{encoded.inspect} for #{data.inspect}" do
|
70
|
-
Table.encode(data).
|
56
|
+
expect(Table.encode(data)).to eql(encoded.force_encoding(Encoding::ASCII_8BIT))
|
71
57
|
end
|
72
58
|
end
|
73
59
|
end
|
@@ -75,114 +61,121 @@ module AMQ
|
|
75
61
|
describe ".decode" do
|
76
62
|
DATA.each do |data, encoded|
|
77
63
|
it "should return #{data.inspect} for #{encoded.inspect}" do
|
78
|
-
Table.decode(encoded).
|
64
|
+
expect(Table.decode(encoded)).to eql(data)
|
79
65
|
end
|
80
66
|
|
81
67
|
it "is capable of decoding what it encodes" do
|
82
|
-
Table.decode(Table.encode(data)).
|
68
|
+
expect(Table.decode(Table.encode(data))).to eq(data)
|
83
69
|
end
|
84
70
|
end # DATA.each
|
85
71
|
|
86
72
|
|
87
73
|
it "is capable of decoding boolean table values" do
|
88
74
|
input1 = { "boolval" => true }
|
89
|
-
Table.decode(Table.encode(input1)).
|
75
|
+
expect(Table.decode(Table.encode(input1))).to eq(input1)
|
90
76
|
|
91
77
|
|
92
78
|
input2 = { "boolval" => false }
|
93
|
-
Table.decode(Table.encode(input2)).
|
79
|
+
expect(Table.decode(Table.encode(input2))).to eq(input2)
|
94
80
|
end
|
95
81
|
|
96
82
|
|
97
83
|
it "is capable of decoding nil table values" do
|
98
84
|
input = { "nilval" => nil }
|
99
|
-
Table.decode(Table.encode(input)).
|
85
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
100
86
|
end
|
101
87
|
|
102
88
|
it "is capable of decoding nil table in nested hash/map values" do
|
103
89
|
input = { "hash" => {"nil" => nil} }
|
104
|
-
Table.decode(Table.encode(input)).
|
90
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
105
91
|
end
|
106
92
|
|
107
93
|
it "is capable of decoding string table values" do
|
108
94
|
input = { "stringvalue" => "string" }
|
109
|
-
Table.decode(Table.encode(input)).
|
95
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
110
96
|
end
|
111
97
|
|
112
98
|
it "is capable of decoding string table values with UTF-8 characters" do
|
113
|
-
input = {
|
114
|
-
|
99
|
+
input = {
|
100
|
+
"строка".force_encoding(::Encoding::ASCII_8BIT) => "значение".force_encoding(::Encoding::ASCII_8BIT)
|
101
|
+
}
|
102
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
115
103
|
end
|
116
104
|
|
117
105
|
|
118
106
|
it "is capable of decoding integer table values" do
|
119
107
|
input = { "intvalue" => 10 }
|
120
|
-
Table.decode(Table.encode(input)).
|
108
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
121
109
|
end
|
122
110
|
|
123
111
|
|
112
|
+
it "is capable of decoding signed integer table values" do
|
113
|
+
input = { "intvalue" => -10 }
|
114
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
115
|
+
end
|
116
|
+
|
124
117
|
|
125
118
|
it "is capable of decoding long table values" do
|
126
119
|
input = { "longvalue" => 912598613 }
|
127
|
-
Table.decode(Table.encode(input)).
|
120
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
128
121
|
end
|
129
122
|
|
130
123
|
|
131
124
|
|
132
125
|
it "is capable of decoding float table values" do
|
133
126
|
input = { "floatvalue" => 100.0 }
|
134
|
-
Table.decode(Table.encode(input)).
|
127
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
135
128
|
end
|
136
129
|
|
137
130
|
|
138
131
|
|
139
132
|
it "is capable of decoding time table values" do
|
140
133
|
input = { "intvalue" => Time.parse("2011-07-14 01:17:46 +0400") }
|
141
|
-
Table.decode(Table.encode(input)).
|
134
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
142
135
|
end
|
143
136
|
|
144
137
|
|
145
138
|
|
146
139
|
it "is capable of decoding empty hash table values" do
|
147
140
|
input = { "hashvalue" => Hash.new }
|
148
|
-
Table.decode(Table.encode(input)).
|
141
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
149
142
|
end
|
150
143
|
|
151
144
|
|
152
145
|
|
153
146
|
it "is capable of decoding empty array table values" do
|
154
147
|
input = { "arrayvalue" => Array.new }
|
155
|
-
Table.decode(Table.encode(input)).
|
148
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
156
149
|
end
|
157
150
|
|
158
151
|
|
159
152
|
it "is capable of decoding single string value array table values" do
|
160
153
|
input = { "arrayvalue" => ["amq-protocol"] }
|
161
|
-
Table.decode(Table.encode(input)).
|
154
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
162
155
|
end
|
163
156
|
|
164
157
|
|
165
158
|
|
166
159
|
it "is capable of decoding simple nested hash table values" do
|
167
160
|
input = { "hashvalue" => { "a" => "b" } }
|
168
|
-
Table.decode(Table.encode(input)).
|
161
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
169
162
|
end
|
170
163
|
|
171
164
|
|
172
165
|
|
173
166
|
it "is capable of decoding nil table values" do
|
174
167
|
input = { "nil" => nil }
|
175
|
-
Table.decode(Table.encode(input)).
|
168
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
176
169
|
end
|
177
170
|
|
178
171
|
it 'is capable of decoding 8bit signed integers' do
|
179
172
|
output = TableValueDecoder.decode_byte("\xC0",0).first
|
180
|
-
output.
|
173
|
+
expect(output).to eq(192)
|
181
174
|
end
|
182
175
|
|
183
176
|
it 'is capable of decoding 16bit signed integers' do
|
184
177
|
output = TableValueDecoder.decode_short("\x06\x8D", 0).first
|
185
|
-
output.
|
178
|
+
expect(output).to eq(1677)
|
186
179
|
end
|
187
180
|
|
188
181
|
it "is capable of decoding tables" do
|
@@ -195,7 +188,7 @@ module AMQ
|
|
195
188
|
"longval" => 912598613,
|
196
189
|
"hashval" => { "protocol" => "AMQP091", "true" => true, "false" => false, "nil" => nil }
|
197
190
|
}
|
198
|
-
Table.decode(Table.encode(input)).
|
191
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
199
192
|
end
|
200
193
|
|
201
194
|
|
@@ -210,7 +203,7 @@ module AMQ
|
|
210
203
|
"rev" => 1.0,
|
211
204
|
"spec" => {
|
212
205
|
"url" => "http://bit.ly/hw2ELX",
|
213
|
-
"utf8" => "à bientôt"
|
206
|
+
"utf8" => "à bientôt".force_encoding(::Encoding::ASCII_8BIT)
|
214
207
|
}
|
215
208
|
},
|
216
209
|
"true" => true,
|
@@ -218,7 +211,7 @@ module AMQ
|
|
218
211
|
"nil" => nil
|
219
212
|
}
|
220
213
|
}
|
221
|
-
Table.decode(Table.encode(input)).
|
214
|
+
expect(Table.decode(Table.encode(input))).to eq(input)
|
222
215
|
end
|
223
216
|
|
224
217
|
|
@@ -228,7 +221,7 @@ module AMQ
|
|
228
221
|
"arrayval1" => [198, 3, 77, 8.0, ["inner", "array", { "oh" => "well", "it" => "should work", "3" => 6 }], "two", { "a" => "value", "is" => nil }],
|
229
222
|
"arrayval2" => [198, 3, 77, "two", { "a" => "value", "is" => nil }, 8.0, ["inner", "array", { "oh" => "well", "it" => "should work", "3" => 6 }]]
|
230
223
|
}
|
231
|
-
Table.decode(Table.encode(input1)).
|
224
|
+
expect(Table.decode(Table.encode(input1))).to eq(input1)
|
232
225
|
|
233
226
|
now = Time.now
|
234
227
|
input2 = {
|
@@ -244,10 +237,10 @@ module AMQ
|
|
244
237
|
"ary_field" => ["one", 2.0, 3]
|
245
238
|
}
|
246
239
|
|
247
|
-
Table.decode(Table.encode(input2)).
|
240
|
+
expect(Table.decode(Table.encode(input2))).to eq(input2)
|
248
241
|
|
249
242
|
input3 = { "timely" => { "now" => now } }
|
250
|
-
Table.decode(Table.encode(input3))["timely"]["now"].to_i.
|
243
|
+
expect(Table.decode(Table.encode(input3))["timely"]["now"].to_i).to eq(now.to_i)
|
251
244
|
end
|
252
245
|
|
253
246
|
end # describe
|