ospfv2 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +674 -0
  3. data/LICENSE.txt +53 -0
  4. data/README +50 -0
  5. data/bin/ospfv2 +112 -105
  6. data/changelog.txt +7 -0
  7. data/gemspec +17 -0
  8. data/lib/ie/external_route.rb +9 -0
  9. data/lib/ie/id.rb +3 -4
  10. data/lib/ie/ie.rb +12 -0
  11. data/lib/ie/ls_age.rb +35 -5
  12. data/lib/ie/ls_type.rb +40 -37
  13. data/lib/ie/opaque_id.rb +46 -0
  14. data/lib/ie/opaque_type.rb +96 -0
  15. data/lib/ie/options.rb +5 -3
  16. data/lib/ie/router_link.rb +30 -7
  17. data/lib/ie/router_link_type.rb +116 -27
  18. data/lib/ie/sequence_number.rb +7 -3
  19. data/lib/infra/ospf_common.rb +1 -12
  20. data/lib/infra/ospf_io.rb +14 -8
  21. data/lib/infra/ospf_socket.rb +14 -14
  22. data/lib/infra/parse_options.rb +69 -25
  23. data/lib/ls_db/advertised_routers.rb +1 -1
  24. data/lib/ls_db/link_state_database.rb +74 -39
  25. data/lib/ls_db/link_state_database_build.rb +3 -3
  26. data/lib/ls_db/link_state_database_links.rb +7 -2
  27. data/lib/ls_db/lsdb_ios.rb +59 -0
  28. data/lib/lsa/external.rb +35 -2
  29. data/lib/lsa/lsa.rb +128 -35
  30. data/lib/lsa/lsa_factory.rb +20 -7
  31. data/lib/lsa/network.rb +44 -9
  32. data/lib/lsa/router.rb +14 -2
  33. data/lib/lsa/summary.rb +16 -3
  34. data/lib/lsa/tlv/color.rb +47 -0
  35. data/lib/lsa/tlv/link.rb +122 -0
  36. data/lib/lsa/tlv/link_id.rb +55 -0
  37. data/lib/lsa/tlv/link_type.rb +44 -0
  38. data/lib/lsa/tlv/local_interface.rb +56 -0
  39. data/lib/lsa/tlv/maximum_bandwidth.rb +55 -0
  40. data/lib/lsa/tlv/maximum_reservable_bandwidth.rb +52 -0
  41. data/lib/lsa/tlv/remote_interface.rb +58 -0
  42. data/lib/lsa/tlv/router_address.rb +57 -0
  43. data/lib/lsa/tlv/tlv.rb +32 -0
  44. data/lib/lsa/tlv/tlv_factory.rb +72 -0
  45. data/lib/lsa/tlv/traffic_engineering_metric.rb +52 -0
  46. data/lib/lsa/tlv/unreserved_bandwidth.rb +55 -0
  47. data/lib/lsa/traffic_engineering.rb +95 -0
  48. data/lib/neighbor/neighbor.rb +9 -9
  49. data/lib/packet/link_state_update.rb +16 -14
  50. data/lib/packet/ospf_packet.rb +13 -9
  51. data/test/unit/ie/au_type_test.rb +18 -0
  52. data/test/unit/ie/external_route_test.rb +51 -0
  53. data/test/unit/ie/id_test.rb +22 -0
  54. data/test/unit/ie/interface_mtu_test.rb +23 -0
  55. data/test/unit/ie/ls_age_test.rb +46 -0
  56. data/test/unit/ie/ls_type_test.rb +41 -0
  57. data/test/unit/ie/metric_test.rb +24 -0
  58. data/test/unit/ie/mt_metric_test.rb +27 -0
  59. data/test/unit/ie/opaque_id_test.rb +22 -0
  60. data/test/unit/ie/opaque_type_test.rb +22 -0
  61. data/test/unit/ie/options_test.rb +142 -0
  62. data/test/unit/ie/ospf_version_test.rb +0 -0
  63. data/test/unit/ie/packet_type_test.rb +33 -0
  64. data/test/unit/ie/router_link_factory_test.rb +26 -0
  65. data/test/unit/ie/router_link_test.rb +276 -0
  66. data/test/unit/ie/router_link_type_test.rb +24 -0
  67. data/test/unit/ie/sequence_number_test.rb +31 -0
  68. data/test/unit/ie/tos_metric_test.rb +27 -0
  69. data/test/unit/infra/ospf_common_test.rb +42 -0
  70. data/test/unit/infra/parse_options_test.rb +58 -0
  71. data/test/unit/infra/timer_test.rb +94 -0
  72. data/test/unit/ls_db/all +10 -0
  73. data/test/unit/ls_db/link_state_database_build_test.rb +140 -0
  74. data/test/unit/ls_db/link_state_database_links_tests.rb +74 -0
  75. data/test/unit/ls_db/link_state_database_test.rb +444 -0
  76. data/test/unit/ls_db/links_test.rb +49 -0
  77. data/test/unit/lsa/all +10 -0
  78. data/test/unit/lsa/external_test.rb +218 -0
  79. data/test/unit/lsa/lsa_factory_test.rb +314 -0
  80. data/test/unit/lsa/lsa_test.rb +191 -0
  81. data/test/unit/lsa/network_test.rb +107 -0
  82. data/test/unit/lsa/router_test.rb +614 -0
  83. data/test/unit/lsa/summary_test.rb +135 -0
  84. data/test/unit/lsa/tlv/color_test.rb +39 -0
  85. data/test/unit/lsa/tlv/link_id_test.rb +14 -0
  86. data/test/unit/lsa/tlv/link_test.rb +413 -0
  87. data/test/unit/lsa/tlv/link_type_test.rb +16 -0
  88. data/test/unit/lsa/tlv/local_interface_test.rb +15 -0
  89. data/test/unit/lsa/tlv/maximum_bandwidth_test.rb +14 -0
  90. data/test/unit/lsa/tlv/maximum_reservable_bandwidth_test.rb +13 -0
  91. data/test/unit/lsa/tlv/remote_interface_test.rb +14 -0
  92. data/test/unit/lsa/tlv/router_address_test.rb +16 -0
  93. data/test/unit/lsa/tlv/tlv_factory_test.rb +89 -0
  94. data/test/unit/lsa/tlv/traffic_engineering_metric_test.rb +15 -0
  95. data/test/unit/lsa/traffic_engineering_test.rb +65 -0
  96. data/test/unit/neighbor/neighbor_test.rb +82 -0
  97. data/test/unit/packet/all +10 -0
  98. data/test/unit/packet/database_description_test.rb +114 -0
  99. data/test/unit/packet/hello_test.rb +107 -0
  100. data/test/unit/packet/link_state_ack_test.rb +64 -0
  101. data/test/unit/packet/link_state_request_test.rb +168 -0
  102. data/test/unit/packet/link_state_update_test.rb +62 -0
  103. data/test/unit/packet/ospf_packet_test.rb +91 -0
  104. metadata +106 -51
  105. data/lib/infra/to_s.rb +0 -38
  106. data/lib/lsa/lsa_base.rb +0 -430
  107. data/lib/lsa/opaque.rb +0 -143
@@ -0,0 +1,191 @@
1
+ require "test/unit"
2
+
3
+ require_relative "../../../lib/lsa/lsa"
4
+ # require_relative "lsa/lsa"
5
+
6
+ class TestPacketLsa < Test::Unit::TestCase
7
+ include OSPFv2
8
+ def test_new
9
+ assert Lsa.new
10
+ assert_equal '0000000100000000000000008000000195d30014', Lsa.new.to_shex
11
+ hdr = Lsa.new :advertising_router=> '1.1.1.1',
12
+ :ls_type => :router,
13
+ :ls_id => '2.2.2.2',
14
+ :options => 7,
15
+ :ls_age => 0xffff
16
+
17
+ assert_equal 'AdvertisingRouter: 1.1.1.1', hdr.advertising_router.to_s
18
+ assert_equal 'LsId: 2.2.2.2', hdr.ls_id.to_s
19
+ assert_equal 'LsType: router', hdr.ls_type.to_s
20
+ assert_equal 7, hdr.options.to_i
21
+ assert_equal 'Options: 0x7 [MC,E,V6]', hdr.options.to_s
22
+ assert_equal 'ffff0701020202020101010180000001b1a40014', hdr.to_shex
23
+ assert_equal hdr.to_shex, Lsa.new_ntop(hdr.encode).to_shex
24
+ assert_equal hdr.to_shex, Lsa.new_ntop(hdr).to_shex
25
+ assert_equal [1, 33686018, 16843009], hdr.key
26
+ hdr.advertising_router='2.2.2.2'
27
+ assert_equal '2.2.2.2',hdr.header_lsa.advertising_router.to_hash
28
+ hdr.ls_id='2.2.2.2'
29
+ assert_equal '2.2.2.2',hdr.header_lsa.advertising_router.to_hash
30
+ # puts hdr
31
+ end
32
+
33
+ def test_newer
34
+
35
+ lsa1 = Lsa.new :advertising_router=> '1.1.1.1',
36
+ :ls_type => :router,
37
+ :ls_id => '2.2.2.2',
38
+ :options => 7,
39
+ :ls_age => 0xffff
40
+ lsa2 = Lsa.new :advertising_router=> '1.1.1.1',
41
+ :ls_type => :router,
42
+ :ls_id => '2.2.2.2',
43
+ :options => 7,
44
+ :ls_age => 0xffff
45
+
46
+ lsa1.instance_eval { @_csum = [0].pack('n') }
47
+ lsa2.instance_eval { @_csum = [0].pack('n') }
48
+
49
+ assert (lsa1 <=> lsa2)
50
+ lsa1.ls_age=2
51
+ assert (lsa1 > lsa2)
52
+ lsa2.ls_age=3
53
+ assert (lsa1 == lsa2)
54
+ lsa1.sequence_number + 1
55
+ assert lsa1 > lsa2
56
+ lsa2.sequence_number + 1
57
+ assert (lsa1 == lsa2)
58
+ lsa1.instance_eval { @_csum = [0xabcd].pack('n') }
59
+ assert (lsa1 > lsa2)
60
+ lsa2.instance_eval { @_csum = [0xabcd].pack('n') }
61
+ lsa2.ls_age= 900 + 3
62
+ assert (lsa1 > lsa2)
63
+
64
+ end
65
+
66
+ def test_refresh
67
+ advrs = LSDB::AdvertisedRouters.new
68
+ advrs << '1.1.1.1'
69
+ lsa = Lsa.new :advertising_router=> '1.1.1.1',
70
+ :ls_type => :router,
71
+ :ls_id => '2.2.2.2',
72
+ :options => 7,
73
+ :ls_age => 0xffff
74
+ lsa.ls_age = 13
75
+ assert_equal '0x80000001', lsa.sequence_number.to_s
76
+ assert_equal 13, lsa.ls_age.to_i
77
+ lsa.refresh advrs, 4
78
+ lsa.refresh advrs, 4
79
+ lsa.refresh advrs, 4
80
+ lsa.refresh advrs, 4
81
+ lsa.refresh advrs, 4
82
+ assert_equal '0x80000002', lsa.sequence_number.to_s
83
+ assert_equal 0, lsa.ls_age.to_i
84
+ advrs - '1.1.1.1'
85
+ lsa.ls_age = 13
86
+ lsa.refresh advrs, 4
87
+ assert_equal '0x80000002', lsa.sequence_number.to_s
88
+ assert_equal 13, lsa.ls_age.to_i
89
+ advrs << '1.1.1.1'
90
+ lsa.refresh advrs, 4
91
+ assert_equal '0x80000003', lsa.sequence_number.to_s
92
+ assert_equal 0, lsa.ls_age.to_i
93
+ end
94
+
95
+ def test_maxage
96
+ lsa = Lsa.new :advertising_router=> '1.1.1.1',
97
+ :ls_type => :router,
98
+ :ls_id => '2.2.2.2',
99
+ :options => 7
100
+ assert ! lsa.maxaged?
101
+ lsa.maxage
102
+ assert lsa.maxaged?
103
+ end
104
+
105
+ def test_to_s_junos
106
+ lsa = Lsa.new :advertising_router=> '1.1.1.1',
107
+ :ls_type => :router,
108
+ :ls_id => '2.2.2.2',
109
+ :options => 7
110
+ # puts lsa.to_s_junos
111
+ end
112
+
113
+ end
114
+
115
+ __END__
116
+
117
+
118
+ #TODO: see if these test should be implemented and delete them otherwise.
119
+
120
+ def test_compare_equal
121
+ header1 = LSA_Header.new(Ospf::LSA_Header.new({:length=>0xffff,
122
+ :lsage => 1,
123
+ :options => 0xee,
124
+ :lstype => 0xdd,
125
+ :lsid => "254.254.254.254",
126
+ :advr => "253.253.253.253",
127
+ :seqn => 0x12345678,
128
+ :csum => 0xdead,
129
+ :length =>0xef
130
+ }).enc)
131
+ header2 = LSA_Header.new(Ospf::LSA_Header.new(
132
+ {:length=>0xffff,
133
+ :lsage => 1,
134
+ :options => 0xee,
135
+ :lstype => 0xdd,
136
+ :lsid => "254.254.254.254",
137
+ :advr => "253.253.253.253",
138
+ :seqn => 0x12345678,
139
+ :csum => 0xdead,
140
+ :length =>0xef
141
+ }).enc)
142
+ assert_equal(0, header1 <=> header2)
143
+ end
144
+ def test_compare_greater
145
+ header1 = LSA_Header.new(Ospf::LSA_Header.new({:length=>0xffff,
146
+ :lsage => 1,
147
+ :options => 0xee,
148
+ :lstype => 0xdd,
149
+ :lsid => "254.254.254.254",
150
+ :advr => "253.253.253.253",
151
+ :seqn => 0x12345678,
152
+ :csum => 0xdead,
153
+ :length =>0xef
154
+ }).enc)
155
+ header2 = LSA_Header.new(Ospf::LSA_Header.new(
156
+ {:length=>0xffff,
157
+ :lsage => 222,
158
+ :options => 0xee,
159
+ :lstype => 0xbb,
160
+ :lsid => "251.254.254.254",
161
+ :advr => "253.253.253.253",
162
+ :seqn => 0x12345678,
163
+ :csum => 0xdead,
164
+ :length =>0xef
165
+ }).enc)
166
+ assert_equal(1, header1 <=> header2)
167
+ end
168
+ def test_compare_smaller
169
+ header1 = LSA_Header.new(Ospf::LSA_Header.new({:length=>0xffff,
170
+ :lsage => 1,
171
+ :options => 0xee,
172
+ :lstype => 0xdd,
173
+ :lsid => "254.254.254.254",
174
+ :advr => "253.253.253.253",
175
+ :seqn => 0x12345678,
176
+ :csum => 0xdead,
177
+ :length =>0xef
178
+ }).enc)
179
+ header2 = LSA_Header.new(Ospf::LSA_Header.new(
180
+ {:length=>0xffff,
181
+ :lsage => 2,
182
+ :options => 0xdd,
183
+ :lstype => 0xbb,
184
+ :lsid => "254.254.254.254",
185
+ :advr => "253.255.255.253",
186
+ :seqn => 0x12345678,
187
+ :csum => 0xdead,
188
+ :length =>0xef
189
+ }).enc)
190
+ assert_equal(1, header1 <=> header2)
191
+ end
@@ -0,0 +1,107 @@
1
+ require "test/unit"
2
+
3
+ require "lsa/network"
4
+
5
+ class TestLasNetwork < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def setup
8
+ $style = :default
9
+ end
10
+ def tests
11
+ assert Network.new
12
+ assert_equal '000000020000000000000000800000018fd4001800000000', Network.new.to_shex
13
+ assert_equal '000000020000000000000000800000018fd40018ffffff00', Network.new(:network_mask => '255.255.255.0').to_shex
14
+ net = Network.new :network_mask => '255.255.255.0', :ls_id=>'192.168.0.1', :advertising_router => '1.1.1.1'
15
+ to_s_headerhex = net.to_shex
16
+ assert_equal 4*5,net.encode_header.size
17
+ net << '1.1.1.1'
18
+ net << '2.2.2.2'
19
+ net << '3.3.3.3'
20
+ assert_equal 3, net.attached_routers.size
21
+ assert_equal '00000002c0a8000101010101800000011bb60024ffffff00010101010202020203030303', net.to_shex
22
+ net1 = Network.new_ntop ['00000002c0a8000101010101800000011bb60024ffffff00010101010202020203030303'].pack('H*')
23
+ assert_equal net.to_shex, net1.to_shex
24
+ assert_equal net.to_shex, Network.new(net1.to_hash).to_shex
25
+ end
26
+ def test_hash
27
+ end
28
+ def test_to_s
29
+ net = Network.new :network_mask => '255.255.255.0', :ls_id=>'192.168.0.1', :advertising_router => '1.1.1.1'
30
+ net << '1.1.1.1'
31
+ net << '2.2.2.2'
32
+ net << '3.3.3.3'
33
+ assert_match(/NetworkMask: 255.255.255.0/, net.to_s_verbose)
34
+ assert_match(/AttachRouter: 1.1.1.1/, net.to_s_verbose)
35
+ assert_match(/AttachRouter: 2.2.2.2/, net.to_s_verbose)
36
+ assert_match(/AttachRouter: 3.3.3.3/, net.to_s_verbose)
37
+ end
38
+ def test_to_s_junos
39
+ $style = :junos
40
+ net = Network.new :network_mask => '255.255.255.0', :ls_id=>'192.168.0.1', :advertising_router => '1.1.1.1'
41
+ net << '1.1.1.1'
42
+ net << '2.2.2.2'
43
+ net << '3.3.3.3'
44
+
45
+ assert_no_match /\s\smask 255.255.255.0/, net.to_s
46
+ assert_no_match /\s\sattached router 1.1.1.1/, net.to_s
47
+ assert_no_match /\s\sattached router 3.3.3.3/, net.to_s
48
+ assert_match /\s\smask 255.255.255.0/, net.to_s_junos_verbose
49
+ assert_match /\s\sattached router 1.1.1.1/, net.to_s_junos_verbose
50
+ assert_match /\s\sattached router 3.3.3.3/, net.to_s_junos_verbose
51
+ assert_equal 'Network 192.168.0.1 1.1.1.1 0x80000001 0 0x00 0x1bb6 36', net.to_s_junos
52
+ end
53
+
54
+ def test_to_s_ios
55
+ net = Network.new :network_mask => '255.255.255.0', :ls_id=>'192.168.0.1', :advertising_router => '1.1.1.1'
56
+ net << '1.1.1.1'
57
+ net << '2.2.2.2'
58
+ net << '3.3.3.3'
59
+
60
+ # puts net.to_s_ios
61
+ # puts net.to_s_ios_verbose
62
+ end
63
+
64
+
65
+ end
66
+
67
+ __END__
68
+
69
+
70
+ R1#show ip ospf database network
71
+
72
+ OSPF Router with ID (1.1.1.1) (Process ID 1)
73
+
74
+ Net Link States (Area 0)
75
+
76
+ Routing Bit Set on this LSA
77
+ LS age: 612
78
+ Options: (No TOS-capability, DC)
79
+ LS Type: Network Links
80
+ Link State ID: 192.168.0.2 (address of Designated Router)
81
+ Advertising Router: 2.2.2.2
82
+ LS Seq Number: 80000015
83
+ Checksum: 0xEBBA
84
+ Length: 32
85
+ Network Mask: /24
86
+ Attached Router: 2.2.2.2
87
+ Attached Router: 1.1.1.1
88
+
89
+ R1#
90
+
91
+
92
+
93
+
94
+ Net Link States (Area 0)
95
+
96
+ LS age: 806
97
+ Options: 0x22 [DC,E]
98
+ LS Type: Network Links
99
+ Link State ID: 192.168.0.2
100
+ Advertising Router: 2.2.2.2
101
+ LS Seq Number: 80000015
102
+ Checksum: 0xEBBA
103
+ Length: 32
104
+ Network Mask: 255.255.255.0
105
+ Attached Router 2.2.2.2
106
+ Attached Router 1.1.1.1
107
+
@@ -0,0 +1,614 @@
1
+ require "test/unit"
2
+
3
+ require "lsa/router"
4
+ require "lsa/lsa_factory"
5
+
6
+ class TestLsaRouter < Test::Unit::TestCase
7
+ include OSPFv2
8
+ def setup
9
+ @rlsa = Router.new()
10
+ @rlsa << @rlink1 = RouterLink.new_point_to_point(:link_id=>'1.1.1.1', :link_data=>'255.255.255.255', :metric=>11)
11
+ @rlsa << @rlink2 = RouterLink.new_point_to_point(:link_id=>'1.1.1.2', :link_data=>'255.255.255.255', :metric=>12)
12
+ @rlsa << @rlink22 = RouterLink.new_point_to_point(:link_id=>'1.1.1.2', :link_data=>'255.255.255.255', :metric=>122)
13
+ @rlsa << @rlink3 = RouterLink.new_point_to_point(:link_id=>'1.1.1.3', :link_data=>'255.255.255.255', :metric=>13)
14
+ @rlsa << @rlink4 = RouterLink.new_transit_network(:link_id=>'1.1.1.4', :link_data=>'255.255.255.255', :metric=>14)
15
+ @rlsa << @rlink5 = RouterLink.new_point_to_point(:link_id=>'1.1.1.5', :link_data=>'255.255.255.255', :metric=>15)
16
+ end
17
+
18
+ def test_init_RouterLink
19
+ _link1 = {:router_link_type=>1, :metric=>1, :link_data=>"255.255.255.240", :link_id=>"192.168.8.0"}
20
+ _link2 = {:router_link_type=>2, :metric=>1, :link_data=>"255.255.255.240", :link_id=>"192.168.8.0"}
21
+ _link3 = {:router_link_type=>3, :metric=>1, :link_data=>"255.255.255.240", :link_id=>"192.168.8.0"}
22
+ _link = {:router_link_type=>3, :metric=>1, :link_data=>"255.255.255.240", :link_id=>"192.168.8.0"}
23
+
24
+ assert_equal("RouterLink:\n LinkId: 192.168.8.0\n LinkData: 255.255.255.240\n RouterLinkType: stub_network\n Metric: 1", RouterLink.new(_link3).to_s)
25
+ assert_equal("c0a80800fffffff003000001", RouterLink.new(_link3).to_shex)
26
+ assert_equal(:stub_network, RouterLink.new(_link3).to_hash[:router_link_type])
27
+ assert_equal(1, RouterLink.new(_link3).to_hash[:metric])
28
+ assert_equal("255.255.255.240", RouterLink.new(_link3).to_hash[:link_data])
29
+ assert_equal("192.168.8.0", RouterLink.new(_link3).to_hash[:link_id])
30
+ link = RouterLink.new(_link3)
31
+ assert_equal(link.encode, RouterLink.new(link.encode).encode)
32
+ assert_equal(:transit_network, RouterLink.new(_link2).to_hash[:router_link_type])
33
+ assert_equal(:point_to_point, RouterLink.new(_link1).to_hash[:router_link_type])
34
+ end
35
+
36
+ def tests
37
+ assert Router.new
38
+ assert_equal '000000010000000000000000800000019dc7001800000000', Router.new.to_shex
39
+
40
+ rlsa = Router.new :advertising_router => '1.1.1.1', :link_id => '2.2.2.2'
41
+
42
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.1', :link_data=>'255.255.255.255', :metric=>11)
43
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.2', :link_data=>'255.255.255.255', :metric=>12)
44
+
45
+ r = Router.new_ntop(rlsa.encode)
46
+ assert_equal rlsa.to_shex, r.to_shex
47
+ assert_equal OSPFv2::Router, r.class
48
+ assert_equal '1.1.1.1', rlsa.to_hash[:advertising_router]
49
+ end
50
+
51
+ def test_nwveb
52
+ r = Router.new :link_id=> '1.0.0.0', :link_data=> '255.255.255.0'
53
+ rl = RouterLink::StubNetwork.new(:link_data=>'2.2.2.2')
54
+ r << RouterLink::StubNetwork.new(:link_data=>'2.2.2.2')
55
+ r << RouterLink::PointToPoint.new(:link_data=>'2.2.2.2', :link_id=>'1.1.1.1', :metric=>255)
56
+ assert_equal 0, r.nwveb
57
+
58
+ r.set_abr
59
+ assert r.abr?
60
+ assert ! r.asbr?
61
+ assert ! r.vl?
62
+ assert ! r.wild?
63
+ assert ! r.nssa?
64
+ assert_equal 1, r.nwveb
65
+ # puts r
66
+
67
+ r.set_asbr
68
+ assert r.abr?
69
+ assert r.asbr?
70
+ assert ! r.vl?
71
+ assert ! r.wild?
72
+ assert ! r.nssa?
73
+ assert_equal 3, r.nwveb
74
+ # puts r
75
+
76
+ r.set_vl
77
+ r.unset_abr
78
+ assert ! r.abr?
79
+ assert r.asbr?
80
+ assert r.vl?
81
+ assert ! r.wild?
82
+ assert ! r.nssa?
83
+ assert_equal 6, r.nwveb
84
+ # puts r
85
+
86
+ r.set_wild
87
+ r.unset_asbr
88
+ assert ! r.abr?
89
+ assert ! r.asbr?
90
+ assert r.vl?
91
+ assert r.wild?
92
+ assert ! r.nssa?
93
+ assert_equal 12, r.nwveb
94
+
95
+ r.set_nssa
96
+ r.unset_vl
97
+ assert ! r.abr?
98
+ assert ! r.asbr?
99
+ assert ! r.vl?
100
+ assert r.wild?
101
+ assert r.nssa?
102
+ assert_equal 24, r.nwveb
103
+
104
+ r.unset_wild
105
+ r.unset_nssa
106
+ assert_equal 0, r.nwveb
107
+
108
+ end
109
+
110
+
111
+ def _test_hash
112
+
113
+
114
+
115
+
116
+ end
117
+
118
+
119
+ def test_args_to_key
120
+ assert_equal [1,'1.1.1.3'], @rlsa.args_to_key(:point_to_point, '1.1.1.3')
121
+ assert_equal [1,'1.1.1.3'], @rlsa.args_to_key(1,'1.1.1.3')
122
+ assert_equal [1,'1.1.1.3'], @rlsa.args_to_key(@rlsa.links[3])
123
+ end
124
+
125
+ def test_index
126
+ assert_equal 'Metric: 13', @rlsa[1,'1.1.1.3'].metric.to_s
127
+ end
128
+
129
+ def test_has?
130
+ assert @rlsa.has_link?(:point_to_point,'1.1.1.3')
131
+ assert ! @rlsa.has_link?(:point_to_point,'1.1.1.4')
132
+ assert @rlsa.has_link?(2,'1.1.1.4')
133
+ assert ! @rlsa.has_link?(:stub_network,'9.9.9.9')
134
+ end
135
+
136
+ def test_delete_link
137
+ rlsa = Router.new()
138
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.1', :link_data=>'255.255.255.255', :metric=>11)
139
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.2', :link_data=>'255.255.255.255', :metric=>12)
140
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.2', :link_data=>'255.255.255.255', :metric=>122)
141
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.3', :link_data=>'255.255.255.255', :metric=>13)
142
+ rlsa << RouterLink.new_transit_network(:link_id=>'1.1.1.4', :link_data=>'255.255.255.255', :metric=>14)
143
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.5', :link_data=>'255.255.255.255', :metric=>15)
144
+ rlsa << RouterLink.new_stub_network(:link_id=>'192.168.0.0', :link_data=>'255.255.255.0', :metric=>15)
145
+ assert_equal 7, rlsa.links.size
146
+ assert rlsa.has_link?(:transit_network,'1.1.1.4')
147
+ assert rlsa.has_link?(2,'1.1.1.4')
148
+ rlsa.delete(2,'1.1.1.4')
149
+ assert ! rlsa.has_link?(2,'1.1.1.4')
150
+ assert_equal 6, rlsa.links.size
151
+ rlsa.delete(:point_to_point,'1.1.1.1')
152
+ assert ! rlsa.has_link?(1,'1.1.1.1')
153
+ assert_equal 5, rlsa.links.size
154
+ end
155
+
156
+ def test_lookup
157
+ rlsa = Router.new()
158
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.1', :link_data=>'255.255.255.255', :metric=>11)
159
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.2', :link_data=>'255.255.255.255', :metric=>12)
160
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.2', :link_data=>'255.255.255.255', :metric=>122)
161
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.3', :link_data=>'255.255.255.255', :metric=>13)
162
+ rlsa << RouterLink.new_transit_network(:link_id=>'1.1.1.4', :link_data=>'255.255.255.255', :metric=>14)
163
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.5', :link_data=>'255.255.255.255', :metric=>15)
164
+ rlsa << RouterLink.new_stub_network(:link_id=>'192.168.0.0', :link_data=>'255.255.255.0', :metric=>15)
165
+
166
+ # puts rlsa
167
+ # puts rlsa.to_s_junos
168
+
169
+ assert rlsa.lookup(1,'1.1.1.1')
170
+ assert rlsa.lookup(:point_to_point,'1.1.1.1')
171
+ assert_equal RouterLink::PointToPoint, rlsa.lookup(1,'1.1.1.1').class
172
+ assert rlsa.lookup(1,'1.1.1.1')
173
+ assert rlsa[:point_to_point,'1.1.1.1']
174
+ assert rlsa[1,'1.1.1.1']
175
+ assert ! rlsa.lookup(2,'1.1.1.1')
176
+
177
+ assert rlsa.lookup(3,'192.168.0.0')
178
+ assert rlsa.lookup(:stub_network,'192.168.0.0')
179
+ assert rlsa[:stub_network,'192.168.0.0']
180
+ assert rlsa[3,'192.168.0.0']
181
+ assert ! rlsa[1,'192.168.0.0']
182
+
183
+ end
184
+
185
+ def test_lookup
186
+ rlsa = Router.new()
187
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.1', :link_data=>'255.255.255.255', :metric=>11)
188
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.2', :link_data=>'255.255.255.255', :metric=>12)
189
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.2', :link_data=>'255.255.255.255', :metric=>122)
190
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.3', :link_data=>'255.255.255.255', :metric=>13)
191
+ rlsa << RouterLink.new_transit_network(:link_id=>'1.1.1.4', :link_data=>'255.255.255.255', :metric=>14)
192
+ rlsa << RouterLink.new_point_to_point(:link_id=>'1.1.1.5', :link_data=>'255.255.255.255', :metric=>15)
193
+ rlsa << RouterLink.new_stub_network(:link_id=>'192.168.0.0', :link_data=>'255.255.255.0', :metric=>15)
194
+
195
+ assert_equal 7, rlsa.links.size
196
+ assert rlsa.lookup(1,'1.1.1.1')
197
+ rlsa.delete(rlsa.lookup(:point_to_point,'1.1.1.1'))
198
+ assert_equal 6, rlsa.links.size
199
+ rlsa.delete(rlsa.lookup(:point_to_point,'1.1.1.2'))
200
+ assert_equal 4, rlsa.links.size
201
+ rlsa.delete(rlsa.lookup(:point_to_point,'1.1.1.3'))
202
+ rlsa.delete(rlsa.lookup(:point_to_point,'1.1.1.5'))
203
+ assert_equal 2, rlsa.links.size
204
+
205
+ end
206
+
207
+ end
208
+
209
+ __END__
210
+
211
+
212
+ class RouterLSA_Test < Test::Unit::TestCase # :nodoc:
213
+ include Ospf
214
+
215
+
216
+ assert_equal(6, lsa.links.size)
217
+ assert_equal(Array, lsa.links.class)
218
+ assert_equal("10.255.8.6", lsa.to_hash[:lsid])
219
+ assert_equal("10.255.8.6", lsa.to_hash[:advr])
220
+ assert_equal(0x22, lsa.to_hash[:options])
221
+ assert_equal(0x8000016b, lsa.to_hash[:seqn])
222
+ assert_equal(0xe3f5, lsa.to_hash[:csum])
223
+ link = lsa.lookup(3,'10.254.241.0')
224
+ assert_match(/type: stub id: 10.254.241.0/,link.to_s)
225
+ end
226
+ def test_init_RouterLink_mt_id
227
+ rlsa = "
228
+ 00 01 22 01 0a ff 08 02 0a ff 08 02 80 00 00 03
229
+ 99 c4 00 40 00 00 00 02 02 02 02 02 0a fe e9 e9
230
+ 01 02 00 01 21 00 00 14 22 00 00 ff 0a fe e9 00
231
+ ff ff ff 00 03 02 00 01 21 00 00 14 22 00 00 ff
232
+ "
233
+ lsa = Ospf::RouterLSA.new([rlsa.split.join].pack('H*'))
234
+
235
+ assert_match(/bits 0x0, link count 2\n\s*id 2.2.2.2, data 10.254.233.233, Type Point-to-point \(1\)\n\s*Topology /,lsa.to_s_junos_style(:detailed))
236
+
237
+ assert_equal(rlsa.split.join, lsa.to_shex)
238
+ assert_equal(2, lsa.links.size)
239
+ assert_equal("10.255.8.2", lsa.to_hash[:lsid])
240
+ assert_equal("10.255.8.2", lsa.to_hash[:advr])
241
+ assert_equal(0x22, lsa.to_hash[:options])
242
+ assert_equal(0x80000003, lsa.to_hash[:seqn])
243
+ assert_equal(0x99c4, lsa.to_hash[:csum])
244
+
245
+ assert_equal(33,lsa.to_hash[:links][0][:mt_id][0][:id])
246
+ assert_equal(34,lsa.to_hash[:links][0][:mt_id][1][:id])
247
+ assert_equal(20,lsa.to_hash[:links][0][:mt_id][0][:metric])
248
+ assert_equal(255,lsa.to_hash[:links][0][:mt_id][1][:metric])
249
+
250
+ end
251
+ def test_nwveb
252
+ lsa = Ospf::RouterLSA.new()
253
+ lsa.setABR
254
+ assert_equal(1, lsa.to_hash[:nwveb])
255
+ lsa.setVL
256
+ assert_equal(5, lsa.to_hash[:nwveb])
257
+ lsa.setASBR
258
+ assert_equal(7, lsa.to_hash[:nwveb])
259
+ lsa.setWr
260
+ assert_equal(15, lsa.to_hash[:nwveb])
261
+ lsa.setNt
262
+ assert_equal(31, lsa.to_hash[:nwveb])
263
+ lsa.setABR
264
+ lsa.setVL
265
+ lsa.setASBR
266
+ lsa.setNt
267
+ lsa.setWr
268
+ assert_equal(true,lsa.isWr?)
269
+ assert_equal(true,lsa.isNt?)
270
+ assert_equal(true,lsa.isABR?)
271
+ assert_equal(true,lsa.isASBR?)
272
+ assert_equal(true,lsa.isVL?)
273
+
274
+ assert_equal(31, lsa.to_hash[:nwveb])
275
+ lsa.unsetNt
276
+ assert_equal(15, lsa.to_hash[:nwveb])
277
+ lsa.unsetWr
278
+ assert_equal(7, lsa.to_hash[:nwveb])
279
+ lsa.unsetABR
280
+ assert_equal(6, lsa.to_hash[:nwveb])
281
+ lsa.unsetVL
282
+ assert_equal(2, lsa.to_hash[:nwveb])
283
+ lsa.unsetASBR
284
+ assert_equal(0, lsa.to_hash[:nwveb])
285
+ assert_equal(false,lsa.isABR?)
286
+ assert_equal(false,lsa.isASBR?)
287
+ assert_equal(false,lsa.isVL?)
288
+
289
+ lsa.unsetABR
290
+ lsa.unsetVL
291
+ lsa.unsetASBR
292
+ assert_equal(0, lsa.to_hash[:nwveb])
293
+ end
294
+
295
+ def test_has?
296
+ assert @rlsa.has?(:point_to_point,'1.1.1.3')
297
+ assert ! @rlsa.has?(:stub_network,'9.9.9.9'))
298
+ end
299
+
300
+
301
+ # def test_add
302
+ # rlsa = RouterLSA.new()
303
+ # rlsa << rlink1 = RouterLink.p2p({:id=>'1.1.1.1', :data=>'255.255.255.255', :metric=>11,})
304
+ # assert_equal(false, rlsa.has?(1,'2.2.2.2'))
305
+ # assert_equal(1,rlsa.links.compact.size)
306
+ # rlsa << {:id=>'2.2.2.2', :data=>'255.255.255.255', :metric=>11, :type=>1}
307
+ # assert_equal(2,rlsa.links.compact.size)
308
+ # rlsa << {:id=>'2.2.2.2', :data=>'255.255.255.255', :metric=>11, :type=>1}
309
+ # assert_equal(3,rlsa.links.compact.size)
310
+ # end
311
+
312
+ end
313
+
314
+
315
+
316
+
317
+ require 'test/unit'
318
+ require 'pp'
319
+ require 'lsa_router'
320
+
321
+ class LSA_RouterLinkTest < Test::Unit::TestCase # :nodoc:
322
+ include Ospf
323
+ def setup
324
+ @rlink1 = RouterLink.p2p({:id=>'1.1.1.1', :data=>'255.255.255.255', :metric=>11,})
325
+ @rlink2 = RouterLink.p2p({:id=>'1.1.1.2', :data=>'255.255.255.255', :metric=>12,})
326
+ @rlink3 = RouterLink.p2p({:id=>'1.1.1.3', :data=>'255.255.255.255', :metric=>13,})
327
+ @rlink4 = RouterLink.p2p({:id=>'1.1.1.4', :data=>'255.255.255.255', :metric=>14,})
328
+ @rlink5 = RouterLink.p2p({:id=>'1.1.1.5', :data=>'255.255.255.255', :metric=>15,})
329
+ end
330
+ def test_init_RouterLink_Factory_hash
331
+ _link1 = {:type=>1, :metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
332
+ _link2 = {:type=>2, :metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
333
+ _link3 = {:type=>3, :metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
334
+ _link4 = {:type=>4, :metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
335
+ assert_match(/LinkP2P$/, RouterLink_Factory.create(_link1).class.to_s)
336
+ assert_match(/LinkTransit$/, RouterLink_Factory.create(_link2).class.to_s)
337
+ assert_match(/LinkStub$/, RouterLink_Factory.create(_link3).class.to_s)
338
+ assert_match(/LinkVL$/, RouterLink_Factory.create(_link4).class.to_s)
339
+ assert_raise(ArgumentError) { RouterLink_Factory.create({:id=>'2.2.2.2', :data=>'255.255.255.255', :metric=>11,}) }
340
+ end
341
+ def test_init_RouterLink_Factory_string
342
+ _link1 = {:type=>1, :metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
343
+ _link2 = {:type=>2, :metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
344
+ _link3 = {:type=>3, :metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
345
+ _link4 = {:type=>4, :metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
346
+ slink1 = RouterLink.new(_link1).enc
347
+ slink2 = RouterLink.new(_link2).enc
348
+ slink3 = RouterLink.new(_link3).enc
349
+ slink4 = RouterLink.new(_link4).enc
350
+ assert_match(/LinkP2P$/, RouterLink_Factory.create(slink1).class.to_s)
351
+ assert_match(/LinkTransit$/, RouterLink_Factory.create(slink2).class.to_s)
352
+ assert_match(/LinkStub$/, RouterLink_Factory.create(slink3).class.to_s)
353
+ assert_match(/LinkVL$/, RouterLink_Factory.create(slink4).class.to_s)
354
+ end
355
+ def test_init_RouterLink
356
+ _link1 = {:type=>1, :metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
357
+ _link2 = {:type=>2, :metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
358
+ _link3 = {:type=>3, :metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
359
+ _link = {:type=>3, :metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
360
+ assert_equal("type: stub id: 192.168.8.0 data: 255.255.255.240 metric: 1", RouterLink.new(_link3).to_s)
361
+ assert_equal("c0a80800fffffff003000001", RouterLink.new(_link3).to_shex)
362
+ assert_equal(3, RouterLink.new(_link3).to_hash[:type])
363
+ assert_equal(1, RouterLink.new(_link3).to_hash[:metric])
364
+ assert_equal("255.255.255.240", RouterLink.new(_link3).to_hash[:data])
365
+ assert_equal("192.168.8.0", RouterLink.new(_link3).to_hash[:id])
366
+ link = RouterLink.new(_link3)
367
+ assert_equal(link.enc, RouterLink.new(link.enc).enc)
368
+ assert_equal(2, RouterLink.new(_link2).to_hash[:type])
369
+ assert_equal(1, RouterLink.new(_link1).to_hash[:type])
370
+ end
371
+
372
+ def test_RouterLink_to_s_junos_style
373
+ _link1 = {:type=>1, :metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
374
+ _link2 = {:type=>2, :metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
375
+ _link3 = {:type=>3, :metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
376
+ assert_equal(" id 192.168.8.0, data 255.255.255.240, Type Point-to-point (1)\n Topology count: 0, Default metric: 1", RouterLink.new(_link1).to_s_junos_style)
377
+ assert_equal(" id 192.168.8.0, data 255.255.255.240, Type Transit (2)\n Topology count: 0, Default metric: 1", RouterLink.new(_link2).to_s_junos_style)
378
+ assert_equal(" id 192.168.8.0, data 255.255.255.240, Type Stub (3)\n Topology count: 0, Default metric: 1", RouterLink.new(_link3).to_s_junos_style)
379
+ end
380
+
381
+ def test_init_RouterLink_mt
382
+ _link1 = {:type=>1, :metric=>1,:mt_id=>[{:metric=>20, :id=>33}, {:metric=>255, :id=>34}], :data=>"10.254.233.233",:id=>"2.2.2.2"}
383
+ _link2 = {:type=>3, :metric=>1,:mt_id=>[{:metric=>20, :id=>33}, {:metric=>255, :id=>34}], :data=>"255.255.255.0", :id=>"10.254.233.0"}
384
+ _link3 = {:type=>1, :metric=>1,:mt_id=>[[33,20],[34,255]], :data=>"10.254.233.233",:id=>"2.2.2.2"}
385
+ _link4 = {:type=>1, :metric=>1, :data=>"10.254.233.233",:id=>"2.2.2.2"}
386
+ assert_equal(33, RouterLink.new(_link1).to_hash[:mt_id][0][:id])
387
+ assert_equal(20, RouterLink.new(_link1).to_hash[:mt_id][0][:metric])
388
+
389
+ assert_equal("020202020afee9e90102000121000014220000ff", RouterLink.new(_link1).to_shex)
390
+ assert_equal("020202020afee9e90102000121000014220000ff", RouterLink.new(RouterLink.new(_link1).enc).to_shex)
391
+ assert_equal("020202020afee9e90102000121000014220000ff", RouterLink.new(RouterLink.new(_link3).enc).to_shex)
392
+
393
+ rlink = RouterLink.new(_link4)
394
+ rlink << [33,20]
395
+ rlink << [34,255]
396
+ assert_equal("020202020afee9e90102000121000014220000ff", rlink.to_shex)
397
+
398
+ rlink = RouterLink.new(_link4)
399
+ rlink << MT.new([33,20])
400
+ rlink << MT.new([34,255])
401
+ assert_equal("020202020afee9e90102000121000014220000ff", rlink.to_shex)
402
+ rlink = RouterLink.new(_link4)
403
+ rlink << [33,20] << [34,255]
404
+ assert_equal("020202020afee9e90102000121000014220000ff", rlink.to_shex)
405
+ rlink = RouterLink.new(_link4)
406
+ assert_raise(ArgumentError) { rlink << [33] }
407
+ assert_raise(ArgumentError) { rlink << [33,100,1] }
408
+
409
+ end
410
+ def test_init_RouterLinkP2P
411
+ _link = {:metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
412
+ assert_equal("type: p2p id: 192.168.8.0 data: 255.255.255.240 metric: 1", RouterLinkP2P.new(_link).to_s)
413
+ assert_equal("c0a80800fffffff001000001", RouterLinkP2P.new(_link).to_shex)
414
+ assert_equal(1, RouterLinkP2P.new(_link).to_hash[:type])
415
+ assert_equal(1, RouterLinkP2P.new(_link).to_hash[:metric])
416
+ assert_equal("255.255.255.240", RouterLinkP2P.new(_link).to_hash[:data])
417
+ assert_equal("192.168.8.0", RouterLinkP2P.new(_link).to_hash[:id])
418
+ link = RouterLinkP2P.new(_link)
419
+ assert_equal(link.enc, RouterLinkP2P.new(link.to_hash).enc)
420
+ end
421
+ def test_init_RouterLinkTransit
422
+ _link = {:metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
423
+ assert_equal("type: transit id: 192.168.8.0 data: 255.255.255.240 metric: 1", RouterLinkTransit.new(_link).to_s)
424
+ assert_equal("c0a80800fffffff002000001", RouterLinkTransit.new(_link).to_shex)
425
+ assert_equal(2, RouterLinkTransit.new(_link).to_hash[:type])
426
+ assert_equal(1, RouterLinkTransit.new(_link).to_hash[:metric])
427
+ assert_equal("255.255.255.240", RouterLinkTransit.new(_link).to_hash[:data])
428
+ assert_equal("192.168.8.0", RouterLinkTransit.new(_link).to_hash[:id])
429
+ link = RouterLinkTransit.new(_link)
430
+ assert_equal(link.enc, RouterLinkTransit.new(link.to_hash).enc)
431
+ end
432
+ def test_init_RouterLinkStub
433
+ _link = {:metric=>1, :data=>"255.255.255.240", :id=>"192.168.8.0"}
434
+ assert_equal("type: stub id: 192.168.8.0 data: 255.255.255.240 metric: 1", RouterLinkStub.new(_link).to_s)
435
+ assert_equal("c0a80800fffffff003000001", RouterLinkStub.new(_link).to_shex)
436
+ assert_equal(3, RouterLinkStub.new(_link).to_hash[:type])
437
+ assert_equal(1, RouterLinkStub.new(_link).to_hash[:metric])
438
+ assert_equal("255.255.255.240", RouterLinkStub.new(_link).to_hash[:data])
439
+ assert_equal("192.168.8.0", RouterLinkStub.new(_link).to_hash[:id])
440
+ assert_equal("stub", RouterLinkStub.new().type_to_s)
441
+
442
+ link = RouterLinkStub.new(_link)
443
+ assert_equal(link.enc, RouterLinkStub.new(link.to_hash).enc)
444
+ end
445
+ def test_RouterLink_type_to_s
446
+ assert_equal("p2p", RouterLink.type_to_s[1])
447
+ assert_equal("transit", RouterLink.type_to_s[2])
448
+ assert_equal("stub", RouterLink.type_to_s[3])
449
+ assert_equal("vl", RouterLink.type_to_s[4])
450
+ end
451
+ def test_RouterLink_type_to_i
452
+ assert_equal(3, RouterLink.type_to_i["stub"])
453
+ assert_equal(1, RouterLink.type_to_i["p2p"])
454
+ assert_equal(2, RouterLink.type_to_i["transit"])
455
+ assert_equal(nil, RouterLink.type_to_i["bogus"])
456
+ end
457
+ def test_key
458
+ assert_equal([1,'1.1.1.1'],@rlink1.key)
459
+ assert_equal([1,'1.1.1.3'],@rlink3.key)
460
+ end
461
+ def test_init_RouterLinkVL
462
+ end
463
+ end
464
+
465
+ class RouterLSA_Test < Test::Unit::TestCase # :nodoc:
466
+ include Ospf
467
+
468
+ def setup
469
+ @rlsa = RouterLSA.new()
470
+ @rlsa << @rlink1 = RouterLink.p2p({:id=>'1.1.1.1', :data=>'255.255.255.255', :metric=>11,})
471
+ @rlsa << @rlink2 = RouterLink.p2p({:id=>'1.1.1.2', :data=>'255.255.255.255', :metric=>12,})
472
+ @rlsa << @rlink22 = RouterLink.p2p({:id=>'1.1.1.2', :data=>'255.255.255.255', :metric=>122,})
473
+ @rlsa << @rlink3 = RouterLink.p2p({:id=>'1.1.1.3', :data=>'255.255.255.255', :metric=>13,})
474
+ @rlsa << @rlink4 = RouterLink.p2p({:id=>'1.1.1.4', :data=>'255.255.255.255', :metric=>14,})
475
+ @rlsa << @rlink5 = RouterLink.p2p({:id=>'1.1.1.5', :data=>'255.255.255.255', :metric=>15,})
476
+ end
477
+ def test_init_RouterLink
478
+ rlsa = "
479
+ 00 01 22 01 0a ff 08 06 0a ff 08 06 80 00 01 6b
480
+ e3 f5 00 60 00 00 00 06 c0 a8 08 00 ff ff ff f0
481
+ 03 00 00 01 01 01 01 01 0a fe f1 f1 01 00 00 01
482
+ 0a fe f1 00 ff ff ff 00 03 00 00 01 c0 a8 fe f1
483
+ ff ff ff ff 03 00 00 00 0a ff 08 06 ff ff ff ff
484
+ 03 00 00 00 c0 a8 08 3c ff ff ff fc 03 00 00 01
485
+ "
486
+ lsa = Ospf::RouterLSA.new([rlsa.split.join].pack('H*'))
487
+ assert_equal(rlsa.split.join, lsa.to_shex)
488
+
489
+ assert_equal(6, lsa.links.size)
490
+ assert_equal(Array, lsa.links.class)
491
+ assert_equal("10.255.8.6", lsa.to_hash[:lsid])
492
+ assert_equal("10.255.8.6", lsa.to_hash[:advr])
493
+ assert_equal(0x22, lsa.to_hash[:options])
494
+ assert_equal(0x8000016b, lsa.to_hash[:seqn])
495
+ assert_equal(0xe3f5, lsa.to_hash[:csum])
496
+ link = lsa.lookup(3,'10.254.241.0')
497
+ assert_match(/type: stub id: 10.254.241.0/,link.to_s)
498
+ end
499
+ def test_init_RouterLink_mt_id
500
+ rlsa = "
501
+ 00 01 22 01 0a ff 08 02 0a ff 08 02 80 00 00 03
502
+ 99 c4 00 40 00 00 00 02 02 02 02 02 0a fe e9 e9
503
+ 01 02 00 01 21 00 00 14 22 00 00 ff 0a fe e9 00
504
+ ff ff ff 00 03 02 00 01 21 00 00 14 22 00 00 ff
505
+ "
506
+ lsa = Ospf::RouterLSA.new([rlsa.split.join].pack('H*'))
507
+
508
+ assert_match(/bits 0x0, link count 2\n\s*id 2.2.2.2, data 10.254.233.233, Type Point-to-point \(1\)\n\s*Topology /,lsa.to_s_junos_style(:detailed))
509
+
510
+ assert_equal(rlsa.split.join, lsa.to_shex)
511
+ assert_equal(2, lsa.links.size)
512
+ assert_equal("10.255.8.2", lsa.to_hash[:lsid])
513
+ assert_equal("10.255.8.2", lsa.to_hash[:advr])
514
+ assert_equal(0x22, lsa.to_hash[:options])
515
+ assert_equal(0x80000003, lsa.to_hash[:seqn])
516
+ assert_equal(0x99c4, lsa.to_hash[:csum])
517
+
518
+ assert_equal(33,lsa.to_hash[:links][0][:mt_id][0][:id])
519
+ assert_equal(34,lsa.to_hash[:links][0][:mt_id][1][:id])
520
+ assert_equal(20,lsa.to_hash[:links][0][:mt_id][0][:metric])
521
+ assert_equal(255,lsa.to_hash[:links][0][:mt_id][1][:metric])
522
+
523
+ end
524
+ def test_nwveb
525
+ lsa = Ospf::RouterLSA.new()
526
+ lsa.setABR
527
+ assert_equal(1, lsa.to_hash[:nwveb])
528
+ lsa.setVL
529
+ assert_equal(5, lsa.to_hash[:nwveb])
530
+ lsa.setASBR
531
+ assert_equal(7, lsa.to_hash[:nwveb])
532
+ lsa.setWr
533
+ assert_equal(15, lsa.to_hash[:nwveb])
534
+ lsa.setNt
535
+ assert_equal(31, lsa.to_hash[:nwveb])
536
+ lsa.setABR
537
+ lsa.setVL
538
+ lsa.setASBR
539
+ lsa.setNt
540
+ lsa.setWr
541
+ assert_equal(true,lsa.isWr?)
542
+ assert_equal(true,lsa.isNt?)
543
+ assert_equal(true,lsa.isABR?)
544
+ assert_equal(true,lsa.isASBR?)
545
+ assert_equal(true,lsa.isVL?)
546
+
547
+ assert_equal(31, lsa.to_hash[:nwveb])
548
+ lsa.unsetNt
549
+ assert_equal(15, lsa.to_hash[:nwveb])
550
+ lsa.unsetWr
551
+ assert_equal(7, lsa.to_hash[:nwveb])
552
+ lsa.unsetABR
553
+ assert_equal(6, lsa.to_hash[:nwveb])
554
+ lsa.unsetVL
555
+ assert_equal(2, lsa.to_hash[:nwveb])
556
+ lsa.unsetASBR
557
+ assert_equal(0, lsa.to_hash[:nwveb])
558
+ assert_equal(false,lsa.isABR?)
559
+ assert_equal(false,lsa.isASBR?)
560
+ assert_equal(false,lsa.isVL?)
561
+
562
+ lsa.unsetABR
563
+ lsa.unsetVL
564
+ lsa.unsetASBR
565
+ assert_equal(0, lsa.to_hash[:nwveb])
566
+ end
567
+
568
+ def test_lookup
569
+ assert_equal(RouterLink,@rlsa.lookup(1,'1.1.1.1')[0].class)
570
+ assert_equal(2,@rlsa.lookup(@rlink2).size)
571
+ assert_equal(12,@rlsa.lookup(@rlink2)[0].metric)
572
+ assert_equal(122,@rlsa.lookup(@rlink2)[1].metric)
573
+ assert_equal('1.1.1.5',@rlsa.lookup(@rlink5.key)[0].to_hash[:id])
574
+ assert_equal('1.1.1.3',@rlsa.lookup(@rlink3.key)[0].to_hash[:id])
575
+ assert_equal('1.1.1.3',@rlsa.lookup(@rlink3)[0].to_hash[:id])
576
+ end
577
+ def test_has?
578
+ assert_equal(true,@rlsa.has?(1,'1.1.1.3'))
579
+ assert_equal(false,@rlsa.has?(1,'9.9.9.9'))
580
+ end
581
+ def test_add
582
+ rlsa = RouterLSA.new()
583
+ rlsa << rlink1 = RouterLink.p2p({:id=>'1.1.1.1', :data=>'255.255.255.255', :metric=>11,})
584
+ assert_equal(false, rlsa.has?(1,'2.2.2.2'))
585
+ assert_equal(1,rlsa.links.compact.size)
586
+ rlsa << {:id=>'2.2.2.2', :data=>'255.255.255.255', :metric=>11, :type=>1}
587
+ assert_equal(2,rlsa.links.compact.size)
588
+ rlsa << {:id=>'2.2.2.2', :data=>'255.255.255.255', :metric=>11, :type=>1}
589
+ assert_equal(3,rlsa.links.compact.size)
590
+ end
591
+ def test_delete
592
+ rlsa = RouterLSA.new()
593
+ rlsa << rlink1 = RouterLink.p2p({:id=>'1.1.1.1', :data=>'255.255.255.255', :metric=>11,})
594
+ rlsa << {:id=>'2.2.2.2', :data=>'255.255.255.255', :metric=>121, :type=>1}
595
+ rlsa << {:id=>'2.2.2.2', :data=>'255.255.255.255', :metric=>122, :type=>1}
596
+ rlsa << {:id=>'3.3.3.3', :data=>'255.255.255.255', :metric=>13, :type=>1}
597
+ rlsa << {:id=>'4.4.4.4', :data=>'255.255.255.255', :metric=>14, :type=>1}
598
+ assert_equal(5,rlsa.links.compact.size)
599
+ rlsa.delete(1,'4.4.4.4')
600
+ assert_equal(4,rlsa.links.compact.size)
601
+ assert_equal(false,rlsa.has?(1,'4.4.4.4'))
602
+ rlsa.delete(1,'2.2.2.2')
603
+ assert_equal(3,rlsa.links.size)
604
+ assert_equal(true,rlsa.has?(1,'2.2.2.2'))
605
+ assert_equal(122, rlsa.lookup(1,'2.2.2.2')[0].metric)
606
+ rlsa.delete(1,'2.2.2.2')
607
+ rlsa.delete(1,'3.3.3.3')
608
+ assert_equal(1,rlsa.links.size)
609
+ rlsa.delete(rlink1)
610
+ assert_equal([], rlsa.links)
611
+ end
612
+ end
613
+
614
+ __END__