net-dns2 0.8.1

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 (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/.travis.yml +20 -0
  4. data/CHANGELOG.md +105 -0
  5. data/Gemfile +4 -0
  6. data/README.md +155 -0
  7. data/Rakefile +94 -0
  8. data/THANKS.rdoc +24 -0
  9. data/demo/check_soa.rb +115 -0
  10. data/demo/threads.rb +22 -0
  11. data/lib/net/dns.rb +112 -0
  12. data/lib/net/dns/core_ext.rb +52 -0
  13. data/lib/net/dns/header.rb +713 -0
  14. data/lib/net/dns/names.rb +118 -0
  15. data/lib/net/dns/packet.rb +563 -0
  16. data/lib/net/dns/question.rb +188 -0
  17. data/lib/net/dns/resolver.rb +1313 -0
  18. data/lib/net/dns/resolver/socks.rb +154 -0
  19. data/lib/net/dns/resolver/timeouts.rb +75 -0
  20. data/lib/net/dns/rr.rb +366 -0
  21. data/lib/net/dns/rr/a.rb +124 -0
  22. data/lib/net/dns/rr/aaaa.rb +103 -0
  23. data/lib/net/dns/rr/classes.rb +133 -0
  24. data/lib/net/dns/rr/cname.rb +82 -0
  25. data/lib/net/dns/rr/hinfo.rb +108 -0
  26. data/lib/net/dns/rr/mr.rb +79 -0
  27. data/lib/net/dns/rr/mx.rb +92 -0
  28. data/lib/net/dns/rr/ns.rb +78 -0
  29. data/lib/net/dns/rr/null.rb +53 -0
  30. data/lib/net/dns/rr/ptr.rb +83 -0
  31. data/lib/net/dns/rr/soa.rb +78 -0
  32. data/lib/net/dns/rr/srv.rb +45 -0
  33. data/lib/net/dns/rr/txt.rb +61 -0
  34. data/lib/net/dns/rr/types.rb +193 -0
  35. data/lib/net/dns/version.rb +16 -0
  36. data/net-dns.gemspec +37 -0
  37. data/test/header_test.rb +167 -0
  38. data/test/names_test.rb +21 -0
  39. data/test/packet_test.rb +49 -0
  40. data/test/question_test.rb +83 -0
  41. data/test/resolver_test.rb +117 -0
  42. data/test/rr/a_test.rb +113 -0
  43. data/test/rr/aaaa_test.rb +109 -0
  44. data/test/rr/classes_test.rb +85 -0
  45. data/test/rr/cname_test.rb +97 -0
  46. data/test/rr/hinfo_test.rb +117 -0
  47. data/test/rr/mr_test.rb +105 -0
  48. data/test/rr/mx_test.rb +112 -0
  49. data/test/rr/ns_test.rb +86 -0
  50. data/test/rr/types_test.rb +69 -0
  51. data/test/rr_test.rb +131 -0
  52. data/test/test_helper.rb +4 -0
  53. metadata +158 -0
@@ -0,0 +1,45 @@
1
+ module Net # :nodoc:
2
+ module DNS
3
+ class RR
4
+
5
+ #------------------------------------------------------------
6
+ # RR type SRV
7
+ #------------------------------------------------------------
8
+ class SRV < RR
9
+
10
+ attr_reader :priority, :weight, :port, :host
11
+
12
+ private
13
+
14
+ def build_pack
15
+ str = ""
16
+ end
17
+
18
+ def subclass_new_from_binary(data,offset)
19
+ off_end = offset + @rdlength
20
+ @priority, @weight, @port = data.unpack("@#{offset} n n n")
21
+ offset+=6
22
+
23
+ @host=[]
24
+ while offset < off_end
25
+ len = data.unpack("@#{offset} C")[0]
26
+ offset += 1
27
+ str = data[offset..offset+len-1]
28
+ offset += len
29
+ @host << str
30
+ end
31
+ @host=@host.join(".")
32
+ offset
33
+ end
34
+
35
+ private
36
+
37
+ def set_type
38
+ @type = Net::DNS::RR::Types.new("SRV")
39
+ end
40
+
41
+ end
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,61 @@
1
+ module Net # :nodoc:
2
+ module DNS
3
+ class RR
4
+
5
+ #------------------------------------------------------------
6
+ # RR type TXT
7
+ #------------------------------------------------------------
8
+ class TXT < RR
9
+ attr_reader :txt
10
+
11
+ private
12
+
13
+ def build_pack
14
+ str = ""
15
+ @txt.split(" ").each do |txt|
16
+ str += [txt.length,txt].pack("C a*")
17
+ end
18
+ @txt_pack = str
19
+ @rdlength = @txt_pack.size
20
+ end
21
+
22
+ def get_data
23
+ @txt_pack
24
+ end
25
+
26
+ def subclass_new_from_hash(args)
27
+ if args.has_key? :txt
28
+ @txt = args[:txt].strip
29
+ else
30
+ raise ArgumentError, ":txt field is mandatory but missing"
31
+ end
32
+ end
33
+
34
+ def subclass_new_from_string(str)
35
+ @txt = str.strip
36
+ end
37
+
38
+ def subclass_new_from_binary(data,offset)
39
+ off_end = offset + @rdlength
40
+ @txt = ""
41
+ while offset < off_end
42
+ len = data.unpack("@#{offset} C")[0]
43
+ offset += 1
44
+ str = data[offset..offset+len-1]
45
+ offset += len
46
+ @txt << str << " "
47
+ end
48
+ return offset
49
+ end
50
+
51
+ private
52
+
53
+ def set_type
54
+ @type = Net::DNS::RR::Types.new("TXT")
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,193 @@
1
+ module Net # :nodoc:
2
+ module DNS
3
+
4
+ class RR
5
+
6
+ # This is an auxiliary class to handle RR type field in a DNS packet.
7
+ class Types
8
+
9
+ TYPES = {
10
+ 'SIGZERO' => 0, # RFC2931 consider this a pseudo type
11
+ 'A' => 1, # RFC 1035, Section 3.4.1
12
+ 'NS' => 2, # RFC 1035, Section 3.3.11
13
+ 'MD' => 3, # RFC 1035, Section 3.3.4 (obsolete)
14
+ 'MF' => 4, # RFC 1035, Section 3.3.5 (obsolete)
15
+ 'CNAME' => 5, # RFC 1035, Section 3.3.1
16
+ 'SOA' => 6, # RFC 1035, Section 3.3.13
17
+ 'MB' => 7, # RFC 1035, Section 3.3.3
18
+ 'MG' => 8, # RFC 1035, Section 3.3.6
19
+ 'MR' => 9, # RFC 1035, Section 3.3.8
20
+ 'NULL' => 10, # RFC 1035, Section 3.3.10
21
+ 'WKS' => 11, # RFC 1035, Section 3.4.2 (deprecated)
22
+ 'PTR' => 12, # RFC 1035, Section 3.3.12
23
+ 'HINFO' => 13, # RFC 1035, Section 3.3.2
24
+ 'MINFO' => 14, # RFC 1035, Section 3.3.7
25
+ 'MX' => 15, # RFC 1035, Section 3.3.9
26
+ 'TXT' => 16, # RFC 1035, Section 3.3.14
27
+ 'RP' => 17, # RFC 1183, Section 2.2
28
+ 'AFSDB' => 18, # RFC 1183, Section 1
29
+ 'X25' => 19, # RFC 1183, Section 3.1
30
+ 'ISDN' => 20, # RFC 1183, Section 3.2
31
+ 'RT' => 21, # RFC 1183, Section 3.3
32
+ 'NSAP' => 22, # RFC 1706, Section 5
33
+ 'NSAP_PTR' => 23, # RFC 1348 (obsolete)
34
+ # The following 2 RRs are impemented in Net::DNS::SEC, TODO
35
+ 'SIG' => 24, # RFC 2535, Section 4.1
36
+ 'KEY' => 25, # RFC 2535, Section 3.1
37
+ 'PX' => 26, # RFC 2163,
38
+ 'GPOS' => 27, # RFC 1712 (obsolete)
39
+ 'AAAA' => 28, # RFC 1886, Section 2.1
40
+ 'LOC' => 29, # RFC 1876
41
+ # The following RR is implemented in Net::DNS::SEC, TODO
42
+ 'NXT' => 30, # RFC 2535, Section 5.2
43
+ 'EID' => 31, # draft-ietf-nimrod-dns-xx.txt
44
+ 'NIMLOC' => 32, # draft-ietf-nimrod-dns-xx.txt
45
+ 'SRV' => 33, # RFC 2052
46
+ 'ATMA' => 34, # ???
47
+ 'NAPTR' => 35, # RFC 2168
48
+ 'KX' => 36, # RFC 2230
49
+ 'CERT' => 37, # RFC 2538
50
+ 'DNAME' => 39, # RFC 2672
51
+ 'OPT' => 41, # RFC 2671
52
+ # The following 4 RRs are implemented in Net::DNS::SEC TODO
53
+ 'DS' => 43, # draft-ietf-dnsext-delegation-signer
54
+ 'SSHFP' => 44, # draft-ietf-secsh-dns (No RFC # yet at time of coding)
55
+ 'RRSIG' => 46, # draft-ietf-dnsext-dnssec-2535typecode-change
56
+ 'NSEC' => 47, # draft-ietf-dnsext-dnssec-2535typecode-change
57
+ 'DNSKEY' => 48, # draft-ietf-dnsext-dnssec-2535typecode-change
58
+ 'UINFO' => 100, # non-standard
59
+ 'UID' => 101, # non-standard
60
+ 'GID' => 102, # non-standard
61
+ 'UNSPEC' => 103, # non-standard
62
+ 'TKEY' => 249, # RFC 2930
63
+ 'TSIG' => 250, # RFC 2931
64
+ 'IXFR' => 251, # RFC 1995
65
+ 'AXFR' => 252, # RFC 1035
66
+ 'MAILB' => 253, # RFC 1035 (MB, MG, MR)
67
+ 'MAILA' => 254, # RFC 1035 (obsolete - see MX)
68
+ 'ANY' => 255, # RFC 1035
69
+ }
70
+
71
+ # The default value when type is nil in Resource Records
72
+ @@default = TYPES["A"]
73
+
74
+ # Be able to control the default type to assign when
75
+ # type is +nil+. Default to +A+
76
+ def self.default=(str)
77
+ if TYPES.has_key? str
78
+ @@default = TYPES[str]
79
+ else
80
+ raise ArgumentError, "Unknown type #{str}"
81
+ end
82
+ end
83
+
84
+ # Checks whether +type+ is a valid RR type.
85
+ def self.valid?(type)
86
+ case type
87
+ when String
88
+ TYPES.has_key?(type)
89
+ when Fixnum
90
+ TYPES.invert.has_key?(type)
91
+ else
92
+ raise ArgumentError, "Wrong type class: #{type.class}"
93
+ end
94
+ end
95
+
96
+ # Returns the type in string format, as "A" or "NS",
97
+ # given the numeric value
98
+ def self.to_str(type)
99
+ case type
100
+ when Fixnum
101
+ if TYPES.invert.has_key? type
102
+ TYPES.invert[type]
103
+ else
104
+ raise ArgumentError, "Unknown type number #{type}"
105
+ end
106
+ else
107
+ raise ArgumentError, "Wrong type class: #{type.class}"
108
+ end
109
+ end
110
+
111
+ # Gives in output the keys from the +Types+ hash
112
+ # in a format suited for regexps
113
+ def self.regexp
114
+ # Longest ones go first, so the regex engine will match AAAA before A.
115
+ TYPES.keys.sort { |a,b| b.length <=> a.length }.join("|")
116
+ end
117
+
118
+ # Creates a new object representing an RR type. Performs some
119
+ # checks on the argument validity too. Il +type+ is +nil+, the
120
+ # default value is +ANY+ or the one set with Types.default=
121
+ def initialize(type)
122
+ case type
123
+ when String
124
+ # type in the form "A" or "NS"
125
+ new_from_string(type.upcase)
126
+ when Fixnum
127
+ # type in numeric form
128
+ new_from_num(type)
129
+ when nil
130
+ # default type, control with Types.default=
131
+ @str = TYPES.invert[@@default]
132
+ @num = @@default
133
+ else
134
+ raise ArgumentError, "Wrong type class: #{type.class}"
135
+ end
136
+ end
137
+
138
+ # Returns the type in number format
139
+ # (default for normal use)
140
+ def inspect
141
+ @num
142
+ end
143
+
144
+ # Returns the type in string format,
145
+ # i.d. "A" or "NS" or such a string.
146
+ def to_s
147
+ @str
148
+ end
149
+
150
+ # Returns the type in numeric format,
151
+ # usable by the pack methods for data transfers
152
+ def to_i
153
+ @num.to_i
154
+ end
155
+
156
+ def to_str
157
+ @num.to_s
158
+ end
159
+
160
+
161
+ private
162
+
163
+ # Constructor for string data type.
164
+ def new_from_string(type)
165
+ case type
166
+ when /^TYPE\\d+/
167
+ # TODO!!!
168
+ else
169
+ # String with name of type
170
+ if TYPES.has_key? type
171
+ @str = type
172
+ @num = TYPES[type]
173
+ else
174
+ raise ArgumentError, "Unknown type #{type}"
175
+ end
176
+ end
177
+ end
178
+
179
+ # Contructor for numeric data type.
180
+ def new_from_num(type)
181
+ if TYPES.invert.has_key? type
182
+ @num = type
183
+ @str = TYPES.invert[type]
184
+ else
185
+ raise ArgumentError, "Unkown type number #{type}"
186
+ end
187
+ end
188
+
189
+ end
190
+
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,16 @@
1
+ module Net
2
+ module DNS
3
+ module Version
4
+
5
+ MAJOR = 0
6
+ MINOR = 8
7
+ PATCH = 0
8
+ BUILD = nil
9
+
10
+ STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join(".")
11
+ end
12
+
13
+ VERSION = Version::STRING
14
+
15
+ end
16
+ end
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "net-dns2"
5
+ s.version = "0.8.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Marco Ceresa", "Simone Carletti", "Christopher Carpenter"]
9
+ s.date = "2014-05-12"
10
+ s.description = "Net::DNS is a pure Ruby DNS library, with a clean OO interface and an extensible API."
11
+ s.email = ["ceresa@gmail.com", "weppos@weppos.net"]
12
+ s.files = [".gitignore", ".travis.yml", "CHANGELOG.md", "Gemfile", "README.md", "Rakefile", "THANKS.rdoc", "demo/check_soa.rb", "demo/threads.rb", "lib/net/dns.rb", "lib/net/dns/core_ext.rb", "lib/net/dns/header.rb", "lib/net/dns/names.rb", "lib/net/dns/packet.rb", "lib/net/dns/question.rb", "lib/net/dns/resolver.rb", "lib/net/dns/resolver/socks.rb", "lib/net/dns/resolver/timeouts.rb", "lib/net/dns/rr.rb", "lib/net/dns/rr/a.rb", "lib/net/dns/rr/aaaa.rb", "lib/net/dns/rr/classes.rb", "lib/net/dns/rr/cname.rb", "lib/net/dns/rr/hinfo.rb", "lib/net/dns/rr/mr.rb", "lib/net/dns/rr/mx.rb", "lib/net/dns/rr/ns.rb", "lib/net/dns/rr/null.rb", "lib/net/dns/rr/ptr.rb", "lib/net/dns/rr/soa.rb", "lib/net/dns/rr/srv.rb", "lib/net/dns/rr/txt.rb", "lib/net/dns/rr/types.rb", "lib/net/dns/version.rb", "net-dns.gemspec", "test/header_test.rb", "test/names_test.rb", "test/packet_test.rb", "test/question_test.rb", "test/resolver_test.rb", "test/rr/a_test.rb", "test/rr/aaaa_test.rb", "test/rr/classes_test.rb", "test/rr/cname_test.rb", "test/rr/hinfo_test.rb", "test/rr/mr_test.rb", "test/rr/mx_test.rb", "test/rr/ns_test.rb", "test/rr/types_test.rb", "test/rr_test.rb", "test/test_helper.rb"]
13
+ s.homepage = "http://github.com/mordocai/net-dns"
14
+ s.require_paths = ["lib"]
15
+ s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
16
+ s.rubygems_version = "1.0.0"
17
+ s.summary = "Pure Ruby DNS library, fork with fixes."
18
+ s.test_files = ["test/header_test.rb", "test/names_test.rb", "test/packet_test.rb", "test/question_test.rb", "test/resolver_test.rb", "test/rr/a_test.rb", "test/rr/aaaa_test.rb", "test/rr/classes_test.rb", "test/rr/cname_test.rb", "test/rr/hinfo_test.rb", "test/rr/mr_test.rb", "test/rr/mx_test.rb", "test/rr/ns_test.rb", "test/rr/types_test.rb", "test/rr_test.rb", "test/test_helper.rb"]
19
+ s.license = 'Ruby'
20
+
21
+ if s.respond_to? :specification_version then
22
+ s.specification_version = 4
23
+
24
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
25
+ s.add_development_dependency(%q<rake>, ["~> 10.0"])
26
+ s.add_development_dependency(%q<yard>, [">= 0"])
27
+ else
28
+ s.add_dependency(%q<rake>, ["~> 10.0"])
29
+ s.add_dependency(%q<yard>, [">= 0"])
30
+ end
31
+ else
32
+ s.add_dependency(%q<rake>, ["~> 10.0"])
33
+ s.add_dependency(%q<yard>, [">= 0"])
34
+ end
35
+
36
+ s.add_runtime_dependency "packetfu"
37
+ end
@@ -0,0 +1,167 @@
1
+ require 'test_helper'
2
+ require 'net/dns/header'
3
+
4
+ class HeaderTest < Test::Unit::TestCase
5
+ include Net::DNS
6
+
7
+ def setup
8
+
9
+ @default = Header.new
10
+ @hash = Header.new(:id => 441,
11
+ :qr => 1,
12
+ :opCode => Header::IQUERY,
13
+ :aa => 1,
14
+ :tc => 1,
15
+ :rd => 0,
16
+ :cd => 0,
17
+ :ad => 0,
18
+ :ra => 1,
19
+ :rCode => Header::RCode::FORMAT,
20
+ :qdCount => 1,
21
+ :anCount => 2,
22
+ :nsCount => 3,
23
+ :arCount => 3)
24
+
25
+ @modified = Header.new
26
+ @modified.id = 442
27
+ @modified.qr = true
28
+ @modified.opCode = Header::IQUERY
29
+ @modified.aa = true
30
+ @modified.tc = true
31
+ @modified.rd = false
32
+ @modified.cd = false
33
+ @modified.ra = true
34
+ @modified.rCode = Header::RCode::FORMAT
35
+ @modified.qdCount = 1
36
+ @modified.anCount = 2
37
+ @modified.nsCount = 3
38
+ @modified.arCount = 3
39
+
40
+ @data = @modified.data
41
+ num = [(@data.unpack("n")[0]+1)].pack("n")
42
+ @data[0],@data[1] = num[0], num[1]
43
+ @binary = Header.parse(@data)
44
+
45
+ end
46
+
47
+ def test_simple
48
+ assert_equal(@default.query?, true)
49
+ assert_equal(@default.response?, false)
50
+ assert_equal(@default.opCode, Header::QUERY)
51
+ assert_equal(@default.auth?, false)
52
+ assert_equal(@default.truncated?, false)
53
+ assert_equal(@default.recursive?, true)
54
+ assert_equal(@default.checking?, true)
55
+ assert_equal(@default.verified?, false)
56
+ assert_equal(@default.r_available?, false)
57
+ assert_equal(@default.rCode.code, Header::RCode::NOERROR)
58
+ assert_equal(@default.qdCount, 1)
59
+ assert_equal(@default.anCount, 0)
60
+ assert_equal(@default.nsCount, 0)
61
+ assert_equal(@default.arCount, 0)
62
+
63
+ assert_equal(@hash.id, 441)
64
+ assert_equal(@hash.query?, false)
65
+ assert_equal(@hash.response?, true)
66
+ assert_equal(@hash.opCode, Header::IQUERY)
67
+ assert_equal(@hash.auth?, true)
68
+ assert_equal(@hash.truncated?, true)
69
+ assert_equal(@hash.recursive?, false)
70
+ assert_equal(@hash.checking?, true)
71
+ assert_equal(@hash.verified?, false)
72
+ assert_equal(@hash.r_available?, true)
73
+ assert_equal(@hash.rCode.code, Header::RCode::FORMAT)
74
+ assert_equal(@hash.qdCount, 1)
75
+ assert_equal(@hash.anCount, 2)
76
+ assert_equal(@hash.nsCount, 3)
77
+ assert_equal(@hash.arCount, 3)
78
+
79
+ assert_equal(@modified.id, 442)
80
+ assert_equal(@modified.query?, false)
81
+ assert_equal(@modified.response?, true)
82
+ assert_equal(@modified.opCode, Header::IQUERY)
83
+ assert_equal(@modified.auth?, true)
84
+ assert_equal(@modified.truncated?, true)
85
+ assert_equal(@modified.recursive?, false)
86
+ assert_equal(@modified.checking?, true)
87
+ assert_equal(@modified.verified?, false)
88
+ assert_equal(@modified.r_available?, true)
89
+ assert_equal(@modified.rCode.code, Header::RCode::FORMAT)
90
+ assert_equal(@modified.qdCount, 1)
91
+ assert_equal(@modified.anCount, 2)
92
+ assert_equal(@modified.nsCount, 3)
93
+ assert_equal(@modified.arCount, 3)
94
+
95
+ assert_equal(@binary.data, @data)
96
+
97
+ assert_equal(@binary.id, 443)
98
+ assert_equal(@binary.query?, false)
99
+ assert_equal(@binary.response?, true)
100
+ assert_equal(@binary.opCode, Header::IQUERY)
101
+ assert_equal(@binary.auth?, true)
102
+ assert_equal(@binary.truncated?, true)
103
+ assert_equal(@binary.recursive?, false)
104
+ assert_equal(@binary.checking?, true)
105
+ assert_equal(@binary.verified?, false)
106
+ assert_equal(@binary.r_available?, true)
107
+ assert_equal(@binary.rCode.code, Header::RCode::FORMAT)
108
+ assert_equal(@binary.qdCount, 1)
109
+ assert_equal(@binary.anCount, 2)
110
+ assert_equal(@binary.nsCount, 3)
111
+ assert_equal(@binary.arCount, 3)
112
+
113
+ assert_raises(ArgumentError) do
114
+ Header.new(Array.new)
115
+ end
116
+ assert_raises(ArgumentError) do
117
+ Header.parse(Array.new)
118
+ end
119
+ assert_raises(ArgumentError) do
120
+ Header.parse("aa")
121
+ end
122
+ assert_raises(ArgumentError) do
123
+ @default.id = 1000000
124
+ end
125
+ assert_raises(ArgumentError) do
126
+ @default.qr=2
127
+ end
128
+ assert_raises(Header::WrongOpcodeError) do
129
+ @default.opCode=4
130
+ end
131
+ assert_raises(ArgumentError) do
132
+ @default.aa=2
133
+ end
134
+ assert_raises(ArgumentError) do
135
+ @default.tc=2
136
+ end
137
+ assert_raises(Header::WrongRecursiveError) do
138
+ @default.recursive=2
139
+ end
140
+ assert_raises(ArgumentError) do
141
+ @default.ra=2
142
+ end
143
+ assert_raises(ArgumentError) do
144
+ @default.cd=2
145
+ end
146
+ assert_raises(ArgumentError) do
147
+ @default.ad=2
148
+ end
149
+ assert_raises(ArgumentError) do
150
+ @default.rCode=46
151
+ end
152
+ assert_raises(Header::WrongCountError) do
153
+ @default.qdCount=100000
154
+ end
155
+ assert_raises(Header::WrongCountError) do
156
+ @default.anCount=100000
157
+ end
158
+ assert_raises(Header::WrongCountError) do
159
+ @default.nsCount=100000
160
+ end
161
+ assert_raises(Header::WrongCountError) do
162
+ @default.arCount=100000
163
+ end
164
+ end
165
+
166
+ end
167
+