From 269503b544247b5b3e30dbe60a0bab4f2ca00e4e Mon Sep 17 00:00:00 2001 From: naruse Date: Sat, 14 Sep 2013 08:59:02 +0000 Subject: Revert r42938 "* lib/rubygems: Update to RubyGems 2.1.3" It breaks build. http://u64.rubyci.org/~chkbuild/ruby-trunk/log/20130913T200302Z.diff.html.gz git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42941 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- test/rubygems/ca_cert.pem | 23 + test/rubygems/test_gem.rb | 557 ++++----------------- test/rubygems/test_gem_command_manager.rb | 44 +- test/rubygems/test_gem_commands_cert_command.rb | 168 ++++++- test/rubygems/test_gem_commands_cleanup_command.rb | 15 + .../rubygems/test_gem_commands_contents_command.rb | 36 +- .../test_gem_commands_environment_command.rb | 10 +- test/rubygems/test_gem_commands_fetch_command.rb | 30 +- test/rubygems/test_gem_commands_help_command.rb | 9 +- test/rubygems/test_gem_commands_install_command.rb | 66 +-- test/rubygems/test_gem_commands_owner_command.rb | 49 ++ .../rubygems/test_gem_commands_pristine_command.rb | 30 ++ test/rubygems/test_gem_commands_sources_command.rb | 2 +- .../test_gem_commands_uninstall_command.rb | 42 ++ test/rubygems/test_gem_commands_update_command.rb | 3 +- test/rubygems/test_gem_config_file.rb | 12 + test/rubygems/test_gem_dependency_installer.rb | 100 ++-- test/rubygems/test_gem_dependency_resolver.rb | 49 +- test/rubygems/test_gem_ext_builder.rb | 93 ++++ test/rubygems/test_gem_ext_ext_conf_builder.rb | 9 +- test/rubygems/test_gem_gem_runner.rb | 30 +- test/rubygems/test_gem_gemcutter_utilities.rb | 25 +- test/rubygems/test_gem_install_update_options.rb | 5 +- test/rubygems/test_gem_installer.rb | 247 ++++----- test/rubygems/test_gem_name_tuple.rb | 22 + test/rubygems/test_gem_package.rb | 134 ++++- test/rubygems/test_gem_package_old.rb | 8 + test/rubygems/test_gem_package_tar_reader.rb | 17 +- test/rubygems/test_gem_package_tar_reader_entry.rb | 2 +- test/rubygems/test_gem_package_tar_writer.rb | 134 ++--- test/rubygems/test_gem_path_support.rb | 17 + test/rubygems/test_gem_platform.rb | 18 + test/rubygems/test_gem_remote_fetcher.rb | 333 +++--------- test/rubygems/test_gem_security.rb | 60 ++- test/rubygems/test_gem_security_policy.rb | 54 +- test/rubygems/test_gem_security_signer.rb | 20 +- test/rubygems/test_gem_security_trust_dir.rb | 6 +- test/rubygems/test_gem_source.rb | 31 +- test/rubygems/test_gem_source_local.rb | 37 +- test/rubygems/test_gem_source_specific_file.rb | 40 +- test/rubygems/test_gem_spec_fetcher.rb | 15 +- test/rubygems/test_gem_specification.rb | 474 +++++++++++++++++- test/rubygems/test_gem_uninstaller.rb | 14 + test/rubygems/test_gem_version.rb | 15 + test/rubygems/test_gem_version_option.rb | 64 ++- 45 files changed, 2015 insertions(+), 1154 deletions(-) (limited to 'test/rubygems') diff --git a/test/rubygems/ca_cert.pem b/test/rubygems/ca_cert.pem index 5acdcf8f32..5207531bc2 100644 --- a/test/rubygems/ca_cert.pem +++ b/test/rubygems/ca_cert.pem @@ -43,3 +43,26 @@ ySjIblqVQkPuzebv3Ror6ZnVDukn96Mg7kP4u6zgxOeqlJGRe1M949SS9Vudjl8X SF4aZUUB9pQGhsqQJVqaz2OlhGOp9D0q54xko/rekjAIcuDjl1mdX4F2WRrzpUmZ uY/bPeOBYiVsOYVe -----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIJANz6ehBcVuuiMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMTMwNTAxMTQ0NTQxWhcNMjMwMzEwMTQ0NTQxWjBF +MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAzlpZwhEYoALOEKU4lmMw5l3YI/gadzDOoELtdcidvVvovKK8IIOTDwbA +3XcjwV0UPGEPOK4Uk1aD0EKkOQVg8ivSre2a3FFGffs2kXck+doJMzAA+pf8tvFk +QsETVOurOp74GN+er2xbbRSDVxQKq6d+QTe1E60btyXQS5M1Nt5SvLn8dazZJgvv +3yzJQ1IOQl+xeEO0WVVhPIx5Mx3VtjjcDyl8aewPkYkzia6UOrAyQZnl5sIzWGOb +kYKCNeKjTPepzlbMx0dN6jBupPYGNB+4FYY9GezInjGbRP5np5382wd3EWwsVzic +Nau8kXHTL2r7GzNvoy0p//iPCqx9FQIDAQABo4GnMIGkMB0GA1UdDgQWBBS7B027 +H/ZIkW3ngm1SrR0X/aTCwDB1BgNVHSMEbjBsgBS7B027H/ZIkW3ngm1SrR0X/aTC +wKFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV +BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJANz6ehBcVuuiMAwGA1UdEwQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAC0glUrUiylTfuOWlwkQvi74oiYC5CzW +Jfusg6o/Gg1XEuJhaHiYMsK/do16gSc6Za3934rHQbYu3mesyFkCWF9kD4J6/hEO +OQL8xmmgN7wS6GXy6oIODpny0MgnFrV4gd1aEx69NIfL/wXaM8Gw2sj1TnuGLs8+ +HFmWLRRH3WSR7ZLnqYzPVJwhHu8vtZBL9HZk1J6xyq00Nwi2Cz5WdiHamgaza3TS +OgBdWwDeSClwhrTJni4d30dbq+eNMByIZ7QNGBQivpFzDxeNV/2UBrTU0CilKG5Q +j7ZwknfKeA4xUTd8TMK3vKab5JJCfjbXOTHZQsYUcEEGSjOMS8/YVQs= +-----END CERTIFICATE----- diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb index fda83767f2..45db153c22 100644 --- a/test/rubygems/test_gem.rb +++ b/test/rubygems/test_gem.rb @@ -13,128 +13,21 @@ end class TestGem < Gem::TestCase + PLUGINS_LOADED = [] + def setup super + PLUGINS_LOADED.clear + + common_installer_setup + ENV.delete 'RUBYGEMS_GEMDEPS' @additional = %w[a b].map { |d| File.join @tempdir, d } util_remove_interrupt_command end - def assert_activate expected, *specs - specs.each do |spec| - case spec - when String then - Gem::Specification.find_by_name(spec).activate - when Gem::Specification then - spec.activate - else - flunk spec.inspect - end - end - - loaded = Gem.loaded_specs.values.map(&:full_name) - - assert_equal expected.sort, loaded.sort if expected - end - - def test_self_activate - foo = util_spec 'foo', '1' - - assert_activate %w[foo-1], foo - end - - def loaded_spec_names - Gem.loaded_specs.values.map(&:full_name).sort - end - - def unresolved_names - Gem::Specification.unresolved_deps.values.map(&:to_s).sort - end - - # TODO: move these to specification - def test_self_activate_via_require - a1 = new_spec "a", "1", "b" => "= 1" - b1 = new_spec "b", "1", nil, "lib/b/c.rb" - b2 = new_spec "b", "2", nil, "lib/b/c.rb" - - install_specs a1, b1, b2 - - a1.activate - save_loaded_features do - require "b/c" - end - - assert_equal %w(a-1 b-1), loaded_spec_names - end - - # TODO: move these to specification - def test_self_activate_deep_unambiguous - a1 = new_spec "a", "1", "b" => "= 1" - b1 = new_spec "b", "1", "c" => "= 1" - b2 = new_spec "b", "2", "c" => "= 2" - c1 = new_spec "c", "1" - c2 = new_spec "c", "2" - - install_specs a1, b1, b2, c1, c2 - - a1.activate - assert_equal %w(a-1 b-1 c-1), loaded_spec_names - end - - def save_loaded_features - old_loaded_features = $LOADED_FEATURES.dup - yield - ensure - $LOADED_FEATURES.replace old_loaded_features - end - - # TODO: move these to specification - def test_self_activate_ambiguous_direct - save_loaded_features do - a1 = new_spec "a", "1", "b" => "> 0" - b1 = new_spec("b", "1", { "c" => ">= 1" }, "lib/d.rb") - b2 = new_spec("b", "2", { "c" => ">= 2" }, "lib/d.rb") - c1 = new_spec "c", "1" - c2 = new_spec "c", "2" - - Gem::Specification.reset - install_specs a1, b1, b2, c1, c2 - - a1.activate - assert_equal %w(a-1), loaded_spec_names - assert_equal ["b (> 0)"], unresolved_names - - require "d" - - assert_equal %w(a-1 b-2 c-2), loaded_spec_names - assert_equal [], unresolved_names - end - end - - # TODO: move these to specification - def test_self_activate_ambiguous_indirect - save_loaded_features do - a1 = new_spec "a", "1", "b" => "> 0" - b1 = new_spec "b", "1", "c" => ">= 1" - b2 = new_spec "b", "2", "c" => ">= 2" - c1 = new_spec "c", "1", nil, "lib/d.rb" - c2 = new_spec "c", "2", nil, "lib/d.rb" - - install_specs a1, b1, b2, c1, c2 - - a1.activate - assert_equal %w(a-1), loaded_spec_names - assert_equal ["b (> 0)"], unresolved_names - - require "d" - - assert_equal %w(a-1 b-2 c-2), loaded_spec_names - assert_equal [], unresolved_names - end - end - def test_self_finish_resolve save_loaded_features do a1 = new_spec "a", "1", "b" => "> 0" @@ -157,36 +50,6 @@ class TestGem < Gem::TestCase end end - def test_self_activate_via_require_wtf - save_loaded_features do - a1 = new_spec "a", "1", "b" => "> 0", "d" => "> 0" # this - b1 = new_spec "b", "1", { "c" => ">= 1" }, "lib/b.rb" - b2 = new_spec "b", "2", { "c" => ">= 2" }, "lib/b.rb" # this - c1 = new_spec "c", "1" - c2 = new_spec "c", "2" # this - d1 = new_spec "d", "1", { "c" => "< 2" }, "lib/d.rb" - d2 = new_spec "d", "2", { "c" => "< 2" }, "lib/d.rb" # this - - install_specs a1, b1, b2, c1, c2, d1, d2 - - a1.activate - - assert_equal %w(a-1), loaded_spec_names - assert_equal ["b (> 0)", "d (> 0)"], unresolved_names - - require "b" - - e = assert_raises Gem::LoadError do - require "d" - end - - assert_equal "unable to find a version of 'd' to activate", e.message - - assert_equal %w(a-1 b-2 c-2), loaded_spec_names - assert_equal ["d (> 0)"], unresolved_names - end - end - def test_self_finish_resolve_wtf save_loaded_features do a1 = new_spec "a", "1", "b" => "> 0", "d" => "> 0" # this @@ -211,94 +74,6 @@ class TestGem < Gem::TestCase end end - # TODO: move these to specification - def test_self_activate_ambiguous_unrelated - save_loaded_features do - a1 = new_spec "a", "1", "b" => "> 0" - b1 = new_spec "b", "1", "c" => ">= 1" - b2 = new_spec "b", "2", "c" => ">= 2" - c1 = new_spec "c", "1" - c2 = new_spec "c", "2" - d1 = new_spec "d", "1", nil, "lib/d.rb" - - install_specs a1, b1, b2, c1, c2, d1 - - a1.activate - assert_equal %w(a-1), loaded_spec_names - assert_equal ["b (> 0)"], unresolved_names - - require "d" - - assert_equal %w(a-1 d-1), loaded_spec_names - assert_equal ["b (> 0)"], unresolved_names - end - end - - # TODO: move these to specification - def test_self_activate_ambiguous_indirect_conflict - save_loaded_features do - a1 = new_spec "a", "1", "b" => "> 0" - a2 = new_spec "a", "2", "b" => "> 0" - b1 = new_spec "b", "1", "c" => ">= 1" - b2 = new_spec "b", "2", "c" => ">= 2" - c1 = new_spec "c", "1", nil, "lib/d.rb" - c2 = new_spec("c", "2", { "a" => "1" }, "lib/d.rb") # conflicts with a-2 - - install_specs a1, a2, b1, b2, c1, c2 - - a2.activate - assert_equal %w(a-2), loaded_spec_names - assert_equal ["b (> 0)"], unresolved_names - - require "d" - - assert_equal %w(a-2 b-1 c-1), loaded_spec_names - assert_equal [], unresolved_names - end - end - - # TODO: move these to specification - def test_require_already_activated - save_loaded_features do - a1 = new_spec "a", "1", nil, "lib/d.rb" - - install_specs a1 # , a2, b1, b2, c1, c2 - - a1.activate - assert_equal %w(a-1), loaded_spec_names - assert_equal [], unresolved_names - - assert require "d" - - assert_equal %w(a-1), loaded_spec_names - assert_equal [], unresolved_names - end - end - - # TODO: move these to specification - def test_require_already_activated_indirect_conflict - save_loaded_features do - a1 = new_spec "a", "1", "b" => "> 0" - a2 = new_spec "a", "2", "b" => "> 0" - b1 = new_spec "b", "1", "c" => ">= 1" - b2 = new_spec "b", "2", "c" => ">= 2" - c1 = new_spec "c", "1", nil, "lib/d.rb" - c2 = new_spec("c", "2", { "a" => "1" }, "lib/d.rb") # conflicts with a-2 - - install_specs a1, a2, b1, b2, c1, c2 - - a1.activate - c1.activate - assert_equal %w(a-1 c-1), loaded_spec_names - assert_equal ["b (> 0)"], unresolved_names - - assert require "d" - - assert_equal %w(a-1 c-1), loaded_spec_names - assert_equal ["b (> 0)"], unresolved_names - end - end - def test_require_missing save_loaded_features do assert_raises ::LoadError do @@ -321,221 +96,6 @@ class TestGem < Gem::TestCase end end - # TODO: move these to specification - def test_self_activate_loaded - foo = util_spec 'foo', '1' - - assert foo.activate - refute foo.activate - end - - ## - # [A] depends on - # [B] >= 1.0 (satisfied by 2.0) - # [C] depends on nothing - - def test_self_activate_unrelated - a = util_spec 'a', '1.0', 'b' => '>= 1.0' - util_spec 'b', '1.0' - c = util_spec 'c', '1.0' - - assert_activate %w[b-1.0 c-1.0 a-1.0], a, c, "b" - end - - ## - # [A] depends on - # [B] >= 1.0 (satisfied by 2.0) - # [C] = 1.0 depends on - # [B] ~> 1.0 - # - # and should resolve using b-1.0 - # TODO: move these to specification - - def test_self_activate_over - a = util_spec 'a', '1.0', 'b' => '>= 1.0', 'c' => '= 1.0' - util_spec 'b', '1.0' - util_spec 'b', '1.1' - util_spec 'b', '2.0' - util_spec 'c', '1.0', 'b' => '~> 1.0' - - a.activate - - assert_equal %w[a-1.0 c-1.0], loaded_spec_names - assert_equal ["b (>= 1.0, ~> 1.0)"], unresolved_names - end - - ## - # [A] depends on - # [B] ~> 1.0 (satisfied by 1.1) - # [C] = 1.0 depends on - # [B] = 1.0 - # - # and should resolve using b-1.0 - # - # TODO: this is not under, but over... under would require depth - # first resolve through a dependency that is later pruned. - - def test_self_activate_under - a, _ = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0' - util_spec 'b', '1.0' - util_spec 'b', '1.1' - c, _ = util_spec 'c', '1.0', 'b' => '= 1.0' - - assert_activate %w[b-1.0 c-1.0 a-1.0], a, c, "b" - end - - ## - # [A1] depends on - # [B] > 0 (satisfied by 2.0) - # [B1] depends on - # [C] > 0 (satisfied by 1.0) - # [B2] depends on nothing! - # [C1] depends on nothing - - def test_self_activate_dropped - a1, = util_spec 'a', '1', 'b' => nil - util_spec 'b', '1', 'c' => nil - util_spec 'b', '2' - util_spec 'c', '1' - - assert_activate %w[b-2 a-1], a1, "b" - end - - ## - # [A] depends on - # [B] >= 1.0 (satisfied by 1.1) depends on - # [Z] - # [C] >= 1.0 depends on - # [B] = 1.0 - # - # and should backtrack to resolve using b-1.0, pruning Z from the - # resolve. - - def test_self_activate_raggi_the_edgecase_generator - a, _ = util_spec 'a', '1.0', 'b' => '>= 1.0', 'c' => '>= 1.0' - util_spec 'b', '1.0' - util_spec 'b', '1.1', 'z' => '>= 1.0' - c, _ = util_spec 'c', '1.0', 'b' => '= 1.0' - - assert_activate %w[b-1.0 c-1.0 a-1.0], a, c, "b" - end - - def test_self_activate_conflict - util_spec 'b', '1.0' - util_spec 'b', '2.0' - - gem "b", "= 1.0" - - assert_raises Gem::LoadError do - gem "b", "= 2.0" - end - end - - ## - # [A] depends on - # [C] = 1.0 depends on - # [B] = 2.0 - # [B] ~> 1.0 (satisfied by 1.0) - - def test_self_activate_checks_dependencies - a, _ = util_spec 'a', '1.0' - a.add_dependency 'c', '= 1.0' - a.add_dependency 'b', '~> 1.0' - - util_spec 'b', '1.0' - util_spec 'b', '2.0' - c, _ = util_spec 'c', '1.0', 'b' => '= 2.0' - - e = assert_raises Gem::LoadError do - assert_activate nil, a, c, "b" - end - - expected = "can't satisfy 'b (~> 1.0)', already activated 'b-2.0'" - assert_equal expected, e.message - end - - ## - # [A] depends on - # [B] ~> 1.0 (satisfied by 1.0) - # [C] = 1.0 depends on - # [B] = 2.0 - - def test_self_activate_divergent - a, _ = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0' - util_spec 'b', '1.0' - util_spec 'b', '2.0' - c, _ = util_spec 'c', '1.0', 'b' => '= 2.0' - - e = assert_raises Gem::LoadError do - assert_activate nil, a, c, "b" - end - - assert_match(/Unable to activate c-1.0,/, e.message) - assert_match(/because b-1.0 conflicts with b .= 2.0/, e.message) - end - - ## - # DOC - - def test_self_activate_platform_alternate - @x1_m = util_spec 'x', '1' do |s| - s.platform = Gem::Platform.new %w[cpu my_platform 1] - end - - @x1_o = util_spec 'x', '1' do |s| - s.platform = Gem::Platform.new %w[cpu other_platform 1] - end - - @w1 = util_spec 'w', '1', 'x' => nil - - util_set_arch 'cpu-my_platform1' - - assert_activate %w[x-1-cpu-my_platform-1 w-1], @w1, @x1_m - end - - ## - # DOC - - def test_self_activate_platform_bump - @y1 = util_spec 'y', '1' - - @y1_1_p = util_spec 'y', '1.1' do |s| - s.platform = Gem::Platform.new %w[cpu my_platform 1] - end - - @z1 = util_spec 'z', '1', 'y' => nil - - assert_activate %w[y-1 z-1], @z1, @y1 - end - - ## - # [C] depends on - # [A] = 1.a - # [B] = 1.0 depends on - # [A] >= 0 (satisfied by 1.a) - - def test_self_activate_prerelease - @c1_pre = util_spec 'c', '1.a', "a" => "1.a", "b" => "1" - @a1_pre = util_spec 'a', '1.a' - @b1 = util_spec 'b', '1' do |s| - s.add_dependency 'a' - s.add_development_dependency 'aa' - end - - assert_activate %w[a-1.a b-1 c-1.a], @c1_pre, @a1_pre, @b1 - end - - ## - # DOC - - def test_self_activate_old_required - e1, = util_spec 'e', '1', 'd' => '= 1' - @d1 = util_spec 'd', '1' - @d2 = util_spec 'd', '2' - - assert_activate %w[d-1 e-1], e1, "d" - end - def test_self_bin_path_no_exec_name e = assert_raises ArgumentError do Gem.bin_path 'a' @@ -790,9 +350,7 @@ class TestGem < Gem::TestCase spec } - # HACK should be Gem.refresh - Gem.searcher = nil - Gem::Specification.reset + Gem.refresh expected = [ File.expand_path('test/rubygems/sff/discover.rb', @@project_dir), @@ -806,6 +364,37 @@ class TestGem < Gem::TestCase assert_equal cwd, $LOAD_PATH.shift end + def test_self_find_latest_files + cwd = File.expand_path("test/rubygems", @@project_dir) + $LOAD_PATH.unshift cwd + + discover_path = File.join 'lib', 'sff', 'discover.rb' + + _, foo2 = %w(1 2).map { |version| + spec = quick_gem 'sff', version do |s| + s.files << discover_path + end + + write_file(File.join 'gems', spec.full_name, discover_path) do |fp| + fp.puts "# #{spec.full_name}" + end + + spec + } + + Gem.refresh + + expected = [ + File.expand_path('test/rubygems/sff/discover.rb', @@project_dir), + File.join(foo2.full_gem_path, discover_path), + ] + + assert_equal expected, Gem.find_latest_files('sff/discover') + assert_equal expected, Gem.find_latest_files('sff/**.rb'), '[ruby-core:31730]' + ensure + assert_equal cwd, $LOAD_PATH.shift + end + def test_self_latest_spec_for a1 = quick_spec 'a', 1 a2 = quick_spec 'a', 2 @@ -1328,14 +917,20 @@ class TestGem < Gem::TestCase Dir.chdir @tempdir do FileUtils.mkdir_p 'lib' File.open plugin_path, "w" do |fp| - fp.puts "class TestGem; TEST_SPEC_PLUGIN_LOAD = :loaded; end" + fp.puts "class TestGem; PLUGINS_LOADED << 'plugin'; end" end - foo = quick_spec 'foo', '1' do |s| + foo1 = quick_spec 'foo', '1' do |s| s.files << plugin_path end - install_gem foo + install_gem foo1 + + foo2 = quick_spec 'foo', '2' do |s| + s.files << plugin_path + end + + install_gem foo2 end Gem.searcher = nil @@ -1345,7 +940,7 @@ class TestGem < Gem::TestCase Gem.load_plugins - assert_equal :loaded, TEST_SPEC_PLUGIN_LOAD + assert_equal %w[plugin], PLUGINS_LOADED end def test_load_env_plugins @@ -1558,6 +1153,61 @@ class TestGem < Gem::TestCase assert_equal '["a-1", "b-1", "c-1"]', out.strip end + def test_register_default_spec + Gem.clear_default_specs + + old_style = Gem::Specification.new do |spec| + spec.files = ["foo.rb", "bar.rb"] + end + + Gem.register_default_spec old_style + + assert_equal old_style, Gem.find_unresolved_default_spec("foo.rb") + assert_equal old_style, Gem.find_unresolved_default_spec("bar.rb") + assert_equal nil, Gem.find_unresolved_default_spec("baz.rb") + + Gem.clear_default_specs + + new_style = Gem::Specification.new do |spec| + spec.files = ["lib/foo.rb", "ext/bar.rb", "bin/exec", "README"] + spec.require_paths = ["lib", "ext"] + end + + Gem.register_default_spec new_style + + assert_equal new_style, Gem.find_unresolved_default_spec("foo.rb") + assert_equal new_style, Gem.find_unresolved_default_spec("bar.rb") + assert_equal nil, Gem.find_unresolved_default_spec("exec") + assert_equal nil, Gem.find_unresolved_default_spec("README") + end + + def test_default_gems_use_full_paths + begin + if defined?(RUBY_ENGINE) then + engine = RUBY_ENGINE + Object.send :remove_const, :RUBY_ENGINE + end + Object.const_set :RUBY_ENGINE, 'ruby' + + refute Gem.default_gems_use_full_paths? + ensure + Object.send :remove_const, :RUBY_ENGINE + Object.const_set :RUBY_ENGINE, engine if engine + end + + begin + if defined?(RUBY_ENGINE) then + engine = RUBY_ENGINE + Object.send :remove_const, :RUBY_ENGINE + end + Object.const_set :RUBY_ENGINE, 'jruby' + assert Gem.default_gems_use_full_paths? + ensure + Object.send :remove_const, :RUBY_ENGINE + Object.const_set :RUBY_ENGINE, engine if engine + end + end + def with_plugin(path) test_plugin_path = File.expand_path("test/rubygems/plugin/#{path}", @@project_dir) @@ -1634,4 +1284,3 @@ class TestGem < Gem::TestCase File.join Gem.dir, "cache" end end - diff --git a/test/rubygems/test_gem_command_manager.rb b/test/rubygems/test_gem_command_manager.rb index e201d73275..f6433c5cc3 100644 --- a/test/rubygems/test_gem_command_manager.rb +++ b/test/rubygems/test_gem_command_manager.rb @@ -58,7 +58,7 @@ class TestGemCommandManager < Gem::TestCase use_ui @ui do assert_raises Gem::MockGemUi::TermError do - @command_manager.run 'interrupt' + @command_manager.run %w[interrupt] end assert_equal '', ui.output assert_equal "ERROR: Interrupted\n", ui.error @@ -75,7 +75,7 @@ class TestGemCommandManager < Gem::TestCase @command_manager.register_command :crash use_ui @ui do assert_raises Gem::MockGemUi::TermError do - @command_manager.run 'crash' + @command_manager.run %w[crash] end assert_equal '', ui.output err = ui.error.split("\n").first @@ -89,7 +89,7 @@ class TestGemCommandManager < Gem::TestCase def test_process_args_bad_arg use_ui @ui do assert_raises Gem::MockGemUi::TermError do - @command_manager.process_args("--bad-arg") + @command_manager.process_args %w[--bad-arg] end end @@ -107,7 +107,7 @@ class TestGemCommandManager < Gem::TestCase end #check defaults - @command_manager.process_args("install") + @command_manager.process_args %w[install] assert_equal %w[ri], check_options[:document].sort assert_equal false, check_options[:force] assert_equal :both, check_options[:domain] @@ -118,8 +118,10 @@ class TestGemCommandManager < Gem::TestCase #check settings check_options = nil - @command_manager.process_args( - "install --force --local --rdoc --install-dir . --version 3.0 --no-wrapper --bindir . ") + @command_manager.process_args %w[ + install --force --local --rdoc --install-dir . + --version 3.0 --no-wrapper --bindir . + ] assert_equal %w[rdoc ri], check_options[:document].sort assert_equal true, check_options[:force] assert_equal :local, check_options[:domain] @@ -130,17 +132,17 @@ class TestGemCommandManager < Gem::TestCase #check remote domain check_options = nil - @command_manager.process_args("install --remote") + @command_manager.process_args %w[install --remote] assert_equal :remote, check_options[:domain] #check both domain check_options = nil - @command_manager.process_args("install --both") + @command_manager.process_args %w[install --both] assert_equal :both, check_options[:domain] #check both domain check_options = nil - @command_manager.process_args("install --both") + @command_manager.process_args %w[install --both] assert_equal :both, check_options[:domain] end end @@ -155,12 +157,12 @@ class TestGemCommandManager < Gem::TestCase end #check defaults - @command_manager.process_args("uninstall") + @command_manager.process_args %w[uninstall] assert_equal Gem::Requirement.default, check_options[:version] #check settings check_options = nil - @command_manager.process_args("uninstall foobar --version 3.0") + @command_manager.process_args %w[uninstall foobar --version 3.0] assert_equal "foobar", check_options[:args].first assert_equal Gem::Requirement.new('3.0'), check_options[:version] end @@ -175,12 +177,12 @@ class TestGemCommandManager < Gem::TestCase end #check defaults - @command_manager.process_args("check") + @command_manager.process_args %w[check] assert_equal true, check_options[:alien] #check settings check_options = nil - @command_manager.process_args("check foobar --alien") + @command_manager.process_args %w[check foobar --alien] assert_equal true, check_options[:alien] end @@ -194,12 +196,12 @@ class TestGemCommandManager < Gem::TestCase end #check defaults - @command_manager.process_args("build") + @command_manager.process_args %w[build] #NOTE: Currently no defaults #check settings check_options = nil - @command_manager.process_args("build foobar.rb") + @command_manager.process_args %w[build foobar.rb] assert_equal 'foobar.rb', check_options[:args].first end @@ -213,26 +215,26 @@ class TestGemCommandManager < Gem::TestCase end #check defaults - @command_manager.process_args("query") + @command_manager.process_args %w[query] assert_equal(//, check_options[:name]) assert_equal :local, check_options[:domain] assert_equal false, check_options[:details] #check settings check_options = nil - @command_manager.process_args("query --name foobar --local --details") + @command_manager.process_args %w[query --name foobar --local --details] assert_equal(/foobar/i, check_options[:name]) assert_equal :local, check_options[:domain] assert_equal true, check_options[:details] #remote domain check_options = nil - @command_manager.process_args("query --remote") + @command_manager.process_args %w[query --remote] assert_equal :remote, check_options[:domain] #both (local/remote) domains check_options = nil - @command_manager.process_args("query --both") + @command_manager.process_args %w[query --both] assert_equal :both, check_options[:domain] end @@ -246,12 +248,12 @@ class TestGemCommandManager < Gem::TestCase end #check defaults - @command_manager.process_args("update") + @command_manager.process_args %w[update] assert_includes check_options[:document], 'rdoc' #check settings check_options = nil - @command_manager.process_args("update --force --rdoc --install-dir .") + @command_manager.process_args %w[update --force --rdoc --install-dir .] assert_includes check_options[:document], 'ri' assert_equal true, check_options[:force] assert_equal Dir.pwd, check_options[:install_dir] diff --git a/test/rubygems/test_gem_commands_cert_command.rb b/test/rubygems/test_gem_commands_cert_command.rb index 75db6c4e15..a158a4442b 100644 --- a/test/rubygems/test_gem_commands_cert_command.rb +++ b/test/rubygems/test_gem_commands_cert_command.rb @@ -2,8 +2,8 @@ require 'rubygems/test_case' require 'rubygems/commands/cert_command' require 'rubygems/fix_openssl_warnings' if RUBY_VERSION < "1.9" -unless defined? OpenSSL then - warn "`gem cert` tests are being skipped, module OpenSSL not found" +unless defined?(OpenSSL::SSL) then + warn 'Skipping `gem cert` tests. openssl not found.' end class TestGemCommandsCertCommand < Gem::TestCase @@ -98,14 +98,22 @@ Added '/CN=alternate/DC=example' end def test_execute_build + passphrase = 'Foo bar' + @cmd.handle_options %W[--build nobody@example.com] - use_ui @ui do + @build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase}" + + use_ui @build_ui do @cmd.execute end - output = @ui.output.split "\n" + output = @build_ui.output.split "\n" + assert_equal "Passphrase for your Private Key: ", + output.shift + assert_equal "Please repeat the passphrase for your Private Key: ", + output.shift assert_equal "Certificate: #{File.join @tempdir, 'gem-public_cert.pem'}", output.shift assert_equal "Private Key: #{File.join @tempdir, 'gem-private_key.pem'}", @@ -115,12 +123,43 @@ Added '/CN=alternate/DC=example' output.shift assert_empty output - assert_empty @ui.error + assert_empty @build_ui.error assert_path_exists File.join(@tempdir, 'gem-private_key.pem') assert_path_exists File.join(@tempdir, 'gem-public_cert.pem') end + def test_execute_build_bad_passphrase_confirmation + passphrase = 'Foo bar' + passphrase_confirmation = 'Fu bar' + + @cmd.handle_options %W[--build nobody@example.com] + + @build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase_confirmation}" + + use_ui @build_ui do + e = assert_raises Gem::CommandLineError do + @cmd.execute + end + + output = @build_ui.output.split "\n" + + assert_equal "Passphrase for your Private Key: ", + output.shift + assert_equal "Please repeat the passphrase for your Private Key: ", + output.shift + + assert_empty output + + assert_equal "Passphrase and passphrase confirmation don't match", + e.message + + end + + refute_path_exists File.join(@tempdir, 'gem-private_key.pem') + refute_path_exists File.join(@tempdir, 'gem-public_cert.pem') + end + def test_execute_build_key @cmd.handle_options %W[ --build nobody@example.com @@ -135,21 +174,32 @@ Added '/CN=alternate/DC=example' assert_equal "Certificate: #{File.join @tempdir, 'gem-public_cert.pem'}", output.shift - assert_equal "Private Key: #{File.join @tempdir, 'gem-private_key.pem'}", - output.shift - - assert_equal "Don't forget to move the key file to somewhere private!", - output.shift assert_empty output assert_empty @ui.error assert_path_exists File.join(@tempdir, 'gem-public_cert.pem') + end + + def test_execute_build_encrypted_key + @cmd.handle_options %W[ + --build nobody@example.com + --private-key #{ENCRYPTED_PRIVATE_KEY_PATH} + ] + + use_ui @ui do + @cmd.execute + end + + output = @ui.output.split "\n" + + assert_equal "Certificate: #{File.join @tempdir, 'gem-public_cert.pem'}", + output.shift - private_key_file = File.join @tempdir, 'gem-private_key.pem' - assert_path_exists private_key_file + assert_empty output + assert_empty @ui.error - assert_equal PRIVATE_KEY.to_pem, File.read(private_key_file) + assert_path_exists File.join(@tempdir, 'gem-public_cert.pem') end def test_execute_certificate @@ -203,6 +253,17 @@ Added '/CN=alternate/DC=example' assert_equal PRIVATE_KEY.to_pem, @cmd.options[:key].to_pem end + def test_execute_encrypted_private_key + use_ui @ui do + @cmd.send :handle_options, %W[--private-key #{ENCRYPTED_PRIVATE_KEY_PATH}] + end + + assert_equal '', @ui.output + assert_equal '', @ui.error + + assert_equal ENCRYPTED_PRIVATE_KEY.to_pem, @cmd.options[:key].to_pem + end + def test_execute_remove @trust_dir.trust_cert PUBLIC_CERT @@ -307,6 +368,35 @@ Removed '/CN=alternate/DC=example' assert_equal mask, File.stat(path).mode unless win_platform? end + def test_execute_sign_encrypted_key + path = File.join @tempdir, 'cert.pem' + Gem::Security.write ALTERNATE_CERT, path, 0600 + + assert_equal '/CN=alternate/DC=example', ALTERNATE_CERT.issuer.to_s + + @cmd.handle_options %W[ + --private-key #{ENCRYPTED_PRIVATE_KEY_PATH} + --certificate #{PUBLIC_CERT_FILE} + + --sign #{path} + ] + + use_ui @ui do + @cmd.execute + end + + assert_equal '', @ui.output + assert_equal '', @ui.error + + cert = OpenSSL::X509::Certificate.new File.read path + + assert_equal '/CN=nobody/DC=example', cert.issuer.to_s + + mask = 0100600 & (~File.umask) + + assert_equal mask, File.stat(path).mode unless win_platform? + end + def test_execute_sign_default FileUtils.mkdir_p File.join Gem.user_home, '.gem' @@ -339,6 +429,38 @@ Removed '/CN=alternate/DC=example' assert_equal mask, File.stat(path).mode unless win_platform? end + def test_execute_sign_default_encrypted_key + FileUtils.mkdir_p File.join(Gem.user_home, '.gem') + + private_key_path = File.join Gem.user_home, '.gem', 'gem-private_key.pem' + Gem::Security.write ENCRYPTED_PRIVATE_KEY, private_key_path, 0600, PRIVATE_KEY_PASSPHRASE + + public_cert_path = File.join Gem.user_home, '.gem', 'gem-public_cert.pem' + Gem::Security.write PUBLIC_CERT, public_cert_path + + path = File.join @tempdir, 'cert.pem' + Gem::Security.write ALTERNATE_CERT, path, 0600 + + assert_equal '/CN=alternate/DC=example', ALTERNATE_CERT.issuer.to_s + + @cmd.handle_options %W[--sign #{path}] + + use_ui @ui do + @cmd.execute + end + + assert_equal '', @ui.output + assert_equal '', @ui.error + + cert = OpenSSL::X509::Certificate.new File.read path + + assert_equal '/CN=nobody/DC=example', cert.issuer.to_s + + mask = 0100600 & (~File.umask) + + assert_equal mask, File.stat(path).mode unless win_platform? + end + def test_execute_sign_no_cert FileUtils.mkdir_p File.join Gem.user_home, '.gem' @@ -509,6 +631,24 @@ ERROR: --private-key not specified and ~/.gem/gem-private_key.pem does not exis assert_equal [ALTERNATE_CERT_FILE, CHILD_CERT_FILE], @cmd.options[:sign] end + def test_handle_options_sign_encrypted_key + @cmd.handle_options %W[ + --private-key #{ALTERNATE_KEY_FILE} + --private-key #{ENCRYPTED_PRIVATE_KEY_PATH} + + --certificate #{ALTERNATE_CERT_FILE} + --certificate #{PUBLIC_CERT_FILE} + + --sign #{ALTERNATE_CERT_FILE} + --sign #{CHILD_CERT_FILE} + ] + + assert_equal ENCRYPTED_PRIVATE_KEY.to_pem, @cmd.options[:key].to_pem + assert_equal PUBLIC_CERT.to_pem, @cmd.options[:issuer_cert].to_pem + + assert_equal [ALTERNATE_CERT_FILE, CHILD_CERT_FILE], @cmd.options[:sign] + end + def test_handle_options_sign_nonexistent nonexistent = File.join @tempdir, 'nonexistent' e = assert_raises OptionParser::InvalidArgument do @@ -525,5 +665,5 @@ ERROR: --private-key not specified and ~/.gem/gem-private_key.pem does not exis e.message end -end if defined? OpenSSL +end if defined?(OpenSSL::SSL) diff --git a/test/rubygems/test_gem_commands_cleanup_command.rb b/test/rubygems/test_gem_commands_cleanup_command.rb index 26b1fe7b0c..6fd06d26e0 100644 --- a/test/rubygems/test_gem_commands_cleanup_command.rb +++ b/test/rubygems/test_gem_commands_cleanup_command.rb @@ -15,6 +15,21 @@ class TestGemCommandsCleanupCommand < Gem::TestCase install_gem @a_2 end + def test_handle_options_d + @cmd.handle_options %w[-d] + assert @cmd.options[:dryrun] + end + + def test_handle_options_dry_run + @cmd.handle_options %w[--dryrun] + assert @cmd.options[:dryrun] + end + + def test_handle_options_n + @cmd.handle_options %w[-n] + assert @cmd.options[:dryrun] + end + def test_execute @cmd.options[:args] = %w[a] diff --git a/test/rubygems/test_gem_commands_contents_command.rb b/test/rubygems/test_gem_commands_contents_command.rb index 60df53f53b..d87e84fc82 100644 --- a/test/rubygems/test_gem_commands_contents_command.rb +++ b/test/rubygems/test_gem_commands_contents_command.rb @@ -91,6 +91,34 @@ class TestGemCommandsContentsCommand < Gem::TestCase assert_equal "", @ui.error end + def test_execute_missing_single + @cmd.options[:args] = %w[foo] + + assert_raises Gem::MockGemUi::TermError do + use_ui @ui do + @cmd.execute + end + end + + assert_match "Unable to find gem 'foo'", @ui.output + assert_empty @ui.error + end + + def test_execute_missing_multiple + @cmd.options[:args] = %w[foo bar] + + gem 'foo' + + use_ui @ui do + @cmd.execute + end + + assert_match "lib/foo.rb", @ui.output + assert_match "Unable to find gem 'bar'", @ui.output + + assert_empty @ui.error + end + def test_execute_multiple @cmd.options[:args] = %w[foo bar] @@ -140,10 +168,10 @@ lib/foo.rb @cmd.execute end - expected = %W[ - #{Gem::ConfigMap[:bindir]}/default_command - #{Gem::ConfigMap[:rubylibdir]}/default/gem.rb - #{Gem::ConfigMap[:archdir]}/default_gem.so + expected = [ + File.join(Gem::ConfigMap[:bindir], 'default_command'), + File.join(Gem::ConfigMap[:rubylibdir], 'default/gem.rb'), + File.join(Gem::ConfigMap[:archdir], 'default_gem.so') ].sort.join "\n" assert_equal expected, @ui.output.chomp diff --git a/test/rubygems/test_gem_commands_environment_command.rb b/test/rubygems/test_gem_commands_environment_command.rb index 439057df9d..253c459d94 100644 --- a/test/rubygems/test_gem_commands_environment_command.rb +++ b/test/rubygems/test_gem_commands_environment_command.rb @@ -11,6 +11,7 @@ class TestGemCommandsEnvironmentCommand < Gem::TestCase def test_execute orig_sources = Gem.sources.dup + orig_path, ENV['PATH'] = ENV['PATH'], %w[/usr/local/bin /usr/bin /bin].join(File::PATH_SEPARATOR) Gem.sources.replace %w[http://gems.example.com] Gem.configuration['gemcutter_key'] = 'blah' @@ -36,10 +37,17 @@ class TestGemCommandsEnvironmentCommand < Gem::TestCase assert_match %r|"gemcutter_key" => "\*\*\*\*"|, @ui.output assert_match %r|:verbose => |, @ui.output assert_match %r|REMOTE SOURCES:|, @ui.output - assert_equal '', @ui.error + + assert_match %r|- SHELL PATH:|, @ui.output + assert_match %r|- /usr/local/bin$|, @ui.output + assert_match %r|- /usr/bin$|, @ui.output + assert_match %r|- /bin$|, @ui.output + + assert_empty @ui.error ensure Gem.sources.replace orig_sources + ENV['PATH'] = orig_path end def test_execute_gemdir diff --git a/test/rubygems/test_gem_commands_fetch_command.rb b/test/rubygems/test_gem_commands_fetch_command.rb index 924f4c44e7..364881a132 100644 --- a/test/rubygems/test_gem_commands_fetch_command.rb +++ b/test/rubygems/test_gem_commands_fetch_command.rb @@ -34,6 +34,32 @@ class TestGemCommandsFetchCommand < Gem::TestCase 'gem repository directories must not be created' end + def test_execute_latest + util_setup_fake_fetcher + util_setup_spec_fetcher @a1, @a2 + + @fetcher.data["#{@gem_repo}gems/#{@a1.file_name}"] = + File.read(@a1.cache_file) + @fetcher.data["#{@gem_repo}gems/#{@a2.file_name}"] = + File.read(@a2.cache_file) + + refute_path_exists File.join(@tempdir, 'cache'), 'sanity check' + + @cmd.options[:args] = [@a2.name] + @cmd.options[:version] = req('>= 0.1') + + use_ui @ui do + Dir.chdir @tempdir do + @cmd.execute + end + end + + assert_path_exists(File.join(@tempdir, @a2.file_name), + "#{@a2.full_name} not fetched") + refute_path_exists File.join(@tempdir, 'cache'), + 'gem repository directories must not be created' + end + def test_execute_prerelease util_setup_fake_fetcher true util_clear_gems @@ -53,8 +79,8 @@ class TestGemCommandsFetchCommand < Gem::TestCase end end - assert_path_exists(File.join(@tempdir, @a2_pre.file_name), - "#{@a2_pre.full_name} not fetched") + assert_path_exists(File.join(@tempdir, @a2.file_name), + "#{@a2.full_name} not fetched") end def test_execute_specific_prerelease diff --git a/test/rubygems/test_gem_commands_help_command.rb b/test/rubygems/test_gem_commands_help_command.rb index a10e575a5a..3a6f2fa523 100644 --- a/test/rubygems/test_gem_commands_help_command.rb +++ b/test/rubygems/test_gem_commands_help_command.rb @@ -18,7 +18,7 @@ class TestGemCommandsHelpCommand < Gem::TestCase def test_gem_help_bad util_gem 'bad' do |out, err| assert_equal('', out) - assert_match(/Unknown command bad. Try gem help commands\n/, err) + assert_match "Unknown command bad", err end end @@ -36,9 +36,12 @@ class TestGemCommandsHelpCommand < Gem::TestCase mgr.command_names.each do |cmd| assert_match(/\s+#{cmd}\s+\S+/, out) end - assert_equal '', err - refute_match 'No command found for ', out + if defined?(OpenSSL::SSL) then + assert_empty err + + refute_match 'No command found for ', out + end end end diff --git a/test/rubygems/test_gem_commands_install_command.rb b/test/rubygems/test_gem_commands_install_command.rb index f86d2837ea..caf52f147d 100644 --- a/test/rubygems/test_gem_commands_install_command.rb +++ b/test/rubygems/test_gem_commands_install_command.rb @@ -6,6 +6,7 @@ class TestGemCommandsInstallCommand < Gem::TestCase def setup super + common_installer_setup @cmd = Gem::Commands::InstallCommand.new @cmd.options[:document] = [] @@ -168,8 +169,7 @@ class TestGemCommandsInstallCommand < Gem::TestCase # This is needed because we need to exercise the cache path # within SpecFetcher - path = File.join Gem.user_home, '.gem', 'specs', "not-there.nothing%80", - "latest_specs.4.8" + path = File.join Gem.spec_cache_dir, "not-there.nothing%80", "latest_specs.4.8" FileUtils.mkdir_p File.dirname(path) @@ -633,67 +633,6 @@ ERROR: Possible alternatives: non_existent_with_hint assert_equal x, e end - def test_execute_installs_dependencies - r, r_gem = util_gem 'r', '1', 'q' => '= 1' - q, q_gem = util_gem 'q', '1' - - util_setup_fake_fetcher - util_setup_spec_fetcher r, q - - Gem::Specification.reset - - @fetcher.data["#{@gem_repo}gems/#{q.file_name}"] = read_binary(q_gem) - @fetcher.data["#{@gem_repo}gems/#{r.file_name}"] = read_binary(r_gem) - - @cmd.options[:args] = ["r"] - - e = nil - use_ui @ui do - e = assert_raises Gem::SystemExitException do - capture_io do - @cmd.execute - end - end - end - - out = @ui.output.split "\n" - assert_equal "2 gems installed", out.shift - assert out.empty?, out.inspect - - assert_equal %w[q-1 r-1], @cmd.installed_specs.map { |spec| spec.full_name } - - assert_equal 0, e.exit_code - end - - def test_execute_satisfy_deps_of_local_from_sources - r, r_gem = util_gem 'r', '1', 'q' => '= 1' - q, q_gem = util_gem 'q', '1' - - util_setup_fake_fetcher - util_setup_spec_fetcher r, q - - Gem::Specification.reset - - @fetcher.data["#{@gem_repo}gems/#{q.file_name}"] = read_binary(q_gem) - - @cmd.options[:args] = [r_gem] - - use_ui @ui do - e = assert_raises Gem::SystemExitException do - capture_io do - @cmd.execute - end - end - assert_equal 0, e.exit_code - end - - assert_equal %w[q-1 r-1], @cmd.installed_specs.map { |spec| spec.full_name } - - out = @ui.output.split "\n" - assert_equal "2 gems installed", out.shift - assert out.empty?, out.inspect - end - def test_execute_uses_from_a_gemdeps util_setup_fake_fetcher util_setup_spec_fetcher @@ -951,4 +890,3 @@ ERROR: Possible alternatives: non_existent_with_hint end - diff --git a/test/rubygems/test_gem_commands_owner_command.rb b/test/rubygems/test_gem_commands_owner_command.rb index dfbc2572dc..5d7b66137e 100644 --- a/test/rubygems/test_gem_commands_owner_command.rb +++ b/test/rubygems/test_gem_commands_owner_command.rb @@ -6,6 +6,7 @@ class TestGemCommandsOwnerCommand < Gem::TestCase def setup super + ENV["RUBYGEMS_HOST"] = nil @fetcher = Gem::FakeFetcher.new Gem::RemoteFetcher.fetcher = @fetcher Gem.configuration.rubygems_api_key = "ed244fbf2b1a52e012da8616c512fa47f9aa5250" @@ -34,6 +35,36 @@ EOF assert_match %r{- user2@example.com}, @ui.output end + def test_show_owners_setting_up_host_through_env_var + response = "- email: user1@example.com\n" + host = "http://rubygems.example" + ENV["RUBYGEMS_HOST"] = host + + @fetcher.data["#{host}/api/v1/gems/freewill/owners.yaml"] = [response, 200, 'OK'] + + use_ui @ui do + @cmd.show_owners("freewill") + end + + assert_match %r{Owners for gem: freewill}, @ui.output + assert_match %r{- user1@example.com}, @ui.output + end + + def test_show_owners_setting_up_host + response = "- email: user1@example.com\n" + host = "http://rubygems.example" + @cmd.host = host + + @fetcher.data["#{host}/api/v1/gems/freewill/owners.yaml"] = [response, 200, 'OK'] + + use_ui @ui do + @cmd.show_owners("freewill") + end + + assert_match %r{Owners for gem: freewill}, @ui.output + assert_match %r{- user1@example.com}, @ui.output + end + def test_show_owners_denied response = "You don't have permission to push to this gem" @fetcher.data["#{Gem.host}/api/v1/gems/freewill/owners.yaml"] = [response, 403, 'Forbidden'] @@ -87,6 +118,24 @@ EOF assert_match response, @ui.output end + def test_add_owner_with_host_option_through_execute + host = "http://rubygems.example" + add_owner_response = "Owner added successfully." + show_owners_response = "- email: user1@example.com\n" + @fetcher.data["#{host}/api/v1/gems/freewill/owners"] = [add_owner_response, 200, 'OK'] + @fetcher.data["#{host}/api/v1/gems/freewill/owners.yaml"] = [show_owners_response, 200, 'OK'] + + @cmd.handle_options %W[--host #{host} --add user-new1@example.com freewill] + + use_ui @ui do + @cmd.execute + end + + assert_match add_owner_response, @ui.output + assert_match %r{Owners for gem: freewill}, @ui.output + assert_match %r{- user1@example.com}, @ui.output + end + def test_add_owners_key response = "Owner added successfully." @fetcher.data["#{Gem.host}/api/v1/gems/freewill/owners"] = [response, 200, 'OK'] diff --git a/test/rubygems/test_gem_commands_pristine_command.rb b/test/rubygems/test_gem_commands_pristine_command.rb index 778ce2ee1f..78c3f85a5b 100644 --- a/test/rubygems/test_gem_commands_pristine_command.rb +++ b/test/rubygems/test_gem_commands_pristine_command.rb @@ -80,6 +80,36 @@ class TestGemCommandsPristineCommand < Gem::TestCase assert_empty out, out.inspect end + def test_execute_env_shebang + a = quick_spec 'a' do |s| + s.executables = %w[foo] + s.files = %w[bin/foo] + end + write_file File.join(@tempdir, 'bin', 'foo') do |fp| + fp.puts "#!/usr/bin/ruby" + end + + install_gem a + + gem_exec = File.join @gemhome, 'bin', 'foo' + + FileUtils.rm gem_exec + + @cmd.handle_options %w[--all --env-shebang] + + use_ui @ui do + @cmd.execute + end + + assert_path_exists gem_exec + + if win_platform? + assert_match %r%\A#!\s*ruby%, File.read(gem_exec) + else + assert_match %r%\A#!\s*/usr/bin/env ruby%, File.read(gem_exec) + end + end + def test_execute_no_extension a = quick_spec 'a' do |s| s.extensions << 'ext/a/extconf.rb' end diff --git a/test/rubygems/test_gem_commands_sources_command.rb b/test/rubygems/test_gem_commands_sources_command.rb index 8dc2f91ed4..1e5afca009 100644 --- a/test/rubygems/test_gem_commands_sources_command.rb +++ b/test/rubygems/test_gem_commands_sources_command.rb @@ -194,7 +194,7 @@ beta-gems.example.com is not a URI assert_equal expected, @ui.output assert_equal '', @ui.error - dir = File.join Gem.user_home, '.gem', 'specs' + dir = Gem.spec_cache_dir refute File.exist?(dir), 'cache dir removed' end diff --git a/test/rubygems/test_gem_commands_uninstall_command.rb b/test/rubygems/test_gem_commands_uninstall_command.rb index 844c7b4b97..9ba1371b79 100644 --- a/test/rubygems/test_gem_commands_uninstall_command.rb +++ b/test/rubygems/test_gem_commands_uninstall_command.rb @@ -16,6 +16,20 @@ class TestGemCommandsUninstallCommand < Gem::InstallerTestCase @executable = File.join(@gemhome, 'bin', 'executable') end + def test_execute_all_gem_names + @cmd.options[:args] = %w[a b] + @cmd.options[:all] = true + + assert_raises Gem::MockGemUi::TermError do + use_ui @ui do + @cmd.execute + end + end + + assert_match(/\A(?:WARNING: Unable to use symlinks on Windows, installing wrapper\n)?ERROR: Gem names and --all may not be used together\n\z/, + @ui.error) + end + def test_execute_dependency_order c = quick_gem 'c' do |spec| spec.add_dependency 'a' @@ -43,6 +57,7 @@ class TestGemCommandsUninstallCommand < Gem::InstallerTestCase def test_execute_removes_executable ui = Gem::MockGemUi.new + util_setup_gem ui build_rake_in do @@ -175,5 +190,32 @@ class TestGemCommandsUninstallCommand < Gem::InstallerTestCase assert Gem::Specification.find_all_by_name('x').length == 0 end + def test_execute_all + util_make_gems + + default = new_default_spec 'default', '1' + install_default_gems default + + gemhome2 = "#{@gemhome}2" + + a_4 = quick_spec 'a', 4 + install_gem a_4, :install_dir => gemhome2 + + Gem::Specification.dirs = [@gemhome, gemhome2] + + assert_includes Gem::Specification.all_names, 'a-1' + assert_includes Gem::Specification.all_names, 'a-4' + assert_includes Gem::Specification.all_names, 'default-1' + + @cmd.options[:all] = true + @cmd.options[:args] = [] + + use_ui @ui do + @cmd.execute + end + + assert_equal %w[a-4 default-1], Gem::Specification.all_names.sort + end + end diff --git a/test/rubygems/test_gem_commands_update_command.rb b/test/rubygems/test_gem_commands_update_command.rb index 006d821210..d1c1b20c6e 100644 --- a/test/rubygems/test_gem_commands_update_command.rb +++ b/test/rubygems/test_gem_commands_update_command.rb @@ -11,6 +11,7 @@ class TestGemCommandsUpdateCommand < Gem::TestCase def setup super + common_installer_setup @cmd = Gem::Commands::UpdateCommand.new @@ -253,7 +254,7 @@ class TestGemCommandsUpdateCommand < Gem::TestCase out = @ui.output.split "\n" assert_equal "Updating installed gems", out.shift assert_equal "Updating #{@a2.name}", out.shift - assert_equal "Gems updated: #{@c2.name} #{@b2.name} #{@a2.name}", + assert_equal "Gems updated: #{@a2.name} #{@b2.name} #{@c2.name}", out.shift assert_empty out diff --git a/test/rubygems/test_gem_config_file.rb b/test/rubygems/test_gem_config_file.rb index 13f1c34b50..e9cd33579d 100644 --- a/test/rubygems/test_gem_config_file.rb +++ b/test/rubygems/test_gem_config_file.rb @@ -201,6 +201,10 @@ ERROR: Your gem push credentials file located at: has file permissions of 0644 but 0600 is required. +To fix this error run: + +\tchmod 0600 #{@cfg.credentials_path} + You should reset your credentials at: \thttps://rubygems.org/profile/edit @@ -428,6 +432,14 @@ if you believe they were disclosed to a third party. assert_equal('/home/me/certs', @cfg.ssl_ca_cert) end + def test_load_ssl_client_cert_from_config + File.open @temp_conf, 'w' do |fp| + fp.puts ":ssl_client_cert: /home/me/mine.pem" + end + util_config_file + assert_equal('/home/me/mine.pem', @cfg.ssl_client_cert) + end + def util_config_file(args = @cfg_args) @cfg = Gem::ConfigFile.new args end diff --git a/test/rubygems/test_gem_dependency_installer.rb b/test/rubygems/test_gem_dependency_installer.rb index 2b95597d4b..af6b922fe3 100644 --- a/test/rubygems/test_gem_dependency_installer.rb +++ b/test/rubygems/test_gem_dependency_installer.rb @@ -6,6 +6,7 @@ class TestGemDependencyInstaller < Gem::TestCase def setup super + common_installer_setup @gems_dir = File.join @tempdir, 'gems' @cache_dir = File.join @gemhome, 'cache' @@ -172,7 +173,8 @@ class TestGemDependencyInstaller < Gem::TestCase FileUtils.mv @a1_gem, @tempdir FileUtils.mv @b1_gem, @tempdir - FileUtils.mv e1_gem, @tempdir + FileUtils.mv e1_gem, @tempdir + inst = nil Dir.chdir @tempdir do @@ -180,40 +182,15 @@ class TestGemDependencyInstaller < Gem::TestCase inst.install 'b' end - Dir.chdir @tempdir do - inst = Gem::DependencyInstaller.new - inst.install 'e' - end - - assert_equal %w[e-1 a-1], inst.installed_gems.map { |s| s.full_name } - end - - def test_install_ignore_satified_deps - util_setup_gems - - _, e1_gem = util_gem 'e', '1' do |s| - s.add_dependency 'b' - end - - util_clear_gems - - FileUtils.mv @a1_gem, @tempdir - FileUtils.mv @b1_gem, @tempdir - FileUtils.mv e1_gem, @tempdir - - Dir.chdir @tempdir do - i = Gem::DependencyInstaller.new :ignore_dependencies => true - i.install 'b' - end - - inst = nil + assert_equal %w[b-1], inst.installed_gems.map { |s| s.full_name }, + 'sanity check' Dir.chdir @tempdir do - inst = Gem::DependencyInstaller.new :minimal_deps => true + inst = Gem::DependencyInstaller.new inst.install 'e' end - assert_equal %w[e-1], inst.installed_gems.map { |s| s.full_name } + assert_equal %w[a-1 e-1], inst.installed_gems.map { |s| s.full_name } end def test_install_cache_dir @@ -246,15 +223,18 @@ class TestGemDependencyInstaller < Gem::TestCase Gem::Specification.reset FileUtils.mv @a1_gem, @tempdir - FileUtils.mv a2_gem, @tempdir # not in index + FileUtils.mv a2_gem, @tempdir # not in index FileUtils.mv @b1_gem, @tempdir inst = nil Dir.chdir @tempdir do inst = Gem::DependencyInstaller.new - inst.install 'a', Gem::Requirement.create("= 2") + inst.install 'a', req("= 2") end + assert_equal %w[a-2], inst.installed_gems.map { |s| s.full_name }, + 'sanity check' + FileUtils.rm File.join(@tempdir, a2.file_name) Dir.chdir @tempdir do @@ -282,19 +262,18 @@ class TestGemDependencyInstaller < Gem::TestCase Gem::Specification.reset FileUtils.mv @a1_gem, @tempdir - FileUtils.mv a2_gem, @tempdir # not in index + FileUtils.mv a2_gem, @tempdir # not in index FileUtils.mv @b1_gem, @tempdir - FileUtils.mv a3_gem, @tempdir - - inst = nil + FileUtils.mv a3_gem, @tempdir Dir.chdir @tempdir do - inst = Gem::DependencyInstaller.new - inst.install 'a', Gem::Requirement.create("= 2") + Gem::DependencyInstaller.new.install 'a', req("= 2") end FileUtils.rm File.join(@tempdir, a2.file_name) + inst = nil + Dir.chdir @tempdir do inst = Gem::DependencyInstaller.new inst.install 'b' @@ -488,6 +467,42 @@ class TestGemDependencyInstaller < Gem::TestCase assert_equal %w[a-1], inst.installed_gems.map { |s| s.full_name } end + def test_install_minimal_deps + util_setup_gems + + _, e1_gem = util_gem 'e', '1' do |s| + s.add_dependency 'b' + end + + _, b2_gem = util_gem 'b', '2' do |s| + s.add_dependency 'a' + end + + util_clear_gems + + FileUtils.mv @a1_gem, @tempdir + FileUtils.mv @b1_gem, @tempdir + FileUtils.mv b2_gem, @tempdir + FileUtils.mv e1_gem, @tempdir + + inst = nil + + Dir.chdir @tempdir do + inst = Gem::DependencyInstaller.new :ignore_dependencies => true + inst.install 'b', req('= 1') + end + + assert_equal %w[b-1], inst.installed_gems.map { |s| s.full_name }, + 'sanity check' + + Dir.chdir @tempdir do + inst = Gem::DependencyInstaller.new :minimal_deps => true + inst.install 'e' + end + + assert_equal %w[a-1 e-1], inst.installed_gems.map { |s| s.full_name } + end + def test_install_env_shebang util_setup_gems @@ -627,12 +642,12 @@ class TestGemDependencyInstaller < Gem::TestCase inst = nil Dir.chdir @tempdir do - e = assert_raises Gem::DependencyError do + e = assert_raises Gem::UnsatisfiableDependencyError do inst = Gem::DependencyInstaller.new :domain => :local inst.install 'b' end - expected = "Unable to resolve dependencies: b requires a (>= 0)" + expected = "Unable to resolve dependency: b (= 1) requires a (>= 0)" assert_equal expected, e.message end @@ -910,12 +925,13 @@ class TestGemDependencyInstaller < Gem::TestCase gems = set.sorted assert_equal 2, gems.length - local = gems.first + + remote, local = gems + assert_equal 'a-1', local.spec.full_name, 'local spec' assert_equal File.join(@tempdir, @a1.file_name), local.source.download(local.spec), 'local path' - remote = gems.last assert_equal 'a-1', remote.spec.full_name, 'remote spec' assert_equal Gem::Source.new(@gem_repo), remote.source, 'remote path' diff --git a/test/rubygems/test_gem_dependency_resolver.rb b/test/rubygems/test_gem_dependency_resolver.rb index 08d8e62f2b..47eef8cc55 100644 --- a/test/rubygems/test_gem_dependency_resolver.rb +++ b/test/rubygems/test_gem_dependency_resolver.rb @@ -15,7 +15,9 @@ class TestGemDependencyResolver < Gem::TestCase exp = expected.sort_by { |s| s.full_name } act = actual.map { |a| a.spec }.sort_by { |s| s.full_name } - assert_equal exp, act + msg = "Set of gems was not the same: #{exp.map { |x| x.full_name}.inspect} != #{act.map { |x| x.full_name}.inspect}" + + assert_equal exp, act, msg end def test_no_overlap_specificly @@ -64,6 +66,32 @@ class TestGemDependencyResolver < Gem::TestCase assert_set [a2], res.resolve end + def test_picks_best_platform + is = Gem::DependencyResolver::IndexSpecification + unknown = Gem::Platform.new 'unknown' + a2_p1 = quick_spec 'a', 2 do |s| s.platform = Gem::Platform.local end + a3_p2 = quick_spec 'a', 3 do |s| s.platform = unknown end + v2 = v(2) + v3 = v(3) + source = Gem::Source.new @gem_repo + + s = set + + a2 = is.new s, 'a', v2, source, Gem::Platform::RUBY + a2_p1 = is.new s, 'a', v2, source, Gem::Platform.local.to_s + a3_p2 = is.new s, 'a', v3, source, unknown + + s.add a3_p2 + s.add a2_p1 + s.add a2 + + ad = make_dep "a" + + res = Gem::DependencyResolver.new([ad], s) + + assert_set [a2_p1], res.resolve + end + def test_only_returns_spec_once a1 = util_spec "a", "1", "c" => "= 1" b1 = util_spec "b", "1", "c" => "= 1" @@ -177,7 +205,8 @@ class TestGemDependencyResolver < Gem::TestCase r.resolve end - assert_equal "unable to find any gem matching dependency 'a (>= 0)'", e.message + assert_equal "Unable to resolve dependency: (unknown) requires a (>= 0)", + e.message assert_equal "a (>= 0)", e.dependency.to_s end @@ -215,7 +244,7 @@ class TestGemDependencyResolver < Gem::TestCase r.resolve end - assert_equal "detected 1 conflict with dependency 'c (>= 2)'", e.message + assert_match "a-1 requires c (>= 2) but it conflicted", e.message assert_equal "c (>= 2)", e.dependency.to_s @@ -324,4 +353,18 @@ class TestGemDependencyResolver < Gem::TestCase assert_set [b1, c1, d2], r.resolve end + + def test_select_local_platforms + r = Gem::DependencyResolver.new nil, nil + + a1 = quick_spec 'a', 1 + a1_p1 = quick_spec 'a', 1 do |s| s.platform = Gem::Platform.local end + a1_p2 = quick_spec 'a', 1 do |s| s.platform = 'unknown' end + + selected = r.select_local_platforms [a1, a1_p1, a1_p2] + + assert_equal [a1, a1_p1], selected + end + end + diff --git a/test/rubygems/test_gem_ext_builder.rb b/test/rubygems/test_gem_ext_builder.rb index 6e34ee7e46..8383040f88 100644 --- a/test/rubygems/test_gem_ext_builder.rb +++ b/test/rubygems/test_gem_ext_builder.rb @@ -1,5 +1,6 @@ require 'rubygems/test_case' require 'rubygems/ext' +require 'rubygems/installer' class TestGemExtBuilder < Gem::TestCase @@ -13,6 +14,10 @@ class TestGemExtBuilder < Gem::TestCase FileUtils.mkdir_p @dest_path @orig_DESTDIR = ENV['DESTDIR'] + + @spec = quick_spec 'a' + + @builder = Gem::Ext::Builder.new @spec, '' end def teardown @@ -56,5 +61,93 @@ install: end end + def test_build_extensions_none + use_ui @ui do + @builder.build_extensions + end + + assert_equal '', @ui.output + assert_equal '', @ui.error + + refute File.exist?('gem_make.out') + end + + def test_build_extensions_extconf_bad + @spec.extensions << 'extconf.rb' + + e = assert_raises Gem::Installer::ExtensionBuildError do + use_ui @ui do + @builder.build_extensions + end + end + + assert_match(/\AERROR: Failed to build gem native extension.$/, e.message) + + assert_equal "Building native extensions. This could take a while...\n", + @ui.output + assert_equal '', @ui.error + + gem_make_out = File.join @gemhome, 'gems', @spec.full_name, 'gem_make.out' + + 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) + end + + def test_build_extensions_unsupported + FileUtils.mkdir_p @spec.gem_dir + gem_make_out = File.join @spec.gem_dir, 'gem_make.out' + @spec.extensions << nil + + e = assert_raises Gem::Installer::ExtensionBuildError do + use_ui @ui do + @builder.build_extensions + end + end + + assert_match(/^\s*No builder for extension ''$/, e.message) + + assert_equal "Building native extensions. This could take a while...\n", + @ui.output + assert_equal '', @ui.error + + assert_equal "No builder for extension ''\n", File.read(gem_make_out) + ensure + FileUtils.rm_f gem_make_out + end + + def test_build_extensions_with_build_args + args = ["--aa", "--bb"] + @builder.build_args = args + @spec.extensions << 'extconf.rb' + + FileUtils.mkdir_p @spec.gem_dir + + open File.join(@spec.gem_dir, "extconf.rb"), "w" do |f| + f.write <<-'RUBY' + puts "IN EXTCONF" + extconf_args = File.join File.dirname(__FILE__), 'extconf_args' + File.open extconf_args, 'w' do |f| + f.puts ARGV.inspect + end + + File.open 'Makefile', 'w' do |f| + f.puts "default:\n\techo built" + f.puts "install:\n\techo installed" + end + RUBY + end + + use_ui @ui do + @builder.build_extensions + end + + path = File.join @spec.gem_dir, "extconf_args" + + assert_equal args.inspect, File.read(path).strip + assert File.directory? File.join(@spec.gem_dir, 'lib') + 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 33398ac6f3..dfbf3fe1b9 100644 --- a/test/rubygems/test_gem_ext_ext_conf_builder.rb +++ b/test/rubygems/test_gem_ext_ext_conf_builder.rb @@ -120,8 +120,13 @@ checking for main\(\) in .*?nonexistent/m, error.message) extconf.puts <<-'EXTCONF' include RbConfig -ruby_exe = "#{CONFIG['RUBY_INSTALL_NAME']}#{CONFIG['EXEEXT']}" -ruby = File.join CONFIG['bindir'], ruby_exe +ruby = + if ENV['RUBY'] then + ENV['RUBY'] + else + ruby_exe = "#{CONFIG['RUBY_INSTALL_NAME']}#{CONFIG['EXEEXT']}" + File.join CONFIG['bindir'], ruby_exe + end open 'Makefile', 'w' do |io| io.write <<-Makefile diff --git a/test/rubygems/test_gem_gem_runner.rb b/test/rubygems/test_gem_gem_runner.rb index 6680a784c9..85ff725345 100644 --- a/test/rubygems/test_gem_gem_runner.rb +++ b/test/rubygems/test_gem_gem_runner.rb @@ -7,6 +7,7 @@ class TestGemGemRunner < Gem::TestCase super @orig_args = Gem::Command.build_args + @runner = Gem::GemRunner.new end def teardown @@ -41,23 +42,26 @@ class TestGemGemRunner < Gem::TestCase assert_equal %w[--commands], Gem::Command.extra_args end - def test_build_args_are_handled - Gem.clear_paths - - cls = Class.new(Gem::Command) do - def execute - end - end + def test_extract_build_args + args = %w[] + assert_equal [], @runner.extract_build_args(args) + assert_equal %w[], args - test_obj = cls.new :ba_test + args = %w[foo] + assert_equal [], @runner.extract_build_args(args) + assert_equal %w[foo], args - cmds = Gem::CommandManager.new - cmds.register_command :ba_test, test_obj + args = %w[--foo] + assert_equal [], @runner.extract_build_args(args) + assert_equal %w[--foo], args - runner = Gem::GemRunner.new :command_manager => cmds - runner.run(%W[ba_test -- --build_arg1 --build_arg2]) + args = %w[--foo --] + assert_equal [], @runner.extract_build_args(args) + assert_equal %w[--foo], args - assert_equal %w[--build_arg1 --build_arg2], test_obj.options[:build_args] + args = %w[--foo -- --bar] + assert_equal %w[--bar], @runner.extract_build_args(args) + assert_equal %w[--foo], args end end diff --git a/test/rubygems/test_gem_gemcutter_utilities.rb b/test/rubygems/test_gem_gemcutter_utilities.rb index 18b4518b06..d70ac35beb 100644 --- a/test/rubygems/test_gem_gemcutter_utilities.rb +++ b/test/rubygems/test_gem_gemcutter_utilities.rb @@ -101,7 +101,7 @@ class TestGemGemcutterUtilities < Gem::TestCase def test_sign_in_with_host api_key = 'a5fdbb6ba150cbb83aad2bb2fede64cf040453903' - util_sign_in [api_key, 200, 'OK'], 'http://example.com', :param + util_sign_in [api_key, 200, 'OK'], 'http://example.com', ['http://example.com'] assert_match "Enter your http://example.com credentials.", @sign_in_ui.output @@ -112,6 +112,20 @@ class TestGemGemcutterUtilities < Gem::TestCase assert_equal api_key, credentials[:rubygems_api_key] end + def test_sign_in_with_host_nil + api_key = 'a5fdbb6ba150cbb83aad2bb2fede64cf040453903' + + util_sign_in [api_key, 200, 'OK'], nil, [nil] + + assert_match "Enter your RubyGems.org credentials.", + @sign_in_ui.output + assert @fetcher.last_request["authorization"] + assert_match %r{Signed in.}, @sign_in_ui.output + + credentials = YAML.load_file Gem.configuration.credentials_path + assert_equal api_key, credentials[:rubygems_api_key] + end + def test_sign_in_with_host_ENV api_key = 'a5fdbb6ba150cbb83aad2bb2fede64cf040453903' util_sign_in [api_key, 200, 'OK'], 'http://example.com' @@ -163,14 +177,14 @@ class TestGemGemcutterUtilities < Gem::TestCase assert_match %r{Access Denied.}, @sign_in_ui.output end - def util_sign_in response, host = nil, style = :ENV + def util_sign_in response, host = nil, args = [] skip 'Always uses $stdin on windows' if Gem.win_platform? email = 'you@example.com' password = 'secret' if host - ENV['RUBYGEMS_HOST'] = host if style == :ENV + ENV['RUBYGEMS_HOST'] = host else host = Gem.host end @@ -182,8 +196,8 @@ class TestGemGemcutterUtilities < Gem::TestCase @sign_in_ui = Gem::MockGemUi.new "#{email}\n#{password}\n" use_ui @sign_in_ui do - if style == :param then - @cmd.sign_in host + if args.length > 0 then + @cmd.sign_in(*args) else @cmd.sign_in end @@ -209,4 +223,3 @@ class TestGemGemcutterUtilities < Gem::TestCase end end - diff --git a/test/rubygems/test_gem_install_update_options.rb b/test/rubygems/test_gem_install_update_options.rb index 18d3569417..3f63896999 100644 --- a/test/rubygems/test_gem_install_update_options.rb +++ b/test/rubygems/test_gem_install_update_options.rb @@ -22,12 +22,13 @@ class TestGemInstallUpdateOptions < Gem::InstallerTestCase --rdoc --ri -E - -P HighSecurity -f -i /install_to -w ] + args.concat %w[-P HighSecurity] if defined?(OpenSSL::SSL) + assert @cmd.handles?(args) end @@ -100,6 +101,8 @@ class TestGemInstallUpdateOptions < Gem::InstallerTestCase end def test_security_policy + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + @cmd.handle_options %w[-P HighSecurity] assert_equal Gem::Security::HighSecurity, @cmd.options[:security_policy] diff --git a/test/rubygems/test_gem_installer.rb b/test/rubygems/test_gem_installer.rb index e513fe6da3..01b151c089 100644 --- a/test/rubygems/test_gem_installer.rb +++ b/test/rubygems/test_gem_installer.rb @@ -4,6 +4,7 @@ class TestGemInstaller < Gem::InstallerTestCase def setup super + common_installer_setup if __name__ =~ /^test_install(_|$)/ then FileUtils.rm_r @spec.gem_dir @@ -14,6 +15,8 @@ class TestGemInstaller < Gem::InstallerTestCase end def teardown + common_installer_teardown + super Gem.configuration = @config @@ -52,95 +55,6 @@ load Gem.bin_path('a', 'executable', version) assert_equal expected, wrapper end - def test_build_extensions_none - use_ui @ui do - @installer.build_extensions - end - - assert_equal '', @ui.output - assert_equal '', @ui.error - - refute File.exist?('gem_make.out') - end - - def test_build_extensions_extconf_bad - @installer.spec = @spec - @spec.extensions << 'extconf.rb' - - e = assert_raises Gem::Installer::ExtensionBuildError do - use_ui @ui do - @installer.build_extensions - end - end - - assert_match(/\AERROR: Failed to build gem native extension.$/, e.message) - - assert_equal "Building native extensions. This could take a while...\n", - @ui.output - assert_equal '', @ui.error - - gem_make_out = File.join @gemhome, 'gems', @spec.full_name, 'gem_make.out' - - 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) - end - - def test_build_extensions_unsupported - @installer.spec = @spec - FileUtils.mkdir_p @spec.gem_dir - gem_make_out = File.join @spec.gem_dir, 'gem_make.out' - @spec.extensions << nil - - e = assert_raises Gem::Installer::ExtensionBuildError do - use_ui @ui do - @installer.build_extensions - end - end - - assert_match(/^\s*No builder for extension ''$/, e.message) - - assert_equal "Building native extensions. This could take a while...\n", - @ui.output - assert_equal '', @ui.error - - assert_equal "No builder for extension ''\n", File.read(gem_make_out) - ensure - FileUtils.rm_f gem_make_out - end - - def test_build_extensions_with_build_args - args = ["--aa", "--bb"] - @installer.build_args = args - @installer.spec = @spec - @spec.extensions << 'extconf.rb' - - File.open File.join(@spec.gem_dir, "extconf.rb"), "w" do |f| - f.write <<-'RUBY' - puts "IN EXTCONF" - extconf_args = File.join File.dirname(__FILE__), 'extconf_args' - File.open extconf_args, 'w' do |f| - f.puts ARGV.inspect - end - - File.open 'Makefile', 'w' do |f| - f.puts "default:\n\techo built" - f.puts "install:\n\techo installed" - end - RUBY - end - - use_ui @ui do - @installer.build_extensions - end - - path = File.join @spec.gem_dir, "extconf_args" - - assert_equal args.inspect, File.read(path).strip - assert File.directory? File.join(@spec.gem_dir, 'lib') - end - def test_check_executable_overwrite @installer.generate_bin @@ -159,7 +73,7 @@ load Gem.bin_path('a', 'executable', version) @installer.generate_bin installed_exec = File.join util_inst_bindir, 'executable' - assert File.exist? installed_exec + assert_path_exists installed_exec wrapper = File.read installed_exec assert_match %r|generated by RubyGems|, wrapper @@ -222,7 +136,7 @@ gem 'other', version @installer.generate_bin # should not raise installed_exec = File.join util_inst_bindir, 'foo-executable-bar' - assert File.exist? installed_exec + assert_path_exists installed_exec wrapper = File.read installed_exec assert_match %r|generated by RubyGems|, wrapper @@ -251,7 +165,7 @@ gem 'other', version @installer.generate_bin installed_exec = File.join util_inst_bindir, 'executable' - assert File.exist? installed_exec + assert_path_exists installed_exec wrapper = File.read installed_exec assert_match %r|generated by RubyGems|, wrapper @@ -264,7 +178,7 @@ gem 'other', version @installer.generate_bin installed_exec = File.join util_inst_bindir, 'executable' - assert File.exist? installed_exec + assert_path_exists installed_exec wrapper = File.read installed_exec assert_match %r|generated by RubyGems|, wrapper @@ -300,6 +214,8 @@ gem 'other', version end def test_ensure_loadable_spec_security_policy + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + _, a_gem = util_gem 'a', 2 do |s| s.add_dependency 'garbage ~> 5' end @@ -336,7 +252,7 @@ gem 'other', version assert_equal true, File.directory?(util_inst_bindir) installed_exec = File.join(util_inst_bindir, 'executable') - assert_equal true, File.exist?(installed_exec) + assert_path_exists installed_exec assert_equal mask, File.stat(installed_exec).mode unless win_platform? wrapper = File.read installed_exec @@ -371,7 +287,7 @@ gem 'other', version @installer.generate_bin assert File.directory? util_inst_bindir installed_exec = File.join util_inst_bindir, 'executable' - assert File.exist? installed_exec + assert_path_exists installed_exec assert_equal mask, File.stat(installed_exec).mode unless win_platform? wrapper = File.read installed_exec @@ -388,7 +304,7 @@ gem 'other', version @installer.generate_bin assert_equal true, File.directory?(util_inst_bindir) installed_exec = File.join util_inst_bindir, 'foo-executable-bar' - assert_equal true, File.exist?(installed_exec) + assert_path_exists installed_exec ensure Gem::Installer.exec_format = nil end @@ -402,7 +318,7 @@ gem 'other', version @installer.generate_bin assert_equal true, File.directory?(util_inst_bindir) installed_exec = File.join util_inst_bindir, 'executable' - assert_equal true, File.exist?(installed_exec) + assert_path_exists installed_exec ensure Gem::Installer.exec_format = nil end @@ -424,7 +340,7 @@ gem 'other', version @installer.generate_bin installed_exec = File.join("#{@gemhome}2", "bin", 'executable') - assert File.exist? installed_exec + assert_path_exists installed_exec assert_equal mask, File.stat(installed_exec).mode unless win_platform? wrapper = File.read installed_exec @@ -437,7 +353,7 @@ gem 'other', version @installer.wrappers = true @installer.generate_bin - refute File.exist?(util_inst_bindir), 'bin dir was created when not needed' + refute_path_exists util_inst_bindir, 'bin dir was created when not needed' end def test_generate_bin_script_no_perms @@ -473,7 +389,7 @@ gem 'other', version @installer.generate_bin installed_exec = File.join @gemhome, 'bin', 'executable' - assert_equal true, File.exist?(installed_exec) + assert_path_exists installed_exec assert_equal mask, File.stat(installed_exec).mode unless win_platform? wrapper = File.read installed_exec @@ -498,7 +414,7 @@ gem 'other', version @installer.generate_bin assert_equal true, File.directory?(util_inst_bindir) - assert_equal true, File.exist?(installed_exec) + assert_path_exists installed_exec assert_equal mask, File.stat(installed_exec).mode unless win_platform? assert_match %r|generated by RubyGems|, File.read(installed_exec) @@ -528,7 +444,7 @@ gem 'other', version @installer.wrappers = false @installer.generate_bin - refute File.exist?(util_inst_bindir) + refute_path_exists util_inst_bindir end def test_generate_bin_symlink_no_perms @@ -627,7 +543,7 @@ gem 'other', version @installer.generate_bin installed_exec = File.join util_inst_bindir, 'executable' - assert File.exist? installed_exec + assert_path_exists installed_exec @spec = Gem::Specification.new do |s| s.files = ['lib/code.rb'] @@ -664,7 +580,7 @@ gem 'other', version assert_equal true, File.directory?(util_inst_bindir) installed_exec = File.join(util_inst_bindir, 'executable') - assert_equal true, File.exist?(installed_exec) + assert_path_exists installed_exec assert_match(/Unable to use symlinks on Windows, installing wrapper/i, @ui.error) @@ -731,19 +647,19 @@ gem 'other', version rakefile = File.join gemdir, 'ext', 'a', 'Rakefile' Gem.pre_install do |installer| - refute File.exist?(cache_file), 'cache file must not exist yet' + refute_path_exists cache_file, 'cache file must not exist yet' true end Gem.post_build do |installer| - assert File.exist?(gemdir), 'gem install dir must exist' - assert File.exist?(rakefile), 'gem executable must exist' - refute File.exist?(stub_exe), 'gem executable must not exist' + assert_path_exists gemdir, 'gem install dir must exist' + assert_path_exists rakefile, 'gem executable must exist' + refute_path_exists stub_exe, 'gem executable must not exist' true end Gem.post_install do |installer| - assert File.exist?(cache_file), 'cache file must exist' + assert_path_exists cache_file, 'cache file must exist' end @newspec = nil @@ -754,23 +670,23 @@ gem 'other', version end assert_equal @spec, @newspec - assert File.exist? gemdir - assert File.exist?(stub_exe), 'gem executable must exist' + assert_path_exists gemdir + assert_path_exists stub_exe, 'gem executable must exist' exe = File.join gemdir, 'bin', 'executable' - assert File.exist? exe + assert_path_exists exe exe_mode = File.stat(exe).mode & 0111 assert_equal 0111, exe_mode, "0%o" % exe_mode unless win_platform? - assert File.exist?(File.join(gemdir, 'lib', 'code.rb')) + assert_path_exists File.join gemdir, 'lib', 'code.rb' - assert File.exist? rakefile + assert_path_exists rakefile spec_file = File.join(@gemhome, 'specifications', @spec.spec_name) assert_equal spec_file, @newspec.loaded_from - assert File.exist?(spec_file) + assert_path_exists spec_file assert_same @installer, @post_build_hook_arg assert_same @installer, @post_install_hook_arg @@ -879,7 +795,7 @@ gem 'other', version end gemdir = File.join(@gemhome, 'gems', @spec.full_name) - assert File.exist?(File.join(gemdir, 'lib', 'code.rb')) + assert_path_exists File.join gemdir, 'lib', 'code.rb' util_setup_gem # Morph spec to have lib/other.rb instead of code.rb and recreate @@ -898,9 +814,9 @@ gem 'other', version end end - assert File.exist?(File.join(gemdir, 'lib', 'other.rb')) - refute(File.exist?(File.join(gemdir, 'lib', 'code.rb')), - "code.rb from prior install of same gem shouldn't remain here") + assert_path_exists File.join gemdir, 'lib', 'other.rb' + refute_path_exists File.join gemdir, 'lib', 'code.rb', + "code.rb from prior install of same gem shouldn't remain here" end def test_install_force @@ -910,7 +826,7 @@ gem 'other', version end gem_dir = File.join(@gemhome, 'gems', 'old_ruby_required-1') - assert File.exist?(gem_dir) + assert_path_exists gem_dir end def test_install_missing_dirs @@ -926,8 +842,8 @@ gem 'other', version File.directory? File.join(Gem.dir, 'docs') File.directory? File.join(Gem.dir, 'specifications') - assert File.exist?(File.join(@gemhome, 'cache', @spec.file_name)) - assert File.exist?(File.join(@gemhome, 'specifications', @spec.spec_name)) + assert_path_exists File.join @gemhome, 'cache', @spec.file_name + assert_path_exists File.join @gemhome, 'specifications', @spec.spec_name end def test_install_post_build_false @@ -948,10 +864,10 @@ gem 'other', version end spec_file = File.join @gemhome, 'specifications', @spec.spec_name - refute File.exist? spec_file + refute_path_exists spec_file gem_dir = File.join @gemhome, 'gems', @spec.full_name - refute File.exist? gem_dir + refute_path_exists gem_dir end def test_install_post_build_nil @@ -966,10 +882,10 @@ gem 'other', version end spec_file = File.join @gemhome, 'specifications', @spec.spec_name - assert File.exist? spec_file + assert_path_exists spec_file gem_dir = File.join @gemhome, 'gems', @spec.full_name - assert File.exist? gem_dir + assert_path_exists gem_dir end def test_install_pre_install_false @@ -990,7 +906,7 @@ gem 'other', version end spec_file = File.join @gemhome, 'specifications', @spec.spec_name - refute File.exist? spec_file + refute_path_exists spec_file end def test_install_pre_install_nil @@ -1005,7 +921,7 @@ gem 'other', version end spec_file = File.join @gemhome, 'specifications', @spec.spec_name - assert File.exist? spec_file + assert_path_exists spec_file end def test_install_with_message @@ -1021,6 +937,31 @@ gem 'other', version assert_match %r|I am a shiny gem!|, @ui.output end + def test_install_extension_install_dir + gemhome2 = "#{@gemhome}2" + + @spec.extensions << "extconf.rb" + write_file File.join(@tempdir, "extconf.rb") do |io| + io.write <<-RUBY + require "mkmf" + create_makefile("#{@spec.name}") + RUBY + end + + @spec.files += %w[extconf.rb] + + use_ui @ui do + path = Gem::Package.build @spec + + installer = Gem::Installer.new path, :install_dir => gemhome2 + installer.install + end + + expected_makefile = File.join gemhome2, 'gems', @spec.full_name, 'Makefile' + + assert_path_exists expected_makefile + end + def test_install_extension_and_script @spec.extensions << "extconf.rb" write_file File.join(@tempdir, "extconf.rb") do |io| @@ -1047,16 +988,16 @@ gem 'other', version RUBY end - assert !File.exist?(File.join(@spec.gem_dir, rb)) - assert !File.exist?(File.join(@spec.gem_dir, rb2)) + refute_path_exists File.join @spec.gem_dir, rb + refute_path_exists File.join @spec.gem_dir, rb2 use_ui @ui do path = Gem::Package.build @spec @installer = Gem::Installer.new path @installer.install end - assert File.exist?(File.join(@spec.gem_dir, rb)) - assert File.exist?(File.join(@spec.gem_dir, rb2)) + assert_path_exists File.join @spec.gem_dir, rb + assert_path_exists File.join @spec.gem_dir, rb2 end def test_install_extension_flat @@ -1085,14 +1026,14 @@ gem 'other', version } so = File.join(@spec.gem_dir, "#{@spec.name}.#{RbConfig::CONFIG["DLEXT"]}") - assert !File.exist?(so) + refute_path_exists so use_ui @ui do path = Gem::Package.build @spec @installer = Gem::Installer.new path @installer.install end - assert File.exist?(so) + assert_path_exists so rescue puts '-' * 78 puts File.read File.join(@gemhome, 'gems', 'a-2', 'Makefile') @@ -1337,11 +1278,11 @@ gem 'other', version @installer.unpack dest - assert File.exist?(File.join(dest, 'lib', 'code.rb')) - assert File.exist?(File.join(dest, 'bin', 'executable')) + assert_path_exists File.join dest, 'lib', 'code.rb' + assert_path_exists File.join dest, 'bin', 'executable' end - def test_write_build_args + def test_write_build_info_file refute_path_exists @spec.build_info_file @installer.build_args = %w[ @@ -1357,7 +1298,7 @@ gem 'other', version assert_equal expected, File.read(@spec.build_info_file) end - def test_write_build_args_empty + def test_write_build_info_file_empty refute_path_exists @spec.build_info_file @installer.write_build_info_file @@ -1397,20 +1338,20 @@ gem 'other', version def test_write_spec FileUtils.rm @spec.spec_file - refute File.exist?(@spec.spec_file) + refute_path_exists @spec.spec_file @installer.spec = @spec @installer.gem_home = @gemhome @installer.write_spec - assert File.exist?(@spec.spec_file) + assert_path_exists @spec.spec_file assert_equal @spec, eval(File.read(@spec.spec_file)) end def test_write_spec_writes_cached_spec FileUtils.rm @spec.spec_file - refute File.exist?(@spec.spec_file) + refute_path_exists @spec.spec_file @spec.files = %w[a.rb b.rb c.rb] @@ -1429,6 +1370,30 @@ gem 'other', version assert_match %r!/gemhome/gems/a-2$!, @installer.dir end + def test_default_gem + FileUtils.rm_f File.join(Gem.dir, 'specifications') + + @installer.wrappers = true + @installer.options[:install_as_default] = true + @installer.gem_dir = util_gem_dir @spec + @installer.generate_bin + + use_ui @ui do + @installer.install + end + + assert File.directory? util_inst_bindir + installed_exec = File.join util_inst_bindir, 'executable' + assert_path_exists installed_exec + + assert File.directory? File.join(Gem.dir, 'specifications') + assert File.directory? File.join(Gem.dir, 'specifications', 'default') + + default_spec = eval File.read File.join(Gem.dir, 'specifications', 'default', 'a-2.gemspec') + assert_equal Gem::Version.new("2"), default_spec.version + assert_equal ['bin/executable'], default_spec.files + end + def old_ruby_required spec = quick_spec 'old_ruby_required', '1' do |s| s.required_ruby_version = '= 1.4.6' diff --git a/test/rubygems/test_gem_name_tuple.rb b/test/rubygems/test_gem_name_tuple.rb index 62b4801f71..170a9c2ae0 100644 --- a/test/rubygems/test_gem_name_tuple.rb +++ b/test/rubygems/test_gem_name_tuple.rb @@ -2,6 +2,21 @@ require 'rubygems/test_case' require 'rubygems/name_tuple' class TestGemNameTuple < Gem::TestCase + + def test_full_name + n = Gem::NameTuple.new "a", Gem::Version.new(0), "ruby" + assert_equal "a-0", n.full_name + + n = Gem::NameTuple.new "a", Gem::Version.new(0), nil + assert_equal "a-0", n.full_name + + n = Gem::NameTuple.new "a", Gem::Version.new(0), "" + assert_equal "a-0", n.full_name + + n = Gem::NameTuple.new "a", Gem::Version.new(0), "other" + assert_equal "a-0-other", n.full_name + end + def test_platform_normalization n = Gem::NameTuple.new "a", Gem::Version.new(0), "ruby" assert_equal "ruby", n.platform @@ -12,4 +27,11 @@ class TestGemNameTuple < Gem::TestCase n = Gem::NameTuple.new "a", Gem::Version.new(0), "" assert_equal "ruby", n.platform end + + def test_spec_name + n = Gem::NameTuple.new "a", Gem::Version.new(0), "ruby" + assert_equal "a-0.gemspec", n.spec_name + end + end + diff --git a/test/rubygems/test_gem_package.rb b/test/rubygems/test_gem_package.rb index c77fc47ada..af5319a150 100644 --- a/test/rubygems/test_gem_package.rb +++ b/test/rubygems/test_gem_package.rb @@ -87,16 +87,19 @@ class TestGemPackage < Gem::Package::TarTestCase metadata_sha512 = Digest::SHA512.hexdigest s.string expected = { - 'SHA1' => { - 'metadata.gz' => metadata_sha1, - 'data.tar.gz' => Digest::SHA1.hexdigest(tar), - }, 'SHA512' => { 'metadata.gz' => metadata_sha512, 'data.tar.gz' => Digest::SHA512.hexdigest(tar), } } + if defined?(OpenSSL::Digest) then + expected['SHA1'] = { + 'metadata.gz' => metadata_sha1, + 'data.tar.gz' => Digest::SHA1.hexdigest(tar), + } + end + assert_equal expected, YAML.load(checksums) end @@ -160,11 +163,56 @@ class TestGemPackage < Gem::Package::TarTestCase end def test_build_auto_signed + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + FileUtils.mkdir_p File.join(Gem.user_home, '.gem') private_key_path = File.join Gem.user_home, '.gem', 'gem-private_key.pem' Gem::Security.write PRIVATE_KEY, private_key_path + public_cert_path = File.join Gem.user_home, '.gem', 'gem-public_cert.pem' + FileUtils.cp PUBLIC_CERT_PATH, public_cert_path + + spec = Gem::Specification.new 'build', '1' + spec.summary = 'build' + spec.authors = 'build' + spec.files = ['lib/code.rb'] + + FileUtils.mkdir 'lib' + + open 'lib/code.rb', 'w' do |io| + io.write '# lib/code.rb' + end + + package = Gem::Package.new spec.file_name + package.spec = spec + + package.build + + assert_equal Gem::VERSION, spec.rubygems_version + assert_path_exists spec.file_name + + reader = Gem::Package.new spec.file_name + assert reader.verify + + assert_equal [PUBLIC_CERT.to_pem], reader.spec.cert_chain + + assert_equal %w[metadata.gz metadata.gz.sig + data.tar.gz data.tar.gz.sig + checksums.yaml.gz checksums.yaml.gz.sig], + reader.files + + assert_equal %w[lib/code.rb], reader.contents + end + + def test_build_auto_signed_encrypted_key + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + + FileUtils.mkdir_p File.join(Gem.user_home, '.gem') + + private_key_path = File.join Gem.user_home, '.gem', 'gem-private_key.pem' + FileUtils.cp ENCRYPTED_PRIVATE_KEY_PATH, private_key_path + public_cert_path = File.join Gem.user_home, '.gem', 'gem-public_cert.pem' Gem::Security.write PUBLIC_CERT, public_cert_path @@ -214,6 +262,8 @@ class TestGemPackage < Gem::Package::TarTestCase end def test_build_signed + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + spec = Gem::Specification.new 'build', '1' spec.summary = 'build' spec.authors = 'build' @@ -248,6 +298,43 @@ class TestGemPackage < Gem::Package::TarTestCase assert_equal %w[lib/code.rb], reader.contents end + def test_build_signed_encryped_key + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + + spec = Gem::Specification.new 'build', '1' + spec.summary = 'build' + spec.authors = 'build' + spec.files = ['lib/code.rb'] + spec.cert_chain = [PUBLIC_CERT.to_pem] + spec.signing_key = ENCRYPTED_PRIVATE_KEY + + FileUtils.mkdir 'lib' + + open 'lib/code.rb', 'w' do |io| + io.write '# lib/code.rb' + end + + package = Gem::Package.new spec.file_name + package.spec = spec + + package.build + + assert_equal Gem::VERSION, spec.rubygems_version + assert_path_exists spec.file_name + + reader = Gem::Package.new spec.file_name + assert reader.verify + + assert_equal spec, reader.spec + + assert_equal %w[metadata.gz metadata.gz.sig + data.tar.gz data.tar.gz.sig + checksums.yaml.gz checksums.yaml.gz.sig], + reader.files + + assert_equal %w[lib/code.rb], reader.contents + end + def test_contents package = Gem::Package.new @gem @@ -309,6 +396,19 @@ class TestGemPackage < Gem::Package::TarTestCase "#{@destination} is not allowed", e.message) end + def test_extract_tar_gz_dot_slash + package = Gem::Package.new @gem + + tgz_io = util_tar_gz do |tar| + tar.add_file './dot_slash.rb', 0644 do |io| io.write 'hi' end + end + + package.extract_tar_gz tgz_io, @destination + + extracted = File.join @destination, 'dot_slash.rb' + assert_path_exists extracted + end + def test_install_location package = Gem::Package.new @gem @@ -444,7 +544,7 @@ class TestGemPackage < Gem::Package::TarTestCase io.write metadata_gz end - digest = OpenSSL::Digest::SHA1.new + digest = Digest::SHA1.new digest << metadata_gz checksums = { @@ -476,7 +576,8 @@ class TestGemPackage < Gem::Package::TarTestCase def test_verify_corrupt Tempfile.open 'corrupt' do |io| data = Gem.gzip 'a' * 10 - io.write tar_file_header('metadata.gz', "\000x", 0644, data.length) + io.write \ + tar_file_header('metadata.gz', "\000x", 0644, data.length, Time.now) io.write data io.rewind @@ -515,6 +616,8 @@ class TestGemPackage < Gem::Package::TarTestCase end def test_verify_security_policy + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + package = Gem::Package.new @gem package.security_policy = Gem::Security::HighSecurity @@ -530,6 +633,8 @@ class TestGemPackage < Gem::Package::TarTestCase end def test_verify_security_policy_low_security + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + @spec.cert_chain = [PUBLIC_CERT.to_pem] @spec.signing_key = PRIVATE_KEY @@ -548,6 +653,8 @@ class TestGemPackage < Gem::Package::TarTestCase end def test_verify_security_policy_checksum_missing + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + @spec.cert_chain = [PUBLIC_CERT.to_pem] @spec.signing_key = PRIVATE_KEY @@ -603,6 +710,21 @@ class TestGemPackage < Gem::Package::TarTestCase e.message end + # end #verify tests + + def test_verify_entry + entry = Object.new + def entry.full_name() raise ArgumentError, 'whatever' end + + package = Gem::Package.new @gem + + e = assert_raises Gem::Package::FormatError do + package.verify_entry entry + end + + assert_equal "package is corrupt, exception while verifying: whatever (ArgumentError) in #{@gem}", e.message + end + def test_spec package = Gem::Package.new @gem diff --git a/test/rubygems/test_gem_package_old.rb b/test/rubygems/test_gem_package_old.rb index 05f7ae3dec..6236dbbaf2 100644 --- a/test/rubygems/test_gem_package_old.rb +++ b/test/rubygems/test_gem_package_old.rb @@ -21,6 +21,8 @@ class TestGemPackageOld < Gem::TestCase end def test_contents_security_policy + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + @package.security_policy = Gem::Security::AlmostNoSecurity assert_raises Gem::Security::Exception do @@ -40,6 +42,8 @@ class TestGemPackageOld < Gem::TestCase end def test_extract_files_security_policy + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + @package.security_policy = Gem::Security::AlmostNoSecurity assert_raises Gem::Security::Exception do @@ -52,6 +56,8 @@ class TestGemPackageOld < Gem::TestCase end def test_spec_security_policy + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + @package.security_policy = Gem::Security::AlmostNoSecurity assert_raises Gem::Security::Exception do @@ -60,6 +66,8 @@ class TestGemPackageOld < Gem::TestCase end def test_verify + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + assert @package.verify @package.security_policy = Gem::Security::NoSecurity diff --git a/test/rubygems/test_gem_package_tar_reader.rb b/test/rubygems/test_gem_package_tar_reader.rb index d1af22d3be..5e0474c253 100644 --- a/test/rubygems/test_gem_package_tar_reader.rb +++ b/test/rubygems/test_gem_package_tar_reader.rb @@ -4,8 +4,8 @@ require 'rubygems/package' class TestGemPackageTarReader < Gem::Package::TarTestCase def test_each_entry - tar = tar_dir_header "foo", "bar", 0 - tar << tar_file_header("bar", "baz", 0, 0) + tar = tar_dir_header "foo", "bar", 0, Time.now + tar << tar_file_header("bar", "baz", 0, 0, Time.now) io = TempIO.new tar @@ -25,8 +25,9 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase def test_rewind content = ('a'..'z').to_a.join(" ") - str = tar_file_header("lib/foo", "", 010644, content.size) + content + - "\0" * (512 - content.size) + str = + tar_file_header("lib/foo", "", 010644, content.size, Time.now) + + content + "\0" * (512 - content.size) str << "\0" * 1024 Gem::Package::TarReader.new(TempIO.new(str)) do |tar_reader| @@ -43,8 +44,8 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase end def test_seek - tar = tar_dir_header "foo", "bar", 0 - tar << tar_file_header("bar", "baz", 0, 0) + tar = tar_dir_header "foo", "bar", 0, Time.now + tar << tar_file_header("bar", "baz", 0, 0, Time.now) io = TempIO.new tar @@ -60,8 +61,8 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase end def test_seek_missing - tar = tar_dir_header "foo", "bar", 0 - tar << tar_file_header("bar", "baz", 0, 0) + tar = tar_dir_header "foo", "bar", 0, Time.now + tar << tar_file_header("bar", "baz", 0, 0, Time.now) io = TempIO.new tar diff --git a/test/rubygems/test_gem_package_tar_reader_entry.rb b/test/rubygems/test_gem_package_tar_reader_entry.rb index 92da220fa6..3c1bf7291a 100644 --- a/test/rubygems/test_gem_package_tar_reader_entry.rb +++ b/test/rubygems/test_gem_package_tar_reader_entry.rb @@ -9,7 +9,7 @@ class TestGemPackageTarReaderEntry < Gem::Package::TarTestCase @contents = ('a'..'z').to_a.join * 100 @tar = '' - @tar << tar_file_header("lib/foo", "", 0, @contents.size) + @tar << tar_file_header("lib/foo", "", 0, @contents.size, Time.now) @tar << @contents @tar << "\0" * (512 - (@tar.size % 512)) diff --git a/test/rubygems/test_gem_package_tar_writer.rb b/test/rubygems/test_gem_package_tar_writer.rb index 40c6982929..2505d7ced1 100644 --- a/test/rubygems/test_gem_package_tar_writer.rb +++ b/test/rubygems/test_gem_package_tar_writer.rb @@ -1,5 +1,6 @@ require 'rubygems/package/tar_test_case' require 'rubygems/package/tar_writer' +require 'minitest/mock' class TestGemPackageTarWriter < Gem::Package::TarTestCase @@ -18,112 +19,130 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase end def test_add_file - @tar_writer.add_file 'x', 0644 do |f| f.write 'a' * 10 end + Time.stub :now, Time.at(1458518157) do + @tar_writer.add_file 'x', 0644 do |f| f.write 'a' * 10 end - assert_headers_equal(tar_file_header('x', '', 0644, 10), + assert_headers_equal(tar_file_header('x', '', 0644, 10, Time.now), @io.string[0, 512]) + end assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512] assert_equal 1024, @io.pos end def test_add_file_digest - digest_algorithms = OpenSSL::Digest::SHA1, OpenSSL::Digest::SHA512 + digest_algorithms = Digest::SHA1, Digest::SHA512 - digests = @tar_writer.add_file_digest 'x', 0644, digest_algorithms do |io| - io.write 'a' * 10 - end + Time.stub :now, Time.at(1458518157) do + digests = @tar_writer.add_file_digest 'x', 0644, digest_algorithms do |io| + io.write 'a' * 10 + end - assert_equal '3495ff69d34671d1e15b33a63c1379fdedd3a32a', - digests['SHA1'].hexdigest - assert_equal '4714870aff6c97ca09d135834fdb58a6389a50c1' \ - '1fef8ec4afef466fb60a23ac6b7a9c92658f14df' \ - '4993d6b40a4e4d8424196afc347e97640d68de61' \ - 'e1cf14b0', - digests['SHA512'].hexdigest + assert_equal '3495ff69d34671d1e15b33a63c1379fdedd3a32a', + digests['SHA1'].hexdigest + assert_equal '4714870aff6c97ca09d135834fdb58a6389a50c1' \ + '1fef8ec4afef466fb60a23ac6b7a9c92658f14df' \ + '4993d6b40a4e4d8424196afc347e97640d68de61' \ + 'e1cf14b0', + digests['SHA512'].hexdigest - assert_headers_equal(tar_file_header('x', '', 0644, 10), + assert_headers_equal(tar_file_header('x', '', 0644, 10, Time.now), @io.string[0, 512]) + end assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512] assert_equal 1024, @io.pos end def test_add_file_digest_multiple - digest_algorithms = [OpenSSL::Digest::SHA1, OpenSSL::Digest::SHA512] + digest_algorithms = [Digest::SHA1, Digest::SHA512] - digests = @tar_writer.add_file_digest 'x', 0644, digest_algorithms do |io| - io.write 'a' * 10 - end + Time.stub :now, Time.at(1458518157) do + digests = @tar_writer.add_file_digest 'x', 0644, digest_algorithms do |io| + io.write 'a' * 10 + end - assert_equal '3495ff69d34671d1e15b33a63c1379fdedd3a32a', - digests['SHA1'].hexdigest - assert_equal '4714870aff6c97ca09d135834fdb58a6389a50c1' \ - '1fef8ec4afef466fb60a23ac6b7a9c92658f14df' \ - '4993d6b40a4e4d8424196afc347e97640d68de61' \ - 'e1cf14b0', - digests['SHA512'].hexdigest + assert_equal '3495ff69d34671d1e15b33a63c1379fdedd3a32a', + digests['SHA1'].hexdigest + assert_equal '4714870aff6c97ca09d135834fdb58a6389a50c1' \ + '1fef8ec4afef466fb60a23ac6b7a9c92658f14df' \ + '4993d6b40a4e4d8424196afc347e97640d68de61' \ + 'e1cf14b0', + digests['SHA512'].hexdigest - assert_headers_equal(tar_file_header('x', '', 0644, 10), - @io.string[0, 512]) + assert_headers_equal(tar_file_header('x', '', 0644, 10, Time.now), + @io.string[0, 512]) + end assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512] assert_equal 1024, @io.pos end def test_add_file_signer + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + signer = Gem::Security::Signer.new PRIVATE_KEY, [PUBLIC_CERT] - @tar_writer.add_file_signed 'x', 0644, signer do |io| - io.write 'a' * 10 - end + Time.stub :now, Time.at(1458518157) do + @tar_writer.add_file_signed 'x', 0644, signer do |io| + io.write 'a' * 10 + end + + assert_headers_equal(tar_file_header('x', '', 0644, 10, Time.now), + @io.string[0, 512]) - assert_headers_equal(tar_file_header('x', '', 0644, 10), - @io.string[0, 512]) - assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512] - digest = signer.digest_algorithm.new - digest.update 'a' * 10 + assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512] - signature = signer.sign digest.digest + digest = signer.digest_algorithm.new + digest.update 'a' * 10 - assert_headers_equal(tar_file_header('x.sig', '', 0444, signature.length), - @io.string[1024, 512]) - assert_equal "#{signature}#{"\0" * (512 - signature.length)}", - @io.string[1536, 512] + signature = signer.sign digest.digest + + assert_headers_equal(tar_file_header('x.sig', '', 0444, signature.length, + Time.now), + @io.string[1024, 512]) + assert_equal "#{signature}#{"\0" * (512 - signature.length)}", + @io.string[1536, 512] + + assert_equal 2048, @io.pos + end - assert_equal 2048, @io.pos end def test_add_file_signer_empty signer = Gem::Security::Signer.new nil, nil - @tar_writer.add_file_signed 'x', 0644, signer do |io| - io.write 'a' * 10 - end + Time.stub :now, Time.at(1458518157) do - assert_headers_equal(tar_file_header('x', '', 0644, 10), + @tar_writer.add_file_signed 'x', 0644, signer do |io| + io.write 'a' * 10 + end + + assert_headers_equal(tar_file_header('x', '', 0644, 10, Time.now), @io.string[0, 512]) + end assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512] - digest = signer.digest_algorithm.new - digest.update 'a' * 10 - assert_equal 1024, @io.pos end def test_add_file_simple - @tar_writer.add_file_simple 'x', 0644, 10 do |io| io.write "a" * 10 end + Time.stub :now, Time.at(1458518157) do + @tar_writer.add_file_simple 'x', 0644, 10 do |io| io.write "a" * 10 end - assert_headers_equal(tar_file_header('x', '', 0644, 10), + assert_headers_equal(tar_file_header('x', '', 0644, 10, Time.now), @io.string[0, 512]) + end assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512] assert_equal 1024, @io.pos end def test_add_file_simple_padding - @tar_writer.add_file_simple 'x', 0, 100 + Time.stub :now, Time.at(1458518157) do + @tar_writer.add_file_simple 'x', 0, 100 - assert_headers_equal tar_file_header('x', '', 0, 100), + assert_headers_equal tar_file_header('x', '', 0, 100, Time.now), @io.string[0, 512] + end assert_equal "\0" * 512, @io.string[512, 512] end @@ -182,11 +201,14 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase end def test_mkdir - @tar_writer.mkdir 'foo', 0644 + Time.stub :now, Time.at(1458518157) do + @tar_writer.mkdir 'foo', 0644 - assert_headers_equal tar_dir_header('foo', '', 0644), - @io.string[0, 512] - assert_equal 512, @io.pos + assert_headers_equal tar_dir_header('foo', '', 0644, Time.now), + @io.string[0, 512] + + assert_equal 512, @io.pos + end end def test_split_name diff --git a/test/rubygems/test_gem_path_support.rb b/test/rubygems/test_gem_path_support.rb index bffc66f7dc..879cc98b5f 100644 --- a/test/rubygems/test_gem_path_support.rb +++ b/test/rubygems/test_gem_path_support.rb @@ -64,4 +64,21 @@ class TestGemPathSupport < Gem::TestCase def util_path ENV["GEM_PATH"].split(File::PATH_SEPARATOR) end + + def test_initialize_spec + ENV["GEM_SPEC_CACHE"] = nil + + ps = Gem::PathSupport.new + assert_equal Gem.default_spec_cache_dir, ps.spec_cache_dir + + ENV["GEM_SPEC_CACHE"] = 'bar' + + ps = Gem::PathSupport.new + assert_equal ENV["GEM_SPEC_CACHE"], ps.spec_cache_dir + + ENV["GEM_SPEC_CACHE"] = File.join @tempdir, 'spec_cache' + + ps = Gem::PathSupport.new "GEM_SPEC_CACHE" => "foo" + assert_equal "foo", ps.spec_cache_dir + end end diff --git a/test/rubygems/test_gem_platform.rb b/test/rubygems/test_gem_platform.rb index 1112a013f5..5966710dad 100644 --- a/test/rubygems/test_gem_platform.rb +++ b/test/rubygems/test_gem_platform.rb @@ -186,6 +186,24 @@ class TestGemPlatform < Gem::TestCase assert((x86_darwin8 === Gem::Platform.local), 'universal =~ x86') end + def test_equals3_cpu_arm + arm = Gem::Platform.new 'arm-linux' + armv5 = Gem::Platform.new 'armv5-linux' + armv7 = Gem::Platform.new 'armv7-linux' + + util_set_arch 'armv5-linux' + assert((arm === Gem::Platform.local), 'arm === armv5') + assert((armv5 === Gem::Platform.local), 'armv5 === armv5') + refute((armv7 === Gem::Platform.local), 'armv7 === armv5') + refute((Gem::Platform.local === arm), 'armv5 === arm') + + util_set_arch 'armv7-linux' + assert((arm === Gem::Platform.local), 'arm === armv7') + refute((armv5 === Gem::Platform.local), 'armv5 === armv7') + assert((armv7 === Gem::Platform.local), 'armv7 === armv7') + refute((Gem::Platform.local === arm), 'armv7 === arm') + end + def test_equals3_version util_set_arch 'i686-darwin8' diff --git a/test/rubygems/test_gem_remote_fetcher.rb b/test/rubygems/test_gem_remote_fetcher.rb index d3cc388db4..fe6da708b6 100644 --- a/test/rubygems/test_gem_remote_fetcher.rb +++ b/test/rubygems/test_gem_remote_fetcher.rb @@ -1,7 +1,13 @@ require 'rubygems/test_case' -require 'ostruct' + require 'webrick' -require 'webrick/https' +begin + require 'webrick/https' +rescue LoadError => e + raise unless (e.respond_to?(:path) && e.path == 'openssl') || + e.message =~ / -- openssl$/ +end + require 'rubygems/remote_fetcher' require 'rubygems/package' require 'minitest/mock' @@ -128,19 +134,7 @@ gems: refute_nil fetcher assert_kind_of Gem::RemoteFetcher, fetcher - assert_equal proxy_uri, fetcher.instance_variable_get(:@proxy_uri).to_s - end - - def test_self_fetcher_with_proxy_URI - proxy_uri = URI.parse 'http://proxy.example.com' - Gem.configuration[:http_proxy] = proxy_uri - Gem::RemoteFetcher.fetcher = nil - - fetcher = Gem::RemoteFetcher.fetcher - refute_nil fetcher - - assert_kind_of Gem::RemoteFetcher, fetcher - assert_equal proxy_uri, fetcher.instance_variable_get(:@proxy_uri) + assert_equal proxy_uri, fetcher.instance_variable_get(:@proxy).to_s end def test_fetch_size_bad_uri @@ -155,7 +149,7 @@ gems: def test_fetch_size_socket_error fetcher = Gem::RemoteFetcher.new nil - def fetcher.connection_for(uri) + def fetcher.request(uri, request_class, last_modified = nil) raise SocketError, "tarded" end @@ -414,70 +408,6 @@ gems: assert_equal @a2.file_name, File.basename(gem) end - def test_explicit_proxy - use_ui @ui do - fetcher = Gem::RemoteFetcher.new @proxy_uri - assert_equal PROXY_DATA.size, fetcher.fetch_size(@server_uri) - assert_data_from_proxy fetcher.fetch_path(@server_uri) - end - end - - def test_explicit_proxy_with_user_auth - use_ui @ui do - uri = URI.parse @proxy_uri - uri.user, uri.password = 'foo', 'bar' - fetcher = Gem::RemoteFetcher.new uri.to_s - proxy = fetcher.instance_variable_get("@proxy_uri") - assert_equal 'foo', proxy.user - assert_equal 'bar', proxy.password - assert_data_from_proxy fetcher.fetch_path(@server_uri) - end - - use_ui @ui do - uri = URI.parse @proxy_uri - uri.user, uri.password = 'domain%5Cuser', 'bar' - fetcher = Gem::RemoteFetcher.new uri.to_s - proxy = fetcher.instance_variable_get("@proxy_uri") - assert_equal 'domain\user', fetcher.unescape(proxy.user) - assert_equal 'bar', proxy.password - assert_data_from_proxy fetcher.fetch_path(@server_uri) - end - - use_ui @ui do - uri = URI.parse @proxy_uri - uri.user, uri.password = 'user', 'my%20pass' - fetcher = Gem::RemoteFetcher.new uri.to_s - proxy = fetcher.instance_variable_get("@proxy_uri") - assert_equal 'user', proxy.user - assert_equal 'my pass', fetcher.unescape(proxy.password) - assert_data_from_proxy fetcher.fetch_path(@server_uri) - end - end - - def test_explicit_proxy_with_user_auth_in_env - use_ui @ui do - ENV['http_proxy'] = @proxy_uri - ENV['http_proxy_user'] = 'foo' - ENV['http_proxy_pass'] = 'bar' - fetcher = Gem::RemoteFetcher.new nil - proxy = fetcher.instance_variable_get("@proxy_uri") - assert_equal 'foo', proxy.user - assert_equal 'bar', proxy.password - assert_data_from_proxy fetcher.fetch_path(@server_uri) - end - - use_ui @ui do - ENV['http_proxy'] = @proxy_uri - ENV['http_proxy_user'] = 'foo\user' - ENV['http_proxy_pass'] = 'my bar' - fetcher = Gem::RemoteFetcher.new nil - proxy = fetcher.instance_variable_get("@proxy_uri") - assert_equal 'foo\user', fetcher.unescape(proxy.user) - assert_equal 'my bar', fetcher.unescape(proxy.password) - assert_data_from_proxy fetcher.fetch_path(@server_uri) - end - end - def test_fetch_path_gzip fetcher = Gem::RemoteFetcher.new nil @@ -560,22 +490,6 @@ gems: assert_equal nil, fetcher.fetch_path(URI.parse(@gem_repo), Time.at(0)) end - def test_get_proxy_from_env_auto_normalizes - fetcher = Gem::RemoteFetcher.new(nil) - ENV['HTTP_PROXY'] = 'fakeurl:12345' - - assert_equal('http://fakeurl:12345', fetcher.get_proxy_from_env.to_s) - end - - def test_get_proxy_from_env_empty - ENV['HTTP_PROXY'] = '' - ENV.delete 'http_proxy' - - fetcher = Gem::RemoteFetcher.new nil - - assert_equal nil, fetcher.send(:get_proxy_from_env) - end - def test_implicit_no_proxy use_ui @ui do ENV['http_proxy'] = 'http://fakeurl:12345' @@ -611,9 +525,7 @@ gems: fetcher = Gem::RemoteFetcher.new nil url = 'http://gems.example.com/redirect' - conn = Object.new - def conn.started?() true end - def conn.request(req) + def fetcher.request(uri, request_class, last_modified = nil) url = 'http://gems.example.com/redirect' unless defined? @requested then @requested = true @@ -627,9 +539,6 @@ gems: end end - conn = { "#{Thread.current.object_id}:gems.example.com:80" => conn } - fetcher.instance_variable_set :@connections, conn - data = fetcher.fetch_http URI.parse(url) assert_equal 'real_path', data @@ -639,18 +548,13 @@ gems: fetcher = Gem::RemoteFetcher.new nil url = 'http://gems.example.com/redirect' - conn = Object.new - def conn.started?() true end - def conn.request(req) + def fetcher.request(uri, request_class, last_modified = nil) url = 'http://gems.example.com/redirect' res = Net::HTTPMovedPermanently.new nil, 301, nil res.add_field 'Location', url res end - conn = { "#{Thread.current.object_id}:gems.example.com:80" => conn } - fetcher.instance_variable_set :@connections, conn - e = assert_raises Gem::RemoteFetcher::FetchError do fetcher.fetch_http URI.parse(url) end @@ -658,14 +562,6 @@ gems: assert_equal "too many redirects (#{url})", e.message end - def test_normalize_uri - assert_equal 'FILE://example/', @fetcher.normalize_uri('FILE://example/') - assert_equal 'FTP://example/', @fetcher.normalize_uri('FTP://example/') - assert_equal 'HTTP://example/', @fetcher.normalize_uri('HTTP://example/') - assert_equal 'HTTPS://example/', @fetcher.normalize_uri('HTTPS://example/') - assert_equal 'http://example/', @fetcher.normalize_uri('example/') - end - def test_observe_no_proxy_env_single_host use_ui @ui do ENV["http_proxy"] = @proxy_uri @@ -684,115 +580,15 @@ gems: end end - def test_request - uri = URI.parse "#{@gem_repo}/specs.#{Gem.marshal_version}" - util_stub_connection_for :body => :junk, :code => 200 - - response = @fetcher.request uri, Net::HTTP::Get - - assert_equal 200, response.code - assert_equal :junk, response.body - end - - def test_request_head - uri = URI.parse "#{@gem_repo}/specs.#{Gem.marshal_version}" - util_stub_connection_for :body => '', :code => 200 - response = @fetcher.request uri, Net::HTTP::Head - - assert_equal 200, response.code - assert_equal '', response.body - end - - def test_request_unmodified - uri = URI.parse "#{@gem_repo}/specs.#{Gem.marshal_version}" - conn = util_stub_connection_for :body => '', :code => 304 - - t = Time.now - response = @fetcher.request uri, Net::HTTP::Head, t - - assert_equal 304, response.code - assert_equal '', response.body - - assert_equal t.rfc2822, conn.payload['if-modified-since'] - end - - def test_user_agent - ua = @fetcher.user_agent - - assert_match %r%^RubyGems/\S+ \S+ Ruby/\S+ \(.*?\)%, ua - assert_match %r%RubyGems/#{Regexp.escape Gem::VERSION}%, ua - assert_match %r% #{Regexp.escape Gem::Platform.local.to_s} %, ua - assert_match %r%Ruby/#{Regexp.escape RUBY_VERSION}%, ua - assert_match %r%\(#{Regexp.escape RUBY_RELEASE_DATE} %, ua - end - - def test_user_agent_engine - util_save_version - - Object.send :remove_const, :RUBY_ENGINE if defined?(RUBY_ENGINE) - Object.send :const_set, :RUBY_ENGINE, 'vroom' - - ua = @fetcher.user_agent - - assert_match %r%\) vroom%, ua - ensure - util_restore_version - end - - def test_user_agent_engine_ruby - util_save_version - - Object.send :remove_const, :RUBY_ENGINE if defined?(RUBY_ENGINE) - Object.send :const_set, :RUBY_ENGINE, 'ruby' - - ua = @fetcher.user_agent - - assert_match %r%\)%, ua - ensure - util_restore_version - end - - def test_user_agent_patchlevel - util_save_version - - Object.send :remove_const, :RUBY_PATCHLEVEL - Object.send :const_set, :RUBY_PATCHLEVEL, 5 - - ua = @fetcher.user_agent - - assert_match %r% patchlevel 5\)%, ua - ensure - util_restore_version - end - - def test_user_agent_revision - util_save_version - - Object.send :remove_const, :RUBY_PATCHLEVEL - Object.send :const_set, :RUBY_PATCHLEVEL, -1 - Object.send :remove_const, :RUBY_REVISION if defined?(RUBY_REVISION) - Object.send :const_set, :RUBY_REVISION, 6 - - ua = @fetcher.user_agent - - assert_match %r% revision 6\)%, ua - assert_match %r%Ruby/#{Regexp.escape RUBY_VERSION}dev%, ua - ensure - util_restore_version - end - - def test_user_agent_revision_missing - util_save_version - - Object.send :remove_const, :RUBY_PATCHLEVEL - Object.send :const_set, :RUBY_PATCHLEVEL, -1 - Object.send :remove_const, :RUBY_REVISION if defined?(RUBY_REVISION) - - ua = @fetcher.user_agent + def test_request_block + fetcher = Gem::RemoteFetcher.new nil - assert_match %r%\(#{Regexp.escape RUBY_RELEASE_DATE}\)%, ua - ensure - util_restore_version + assert_throws :block_called do + fetcher.request URI('http://example'), Net::HTTP::Get do |req| + assert_kind_of Net::HTTPGenericRequest, req + throw :block_called + end + end end def test_yaml_error_on_size @@ -811,6 +607,42 @@ gems: end end + def test_ssl_client_cert_auth_connection + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + + ssl_server = self.class.start_ssl_server({ + :SSLVerifyClient => + OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT}) + + temp_ca_cert = File.join(DIR, 'ca_cert.pem') + temp_client_cert = File.join(DIR, 'client.pem') + + with_configured_fetcher( + ":ssl_ca_cert: #{temp_ca_cert}\n" + + ":ssl_client_cert: #{temp_client_cert}\n") do |fetcher| + fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml") + end + end + + def test_do_not_allow_invalid_client_cert_auth_connection + skip 'openssl is missing' unless defined?(OpenSSL::SSL) + + ssl_server = self.class.start_ssl_server({ + :SSLVerifyClient => + OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT}) + + temp_ca_cert = File.join(DIR, 'ca_cert.pem') + temp_client_cert = File.join(DIR, 'invalid_client.pem') + + with_configured_fetcher( + ":ssl_ca_cert: #{temp_ca_cert}\n" + + ":ssl_client_cert: #{temp_client_cert}\n") do |fetcher| + assert_raises Gem::RemoteFetcher::FetchError do + fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml") + end + end + end + def test_do_not_allow_insecure_ssl_connection_by_default ssl_server = self.class.start_ssl_server with_configured_fetcher do |fetcher| @@ -850,18 +682,6 @@ gems: Gem.configuration = nil end - def util_stub_connection_for hash - def @fetcher.connection= conn - @conn = conn - end - - def @fetcher.connection_for uri - @conn - end - - @fetcher.connection = Conn.new OpenStruct.new(hash) - end - def assert_error(exception_class=Exception) got_exception = false @@ -882,20 +702,6 @@ gems: assert_match(/0\.4\.2/, data, "Data is not from proxy") end - class Conn - attr_accessor :payload - - def initialize(response) - @response = response - self.payload = nil - end - - def request(req) - self.payload = req - @response - end - end - class NilLog < WEBrick::Log def log(level, data) #Do nothing end @@ -913,9 +719,11 @@ gems: end DIR = File.expand_path(File.dirname(__FILE__)) - DH_PARAM = OpenSSL::PKey::DH.new(128) def start_ssl_server(config = {}) + raise MiniTest::Skip, 'openssl not installed' unless + defined?(OpenSSL::SSL) + null_logger = NilLog.new server = WEBrick::HTTPServer.new({ :Port => 0, @@ -934,7 +742,7 @@ gems: server.mount_proc("/insecure_redirect") { |req, res| res.set_redirect(WEBrick::HTTPStatus::MovedPermanently, req.query['to']) } - server.ssl_context.tmp_dh_callback = proc { DH_PARAM } + server.ssl_context.tmp_dh_callback = proc { OpenSSL::PKey::DH.new 128 } t = Thread.new do begin server.start @@ -953,8 +761,6 @@ gems: server end - - private def start_server(port, data) @@ -1015,24 +821,5 @@ gems: assert_equal "/home/skillet", @fetcher.correct_for_windows_path(path) end - def util_save_version - @orig_RUBY_ENGINE = RUBY_ENGINE if defined? RUBY_ENGINE - @orig_RUBY_PATCHLEVEL = RUBY_PATCHLEVEL - @orig_RUBY_REVISION = RUBY_REVISION if defined? RUBY_REVISION - end - - def util_restore_version - Object.send :remove_const, :RUBY_ENGINE if defined?(RUBY_ENGINE) - Object.send :const_set, :RUBY_ENGINE, @orig_RUBY_ENGINE if - defined?(@orig_RUBY_ENGINE) - - Object.send :remove_const, :RUBY_PATCHLEVEL - Object.send :const_set, :RUBY_PATCHLEVEL, @orig_RUBY_PATCHLEVEL - - Object.send :remove_const, :RUBY_REVISION if defined?(RUBY_REVISION) - Object.send :const_set, :RUBY_REVISION, @orig_RUBY_REVISION if - defined?(@orig_RUBY_REVISION) - end - end diff --git a/test/rubygems/test_gem_security.rb b/test/rubygems/test_gem_security.rb index 737881d7bc..b8747b79c3 100644 --- a/test/rubygems/test_gem_security.rb +++ b/test/rubygems/test_gem_security.rb @@ -2,6 +2,10 @@ require 'rubygems/test_case' require 'rubygems/security' require 'rubygems/fix_openssl_warnings' if RUBY_VERSION < "1.9" +unless defined?(OpenSSL::SSL) then + warn 'Skipping Gem::Security tests. openssl not found.' +end + class TestGemSecurity < Gem::TestCase CHILD_KEY = load_key 'child' @@ -95,7 +99,7 @@ class TestGemSecurity < Gem::TestCase end def test_class_create_key - key = @SEC.create_key 256 + key = @SEC.create_key 1024 assert_kind_of OpenSSL::PKey::RSA, key end @@ -246,5 +250,57 @@ class TestGemSecurity < Gem::TestCase assert_equal expected, trust_dir.dir end -end + def test_class_write + key = @SEC.create_key 1024 + + path = File.join @tempdir, 'test-private_key.pem' + + @SEC.write key, path + + assert_path_exists path + + key_from_file = File.read path + + assert_equal key.to_pem, key_from_file + end + + def test_class_write_encrypted + key = @SEC.create_key 1024 + + path = File.join @tempdir, 'test-private_encrypted_key.pem' + + passphrase = 'It should be long.' + + @SEC.write key, path, 0600, passphrase + + assert_path_exists path + + key_from_file = OpenSSL::PKey::RSA.new File.read(path), passphrase + + assert_equal key.to_pem, key_from_file.to_pem + end + + def test_class_write_encrypted_cipher + key = @SEC.create_key 1024 + + path = File.join @tempdir, 'test-private_encrypted__with_non_default_cipher_key.pem' + + passphrase = 'It should be long.' + + cipher = OpenSSL::Cipher.new 'AES-192-CBC' + + @SEC.write key, path, 0600, passphrase, cipher + + assert_path_exists path + + key_file_contents = File.read(path) + + assert key_file_contents.split("\n")[2].match(cipher.name) + + key_from_file = OpenSSL::PKey::RSA.new key_file_contents, passphrase + + assert_equal key.to_pem, key_from_file.to_pem + end + +end if defined?(OpenSSL::SSL) diff --git a/test/rubygems/test_gem_security_policy.rb b/test/rubygems/test_gem_security_policy.rb index 1ce93fbd95..a2115e709a 100644 --- a/test/rubygems/test_gem_security_policy.rb +++ b/test/rubygems/test_gem_security_policy.rb @@ -2,6 +2,10 @@ require 'rubygems/test_case' +unless defined?(OpenSSL::SSL) then + warn 'Skipping Gem::Security::Policy tests. openssl not found.' +end + class TestGemSecurityPolicy < Gem::TestCase ALTERNATE_KEY = load_key 'alternate' @@ -11,6 +15,7 @@ class TestGemSecurityPolicy < Gem::TestCase INVALIDCHILD_KEY = load_key 'invalidchild' ALTERNATE_CERT = load_cert 'alternate' + CA_CERT = load_cert 'ca' CHILD_CERT = load_cert 'child' EXPIRED_CERT = load_cert 'expired' FUTURE_CERT = load_cert 'future' @@ -285,6 +290,11 @@ class TestGemSecurityPolicy < Gem::TestCase "(root of signing cert #{CHILD_CERT.subject})", e.message end + def test_subject + assert_equal 'email:nobody@example', @no.subject(PUBLIC_CERT) + assert_equal '/C=JP/O=JIN.GR.JP/OU=RRR/CN=CA', @no.subject(CA_CERT) + end + def test_verify Gem::Security.trust_dir.trust_cert PUBLIC_CERT @@ -325,6 +335,33 @@ class TestGemSecurityPolicy < Gem::TestCase assert_equal 'missing digest for 0', e.message end + def test_verify_no_signatures + Gem::Security.trust_dir.trust_cert PUBLIC_CERT + + digests, = dummy_signatures + + use_ui @ui do + @no.verify [PUBLIC_CERT], nil, digests, {}, 'some_gem' + end + + assert_match "WARNING: some_gem is not signed\n", @ui.error + + assert_raises Gem::Security::Exception do + @almost_no.verify [PUBLIC_CERT], nil, digests, {} + end + end + + def test_verify_no_signatures_no_digests + Gem::Security.trust_dir.trust_cert PUBLIC_CERT + + use_ui @ui do + @no.verify [PUBLIC_CERT], nil, {}, {}, 'some_gem' + end + + assert_empty @ui.output + assert_empty @ui.error + end + def test_verify_not_enough_signatures Gem::Security.trust_dir.trust_cert PUBLIC_CERT @@ -341,6 +378,21 @@ class TestGemSecurityPolicy < Gem::TestCase assert_equal 'missing digest for 1', e.message end + def test_verify_no_trust + digests, signatures = dummy_signatures + + use_ui @ui do + @low.verify [PUBLIC_CERT], nil, digests, signatures, 'some_gem' + end + + assert_equal "WARNING: email:nobody@example is not trusted for some_gem\n", + @ui.error + + assert_raises Gem::Security::Exception do + @medium.verify [PUBLIC_CERT], nil, digests, signatures + end + end + def test_verify_wrong_digest_type Gem::Security.trust_dir.trust_cert PUBLIC_CERT @@ -484,5 +536,5 @@ class TestGemSecurityPolicy < Gem::TestCase return digests, signatures end -end +end if defined?(OpenSSL::SSL) diff --git a/test/rubygems/test_gem_security_signer.rb b/test/rubygems/test_gem_security_signer.rb index 59c5089fec..f077a46413 100644 --- a/test/rubygems/test_gem_security_signer.rb +++ b/test/rubygems/test_gem_security_signer.rb @@ -1,5 +1,9 @@ require 'rubygems/test_case' +unless defined?(OpenSSL::SSL) then + warn 'Skipping Gem::Security::Signer tests. openssl not found.' +end + class TestGemSecuritySigner < Gem::TestCase ALTERNATE_KEY = load_key 'alternate' @@ -72,6 +76,20 @@ class TestGemSecuritySigner < Gem::TestCase assert_equal PRIVATE_KEY.to_s, signer.key.to_s end + def test_initialize_encrypted_key_path + key_file = ENCRYPTED_PRIVATE_KEY_PATH + + signer = Gem::Security::Signer.new key_file, nil, PRIVATE_KEY_PASSPHRASE + + assert_equal ENCRYPTED_PRIVATE_KEY.to_s, signer.key.to_s + end + + def test_extract_name + signer = Gem::Security::Signer.new nil, nil + + assert_equal 'child@example', signer.extract_name(CHILD_CERT) + end + def test_load_cert_chain Gem::Security.trust_dir.trust_cert PUBLIC_CERT @@ -186,5 +204,5 @@ c7NM7KZZjj7G++SXjYTEI1PHSA7aFQ/i/+qSUvx+Pg== end end -end +end if defined?(OpenSSL::SSL) diff --git a/test/rubygems/test_gem_security_trust_dir.rb b/test/rubygems/test_gem_security_trust_dir.rb index 56c2feb44c..7b0d450bd6 100644 --- a/test/rubygems/test_gem_security_trust_dir.rb +++ b/test/rubygems/test_gem_security_trust_dir.rb @@ -1,5 +1,9 @@ require 'rubygems/test_case' +unless defined?(OpenSSL::SSL) then + warn 'Skipping Gem::Security::TrustDir tests. openssl not found.' +end + class TestGemSecurityTrustDir < Gem::TestCase CHILD_CERT = load_cert 'child' @@ -90,5 +94,5 @@ class TestGemSecurityTrustDir < Gem::TestCase assert_equal mask, File.stat(@dest_dir).mode unless win_platform? end -end +end if defined?(OpenSSL::SSL) diff --git a/test/rubygems/test_gem_source.rb b/test/rubygems/test_gem_source.rb index 2629f180a9..cb43121ddd 100644 --- a/test/rubygems/test_gem_source.rb +++ b/test/rubygems/test_gem_source.rb @@ -63,7 +63,7 @@ class TestGemSource < Gem::TestCase def test_cache_dir_escapes_windows_paths uri = URI.parse("file:///C:/WINDOWS/Temp/gem_repo") - root = File.join Gem.user_home, '.gem', 'specs' + root = Gem.spec_cache_dir cache_dir = @source.cache_dir(uri).gsub(root, '') assert cache_dir !~ /:/, "#{cache_dir} should not contain a :" end @@ -123,7 +123,7 @@ class TestGemSource < Gem::TestCase expected = @released assert_equal expected, @source.load_specs(:released) - cache_dir = File.join Gem.user_home, '.gem', 'specs', 'gems.example.com%80' + cache_dir = File.join Gem.spec_cache_dir, 'gems.example.com%80' assert File.exist?(cache_dir), "#{cache_dir} does not exist" cache_file = File.join cache_dir, "specs.#{Gem.marshal_version}" @@ -138,7 +138,7 @@ class TestGemSource < Gem::TestCase @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}"] = ' ' * Marshal.dump(@latest_specs).length - cache_dir = File.join Gem.user_home, '.gem', 'specs', 'gems.example.com%80' + cache_dir = File.join Gem.spec_cache_dir, 'gems.example.com%80' FileUtils.mkdir_p cache_dir @@ -160,7 +160,7 @@ class TestGemSource < Gem::TestCase @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] = util_gzip(Marshal.dump(@latest_specs)) - cache_dir = File.join Gem.user_home, '.gem', 'specs', 'gems.example.com%80' + cache_dir = File.join Gem.spec_cache_dir, 'gems.example.com%80' FileUtils.mkdir_p cache_dir @@ -184,5 +184,28 @@ class TestGemSource < Gem::TestCase end end + def test_spaceship + remote = @source + specific = Gem::Source::SpecificFile.new(@a1.cache_file) + installed = Gem::Source::Installed.new + local = Gem::Source::Local.new + + assert_equal( 0, remote. <=>(remote), 'remote <=> remote') + + assert_equal(-1, remote. <=>(specific), 'remote <=> specific') + assert_equal( 1, specific. <=>(remote), 'specific <=> remote') + + assert_equal(-1, remote. <=>(local), 'remote <=> local') + assert_equal( 1, local. <=>(remote), 'local <=> remote') + + assert_equal(-1, remote. <=>(installed), 'remote <=> installed') + assert_equal( 1, installed.<=>(remote), 'installed <=> remote') + + no_uri = @source.dup + no_uri.instance_variable_set :@uri, nil + + assert_equal(-1, remote. <=>(no_uri), 'remote <=> no_uri') + end + end diff --git a/test/rubygems/test_gem_source_local.rb b/test/rubygems/test_gem_source_local.rb index 54ce3d51be..b3b444ccde 100644 --- a/test/rubygems/test_gem_source_local.rb +++ b/test/rubygems/test_gem_source_local.rb @@ -1,5 +1,5 @@ require 'rubygems/test_case' -require 'rubygems/source_local' +require 'rubygems/source/local' require 'fileutils' @@ -66,18 +66,41 @@ class TestGemSourceLocal < Gem::TestCase assert_equal s, @a end + def test_inspect + assert_equal '#', @sl.inspect + + @sl.load_specs :released + + inner = [@a, @ap, @b].map { |t| t.name_tuple }.inspect + + assert_equal "#", @sl.inspect + end + def test_download path = @sl.download @a assert_equal File.expand_path(@a.file_name), path end - def test_compare - uri = URI.parse "http://gems.example/foo" - s = Gem::Source.new uri + def test_spaceship + a1 = quick_gem 'a', '1' + util_build_gem a1 - assert_equal(-1, (@sl <=> s)) - assert_equal 1, (s <=> @sl) - assert_equal 0, (@sl <=> @sl) + remote = Gem::Source.new @gem_repo + specific = Gem::Source::SpecificFile.new a1.cache_file + installed = Gem::Source::Installed.new + local = Gem::Source::Local.new + + assert_equal( 0, local. <=>(local), 'local <=> local') + + assert_equal(-1, remote. <=>(local), 'remote <=> local') + assert_equal( 1, local. <=>(remote), 'local <=> remote') + + assert_equal( 1, installed.<=>(local), 'installed <=> local') + assert_equal(-1, local. <=>(installed), 'local <=> installed') + + assert_equal(-1, specific. <=>(local), 'specific <=> local') + assert_equal( 1, local. <=>(specific), 'local <=> specific') end + end diff --git a/test/rubygems/test_gem_source_specific_file.rb b/test/rubygems/test_gem_source_specific_file.rb index 7ffcf482dc..8ccbe50c91 100644 --- a/test/rubygems/test_gem_source_specific_file.rb +++ b/test/rubygems/test_gem_source_specific_file.rb @@ -1,5 +1,5 @@ require 'rubygems/test_case' -require 'rubygems/source_specific_file' +require 'rubygems/source/specific_file' class TestGemSourceSpecificFile < Gem::TestCase def setup @@ -30,4 +30,42 @@ class TestGemSourceSpecificFile < Gem::TestCase def test_download assert_equal @a_gem, @sf.download(@a) end + + def test_spaceship + a1 = quick_gem 'a', '1' + util_build_gem a1 + + remote = Gem::Source.new @gem_repo + specific = Gem::Source::SpecificFile.new a1.cache_file + installed = Gem::Source::Installed.new + local = Gem::Source::Local.new + + assert_equal( 0, specific. <=>(specific), 'specific <=> specific') + + assert_equal(-1, remote. <=>(specific), 'remote <=> specific') + assert_equal( 1, specific. <=>(remote), 'specific <=> remote') + + assert_equal(-1, specific. <=>(local), 'specific <=> local') + assert_equal( 1, local. <=>(specific), 'local <=> specific') + + assert_equal(-1, specific. <=>(installed), 'specific <=> installed') + assert_equal( 1, installed.<=>(specific), 'installed <=> specific') + + a2 = quick_gem 'a', '2' + util_build_gem a2 + + b1 = quick_gem 'b', '1' + util_build_gem b1 + + a1_source = specific + a2_source = Gem::Source::SpecificFile.new a2.cache_file + b1_source = Gem::Source::SpecificFile.new b1.cache_file + + assert_nil a1_source.<=>(b1_source), 'a1_source <=> b1_source' + + assert_equal(-1, a1_source.<=>(a2_source), 'a1_source <=> a2_source') + assert_equal( 0, a1_source.<=>(a1_source), 'a1_source <=> a1_source') + assert_equal( 1, a2_source.<=>(a1_source), 'a2_source <=> a1_source') + end + end diff --git a/test/rubygems/test_gem_spec_fetcher.rb b/test/rubygems/test_gem_spec_fetcher.rb index a821057705..8be10a30b9 100644 --- a/test/rubygems/test_gem_spec_fetcher.rb +++ b/test/rubygems/test_gem_spec_fetcher.rb @@ -168,7 +168,7 @@ class TestGemSpecFetcher < Gem::TestCase specs, _ = @sf.available_specs(:latest) assert_equal [@source], specs.keys - assert_equal @latest_specs, specs[@source].sort + assert_equal @latest_specs, specs[@source] end def test_available_specs_released @@ -176,7 +176,7 @@ class TestGemSpecFetcher < Gem::TestCase assert_equal [@source], specs.keys - assert_equal @released, specs[@source].sort + assert_equal @released, specs[@source] end def test_available_specs_complete @@ -184,9 +184,9 @@ class TestGemSpecFetcher < Gem::TestCase assert_equal [@source], specs.keys - comp = @prerelease_specs + @released + expected = (@prerelease_specs + @released).sort - assert_equal comp.sort, specs[@source].sort + assert_equal expected, specs[@source] end def test_available_specs_complete_handles_no_prerelease @@ -197,12 +197,9 @@ class TestGemSpecFetcher < Gem::TestCase assert_equal [@source], specs.keys - comp = @released - - assert_equal comp.sort, specs[@source].sort + assert_equal @released, specs[@source] end - def test_available_specs_cache specs, _ = @sf.available_specs(:latest) @@ -230,7 +227,7 @@ class TestGemSpecFetcher < Gem::TestCase def test_available_specs_prerelease specs, _ = @sf.available_specs(:prerelease) - assert_equal @prerelease_specs, specs[@source].sort + assert_equal @prerelease_specs, specs[@source] end def test_available_specs_with_bad_source diff --git a/test/rubygems/test_gem_specification.rb b/test/rubygems/test_gem_specification.rb index 9b2ae82fe3..efda6f6f19 100644 --- a/test/rubygems/test_gem_specification.rb +++ b/test/rubygems/test_gem_specification.rb @@ -38,10 +38,8 @@ Gem::Specification.new do |s| end EOF - def setup - super - - @a1 = quick_spec 'a', '1' do |s| + def make_spec_c1 + @c1 = quick_spec 'a', '1' do |s| s.executable = 'exec' s.extensions << 'ext/a/extconf.rb' s.test_file = 'test/suite.rb' @@ -56,6 +54,22 @@ end s.mark_version s.files = %w[lib/code.rb] end + end + + def setup + super + + @a1 = quick_spec 'a', '1' do |s| + s.executable = 'exec' + s.extensions << 'ext/a/extconf.rb' + s.test_file = 'test/suite.rb' + s.requirements << 'A working computer' + s.rubyforge_project = 'example' + s.license = 'MIT' + + s.mark_version + s.files = %w[lib/code.rb] + end @a2 = quick_spec 'a', '2' do |s| s.files = %w[lib/code.rb] @@ -66,6 +80,379 @@ end load 'rubygems/syck_hack.rb' end + def test_self_activate + foo = util_spec 'foo', '1' + + assert_activate %w[foo-1], foo + end + + def test_self_activate_ambiguous_direct + save_loaded_features do + a1 = new_spec "a", "1", "b" => "> 0" + b1 = new_spec("b", "1", { "c" => ">= 1" }, "lib/d.rb") + b2 = new_spec("b", "2", { "c" => ">= 2" }, "lib/d.rb") + c1 = new_spec "c", "1" + c2 = new_spec "c", "2" + + Gem::Specification.reset + install_specs a1, b1, b2, c1, c2 + + a1.activate + assert_equal %w(a-1), loaded_spec_names + assert_equal ["b (> 0)"], unresolved_names + + require "d" + + assert_equal %w(a-1 b-2 c-2), loaded_spec_names + assert_equal [], unresolved_names + end + end + + def test_self_activate_ambiguous_indirect + save_loaded_features do + a1 = new_spec "a", "1", "b" => "> 0" + b1 = new_spec "b", "1", "c" => ">= 1" + b2 = new_spec "b", "2", "c" => ">= 2" + c1 = new_spec "c", "1", nil, "lib/d.rb" + c2 = new_spec "c", "2", nil, "lib/d.rb" + + install_specs a1, b1, b2, c1, c2 + + a1.activate + assert_equal %w(a-1), loaded_spec_names + assert_equal ["b (> 0)"], unresolved_names + + require "d" + + assert_equal %w(a-1 b-2 c-2), loaded_spec_names + assert_equal [], unresolved_names + end + end + + def test_self_activate_ambiguous_indirect_conflict + save_loaded_features do + a1 = new_spec "a", "1", "b" => "> 0" + a2 = new_spec "a", "2", "b" => "> 0" + b1 = new_spec "b", "1", "c" => ">= 1" + b2 = new_spec "b", "2", "c" => ">= 2" + c1 = new_spec "c", "1", nil, "lib/d.rb" + c2 = new_spec("c", "2", { "a" => "1" }, "lib/d.rb") # conflicts with a-2 + + install_specs a1, a2, b1, b2, c1, c2 + + a2.activate + assert_equal %w(a-2), loaded_spec_names + assert_equal ["b (> 0)"], unresolved_names + + require "d" + + assert_equal %w(a-2 b-1 c-1), loaded_spec_names + assert_equal [], unresolved_names + end + end + + def test_self_activate_ambiguous_unrelated + save_loaded_features do + a1 = new_spec "a", "1", "b" => "> 0" + b1 = new_spec "b", "1", "c" => ">= 1" + b2 = new_spec "b", "2", "c" => ">= 2" + c1 = new_spec "c", "1" + c2 = new_spec "c", "2" + d1 = new_spec "d", "1", nil, "lib/d.rb" + + install_specs a1, b1, b2, c1, c2, d1 + + a1.activate + assert_equal %w(a-1), loaded_spec_names + assert_equal ["b (> 0)"], unresolved_names + + require "d" + + assert_equal %w(a-1 d-1), loaded_spec_names + assert_equal ["b (> 0)"], unresolved_names + end + end + + ## + # [A] depends on + # [C] = 1.0 depends on + # [B] = 2.0 + # [B] ~> 1.0 (satisfied by 1.0) + + def test_self_activate_checks_dependencies + a, _ = util_spec 'a', '1.0' + a.add_dependency 'c', '= 1.0' + a.add_dependency 'b', '~> 1.0' + + util_spec 'b', '1.0' + util_spec 'b', '2.0' + c, _ = util_spec 'c', '1.0', 'b' => '= 2.0' + + e = assert_raises Gem::LoadError do + assert_activate nil, a, c, "b" + end + + expected = "can't satisfy 'b (~> 1.0)', already activated 'b-2.0'" + assert_equal expected, e.message + end + + ## + # [A] depends on + # [B] ~> 1.0 (satisfied by 1.0) + # [C] = 1.0 depends on + # [B] = 2.0 + + def test_self_activate_divergent + a, _ = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0' + util_spec 'b', '1.0' + util_spec 'b', '2.0' + c, _ = util_spec 'c', '1.0', 'b' => '= 2.0' + + e = assert_raises Gem::LoadError do + assert_activate nil, a, c, "b" + end + + assert_match(/Unable to activate c-1.0,/, e.message) + assert_match(/because b-1.0 conflicts with b .= 2.0/, e.message) + end + + ## + # DOC + + def test_self_activate_old_required + e1, = util_spec 'e', '1', 'd' => '= 1' + @d1 = util_spec 'd', '1' + @d2 = util_spec 'd', '2' + + assert_activate %w[d-1 e-1], e1, "d" + end + + ## + # DOC + + def test_self_activate_platform_alternate + @x1_m = util_spec 'x', '1' do |s| + s.platform = Gem::Platform.new %w[cpu my_platform 1] + end + + @x1_o = util_spec 'x', '1' do |s| + s.platform = Gem::Platform.new %w[cpu other_platform 1] + end + + @w1 = util_spec 'w', '1', 'x' => nil + + util_set_arch 'cpu-my_platform1' + + assert_activate %w[x-1-cpu-my_platform-1 w-1], @w1, @x1_m + end + + ## + # DOC + + def test_self_activate_platform_bump + @y1 = util_spec 'y', '1' + + @y1_1_p = util_spec 'y', '1.1' do |s| + s.platform = Gem::Platform.new %w[cpu my_platform 1] + end + + @z1 = util_spec 'z', '1', 'y' => nil + + assert_activate %w[y-1 z-1], @z1, @y1 + end + + ## + # [C] depends on + # [A] = 1.a + # [B] = 1.0 depends on + # [A] >= 0 (satisfied by 1.a) + + def test_self_activate_prerelease + @c1_pre = util_spec 'c', '1.a', "a" => "1.a", "b" => "1" + @a1_pre = util_spec 'a', '1.a' + @b1 = util_spec 'b', '1' do |s| + s.add_dependency 'a' + s.add_development_dependency 'aa' + end + + assert_activate %w[a-1.a b-1 c-1.a], @c1_pre, @a1_pre, @b1 + end + + def test_self_activate_via_require + a1 = new_spec "a", "1", "b" => "= 1" + b1 = new_spec "b", "1", nil, "lib/b/c.rb" + b2 = new_spec "b", "2", nil, "lib/b/c.rb" + + install_specs a1, b1, b2 + + a1.activate + save_loaded_features do + require "b/c" + end + + assert_equal %w(a-1 b-1), loaded_spec_names + end + + def test_self_activate_via_require_wtf + save_loaded_features do + a1 = new_spec "a", "1", "b" => "> 0", "d" => "> 0" # this + b1 = new_spec "b", "1", { "c" => ">= 1" }, "lib/b.rb" + b2 = new_spec "b", "2", { "c" => ">= 2" }, "lib/b.rb" # this + c1 = new_spec "c", "1" + c2 = new_spec "c", "2" # this + d1 = new_spec "d", "1", { "c" => "< 2" }, "lib/d.rb" + d2 = new_spec "d", "2", { "c" => "< 2" }, "lib/d.rb" # this + + install_specs a1, b1, b2, c1, c2, d1, d2 + + a1.activate + + assert_equal %w(a-1), loaded_spec_names + assert_equal ["b (> 0)", "d (> 0)"], unresolved_names + + require "b" + + e = assert_raises Gem::LoadError do + require "d" + end + + assert_equal "unable to find a version of 'd' to activate", e.message + + assert_equal %w(a-1 b-2 c-2), loaded_spec_names + assert_equal ["d (> 0)"], unresolved_names + end + end + + def test_self_activate_deep_unambiguous + a1 = new_spec "a", "1", "b" => "= 1" + b1 = new_spec "b", "1", "c" => "= 1" + b2 = new_spec "b", "2", "c" => "= 2" + c1 = new_spec "c", "1" + c2 = new_spec "c", "2" + + install_specs a1, b1, b2, c1, c2 + + a1.activate + assert_equal %w(a-1 b-1 c-1), loaded_spec_names + end + + def test_self_activate_loaded + foo = util_spec 'foo', '1' + + assert foo.activate + refute foo.activate + end + + ## + # [A] depends on + # [B] >= 1.0 (satisfied by 2.0) + # [C] depends on nothing + + def test_self_activate_unrelated + a = util_spec 'a', '1.0', 'b' => '>= 1.0' + util_spec 'b', '1.0' + c = util_spec 'c', '1.0' + + assert_activate %w[b-1.0 c-1.0 a-1.0], a, c, "b" + end + + ## + # [A] depends on + # [B] >= 1.0 (satisfied by 2.0) + # [C] = 1.0 depends on + # [B] ~> 1.0 + # + # and should resolve using b-1.0 + # TODO: move these to specification + + def test_self_activate_over + a = util_spec 'a', '1.0', 'b' => '>= 1.0', 'c' => '= 1.0' + util_spec 'b', '1.0' + util_spec 'b', '1.1' + util_spec 'b', '2.0' + util_spec 'c', '1.0', 'b' => '~> 1.0' + + a.activate + + assert_equal %w[a-1.0 c-1.0], loaded_spec_names + assert_equal ["b (>= 1.0, ~> 1.0)"], unresolved_names + end + + ## + # [A] depends on + # [B] ~> 1.0 (satisfied by 1.1) + # [C] = 1.0 depends on + # [B] = 1.0 + # + # and should resolve using b-1.0 + # + # TODO: this is not under, but over... under would require depth + # first resolve through a dependency that is later pruned. + + def test_self_activate_under + a, _ = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0' + util_spec 'b', '1.0' + util_spec 'b', '1.1' + c, _ = util_spec 'c', '1.0', 'b' => '= 1.0' + + assert_activate %w[b-1.0 c-1.0 a-1.0], a, c, "b" + end + + ## + # [A1] depends on + # [B] > 0 (satisfied by 2.0) + # [B1] depends on + # [C] > 0 (satisfied by 1.0) + # [B2] depends on nothing! + # [C1] depends on nothing + + def test_self_activate_dropped + a1, = util_spec 'a', '1', 'b' => nil + util_spec 'b', '1', 'c' => nil + util_spec 'b', '2' + util_spec 'c', '1' + + assert_activate %w[b-2 a-1], a1, "b" + end + + ## + # [A] depends on + # [B] >= 1.0 (satisfied by 1.1) depends on + # [Z] + # [C] >= 1.0 depends on + # [B] = 1.0 + # + # and should backtrack to resolve using b-1.0, pruning Z from the + # resolve. + + def test_self_activate_raggi_the_edgecase_generator + a, _ = util_spec 'a', '1.0', 'b' => '>= 1.0', 'c' => '>= 1.0' + util_spec 'b', '1.0' + util_spec 'b', '1.1', 'z' => '>= 1.0' + c, _ = util_spec 'c', '1.0', 'b' => '= 1.0' + + assert_activate %w[b-1.0 c-1.0 a-1.0], a, c, "b" + end + + def test_self_activate_conflict + util_spec 'b', '1.0' + util_spec 'b', '2.0' + + gem "b", "= 1.0" + + assert_raises Gem::LoadError do + gem "b", "= 2.0" + end + end + + def test_self_all_equals + a = new_spec "foo", "1", nil, "lib/foo.rb" + + Gem::Specification.all = [a] + + assert_equal a, Gem::Specification.find_inactive_by_path('foo') + end + def test_self_attribute_names expected_value = %w[ authors @@ -449,6 +836,25 @@ dependencies: [] assert_equal %w[a], Gem::Specification.outdated end + def test_self_outdated_and_latest_remotes + util_clear_gems + util_setup_fake_fetcher true + + a4 = quick_gem @a1.name, '4' + util_build_gem a4 + b3 = quick_gem @b2.name, '3' + util_build_gem b3 + util_setup_spec_fetcher @a1, @a2, @a3a, a4, @b2, b3 + + Gem::Specification.remove_spec @a1 + Gem::Specification.remove_spec @a2 + Gem::Specification.remove_spec a4 + Gem::Specification.remove_spec b3 + + assert_equal [[@a3a, a4.version], [@b2, b3.version]], + Gem::Specification.outdated_and_latest_version.to_a + end + DATA_PATH = File.expand_path "../data", __FILE__ def test_handles_private_null_type @@ -1022,19 +1428,60 @@ dependencies: [] assert_equal %w[lib], @a1.require_paths end + def test_require_already_activated + save_loaded_features do + a1 = new_spec "a", "1", nil, "lib/d.rb" + + install_specs a1 # , a2, b1, b2, c1, c2 + + a1.activate + assert_equal %w(a-1), loaded_spec_names + assert_equal [], unresolved_names + + assert require "d" + + assert_equal %w(a-1), loaded_spec_names + assert_equal [], unresolved_names + end + end + + def test_require_already_activated_indirect_conflict + save_loaded_features do + a1 = new_spec "a", "1", "b" => "> 0" + a2 = new_spec "a", "2", "b" => "> 0" + b1 = new_spec "b", "1", "c" => ">= 1" + b2 = new_spec "b", "2", "c" => ">= 2" + c1 = new_spec "c", "1", nil, "lib/d.rb" + c2 = new_spec("c", "2", { "a" => "1" }, "lib/d.rb") # conflicts with a-2 + + install_specs a1, a2, b1, b2, c1, c2 + + a1.activate + c1.activate + assert_equal %w(a-1 c-1), loaded_spec_names + assert_equal ["b (> 0)"], unresolved_names + + assert require "d" + + assert_equal %w(a-1 c-1), loaded_spec_names + assert_equal ["b (> 0)"], unresolved_names + end + end + def test_requirements assert_equal ['A working computer'], @a1.requirements end def test_runtime_dependencies_legacy + make_spec_c1 # legacy gems don't have a type - @a1.runtime_dependencies.each do |dep| + @c1.runtime_dependencies.each do |dep| dep.instance_variable_set :@type, nil end expected = %w[rake jabber4r pqa] - assert_equal expected, @a1.runtime_dependencies.map { |d| d.name } + assert_equal expected, @c1.runtime_dependencies.map { |d| d.name } end def test_spaceship_name @@ -1088,11 +1535,13 @@ dependencies: [] @a2.add_runtime_dependency 'b', '1' @a2.dependencies.first.instance_variable_set :@type, nil @a2.required_rubygems_version = Gem::Requirement.new '> 0' + @a2.require_paths << "lib/a/ext" ruby_code = @a2.to_ruby expected = <<-SPEC # -*- encoding: utf-8 -*- +# stub: a 2 ruby lib\0lib/a/ext Gem::Specification.new do |s| s.name = "a" @@ -1105,7 +1554,7 @@ Gem::Specification.new do |s| s.email = "example@example.com" s.files = ["lib/code.rb"] s.homepage = "http://example.com" - s.require_paths = ["lib"] + s.require_paths = ["lib", "lib/a/ext"] s.rubygems_version = "#{Gem::VERSION}" s.summary = "this is a summary" @@ -1140,6 +1589,7 @@ end expected = <<-SPEC # -*- encoding: utf-8 -*- +# stub: a 2 ruby lib Gem::Specification.new do |s| s.name = "a" @@ -1179,14 +1629,17 @@ end end def test_to_ruby_fancy - @a1.platform = Gem::Platform.local - ruby_code = @a1.to_ruby + make_spec_c1 + + @c1.platform = Gem::Platform.local + ruby_code = @c1.to_ruby local = Gem::Platform.local expected_platform = "[#{local.cpu.inspect}, #{local.os.inspect}, #{local.version.inspect}]" expected = <<-SPEC # -*- encoding: utf-8 -*- +# stub: a 1 #{win_platform? ? "x86-mswin32-60" : "x86-darwin-8"} lib Gem::Specification.new do |s| s.name = "a" @@ -1234,7 +1687,7 @@ end same_spec = eval ruby_code - assert_equal @a1, same_spec + assert_equal @c1, same_spec end def test_to_ruby_legacy @@ -1886,6 +2339,7 @@ end def test_metadata_specs valid_ruby_spec = <<-EOF # -*- encoding: utf-8 -*- +# stub: m 1 ruby lib Gem::Specification.new do |s| s.name = "m" diff --git a/test/rubygems/test_gem_uninstaller.rb b/test/rubygems/test_gem_uninstaller.rb index 948318a5e3..1739614c67 100644 --- a/test/rubygems/test_gem_uninstaller.rb +++ b/test/rubygems/test_gem_uninstaller.rb @@ -5,6 +5,7 @@ class TestGemUninstaller < Gem::InstallerTestCase def setup super + common_installer_setup build_rake_in do use_ui ui do @@ -375,6 +376,19 @@ class TestGemUninstaller < Gem::InstallerTestCase assert_equal "Successfully uninstalled q-1.0", lines.shift end + def test_uninstall_doesnt_prompt_and_raises_when_abort_on_dependent_set + quick_gem 'r', '1' do |s| s.add_dependency 'q', '= 1' end + quick_gem 'q', '1' + + un = Gem::Uninstaller.new('q', :abort_on_dependent => true) + ui = Gem::MockGemUi.new("y\n") + + assert_raises Gem::DependencyRemovalException do + use_ui ui do + un.uninstall + end + end + end def test_uninstall_prompt_includes_dep_type quick_gem 'r', '1' do |s| diff --git a/test/rubygems/test_gem_version.rb b/test/rubygems/test_gem_version.rb index da3b87dbca..2ba196e48d 100644 --- a/test/rubygems/test_gem_version.rb +++ b/test/rubygems/test_gem_version.rb @@ -122,6 +122,15 @@ class TestGemVersion < Gem::TestCase assert_equal "5.2.4", v("5.2.4").to_s end + def test_semver + assert_less_than "1.0.0-alpha", "1.0.0-alpha.1" + assert_less_than "1.0.0-alpha.1", "1.0.0-beta.2" + assert_less_than "1.0.0-beta.2", "1.0.0-beta.11" + assert_less_than "1.0.0-beta.11", "1.0.0-rc.1" + assert_less_than "1.0.0-rc1", "1.0.0" + assert_less_than "1.0.0-1", "1" + end + # Asserts that +version+ is a prerelease. def assert_prerelease version @@ -161,6 +170,12 @@ class TestGemVersion < Gem::TestCase assert second.eql?(first), "#{second} is eql? #{first}" end + def assert_less_than left, right + l = v(left) + r = v(right) + assert l < r, "#{left} not less than #{right}" + end + # Refute the assumption that +version+ is a prerelease. def refute_prerelease version diff --git a/test/rubygems/test_gem_version_option.rb b/test/rubygems/test_gem_version_option.rb index cbe819c22e..d6035ab800 100644 --- a/test/rubygems/test_gem_version_option.rb +++ b/test/rubygems/test_gem_version_option.rb @@ -80,7 +80,69 @@ class TestGemVersionOption < Gem::TestCase @cmd.handle_options %w[--version >1] - expected = { :version => Gem::Requirement.new('> 1'), :args => [] } + expected = { + :args => [], + :explicit_prerelease => false, + :prerelease => false, + :version => Gem::Requirement.new('> 1'), + } + + assert_equal expected, @cmd.options + end + + def test_version_option_compound + @cmd.add_version_option + + @cmd.handle_options ['--version', '< 1, > 0.9'] + + expected = { + :args => [], + :explicit_prerelease => false, + :prerelease => false, + :version => Gem::Requirement.new('< 1', '> 0.9'), + } + + assert_equal expected, @cmd.options + end + + def test_version_option_explicit_prerelease + @cmd.add_prerelease_option + @cmd.add_version_option + + @cmd.handle_options %w[--pre --version >1] + + expected = { + :args => [], + :explicit_prerelease => true, + :prerelease => true, + :version => Gem::Requirement.new('> 1'), + } + + assert_equal expected, @cmd.options + end + + def test_version_option_twice + @cmd.add_version_option + + @cmd.handle_options %w[--version >1.a] + + expected = { + :args => [], + :explicit_prerelease => false, + :prerelease => true, + :version => Gem::Requirement.new('> 1.a'), + } + + assert_equal expected, @cmd.options + + @cmd.handle_options %w[--version >1] + + expected = { + :args => [], + :explicit_prerelease => false, + :prerelease => false, + :version => Gem::Requirement.new('> 1'), + } assert_equal expected, @cmd.options end -- cgit v1.2.3