amq-protocol 1.9.2 → 2.0.0
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/.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
|