#!/usr/bin/ruby -Ilib/ -I../lib/
require 'test/unit'
require 'custodian/protocoltests'
class TestTestFactory < Test::Unit::TestCase
#
# Create the test suite environment: NOP.
#
def setup
end
#
# Destroy the test suite environment: NOP.
#
def teardown
end
#
# Test bogus creation
#
def test_init
assert_raise ArgumentError do
obj = Custodian::TestFactory.create(nil, nil)
end
assert_raise ArgumentError do
obj = Custodian::TestFactory.create([], nil)
end
end
#
# Test the FTP-test may be created
#
def test_ftp_uri
assert_nothing_raised do
assert(Custodian::TestFactory.create('ftp.example.com must run ftp.'))
assert(Custodian::TestFactory.create('ftp://ftp.example.com/ must run ftp.'))
assert(Custodian::TestFactory.create('ftp://ftp.example.com/ must run ftp on 21.'))
assert(Custodian::TestFactory.create("ftp://ftp.example.com/ must run ftp on 21 otherwise 'xxx'."))
end
assert(Custodian::TestFactory.create('ftp.example.com must run ftp.')[0].target == 'ftp.example.com')
assert(Custodian::TestFactory.create('ftp://ftp.example.com/ must run ftp.')[0].target == 'ftp.example.com')
#
# Test the port detection
#
data = {
'foo must run ftp.' => '21',
'ftp://ftp.example.com/ must run ftp.' => '21',
"foo must run ftp on 1 otherwise 'x'." => '1',
'foo must run ftp on 33 otherwise' => '33',
}
#
# Run each test
#
data.each do |str, prt|
assert_nothing_raised do
obj = Custodian::TestFactory.create(str)
assert(obj.kind_of? Array)
assert(!obj.empty?)
assert_equal(obj[0].get_type, 'ftp')
assert_equal(obj[0].port.to_s, prt)
end
end
end
#
# Test port-guessing.
#
def test_port_detection
data = {
'foo must run ftp.' => '21',
'foo must run ssh.' => '22',
"foo must run mysql otherwise 'alert'" => '3306',
"foo must run redis otherwise 'alert'" => '6379',
"foo must run mysql on 33 otherwise 'alert'" => '33',
}
#
# Run each test
#
data.each do |str, prt|
assert_nothing_raised do
obj = Custodian::TestFactory.create(str)
assert(obj)
assert(obj.kind_of? Array)
assert(!obj.empty?)
assert(obj[0].port.to_s == prt, "'#{str}' gave expected port '#{prt}'.")
end
end
end
#
# Test the rsync-test creation.
#
def test_rsync_uri
assert_nothing_raised do
assert(Custodian::TestFactory.create('example.com must run rsync.'))
assert(Custodian::TestFactory.create('ftp://example.com/ must run rsync.'))
assert(Custodian::TestFactory.create('ftp://example.com/ must run rsync on 333.'))
assert(Custodian::TestFactory.create("ftp://example.com/ must run rsync on 3311 otherwise 'xxx'."))
end
assert(Custodian::TestFactory.create('rsync.example.com must run rsync.')[0].target ==
'rsync.example.com')
assert(Custodian::TestFactory.create('rsync://rsync.example.com/ must run rsync.')[0].target ==
'rsync.example.com')
#
# Test the ports
#
data = {
'foo must run rsync.' => '873',
'rsync://foo/ must run rsync.' => '873',
"foo must run rsync on 1 otherwise 'x'." => '1',
'foo must run rsync on 33 otherwise' => '33',
}
#
# Run each test
#
data.each do |str, prt|
assert_nothing_raised do
obj = Custodian::TestFactory.create(str)
assert(obj.kind_of? Array)
assert(!obj.empty?)
assert(obj[0].port.to_s == prt, "'#{str}' gave expected port '#{prt}'.")
end
end
end
#
# Test the DNS test may be created
#
def test_dns_handler
assert_nothing_raised do
assert(Custodian::TestFactory.create("a.ns.bytemark.co.uk must run dns for bytemark.co.uk resolving NS as '80.68.80.26;85.17.170.78;80.68.80.27'."))
end
#
# Missing record-type
#
assert_raise ArgumentError do
Custodian::TestFactory.create("a.ns.bytemark.co.uk must run dns for bytemark.co.uk as '80.68.80.26;85.17.170.78;80.68.80.27'.")
end
#
# Missing target
#
assert_raise ArgumentError do
assert(Custodian::TestFactory.create("a.ns.bytemark.co.uk must run dns resolving NS as '80.68.80.26;85.17.170.78;80.68.80.27'."))
end
#
# Missing expected results
#
assert_raise ArgumentError do
assert(Custodian::TestFactory.create('a.ns.bytemark.co.uk must run dns for www.bytemark.co.uk resolving NS '))
end
end
#
# Test the creation of inverted tests.
#
def test_inverted_tests
assert_nothing_raised do
assert(Custodian::TestFactory.create('example.com must not run rsync.'))
assert(Custodian::TestFactory.create('ftp://example.com/ must not run rsync.'))
assert(Custodian::TestFactory.create('ftp://example.com/ must not run rsync on 333.'))
end
#
# Test some inversions
#
data = {
'foo must run rsync.' => false,
'rsync://foo/ must run rsync.' => false,
'foo must run ping otherwise' => false,
'foo must not run ping otherwise' => true,
'foo must not run ssh otherwise' => true,
}
#
# Run each test
#
data.each do |str, inv|
assert_nothing_raised do
obj = Custodian::TestFactory.create(str)
assert(obj.kind_of? Array)
assert(!obj.empty?)
#
# Ensure we got the object, and the port was correct.
#
assert(obj, "created object via TestFactory.create('#{str}')")
assert(obj[0].inverted == inv, "#{str} -> #{inv}")
end
end
end
#
# Get all the types we know about.
#
def test_types
registered = Custodian::TestFactory.known_tests
# for each test-type
registered.keys.each do |type|
# for each handler ..
registered[type].each do |name|
if name.to_s =~ /protocoltest::(.*)Test$/i
tst = $1.dup.downcase
#
# NOTE: Skip the DNS and LDAP tests - they are more complex.
#
next if tst =~ /^(ldap|dns|dnsbl|sslcertificate)$/
# normal
test_one = "http://foo.com/.com must run #{tst} on 1234"
test_two = "http://foo.com/ must not run #{tst} on 12345"
assert_nothing_raised do
test_one_obj = Custodian::TestFactory.create(test_one)
assert(!test_one_obj[0].inverted)
test_two_obj = Custodian::TestFactory.create(test_two)
assert(test_two_obj[0].inverted, "Found inverted test for #{tst}")
assert_equal(tst, test_one_obj[0].get_type)
assert_equal(tst, test_two_obj[0].get_type)
end
end
end
end
end
#
# Test the target of each test is always what we expect.
#
def test_target_detection
a = []
a.push('test.host.example.com must run ftp.')
a.push('ftp://test.host.example.com/ must run ftp.')
a.push('ftp://test.host.example.com/foo must run ftp.')
a.push('test.host.example.com must run ping.')
a.push("test.host.example.com must run dns for bytemark.co.uk resolving NS as '80.68.80.26;85.17.170.78;80.68.80.27'.")
a.push('rsync://test.host.example.com must run rsync.')
a.push('rsync://test.host.example.com must run rsync.')
a.each do |entry|
assert_nothing_raised do
obj = Custodian::TestFactory.create(entry)
assert(obj)
assert(obj.kind_of? Array)
assert(!obj.empty?)
assert_equal('test.host.example.com', obj[0].target)
end
end
end
end