bgp4r 0.0.11 → 0.0.12
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.
- data/bgp/common.rb +14 -13
- data/bgp/iana.rb +26 -1
- data/bgp/messages/capability.rb +3 -2
- data/bgp/messages/message.rb +3 -2
- data/bgp/messages/open.rb +2 -1
- data/bgp/messages/update.rb +80 -30
- data/bgp/neighbor/add_path_cap.rb +125 -0
- data/bgp/{neighbor.rb → neighbor/neighbor.rb} +64 -68
- data/bgp/nlris/nlri.rb +289 -15
- data/bgp/nlris/prefix.rb +3 -2
- data/bgp/nlris/vpn.rb +1 -8
- data/bgp/optional_parameters/add_path.rb +160 -0
- data/bgp/optional_parameters/capabilities.rb +1 -0
- data/bgp/optional_parameters/capability.rb +6 -0
- data/bgp/optional_parameters/graceful_restart.rb +6 -6
- data/bgp/optional_parameters/optional_parameter.rb +1 -0
- data/bgp/path_attributes/as_path.rb +1 -1
- data/bgp/path_attributes/attribute.rb +12 -5
- data/bgp/path_attributes/mp_reach.rb +142 -96
- data/bgp/path_attributes/mp_unreach.rb +73 -20
- data/bgp/path_attributes/path_attribute.rb +28 -5
- data/bgp4r.gemspec +21 -6
- data/bgp4r.rb +1 -1
- data/examples/unit-testing/malformed_update.rb +2 -1
- data/examples/unit-testing/test.rb +82 -0
- data/examples/unit-testing/test1.rb +82 -0
- data/examples/unit-testing/test2.rb +44 -0
- data/test/common_test.rb +7 -0
- data/test/helpers/server.rb +20 -0
- data/test/iana_test.rb +43 -0
- data/test/messages/open_test.rb +7 -2
- data/test/messages/update_test.rb +133 -36
- data/test/neighbor/add_path_cap_test.rb +54 -0
- data/test/neighbor/neighbor_test.rb +161 -0
- data/test/nlris/ext_nlri_test.rb +25 -60
- data/test/nlris/nlri_test.rb +93 -115
- data/test/optional_parameters/add_path_test.rb +53 -0
- data/test/optional_parameters/capability_test.rb +10 -0
- data/test/optional_parameters/graceful_restart_test.rb +1 -0
- data/test/path_attributes/mp_reach_test.rb +206 -8
- data/test/path_attributes/mp_unreach_test.rb +113 -5
- data/test/path_attributes/path_attribute_test.rb +34 -2
- metadata +20 -7
- data/test/neighbor_test.rb +0 -62
@@ -26,36 +26,48 @@ require 'test/unit'
|
|
26
26
|
class Mp_unreach_Test < Test::Unit::TestCase
|
27
27
|
include BGP
|
28
28
|
def test_1
|
29
|
-
mpur = Mp_unreach.new(:safi=>1, :
|
29
|
+
mpur = Mp_unreach.new(:safi=>1, :nlris=>['10.0.0.0/16', '10.1.0.0/16'])
|
30
30
|
assert_raise(ArgumentError) { Mp_unreach.new }
|
31
31
|
end
|
32
32
|
|
33
33
|
def test_2
|
34
|
-
mpur = Mp_unreach.new(:safi=>2, :
|
34
|
+
mpur = Mp_unreach.new(:safi=>2, :nlris=>['192.168.1.0/24', '192.168.2.0/24'])
|
35
35
|
assert_equal('800f0b00010218c0a80118c0a802', mpur.to_shex)
|
36
36
|
|
37
|
-
mpur = Mp_unreach.new(:safi=>2, :
|
37
|
+
mpur = Mp_unreach.new(:safi=>2, :nlris=>['2007:1::/64', '2007:2::/64','2007:3::/64'])
|
38
38
|
assert_equal('800f1e000202402007000100000000402007000200000000402007000300000000', mpur.to_shex)
|
39
39
|
|
40
40
|
#mpur = Mp_unreach.new(:safi=>2, :prefix=>['2007:1::/64, 101', '2007:2::/64,102','2007:3::/64, 103'])
|
41
|
-
mpur = Mp_unreach.new(:safi=>4, :
|
41
|
+
mpur = Mp_unreach.new(:safi=>4, :nlris=> [
|
42
42
|
{:prefix=>'2007:1::/64', :label=> 101},
|
43
43
|
{:prefix=>'2007:2::/64', :label=> 102},
|
44
44
|
{:prefix=>'2007:3::/64', :label=> 103},])
|
45
|
+
|
46
|
+
|
45
47
|
assert_equal('800f27000204580006512007000100000000580006612007000200000000580006712007000300000000', mpur.to_shex)
|
46
48
|
assert_match(/^800f..000204/,mpur.to_shex)
|
47
49
|
assert_match(/58000651200700010000000058/,mpur.to_shex)
|
48
50
|
assert_match(/58000661200700020000000058/,mpur.to_shex)
|
49
51
|
assert_match(/580006712007000300000000$/,mpur.to_shex)
|
50
52
|
|
51
|
-
mpur = Mp_unreach.new(:safi=>128, :
|
53
|
+
mpur = Mp_unreach.new(:safi=>128, :nlris=> [
|
52
54
|
{:rd=> Rd.new(100,100), :prefix=> Prefix.new('192.168.1.0/24'), :label=>101},
|
53
55
|
{:rd=> Rd.new(100,100), :prefix=> Prefix.new('192.168.2.0/24'), :label=>102},
|
54
56
|
{:rd=> Rd.new(100,100), :prefix=> Prefix.new('192.168.3.0/24'), :label=>103},])
|
57
|
+
|
58
|
+
|
55
59
|
assert_match(/^800f..000180/,mpur.to_shex)
|
56
60
|
assert_equal("700006510000006400000064c0a801",mpur.nlris[0].to_shex)
|
57
61
|
assert_equal("700006610000006400000064c0a802",mpur.nlris[1].to_shex)
|
58
62
|
|
63
|
+
mpur = Mp_unreach.new(:safi=>128, :nlris=> [
|
64
|
+
{:rd=> Rd.new(100,100), :prefix=> '192.168.1.0/24', :label=>101},
|
65
|
+
{:rd=> Rd.new(100,100), :prefix=> '192.168.2.0/24', :label=>102},
|
66
|
+
{:rd=> Rd.new(100,100), :prefix=> '192.168.3.0/24', :label=>103},])
|
67
|
+
assert_match(/^800f..000180/,mpur.to_shex)
|
68
|
+
assert_equal("700006510000006400000064c0a801",mpur.nlris[0].to_shex)
|
69
|
+
assert_equal("700006610000006400000064c0a802",mpur.nlris[1].to_shex)
|
70
|
+
|
59
71
|
end
|
60
72
|
|
61
73
|
def test_3
|
@@ -64,4 +76,100 @@ class Mp_unreach_Test < Test::Unit::TestCase
|
|
64
76
|
assert_equal '800f03000102', Mp_unreach.new(:afi=>1, :safi=>2).to_shex
|
65
77
|
end
|
66
78
|
|
79
|
+
def test_afi_1
|
80
|
+
mpr1 = Mp_unreach.new(:safi=>1, :nlris=> '192.168.1.0/24')
|
81
|
+
mpr2 = Mp_unreach.new(:safi=>1, :nlris=> '192.168.1.0/24', :path_id=>100)
|
82
|
+
mpr3 = Mp_unreach.new(:safi=>2, :nlris=> ['192.168.1.0/24','192.168.2.0/24'])
|
83
|
+
mpr4 = Mp_unreach.new(:safi=>2, :nlris=> ['192.168.1.0/24','192.168.2.0/24'], :path_id=>100)
|
84
|
+
mpr5 = Mp_unreach.new(:safi=>1, :nlris=> [
|
85
|
+
{:prefix=> '192.168.1.0/24', :path_id=> 100},
|
86
|
+
{:prefix=> '192.168.2.0/24', :path_id=> 101},
|
87
|
+
{:prefix=> '192.168.2.0/24', :path_id=> 102},
|
88
|
+
])
|
89
|
+
|
90
|
+
|
91
|
+
#
|
92
|
+
# puts mpr1
|
93
|
+
# puts mpr2
|
94
|
+
# puts mpr3
|
95
|
+
# puts mpr4
|
96
|
+
# puts mpr5
|
97
|
+
#
|
98
|
+
assert_equal('800f0700010118c0a801', mpr1.to_shex)
|
99
|
+
assert_equal('800f0b0001010000006418c0a801', mpr2.to_shex)
|
100
|
+
assert_equal attr_len(mpr1)+4, attr_len(mpr2)
|
101
|
+
|
102
|
+
assert_equal('800f0b00010218c0a80118c0a802', mpr3.to_shex)
|
103
|
+
assert_equal('800f130001020000006418c0a8010000006418c0a802', mpr4.to_shex)
|
104
|
+
assert_equal attr_len(mpr3)+8, attr_len(mpr4)
|
105
|
+
|
106
|
+
assert_equal('800f1b0001010000006418c0a8010000006518c0a8020000006618c0a802', mpr5.to_shex)
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_safi_2_afi_2
|
111
|
+
unreach1 = Mp_unreach.new( :safi=>2, :nlris=> [
|
112
|
+
{:prefix=> '2007:1::/64'},
|
113
|
+
{:prefix=> '2007:2::/64'},
|
114
|
+
{:prefix=> '2007:3::/64'}
|
115
|
+
]
|
116
|
+
)
|
117
|
+
assert_equal(3, unreach1.nlris.size)
|
118
|
+
assert_equal(2,unreach1.afi)
|
119
|
+
assert_equal(2,unreach1.safi)
|
120
|
+
|
121
|
+
unreach2 = Mp_unreach.new( :safi=>2, :nlris=> [
|
122
|
+
{:prefix=> '2007:1::/64', :path_id=> 101},
|
123
|
+
{:prefix=> '2007:2::/64', :path_id=> 102},
|
124
|
+
{:prefix=> '2007:3::/64', :path_id=> 103}
|
125
|
+
]
|
126
|
+
)
|
127
|
+
|
128
|
+
s1 = '80 0f 1e 0002 02 40 2007000100000000 40 2007000200000000 40 2007000300000000'
|
129
|
+
s2 = '80 0f 2a 0002 02 00000065 40 2007000100000000 00000066 40 2007000200000000 00000067 40 2007000300000000'
|
130
|
+
assert_equal(s1.split.join,unreach1.to_shex)
|
131
|
+
assert_equal(s2.split.join,unreach2.to_shex)
|
132
|
+
|
133
|
+
assert_equal(s1.split.join, Mp_unreach.new(unreach1.encode).to_shex)
|
134
|
+
assert_equal(s2.split.join, Mp_unreach.new(unreach2.encode,true).to_shex)
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_safi_128
|
139
|
+
|
140
|
+
# ffff ffff ffff ffff ffff ffff ffff ffff
|
141
|
+
# 0031 0200 0000 1a
|
142
|
+
# 90 0f 0016 0001 80 00000001 70 800000 00000001000000010a0101
|
143
|
+
# 80 0f 12 0001 80 70 03e801 00000001000000010a0101
|
144
|
+
# 80 0f 16 0001 80 00000001 70 03e801 00000001000000010a0101
|
145
|
+
|
146
|
+
# Mp Reach (14), length: 9216, Flags [OE]:
|
147
|
+
# AFI IPv4 (1), SAFI Labeled VPN Unicast (128)
|
148
|
+
# nexthop: 1.1.1.1
|
149
|
+
# ID=1, Label Stack=16000 (bottom) RD=1:1, IPv4=10.1.1.0/24
|
150
|
+
# 0x0000: 0180 0c00 0000 0000 0000 0001 0101 0100
|
151
|
+
# 0x0001: 0000 0001 7003 e801 0000 0001 0000 0001
|
152
|
+
# 0x0002: 0a01 01
|
153
|
+
|
154
|
+
unreach1 = Mp_unreach.new( :safi=> 128, :nlris => [{:rd=> Rd.new(1,1), :prefix=> '10.1.1.0/24', :label=>16000},])
|
155
|
+
unreach2 = Mp_unreach.new( :safi=> 128, :nlris => [{:rd=> Rd.new(1,1), :prefix=> '10.1.1.0/24', :label=>16000, :path_id=> 1},])
|
156
|
+
|
157
|
+
assert_equal(16000, Label.new(['03e801'].pack('H*')).to_hash[:label])
|
158
|
+
assert_equal(524288, Label.new(['800000'].pack('H*')).to_hash[:label])
|
159
|
+
|
160
|
+
s1 = '80 0f 12 0001 80 70 03e801 000000010000000 10a0101'.split.join
|
161
|
+
s2 = '80 0f 16 0001 80 00000001 70 03e801 00000001000000010a0101'.split.join
|
162
|
+
assert_equal(s1, unreach1.to_shex)
|
163
|
+
assert_equal(s1, Mp_unreach.new(unreach1.encode).to_shex)
|
164
|
+
assert_equal(s2, unreach2.to_shex)
|
165
|
+
assert_equal(s2, Mp_unreach.new(unreach2.encode,true).to_shex)
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
private
|
170
|
+
|
171
|
+
def attr_len(attr)
|
172
|
+
attr.encode[2,1].unpack('C')[0]
|
173
|
+
end
|
174
|
+
|
67
175
|
end
|
@@ -22,6 +22,7 @@
|
|
22
22
|
|
23
23
|
require 'test/unit'
|
24
24
|
require 'bgp/path_attributes/path_attribute'
|
25
|
+
require 'bgp/path_attributes/attributes'
|
25
26
|
|
26
27
|
class Path_attribute_Test < Test::Unit::TestCase # :nodoc:
|
27
28
|
include BGP
|
@@ -141,5 +142,36 @@ class Path_attribute_Test < Test::Unit::TestCase # :nodoc:
|
|
141
142
|
assert @pa.has_a_local_pref_attr?
|
142
143
|
assert ! @pa.has_a_aggregator_attr?
|
143
144
|
assert ! @pa.has_a_mp_unreach_attr?
|
144
|
-
end
|
145
|
-
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_7
|
148
|
+
s = '800e1000010404ffffffff0030000651c0a800'
|
149
|
+
sbin = [s].pack('H*')
|
150
|
+
assert_equal(BGP::Mp_reach, Attr.factory(sbin, :path_id=>false).class)
|
151
|
+
s = '800e1400010404ffffffff000000006430000651c0a800'
|
152
|
+
sbin = [s].pack('H*')
|
153
|
+
assert_equal(BGP::Mp_reach, Attr.factory(sbin, :path_id=>true).class)
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_path_attribute_path_id_true_and_as4byte_false
|
157
|
+
path_attr = Path_attribute.new
|
158
|
+
path_attr.insert(
|
159
|
+
Origin.new,
|
160
|
+
As_path.new(100),
|
161
|
+
Mp_reach.new( :safi=>128, :nexthop=> ['10.0.0.1'], :path_id=> 100, :nlris=> [
|
162
|
+
{:rd=> [100,100], :prefix=> '192.168.0.0/24', :label=>101},
|
163
|
+
{:rd=> [100,100], :prefix=> '192.168.1.0/24', :label=>102},
|
164
|
+
{:rd=> [100,100], :prefix=> '192.168.2.0/24', :label=>103},
|
165
|
+
])
|
166
|
+
)
|
167
|
+
assert_match(/ID=100, Label Stack=101/, path_attr.to_s)
|
168
|
+
path_attr_new = Path_attribute.new(path_attr.encode(true), :as4byte=> true, :path_id=>true)
|
169
|
+
assert_equal(path_attr.to_shex, path_attr_new.to_shex)
|
170
|
+
|
171
|
+
# TODO: UT: a path attr with mp_reach w path_id and ! as4
|
172
|
+
# TODO: UT: a path attr with mp_unreach w path_id
|
173
|
+
# TODO: UT: a path attr with mp_reach w path_id and as4
|
174
|
+
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 12
|
9
|
+
version: 0.0.12
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jean-Michel Esnault
|
@@ -14,12 +14,12 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-02-13 00:00:00 -08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
21
21
|
description: BGP4R is a BGP-4 ruby library to create, send, and receive BGP messages in an object oriented manner
|
22
|
-
email:
|
22
|
+
email: bgp4r@esnault.org
|
23
23
|
executables: []
|
24
24
|
|
25
25
|
extensions: []
|
@@ -44,7 +44,8 @@ files:
|
|
44
44
|
- bgp/messages/route_refresh.rb
|
45
45
|
- bgp/messages/update.rb
|
46
46
|
- bgp/misc/live_feed.rb
|
47
|
-
- bgp/neighbor.rb
|
47
|
+
- bgp/neighbor/add_path_cap.rb
|
48
|
+
- bgp/neighbor/neighbor.rb
|
48
49
|
- bgp/nlris/inet.rb
|
49
50
|
- bgp/nlris/label.rb
|
50
51
|
- bgp/nlris/labeled.rb
|
@@ -53,6 +54,7 @@ files:
|
|
53
54
|
- bgp/nlris/prefix.rb
|
54
55
|
- bgp/nlris/rd.rb
|
55
56
|
- bgp/nlris/vpn.rb
|
57
|
+
- bgp/optional_parameters/add_path.rb
|
56
58
|
- bgp/optional_parameters/as4.rb
|
57
59
|
- bgp/optional_parameters/capabilities.rb
|
58
60
|
- bgp/optional_parameters/capability.rb
|
@@ -90,8 +92,13 @@ files:
|
|
90
92
|
- examples/unit-testing/malformed_update.rb
|
91
93
|
- examples/unit-testing/no_export.rb
|
92
94
|
- examples/unit-testing/prepend_aspath.rb
|
95
|
+
- examples/unit-testing/test.rb
|
96
|
+
- examples/unit-testing/test1.rb
|
97
|
+
- examples/unit-testing/test2.rb
|
93
98
|
- examples/unit-testing/unknown_transitive_attr.rb
|
94
99
|
- test/common_test.rb
|
100
|
+
- test/helpers/server.rb
|
101
|
+
- test/iana_test.rb
|
95
102
|
- test/messages/capability_test.rb
|
96
103
|
- test/messages/keepalive_test.rb
|
97
104
|
- test/messages/markers_test.rb
|
@@ -102,12 +109,14 @@ files:
|
|
102
109
|
- test/messages/update_test.rb
|
103
110
|
- test/misc/live_feed_test.rb
|
104
111
|
- test/misc/misc.rb
|
105
|
-
- test/
|
112
|
+
- test/neighbor/add_path_cap_test.rb
|
113
|
+
- test/neighbor/neighbor_test.rb
|
106
114
|
- test/nlris/ext_nlri_test.rb
|
107
115
|
- test/nlris/inet_test.rb
|
108
116
|
- test/nlris/labeled_test.rb
|
109
117
|
- test/nlris/nlri_test.rb
|
110
118
|
- test/nlris/rd_test.rb
|
119
|
+
- test/optional_parameters/add_path_test.rb
|
111
120
|
- test/optional_parameters/as4_test.rb
|
112
121
|
- test/optional_parameters/capability_test.rb
|
113
122
|
- test/optional_parameters/dynamic_test.rb
|
@@ -167,6 +176,8 @@ specification_version: 3
|
|
167
176
|
summary: A BGP-4 Ruby Library
|
168
177
|
test_files:
|
169
178
|
- test/common_test.rb
|
179
|
+
- test/helpers/server.rb
|
180
|
+
- test/iana_test.rb
|
170
181
|
- test/messages/capability_test.rb
|
171
182
|
- test/messages/keepalive_test.rb
|
172
183
|
- test/messages/markers_test.rb
|
@@ -177,12 +188,14 @@ test_files:
|
|
177
188
|
- test/messages/update_test.rb
|
178
189
|
- test/misc/live_feed_test.rb
|
179
190
|
- test/misc/misc.rb
|
180
|
-
- test/
|
191
|
+
- test/neighbor/add_path_cap_test.rb
|
192
|
+
- test/neighbor/neighbor_test.rb
|
181
193
|
- test/nlris/ext_nlri_test.rb
|
182
194
|
- test/nlris/inet_test.rb
|
183
195
|
- test/nlris/labeled_test.rb
|
184
196
|
- test/nlris/nlri_test.rb
|
185
197
|
- test/nlris/rd_test.rb
|
198
|
+
- test/optional_parameters/add_path_test.rb
|
186
199
|
- test/optional_parameters/as4_test.rb
|
187
200
|
- test/optional_parameters/capability_test.rb
|
188
201
|
- test/optional_parameters/dynamic_test.rb
|
data/test/neighbor_test.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# Copyright 2008, 2009 Jean-Michel Esnault.
|
3
|
-
# All rights reserved.
|
4
|
-
# See LICENSE.txt for permissions.
|
5
|
-
#
|
6
|
-
#
|
7
|
-
# This file is part of BGP4R.
|
8
|
-
#
|
9
|
-
# BGP4R is free software: you can redistribute it and/or modify
|
10
|
-
# it under the terms of the GNU General Public License as published by
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
12
|
-
# (at your option) any later version.
|
13
|
-
#
|
14
|
-
# BGP4R is distributed in the hope that it will be useful,
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
-
# GNU General Public License for more details.
|
18
|
-
#
|
19
|
-
# You should have received a copy of the GNU General Public License
|
20
|
-
# along with BGP4R. If not, see <http://www.gnu.org/licenses/>.
|
21
|
-
#++
|
22
|
-
|
23
|
-
require "test/unit"
|
24
|
-
require 'bgp4r'
|
25
|
-
|
26
|
-
class TestBgpNeighbor < Test::Unit::TestCase
|
27
|
-
include BGP
|
28
|
-
include BGP::OPT_PARM::CAP
|
29
|
-
def test_open_msg
|
30
|
-
neighbor = Neighbor.new \
|
31
|
-
:version=> 4,
|
32
|
-
:my_as=> 100,
|
33
|
-
:remote_addr => '192.168.1.200',
|
34
|
-
:local_addr => '192.168.1.5',
|
35
|
-
:id=> '1.1.1.1',
|
36
|
-
:holdtime=> 20
|
37
|
-
neighbor.capability Mbgp.ipv4_unicast
|
38
|
-
neighbor.capability Mbgp.ipv4_multicast
|
39
|
-
neighbor.capability Route_refresh.new
|
40
|
-
neighbor.capability Route_refresh.new 128
|
41
|
-
neighbor.capability As4.new(100)
|
42
|
-
open_msg = neighbor.open
|
43
|
-
assert_equal(5,open_msg.opt_parms.size)
|
44
|
-
assert_equal(4,open_msg.version)
|
45
|
-
assert_equal(20,open_msg.holdtime)
|
46
|
-
assert_equal(100,open_msg.local_as)
|
47
|
-
# puts neighbor
|
48
|
-
end
|
49
|
-
def test_states
|
50
|
-
neighbor = Neighbor.new \
|
51
|
-
:version=> 4,
|
52
|
-
:my_as=> 100,
|
53
|
-
:remote_addr => '192.168.1.200',
|
54
|
-
:local_addr => '192.168.1.5',
|
55
|
-
:id=> '1.1.1.1',
|
56
|
-
:holdtime=> 20
|
57
|
-
assert neighbor.is_idle?
|
58
|
-
assert ! neighbor.is_established?
|
59
|
-
assert ! neighbor.is_openrecv?
|
60
|
-
assert ! neighbor.is_openconfirm?
|
61
|
-
end
|
62
|
-
end
|