Re-enable spec/library for full CI runs.
[rbx.git] / lib / rubygems / test_utilities.rb
blob0486db2b320975d1f06bf73209c737e6d0b1abf1
1 require 'tempfile'
2 require 'rubygems'
3 require 'rubygems/remote_fetcher'
5 ##
6 # A fake Gem::RemoteFetcher for use in tests or to avoid real live HTTP
7 # requests when testing code that uses RubyGems.
9 # Example:
11 #   @fetcher = Gem::FakeFetcher.new
12 #   @fetcher.data['http://gems.example.com/yaml'] = source_index.to_yaml
13 #   Gem::RemoteFetcher.fetcher = @fetcher
14 #   
15 #   # invoke RubyGems code
16 #   
17 #   paths = @fetcher.paths
18 #   assert_equal 'http://gems.example.com/yaml', paths.shift
19 #   assert paths.empty?, paths.join(', ')
21 # See RubyGems' tests for more examples of FakeFetcher.
23 class Gem::FakeFetcher
25   attr_reader :data
26   attr_accessor :paths
28   def initialize
29     @data = {}
30     @paths = []
31   end
33   def fetch_path(path)
34     path = path.to_s
35     @paths << path
36     raise ArgumentError, 'need full URI' unless path =~ %r'^http://'
37     data = @data[path]
39     if data.nil? then
40       raise Gem::RemoteFetcher::FetchError.new('no data', path)
41     end
43     data.respond_to?(:call) ? data.call : data
44   end
46   def fetch_size(path)
47     path = path.to_s
48     @paths << path
49     raise ArgumentError, 'need full URI' unless path =~ %r'^http://'
50     data = @data[path]
52     if data.nil? then
53       raise Gem::RemoteFetcher::FetchError.new("no data for #{path}", nil)
54     end
56     data.respond_to?(:call) ? data.call : data.length
57   end
59   def download spec, source_uri, install_dir = Gem.dir
60     name = "#{spec.full_name}.gem"
61     path = File.join(install_dir, 'cache', name)
63     Gem.ensure_gem_subdirectories install_dir
65     if source_uri =~ /^http/ then
66       File.open(path, "wb") do |f|
67         f.write fetch_path(File.join(source_uri, "gems", name))
68       end
69     else
70       FileUtils.cp source_uri, path
71     end
73     path
74   end
76 end
78 # :stopdoc:
79 class Gem::RemoteFetcher
81   def self.fetcher=(fetcher)
82     @fetcher = fetcher
83   end
85 end
86 # :startdoc:
89 # A StringIO duck-typed class that uses Tempfile instead of String as the
90 # backing store.
91 #--
92 # This class was added to flush out problems in Rubinius' IO implementation.
94 class TempIO
96   @@count = 0
98   def initialize(string = '')
99     @tempfile = Tempfile.new "TempIO-#{@@count += 1}"
100     @tempfile.binmode
101     @tempfile.write string
102     @tempfile.rewind
103   end
105   def method_missing(meth, *args, &block)
106     @tempfile.send(meth, *args, &block)
107   end
109   def respond_to?(meth)
110     @tempfile.respond_to? meth
111   end
113   def string
114     @tempfile.flush
116     Gem.read_binary @tempfile.path
117   end