net-dns2 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/.travis.yml +20 -0
- data/CHANGELOG.md +105 -0
- data/Gemfile +4 -0
- data/README.md +155 -0
- data/Rakefile +94 -0
- data/THANKS.rdoc +24 -0
- data/demo/check_soa.rb +115 -0
- data/demo/threads.rb +22 -0
- data/lib/net/dns.rb +112 -0
- data/lib/net/dns/core_ext.rb +52 -0
- data/lib/net/dns/header.rb +713 -0
- data/lib/net/dns/names.rb +118 -0
- data/lib/net/dns/packet.rb +563 -0
- data/lib/net/dns/question.rb +188 -0
- data/lib/net/dns/resolver.rb +1313 -0
- data/lib/net/dns/resolver/socks.rb +154 -0
- data/lib/net/dns/resolver/timeouts.rb +75 -0
- data/lib/net/dns/rr.rb +366 -0
- data/lib/net/dns/rr/a.rb +124 -0
- data/lib/net/dns/rr/aaaa.rb +103 -0
- data/lib/net/dns/rr/classes.rb +133 -0
- data/lib/net/dns/rr/cname.rb +82 -0
- data/lib/net/dns/rr/hinfo.rb +108 -0
- data/lib/net/dns/rr/mr.rb +79 -0
- data/lib/net/dns/rr/mx.rb +92 -0
- data/lib/net/dns/rr/ns.rb +78 -0
- data/lib/net/dns/rr/null.rb +53 -0
- data/lib/net/dns/rr/ptr.rb +83 -0
- data/lib/net/dns/rr/soa.rb +78 -0
- data/lib/net/dns/rr/srv.rb +45 -0
- data/lib/net/dns/rr/txt.rb +61 -0
- data/lib/net/dns/rr/types.rb +193 -0
- data/lib/net/dns/version.rb +16 -0
- data/net-dns.gemspec +37 -0
- data/test/header_test.rb +167 -0
- data/test/names_test.rb +21 -0
- data/test/packet_test.rb +49 -0
- data/test/question_test.rb +83 -0
- data/test/resolver_test.rb +117 -0
- data/test/rr/a_test.rb +113 -0
- data/test/rr/aaaa_test.rb +109 -0
- data/test/rr/classes_test.rb +85 -0
- data/test/rr/cname_test.rb +97 -0
- data/test/rr/hinfo_test.rb +117 -0
- data/test/rr/mr_test.rb +105 -0
- data/test/rr/mx_test.rb +112 -0
- data/test/rr/ns_test.rb +86 -0
- data/test/rr/types_test.rb +69 -0
- data/test/rr_test.rb +131 -0
- data/test/test_helper.rb +4 -0
- 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
|
data/net-dns.gemspec
ADDED
@@ -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
|
data/test/header_test.rb
ADDED
@@ -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
|
+
|