bunny 1.7.1 → 2.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/CONTRIBUTING.md +14 -0
  4. data/ChangeLog.md +21 -6
  5. data/Gemfile +1 -1
  6. data/LICENSE +1 -1
  7. data/README.md +22 -23
  8. data/bunny.gemspec +1 -1
  9. data/lib/bunny/channel.rb +12 -0
  10. data/lib/bunny/concurrent/continuation_queue.rb +30 -13
  11. data/lib/bunny/exchange.rb +0 -5
  12. data/lib/bunny/jruby/socket.rb +1 -2
  13. data/lib/bunny/queue.rb +9 -0
  14. data/lib/bunny/session.rb +7 -6
  15. data/lib/bunny/version.rb +1 -1
  16. data/spec/higher_level_api/integration/basic_ack_spec.rb +9 -9
  17. data/spec/higher_level_api/integration/basic_cancel_spec.rb +4 -4
  18. data/spec/higher_level_api/integration/basic_consume_spec.rb +22 -22
  19. data/spec/higher_level_api/integration/basic_consume_with_objects_spec.rb +1 -1
  20. data/spec/higher_level_api/integration/basic_get_spec.rb +2 -2
  21. data/spec/higher_level_api/integration/basic_nack_spec.rb +6 -6
  22. data/spec/higher_level_api/integration/basic_publish_spec.rb +14 -14
  23. data/spec/higher_level_api/integration/basic_qos_spec.rb +11 -2
  24. data/spec/higher_level_api/integration/basic_recover_spec.rb +2 -2
  25. data/spec/higher_level_api/integration/basic_reject_spec.rb +6 -6
  26. data/spec/higher_level_api/integration/basic_return_spec.rb +1 -1
  27. data/spec/higher_level_api/integration/channel_close_spec.rb +2 -2
  28. data/spec/higher_level_api/integration/channel_open_spec.rb +11 -11
  29. data/spec/higher_level_api/integration/connection_recovery_spec.rb +52 -52
  30. data/spec/higher_level_api/integration/connection_spec.rb +83 -83
  31. data/spec/higher_level_api/integration/connection_stop_spec.rb +11 -11
  32. data/spec/higher_level_api/integration/consistent_hash_exchange_spec.rb +2 -2
  33. data/spec/higher_level_api/integration/consumer_cancellation_notification_spec.rb +3 -3
  34. data/spec/higher_level_api/integration/dead_lettering_spec.rb +6 -6
  35. data/spec/higher_level_api/integration/exchange_bind_spec.rb +1 -1
  36. data/spec/higher_level_api/integration/exchange_declare_spec.rb +20 -20
  37. data/spec/higher_level_api/integration/exchange_delete_spec.rb +11 -11
  38. data/spec/higher_level_api/integration/exchange_unbind_spec.rb +2 -2
  39. data/spec/higher_level_api/integration/merry_go_round_spec.rb +2 -2
  40. data/spec/higher_level_api/integration/message_properties_access_spec.rb +27 -27
  41. data/spec/higher_level_api/integration/predeclared_exchanges_spec.rb +1 -1
  42. data/spec/higher_level_api/integration/publisher_confirms_spec.rb +19 -19
  43. data/spec/higher_level_api/integration/publishing_edge_cases_spec.rb +9 -9
  44. data/spec/higher_level_api/integration/queue_bind_spec.rb +13 -13
  45. data/spec/higher_level_api/integration/queue_declare_spec.rb +23 -23
  46. data/spec/higher_level_api/integration/queue_delete_spec.rb +1 -1
  47. data/spec/higher_level_api/integration/queue_purge_spec.rb +2 -2
  48. data/spec/higher_level_api/integration/queue_unbind_spec.rb +2 -2
  49. data/spec/higher_level_api/integration/read_only_consumer_spec.rb +3 -3
  50. data/spec/higher_level_api/integration/sender_selected_distribution_spec.rb +4 -4
  51. data/spec/higher_level_api/integration/tls_connection_spec.rb +5 -5
  52. data/spec/higher_level_api/integration/with_channel_spec.rb +1 -1
  53. data/spec/issues/issue100_spec.rb +9 -10
  54. data/spec/issues/issue141_spec.rb +11 -12
  55. data/spec/issues/issue224_spec.rb +2 -2
  56. data/spec/issues/issue78_spec.rb +14 -18
  57. data/spec/issues/issue83_spec.rb +5 -6
  58. data/spec/issues/issue97_spec.rb +25 -26
  59. data/spec/lower_level_api/integration/basic_cancel_spec.rb +15 -16
  60. data/spec/lower_level_api/integration/basic_consume_spec.rb +19 -20
  61. data/spec/stress/channel_open_stress_spec.rb +1 -1
  62. data/spec/stress/channel_open_stress_with_single_threaded_connection_spec.rb +6 -7
  63. data/spec/stress/concurrent_consumers_stress_spec.rb +6 -7
  64. data/spec/stress/concurrent_publishers_stress_spec.rb +6 -7
  65. data/spec/stress/connection_open_close_spec.rb +6 -6
  66. data/spec/stress/long_running_consumer_spec.rb +6 -7
  67. data/spec/unit/bunny_spec.rb +5 -5
  68. data/spec/unit/concurrent/atomic_fixnum_spec.rb +6 -6
  69. data/spec/unit/concurrent/condition_spec.rb +3 -3
  70. data/spec/unit/concurrent/linked_continuation_queue_spec.rb +2 -2
  71. data/spec/unit/concurrent/synchronized_sorted_set_spec.rb +16 -16
  72. data/spec/unit/system_timer_spec.rb +2 -2
  73. data/spec/unit/version_delivery_tag_spec.rb +3 -3
  74. metadata +8 -7
@@ -16,7 +16,7 @@ describe "amq.* exchanges" do
16
16
 
17
17
  ["amq.fanout", "amq.direct", "amq.topic", "amq.match", "amq.headers"].each do |e|
18
18
  x = ch.exchange(e)
19
- x.should be_predeclared
19
+ expect(x).to be_predeclared
20
20
  end
21
21
 
22
22
  ch.close
@@ -11,10 +11,10 @@ describe Bunny::Channel do
11
11
  context "when publishing with confirms enabled" do
12
12
  it "increments delivery index" do
13
13
  ch = connection.create_channel
14
- ch.should_not be_using_publisher_confirmations
14
+ expect(ch).not_to be_using_publisher_confirmations
15
15
 
16
16
  ch.confirm_select
17
- ch.should be_using_publisher_confirmations
17
+ expect(ch).to be_using_publisher_confirmations
18
18
 
19
19
  q = ch.queue("", :exclusive => true)
20
20
  x = ch.default_exchange
@@ -23,11 +23,11 @@ describe Bunny::Channel do
23
23
  x.publish("xyzzy", :routing_key => q.name)
24
24
  end
25
25
 
26
- ch.next_publish_seq_no.should == n + 1
27
- ch.wait_for_confirms.should be_true
26
+ expect(ch.next_publish_seq_no).to eq n + 1
27
+ expect(ch.wait_for_confirms).to eq true
28
28
  sleep 0.25
29
29
 
30
- q.message_count.should == n
30
+ expect(q.message_count).to eq n
31
31
  q.purge
32
32
 
33
33
  ch.close
@@ -36,10 +36,10 @@ describe Bunny::Channel do
36
36
  describe "#wait_for_confirms" do
37
37
  it "should not hang when all the publishes are confirmed" do
38
38
  ch = connection.create_channel
39
- ch.should_not be_using_publisher_confirmations
39
+ expect(ch).not_to be_using_publisher_confirmations
40
40
 
41
41
  ch.confirm_select
42
- ch.should be_using_publisher_confirmations
42
+ expect(ch).to be_using_publisher_confirmations
43
43
 
44
44
  q = ch.queue("", :exclusive => true)
45
45
  x = ch.default_exchange
@@ -48,14 +48,14 @@ describe Bunny::Channel do
48
48
  x.publish("xyzzy", :routing_key => q.name)
49
49
  end
50
50
 
51
- ch.next_publish_seq_no.should == n + 1
52
- ch.wait_for_confirms.should be_true
51
+ expect(ch.next_publish_seq_no).to eq n + 1
52
+ expect(ch.wait_for_confirms).to eq true
53
53
 
54
54
  sleep 0.25
55
55
 
56
56
  expect {
57
57
  Bunny::Timeout.timeout(2) do
58
- ch.wait_for_confirms.should be_true
58
+ expect(ch.wait_for_confirms).to eq true
59
59
  end
60
60
  }.not_to raise_error
61
61
 
@@ -65,10 +65,10 @@ describe Bunny::Channel do
65
65
  context "when some of the messages get nacked" do
66
66
  it "puts the nacks in the nacked_set" do
67
67
  ch = connection.create_channel
68
- ch.should_not be_using_publisher_confirmations
68
+ expect(ch).not_to be_using_publisher_confirmations
69
69
 
70
70
  ch.confirm_select
71
- ch.should be_using_publisher_confirmations
71
+ expect(ch).to be_using_publisher_confirmations
72
72
 
73
73
  q = ch.queue("", :exclusive => true)
74
74
  x = ch.default_exchange
@@ -85,17 +85,17 @@ describe Bunny::Channel do
85
85
  ch.handle_ack_or_nack(nacked_tag, false, true)
86
86
  end
87
87
 
88
- ch.nacked_set.should_not be_empty
89
- ch.nacked_set.should include(nacked_tag)
88
+ expect(ch.nacked_set).not_to be_empty
89
+ expect(ch.nacked_set).to include(nacked_tag)
90
90
 
91
- ch.next_publish_seq_no.should == n + 1
92
- ch.wait_for_confirms.should be_false
91
+ expect(ch.next_publish_seq_no).to eq n + 1
92
+ expect(ch.wait_for_confirms).to eq false
93
93
 
94
- ch.nacked_set.should_not be_empty
95
- ch.nacked_set.should include(nacked_tag)
94
+ expect(ch.nacked_set).not_to be_empty
95
+ expect(ch.nacked_set).to include(nacked_tag)
96
96
 
97
97
  sleep 0.25
98
- q.message_count.should == n
98
+ expect(q.message_count).to eq n
99
99
  q.purge
100
100
 
101
101
  ch.close
@@ -28,10 +28,10 @@ unless ENV["CI"]
28
28
  x.publish(as, :routing_key => q.name, :persistent => true)
29
29
 
30
30
  sleep(1)
31
- q.message_count.should == 1
31
+ expect(q.message_count).to eq 1
32
32
 
33
33
  _, _, payload = q.pop
34
- payload.bytesize.should == as.bytesize
34
+ expect(payload.bytesize).to eq as.bytesize
35
35
 
36
36
  ch.close
37
37
  end
@@ -49,10 +49,10 @@ unless ENV["CI"]
49
49
  x.publish(as, :routing_key => q.name, :persistent => true)
50
50
 
51
51
  sleep(1)
52
- q.message_count.should == 1
52
+ expect(q.message_count).to eq 1
53
53
 
54
54
  _, _, payload = q.pop
55
- payload.bytesize.should == as.bytesize
55
+ expect(payload.bytesize).to eq as.bytesize
56
56
 
57
57
  ch.close
58
58
  end
@@ -70,15 +70,15 @@ unless ENV["CI"]
70
70
  x.publish("", :routing_key => q.name, :persistent => false, :mandatory => true)
71
71
 
72
72
  sleep(0.5)
73
- q.message_count.should == 1
73
+ expect(q.message_count).to eq 1
74
74
 
75
75
  envelope, headers, payload = q.pop
76
76
 
77
- payload.should == ""
77
+ expect(payload).to eq ""
78
78
 
79
- headers[:content_type].should == "application/octet-stream"
80
- headers[:delivery_mode].should == 1
81
- headers[:priority].should == 0
79
+ expect(headers[:content_type]).to eq "application/octet-stream"
80
+ expect(headers[:delivery_mode]).to eq 1
81
+ expect(headers[:priority]).to eq 0
82
82
 
83
83
  ch.close
84
84
  end
@@ -10,9 +10,9 @@ describe "A client-named", Bunny::Queue do
10
10
  it "can be bound to a pre-declared exchange" do
11
11
  ch = connection.create_channel
12
12
  q = ch.queue("bunny.tests.queues.client-named#{rand}", :exclusive => true)
13
- q.should_not be_server_named
13
+ expect(q).not_to be_server_named
14
14
 
15
- q.bind("amq.fanout").should == q
15
+ expect(q.bind("amq.fanout")).to eq q
16
16
 
17
17
  ch.close
18
18
  end
@@ -20,10 +20,10 @@ describe "A client-named", Bunny::Queue do
20
20
  it "can be unbound from a pre-declared exchange" do
21
21
  ch = connection.create_channel
22
22
  q = ch.queue("bunny.tests.queues.client-named#{rand}", :exclusive => true)
23
- q.should_not be_server_named
23
+ expect(q).not_to be_server_named
24
24
 
25
25
  q.bind("amq.fanout")
26
- q.unbind("amq.fanout").should == q
26
+ expect(q.unbind("amq.fanout")).to eq q
27
27
 
28
28
  ch.close
29
29
  end
@@ -33,7 +33,7 @@ describe "A client-named", Bunny::Queue do
33
33
  q = ch.queue("bunny.tests.queues.client-named#{rand}", :exclusive => true)
34
34
 
35
35
  x = ch.fanout("bunny.tests.exchanges.fanout#{rand}")
36
- q.bind(x).should == q
36
+ expect(q.bind(x)).to eq q
37
37
 
38
38
  x.delete
39
39
  ch.close
@@ -42,12 +42,12 @@ describe "A client-named", Bunny::Queue do
42
42
  it "can be unbound from a custom exchange" do
43
43
  ch = connection.create_channel
44
44
  q = ch.queue("bunny.tests.queues.client-named#{rand}", :exclusive => true)
45
- q.should_not be_server_named
45
+ expect(q).not_to be_server_named
46
46
 
47
47
  x = ch.fanout("bunny.tests.fanout", :auto_delete => true, :durable => false)
48
48
 
49
49
  q.bind(x)
50
- q.unbind(x).should == q
50
+ expect(q.unbind(x)).to eq q
51
51
 
52
52
  ch.close
53
53
  end
@@ -65,9 +65,9 @@ describe "A server-named", Bunny::Queue do
65
65
  it "can be bound to a pre-declared exchange" do
66
66
  ch = connection.create_channel
67
67
  q = ch.queue("", :exclusive => true)
68
- q.should be_server_named
68
+ expect(q).to be_server_named
69
69
 
70
- q.bind("amq.fanout").should == q
70
+ expect(q.bind("amq.fanout")).to eq q
71
71
 
72
72
  ch.close
73
73
  end
@@ -75,10 +75,10 @@ describe "A server-named", Bunny::Queue do
75
75
  it "can be unbound from a pre-declared exchange" do
76
76
  ch = connection.create_channel
77
77
  q = ch.queue("", :exclusive => true)
78
- q.should be_server_named
78
+ expect(q).to be_server_named
79
79
 
80
80
  q.bind("amq.fanout")
81
- q.unbind("amq.fanout").should == q
81
+ expect(q.unbind("amq.fanout")).to eq q
82
82
 
83
83
  ch.close
84
84
  end
@@ -88,7 +88,7 @@ describe "A server-named", Bunny::Queue do
88
88
  q = ch.queue("", :exclusive => true)
89
89
 
90
90
  x = ch.fanout("bunny.tests.exchanges.fanout#{rand}")
91
- q.bind(x).should == q
91
+ expect(q.bind(x)).to eq q
92
92
 
93
93
  x.delete
94
94
  ch.close
@@ -101,7 +101,7 @@ describe "A server-named", Bunny::Queue do
101
101
  name = "bunny.tests.exchanges.fanout#{rand}"
102
102
  x = ch.fanout(name)
103
103
  q.bind(x)
104
- q.unbind(name).should == q
104
+ expect(q.unbind(name)).to eq q
105
105
 
106
106
  x.delete
107
107
  ch.close
@@ -18,7 +18,7 @@ describe Bunny::Queue do
18
18
  ch = connection.create_channel
19
19
 
20
20
  q = ch.queue(name)
21
- q.name.should == name
21
+ expect(q.name).to eq name
22
22
 
23
23
  q.delete
24
24
  ch.close
@@ -28,7 +28,7 @@ describe Bunny::Queue do
28
28
  ch = connection.create_channel
29
29
 
30
30
  q = ch.queue(name)
31
- ch.queue(name).object_id.should == q.object_id
31
+ expect(ch.queue(name).object_id).to eq q.object_id
32
32
 
33
33
  q.delete
34
34
  ch.close
@@ -41,9 +41,9 @@ describe Bunny::Queue do
41
41
  ch = connection.create_channel
42
42
 
43
43
  q = ch.queue("")
44
- q.name.should_not be_empty
45
- q.name.should =~ /^amq.gen.+/
46
- q.should be_server_named
44
+ expect(q.name).not_to be_empty
45
+ expect(q.name).to match /^amq.gen.+/
46
+ expect(q).to be_server_named
47
47
  q.delete
48
48
 
49
49
  ch.close
@@ -56,10 +56,10 @@ describe Bunny::Queue do
56
56
  ch = connection.create_channel
57
57
 
58
58
  q = ch.queue("bunny.tests.queues.durable", :durable => true)
59
- q.should be_durable
60
- q.should_not be_auto_delete
61
- q.should_not be_exclusive
62
- q.arguments.should be_nil
59
+ expect(q).to be_durable
60
+ expect(q).not_to be_auto_delete
61
+ expect(q).not_to be_exclusive
62
+ expect(q.arguments).to be_nil
63
63
  q.delete
64
64
 
65
65
  ch.close
@@ -72,8 +72,8 @@ describe Bunny::Queue do
72
72
  ch = connection.create_channel
73
73
 
74
74
  q = ch.queue("bunny.tests.queues.exclusive", :exclusive => true)
75
- q.should be_exclusive
76
- q.should_not be_durable
75
+ expect(q).to be_exclusive
76
+ expect(q).not_to be_durable
77
77
  q.delete
78
78
 
79
79
  ch.close
@@ -86,9 +86,9 @@ describe Bunny::Queue do
86
86
  ch = connection.create_channel
87
87
 
88
88
  q = ch.queue("bunny.tests.queues.auto-delete", :auto_delete => true)
89
- q.should be_auto_delete
90
- q.should_not be_exclusive
91
- q.should_not be_durable
89
+ expect(q).to be_auto_delete
90
+ expect(q).not_to be_exclusive
91
+ expect(q).not_to be_durable
92
92
  q.delete
93
93
 
94
94
  ch.close
@@ -107,7 +107,7 @@ describe Bunny::Queue do
107
107
  ch.queue_declare("bunny.tests.queues.auto-delete", :auto_delete => false, :durable => true)
108
108
  }.to raise_error(Bunny::PreconditionFailed)
109
109
 
110
- ch.should be_closed
110
+ expect(ch).to be_closed
111
111
  end
112
112
  end
113
113
 
@@ -122,14 +122,14 @@ describe Bunny::Queue do
122
122
  ch = connection.create_channel
123
123
 
124
124
  q = ch.queue("bunny.tests.queues.with-arguments.ttl", :arguments => args, :exclusive => true)
125
- q.arguments.should == args
125
+ expect(q.arguments).to eq args
126
126
 
127
127
  q.publish("xyzzy")
128
128
  sleep 0.1
129
129
 
130
- q.message_count.should == 1
130
+ expect(q.message_count).to eq 1
131
131
  sleep 1.5
132
- q.message_count.should == 0
132
+ expect(q.message_count).to eq 0
133
133
 
134
134
  ch.close
135
135
  end
@@ -142,13 +142,13 @@ describe Bunny::Queue do
142
142
  ch = connection.create_channel
143
143
  q = ch.queue("", :exlusive => true)
144
144
 
145
- connection.queue_exists?(q.name).should be_true
145
+ expect(connection.queue_exists?(q.name)).to eq true
146
146
  end
147
147
  end
148
148
 
149
149
  context "when a queue DOES NOT exist" do
150
150
  it "returns false" do
151
- connection.queue_exists?("suf89u9a4jo3ndnakls##{Time.now.to_i}").should be_false
151
+ expect(connection.queue_exists?("suf89u9a4jo3ndnakls##{Time.now.to_i}")).to eq false
152
152
  end
153
153
  end
154
154
  end
@@ -169,18 +169,18 @@ describe Bunny::Queue do
169
169
  ch = connection.create_channel
170
170
 
171
171
  q = ch.queue("bunny.tests.queues.with-arguments.max-length", :arguments => args, :exclusive => true)
172
- q.arguments.should == args
172
+ expect(q.arguments).to eq args
173
173
 
174
174
  (n * 10).times do
175
175
  q.publish("xyzzy")
176
176
  end
177
177
 
178
- q.message_count.should == n
178
+ expect(q.message_count).to eq n
179
179
  (n * 5).times do
180
180
  q.publish("xyzzy")
181
181
  end
182
182
 
183
- q.message_count.should == n
183
+ expect(q.message_count).to eq n
184
184
  q.delete
185
185
 
186
186
  ch.close
@@ -22,7 +22,7 @@ describe Bunny::Queue, "#delete" do
22
22
  # no exception as of RabbitMQ 3.2. MK.
23
23
  q.delete
24
24
 
25
- ch.queues.size.should == 0
25
+ expect(ch.queues.size).to eq 0
26
26
  end
27
27
  end
28
28
 
@@ -21,9 +21,9 @@ describe Bunny::Queue do
21
21
  x.publish("xyzzy", :routing_key => q.name)
22
22
  sleep(0.5)
23
23
 
24
- q.message_count.should == 1
24
+ expect(q.message_count).to eq 1
25
25
  q.purge
26
- q.message_count.should == 0
26
+ expect(q.message_count).to eq 0
27
27
 
28
28
  ch.close
29
29
  end
@@ -19,12 +19,12 @@ describe Bunny::Queue, "bound to an exchange" do
19
19
 
20
20
  x.publish("")
21
21
  sleep 0.3
22
- q.message_count.should == 1
22
+ expect(q.message_count).to eq 1
23
23
 
24
24
  q.unbind(x)
25
25
 
26
26
  x.publish("")
27
- q.message_count.should == 1
27
+ expect(q.message_count).to eq 1
28
28
  end
29
29
  end
30
30
 
@@ -49,10 +49,10 @@ describe Bunny::Queue, "#subscribe" do
49
49
  x.publish("hello", :routing_key => queue_name)
50
50
 
51
51
  sleep 0.7
52
- delivered_keys.should include(queue_name)
53
- delivered_data.should include("hello")
52
+ expect(delivered_keys).to include(queue_name)
53
+ expect(delivered_data).to include("hello")
54
54
 
55
- ch.queue(queue_name, :auto_delete => true, :durable => false).message_count.should == 0
55
+ expect(ch.queue(queue_name, :auto_delete => true, :durable => false).message_count).to eq 0
56
56
 
57
57
  ch.close
58
58
  end
@@ -26,10 +26,10 @@ describe "Sender-selected distribution" do
26
26
 
27
27
  sleep 0.5
28
28
 
29
- q1.message_count.should == n
30
- q2.message_count.should == n
31
- q3.message_count.should == n
32
- q4.message_count.should be_zero
29
+ expect(q1.message_count).to eq n
30
+ expect(q2.message_count).to eq n
31
+ expect(q3.message_count).to eq n
32
+ expect(q4.message_count).to be_zero
33
33
 
34
34
  x.delete
35
35
  end
@@ -4,7 +4,7 @@ require "spec_helper"
4
4
  unless ENV["CI"]
5
5
  shared_examples_for "successful TLS connection" do
6
6
  it "succeeds" do
7
- connection.should be_tls
7
+ expect(connection).to be_tls
8
8
  ch = connection.create_channel
9
9
 
10
10
  q = ch.queue("", :exclusive => true)
@@ -16,15 +16,15 @@ unless ENV["CI"]
16
16
  publish("xyzzy", :routing_key => q.name)
17
17
 
18
18
  sleep 0.5
19
- q.message_count.should == 4
19
+ expect(q.message_count).to eq 4
20
20
 
21
21
  i = 0
22
22
  q.subscribe do |delivery_info, _, payload|
23
23
  i += 1
24
24
  end
25
25
  sleep 1.0
26
- i.should == 4
27
- q.message_count.should == 0
26
+ expect(i).to eq 4
27
+ expect(q.message_count).to eq 0
28
28
 
29
29
  ch.close
30
30
  end
@@ -150,7 +150,7 @@ unless ENV["CI"]
150
150
  include_examples "successful TLS connection"
151
151
 
152
152
  it "connects using TLSv1" do
153
- connection.transport.socket.ssl_version.should == "TLSv1"
153
+ expect(connection.transport.socket.ssl_version).to eq "TLSv1"
154
154
  end
155
155
  end
156
156
  end