summaryrefslogtreecommitdiff
path: root/test/rubygems/gemutilities.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/rubygems/gemutilities.rb')
-rw-r--r--test/rubygems/gemutilities.rb295
1 files changed, 295 insertions, 0 deletions
diff --git a/test/rubygems/gemutilities.rb b/test/rubygems/gemutilities.rb
new file mode 100644
index 0000000000..96711be485
--- /dev/null
+++ b/test/rubygems/gemutilities.rb
@@ -0,0 +1,295 @@
+#!/usr/bin/env ruby
+#--
+# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
+# All rights reserved.
+# See LICENSE.txt for permissions.
+#++
+
+at_exit { $SAFE = 1 }
+
+require 'fileutils'
+require 'test/unit/testcase'
+require 'tmpdir'
+require 'uri'
+require 'rubygems/gem_open_uri'
+require 'rubygems/source_info_cache'
+
+require File.join(File.expand_path(File.dirname(__FILE__)), 'mockgemui')
+
+module Gem
+ def self.source_index=(si)
+ @@source_index = si
+ end
+end
+
+class FakeFetcher
+
+ attr_reader :data
+ attr_accessor :uri
+ attr_accessor :paths
+
+ def initialize
+ @data = {}
+ @paths = []
+ @uri = nil
+ end
+
+ def fetch_path(path)
+ path = path.to_s
+ @paths << path
+ raise ArgumentError, 'need full URI' unless path =~ %r'^http://'
+ data = @data[path]
+ raise OpenURI::HTTPError.new("no data for #{path}", nil) if data.nil?
+ data.respond_to?(:call) ? data.call : data
+ end
+
+ def fetch_size(path)
+ path = path.to_s
+ @paths << path
+ raise ArgumentError, 'need full URI' unless path =~ %r'^http://'
+ data = @data[path]
+ raise OpenURI::HTTPError.new("no data for #{path}", nil) if data.nil?
+ data.respond_to?(:call) ? data.call : data.length
+ end
+
+end
+
+class RubyGemTestCase < Test::Unit::TestCase
+
+ include Gem::DefaultUserInteraction
+
+ undef_method :default_test
+
+ def setup
+ super
+
+ @ui = MockGemUi.new
+ tmpdir = nil
+ Dir.chdir Dir.tmpdir do tmpdir = Dir.pwd end # HACK OSX /private/tmp
+ @tempdir = File.join tmpdir, "test_rubygems_#{$$}"
+ @tempdir.untaint
+ @gemhome = File.join @tempdir, "gemhome"
+ @gemcache = File.join(@gemhome, "source_cache")
+ @usrcache = File.join(@gemhome, ".gem", "user_cache")
+
+ FileUtils.mkdir_p @gemhome
+
+ ENV['GEMCACHE'] = @usrcache
+ Gem.use_paths(@gemhome)
+ Gem.loaded_specs.clear
+
+ Gem.configuration.verbose = true
+ Gem.configuration.update_sources = true
+
+ @gem_repo = "http://gems.example.com"
+ Gem.sources.replace [@gem_repo]
+
+ @orig_arch = Config::CONFIG['arch']
+
+ if win_platform?
+ util_set_arch 'i386-mswin32'
+ else
+ util_set_arch 'i686-darwin8.10.1'
+ end
+
+ @marshal_version = "#{Marshal::MAJOR_VERSION}.#{Marshal::MINOR_VERSION}"
+ end
+
+ def teardown
+ Config::CONFIG['arch'] = @orig_arch
+
+ if defined? Gem::RemoteFetcher then
+ Gem::RemoteFetcher.instance_variable_set :@fetcher, nil
+ end
+
+ FileUtils.rm_rf @tempdir
+
+ ENV.delete 'GEMCACHE'
+ ENV.delete 'GEM_HOME'
+ ENV.delete 'GEM_PATH'
+
+ Gem.clear_paths
+ Gem::SourceInfoCache.instance_variable_set :@cache, nil
+ end
+
+ def install_gem gem
+ require 'rubygems/installer'
+
+ use_ui MockGemUi.new do
+ Dir.chdir @tempdir do
+ Gem::Builder.new(gem).build
+ end
+ end
+
+ gem = File.join(@tempdir, "#{gem.full_name}.gem").untaint
+ Gem::Installer.new(gem).install
+ end
+
+ def prep_cache_files(lc)
+ [ [lc.system_cache_file, 'sys'],
+ [lc.user_cache_file, 'usr'],
+ ].each do |fn, data|
+ FileUtils.mkdir_p File.dirname(fn).untaint
+ open(fn.dup.untaint, "wb") { |f| f.write(Marshal.dump({'key' => data})) }
+ end
+ end
+
+ def read_cache(fn)
+ open(fn.dup.untaint) { |f| Marshal.load f.read }
+ end
+
+ def write_file(path)
+ path = File.join(@gemhome, path)
+ dir = File.dirname path
+ FileUtils.mkdir_p dir
+ File.open(path, "w") { |io|
+ yield(io)
+ }
+ path
+ end
+
+ def quick_gem(gemname, version='0.0.2')
+ require 'rubygems/specification'
+
+ spec = Gem::Specification.new do |s|
+ s.platform = Gem::Platform::RUBY
+ s.name = gemname
+ s.version = version
+ s.author = 'A User'
+ s.email = 'example@example.com'
+ s.homepage = 'http://example.com'
+ s.has_rdoc = true
+ s.summary = "this is a summary"
+ s.description = "This is a test description"
+ yield(s) if block_given?
+ end
+
+ path = File.join "specifications", "#{spec.full_name}.gemspec"
+ written_path = write_file path do |io|
+ io.write(spec.to_ruby)
+ end
+
+ spec.loaded_from = written_path
+
+ return spec
+ end
+
+ def util_build_gem(spec)
+ dir = File.join(@gemhome, 'gems', spec.full_name)
+ FileUtils.mkdir_p dir
+
+ Dir.chdir dir do
+ spec.files.each do |file|
+ next if File.exist? file
+ FileUtils.mkdir_p File.dirname(file)
+ File.open file, 'w' do |fp| fp.puts "# #{file}" end
+ end
+
+ use_ui MockGemUi.new do
+ Gem::Builder.new(spec).build
+ end
+
+ FileUtils.mv "#{spec.full_name}.gem", File.join(@gemhome, 'cache')
+ end
+ end
+
+ def util_make_gems
+ spec = proc do |s|
+ s.files = %w[lib/code.rb]
+ s.require_paths = %w[lib]
+ end
+
+ @a0_0_1 = quick_gem('a', '0.0.1', &spec)
+ @a0_0_2 = quick_gem('a', '0.0.2', &spec)
+ @b0_0_2 = quick_gem('b', '0.0.2', &spec)
+ @c1_2 = quick_gem('c', '1.2', &spec)
+
+ write_file File.join(*%w[gems a-0.0.1 lib code.rb]) do end
+ write_file File.join(*%w[gems a-0.0.2 lib code.rb]) do end
+ write_file File.join(*%w[gems b-0.0.2 lib code.rb]) do end
+ write_file File.join(*%w[gems c-1.2 lib code.rb]) do end
+
+ [@a0_0_1, @a0_0_2, @b0_0_2, @c1_2].each { |spec| util_build_gem spec }
+
+ Gem.source_index = nil
+ end
+
+ ##
+ # Set the platform to +cpu+ and +os+
+
+ def util_set_arch(arch)
+ Config::CONFIG['arch'] = arch
+ platform = Gem::Platform.new arch
+
+ Gem.instance_variable_set :@platforms, nil
+ Gem::Platform.instance_variable_set :@local, nil
+
+ platform
+ end
+
+ def util_setup_fake_fetcher
+ require 'zlib'
+ require 'socket'
+ require 'rubygems/remote_fetcher'
+
+ @uri = URI.parse @gem_repo
+ @fetcher = FakeFetcher.new
+ @fetcher.uri = @uri
+
+ @gem1 = quick_gem 'gem_one' do |gem|
+ gem.files = %w[Rakefile lib/gem_one.rb]
+ end
+
+ @gem2 = quick_gem 'gem_two' do |gem|
+ gem.files = %w[Rakefile lib/gem_two.rb]
+ end
+
+ @gem3 = quick_gem 'gem_three' do |gem| # missing gem
+ gem.files = %w[Rakefile lib/gem_three.rb]
+ end
+
+ # this gem has a higher version and longer name than the gem we want
+ @gem4 = quick_gem 'gem_one_evil', '666' do |gem|
+ gem.files = %w[Rakefile lib/gem_one.rb]
+ end
+
+ @all_gems = [@gem1, @gem2, @gem3, @gem4].sort
+ @all_gem_names = @all_gems.map { |gem| gem.full_name }
+
+ gem_names = [@gem1.full_name, @gem2.full_name, @gem4.full_name]
+ @gem_names = gem_names.sort.join("\n")
+
+ @source_index = Gem::SourceIndex.new @gem1.full_name => @gem1,
+ @gem2.full_name => @gem2,
+ @gem4.full_name => @gem4
+
+ Gem::RemoteFetcher.instance_variable_set :@fetcher, @fetcher
+ end
+
+ def util_setup_source_info_cache(*specs)
+ require 'rubygems/source_info_cache_entry'
+
+ specs = Hash[*specs.map { |spec| [spec.full_name, spec] }.flatten]
+ si = Gem::SourceIndex.new specs
+
+ sice = Gem::SourceInfoCacheEntry.new si, 0
+ sic = Gem::SourceInfoCache.new
+ sic.set_cache_data( { @gem_repo => sice } )
+ Gem::SourceInfoCache.instance_variable_set :@cache, sic
+ si
+ end
+
+ def util_zip(data)
+ Zlib::Deflate.deflate data
+ end
+
+ def self.win_platform?
+ Gem.win_platform?
+ end
+
+ def win_platform?
+ Gem.win_platform?
+ end
+
+end
+