diff options
| -rwxr-xr-x | worker/tests/http.rb | 171 | ||||
| -rwxr-xr-x | worker/tests/https.rb | 171 | 
2 files changed, 318 insertions, 24 deletions
| diff --git a/worker/tests/http.rb b/worker/tests/http.rb index 56163c8..f1b5843 100755 --- a/worker/tests/http.rb +++ b/worker/tests/http.rb @@ -1,20 +1,167 @@ +#!/usr/bin/ruby + +require 'net/http' +require 'net/https' +require 'uri' + + + +class HTTPTest + +  # +  # Data passed from the JSON hash. +  # +  attr_reader :test_data + +  # +  # The HTTP status, the HTTP response body, and the error text +  # we return on failure. +  # +  attr_reader :status, :body, :error + + + +  # +  # Save the data away. +  # +  def initialize( data ) +    @test_data = data +  end + + +  # +  # Run the test. +  # +  #  Return "true" on success +  # +  #  Return "false" on failure. +  # +  # If the test fails the details should be retrieved from "get_details". +  # +  def run_test + +    @error = "" + +    # +    #  Do the fetch, if this success then we'll have the +    # @status + @text setup +    # +    if ( getURL (@test_data[:target_host] ) ) + +      # +      #  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 ( @status != @test_data[:http_status].to_i) +          @error = "#{@error} status code was #{@status} not #{@test_data[:http_status]}" +        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 (! @body.match(/#{@test_data[:http_text]}/i) ) +          @error = "#{@error} The respond did not contain #{test_data[:http_text]}" +        end +      end + +      return true if ( @error.length() == 0 ) + +      return false +    end + +    return false +  end + + +  # +  #  Return the error text for why this test failed. +  # +  def get_details +    return @error +  end + + +  # +  # Retrieve a HTTP page from the web. +  # +  # NOTE:  This came from sentinel. +  def getURL (uri_str) +    begin +      uri_str = 'http://' + uri_str unless uri_str.match(/^http/) +      url = URI.parse(uri_str) +      http = Net::HTTP.new(url.host, url.port) +      http.open_timeout = 3 +      http.read_timeout = 3 + +      if (url.scheme == "https") +        http.use_ssl = true +        http.verify_mode = OpenSSL::SSL::VERIFY_NONE +      end + +      response = nil + +      if nil == url.query +        response = http.start { http.get(url.path) } +      else +        response = http.start { http.get("#{url.path}?#{url.query}") } +      end + +      @status = response.code.to_i +      @body   =  response.body + +      return true +    rescue Errno::EHOSTUNREACH => ex +      @error = "no route to host" +      return false +    rescue Timeout::Error => ex +      @error = "time out reached" +      return false +    rescue => ex +      raise ex +      return false +    end +    return false +  end + + + +end + +  # -# Run a HTTP test. -# -# -# Return value -#   TRUE:  The host is up -# -#  FALSE:  The host is not up +# Sample test, for testing.  # -def http_test( params ) +if __FILE__ == $0 then + +  # +  #  Sample data. +  # +  test = { +    :target_host => "http://www.steve.org.uk/", +    :test_type   => "http", +    :test_port   => 80, +    :test_alert  => "Steve's website is unavailable", +    :http_text   => "Steve Kemp", +    :http_status => "200" +  } +    # -  # Get the URL to fetch. +  #  Run the test.    # -  host = params['target_host'] +  http = HTTPTest.new( test ) +  if ( http.run_test ) +    puts "TEST OK" +  else +    puts "TEST FAILED" +    puts http.get_details() +  end -  puts "HTTP FAILED - TODO - IMPLEMENT" -  return false  end diff --git a/worker/tests/https.rb b/worker/tests/https.rb index b905d79..f1b5843 100755 --- a/worker/tests/https.rb +++ b/worker/tests/https.rb @@ -1,20 +1,167 @@ +#!/usr/bin/ruby + +require 'net/http' +require 'net/https' +require 'uri' + + + +class HTTPTest + +  # +  # Data passed from the JSON hash. +  # +  attr_reader :test_data + +  # +  # The HTTP status, the HTTP response body, and the error text +  # we return on failure. +  # +  attr_reader :status, :body, :error + + + +  # +  # Save the data away. +  # +  def initialize( data ) +    @test_data = data +  end + + +  # +  # Run the test. +  # +  #  Return "true" on success +  # +  #  Return "false" on failure. +  # +  # If the test fails the details should be retrieved from "get_details". +  # +  def run_test + +    @error = "" + +    # +    #  Do the fetch, if this success then we'll have the +    # @status + @text setup +    # +    if ( getURL (@test_data[:target_host] ) ) + +      # +      #  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 ( @status != @test_data[:http_status].to_i) +          @error = "#{@error} status code was #{@status} not #{@test_data[:http_status]}" +        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 (! @body.match(/#{@test_data[:http_text]}/i) ) +          @error = "#{@error} The respond did not contain #{test_data[:http_text]}" +        end +      end + +      return true if ( @error.length() == 0 ) + +      return false +    end + +    return false +  end + + +  # +  #  Return the error text for why this test failed. +  # +  def get_details +    return @error +  end + + +  # +  # Retrieve a HTTP page from the web. +  # +  # NOTE:  This came from sentinel. +  def getURL (uri_str) +    begin +      uri_str = 'http://' + uri_str unless uri_str.match(/^http/) +      url = URI.parse(uri_str) +      http = Net::HTTP.new(url.host, url.port) +      http.open_timeout = 3 +      http.read_timeout = 3 + +      if (url.scheme == "https") +        http.use_ssl = true +        http.verify_mode = OpenSSL::SSL::VERIFY_NONE +      end + +      response = nil + +      if nil == url.query +        response = http.start { http.get(url.path) } +      else +        response = http.start { http.get("#{url.path}?#{url.query}") } +      end + +      @status = response.code.to_i +      @body   =  response.body + +      return true +    rescue Errno::EHOSTUNREACH => ex +      @error = "no route to host" +      return false +    rescue Timeout::Error => ex +      @error = "time out reached" +      return false +    rescue => ex +      raise ex +      return false +    end +    return false +  end + + + +end + +  # -# Run a HTTPS test. -# -# -# Return value -#   TRUE:  The host is up -# -#  FALSE:  The host is not up +# Sample test, for testing.  # -def https_test( params ) +if __FILE__ == $0 then + +  # +  #  Sample data. +  # +  test = { +    :target_host => "http://www.steve.org.uk/", +    :test_type   => "http", +    :test_port   => 80, +    :test_alert  => "Steve's website is unavailable", +    :http_text   => "Steve Kemp", +    :http_status => "200" +  } +    # -  # Get the URL to poll. +  #  Run the test.    # -  host = params['target_host'] +  http = HTTPTest.new( test ) +  if ( http.run_test ) +    puts "TEST OK" +  else +    puts "TEST FAILED" +    puts http.get_details() +  end -  puts "HTTPS FAILED - TODO - IMPLEMENT" -  return false  end | 
