summaryrefslogtreecommitdiff
path: root/spec/unit/provider/package
diff options
context:
space:
mode:
authordanielsdeleo <dan@opscode.com>2013-06-13 11:27:52 -0700
committerdanielsdeleo <dan@opscode.com>2013-06-13 12:19:38 -0700
commitec0a3f5e755e1169207bd5b852d03f011dc6559d (patch)
treea3a05dbe580cfbae8e61d0bf021b03a0481f3a46 /spec/unit/provider/package
parent35da53b9dd889045ecea1b48e70a1dcb5ababc9e (diff)
downloadchef-ec0a3f5e755e1169207bd5b852d03f011dc6559d.tar.gz
Fix rubygems > 2.0 heuristic test
Fixes CHEF-4275 In some cases, upgrading to rubygems 2.0 from 1.8 can leave both installations available in the load path. The 2.0 install is ahead of the 1.8 install, but it is possible to load a file from the 1.8 install if that file does not exist in rubygems 2.0. In particular, rubygems/format does not exist in 2.0, so `require "rubygems/format"` loads from rubygems 1.8. When Chef "accidentally" loads the old rubygems/format, it defeats the version detection heuristic (check if Gem::Format) is defined, which eventually causes an error calling Gem::Package.open. Adding a check to see if Gem::Package defines open resolves this problem.
Diffstat (limited to 'spec/unit/provider/package')
-rw-r--r--spec/unit/provider/package/rubygems_spec.rb31
1 files changed, 31 insertions, 0 deletions
diff --git a/spec/unit/provider/package/rubygems_spec.rb b/spec/unit/provider/package/rubygems_spec.rb
index d7941af76d..d883a7f882 100644
--- a/spec/unit/provider/package/rubygems_spec.rb
+++ b/spec/unit/provider/package/rubygems_spec.rb
@@ -107,6 +107,37 @@ describe Chef::Provider::Package::Rubygems::CurrentGemEnvironment do
@gem_env.candidate_version_from_remote(Gem::Dependency.new('rspec', '>= 0')).should == Gem::Version.new('1.3.0')
end
+ context "when rubygems was upgraded from 1.8->2.0" do
+ # https://github.com/rubygems/rubygems/issues/404
+ # tl;dr rubygems 1.8 and 2.0 can both be in the load path, which means that
+ # require "rubygems/format" will load even though rubygems 2.0 doesn't have
+ # that file.
+
+ before do
+ if defined?(Gem::Format)
+ # tests are running under rubygems 1.8, or 2.0 upgraded from 1.8
+ @remove_gem_format = false
+ else
+ Gem.const_set(:Format, Object.new)
+ @remove_gem_format = true
+ end
+ Gem::Package.stub!(:respond_to?).with(:open).and_return(false)
+ end
+
+ after do
+ if @remove_gem_format
+ Gem.send(:remove_const, :Format)
+ end
+ end
+
+ it "finds a matching gem candidate version on rubygems 2.0+ with some rubygems 1.8 code loaded" do
+ package = mock("Gem::Package", :spec => "a gemspec from package")
+ Gem::Package.should_receive(:new).with("/path/to/package.gem").and_return(package)
+ @gem_env.spec_from_file("/path/to/package.gem").should == "a gemspec from package"
+ end
+
+ end
+
it "gives the candidate version as nil if none is found" do
dep = Gem::Dependency.new('rspec', '>= 0')
latest = []