gitlab-net-dns 0.9.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 (64) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/.gitlab-ci.yml +20 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +3 -0
  6. data/.rubocop_defaults.yml +359 -0
  7. data/.rubocop_todo.yml +207 -0
  8. data/.travis.yml +13 -0
  9. data/CHANGELOG.md +113 -0
  10. data/Gemfile +9 -0
  11. data/LICENSE.txt +56 -0
  12. data/README.md +172 -0
  13. data/Rakefile +38 -0
  14. data/THANKS.rdoc +24 -0
  15. data/bin/console +14 -0
  16. data/demo/check_soa.rb +104 -0
  17. data/demo/threads.rb +18 -0
  18. data/gitlab-net-dns.gemspec +24 -0
  19. data/lib/net/dns.rb +104 -0
  20. data/lib/net/dns/header.rb +705 -0
  21. data/lib/net/dns/names.rb +120 -0
  22. data/lib/net/dns/packet.rb +560 -0
  23. data/lib/net/dns/question.rb +185 -0
  24. data/lib/net/dns/resolver.rb +1214 -0
  25. data/lib/net/dns/resolver/socks.rb +148 -0
  26. data/lib/net/dns/resolver/timeouts.rb +70 -0
  27. data/lib/net/dns/rr.rb +356 -0
  28. data/lib/net/dns/rr/a.rb +114 -0
  29. data/lib/net/dns/rr/aaaa.rb +94 -0
  30. data/lib/net/dns/rr/classes.rb +130 -0
  31. data/lib/net/dns/rr/cname.rb +74 -0
  32. data/lib/net/dns/rr/hinfo.rb +96 -0
  33. data/lib/net/dns/rr/mr.rb +70 -0
  34. data/lib/net/dns/rr/mx.rb +82 -0
  35. data/lib/net/dns/rr/ns.rb +70 -0
  36. data/lib/net/dns/rr/null.rb +50 -0
  37. data/lib/net/dns/rr/ptr.rb +77 -0
  38. data/lib/net/dns/rr/soa.rb +75 -0
  39. data/lib/net/dns/rr/srv.rb +41 -0
  40. data/lib/net/dns/rr/txt.rb +58 -0
  41. data/lib/net/dns/rr/types.rb +191 -0
  42. data/lib/net/dns/version.rb +8 -0
  43. data/spec/fixtures/resolv.conf +4 -0
  44. data/spec/spec_helper.rb +14 -0
  45. data/spec/unit/resolver/dns_timeout_spec.rb +36 -0
  46. data/spec/unit/resolver/tcp_timeout_spec.rb +46 -0
  47. data/spec/unit/resolver/udp_timeout_spec.rb +46 -0
  48. data/test/test_helper.rb +13 -0
  49. data/test/unit/header_test.rb +164 -0
  50. data/test/unit/names_test.rb +21 -0
  51. data/test/unit/packet_test.rb +47 -0
  52. data/test/unit/question_test.rb +81 -0
  53. data/test/unit/resolver_test.rb +114 -0
  54. data/test/unit/rr/a_test.rb +106 -0
  55. data/test/unit/rr/aaaa_test.rb +102 -0
  56. data/test/unit/rr/classes_test.rb +83 -0
  57. data/test/unit/rr/cname_test.rb +90 -0
  58. data/test/unit/rr/hinfo_test.rb +111 -0
  59. data/test/unit/rr/mr_test.rb +99 -0
  60. data/test/unit/rr/mx_test.rb +106 -0
  61. data/test/unit/rr/ns_test.rb +80 -0
  62. data/test/unit/rr/types_test.rb +71 -0
  63. data/test/unit/rr_test.rb +127 -0
  64. metadata +172 -0
@@ -0,0 +1,58 @@
1
+ module Net # :nodoc:
2
+ module DNS
3
+ class RR
4
+ #------------------------------------------------------------
5
+ # RR type TXT
6
+ #------------------------------------------------------------
7
+ class TXT < RR
8
+ attr_reader :txt
9
+
10
+ private
11
+
12
+ def build_pack
13
+ str = ""
14
+ @txt.split(" ").each do |txt|
15
+ str += [txt.length, txt].pack("C a*")
16
+ end
17
+ @txt_pack = str
18
+ @rdlength = @txt_pack.size
19
+ end
20
+
21
+ def get_data
22
+ @txt_pack
23
+ end
24
+
25
+ def subclass_new_from_hash(args)
26
+ if args.key? :txt
27
+ @txt = args[:txt].strip
28
+ else
29
+ raise ArgumentError, ":txt field is mandatory but missing"
30
+ end
31
+ end
32
+
33
+ def subclass_new_from_string(str)
34
+ @txt = str.strip
35
+ end
36
+
37
+ def subclass_new_from_binary(data, offset)
38
+ off_end = offset + @rdlength
39
+ @txt = ""
40
+ while offset < off_end
41
+ len = data.unpack("@#{offset} C")[0]
42
+ offset += 1
43
+ str = data[offset..offset + len - 1]
44
+ offset += len
45
+ @txt << str << " "
46
+ end
47
+ offset
48
+ end
49
+
50
+ private
51
+
52
+ def set_type
53
+ @type = Net::DNS::RR::Types.new("TXT")
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,191 @@
1
+ module Net # :nodoc:
2
+ module DNS
3
+ class RR
4
+ # This is an auxiliary class to handle RR type field in a DNS packet.
5
+ class Types
6
+ TYPES = {
7
+ 'SIGZERO' => 0, # RFC2931 consider this a pseudo type
8
+ 'A' => 1, # RFC 1035, Section 3.4.1
9
+ 'NS' => 2, # RFC 1035, Section 3.3.11
10
+ 'MD' => 3, # RFC 1035, Section 3.3.4 (obsolete)
11
+ 'MF' => 4, # RFC 1035, Section 3.3.5 (obsolete)
12
+ 'CNAME' => 5, # RFC 1035, Section 3.3.1
13
+ 'SOA' => 6, # RFC 1035, Section 3.3.13
14
+ 'MB' => 7, # RFC 1035, Section 3.3.3
15
+ 'MG' => 8, # RFC 1035, Section 3.3.6
16
+ 'MR' => 9, # RFC 1035, Section 3.3.8
17
+ 'NULL' => 10, # RFC 1035, Section 3.3.10
18
+ 'WKS' => 11, # RFC 1035, Section 3.4.2 (deprecated)
19
+ 'PTR' => 12, # RFC 1035, Section 3.3.12
20
+ 'HINFO' => 13, # RFC 1035, Section 3.3.2
21
+ 'MINFO' => 14, # RFC 1035, Section 3.3.7
22
+ 'MX' => 15, # RFC 1035, Section 3.3.9
23
+ 'TXT' => 16, # RFC 1035, Section 3.3.14
24
+ 'RP' => 17, # RFC 1183, Section 2.2
25
+ 'AFSDB' => 18, # RFC 1183, Section 1
26
+ 'X25' => 19, # RFC 1183, Section 3.1
27
+ 'ISDN' => 20, # RFC 1183, Section 3.2
28
+ 'RT' => 21, # RFC 1183, Section 3.3
29
+ 'NSAP' => 22, # RFC 1706, Section 5
30
+ 'NSAP_PTR' => 23, # RFC 1348 (obsolete)
31
+ # The following 2 RRs are impemented in Net::DNS::SEC, TODO
32
+ 'SIG' => 24, # RFC 2535, Section 4.1
33
+ 'KEY' => 25, # RFC 2535, Section 3.1
34
+ 'PX' => 26, # RFC 2163,
35
+ 'GPOS' => 27, # RFC 1712 (obsolete)
36
+ 'AAAA' => 28, # RFC 1886, Section 2.1
37
+ 'LOC' => 29, # RFC 1876
38
+ # The following RR is implemented in Net::DNS::SEC, TODO
39
+ 'NXT' => 30, # RFC 2535, Section 5.2
40
+ 'EID' => 31, # draft-ietf-nimrod-dns-xx.txt
41
+ 'NIMLOC' => 32, # draft-ietf-nimrod-dns-xx.txt
42
+ 'SRV' => 33, # RFC 2052
43
+ 'ATMA' => 34, # ???
44
+ 'NAPTR' => 35, # RFC 2168
45
+ 'KX' => 36, # RFC 2230
46
+ 'CERT' => 37, # RFC 2538
47
+ 'DNAME' => 39, # RFC 2672
48
+ 'OPT' => 41, # RFC 2671
49
+ # The following 4 RRs are implemented in Net::DNS::SEC TODO
50
+ 'DS' => 43, # draft-ietf-dnsext-delegation-signer
51
+ 'SSHFP' => 44, # draft-ietf-secsh-dns (No RFC # yet at time of coding)
52
+ 'RRSIG' => 46, # draft-ietf-dnsext-dnssec-2535typecode-change
53
+ 'NSEC' => 47, # draft-ietf-dnsext-dnssec-2535typecode-change
54
+ 'DNSKEY' => 48, # draft-ietf-dnsext-dnssec-2535typecode-change
55
+ 'UINFO' => 100, # non-standard
56
+ 'UID' => 101, # non-standard
57
+ 'GID' => 102, # non-standard
58
+ 'UNSPEC' => 103, # non-standard
59
+ 'TKEY' => 249, # RFC 2930
60
+ 'TSIG' => 250, # RFC 2931
61
+ 'IXFR' => 251, # RFC 1995
62
+ 'AXFR' => 252, # RFC 1035
63
+ 'MAILB' => 253, # RFC 1035 (MB, MG, MR)
64
+ 'MAILA' => 254, # RFC 1035 (obsolete - see MX)
65
+ 'ANY' => 255, # RFC 1035
66
+ }.freeze
67
+
68
+ # The default value when type is nil in Resource Records
69
+ @@default = TYPES["A"]
70
+
71
+ def self.default
72
+ @@default
73
+ end
74
+
75
+ # Be able to control the default type to assign when
76
+ # type is +nil+. Default to +A+
77
+ def self.default=(str)
78
+ if TYPES.key? str
79
+ @@default = TYPES[str]
80
+ else
81
+ raise ArgumentError, "Unknown type #{str}"
82
+ end
83
+ end
84
+
85
+ # Checks whether +type+ is a valid RR type.
86
+ def self.valid?(type)
87
+ case type
88
+ when String
89
+ TYPES.key?(type)
90
+ when Integer
91
+ TYPES.invert.key?(type)
92
+ else
93
+ raise ArgumentError, "Wrong type class: #{type.class}"
94
+ end
95
+ end
96
+
97
+ # Returns the type in string format, as "A" or "NS",
98
+ # given the numeric value
99
+ def self.to_str(type)
100
+ case type
101
+ when Integer
102
+ if TYPES.invert.key? type
103
+ TYPES.invert[type]
104
+ else
105
+ raise ArgumentError, "Unknown type number #{type}"
106
+ end
107
+ else
108
+ raise ArgumentError, "Wrong type class: #{type.class}"
109
+ end
110
+ end
111
+
112
+ # Gives in output the keys from the +Types+ hash
113
+ # in a format suited for regexps
114
+ def self.regexp
115
+ # Longest ones go first, so the regex engine will match AAAA before A.
116
+ TYPES.keys.sort { |a, b| b.length <=> a.length }.join("|")
117
+ end
118
+
119
+ # Creates a new object representing an RR type. Performs some
120
+ # checks on the argument validity too. Il +type+ is +nil+, the
121
+ # default value is +ANY+ or the one set with Types.default=
122
+ def initialize(type)
123
+ case type
124
+ when String
125
+ # type in the form "A" or "NS"
126
+ new_from_string(type.upcase)
127
+ when Integer
128
+ # type in numeric form
129
+ new_from_num(type)
130
+ when nil
131
+ # default type, control with Types.default=
132
+ @str = TYPES.invert[@@default]
133
+ @num = @@default
134
+ else
135
+ raise ArgumentError, "Wrong type class: #{type.class}"
136
+ end
137
+ end
138
+
139
+ # Returns the type in number format
140
+ # (default for normal use)
141
+ def inspect
142
+ @num
143
+ end
144
+
145
+ # Returns the type in string format,
146
+ # i.d. "A" or "NS" or such a string.
147
+ def to_s
148
+ @str
149
+ end
150
+
151
+ # Returns the type in numeric format,
152
+ # usable by the pack methods for data transfers
153
+ def to_i
154
+ @num.to_i
155
+ end
156
+
157
+ def to_str
158
+ @num.to_s
159
+ end
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.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.key? type
182
+ @num = type
183
+ @str = TYPES.invert[type]
184
+ else
185
+ raise ArgumentError, "Unkown type number #{type}"
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
191
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Net
4
+ module DNS
5
+ # The current library version.
6
+ VERSION = "0.9.1".freeze
7
+ end
8
+ end
@@ -0,0 +1,4 @@
1
+ search corporate.thoughtworks.com
2
+ nameserver 192.168.1.1
3
+ nameserver 192.168.1.2
4
+ nameserver 192.168.1.3 192.168.1.4
@@ -0,0 +1,14 @@
1
+ require 'rspec'
2
+ require 'net/dns'
3
+
4
+ unless defined?(SPEC_ROOT)
5
+ SPEC_ROOT = File.expand_path(__dir__)
6
+ end
7
+
8
+ # Requires supporting ruby files with custom matchers and macros, etc,
9
+ # in spec/support/ and its subdirectories.
10
+ Dir[File.join(SPEC_ROOT, "support/**/*.rb")].each { |f| require f }
11
+
12
+ RSpec.configure do |config|
13
+ config.mock_with :rspec
14
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ require 'net/dns/resolver/timeouts'
3
+
4
+ describe Net::DNS::Resolver::DnsTimeout do
5
+ subject { described_class.new(10) }
6
+
7
+ describe "#initialize" do
8
+ it "returns an instance of DnsTimeout" do
9
+ expect(subject.class).to be(described_class)
10
+ end
11
+
12
+ it "sets timeout" do
13
+ expect(described_class.new(0).seconds).to eq(0)
14
+ expect(described_class.new(10).seconds).to eq(10)
15
+ end
16
+
17
+ it "raises ArgumentError when timeout is invalid" do
18
+ expect { described_class.new(nil) }.to raise_error(ArgumentError)
19
+ expect { described_class.new("") }.to raise_error(ArgumentError)
20
+ expect { described_class.new("foo") }.to raise_error(ArgumentError)
21
+ expect { described_class.new(-1) }.to raise_error(ArgumentError)
22
+ end
23
+ end
24
+
25
+ describe "#to_s" do
26
+ it "returns the seconds" do
27
+ expect(subject.to_s).to eq("10")
28
+ end
29
+ end
30
+
31
+ describe "#timeout" do
32
+ it "requires a block" do
33
+ expect { subject.timeout }.to raise_error(LocalJumpError)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+ require 'net/dns/resolver/timeouts'
3
+
4
+ describe Net::DNS::Resolver::TcpTimeout do
5
+ subject { described_class.new(10) }
6
+
7
+ it "inherits from DnsTimeout" do
8
+ expect(described_class.ancestors).to include(Net::DNS::Resolver::DnsTimeout)
9
+ end
10
+
11
+ describe "#initialize" do
12
+ it "returns an instance of TcpTimeout" do
13
+ expect(subject.class).to be(described_class)
14
+ end
15
+
16
+ it "sets timeout" do
17
+ expect(described_class.new(0).seconds).to eq(0)
18
+ expect(described_class.new(10).seconds).to eq(10)
19
+ end
20
+
21
+ it "raises ArgumentError when timeout is invalid" do
22
+ expect { described_class.new(nil) }.to raise_error(ArgumentError)
23
+ expect { described_class.new("") }.to raise_error(ArgumentError)
24
+ expect { described_class.new("foo") }.to raise_error(ArgumentError)
25
+ expect { described_class.new(-1) }.to raise_error(ArgumentError)
26
+ end
27
+ end
28
+
29
+ describe "#to_s" do
30
+ it "returns infinite when seconds is 0" do
31
+ expect(described_class.new(0).to_s).to eq("infinite")
32
+ end
33
+
34
+ it "returns the seconds" do
35
+ expect(subject.to_s).to eq("10")
36
+ end
37
+ end
38
+
39
+ describe "#pretty_to_s" do
40
+ it "returns a more verbose version" do
41
+ expect(described_class.new(30).pretty_to_s).to eq("30 seconds")
42
+ expect(described_class.new(90).pretty_to_s).to eq("1 minutes and 30 seconds")
43
+ expect(described_class.new(3690).pretty_to_s).to eq("1 hours, 1 minutes and 30 seconds")
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+ require 'net/dns/resolver/timeouts'
3
+
4
+ describe Net::DNS::Resolver::UdpTimeout do
5
+ subject { described_class.new(10) }
6
+
7
+ it "inherits from DnsTimeout" do
8
+ expect(described_class.ancestors).to include(Net::DNS::Resolver::DnsTimeout)
9
+ end
10
+
11
+ describe "#initialize" do
12
+ it "returns an instance of TcpTimeout" do
13
+ expect(subject.class).to be(described_class)
14
+ end
15
+
16
+ it "sets timeout" do
17
+ expect(described_class.new(0).seconds).to eq(0)
18
+ expect(described_class.new(10).seconds).to eq(10)
19
+ end
20
+
21
+ it "raises ArgumentError when timeout is invalid" do
22
+ expect { described_class.new(nil) }.to raise_error(ArgumentError)
23
+ expect { described_class.new("") }.to raise_error(ArgumentError)
24
+ expect { described_class.new("foo") }.to raise_error(ArgumentError)
25
+ expect { described_class.new(-1) }.to raise_error(ArgumentError)
26
+ end
27
+ end
28
+
29
+ describe "#to_s" do
30
+ it "returns infinite when seconds is 0" do
31
+ expect(described_class.new(0).to_s).to eq("not defined")
32
+ end
33
+
34
+ it "returns the seconds" do
35
+ expect(subject.to_s).to eq("10")
36
+ end
37
+ end
38
+
39
+ describe "#pretty_to_s" do
40
+ it "returns a more verbose version" do
41
+ expect(described_class.new(30).pretty_to_s).to eq("30 seconds")
42
+ expect(described_class.new(90).pretty_to_s).to eq("1 minutes and 30 seconds")
43
+ expect(described_class.new(3690).pretty_to_s).to eq("1 hours, 1 minutes and 30 seconds")
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,13 @@
1
+ require "minitest/autorun"
2
+ require "minitest/reporters"
3
+
4
+ Minitest::Reporters.use! Minitest::Reporters::DefaultReporter.new(color: true)
5
+
6
+ $LOAD_PATH.unshift File.expand_path("../lib", __dir__)
7
+ require "net/dns"
8
+
9
+ module Minitest::Assertions
10
+ def assert_nothing_raised(*)
11
+ yield
12
+ end
13
+ end
@@ -0,0 +1,164 @@
1
+ require 'test_helper'
2
+ require 'net/dns/header'
3
+
4
+ class HeaderTest < Minitest::Test
5
+ include Net::DNS
6
+
7
+ def setup
8
+ @default = Header.new
9
+ @hash = Header.new(id: 441,
10
+ qr: 1,
11
+ opCode: Header::IQUERY,
12
+ aa: 1,
13
+ tc: 1,
14
+ rd: 0,
15
+ cd: 0,
16
+ ad: 0,
17
+ ra: 1,
18
+ rCode: Header::RCode::FORMAT,
19
+ qdCount: 1,
20
+ anCount: 2,
21
+ nsCount: 3,
22
+ arCount: 3)
23
+
24
+ @modified = Header.new
25
+ @modified.id = 442
26
+ @modified.qr = true
27
+ @modified.opCode = Header::IQUERY
28
+ @modified.aa = true
29
+ @modified.tc = true
30
+ @modified.rd = false
31
+ @modified.cd = false
32
+ @modified.ra = true
33
+ @modified.rCode = Header::RCode::FORMAT
34
+ @modified.qdCount = 1
35
+ @modified.anCount = 2
36
+ @modified.nsCount = 3
37
+ @modified.arCount = 3
38
+
39
+ @data = @modified.data
40
+ num = [(@data.unpack("n")[0] + 1)].pack("n")
41
+ @data[0] = num[0]
42
+ @data[1] = num[1]
43
+ @binary = Header.parse(@data)
44
+ end
45
+
46
+ def test_simple
47
+ assert_equal(@default.query?, true)
48
+ assert_equal(@default.response?, false)
49
+ assert_equal(@default.opCode, Header::QUERY)
50
+ assert_equal(@default.auth?, false)
51
+ assert_equal(@default.truncated?, false)
52
+ assert_equal(@default.recursive?, true)
53
+ assert_equal(@default.checking?, true)
54
+ assert_equal(@default.verified?, false)
55
+ assert_equal(@default.r_available?, false)
56
+ assert_equal(@default.rCode.code, Header::RCode::NOERROR)
57
+ assert_equal(@default.qdCount, 1)
58
+ assert_equal(@default.anCount, 0)
59
+ assert_equal(@default.nsCount, 0)
60
+ assert_equal(@default.arCount, 0)
61
+
62
+ assert_equal(@hash.id, 441)
63
+ assert_equal(@hash.query?, false)
64
+ assert_equal(@hash.response?, true)
65
+ assert_equal(@hash.opCode, Header::IQUERY)
66
+ assert_equal(@hash.auth?, true)
67
+ assert_equal(@hash.truncated?, true)
68
+ assert_equal(@hash.recursive?, false)
69
+ assert_equal(@hash.checking?, true)
70
+ assert_equal(@hash.verified?, false)
71
+ assert_equal(@hash.r_available?, true)
72
+ assert_equal(@hash.rCode.code, Header::RCode::FORMAT)
73
+ assert_equal(@hash.qdCount, 1)
74
+ assert_equal(@hash.anCount, 2)
75
+ assert_equal(@hash.nsCount, 3)
76
+ assert_equal(@hash.arCount, 3)
77
+
78
+ assert_equal(@modified.id, 442)
79
+ assert_equal(@modified.query?, false)
80
+ assert_equal(@modified.response?, true)
81
+ assert_equal(@modified.opCode, Header::IQUERY)
82
+ assert_equal(@modified.auth?, true)
83
+ assert_equal(@modified.truncated?, true)
84
+ assert_equal(@modified.recursive?, false)
85
+ assert_equal(@modified.checking?, true)
86
+ assert_equal(@modified.verified?, false)
87
+ assert_equal(@modified.r_available?, true)
88
+ assert_equal(@modified.rCode.code, Header::RCode::FORMAT)
89
+ assert_equal(@modified.qdCount, 1)
90
+ assert_equal(@modified.anCount, 2)
91
+ assert_equal(@modified.nsCount, 3)
92
+ assert_equal(@modified.arCount, 3)
93
+
94
+ assert_equal(@binary.data, @data)
95
+
96
+ assert_equal(@binary.id, 443)
97
+ assert_equal(@binary.query?, false)
98
+ assert_equal(@binary.response?, true)
99
+ assert_equal(@binary.opCode, Header::IQUERY)
100
+ assert_equal(@binary.auth?, true)
101
+ assert_equal(@binary.truncated?, true)
102
+ assert_equal(@binary.recursive?, false)
103
+ assert_equal(@binary.checking?, true)
104
+ assert_equal(@binary.verified?, false)
105
+ assert_equal(@binary.r_available?, true)
106
+ assert_equal(@binary.rCode.code, Header::RCode::FORMAT)
107
+ assert_equal(@binary.qdCount, 1)
108
+ assert_equal(@binary.anCount, 2)
109
+ assert_equal(@binary.nsCount, 3)
110
+ assert_equal(@binary.arCount, 3)
111
+
112
+ assert_raises(ArgumentError) do
113
+ Header.new([])
114
+ end
115
+ assert_raises(ArgumentError) do
116
+ Header.parse([])
117
+ end
118
+ assert_raises(ArgumentError) do
119
+ Header.parse("aa")
120
+ end
121
+ assert_raises(ArgumentError) do
122
+ @default.id = 1_000_000
123
+ end
124
+ assert_raises(ArgumentError) do
125
+ @default.qr = 2
126
+ end
127
+ assert_raises(Header::WrongOpcodeError) do
128
+ @default.opCode = 4
129
+ end
130
+ assert_raises(ArgumentError) do
131
+ @default.aa = 2
132
+ end
133
+ assert_raises(ArgumentError) do
134
+ @default.tc = 2
135
+ end
136
+ assert_raises(Header::WrongRecursiveError) do
137
+ @default.recursive = 2
138
+ end
139
+ assert_raises(ArgumentError) do
140
+ @default.ra = 2
141
+ end
142
+ assert_raises(ArgumentError) do
143
+ @default.cd = 2
144
+ end
145
+ assert_raises(ArgumentError) do
146
+ @default.ad = 2
147
+ end
148
+ assert_raises(ArgumentError) do
149
+ @default.rCode = 46
150
+ end
151
+ assert_raises(Header::WrongCountError) do
152
+ @default.qdCount = 100_000
153
+ end
154
+ assert_raises(Header::WrongCountError) do
155
+ @default.anCount = 100_000
156
+ end
157
+ assert_raises(Header::WrongCountError) do
158
+ @default.nsCount = 100_000
159
+ end
160
+ assert_raises(Header::WrongCountError) do
161
+ @default.arCount = 100_000
162
+ end
163
+ end
164
+ end