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
@@ -52,15 +52,17 @@ module OSPFv2
52
52
  include OSPFv2
53
53
  attr_reader :address, :inactivity_timer, :hello, :dd_rxmt_interval
54
54
 
55
- InactivityTimer = Class.new(Timer)
56
- HelloTimer = Class.new(PeriodicTimer)
57
- RxmtIntervalTimer = Class.new(PeriodicTimer)
58
- RefreshTimer = Class.new(PeriodicTimer)
59
- RouterId = Class.new(Id)
60
- AreadId = Class.new(Id)
61
-
62
55
  attr_writer :hello_int, :dead_int
63
56
 
57
+ unless const_defined?(:AreaId)
58
+ InactivityTimer = Class.new(Timer)
59
+ HelloTimer = Class.new(PeriodicTimer)
60
+ RxmtIntervalTimer = Class.new(PeriodicTimer)
61
+ RefreshTimer = Class.new(PeriodicTimer)
62
+ RouterId = Class.new(Id)
63
+ AreaId = Class.new(Id)
64
+ end
65
+
64
66
  def initialize(arg={})
65
67
  #TODO: accept prefix arg and set @address and @netmask in hello...
66
68
  @address = arg[:src_addr] || '127.0.0.1'
@@ -195,8 +197,6 @@ module OSPFv2
195
197
  end
196
198
  end
197
199
 
198
- # AllSPFRouters = "224.0.0.5"
199
- # AllDRouters = "224.0.0.6"
200
200
  def flood(lsas, dest=AllSPFRouters)
201
201
  send LinkStateUpdate.new_lsas(lsas), dest
202
202
  end
@@ -5,12 +5,12 @@
5
5
  #
6
6
  #
7
7
  # This file is part of OSPFv2.
8
- #
8
+ #
9
9
  # OSPFv2 is free software: you can redistribute it and/or modify
10
10
  # it under the terms of the GNU General Public License as published by
11
11
  # the Free Software Foundation, either version 3 of the License, or
12
12
  # (at your option) any later version.
13
- #
13
+ #
14
14
  # OSPFv2 is distributed in the hope that it will be useful,
15
15
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
16
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
@@ -71,7 +71,7 @@
71
71
  A.4.1. Detailed formats of the different types of LSAs are described
72
72
  in Section A.4.
73
73
 
74
-
74
+
75
75
  =end
76
76
 
77
77
  require 'packet/ospf_packet'
@@ -79,11 +79,11 @@ require 'lsa/lsa'
79
79
  require 'lsa/lsa_factory'
80
80
  require 'packet/link_state_ack'
81
81
  module OSPFv2
82
-
82
+
83
83
  class LinkStateUpdate < OspfPacket
84
-
84
+
85
85
  attr_reader :lsas
86
-
86
+
87
87
  def initialize(_arg={})
88
88
  arg = _arg.dup
89
89
  @lsas=[]
@@ -98,11 +98,11 @@ module OSPFv2
98
98
  raise ArgumentError, "Invalid argument", caller
99
99
  end
100
100
  end
101
-
101
+
102
102
  def number_of_lsa
103
103
  lsas.size
104
104
  end
105
-
105
+
106
106
  def encode
107
107
  headers = []
108
108
  headers << [lsas.size].pack('N')
@@ -123,9 +123,9 @@ module OSPFv2
123
123
  end
124
124
  end
125
125
  end
126
-
126
+
127
127
  def [](val)
128
- lsas[val]
128
+ lsas[val]
129
129
  end
130
130
 
131
131
  # def to_s
@@ -144,11 +144,11 @@ module OSPFv2
144
144
  s.join("\n ")
145
145
  end
146
146
 
147
-
147
+
148
148
  def each
149
149
  lsas.each { |ls| yield ls }
150
150
  end
151
-
151
+
152
152
  def keys
153
153
  lsas.collect { |ls| ls.key }
154
154
  end
@@ -167,7 +167,7 @@ module OSPFv2
167
167
  lsas = arg[:lsas]
168
168
  arg.delete(:lsas)
169
169
  lsu = new(arg)
170
- [lsas].flatten.compact.each do |lsa|
170
+ lsas.each do |lsa|
171
171
  lsa_len = lsa.encode.size
172
172
  if (len + lsa_len) > (1476-56-20)
173
173
  lsus << lsu
@@ -179,11 +179,13 @@ module OSPFv2
179
179
  end
180
180
  lsus << lsu
181
181
  lsus
182
+ rescue
183
+ raise
182
184
  end
183
185
  end
184
186
 
185
187
  end
186
-
188
+
187
189
  end
188
190
 
189
191
  load "../../../test/ospfv2/packet/#{ File.basename($0.gsub(/.rb/,'_test.rb'))}" if __FILE__ == $0
@@ -117,13 +117,15 @@ require 'ie/au_type'
117
117
 
118
118
  module OSPFv2
119
119
 
120
- RouterId = Class.new(Id)
121
- AreaId = Class.new(Id)
122
-
123
120
  class OspfPacket
124
121
  include OSPFv2
125
122
  include OSPFv2::Common
126
123
 
124
+ unless const_defined?(:RouterId)
125
+ RouterId = Class.new(Id)
126
+ AreaId = Class.new(Id)
127
+ end
128
+
127
129
  attr_reader :area_id, :router_id, :version, :ospf_version, :packet_type, :au_type
128
130
  attr_writer_delegate :area_id, :router_id, :packet_type, :au_type
129
131
 
@@ -204,7 +206,7 @@ module OSPFv2
204
206
 
205
207
  def method_missing(method, *args, &block)
206
208
  if method == :to_s_junos
207
- to_s_default(*args)
209
+ to_s(*args)
208
210
  else
209
211
  super
210
212
  end
@@ -260,11 +262,13 @@ module OSPFv2
260
262
  include OSPFv2
261
263
  include OSPFv2::Common
262
264
 
263
- HELLO = 1
264
- DATABASE_DESCRIPTION = 2
265
- LINK_STATE_REQUEST = 3
266
- LINK_STATE_UPDATE = 4
267
- LINK_STATE_ACKNOWLEDGMENT = 5
265
+ unless const_defined?(:HELLO)
266
+ HELLO = 1
267
+ DATABASE_DESCRIPTION = 2
268
+ LINK_STATE_REQUEST = 3
269
+ LINK_STATE_UPDATE = 4
270
+ LINK_STATE_ACKNOWLEDGMENT = 5
271
+ end
268
272
 
269
273
  class << self
270
274
 
@@ -0,0 +1,18 @@
1
+
2
+ require "test/unit"
3
+ require 'ie/au_type'
4
+
5
+ class TestIeAuType < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_new
8
+ assert AuType.new
9
+ assert_equal 'AuType: null authentication', AuType.new(0).to_s
10
+ assert_equal 'AuType: simple password', AuType.new(1).to_s
11
+ assert_equal 'AuType: cryptographic authentication', AuType.new(2).to_s
12
+ assert_equal 'AuType: unknown', AuType.new(3).to_s
13
+ assert_equal 0, AuType.new(0).to_i
14
+ assert_equal 1, AuType.new(1).to_i
15
+ assert_equal 2, AuType.new(2).to_i
16
+ assert_equal 3, AuType.new(3).to_i
17
+ end
18
+ end
@@ -0,0 +1,51 @@
1
+ require "test/unit"
2
+
3
+ require "ie/external_route"
4
+
5
+ class TestIeExternalRoute < Test::Unit::TestCase
6
+
7
+ include OSPFv2
8
+ def tests
9
+ assert ExternalRoute.new
10
+ assert_equal '0000000a0000000000000000', ExternalRoute.new( :metric=> 10).to_shex
11
+ assert_equal '0000000a0000000000000000', ExternalRoute.new( :type=> :e1, :metric=> 10).to_shex
12
+ assert_equal '8000000a0000000000000000', ExternalRoute.new( :type=> :e2, :metric=> 10).to_shex
13
+ assert_equal '800000ff0101010100000000', ExternalRoute.new( :type=> :e2,
14
+ :metric=> 255,
15
+ :forwarding_address => '1.1.1.1').to_shex
16
+ assert_equal '800000ff01010101000000ff', ExternalRoute.new( :type=> :e2,
17
+ :metric=> 255,
18
+ :forwarding_address => '1.1.1.1',
19
+ :tag=> 255).to_shex
20
+ assert_equal({:metric=>255, :type=>:e2, :forwarding_address=>"1.1.1.1", :tag=>255},
21
+ h = ExternalRoute.new( :type=> :e2, :metric=> 255, :forwarding_address => '1.1.1.1', :tag=> 255).to_hash )
22
+ assert_equal h, ExternalRoute.new(h).to_hash
23
+ assert_equal h, ExternalRoute.new(ExternalRoute.new(h).encode).to_hash
24
+
25
+ ext = ExternalRoute.new(h)
26
+ assert_equal '800000ff01010101000000ff', ext.to_shex
27
+ ext2 = ExternalRoute.new(ext)
28
+ assert_equal '800000ff01010101000000ff', ext2.to_shex
29
+
30
+ ext = ExternalRoute.new(['800000ff01010101000000ff'].pack('H*'))
31
+ assert_equal 255, ext.tag
32
+ assert_equal :e2, ext.type
33
+ assert_equal '1.1.1.1', ext.forwarding_address.to_ip
34
+ assert_equal 0, ext.mt_id
35
+ end
36
+
37
+ def test_mt
38
+ assert_raise(ArgumentError) { MtExternalRoute.new }
39
+ assert_raise(ArgumentError) { MtExternalRoute.new(:metric=> 10) }
40
+ assert_raise(ArgumentError) { MtExternalRoute.new(:id=> 0) }
41
+ assert MtExternalRoute.new(:mt_id=>1)
42
+ ext = ExternalRoute.new(['810000ff01010101000000ff'].pack('H*'))
43
+ assert_equal 255, ext.tag
44
+ assert_equal :e2, ext.type
45
+ assert_equal '1.1.1.1', ext.forwarding_address.to_ip
46
+ assert_equal 1, ext.mt_id
47
+ ext = MtExternalRoute.new(MtExternalRoute.new(:mt_id=>10, :tag=>20, :forwarding_address=>'1.1.1.1'))
48
+ assert_equal ext.to_shex, MtExternalRoute.new(ext).to_shex
49
+ end
50
+
51
+ end
@@ -0,0 +1,22 @@
1
+
2
+ require "test/unit"
3
+ require 'ie/id.rb'
4
+
5
+ class TestIeId < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_new
8
+ assert Id.new
9
+ assert_equal 'Id: 0.0.0.0', Id.new.to_s
10
+ assert_equal 'Id: 0.0.0.0', Id.new.to_s
11
+ assert_equal 'Id: 1.1.1.1', Id.new('1.1.1.1').to_s
12
+ assert_equal 'Id: 1.1.1.1', Id.new(0x01010101).to_s
13
+ assert_equal 'Id: 1.1.1.1', Id.new(IPAddr.new('1.1.1.1')).to_s
14
+ assert_equal '0a000001', Id.new(0x0a000001).to_shex
15
+ assert_equal '0a000001', Id.new(Id.new(Id.new(0x0a000001))).to_shex
16
+ end
17
+ def test_new_ntoh
18
+ assert_equal 'Id: 0.0.0.0', Id.new_ntoh(Id.new.enc).to_s
19
+ assert_equal 'Id: 1.1.1.1', Id.new_ntoh(Id.new('1.1.1.1').enc).to_s
20
+ end
21
+ end
22
+
@@ -0,0 +1,23 @@
1
+ require "test/unit"
2
+
3
+ require "ie/interface_mtu"
4
+
5
+ class TestIeInterfaceMtu < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_new
8
+ assert InterfaceMtu
9
+ assert_equal( '05dc', InterfaceMtu.new.to_shex)
10
+ assert_equal( 'InterfaceMtu: 1500', InterfaceMtu.new.to_s)
11
+ assert_equal( 1500, InterfaceMtu.new.to_i)
12
+ assert_equal( '05c4', InterfaceMtu.new(1476).to_shex)
13
+ assert_equal( 'InterfaceMtu: 255', InterfaceMtu.new(255).to_s)
14
+ assert_equal( 255, InterfaceMtu.new(255).to_i)
15
+ assert_raise(RuntimeError) { InterfaceMtu.new 0xffffffff }
16
+ assert_raise(RuntimeError) { InterfaceMtu.new 0xfffffff }
17
+ assert_raise(RuntimeError) { InterfaceMtu.new 0x1ffffff }
18
+ assert_raise(RuntimeError) { InterfaceMtu.new( -1) }
19
+ assert_equal( 'InterfaceMtu: 65535', InterfaceMtu.new(0xffff).to_s)
20
+ assert_equal( 'ffff', InterfaceMtu.new(0xffff).to_shex)
21
+ assert_equal( 72, InterfaceMtu.new.number_of_lsa)
22
+ end
23
+ end
@@ -0,0 +1,46 @@
1
+ require "test/unit"
2
+
3
+ require "ie/ls_age"
4
+
5
+ class TestIeLsAge < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_new
8
+ assert LsAge.new
9
+ assert_equal( 0, LsAge.new.to_i)
10
+ assert_equal( 1, LsAge.new(1).to_i)
11
+ end
12
+ def test_compare
13
+ a1 = LsAge.new
14
+ a2 = LsAge.new(2)
15
+ assert( ! (a1 == a2), "should not be equal")
16
+ assert( (a1 < a2), "a1 is more recent, i.e smaller age")
17
+ end
18
+ def test_minus
19
+ a1 = LsAge.new
20
+ a2 = LsAge.new(2)
21
+ assert_equal( -2, a1 - a2)
22
+ assert_equal( 2, a2 - a1)
23
+ end
24
+ def test_maxage
25
+ a1 = LsAge.new
26
+ assert_equal( 0, a1.to_i)
27
+ assert_equal( 3600, a1.maxage)
28
+ assert( a1.maxaged?, 'should be maxaged!')
29
+ end
30
+ def test_aging
31
+ a1 = LsAge.new(20)
32
+ sleep 1.1
33
+ assert_equal( 20, a1.to_i)
34
+ assert( ! LsAge.aging?)
35
+ assert_equal( 20, a1.to_i)
36
+ LsAge.aging :on
37
+ assert LsAge.aging?
38
+ assert_equal( 20, a1.to_i)
39
+ sleep 1.1
40
+ assert( LsAge.aging?)
41
+ assert_equal( 21, a1.to_i)
42
+ LsAge.aging :off
43
+ assert( ! LsAge.aging?)
44
+ assert_equal( 20, a1.to_i)
45
+ end
46
+ end
@@ -0,0 +1,41 @@
1
+
2
+ require "test/unit"
3
+ require 'ie/ls_type'
4
+
5
+
6
+ class TestIeLsType < Test::Unit::TestCase
7
+ include OSPFv2
8
+ def test_new
9
+ assert LsType.new :router
10
+ assert_equal 'LsType: router', LsType.new(:router).to_s
11
+ assert_equal 'LsType: network', LsType.new(:network).to_s
12
+ assert_equal 'LsType: summary', LsType.new(:summary).to_s
13
+ assert_equal 'LsType: asbr_summary', LsType.new(:asbr_summary).to_s
14
+ assert_equal 'LsType: as_external', LsType.new(:as_external).to_s
15
+ assert_equal 'LsType: link_local', LsType.new(:link_local).to_s
16
+ assert_equal 'LsType: domain', LsType.new(:domain).to_s
17
+ assert_equal 'LsType: area', LsType.new(:area).to_s
18
+ assert_equal 1, LsType.new(:router).to_i
19
+ assert_equal 2, LsType.new(:network).to_i
20
+ assert_equal 3, LsType.new(:summary).to_i
21
+ assert_equal 4, LsType.new(:asbr_summary).to_i
22
+ assert_equal 5, LsType.new(:as_external).to_i
23
+ assert_equal 9, LsType.new(:link_local).to_i
24
+ assert_equal 10, LsType.new(:area).to_i
25
+ assert_equal 11, LsType.new(:domain).to_i
26
+ assert_equal :router, LsType.new(1).to_sym
27
+ assert_equal :summary, LsType.new(3).to_sym
28
+ assert_equal :network, LsType.new(2).to_sym
29
+ assert_equal :asbr_summary, LsType.new(4).to_sym
30
+ assert_equal :as_external, LsType.new(5).to_sym
31
+ assert_equal :link_local, LsType.new(9).to_sym
32
+ assert_equal :area, LsType.new(10).to_sym
33
+ assert_equal :domain, LsType.new(11).to_sym
34
+ assert LsType.new(:link_local).is_opaque?
35
+ assert ! LsType.new(:router).is_opaque?
36
+ assert LsType.new(:area).is_opaque?
37
+ assert_equal 'OpaqLoca', LsType.new(:link_local).to_junos
38
+ assert_equal 'Network', LsType.new(:network).to_junos
39
+ end
40
+ end
41
+
@@ -0,0 +1,24 @@
1
+ require "test/unit"
2
+
3
+ require "ie/metric"
4
+
5
+ class TestIeMetric < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_new
8
+ assert Metric
9
+ assert_equal( '00000000', Metric.new.to_shex)
10
+ assert_equal( 'Metric: 0', Metric.new.to_s)
11
+ assert_equal( 0, Metric.new.to_i)
12
+ assert_equal( '000000ff', Metric.new(255).to_shex)
13
+ assert_equal( 'Metric: 255', Metric.new(255).to_s)
14
+ assert_equal( 255, Metric.new(255).to_i)
15
+ assert_raise(RuntimeError) { Metric.new 0xffffffff }
16
+ assert_raise(RuntimeError) { Metric.new 0xfffffff }
17
+ assert_raise(RuntimeError) { Metric.new 0x1ffffff }
18
+ assert_raise(RuntimeError) { Metric.new( -1) }
19
+ assert_equal( 'Metric: 16777215', Metric.new(0x0ffffff).to_s)
20
+ assert_equal( 'Topology default (ID 0) -> Metric: 16777215', Metric.new(0x0ffffff).to_s_junos)
21
+ assert_equal( '000fffff', Metric.new(0xfffff).to_shex)
22
+ assert_equal( 'ffff', Metric.new(0xfffff).to_shex('n'))
23
+ end
24
+ end
@@ -0,0 +1,27 @@
1
+ require "test/unit"
2
+ require "ie/mt_metric"
3
+
4
+ class TestIeMtMetric < Test::Unit::TestCase
5
+ include OSPFv2
6
+ def tests
7
+ assert MtMetric.new
8
+ assert_equal '00000000', MtMetric.new.to_shex
9
+ assert_equal 'Topology 0, Metric 0', MtMetric.new.to_s
10
+ assert_equal '01000001', MtMetric.new(:id => 1, :metric => 1).to_shex
11
+ assert_equal '01ffffff', MtMetric.new(:id => 1, :metric => 0xffffff).to_shex
12
+ assert_equal '01ffffff', MtMetric.new(:id => 1, :metric => 0xffffffff).to_shex
13
+ assert_equal 1, MtMetric.new(:id => 1, :metric => 0xffffffff).id
14
+ assert_equal 4294967295, MtMetric.new(:id => 1, :metric => 0xffffffff).metric
15
+ assert_equal( {:id=>1, :metric=>1}, MtMetric.new(:id => 1, :metric => 1).to_hash)
16
+ assert_equal( 'Topology 1, Metric 1', MtMetric.new(:id => 1, :metric => 1).to_s)
17
+ assert_equal( 'Topology 1, Metric 1', MtMetric.new(:id => 1, :metric => 1).to_s)
18
+ assert_equal( 'Topology 1, Metric 1', MtMetric.new([1,1]).to_s)
19
+ assert_equal 'Topology (ID 1) -> Metric: 1', MtMetric.new([1,1]).to_s_junos
20
+ assert_equal MtMetric.new([1,1]).to_shex, MtMetric.new(MtMetric.new([1,1])).to_shex
21
+ m = MtMetric.new(['01ffffff'].pack('H*'))
22
+ assert_equal '01ffffff', m.to_shex
23
+ assert_equal 1, m.id
24
+ assert_equal 1, m.id
25
+ assert_equal 0xffffff, m.metric
26
+ end
27
+ end
@@ -0,0 +1,22 @@
1
+ require "test/unit"
2
+
3
+ require "ie/opaque_id"
4
+
5
+ class TestIeOpaqueId < Test::Unit::TestCase
6
+ include OSPFv2
7
+ def test_new
8
+ assert OpaqueId.new
9
+ assert_equal( '000000', OpaqueId.new.to_shex)
10
+ assert_equal( 'OpaqueId: 0', OpaqueId.new.to_s)
11
+ assert_equal( 0, OpaqueId.new.to_i)
12
+ assert_equal( '0000ff', OpaqueId.new(255).to_shex)
13
+ assert_equal( 'OpaqueId: 255', OpaqueId.new(255).to_s)
14
+ assert_equal( 255, OpaqueId.new(255).to_i)
15
+ assert_raise(RuntimeError) { OpaqueId.new 0xffffffff }
16
+ assert_raise(RuntimeError) { OpaqueId.new 0xfffffff }
17
+ assert_raise(RuntimeError) { OpaqueId.new 0x1ffffff }
18
+ assert_raise(RuntimeError) { OpaqueId.new( -1) }
19
+ assert_equal( 'OpaqueId: 16777215', OpaqueId.new(0x0ffffff).to_s)
20
+ assert_equal( '0fffff', OpaqueId.new(0xfffff).to_shex)
21
+ end
22
+ end