diff options
Diffstat (limited to 't')
| -rwxr-xr-x | t/test-custodian-parser.rb | 141 | ||||
| -rwxr-xr-x | t/test-parser.rb | 531 | 
2 files changed, 141 insertions, 531 deletions
| diff --git a/t/test-custodian-parser.rb b/t/test-custodian-parser.rb new file mode 100755 index 0000000..8fe794e --- /dev/null +++ b/t/test-custodian-parser.rb @@ -0,0 +1,141 @@ +#!/usr/bin/ruby1.8 -I./lib/ -I../lib/ + + +require 'test/unit' +require 'custodian/parser' + + + + +# +# Unit test for our parser. +# +class TestCustodianParser < Test::Unit::TestCase + +  # +  # Create the test suite environment: NOP. +  # +  def setup +  end + +  # +  # Destroy the test suite environment: NOP. +  # +  def teardown +  end + + + + + + +  # +  #  Test we can create a new parser object - specifically +  # that it throws exceptions if it is not given a filename +  # that exists. +  # +  def test_init + +    # +    #  Constructor +    # +    assert_nothing_raised do +      Custodian::Parser.new() +    end +  end + + + +  # +  #  Test that we can define macros. +  # +  def test_macros_lines + +    parser = Custodian::Parser.new() + +    # +    #  Input text +    # +    text =<<EOF +FOO is  kvm1.vm.bytemark.co.uk. +TEST is kvm2.vm.bytemark.co.uk. +EOF + +    # +    # Test the parser with this text +    # +    parser.parse_lines( text ) + + +    # +    #  We should now have two macros. +    # +    macros = parser.macros +    assert( ! macros.empty? ) +    assert( macros.size() == 2 ) +  end + + + +  # +  #  Test that we can define macros. +  # +  def test_macros_array + +    parser = Custodian::Parser.new() + +    # +    #  Input text +    # +    text = Array.new() +    text.push( "FOO  is  kvm1.vm.bytemark.co.uk." ); +    text.push( "FOO2 is  kvm2.vm.bytemark.co.uk." ); + +    # +    # Test the parser with this text +    # +    parser.parse_lines( text ) + + +    # +    #  We should now have two macros. +    # +    macros = parser.macros +    assert( ! macros.empty? ) +    assert( macros.size() == 2 ) +  end + + + +  # +  # Duplicate macros are a bug +  # +  def test_duplicate_macros + +    parser = Custodian::Parser.new() + +    # +    #  Input text +    # +    text = Array.new() +    text.push( "FOO  is  kvm1.vm.bytemark.co.uk." ); +    text.push( "FOO is  kvm2.vm.bytemark.co.uk." ); + +    # +    # Test the parser with this text +    # +    assert_raise ArgumentError do +      parser.parse_lines( text ) +    end + + +    # +    #  We should now have one macros. +    # +    macros = parser.macros +    assert( ! macros.empty? ) +    assert( macros.size() == 1 ) +  end + + +end diff --git a/t/test-parser.rb b/t/test-parser.rb deleted file mode 100755 index b98534d..0000000 --- a/t/test-parser.rb +++ /dev/null @@ -1,531 +0,0 @@ -#!/usr/bin/ruby1.8 -I./lib/ -I../lib/ - - -require 'test/unit' -require 'custodian/parser' - - - - -# -# Unit test for our parser. -# -class TestParser < Test::Unit::TestCase - -  # -  # Create the test suite environment: NOP. -  # -  def setup -  end - -  # -  # Destroy the test suite environment: NOP. -  # -  def teardown -  end - - - - - - -  # -  #  Test we can create a new parser object - specifically -  # that it throws exceptions if it is not given a filename -  # that exists. -  # -  def test_init - -    # -    #  Missing filename -> Exception -    # -    assert_raise ArgumentError do -      Custodian::Parser.new() -    end - -    # -    #  Filename points to file that doesn't exist -> Exception -    # -    assert_raise ArgumentError do -      Custodian::Parser.new("/file/doesn't/exist") -    end - -    # -    #  File that exists -> No Exception. -    # -    assert_nothing_raised do -      Custodian::Parser.new("/dev/null" ) -    end -  end - - - - - - -  # -  #  Test that we can define macros. -  # -  def test_macros - -    parser = Custodian::Parser.new("/dev/null" ) - -    # -    #  With nothing loaded we should have zero macros - so the -    # count of our macros hash should be zero -    # -    macros = parser.macros -    assert( macros.empty? ) -    assert( macros.size() == 0 ) - - -    # -    #  Define a macro: -    # -    #  FOO =>  "kvm1.vm.bytemark.co.uk", "kvm2.vm.bytemark.co.uk". -    # -    #  Before defining it double-check it doesn't exist -    # -    assert( !(parser.is_macro?( "FOO" )) ) - -    # -    #  Add it. -    # -    ret = parser.define_macro( "FOO is kvm1.vm.bytemark.co.uk and kvm2.vm.bytemark.co.uk." ) - -    # -    #  The return value should be an array containing the values we added. -    # -    # assert( ret.class.to_s == "Array" ) -    # assert( ret.size == 2 ) -    # assert( ret.include?( "kvm1.vm.bytemark.co.uk" ) ) -    # assert( ret.include?( "kvm2.vm.bytemark.co.uk" ) ) - - -    # -    #  OK we should now have a single macro defined. -    # -    macros = parser.macros -    assert( macros.size() == 1 ) - - -    # -    #  The macro name "FOO" should exist -    # -    assert( parser.is_macro?( "FOO" ) ) - -    # -    #  The contents of the FOO macro should have the value we expect -    # -    val = parser.get_macro_targets( "FOO" ) -    assert( val.size() == 2 ) -    assert( val.include?( "kvm1.vm.bytemark.co.uk" ) ) -    assert( val.include?( "kvm2.vm.bytemark.co.uk" ) ) - - -    # -    # Add a macro, using the parser directly. -    # -    # Before defining it double-check it doesn't exist -    # -    assert( !(parser.is_macro?( "BAR" )) ) - -    # -    # Add it. -    # -    ret = parser.parse_line( "BAR is example.vm.bytemark.co.uk and www.bytemark.co.uk." ) - -    # -    #  The return value should be an array containing the values -    # we added. -    # -    # assert( ret.class.to_s == "Array" ) -    # assert( ret.size == 2 ) -    # assert( ret.include?( "example.vm.bytemark.co.uk" ) ) -    # assert( ret.include?( "www.bytemark.co.uk" ) ) - - -    # -    #  OK we should now have two macros defined. -    # -    macros = parser.macros -    assert( macros.size() == 2 ) - -    # -    #  The macro name "BAR" should exist -    # -    assert( parser.is_macro?( "BAR" ) ) - -    # -    #  The contents of the BAR macro should have the value we expect -    # -    val = parser.get_macro_targets( "BAR" ) -    assert( val.size() == 2 ) -    assert( val.include?( "example.vm.bytemark.co.uk" ) ) -    assert( val.include?( "www.bytemark.co.uk" ) ) -  end - - - - - -  # -  # Redefinining a macro should cause an error -  # -  def test_duplicate_macro - - -    # -    # Create the parser. -    # -    parser = Custodian::Parser.new("/dev/null" ) - - -    # -    #  With nothing loaded we should have zero macros - so the -    # count of our macros hash should be zero -    # -    macros = parser.macros -    assert( macros.empty? ) -    assert( macros.size() == 0 ) - - -    # -    #  Define a macro twice.  The first will work, the second will fail -    # -    assert_nothing_raised do -      parser.define_macro( "FOO is kvm1.vm.bytemark.co.uk and kvm2.vm.bytemark.co.uk." ) -    end - -    assert_raise ArgumentError do -      parser.define_macro( "FOO is kvm1.vm.bytemark.co.uk and kvm2.vm.bytemark.co.uk." ) -    end -  end - - - - -  # -  #  Test that we can define macros with only a single host. -  # -  def test_short_macros - -    parser = Custodian::Parser.new("/dev/null" ) - -    # -    #  With nothing loaded we should have zero macros - so the -    # count of our macros hash should be zero -    # -    macros = parser.macros -    assert( macros.empty? ) -    assert( macros.size() == 0 ) - - -    # -    #  Define a macro: -    # -    #  FOO =>  "kvm1.vm.bytemark.co.uk". -    # -    #  Before defining it double-check it doesn't exist -    # -    assert( !(parser.is_macro?( "FOO" )) ) - -    # -    #  Add it. -    # -    ret = parser.define_macro( "FOO is kvm1.vm.bytemark.co.uk." ) - -    # -    #  The return value should be an array containing the values we added. -    # -    # assert( ret.class.to_s == "Array" ) -    # assert( ret.size == 1 ) -    # assert( ret.include?( "kvm1.vm.bytemark.co.uk" ) ) - - -    # -    #  OK we should now have a single macro defined. -    # -    macros = parser.macros -    assert( macros.size() == 1 ) - -    # -    # Add a macro, using the parser directly. -    # -    # Before defining it double-check it doesn't exist -    # -    assert( !(parser.is_macro?( "BAR_HOSTS" )) ) - -    # -    # Add it. -    # -    ret = parser.parse_line( "BAR_HOSTS are example.vm.bytemark.co.uk." ) - -    # -    #  The return value should be an array containing the single value -    # we added. -    # -    # assert( ret.class.to_s == "Array" ) -    # assert( ret.size == 1 ) -    # assert( ret.include?( "example.vm.bytemark.co.uk" ) ) - -    # -    #  OK we should now have two macros defined. -    # -    macros = parser.macros -    assert( macros.size() == 2 ) - -    # -    #  The macro name "BAR_HOSTS" should exist -    # -    assert( parser.is_macro?( "BAR_HOSTS" ) ) - -    # -    #  The contents of the BAR macro should have the single value we expect. -    # -    val = parser.get_macro_targets( "BAR_HOSTS" ) -    assert( val.size() == 1 ) -    assert( val.include?( "example.vm.bytemark.co.uk" ) ) -  end - - - - - - -  # -  # We found a bug in our live code because macros didn't get expanded -  # unless they matched the regular expression "[A-Z_]" - here we test -  # that this bug is fixed. -  # -  # (The issue being that several of our macros have numeric digits in -  # their names.) -  # -  def test_misc_macro - -    parser = Custodian::Parser.new("/dev/null" ) - -    # -    #  With nothing loaded we should have zero macros - so the -    # count of our macros hash should be zero -    # -    macros = parser.macros -    assert( macros.empty? ) -    assert( macros.size() == 0 ) - - -    # -    # Define a new macro, and ensure it is now present -    # -    parser.parse_line( "FRONTLINESTAGING29 is 89.16.186.138 and 89.16.186.139 and 89.16.186.148." ) -    macros = parser.macros -    assert( macros.size() == 1 ) - - -    # -    # Test that we got a suitable value when lookup up the contents -    # of that newly defined macro. -    # -    values = parser.get_macro_targets( "FRONTLINESTAGING29" ) -    assert(values.class.to_s == "Array" ) - - -    # -    # Parse another line -    # -    parser.parse_line( "SWML_HOSTS is 212.110.191.9.") - - -    # -    # Ensure our macro-list is now bigger. -    # -    macros = parser.macros -    assert( macros.size() == 2 ) - -    # -    # And ensure the macro expansion is correct. -    # -    values = parser.get_macro_targets( "SWML_HOSTS" ) -    assert(values.class.to_s == "Array" ) -  end - - - - - -  # -  #  Test that we can define tests which expand macros successfully. -  # -  def test_adding_tests - -    parser = Custodian::Parser.new("/dev/null" ) - -    # -    # Adding a test should return an array - an array of hashes. -    # -    ret = parser.parse_line( "example.vm.bytemark must run ssh otherwise 'I hate you'." ) -    assert_equal( ret.class.to_s, "Array" ) -    assert_equal( ret.size(), 1 ) - -    # -    # Define a macro - such that a single parsed line will become multiple -    # tests. -    # -    parser.parse_line( "MACRO is kvm1.vm.bytemark.co.uk and kvm1.vm.bytemark.co.uk and kvm3.vm.bytemark.co.uk." ) -    assert( parser.is_macro?( "MACRO") ) - -    # -    # Now add a ping-test against that macro -    # -    ret = parser.parse_line( "MACRO must run ping otherwise 'ping failure'." ) - -    # -    # The resulting array should contain three entries. -    # -    assert_equal( ret.class.to_s, "Array" ) -    assert_equal( ret.size(), 3 ) - -    # -    #  Now add more alerts, and ensure we find something sane: -    # -    #   1.  The addition should be arrays of hashes. -    # -    #   2.  The addition should have the correct test-type -    # -    %w( dns ftp http https jabber ldap ping rsync ssh smtp ).each do |name| - -      ret = parser.parse_line( "MACRO must run #{name} otherwise '#{name} failure'." ) - -      # -      # The resulting array should contain three JSON strings. -      # -      #assert_equal( ret.class.to_s, "Array" ) -      #assert_equal( ret.size(),3 ) -    end -  end - - - - - -  # -  # Most services define a default port.  Ensure that is correct. -  # -  def test_default_ports - -    expected = { -      "dns" => 53, -      "ftp" => 21, -      "ldap" => 389, -      "jabber" => 5222, -      "http" => 80, -      "rsync" => 873, -      "smtp" => 25, -      "ssh" => 22, -    } - - -  end - - -  # -  # Comment-handling -  # -  def test_adding_comments - -    parser = Custodian::Parser.new("/dev/null" ) - -    # -    # Adding comments should result in a nil return value. -    # -    assert( parser.parse_line( "# This is a comment" ).nil? ) -    assert( parser.parse_line( "\n" ).nil? ) -    assert( parser.parse_line( "" ).nil? ) -    assert( parser.parse_line( nil ).nil? ) -  end - - - - - -  # -  #  Test that an exception is raised on a malformed line. -  # -  def test_bogus - -    parser = Custodian::Parser.new("/dev/null" ) - - -    assert_nothing_raised do -      parser.parse_line( "# This is a test" ) -      parser.parse_line( "foo must run ssh." ) -    end - -    assert_raise ArgumentError do -      parser.parse_line( "steve is bored." ) -    end - -    assert_raise ArgumentError do -      parser.parse_line( "steve.com must ." ) -    end - -  end - - - -  # -  # Test we can add tests which don't contain a trailing period. -  # -  def test_short_test - -    parser = Custodian::Parser.new("/dev/null" ) - -    # -    # Adding a simple test must work - no trailing whitespace required -    # after the test-type. -    # -    ret = parser.parse_line( "foo.vm.bytemark.co.uk must run ssh." ) -    assert( ret ) -    assert( ret.class.to_s == "Array" ) -    assert( ret.size == 1 ) - -    # -    # Adding a simple test must work - no trailing period required -    # after the test-type. -    # -    ret = parser.parse_line( "foo.vm.bytemark.co.uk must run ssh" ) -    assert( ret ) -    assert( ret.class.to_s == "Array" ) -    assert( ret.size == 1 ) -  end - - - - -  # -  #  Test that each test has the hostname in it. -  # -  def test_alert_expansion -  end - - -  # -  # Test the potential security-hole for ping-tests -  # -  def test_ping_security_hole - - -    parser = Custodian::Parser.new("/dev/null" ) - -#    assert_raise ArgumentError do -#      parser.parse_line( "$(/tmp/exploit) must ping ." ) -#    end - -    assert_nothing_raised do -      parser.parse_line( "test.example.vm.bytemark.co.uk must ping ." ) -    end - -  end - - -end | 
