ospfv2 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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