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
@@ -0,0 +1,22 @@
1
+
2
+ require "test/unit"
3
+ require 'ie/opaque_type'
4
+
5
+
6
+ class TestIeLsType < Test::Unit::TestCase
7
+ include OSPFv2
8
+ def test_new
9
+ assert OpaqueType.new
10
+ assert_equal 'OpaqueType: te_lsa', OpaqueType.new.to_s
11
+ assert_equal 'OpaqueType: te_lsa', OpaqueType.new(:te_lsa).to_s
12
+ assert_equal 'OpaqueType: grace_lsa', OpaqueType.new(:grace_lsa).to_s
13
+ assert_equal [1], OpaqueType.new.encode.unpack('C')
14
+ assert_equal [1], OpaqueType.new(:te_lsa).encode.unpack('C')
15
+ assert_equal [1], OpaqueType.new(1).encode.unpack('C')
16
+ assert_equal [3], OpaqueType.new(:grace_lsa).encode.unpack('C')
17
+ assert_equal [3], OpaqueType.new(3).encode.unpack('C')
18
+ assert_equal :te_lsa, OpaqueType.new(1).to_sym
19
+ assert_equal :grace_lsa, OpaqueType.new(3).to_sym
20
+ end
21
+ end
22
+
@@ -0,0 +1,142 @@
1
+ #
2
+ # Created by Jean-Michel Esnault.
3
+ # Copyright (c) 2008. All rights reserved.
4
+ #
5
+
6
+ require 'test/unit'
7
+ require 'pp'
8
+ require 'ie/options'
9
+
10
+ class TestOptions < Test::Unit::TestCase # :nodoc:
11
+ include OSPFv2
12
+ def test_dc_bit
13
+ assert_equal("Options: 0x20 [DC]", Options.new({:DC=>1}).to_s)
14
+ assert_equal("Options: 0x20 [DC]", Options.new({:dc=>1}).to_s)
15
+ assert_equal(32, Options.new({:DC=>true}).options)
16
+ assert_equal(32, Options.new({:dc=>true}).options)
17
+ assert_equal(true, Options.new({:dc=>true}).dc?)
18
+ assert_equal(0, Options.new({:DC=>0}).options)
19
+ assert_equal(0, Options.new({:dc=>0}).options)
20
+ assert_equal(0, Options.new({:DC=>false}).options)
21
+ assert_equal(0, Options.new({:dc=>false}).options)
22
+ assert_equal(false, Options.new({:dc=>false}).dc?)
23
+ end
24
+ def test_l_bit
25
+ assert_equal("Options: 0x10 [L]", Options.new({:L=>1}).to_s)
26
+ assert_equal("Options: 0x10 [L]", Options.new({:l=>1}).to_s)
27
+ assert_equal(16, Options.new({:L=>true}).options)
28
+ assert_equal(16, Options.new({:l=>true}).options)
29
+ assert_equal(true, Options.new({:l=>true}).l?)
30
+ assert_equal(0, Options.new({:L=>0}).options)
31
+ assert_equal(0, Options.new({:l=>0}).options)
32
+ assert_equal(0, Options.new({:L=>false}).options)
33
+ assert_equal(0, Options.new({:l=>false}).options)
34
+ assert_equal(false, Options.new({:l=>false}).l?)
35
+ end
36
+ def test_n_bit
37
+ assert_equal("Options: 0x8 [N]", Options.new({:N=>1}).to_s)
38
+ assert_equal("Options: 0x8 [N]", Options.new({:n=>1}).to_s)
39
+ assert_equal(8, Options.new({:N=>true}).options)
40
+ assert_equal(8, Options.new({:n=>true}).options)
41
+ assert_equal(true, Options.new({:n=>true}).n?)
42
+ assert_equal(true, Options.new({:p=>true}).p?)
43
+ assert_equal(0, Options.new({:N=>0}).options)
44
+ assert_equal(0, Options.new({:n=>0}).options)
45
+ assert_equal(0, Options.new({:N=>false}).options)
46
+ assert_equal(0, Options.new({:n=>false}).options)
47
+ assert_equal(false, Options.new({:n=>false}).n?)
48
+ end
49
+ def test_mc_bit
50
+ assert_equal("Options: 0x4 [MC]", Options.new({:MC=>1}).to_s)
51
+ assert_equal("Options: 0x4 [MC]", Options.new({:mc=>1}).to_s)
52
+ assert_equal(4, Options.new({:MC=>true}).options)
53
+ assert_equal(4, Options.new({:mc=>true}).options)
54
+ assert_equal(true, Options.new({:mc=>true}).mc?)
55
+ assert_equal(0, Options.new({:MC=>0}).options)
56
+ assert_equal(0, Options.new({:mc=>0}).options)
57
+ assert_equal(0, Options.new({:MC=>false}).options)
58
+ assert_equal(0, Options.new({:mc=>false}).options)
59
+ assert_equal(false, Options.new({:mc=>false}).mc?)
60
+ end
61
+ def test_e_bit
62
+ assert_equal("Options: 0x2 [E]", Options.new({:E=>1}).to_s)
63
+ assert_equal("Options: 0x2 [E]", Options.new({:e=>1}).to_s)
64
+ assert_equal(2, Options.new({:E=>true}).options)
65
+ assert_equal(2, Options.new({:e=>true}).options)
66
+ assert_equal(true, Options.new({:e=>true}).e?)
67
+ assert_equal(0, Options.new({:E=>0}).options)
68
+ assert_equal(0, Options.new({:e=>0}).options)
69
+ assert_equal(0, Options.new({:E=>false}).options)
70
+ assert_equal(0, Options.new({:e=>false}).options)
71
+ assert_equal(false, Options.new({:e=>false}).e?)
72
+ end
73
+ def test_v6_bit
74
+ assert_equal("Options: 0x1 [V6]", Options.new({:V6=>1}).to_s)
75
+ assert_equal("Options: 0x1 [V6]", Options.new({:v6=>1}).to_s)
76
+ assert_equal(1, Options.new({:V6=>true}).options)
77
+ assert_equal(1, Options.new({:v6=>true}).options)
78
+ assert_equal(true, Options.new({:v6=>true}).v6?)
79
+ assert_equal(0, Options.new({:V6=>0}).options)
80
+ assert_equal(0, Options.new({:v6=>0}).options)
81
+ assert_equal(0, Options.new({:V6=>false}).options)
82
+ assert_equal(0, Options.new({:v6=>false}).options)
83
+ assert_equal(false, Options.new({:v6=>false}).v6?)
84
+ end
85
+ def test_opaque_bit
86
+ assert_equal("Options: 0x40 [O]", Options.new({:O=>1}).to_s)
87
+ assert_equal("Options: 0x40 [O]", Options.new({:o=>1}).to_s)
88
+ assert_equal(64, Options.new({:O=>true}).options)
89
+ assert_equal(64, Options.new({:o=>true}).options)
90
+ assert_equal(true, Options.new({:o=>true}).o?)
91
+ assert_equal(0, Options.new({:O=>0}).options)
92
+ assert_equal(0, Options.new({:o=>0}).options)
93
+ assert_equal(0, Options.new({:o=>false}).options)
94
+ assert_equal(0, Options.new({:o=>false}).options)
95
+ assert_equal(false, Options.new({:o=>false}).o?)
96
+ end
97
+ def test_set_multi_bit
98
+ opt = Options.new
99
+ opt.setDC
100
+ assert_equal("Options: 0x20 [DC]", opt.to_s)
101
+ opt.setL
102
+ assert_equal("Options: 0x30 [L,DC]", opt.to_s)
103
+ opt.setN
104
+ assert_equal("Options: 0x38 [L,DC,N]", opt.to_s)
105
+ opt.setMC
106
+ assert_equal("Options: 0x3c [L,DC,N,MC]", opt.to_s)
107
+ opt.setE
108
+ assert_equal("Options: 0x3e [L,DC,N,MC,E]", opt.to_s)
109
+ opt.setV6
110
+ assert_equal("Options: 0x3f [L,DC,N,MC,E,V6]", opt.to_s)
111
+ opt = Options.new
112
+ opt.setDC << opt.setV6 << opt.setMC
113
+ assert_equal("Options: 0x25 [DC,MC,V6]", opt.to_s)
114
+ end
115
+ def test_unset_multi_bit
116
+ opt = Options.new
117
+ opt.options=0x7f
118
+ assert_equal("Options: 0x7f [O,L,DC,N,MC,E,V6]", opt.to_s)
119
+ opt.unsetE << opt.unsetMC
120
+ assert_equal("Options: 0x79 [O,L,DC,N,V6]", opt.to_s)
121
+ opt.unsetDC << opt.unsetL << opt.unsetO
122
+ assert_equal("Options: 0x9 [N,V6]", opt.to_s)
123
+ opt.unsetV6 << opt.unsetN
124
+ assert_equal(0, opt.options)
125
+ end
126
+ def test_set_nssa
127
+ opt = Options.new
128
+ opt.setE
129
+ assert_equal("Options: 0x2 [E]", opt.to_s)
130
+ opt.setNSSA
131
+ assert_equal("Options: 0x8 [N]", opt.to_s)
132
+ end
133
+
134
+ def test_enc
135
+ opt = Options.new([0x3f].pack('C'))
136
+ assert_equal("Options: 0x3f [L,DC,N,MC,E,V6]", opt.to_s)
137
+ assert_equal(true, opt.dc?)
138
+ assert_equal(true, opt.e?)
139
+ assert_equal("3f", opt.to_shex)
140
+ end
141
+
142
+ end
File without changes
@@ -0,0 +1,33 @@
1
+
2
+ require "test/unit"
3
+ require 'ie/packet_type'
4
+
5
+
6
+ class TestPacketType < Test::Unit::TestCase
7
+ include OSPFv2
8
+ def test_new
9
+ assert PacketType.new
10
+ assert_equal 'PacketType: hello', PacketType.new(:hello).to_s
11
+ assert_equal 'PacketType: dd', PacketType.new(:dd).to_s
12
+ assert_equal 'PacketType: ls_request', PacketType.new(:ls_request).to_s
13
+ assert_equal 'PacketType: ls_update', PacketType.new(:ls_update).to_s
14
+ assert_equal 'PacketType: ls_ack', PacketType.new(:ls_ack).to_s
15
+ assert_equal :hello, PacketType.new(:hello).to_sym
16
+ assert_equal 1, PacketType.new(:hello).to_i
17
+ assert_equal 2, PacketType.new(:dd).to_i
18
+ assert_equal 3, PacketType.new(:ls_request).to_i
19
+ assert_equal 4, PacketType.new(:ls_update).to_i
20
+ assert_equal 5, PacketType.new(:ls_ack).to_i
21
+ assert_equal 1, PacketType.new(1).to_i
22
+ assert_equal 2, PacketType.new(2).to_i
23
+ assert_equal 3, PacketType.new(3).to_i
24
+ assert_equal 4, PacketType.new(4).to_i
25
+ assert_equal 5, PacketType.new(5).to_i
26
+ assert_equal :hello, PacketType.new(:hello).to_sym
27
+ assert_equal :dd, PacketType.new(:dd).to_sym
28
+ assert_equal :ls_request, PacketType.new(:ls_request).to_sym
29
+ assert_equal :ls_update, PacketType.new(:ls_update).to_sym
30
+ assert_equal :ls_ack, PacketType.new(:ls_ack).to_sym
31
+ end
32
+ end
33
+
@@ -0,0 +1,26 @@
1
+ require "test/unit"
2
+ require "ie/router_link_factory"
3
+
4
+ class TestIeRouterLinkFactory < Test::Unit::TestCase
5
+ include OSPFv2
6
+ def tests
7
+ assert_equal RouterLink::PointToPoint, (l1=RouterLink.factory(['000000000000000001000000'].pack('H*'))).class
8
+ assert_equal RouterLink::StubNetwork, (l2=RouterLink.factory(['000000000000000003000000'].pack('H*'))).class
9
+ assert_equal RouterLink::VirtualLink, (l3=RouterLink.factory(['000000000000000004000000'].pack('H*'))).class
10
+ assert_equal RouterLink::TransitNetwork, (l4=RouterLink.factory(['000000000000000002000000'].pack('H*'))).class
11
+ assert_equal RouterLink::TransitNetwork, (l5=RouterLink.factory(['0000000000000000020100000a000014'].pack('H*'))).class
12
+ assert_raise(ArgumentError) { RouterLink.factory(:link_id=> '1.1.1.1') }
13
+ assert_equal RouterLink::PointToPoint, RouterLink.factory(:link_data=> '1.1.1.1', :router_link_type => :point_to_point).class
14
+ assert_equal RouterLink::TransitNetwork, RouterLink.factory(:link_data=> '1.1.1.1', :router_link_type => :transit_network).class
15
+ assert_equal RouterLink::StubNetwork, RouterLink.factory(:link_data=> '1.1.1.1', :router_link_type => :stub_network).class
16
+ assert_equal RouterLink::VirtualLink, RouterLink.factory(:link_data=> '1.1.1.1', :router_link_type => :virtual_link).class
17
+ l1h = RouterLink.factory :router_link_type=>:point_to_point, :metric=>0, :tos_metrics=>[], :link_id=>"0.0.0.0", :link_data=>"0.0.0.0"
18
+ assert_equal l1h.to_shex , l1.to_shex
19
+ l1h = RouterLink.factory :router_link_type=>:point_to_point, :tos_metrics=>[], :link_id=>"0.0.0.0", :link_data=>"0.0.0.0"
20
+ assert_equal l1.to_shex, l1h.to_shex
21
+ l1h = RouterLink::PointToPoint.new :router_link_type=>:point_to_point, :tos_metrics=>[], :link_id=>"0.0.0.0", :link_data=>"0.0.0.0"
22
+ assert_equal l1.to_shex, l1h.to_shex
23
+ assert_equal l1.to_hash, l1h.to_hash
24
+ end
25
+ end
26
+
@@ -0,0 +1,276 @@
1
+ require "test/unit"
2
+ require "ie/router_link"
3
+ require 'ie/router_link_factory'
4
+ class TestIeRouterLink < Test::Unit::TestCase
5
+ include OSPFv2
6
+ def tests
7
+ assert RouterLink.new
8
+ assert_equal '000000000000000001000000', RouterLink.new.to_shex
9
+ assert_equal 4*3, RouterLink.new.encode.size
10
+ assert_equal '', RouterLink.new.router_link_type.to_s
11
+ assert_equal '010101010000000001000000', RouterLink.new( :link_id=> '1.1.1.1').to_shex
12
+ assert_equal '01010101ffffffff01000000',
13
+ RouterLink.new( :link_id=> '1.1.1.1', :link_data=> '255.255.255.255').to_shex
14
+ assert_equal '01010101ffffffff0100000a',
15
+ RouterLink.new( :link_id=> '1.1.1.1', :link_data=> '255.255.255.255', :metric=>10).to_shex
16
+ assert_equal '01010101ffffffff0101000a0a000014',
17
+ RouterLink.new( :link_id=> '1.1.1.1',
18
+ :link_data=> '255.255.255.255',
19
+ :metric=>10,
20
+ :mt_metrics =>{ :id=>10, :metric=>20}).to_shex
21
+ assert_equal '01010101ffffffff0102000a0a0000140b00001e',
22
+ RouterLink.new( :link_id=> '1.1.1.1',
23
+ :link_data=> '255.255.255.255',
24
+ :metric=>10,
25
+ :mt_metrics => [{:id=>10, :metric=>20},{:id=>11, :metric=>30}]
26
+ ).to_shex
27
+
28
+ assert_equal '010101010000000001000000', RouterLink.new(:link_id=> '1.1.1.1').to_shex
29
+ assert_equal '000000000101010101000000', RouterLink.new(:link_data=> '1.1.1.1').to_shex
30
+ assert_equal '020202020101010101000000', RouterLink.new(:link_data=> '1.1.1.1', :link_id=>'2.2.2.2').to_shex
31
+ assert_equal '02020202010101010100000a', RouterLink.new(:link_data=> '1.1.1.1', :link_id=>'2.2.2.2', :metric=>10).to_shex
32
+ assert_equal '02020202010101010101000a0a000014',
33
+ RouterLink.new(:link_data=> '1.1.1.1', :link_id=>'2.2.2.2', :metric=>10, :mt_metrics =>{ :id=>10, :metric=>20}).to_shex
34
+
35
+ h = {
36
+ :link_id=> '1.1.1.1',
37
+ :link_data=> '255.255.255.255',
38
+ :metric=>10,
39
+ :mt_metrics => [{:id=>10, :metric=>20},{:id=>11, :metric=>30}]
40
+ }
41
+ assert_equal(h, RouterLink.new(h).to_hash)
42
+ assert RouterLink::PointToPoint.new({})
43
+ assert_equal '000000000000000001000000', RouterLink::PointToPoint.new({}).to_shex
44
+ assert_equal '000000000000000003000000', RouterLink::StubNetwork.new({}).to_shex
45
+ assert_equal '000000000000000004000000', RouterLink::VirtualLink.new({}).to_shex
46
+ assert_equal '000000000000000002000000', RouterLink::TransitNetwork.new({}).to_shex
47
+ assert_equal '010101010000000001000000', RouterLink::PointToPoint.new(:link_id=>'1.1.1.1').to_shex
48
+ assert_equal '000000000202020203000000', RouterLink::StubNetwork.new(:link_data=>'2.2.2.2').to_shex
49
+ assert_equal '00000000000000000400abcd', RouterLink::VirtualLink.new(:metric=>0xabcd).to_shex
50
+ assert_equal '0000000000000000020100000a000014',
51
+ RouterLink::TransitNetwork.new(:mt_metrics =>{ :id=>10, :metric=>20}).to_shex
52
+
53
+ assert_equal '000000000000000001000000', RouterLink.new(['000000000000000001000000'].pack('H*')).to_shex
54
+ assert_equal '000000000000000003000000', RouterLink.new(['000000000000000003000000'].pack('H*')).to_shex
55
+ assert_equal '000000000000000004000000', RouterLink.new(['000000000000000004000000'].pack('H*')).to_shex
56
+ assert_equal '000000000000000002000000', RouterLink.new(['000000000000000002000000'].pack('H*')).to_shex
57
+ assert_equal '0000000000000000020100000a000014', RouterLink.new(['0000000000000000020100000a000014'].pack('H*')).to_shex
58
+
59
+ end
60
+
61
+ def test_point_2_point
62
+
63
+
64
+
65
+ # puts RouterLink::PointToPoint.new(:link_data=> '2.2.2.2', :link_id=>'1.1.1.1').to_s
66
+ # puts RouterLink::PointToPoint.new(:link_data=> '2.2.2.2', :link_id=>'1.1.1.1').to_s_junos
67
+ # puts RouterLink::PointToPoint.new(:link_data=> '2.2.2.2', :link_id=>'1.1.1.1').to_s_ios
68
+ #
69
+
70
+
71
+
72
+
73
+
74
+ end
75
+
76
+
77
+
78
+ def test_misc
79
+ h = {:router_link_type=>3, :metric=>1, :link_data=>"255.255.255.240", :link_id=>"192.168.8.0"}
80
+ assert_equal "c0a80800fffffff003000001", RouterLink.factory(h).to_shex
81
+ h = {:router_link_type=>1, :metric=>1,:mt_metrics=>[{:id=>15, :metric=>14}, {:id=>13, :metric=>12}], :link_data=>"10.254.233.233",:link_id=>"2.2.2.2"}
82
+ assert_equal "020202020afee9e9010200010f00000e0d00000c", RouterLink.factory(h).to_shex
83
+ end
84
+
85
+ def test_tos_metric
86
+ h = {:router_link_type=>1, :metric=>1, :link_data=>"10.254.233.233",:link_id=>"2.2.2.2"}
87
+ rlink = RouterLink.factory(h)
88
+ rlink << [33,20]
89
+ rlink << [34,255]
90
+ assert_equal "020202020afee9e90102000121000014220000ff", rlink.to_shex
91
+ rlink = RouterLink.new(h)
92
+ rlink << MtMetric.new([33,20])
93
+ rlink << MtMetric.new([34,255])
94
+ assert_equal("020202020afee9e90102000121000014220000ff", rlink.to_shex)
95
+ rlink = RouterLink.new(h)
96
+ rlink << [33,20] << [34,255]
97
+ assert_equal("020202020afee9e90102000121000014220000ff", rlink.to_shex)
98
+ rlink = RouterLink.new(h)
99
+ assert_raise(ArgumentError) { rlink << [33] }
100
+ assert_raise(ArgumentError) { rlink << [33,100,1] }
101
+ end
102
+
103
+ def test_router_link_p2p
104
+ h = {:metric=>1, :link_data=>"255.255.255.240", :link_id=>"192.168.8.0"}
105
+ assert_equal "PointToPoint:\n LinkId: 192.168.8.0\n LinkData: 255.255.255.240\n RouterLinkType: point_to_point\n Metric: 1",
106
+ RouterLink::PointToPoint.new(h).to_s
107
+ assert_equal "c0a80800fffffff001000001", RouterLink::PointToPoint.new(h).to_shex
108
+ assert_equal(:point_to_point, RouterLink::PointToPoint.new(h).to_hash[:router_link_type])
109
+ assert_equal(1, RouterLink::PointToPoint.new(h).to_hash[:metric])
110
+ assert_equal("255.255.255.240", RouterLink::PointToPoint.new(h).to_hash[:link_data])
111
+ assert_equal("192.168.8.0", RouterLink::PointToPoint.new(h).to_hash[:link_id])
112
+ assert_equal( RouterLink::PointToPoint.new(h).encode, RouterLink::PointToPoint.new( RouterLink::PointToPoint.new(h)).encode)
113
+ end
114
+
115
+ def test_new_from_hash
116
+ h = {:metric=>1, :link_data=>"255.255.255.240", :link_id=>"192.168.8.0"}
117
+ assert_equal RouterLink::PointToPoint, RouterLink.new_point_to_point(h).class
118
+ assert_equal RouterLink::StubNetwork, RouterLink.new_stub_network(h).class
119
+ assert_equal RouterLink::TransitNetwork, RouterLink.new_transit_network(h).class
120
+ assert_equal RouterLink::VirtualLink, RouterLink.new_virtual_link(h).class
121
+ end
122
+
123
+ def test_to_s
124
+ h = {:metric=>1, :link_data=>"255.255.255.240", :link_id=>"192.168.8.0",
125
+ :mt_metrics => [{:id=>10, :metric=>20},{:id=>11, :metric=>30}]}
126
+ assert_match( /PointToPoint:\n LinkId: 192.168.8.0\n/ ,RouterLink.new_point_to_point(h).to_s)
127
+ assert_match( /LinkData: 255.255.255.240\n/,RouterLink.new_point_to_point(h).to_s)
128
+ assert_match( /RouterLinkType: point_to_point\n Metric: 1/,RouterLink.new_point_to_point(h).to_s)
129
+ end
130
+
131
+ # id 0.0.0.2, data 192.168.2.1, Type PointToPoint (1)
132
+ # Topology count: 0, Default metric: 2
133
+ # id 192.168.2.0, data 255.255.255.0, Type Stub (3)
134
+ # Topology count: 0, Default metric: 2
135
+ # id 0.0.0.3, data 192.168.3.1, Type PointToPoint (1)
136
+ # Topology count: 0, Default metric: 2
137
+ # id 192.168.3.0, data 255.255.255.0, Type Stub (3)
138
+ # Topology count: 0, Default metric: 2
139
+ # id 0.0.0.4, data 192.168.4.1, Type PointToPoint (1)
140
+ # Topology count: 0, Default metric: 2
141
+ # id 192.168.4.0, data 255.255.255.0, Type Stub (3)
142
+ # Topology count: 0, Default metric: 2
143
+ #
144
+ def test_to_s_junos
145
+ h_link1 = {:router_link_type=>1, :metric=>1, :link_data=>"255.255.255.240", :link_id=>"192.168.8.0"}
146
+ h_link2 = {:router_link_type=>2, :metric=>1, :link_data=>"255.255.255.240", :link_id=>"192.168.8.0"}
147
+ h_link3 = {:router_link_type=>3, :metric=>1, :link_data=>"255.255.255.240", :link_id=>"192.168.8.0"}
148
+ 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(h_link1).to_s_junos)
149
+ assert_equal(" id 192.168.8.0, data 255.255.255.240, Type Transit (2)\n Topology count: 0, Default metric: 1", RouterLink.new(h_link2).to_s_junos)
150
+ assert_equal(" id 192.168.8.0, data 255.255.255.240, Type Stub (3)\n Topology count: 0, Default metric: 1", RouterLink.new(h_link3).to_s_junos)
151
+ h = {
152
+ :router_link_type => 2,
153
+ :link_id=> '1.1.1.1',
154
+ :link_data=> '255.255.255.255',
155
+ :metric=>10,
156
+ :mt_metrics => [{:id=>10, :metric=>20},{:id=>11, :metric=>30}]
157
+ }
158
+
159
+ # puts ""
160
+ # puts RouterLink.new(h).to_s_junos
161
+ assert_equal(" id 1.1.1.1, data 255.255.255.255, Type Transit (2)\n Topology count: 2, Default metric: 10\n Topology 10, Metric 20\n Topology 11, Metric 30", RouterLink.new(h).to_s_junos)
162
+ end
163
+
164
+
165
+ end
166
+
167
+ __END__
168
+
169
+
170
+
171
+ OSPF Router with ID (1.1.1.1) (Process ID 1)
172
+
173
+ Router Link States (Area 0)
174
+
175
+ LS age: 1701
176
+ Options: (No TOS-capability, DC)
177
+ LS Type: Router Links
178
+ Link State ID: 1.1.1.1
179
+ Advertising Router: 1.1.1.1
180
+ LS Seq Number: 80000015
181
+ Checksum: 0xEEBC
182
+ Length: 84
183
+ Number of Links: 5
184
+
185
+ Link connected to: another Router (point-to-point)
186
+ (Link ID) Neighboring Router ID: 0.0.0.1
187
+ (Link Data) Router Interface address: 192.168.158.13
188
+ Number of TOS metrics: 0
189
+ TOS 0 Metrics: 1
190
+
191
+ Link connected to: a Stub Network
192
+ (Link ID) Network/subnet number: 192.168.158.0
193
+ (Link Data) Network Mask: 255.255.255.0
194
+ Number of TOS metrics: 0
195
+ TOS 0 Metrics: 1
196
+
197
+ Link connected to: a Transit Network
198
+ (Link ID) Designated Router address: 192.168.0.2
199
+ (Link Data) Router Interface address: 192.168.0.1
200
+ Number of TOS metrics: 0
201
+ TOS 0 Metrics: 10
202
+
203
+ Link connected to: a Stub Network
204
+ (Link ID) Network/subnet number: 20.0.0.3
205
+ (Link Data) Network Mask: 255.255.255.255
206
+ Number of TOS metrics: 0
207
+ TOS 0 Metrics: 1
208
+
209
+ Link connected to: a Stub Network
210
+ (Link ID) Network/subnet number: 20.0.0.1
211
+ (Link Data) Network Mask: 255.255.255.255
212
+ Number of TOS metrics: 0
213
+ TOS 0 Metrics: 1
214
+
215
+
216
+ R1#
217
+
218
+
219
+
220
+ LS age: 22
221
+ Options: 0x22 [DC,E]
222
+ LS Type: Router Links
223
+ Link State ID: 1.1.1.1
224
+ Advertising Router: 1.1.1.1
225
+ LS Seq Number: 80000019
226
+ Checksum: 0xE6C0
227
+ Length: 84
228
+ Number of Links: 5
229
+
230
+ Link connected to: another Router (point-to-point)
231
+ (Link ID) Neighboring Router ID: 0.0.0.1
232
+ (Link Data) Router Interface address: 192.168.158.13
233
+
234
+
235
+ Link connected to: a Stub Network
236
+ (Link ID) Network/subnet number: 192.168.158.0
237
+ (Link Data) Network Mask: 255.255.255.0
238
+
239
+
240
+ Link connected to: a Transit Network
241
+ (Link ID) Designated Router address: 192.168.0.2
242
+ (Link Data) Router Interface address: 192.168.0.1
243
+
244
+
245
+ Link connected to: a Stub Network
246
+ (Link ID) Network/subnet number: 20.0.0.3
247
+ (Link Data) Network Mask: 255.255.255.255
248
+
249
+
250
+ Link connected to: a Stub Network
251
+ (Link ID) Network/subnet number: 20.0.0.1
252
+ (Link Data) Network Mask: 255.255.255.255
253
+
254
+
255
+
256
+
257
+
258
+ LS Seq Number: 80000001
259
+ Checksum: 0xEC8D
260
+ Length: 72
261
+ Number of Links: 4
262
+
263
+ Link connected to: another Router (point-to-point)
264
+ (Link ID) Neighboring Router ID: 1.1.1.1
265
+ (Link Data) Router Interface address: 192.168.158.1
266
+ Number of TOS metrics: 0
267
+ TOS 0 Metrics: 1
268
+
269
+
270
+ Link connected to: a Stub Network
271
+ (Link ID) Network/subnet number: 192.168.158.1
272
+ (Link Data) Network Mask: 255.255.255.255
273
+ Number of TOS metrics: 0
274
+ TOS 0 Metrics: 1
275
+
276
+