|
require 'test_helper'
|
|
require 'dns_common/dns_common'
|
|
require 'dns_dnscmd/dns_dnscmd_main'
|
|
|
|
class DnscmdForTesting < Proxy::Dns::Dnscmd::Record
|
|
def initialize(dns_zones)
|
|
@enum_zones = dns_zones
|
|
end
|
|
attr_accessor :enum_zones
|
|
end
|
|
|
|
class DnsCmdTest < Test::Unit::TestCase
|
|
def setup
|
|
@server = DnscmdForTesting.new(["_msdcs.bar.domain.local",
|
|
"168.192.in-addr.arpa",
|
|
"33.168.192.in-addr.arpa",
|
|
"f.e.e.d.8.b.d.0.1.0.0.2.ip6.arpa",
|
|
"bar.domain.local",
|
|
"domain.local",
|
|
"TrustAnchors"])
|
|
end
|
|
|
|
def test_create_a_record_with_longest_zone_match
|
|
@server.expects(:popen3).with('c:\Windows\System32\dnscmd.exe', nil, '/RecordAdd', 'bar.domain.local', 'host.foo.bar.domain.local.', 'A', '192.168.33.33').once.returns([nil, nil, nil])
|
|
assert_nil @server.do_create('host.foo.bar.domain.local', '192.168.33.33', 'A')
|
|
end
|
|
|
|
def test_create_aaaa_record_with_longest_zone_match
|
|
@server.expects(:popen3).with('c:\Windows\System32\dnscmd.exe', nil, '/RecordAdd', 'bar.domain.local', 'host.foo.bar.domain.local.', 'AAAA', '2001:db8:deef::1').once.returns([nil, nil, nil])
|
|
assert_nil @server.do_create('host.foo.bar.domain.local', '2001:db8:deef::1', 'AAAA')
|
|
end
|
|
|
|
def test_create_ptr_record
|
|
@server.expects(:popen3).with('c:\Windows\System32\dnscmd.exe', nil, '/RecordAdd', '33.168.192.in-addr.arpa', '33.33.168.192.in-addr.arpa.', 'PTR', 'host.foo.bar.domain.local.').once.returns([nil, nil, nil])
|
|
assert_nil @server.do_create('33.33.168.192.in-addr.arpa', 'host.foo.bar.domain.local', 'PTR')
|
|
end
|
|
|
|
def test_create_cname_record
|
|
@server.expects(:popen3).with('c:\Windows\System32\dnscmd.exe', nil, '/RecordAdd', 'bar.domain.local', 'alias.foo.bar.domain.local.', 'CNAME', 'host.foo.bar.domain.local').once.returns([nil, nil, nil])
|
|
assert_nil @server.do_create('alias.foo.bar.domain.local', 'host.foo.bar.domain.local', 'CNAME')
|
|
end
|
|
|
|
def test_remove_address_records_with_longest_zone_match
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:enum_records).with('bar.domain.local', 'host.foo.bar.domain.local', 'A').returns(['1.1.1.1', '2.2.2.2'])
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:remove_specific_record_from_zone).with('bar.domain.local', 'host.foo.bar.domain.local', '1.1.1.1', 'A').returns(true)
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:remove_specific_record_from_zone).with('bar.domain.local', 'host.foo.bar.domain.local', '2.2.2.2', 'A').returns(true)
|
|
assert_nil @server.do_remove('host.foo.bar.domain.local', 'A')
|
|
end
|
|
|
|
def test_remove_ptr_records
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:enum_records).with('33.168.192.in-addr.arpa', '33.33.168.192.in-addr.arpa', 'PTR').returns(['host.domain.local'])
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:remove_specific_record_from_zone).with('33.168.192.in-addr.arpa', '33.33.168.192.in-addr.arpa', 'host.domain.local', 'PTR').returns(true)
|
|
assert_nil @server.do_remove('33.33.168.192.in-addr.arpa', 'PTR')
|
|
end
|
|
|
|
def test_remove_specific_a_record_from_zone
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:execute).with('/RecordDelete', 'domain.local', 'host.domain.local.', 'A', '192.168.33.33', '/f', anything).returns(true)
|
|
assert_nil @server.remove_specific_record_from_zone('domain.local', 'host.domain.local', '192.168.33.33', 'A')
|
|
end
|
|
|
|
def test_remove_specific_ptr_record_from_zone
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:execute).with('/RecordDelete', '33.168.192.in-addr.arpa', '33.33.168.192.in-addr.arpa.', 'PTR', 'host.domain.local', '/f', anything).returns(true)
|
|
assert_nil @server.remove_specific_record_from_zone('33.168.192.in-addr.arpa', '33.33.168.192.in-addr.arpa', 'host.domain.local', 'PTR')
|
|
end
|
|
|
|
def test_remove_cname_records
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:enum_records).with('bar.domain.local', 'alias.foo.bar.domain.local', 'CNAME').returns(['host.domain.local'])
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:remove_specific_record_from_zone).with('bar.domain.local', 'alias.foo.bar.domain.local', 'host.domain.local', 'CNAME').returns(true)
|
|
assert_nil @server.do_remove('alias.foo.bar.domain.local', 'CNAME')
|
|
end
|
|
|
|
def test_dns_zone_matches_second_best_match_if_zone_name_equals_host_name
|
|
assert_equal('domain.local', @server.match_zone('bar.domain.local', @server.enum_zones))
|
|
end
|
|
|
|
def test_dns_zone_matches_sole_available_zone
|
|
assert_equal('sole.domain', Proxy::Dns::Dnscmd::Record.new('server', 999).match_zone('host.foo.bar.sole.domain', ["sole.domain"]))
|
|
end
|
|
|
|
def test_dns_non_authoritative_zone_raises_exception
|
|
assert_raise Proxy::Dns::NotFound do
|
|
@server.match_zone('host.foo.bar.domain.com', ['domain.local'])
|
|
end
|
|
assert_raise Proxy::Dns::NotFound do
|
|
@server.match_zone('33.33.16.192.in-addr.arpa', ['168.192.in-addr.arpa'])
|
|
end
|
|
assert_raise Proxy::Dns::NotFound do
|
|
@server.match_zone('1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.f.e.e.d.8.b.d.1.1.0.0.2.ip6.arpa', ['f.e.e.d.8.b.d.0.1.0.0.2.ip6.arpa'])
|
|
end
|
|
end
|
|
|
|
def test_dnscmd_enum_zones_parses_primary_zones_only
|
|
to_parse = '
|
|
Enumerated zone list:
|
|
Zone count = 8
|
|
|
|
Zone name Type Storage Properties
|
|
|
|
. Cache AD-Domain
|
|
_msdcs.bar.domain.local Primary AD-Forest Secure
|
|
168.192.in-addr.arpa Primary AD-Domain Rev
|
|
33.168.192.in-addr.arpa Primary AD-Domain Secure Rev Aging
|
|
f.e.e.d.8.b.d.0.1.0.0.2.ip6.arpa Primary AD-Domain Secure Rev
|
|
bar.domain.local Primary AD-Domain Secure Aging
|
|
domain.local Primary AD-Domain Secure
|
|
domain.com Secondary File
|
|
TrustAnchors Primary AD-Forest
|
|
Command completed successfully.'.split("\n")
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:execute).with('/EnumZones', error_only: true).returns(to_parse)
|
|
assert_equal [
|
|
"_msdcs.bar.domain.local",
|
|
"168.192.in-addr.arpa",
|
|
"33.168.192.in-addr.arpa",
|
|
"f.e.e.d.8.b.d.0.1.0.0.2.ip6.arpa",
|
|
"bar.domain.local",
|
|
"domain.local",
|
|
"TrustAnchors",
|
|
], Proxy::Dns::Dnscmd::Record.new('server', 999).enum_zones
|
|
end
|
|
|
|
def test_enum_a_records
|
|
to_parse = '
|
|
Returned records:
|
|
@ 3600 A 192.168.33.33
|
|
3600 A 192.168.33.34
|
|
|
|
Command completed successfully.
|
|
'.split("\n")
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:execute).with('/EnumRecords', "domain.local", "host.domain.local.", '/Type', 'A', 'EnumRecords', error_only: true).returns(to_parse)
|
|
assert_equal ['192.168.33.33', '192.168.33.34'], Proxy::Dns::Dnscmd::Record.new('server', 999).enum_records('domain.local', 'host.domain.local', 'A')
|
|
end
|
|
|
|
def test_enum_aaaa_records
|
|
to_parse = '
|
|
Returned records:
|
|
@ 3600 AAAA 2001:db8:85a3::8a2e:370:7335
|
|
3600 AAAA 2001:db8:85a3::8a2e:370:7334
|
|
|
|
Command completed successfully.
|
|
'.split("\n")
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:execute).with('/EnumRecords', "domain.local", "host.domain.local.", '/Type', 'AAAA', 'EnumRecords', error_only: true).returns(to_parse)
|
|
assert_equal ['2001:db8:85a3::8a2e:370:7335', '2001:db8:85a3::8a2e:370:7334'], Proxy::Dns::Dnscmd::Record.new('server', 999).enum_records('domain.local', 'host.domain.local', 'AAAA')
|
|
end
|
|
|
|
def test_enum_cname_records
|
|
to_parse = '
|
|
Returned records:
|
|
@ 3600 CNAME alias.example.com.
|
|
|
|
Command completed successfully.
|
|
'.split("\n")
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:execute).with('/EnumRecords', 'example.com', "alias.example.com.", '/Type', 'CNAME', 'EnumRecords', error_only: true).returns(to_parse)
|
|
assert_equal ['alias.example.com.'], Proxy::Dns::Dnscmd::Record.new('server', 999).enum_records('example.com', 'alias.example.com', 'CNAME')
|
|
end
|
|
|
|
def test_enum_ptr_records
|
|
to_parse = '
|
|
Returned records:
|
|
@ 3600 PTR host.domain.local.
|
|
|
|
Command completed successfully.
|
|
'.split("\n")
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:execute).with('/EnumRecords', '33.168.192.in-addr.arpa', "33.33.168.192.in-addr.arpa.", '/Type', 'PTR', 'EnumRecords', error_only: true).returns(to_parse)
|
|
assert_equal ['host.domain.local.'], Proxy::Dns::Dnscmd::Record.new('server', 999).enum_records('33.168.192.in-addr.arpa', '33.33.168.192.in-addr.arpa', 'PTR')
|
|
end
|
|
|
|
def test_enum_ptr_records_when_multiple
|
|
to_parse = '
|
|
Returned records:
|
|
@ 3600 PTR host.domain.local.
|
|
3600 PTR host2.domain.local.
|
|
|
|
Command completed successfully.
|
|
'.split("\n")
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:execute).with('/EnumRecords', '33.168.192.in-addr.arpa', "33.33.168.192.in-addr.arpa.", '/Type', 'PTR', 'EnumRecords', error_only: true).returns(to_parse)
|
|
assert_equal ['host.domain.local.', 'host2.domain.local.'], Proxy::Dns::Dnscmd::Record.new('server', 999).enum_records('33.168.192.in-addr.arpa', '33.33.168.192.in-addr.arpa', 'PTR')
|
|
end
|
|
|
|
def test_enum_ptr_records_when_none
|
|
to_parse = '
|
|
DNS Server failed to enumerate records for node 33.33.168.192.in-addr.arpa..
|
|
Status = 9714 (0x000025f2)
|
|
Command failed: DNS_ERROR_NAME_DOES_NOT_EXIST 9714 0x25F2
|
|
'.split("\n")
|
|
Proxy::Dns::Dnscmd::Record.any_instance.expects(:execute).with('/EnumRecords', '33.168.192.in-addr.arpa', "33.33.168.192.in-addr.arpa.", '/Type', 'PTR', 'EnumRecords', error_only: true).returns(to_parse)
|
|
assert_equal [], Proxy::Dns::Dnscmd::Record.new('server', 999).enum_records('33.168.192.in-addr.arpa', '33.33.168.192.in-addr.arpa', 'PTR')
|
|
end
|
|
end
|