diff options
author | danielsdeleo <dan@opscode.com> | 2013-06-13 11:27:52 -0700 |
---|---|---|
committer | danielsdeleo <dan@opscode.com> | 2013-06-13 12:19:38 -0700 |
commit | ec0a3f5e755e1169207bd5b852d03f011dc6559d (patch) | |
tree | a3a05dbe580cfbae8e61d0bf021b03a0481f3a46 /spec/unit/provider/package | |
parent | 35da53b9dd889045ecea1b48e70a1dcb5ababc9e (diff) | |
download | chef-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.rb | 31 |
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 = [] |