summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Mundrawala <jdmundrawala@gmail.com>2015-04-06 10:16:45 -0700
committerBryan McLellan <btm@chef.io>2015-04-20 15:30:21 -0400
commit5cd4ee159983f4cfa88b772072d86745f1993999 (patch)
tree13cf4f0f2011541c9613e05d1366a392c591a2dd
parent8a9cf7f0095254a4c01c86de43c3e60f5c9a0045 (diff)
downloadchef-5cd4ee159983f4cfa88b772072d86745f1993999.tar.gz
Fix nil pointer for windows event logger
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.rb16
-rw-r--r--spec/functional/event_loggers/windows_eventlog_spec.rb14
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