diff options
author | Steve Kemp <steve@steve.org.uk> | 2012-11-13 10:48:52 +0000 |
---|---|---|
committer | Steve Kemp <steve@steve.org.uk> | 2012-11-13 10:48:52 +0000 |
commit | 897d69b5e9bf47a49b4bd0c651a67d2ec91de437 (patch) | |
tree | 3229f37dfd186866cb2590c913763920f4586048 /worker/tests/http.rb | |
parent | ef48b1ea323a736ced863d06dd683da66d820888 (diff) |
Updated to use a class structure - and test both status code & content.
Diffstat (limited to 'worker/tests/http.rb')
-rwxr-xr-x | worker/tests/http.rb | 171 |
1 files changed, 159 insertions, 12 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 |