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,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
+