summaryrefslogtreecommitdiff
path: root/spec/support/chef_helpers.rb
diff options
context:
space:
mode:
authorAdam Edwards <adamed@opscode.com>2016-03-31 13:28:47 -0700
committerAdam Edwards <adamed@opscode.com>2016-03-31 14:40:27 -0700
commite25b75e9fcd26ccc9c9094a43b614306de1047db (patch)
tree7085a050c9ca924e6998a71067664690885f8829 /spec/support/chef_helpers.rb
parentd1ae67938a6e02db9f122ce646d62b7b8347f6a3 (diff)
downloadchef-e25b75e9fcd26ccc9c9094a43b614306de1047db.tar.gz
Spec break on Windows due to temp dir and short path namesadamedx/windows-ruby22-unit-tmpdir
Diffstat (limited to 'spec/support/chef_helpers.rb')
-rw-r--r--spec/support/chef_helpers.rb22
1 files changed, 22 insertions, 0 deletions
diff --git a/spec/support/chef_helpers.rb b/spec/support/chef_helpers.rb
index f64c14da4d..d0b5ad0bfd 100644
--- a/spec/support/chef_helpers.rb
+++ b/spec/support/chef_helpers.rb
@@ -84,6 +84,28 @@ def canonicalize_path(path)
windows? ? path.tr("/", '\\') : path
end
+# Makes a temp directory with a canonical path on any platform.
+# Only really needed to work around an issue on Windows where
+# Ruby's temp library generates paths with short names.
+def make_canonical_temp_directory
+ temp_directory = Dir.mktmpdir
+ if windows?
+ # On Windows, temporary file / directory path names may have shortened
+ # subdirectory names due to reliance on the TMP and TEMP environment variables
+ # in some Windows APIs and duplicated logic in Ruby's temp file implementation.
+ # To work around this in the unit test context, we obtain the long (canonical)
+ # path name via a Windows system call so that this path name can be used
+ # in expectations that assume the ability to canonically name paths in comparisons.
+ # Note that this was not an issue prior to Ruby 2.2 -- with Ruby 2.2,
+ # some Chef code started to use long file names, while Ruby's temp file implementation
+ # continued to return the shortened names -- this would cause these particular tests to
+ # fail if the username happened to be longer than 8 characters.
+ Chef::ReservedNames::Win32::File.get_long_path_name(temp_directory)
+ else
+ temp_directory
+ end
+end
+
# Check if a cmd exists on the PATH
def which(cmd)
paths = ENV["PATH"].split(File::PATH_SEPARATOR) + [ "/bin", "/usr/bin", "/sbin", "/usr/sbin" ]