vaguerent/test/unit/support/shared/base_context.rb
Mitchell Hashimoto 194cd2145d Fix some nondeterminism in tests with GCing tempfiles.
Before, the tempfile "f" could be GC'd before the path was used,
resulting in failed tests because when it is GC'd the tempfile is
removed. We now store the tempfile in an instance variable so that it
isn't even available for GC until after the test is finished running.
2012-06-26 15:06:04 -07:00

60 lines
1.5 KiB
Ruby

require "tempfile"
require "unit/support/isolated_environment"
shared_context "unit" do
before(:each) do
# Create a thing to store our temporary files so that they aren't
# unlinked right away.
@_temp_files = []
end
# This creates an isolated environment so that Vagrant doesn't
# muck around with your real system during unit tests.
#
# The returned isolated environment has a variety of helper
# methods on it to easily create files, Vagrantfiles, boxes,
# etc.
def isolated_environment
env = Unit::IsolatedEnvironment.new
yield env if block_given?
env
end
# This helper creates a temporary file and returns a Pathname
# object pointed to it.
def temporary_file(contents=nil)
f = Tempfile.new("vagrant-unit")
if contents
f.write(contents)
f.flush
end
# Store the tempfile in an instance variable so that it is not
# garbage collected, so that the tempfile is not unlinked.
@_temp_files << f
return Pathname.new(f.path)
end
# This helper provides temporary environmental variable changes.
def with_temp_env(environment)
# Build up the new environment, preserving the old values so we
# can replace them back in later.
old_env = {}
environment.each do |key, value|
old_env[key] = ENV[key]
ENV[key] = value
end
# Call the block, returning its return value
return yield
ensure
# Reset the environment no matter what
old_env.each do |key, value|
ENV[key] = value
end
end
end