diff options
author | drbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-03-31 22:40:06 +0000 |
---|---|---|
committer | drbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-03-31 22:40:06 +0000 |
commit | 8cc45aae947d453acca029e13eb64f3f5f0bf942 (patch) | |
tree | f9485a20c99defe1aae3f32555a41d23c2298ad8 /test/rubygems/test_gem_remote_fetcher.rb | |
parent | dc8359969ec71ece10357ba9396430db7f029e45 (diff) | |
download | ruby-8cc45aae947d453acca029e13eb64f3f5f0bf942.tar.gz |
Import RubyGems 1.1.0
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15873 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/rubygems/test_gem_remote_fetcher.rb')
-rw-r--r-- | test/rubygems/test_gem_remote_fetcher.rb | 204 |
1 files changed, 188 insertions, 16 deletions
diff --git a/test/rubygems/test_gem_remote_fetcher.rb b/test/rubygems/test_gem_remote_fetcher.rb index 5ffaed24e3..1ac71aabc2 100644 --- a/test/rubygems/test_gem_remote_fetcher.rb +++ b/test/rubygems/test_gem_remote_fetcher.rb @@ -97,6 +97,13 @@ gems: @server_uri = base_server_uri + "/yaml" @server_z_uri = base_server_uri + "/yaml.Z" + # REFACTOR: copied from test_gem_dependency_installer.rb + @gems_dir = File.join @tempdir, 'gems' + @cache_dir = File.join @gemhome, 'cache' + FileUtils.mkdir @gems_dir + + @a1, @a1_gem = util_gem 'a', '1' do |s| s.executables << 'a_bin' end + Gem::RemoteFetcher.instance_variable_set :@fetcher, nil end @@ -156,6 +163,140 @@ gems: end end + def util_fuck_with_fetcher data, blow = false + fetcher = Gem::RemoteFetcher.fetcher + fetcher.instance_variable_set :@test_data, data + + unless blow then + def fetcher.fetch_path arg + @test_arg = arg + @test_data + end + else + def fetcher.fetch_path arg + # OMG I'm such an ass + class << self; remove_method :fetch_path; end + def self.fetch_path arg + @test_arg = arg + @test_data + end + + raise Gem::RemoteFetcher::FetchError, "haha!" + end + end + + fetcher + end + + def test_download + a1_data = nil + File.open @a1_gem, 'rb' do |fp| + a1_data = fp.read + end + + fetcher = util_fuck_with_fetcher a1_data + + a1_cache_gem = File.join(@gemhome, 'cache', "#{@a1.full_name}.gem") + assert_equal a1_cache_gem, fetcher.download(@a1, 'http://gems.example.com') + assert_equal("http://gems.example.com/gems/a-1.gem", + fetcher.instance_variable_get(:@test_arg).to_s) + assert File.exist?(a1_cache_gem) + end + + def test_download_cached + FileUtils.mv @a1_gem, @cache_dir + + inst = Gem::RemoteFetcher.fetcher + + assert_equal File.join(@gemhome, 'cache', "#{@a1.full_name}.gem"), + inst.download(@a1, 'http://gems.example.com') + end + + def test_download_local + FileUtils.mv @a1_gem, @tempdir + local_path = File.join @tempdir, "#{@a1.full_name}.gem" + inst = nil + + Dir.chdir @tempdir do + inst = Gem::RemoteFetcher.fetcher + end + + assert_equal File.join(@gemhome, 'cache', "#{@a1.full_name}.gem"), + inst.download(@a1, local_path) + end + + def test_download_install_dir + a1_data = nil + File.open @a1_gem, 'rb' do |fp| + a1_data = fp.read + end + + fetcher = util_fuck_with_fetcher a1_data + + install_dir = File.join @tempdir, 'more_gems' + + a1_cache_gem = File.join install_dir, 'cache', "#{@a1.full_name}.gem" + actual = fetcher.download(@a1, 'http://gems.example.com', install_dir) + + assert_equal a1_cache_gem, actual + assert_equal("http://gems.example.com/gems/a-1.gem", + fetcher.instance_variable_get(:@test_arg).to_s) + + assert File.exist?(a1_cache_gem) + end + + unless win_platform? then # File.chmod doesn't work + def test_download_local_read_only + FileUtils.mv @a1_gem, @tempdir + local_path = File.join @tempdir, "#{@a1.full_name}.gem" + inst = nil + File.chmod 0555, File.join(@gemhome, 'cache') + + Dir.chdir @tempdir do + inst = Gem::RemoteFetcher.fetcher + end + + assert_equal File.join(@tempdir, "#{@a1.full_name}.gem"), + inst.download(@a1, local_path) + ensure + File.chmod 0755, File.join(@gemhome, 'cache') + end + end + + def test_download_platform_legacy + original_platform = 'old-platform' + + e1, e1_gem = util_gem 'e', '1' do |s| + s.platform = Gem::Platform::CURRENT + s.instance_variable_set :@original_platform, original_platform + end + + e1_data = nil + File.open e1_gem, 'rb' do |fp| + e1_data = fp.read + end + + fetcher = util_fuck_with_fetcher e1_data, :blow_chunks + + e1_cache_gem = File.join(@gemhome, 'cache', "#{e1.full_name}.gem") + + assert_equal e1_cache_gem, fetcher.download(e1, 'http://gems.example.com') + + assert_equal("http://gems.example.com/gems/#{e1.original_name}.gem", + fetcher.instance_variable_get(:@test_arg).to_s) + assert File.exist?(e1_cache_gem) + end + + def test_download_unsupported + inst = Gem::RemoteFetcher.fetcher + + e = assert_raise Gem::InstallError do + inst.download @a1, 'ftp://gems.rubyforge.org' + end + + assert_equal 'unsupported URI scheme ftp', e.message + end + def test_explicit_proxy use_ui @ui do fetcher = Gem::RemoteFetcher.new @proxy_uri @@ -232,22 +373,6 @@ gems: assert_equal 'EOFError: EOFError reading uri', e.message end - def test_fetch_path_open_uri_http_error - fetcher = Gem::RemoteFetcher.new nil - - def fetcher.open_uri_or_path(uri) - io = StringIO.new 'went boom' - err = OpenURI::HTTPError.new 'error', io - raise err - end - - e = assert_raise Gem::RemoteFetcher::FetchError do - fetcher.fetch_path 'uri' - end - - assert_equal "OpenURI::HTTPError: error reading uri\n\twent boom", e.message - end - def test_fetch_path_socket_error fetcher = Gem::RemoteFetcher.new nil @@ -324,6 +449,53 @@ gems: end end + def test_open_uri_or_path + fetcher = Gem::RemoteFetcher.new nil + + conn = Object.new + def conn.started?() true end + def conn.request(req) + unless defined? @requested then + @requested = true + res = Net::HTTPRedirection.new nil, 301, nil + res.add_field 'Location', 'http://gems.example.com/real_path' + res + else + res = Net::HTTPOK.new nil, 200, nil + def res.body() 'real_path' end + res + end + end + + conn = { 'gems.example.com:80' => conn } + fetcher.instance_variable_set :@connections, conn + + fetcher.send :open_uri_or_path, 'http://gems.example.com/redirect' do |io| + assert_equal 'real_path', io.read + end + end + + def test_open_uri_or_path_limited_redirects + fetcher = Gem::RemoteFetcher.new nil + + conn = Object.new + def conn.started?() true end + def conn.request(req) + res = Net::HTTPRedirection.new nil, 301, nil + res.add_field 'Location', 'http://gems.example.com/redirect' + res + end + + conn = { 'gems.example.com:80' => conn } + fetcher.instance_variable_set :@connections, conn + + e = assert_raise Gem::RemoteFetcher::FetchError do + fetcher.send :open_uri_or_path, 'http://gems.example.com/redirect' + end + + assert_equal 'too many redirects', e.message + end + def test_zip use_ui @ui do self.class.enable_zip = true |