diff options
author | Jay Mundrawala <jdmundrawala@gmail.com> | 2015-04-06 10:16:45 -0700 |
---|---|---|
committer | Jay Mundrawala <jdmundrawala@gmail.com> | 2015-04-06 10:16:45 -0700 |
commit | 4715e489d6aa5341f9cc1220a4a5a02f466dbe4b (patch) | |
tree | e1752e90a6cea10d6b2ad476371370823150374a | |
parent | 361ba778a36b9da6e29ece85c124babcbfaabdd8 (diff) | |
download | chef-jdm/2996.tar.gz |
Fix nil pointer for windows event loggerjdm/2996
It is possible for the run to fail and no run_status to even have
been set. This resolves issue #2996
-rw-r--r-- | lib/chef/event_loggers/windows_eventlog.rb | 16 | ||||
-rw-r--r-- | spec/functional/event_loggers/windows_eventlog_spec.rb | 14 |
2 files changed, 25 insertions, 5 deletions
diff --git a/lib/chef/event_loggers/windows_eventlog.rb b/lib/chef/event_loggers/windows_eventlog.rb index 6f5ef627fb..37dcdc8693 100644 --- a/lib/chef/event_loggers/windows_eventlog.rb +++ b/lib/chef/event_loggers/windows_eventlog.rb @@ -88,15 +88,21 @@ class Chef #Exception message: %4 #Exception backtrace: %5 def run_failed(e) + data = + if @run_status + [@run_status.run_id, + @run_status.elapsed_time.to_s] + else + ["UNKNOWN", "UNKNOWN"] + end + @eventlog.report_event( :event_type => ::Win32::EventLog::ERROR_TYPE, :source => SOURCE, :event_id => RUN_FAILED_EVENT_ID, - :data => [@run_status.run_id, - @run_status.elapsed_time.to_s, - e.class.name, - e.message, - e.backtrace.join("\n")] + :data => data + [e.class.name, + e.message, + e.backtrace.join("\n")] ) end diff --git a/spec/functional/event_loggers/windows_eventlog_spec.rb b/spec/functional/event_loggers/windows_eventlog_spec.rb index 4e383dd429..0723e7b984 100644 --- a/spec/functional/event_loggers/windows_eventlog_spec.rb +++ b/spec/functional/event_loggers/windows_eventlog_spec.rb @@ -79,4 +79,18 @@ describe Chef::EventLoggers::WindowsEventLogger, :windows_only, :not_supported_o end).to be_truthy end + it 'writes run_failed event with event_id 10003 even when run_status is not set' do + logger.run_failed(mock_exception) + + expect(event_log.read(flags, offset).any? do |e| + e.source == 'Chef' && e.event_id == 10003 && + e.string_inserts[0].include?("UNKNOWN") && + e.string_inserts[1].include?("UNKNOWN") && + e.string_inserts[2].include?(mock_exception.class.name) && + e.string_inserts[3].include?(mock_exception.message) && + e.string_inserts[4].include?(mock_exception.backtrace[0]) && + e.string_inserts[4].include?(mock_exception.backtrace[1]) + end).to be_truthy + end + end |