From 123bec60af36a124fd5bcd5fc09579809d549f2f Mon Sep 17 00:00:00 2001 From: Colin Darie Date: Wed, 30 May 2018 16:51:24 +0200 Subject: [PATCH] CheckLogger for command & parser --- app/services/check_logger.rb | 47 +++++++++++++++++ app/services/whois.rb | 3 ++ app/services/whois/errors.rb | 1 - app/services/whois/parser/base.rb | 4 ++ app/services/whois/response.rb | 4 ++ test/services/check_logger_test.rb | 81 ++++++++++++++++++++++++++++++ 6 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 app/services/check_logger.rb create mode 100644 test/services/check_logger_test.rb diff --git a/app/services/check_logger.rb b/app/services/check_logger.rb new file mode 100644 index 0000000..829165d --- /dev/null +++ b/app/services/check_logger.rb @@ -0,0 +1,47 @@ +class CheckLogger + attr_reader :check_log + + def initialize(check) + @check_log = CheckLog.create!(check: check, status: :pending) + end + + def log(event, message) + case event + when :after_command + log_command_result(message) + when :parsed_response + log_parsed_response(message) + when :parser_error, :service_error + log_error(message) + end + end + + private + + def log_command_result(result) + check_log.exit_status = result.exit_status + check_log.raw_response = result.stdout + + if result.exit_status > 0 # rubocop:disable Style/NumericPredicate + check_log.error = result.stderr + check_log.status = :failed + end + + check_log.save! + end + + def log_parsed_response(response) + check_log.parsed_response = response.to_json + + if response.valid? + check_log.succeed! + else + check_log.failed! + end + end + + def log_error(exception) + check_log.error = [exception.message, exception.backtrace].join("\n") + check_log.failed! + end +end diff --git a/app/services/whois.rb b/app/services/whois.rb index 25a2973..8ab3599 100644 --- a/app/services/whois.rb +++ b/app/services/whois.rb @@ -26,6 +26,9 @@ module Whois def call result = run_command parse(result) + rescue StandardError => ex + logger.log :service_error, ex + raise end def run_command diff --git a/app/services/whois/errors.rb b/app/services/whois/errors.rb index 8afc799..209de12 100644 --- a/app/services/whois/errors.rb +++ b/app/services/whois/errors.rb @@ -5,7 +5,6 @@ module Whois class UnsupportedDomainError < WhoisError; end class ParserError < WhoisError; end - class CommentNotFoundError < ParserError; end class FieldNotFoundError < ParserError; end class MissingDateFormatError < ParserError; end class InvalidDateError < ParserError; end diff --git a/app/services/whois/parser/base.rb b/app/services/whois/parser/base.rb index a0ef594..4597cb3 100644 --- a/app/services/whois/parser/base.rb +++ b/app/services/whois/parser/base.rb @@ -26,7 +26,11 @@ module Whois do_parse + logger.log :parsed_response, response + response + rescue StandardError => ex + logger.log :parser_error, ex end protected diff --git a/app/services/whois/response.rb b/app/services/whois/response.rb index 4360702..e4718fa 100644 --- a/app/services/whois/response.rb +++ b/app/services/whois/response.rb @@ -7,5 +7,9 @@ module Whois def initialize(domain) @domain = domain end + + def valid? + created_at.present? + end end end diff --git a/test/services/check_logger_test.rb b/test/services/check_logger_test.rb new file mode 100644 index 0000000..79a6e73 --- /dev/null +++ b/test/services/check_logger_test.rb @@ -0,0 +1,81 @@ +require "test_helper" +require "check_logger" +require "system_command" + +class CheckLoggerTest < ActiveSupport::TestCase + setup do + @check = checks(:domain_example_org) + @logger = CheckLogger.new(@check) + end + + test "should create a pending CheckLog" do + assert_difference -> { CheckLog.where(check: @check).count }, +1 do + CheckLogger.new(@check) + end + + assert last_log.pending? + end + + test "should log a success raw result command" do + result = SystemCommandResult.new("command", 0, "the result", "") + + assert_no_difference -> { CheckLog.where(check: @check).count } do + @logger.log :after_command, result + end + + assert_equal "the result", @logger.check_log.raw_response + assert_nil @logger.check_log.error + assert_equal 0, @logger.check_log.exit_status + assert @logger.check_log.pending? + end + + test "should log a raw result command with an error" do + result = SystemCommandResult.new("command", 1, "optional stdout", "an error occured") + @logger.log :after_command, result + + assert_equal "optional stdout", @logger.check_log.raw_response + assert_equal "an error occured", @logger.check_log.error + assert_equal 1, @logger.check_log.exit_status + assert @logger.check_log.failed? + end + + test "should log a successful parsed command" do + response = OpenStruct.new( + domain: "example.fr", + extracted: "some data", + valid?: true, + ) + @logger.log :parsed_response, response + + assert_equal response.to_json, @logger.check_log.parsed_response + assert_nil @logger.check_log.error + assert @logger.check_log.succeed? + end + + test "should log parser error with a backtrace" do + @logger.log :parser_error, mock_exception + + assert_includes @logger.check_log.error, "my error occured" + assert_includes @logger.check_log.error, "minitest.rb" + assert @logger.check_log.failed? + end + + test "should log service error" do + @logger.log :service_error, mock_exception + + assert_not_nil @logger.check_log.error + assert @logger.check_log.failed? + end + + private + + def last_log + CheckLog.where(check: @check).last + end + + def mock_exception + exception = ArgumentError.new("my error occured") + exception.set_backtrace(caller) + exception + end +end