From 705e487bbe9da90e7b82a96cdb56eb032a19e9c9 Mon Sep 17 00:00:00 2001 From: Jonathan Hartman Date: Fri, 2 Jan 2015 23:14:23 -0800 Subject: [PATCH] On Win, wait until package is installed --- ...rovider_private_internet_access_windows.rb | 17 +++---- ...er_private_internet_access_windows_spec.rb | 48 +++++++++++++------ spec/spec_helper.rb | 1 + .../provider/windows_cookbook_package.rb | 13 +++++ 4 files changed, 57 insertions(+), 22 deletions(-) create mode 100644 spec/support/provider/windows_cookbook_package.rb diff --git a/libraries/provider_private_internet_access_windows.rb b/libraries/provider_private_internet_access_windows.rb index 38a69a7..d329100 100644 --- a/libraries/provider_private_internet_access_windows.rb +++ b/libraries/provider_private_internet_access_windows.rb @@ -22,7 +22,7 @@ require 'chef/resource/cookbook_file' require 'chef/resource/execute' require 'chef/resource/powershell_script' -require 'chef/resource/ruby' +require 'chef/resource/ruby_block' require_relative 'provider_private_internet_access' class Chef @@ -45,7 +45,7 @@ def action_install trust_cert.run_action(:run) start_installer.run_action(:run) wait_for_installer.run_action(:run) - new_resource.installed = true + super end private @@ -59,12 +59,13 @@ def action_install # def wait_for_installer unless @wait_for_installer - @wait_for_installer = Resource::Ruby.new('pia_installer_wait', - run_context) - @wait_for_installer.code( - "sleep 1 while !::File.exist?('#{WATCH_FILE}')" - ) - @wait_for_installer.creates(WATCH_FILE) + @wait_for_installer = Resource::RubyBlock.new('pia_installer_wait', + run_context) + @wait_for_installer.block do + p = Chef::Provider::WindowsCookbookPackage.new(package, + run_context) + sleep 1 until p.current_installed_version + end end @wait_for_installer end diff --git a/spec/libraries/provider_private_internet_access_windows_spec.rb b/spec/libraries/provider_private_internet_access_windows_spec.rb index bcfd98e..3971f35 100644 --- a/spec/libraries/provider_private_internet_access_windows_spec.rb +++ b/spec/libraries/provider_private_internet_access_windows_spec.rb @@ -55,28 +55,48 @@ expect(new_resource).to receive(:installed=).with(true) provider.action_install end - - it 'takes no action on the package resource' do - expect(package).not_to receive(:run_action) - provider.action_install - end end describe '#wait_for_installer' do - it 'returns a ruby resource' do - expected = Chef::Resource::Ruby + let(:current_installed_version) { '1.2.3' } + let(:wcpackage) do + double(current_installed_version: current_installed_version) + end + let(:package) { double } + + before(:each) do + allow(Chef::Provider::WindowsCookbookPackage).to receive(:new) + .and_return(wcpackage) + allow_any_instance_of(Chef::Resource::RubyBlock).to receive(:block) + .and_yield + allow_any_instance_of(described_class).to receive(:package) + .and_return(package) + end + + it 'returns a ruby_block resource' do + expected = Chef::Resource::RubyBlock expect(provider.send(:wait_for_installer)).to be_an_instance_of(expected) end - it 'sets the correct code' do - expected = 'sleep 1 while !::File.exist?(\'/Program Files/pia_manager/' \ - 'pia_manager.exe\')' - expect(provider.send(:wait_for_installer).code).to eq(expected) + context 'uninstalled package' do + let(:current_installed_version) { nil } + + it 'sleeps' do + expect(wcpackage).to receive(:current_installed_version).twice + .and_return(current_installed_version, '1.2.3') + expect_any_instance_of(described_class).to receive(:sleep).with(1) + .once.and_return(nil) + provider.send(:wait_for_installer) + end end - it 'sets the correct watch file' do - expected = '/Program Files/pia_manager/pia_manager.exe' - expect(provider.send(:wait_for_installer).creates).to eq(expected) + context 'installed package' do + let(:current_installed_version) { '1.2.3' } + + it 'does not sleep' do + expect_any_instance_of(described_class).not_to receive(:sleep) + provider.send(:wait_for_installer) + end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 67de635..210ae42 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -12,6 +12,7 @@ require_relative 'support/matchers/private_internet_access' require_relative 'support/resource/dmg_package' require_relative 'support/provider/dmg_package' +require_relative 'support/provider/windows_cookbook_package' RSpec.configure do |c| c.color = true diff --git a/spec/support/provider/windows_cookbook_package.rb b/spec/support/provider/windows_cookbook_package.rb new file mode 100644 index 0000000..8d4133e --- /dev/null +++ b/spec/support/provider/windows_cookbook_package.rb @@ -0,0 +1,13 @@ +# Encoding: UTF-8 + +require 'spec_helper' + +class Chef + class Provider + # A fake windows_cookbook_package provider + # + # @author Jonathan Hartman + class WindowsCookbookPackage < Provider + end + end +end