From 8396810eac9c733437118243be87fae40f11ecc4 Mon Sep 17 00:00:00 2001 From: Matt Wrock Date: Tue, 20 Oct 2015 12:53:19 -0700 Subject: improve the test to more accurately detrermine if child process is killed --- lib/mixlib/shellout/windows.rb | 10 +++++++--- spec/mixlib/shellout_spec.rb | 13 +++++-------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/mixlib/shellout/windows.rb b/lib/mixlib/shellout/windows.rb index 5bca289..571baa6 100644 --- a/lib/mixlib/shellout/windows.rb +++ b/lib/mixlib/shellout/windows.rb @@ -77,8 +77,8 @@ module Mixlib # # Start the process # - logger.debug(Utils.format_process(process, app_name, command_line, timeout)) if logger process = Process.create(create_process_args) + logger.debug(Utils.format_process(process, app_name, command_line, timeout)) if logger begin # Start pushing data into input stdin_write << input if input @@ -322,7 +322,7 @@ module Mixlib end def self.kill_process_tree(pid, wmi, logger) - wmi.query("select ProcessID, Name from Win32_Process where ParentProcessID=#{pid}").each do |instance| + wmi.query("select * from Win32_Process where ParentProcessID=#{pid}").each do |instance| child_pid = instance.wmi_ole_object.processid kill_process_tree(child_pid, wmi, logger) begin @@ -330,7 +330,7 @@ module Mixlib "killing child process #{child_pid}::", "#{instance.wmi_ole_object.Name} of parent #{pid}" ].join) if logger - Process.kill(:KILL, child_pid) + kill_process(instance) rescue Errno::EIO, SystemCallError logger.debug([ "Failed to kill child process #{child_pid}::", @@ -340,6 +340,10 @@ module Mixlib end end + def self.kill_process(instance) + Process.kill(:KILL, instance.wmi_ole_object.processid) + end + def self.format_process(process, app_name, command_line, timeout) msg = [] msg << "ProcessId: #{process.process_id}" diff --git a/spec/mixlib/shellout_spec.rb b/spec/mixlib/shellout_spec.rb index 6b57619..df9bbbe 100644 --- a/spec/mixlib/shellout_spec.rb +++ b/spec/mixlib/shellout_spec.rb @@ -1113,13 +1113,7 @@ describe Mixlib::ShellOut do context 'on windows', :windows_only do let(:cmd) do - 'powershell -c "sleep 10"' - end - - before do - require "wmi-lite/wmi" - allow(WmiLite::Wmi).to receive(:new) - allow(Mixlib::ShellOut::Windows::Utils).to receive(:kill_process_tree) + 'cmd /c powershell -c "sleep 10"' end it "should raise CommandTimeout" do @@ -1130,7 +1124,10 @@ describe Mixlib::ShellOut do context 'and child processes should be killed' do it 'kills the child processes' do - expect(Mixlib::ShellOut::Windows::Utils).to receive(:kill_process_tree) + expect(Mixlib::ShellOut::Windows::Utils).to receive(:kill_process) do |instance| + expect(instance.wmi_ole_object.Name).to match(/powershell/) + Process.kill(:KILL, instance.wmi_ole_object.processid) + end expect { executed_cmd }.to raise_error(Mixlib::ShellOut::CommandTimeout) end end -- cgit v1.2.1