#!/usr/bin/ruby1.8


require 'custodian/webfetch'


class HTTPTest

  #
  # Data passed from the JSON hash.
  #
  attr_reader :test_data


  #
  # Save the data away.
  #
  def initialize( data )
    @test_data = data
    @error     = nil

    #
    # Ensure we have an URL
    #
    if ( @test_data["target_host"].nil? )
      @error = "Missing URL for the test."
      raise ArgumentError, @error
    end

    #
    # Ensure we have a port
    #
    if ( @test_data["test_port"].nil? )
      @error = "Missing port for the test."
      raise ArgumentError, @error
    end

  end


  #
  # Run the test.
  #
  #  Return "true" on success
  #
  #  Return "false" on failure.
  #
  # If the test fails the details should be retrieved from "error()".
  #
  def run_test

    #
    # Reset state from previous test.
    #
    @error = nil


    #
    # Run the fetch.
    #
    obj = WebFetch.new( @test_data["target_host"], @test_data["timeout"].to_i )

    #
    # If we succeeded in the fetch
    #
    if ( obj.fetch() )

      #
      #  Do we need to test for a HTTP status code?
      #
      if ( @test_data["http_status"] )

        puts "Testing for HTTP status code: #{@test_data['http_status']}"  if ( @test_data['verbose'] )

        if ( obj.status().to_i != @test_data['http_status'].to_i)
          @error = "#{@error} <p>The HTTP status-code was '#{obj.status}' not '#{@test_data['http_status']}'.</p>"
        end
      end

      #
      #  Do we need to search for text in the body of the reply?
      #
      if ( @test_data['http_text'] )
        puts "Testing for text in the response: '#{@test_data['http_text']}'" if ( @test_data['verbose'] )

        if (! obj.content.match(/#{@test_data['http_text']}/i) )
          @error = "#{@error}<p>The response did not contain our expected text '#{test_data['http_text']}'</p>"
        end
      end

      return true if ( @error.nil? )

      return false
    end

    @error = obj.error()
    return false
  end


  #
  #  Return the error text for why this test failed.
  #
  def error
    return @error
  end


end



#
# Sample test, for testing.
#
if __FILE__ == $0 then

  #
  #  Sample data.
  #
  test = {
    "target_host" => "http://itsdanbull.co.uk/",
    "test_type"   => "http",
    "verbose"     => 1,
    "timeout"     => 3,
    "test_port"   => 80,
    "test_alert"  => "Collector is unavailable",
    "http_status" => "200",
    "http_text"   => "Dan Bull"
  }


  #
  #  Run the test.
  #
  http = HTTPTest.new( test )
  if ( http.run_test )
    puts "TEST OK"
  else
    puts "TEST FAILED"
    puts http.error()
  end

end