From a5dfaca00a94bc3d135aae52b4458f5a355bf0ed Mon Sep 17 00:00:00 2001 From: drbrain Date: Thu, 28 Feb 2013 22:25:55 +0000 Subject: * lib/rubygems/ext/builder.rb: Fix incompatibilities when installing extensions. Patch by Nobu. [ruby-trunk - Bug #7968] [ruby-trunk - Bug #7971] * lib/rubygems/ext/ext_conf_builder.rb: ditto. * lib/rubygems/installer.rb: ditto. * test/rubygems/test_gem_ext_ext_conf_builder.rb: Test for the above. * test/rubygems/test_gem_installer.rb: ditto. * lib/rubygems/commands/sources_command.rb: Prefer HTTPS over HTTP. * lib/rubygems/defaults.rb: ditto * lib/rubygems/dependency_resolver.rb: Ditto. * lib/rubygems/source.rb: ditto. * lib/rubygems/spec_fetcher.rb: ditto. * lib/rubygems/specification.rb: ditto. * lib/rubygems/test_utilities.rb: ditto. * test/rubygems/test_gem.rb: Test for the above. * test/rubygems/test_gem_commands_sources_command.rb: ditto. * test/rubygems/test_gem_dependency_resolver_api_set.rb: ditto. * test/rubygems/test_gem_remote_fetcher.rb: ditto. * test/rubygems/test_gem_source.rb: ditto. * test/rubygems/test_gem_spec_fetcher.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39542 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- test/rubygems/test_gem.rb | 2 +- test/rubygems/test_gem_commands_sources_command.rb | 39 +++++++++++ .../test_gem_dependency_resolver_api_set.rb | 80 ++++++++++++++++++++++ test/rubygems/test_gem_ext_ext_conf_builder.rb | 12 +--- test/rubygems/test_gem_installer.rb | 5 +- test/rubygems/test_gem_remote_fetcher.rb | 3 + test/rubygems/test_gem_source.rb | 11 +++ test/rubygems/test_gem_spec_fetcher.rb | 47 ++++++++++--- 8 files changed, 179 insertions(+), 20 deletions(-) create mode 100644 test/rubygems/test_gem_dependency_resolver_api_set.rb (limited to 'test') diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb index bf77009ca6..9be77e1375 100644 --- a/test/rubygems/test_gem.rb +++ b/test/rubygems/test_gem.rb @@ -665,7 +665,7 @@ class TestGem < Gem::TestCase end def test_self_default_sources - assert_equal %w[http://rubygems.org/], Gem.default_sources + assert_equal %w[https://rubygems.org/], Gem.default_sources end def test_self_detect_gemdeps diff --git a/test/rubygems/test_gem_commands_sources_command.rb b/test/rubygems/test_gem_commands_sources_command.rb index 6bae460c84..8dc2f91ed4 100644 --- a/test/rubygems/test_gem_commands_sources_command.rb +++ b/test/rubygems/test_gem_commands_sources_command.rb @@ -118,6 +118,45 @@ source #{@gem_repo} already present in the cache assert_equal '', @ui.error end + def test_execute_add_http_rubygems_org + http_rubygems_org = 'http://rubygems.org' + util_setup_fake_fetcher + + install_specs @a1 + + specs = Gem::Specification.map { |spec| + [spec.name, spec.version, spec.original_platform] + } + + specs_dump_gz = StringIO.new + Zlib::GzipWriter.wrap specs_dump_gz do |io| + Marshal.dump specs, io + end + + @fetcher.data["#{http_rubygems_org}/specs.#{@marshal_version}.gz"] = + specs_dump_gz.string + + @cmd.handle_options %W[--add #{http_rubygems_org}] + + util_setup_spec_fetcher + + ui = Gem::MockGemUi.new "n" + + use_ui ui do + assert_raises Gem::MockGemUi::TermError do + @cmd.execute + end + end + + assert_equal [@gem_repo], Gem.sources + + expected = <<-EXPECTED + EXPECTED + + assert_equal expected, @ui.output + assert_empty @ui.error + end + def test_execute_add_bad_uri @cmd.handle_options %w[--add beta-gems.example.com] diff --git a/test/rubygems/test_gem_dependency_resolver_api_set.rb b/test/rubygems/test_gem_dependency_resolver_api_set.rb new file mode 100644 index 0000000000..c1e7eda191 --- /dev/null +++ b/test/rubygems/test_gem_dependency_resolver_api_set.rb @@ -0,0 +1,80 @@ +require 'rubygems/test_case' +require 'rubygems/dependency_resolver' + +class TestGemDependencyResolverAPISet < Gem::TestCase + + def setup + super + + @DR = Gem::DependencyResolver + + @api_set = @DR::APISet.new + @uri = 'https://rubygems.org/api/v1/dependencies' + @fetcher = Gem::FakeFetcher.new + Gem::RemoteFetcher.fetcher = @fetcher + end + + def test_find_all + b_entry = { + :name => 'b', + :number => '2', + :platform => 'ruby', + :dependencies => [['a', '>= 0']], + } + + @fetcher.data["#{@uri}?gems=b"] = Marshal.dump [b_entry] + + b_req = @DR::DependencyRequest.new dep('b', '>= 0'), nil + + expected = [ + @DR::APISpecification.new(@api_set, b_entry) + ] + + assert_equal expected, @api_set.find_all(b_req) + end + + def test_prefetch + b_entry = { + :name => 'b', + :number => '2', + :platform => 'ruby', + :dependencies => [['a', '>= 0']], + } + + a_entry = { + :name => 'a', + :number => '2', + :platform => 'ruby', + :dependencies => [], + } + + @fetcher.data["#{@uri}?gems=a,b"] = Marshal.dump [a_entry, b_entry] + + a_req = @DR::DependencyRequest.new dep('a', '>= 0'), nil + b_req = @DR::DependencyRequest.new dep('b', '>= 0'), nil + + @api_set.prefetch([b_req, a_req]) + + assert_equal [a_entry], @api_set.versions('a') + assert_equal [b_entry], @api_set.versions('b') + end + + def test_versions_cache + entry = { + :name => 'b', + :number => '2', + :platform => 'ruby', + :dependencies => [['a', '>= 0']], + } + + @fetcher.data["#{@uri}?gems=b"] = Marshal.dump [entry] + + assert_equal [entry], @api_set.versions('b') + + @fetcher.data["#{@uri}?gems=b"] = 'garbage' + + assert_equal [entry], @api_set.versions('b'), 'version data must be cached' + end + +end + diff --git a/test/rubygems/test_gem_ext_ext_conf_builder.rb b/test/rubygems/test_gem_ext_ext_conf_builder.rb index 4a492c1235..c899592442 100644 --- a/test/rubygems/test_gem_ext_ext_conf_builder.rb +++ b/test/rubygems/test_gem_ext_ext_conf_builder.rb @@ -30,7 +30,7 @@ class TestGemExtExtConfBuilder < Gem::TestCase Gem::Ext::ExtConfBuilder.build 'extconf.rb', nil, @dest_path, output end - assert_match(/^#{Gem.ruby} extconf.rb/, output[0]) + assert_match(/^#{Gem.ruby} .*extconf.rb/, output[0]) assert_equal "creating Makefile\n", output[1] case RUBY_PLATFORM when /mswin/ then @@ -107,10 +107,10 @@ class TestGemExtExtConfBuilder < Gem::TestCase assert_match(/\Aextconf failed: -#{Gem.ruby} extconf.rb.* +#{Gem.ruby} .*extconf.rb.* checking for main\(\) in .*?nonexistent/m, error.message) - assert_match(/^#{Gem.ruby} extconf.rb/, output[0]) + assert_match(/^#{Gem.ruby} .*extconf.rb/, output[0]) end def test_class_make @@ -134,12 +134,6 @@ checking for main\(\) in .*?nonexistent/m, error.message) assert_equal make_command, output[0] assert_equal "#{make_command} install", output[2] - - edited_makefile = Gem.read_binary makefile_path - edited_makefile.gsub!(/\r/, '') if Gem.win_platform? - - assert_match "\nRUBYARCHDIR = #{@ext}$(target_prefix)\n", edited_makefile - assert_match "\nRUBYLIBDIR = #{@ext}$(target_prefix)\n", edited_makefile end def test_class_make_no_Makefile diff --git a/test/rubygems/test_gem_installer.rb b/test/rubygems/test_gem_installer.rb index ddedd8144c..a4e6caf7df 100644 --- a/test/rubygems/test_gem_installer.rb +++ b/test/rubygems/test_gem_installer.rb @@ -81,7 +81,7 @@ load Gem.bin_path('a', 'executable', version) gem_make_out = File.join @gemhome, 'gems', @spec.full_name, 'gem_make.out' - assert_match %r%#{Regexp.escape Gem.ruby} extconf\.rb%, + assert_match %r%#{Regexp.escape Gem.ruby} .*extconf\.rb%, File.read(gem_make_out) assert_match %r%#{Regexp.escape Gem.ruby}: No such file%, File.read(gem_make_out) @@ -119,7 +119,8 @@ load Gem.bin_path('a', 'executable', version) File.open File.join(@spec.gem_dir, "extconf.rb"), "w" do |f| f.write <<-'RUBY' puts "IN EXTCONF" - File.open 'extconf_args', 'w' do |f| + extconf_args = File.join File.dirname(__FILE__), 'extconf_args' + File.open extconf_args, 'w' do |f| f.puts ARGV.inspect end diff --git a/test/rubygems/test_gem_remote_fetcher.rb b/test/rubygems/test_gem_remote_fetcher.rb index d3cc388db4..c178edc0d9 100644 --- a/test/rubygems/test_gem_remote_fetcher.rb +++ b/test/rubygems/test_gem_remote_fetcher.rb @@ -399,6 +399,9 @@ gems: @fetcher.instance_variable_set :@a1, @a1 @fetcher.instance_variable_set :@a2, @a2 def @fetcher.fetch_path uri, mtime = nil, head = false + raise Gem::RemoteFetcher::FetchError.new 'no http upgrade', uri if + uri.scheme != 'http' + case uri.request_uri when /#{@a1.spec_name}/ then Gem.deflate Marshal.dump @a1 diff --git a/test/rubygems/test_gem_source.rb b/test/rubygems/test_gem_source.rb index 2629f180a9..3de9073f96 100644 --- a/test/rubygems/test_gem_source.rb +++ b/test/rubygems/test_gem_source.rb @@ -184,5 +184,16 @@ class TestGemSource < Gem::TestCase end end + def test_uri_equals + @source.api_uri # cached + + refute_equal URI('https://secure.example'), @source.api_uri + + @source.uri = URI 'https://secure.example' + + assert_equal URI('https://secure.example'), @source.uri + assert_equal URI('https://secure.example'), @source.api_uri + end + end diff --git a/test/rubygems/test_gem_spec_fetcher.rb b/test/rubygems/test_gem_spec_fetcher.rb index b4aff095c0..ac48edde96 100644 --- a/test/rubygems/test_gem_spec_fetcher.rb +++ b/test/rubygems/test_gem_spec_fetcher.rb @@ -32,13 +32,14 @@ class TestGemSpecFetcher < Gem::TestCase Gem::NameTuple.new(spec.name, spec.version, spec.original_platform) } - v = Gem.marshal_version - s_zip = util_gzip(Marshal.dump(Gem::NameTuple.to_basic(@specs))) - l_zip = util_gzip(Marshal.dump(Gem::NameTuple.to_basic(@latest_specs))) - p_zip = util_gzip(Marshal.dump(Gem::NameTuple.to_basic(@prerelease_specs))) - @fetcher.data["#{@gem_repo}specs.#{v}.gz"] = s_zip - @fetcher.data["#{@gem_repo}latest_specs.#{v}.gz"] = l_zip - @fetcher.data["#{@gem_repo}prerelease_specs.#{v}.gz"] = p_zip + @v = Gem.marshal_version + @s_zip = util_gzip(Marshal.dump(Gem::NameTuple.to_basic(@specs))) + @l_zip = util_gzip(Marshal.dump(Gem::NameTuple.to_basic(@latest_specs))) + @p_zip = util_gzip(Marshal.dump(Gem::NameTuple.to_basic(@prerelease_specs))) + + @fetcher.data["#{@gem_repo}specs.#{@v}.gz"] = @s_zip + @fetcher.data["#{@gem_repo}latest_specs.#{@v}.gz"] = @l_zip + @fetcher.data["#{@gem_repo}prerelease_specs.#{@v}.gz"] = @p_zip @sf = Gem::SpecFetcher.new @@ -200,7 +201,6 @@ class TestGemSpecFetcher < Gem::TestCase assert_equal comp.sort, specs[@source].sort end - def test_available_specs_cache specs, _ = @sf.available_specs(:latest) @@ -240,5 +240,36 @@ class TestGemSpecFetcher < Gem::TestCase assert_kind_of Gem::SourceFetchProblem, errors.first end + def test_upgrade_http_source + Gem.configuration.verbose = :really + + source = Gem::Source.new URI 'http://example' + same_source = nil + https_source = nil + + use_ui @ui do + same_source = @sf.upgrade_http_source source + end + + assert_equal URI('http://example'), same_source.uri + + @fetcher.data['https://example/'] = 'hello' + + use_ui @ui do + https_source = @sf.upgrade_http_source source + end + + assert_equal URI('https://example'), https_source.uri + + assert_empty @ui.error + + expected = <<-EXPECTED +Upgrading http://example to HTTPS failed, continuing +Upgraded http://example to HTTPS + EXPECTED + + assert_equal expected, @ui.output + end + end -- cgit v1.2.3