rubygems-update 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rubygems-update might be problematic. Click here for more details.

Files changed (96) hide show
  1. data/ChangeLog +2335 -0
  2. data/README +54 -0
  3. data/Rakefile +293 -0
  4. data/Releases +98 -0
  5. data/TODO +7 -0
  6. data/bin/gem +11 -0
  7. data/bin/gem_server +111 -0
  8. data/bin/generate_yaml_index.rb +58 -0
  9. data/bin/update_rubygems +18 -0
  10. data/doc/doc.css +73 -0
  11. data/doc/makedoc.rb +4 -0
  12. data/examples/application/an-app.gemspec +26 -0
  13. data/examples/application/bin/myapp +3 -0
  14. data/examples/application/lib/somefunctionality.rb +3 -0
  15. data/gemspecs/README +4 -0
  16. data/gemspecs/cgikit-1.1.0.gemspec +18 -0
  17. data/gemspecs/jabber4r.gemspec +26 -0
  18. data/gemspecs/linguistics.gemspec +22 -0
  19. data/gemspecs/ook.gemspec +21 -0
  20. data/gemspecs/progressbar.gemspec +22 -0
  21. data/gemspecs/redcloth.gemspec +22 -0
  22. data/gemspecs/rublog.gemspec +23 -0
  23. data/gemspecs/ruby-doom.gemspec +21 -0
  24. data/gemspecs/rubyjdwp.gemspec +21 -0
  25. data/gemspecs/statistics.gemspec +21 -0
  26. data/lib/rubygems.rb +353 -0
  27. data/lib/rubygems/builder.rb +54 -0
  28. data/lib/rubygems/cmd_manager.rb +127 -0
  29. data/lib/rubygems/command.rb +191 -0
  30. data/lib/rubygems/config_file.rb +57 -0
  31. data/lib/rubygems/doc_manager.rb +94 -0
  32. data/lib/rubygems/format.rb +65 -0
  33. data/lib/rubygems/gem_commands.rb +925 -0
  34. data/lib/rubygems/gem_runner.rb +23 -0
  35. data/lib/rubygems/installer.rb +621 -0
  36. data/lib/rubygems/loadpath_manager.rb +108 -0
  37. data/lib/rubygems/old_format.rb +150 -0
  38. data/lib/rubygems/open-uri.rb +604 -0
  39. data/lib/rubygems/package.rb +740 -0
  40. data/lib/rubygems/remote_installer.rb +499 -0
  41. data/lib/rubygems/rubygems_version.rb +6 -0
  42. data/lib/rubygems/source_index.rb +130 -0
  43. data/lib/rubygems/specification.rb +613 -0
  44. data/lib/rubygems/user_interaction.rb +176 -0
  45. data/lib/rubygems/validator.rb +148 -0
  46. data/lib/rubygems/version.rb +279 -0
  47. data/lib/ubygems.rb +4 -0
  48. data/pkgs/sources/lib/sources.rb +6 -0
  49. data/pkgs/sources/sources.gemspec +14 -0
  50. data/post-install.rb +75 -0
  51. data/redist/session.gem +433 -0
  52. data/scripts/buildtests.rb +25 -0
  53. data/scripts/gemdoc.rb +62 -0
  54. data/scripts/runtest.rb +17 -0
  55. data/scripts/specdoc.rb +164 -0
  56. data/setup.rb +1360 -0
  57. data/test/bogussources.rb +5 -0
  58. data/test/data/legacy/keyedlist-0.4.0.ruby +11 -0
  59. data/test/data/legacy/keyedlist-0.4.0.yaml +16 -0
  60. data/test/data/lib/code.rb +1 -0
  61. data/test/data/one/README.one +1 -0
  62. data/test/data/one/lib/one.rb +3 -0
  63. data/test/data/one/one.gemspec +17 -0
  64. data/test/data/one/one.yaml +40 -0
  65. data/test/functional.rb +145 -0
  66. data/test/gemenvironment.rb +45 -0
  67. data/test/gemutilities.rb +18 -0
  68. data/test/insure_session.rb +46 -0
  69. data/test/mock/gems/gems/sources-0.0.1/lib/sources.rb +5 -0
  70. data/test/mock/gems/specifications/sources-0.0.1.gemspec +8 -0
  71. data/test/mockgemui.rb +45 -0
  72. data/test/onegem.rb +23 -0
  73. data/test/simple_gem.rb +66 -0
  74. data/test/test_builder.rb +13 -0
  75. data/test/test_cached_fetcher.rb +60 -0
  76. data/test/test_check_command.rb +28 -0
  77. data/test/test_command.rb +130 -0
  78. data/test/test_configfile.rb +36 -0
  79. data/test/test_format.rb +70 -0
  80. data/test/test_gemloadpaths.rb +45 -0
  81. data/test/test_gempaths.rb +115 -0
  82. data/test/test_loadmanager.rb +40 -0
  83. data/test/test_local_cache.rb +157 -0
  84. data/test/test_package.rb +600 -0
  85. data/test/test_parse_commands.rb +179 -0
  86. data/test/test_process_commands.rb +21 -0
  87. data/test/test_remote_fetcher.rb +162 -0
  88. data/test/test_remote_installer.rb +154 -0
  89. data/test/test_source_index.rb +58 -0
  90. data/test/test_specification.rb +286 -0
  91. data/test/test_validator.rb +53 -0
  92. data/test/test_version_comparison.rb +204 -0
  93. data/test/testgem.rc +6 -0
  94. data/test/user_capture.rb +1 -0
  95. data/test/yaml_data.rb +59 -0
  96. metadata +151 -0
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'fileutils'
5
+ require 'rubygems'
6
+
7
+ class TestGemPaths < Test::Unit::TestCase
8
+ def setup
9
+ Gem.clear_paths
10
+ ENV['GEM_HOME'] = nil
11
+ ENV['GEM_PATH'] = nil
12
+ end
13
+
14
+ def teardown
15
+ setup
16
+ end
17
+
18
+ DEFAULT_DIR_RE = %r{/ruby/gems/[0-9.]+}
19
+ TEST_GEMDIR = 'test/temp/gemdir'
20
+
21
+ def test_default_dir
22
+ assert_match DEFAULT_DIR_RE, Gem.dir
23
+ end
24
+
25
+ def test_default_dir_subdirectories
26
+ Gem::DIRECTORIES.each do |filename|
27
+ assert File.exists?(File.join(Gem.dir, filename)), "expected #{filename} to exist"
28
+ end
29
+ end
30
+
31
+ def test_gem_home
32
+ ENV['GEM_HOME'] = TEST_GEMDIR
33
+ assert_equal TEST_GEMDIR, Gem.dir
34
+ end
35
+
36
+ def test_gem_home_subdirectories
37
+ ENV['GEM_HOME'] = TEST_GEMDIR
38
+ ['cache', 'doc', 'gems', 'specifications'].each do |filename|
39
+ assert File.exists?(File.join(TEST_GEMDIR, filename)), "expected #{filename} to exist"
40
+ end
41
+ end
42
+
43
+ def test_default_path
44
+ assert_equal [Gem.dir], Gem.path
45
+ end
46
+
47
+ ADDITIONAL = ['test/temp/a', 'test/temp/b']
48
+
49
+ def test_additional_paths
50
+ create_additional_gem_dirs
51
+ ENV['GEM_PATH'] = ADDITIONAL.join(File::PATH_SEPARATOR)
52
+ assert_equal ADDITIONAL, Gem.path[0,2]
53
+ assert_equal 3, Gem.path.size
54
+ assert_match DEFAULT_DIR_RE, Gem.path.last
55
+ end
56
+
57
+ def test_dir_path_overlap
58
+ create_additional_gem_dirs
59
+ ENV['GEM_HOME'] = 'test/temp/gemdir'
60
+ ENV['GEM_PATH'] = ADDITIONAL.join(File::PATH_SEPARATOR)
61
+ assert_equal 'test/temp/gemdir', Gem.dir
62
+ assert_equal ADDITIONAL + [Gem.dir], Gem.path
63
+ end
64
+
65
+ def test_dir_path_overlaping_duplicates_removed
66
+ create_additional_gem_dirs
67
+ dirs = ['test/temp/gemdir'] + ADDITIONAL + ['test/temp/a']
68
+ ENV['GEM_HOME'] = 'test/temp/gemdir'
69
+ ENV['GEM_PATH'] = dirs.join(File::PATH_SEPARATOR)
70
+ assert_equal 'test/temp/gemdir', Gem.dir
71
+ assert_equal [Gem.dir] + ADDITIONAL, Gem.path
72
+ end
73
+
74
+ def test_path_use_home
75
+ create_additional_gem_dirs
76
+ Gem.use_paths("test/temp/gemdir")
77
+ assert_equal "test/temp/gemdir", Gem.dir
78
+ assert_equal [Gem.dir], Gem.path
79
+ end
80
+
81
+ def test_path_use_home_and_dirs
82
+ create_additional_gem_dirs
83
+ Gem.use_paths("test/temp/gemdir", ADDITIONAL)
84
+ assert_equal "test/temp/gemdir", Gem.dir
85
+ assert_equal ADDITIONAL+[Gem.dir], Gem.path
86
+ end
87
+
88
+ def test_user_home
89
+ if ENV['HOME']
90
+ assert_equal ENV['HOME'], Gem.user_home
91
+ end
92
+ end
93
+
94
+ private
95
+
96
+ def create_additional_gem_dirs
97
+ create_gem_dir('test/temp/gemdir')
98
+ ADDITIONAL.each do |dir| create_gem_dir(dir) end
99
+ end
100
+
101
+ def create_gem_dir(fn)
102
+ Gem::DIRECTORIES.each do |subdir|
103
+ FileUtils.mkdir_p(File.join(fn, subdir))
104
+ end
105
+ end
106
+
107
+ def redirect_stderr(io)
108
+ old_err = $stderr
109
+ $stderr = io
110
+ yield
111
+ ensure
112
+ $stderr = old_err
113
+ end
114
+ end
115
+
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'rubygems/loadpath_manager'
5
+ require 'rubygems/builder'
6
+
7
+ require 'test/gemenvironment'
8
+
9
+ class TestLoadPathManager < Test::Unit::TestCase
10
+ def setup
11
+ TestEnvironment.create
12
+ Gem.clear_paths
13
+ Gem.use_paths("test/data/gemhome")
14
+ end
15
+
16
+ def teardown
17
+ Gem.clear_paths
18
+ end
19
+
20
+ def test_build_paths
21
+ assert defined?(Gem::LoadPathManager)
22
+ Gem::LoadPathManager.build_paths
23
+ assert_equal [
24
+ "test/data/gemhome/gems/a-0.0.2/lib",
25
+ "test/data/gemhome/gems/a-0.0.1/lib",
26
+ "test/data/gemhome/gems/b-0.0.2/lib",
27
+ "test/data/gemhome/gems/c-1.2/lib"
28
+ ], Gem::LoadPathManager.paths
29
+ end
30
+
31
+ def test_search_loadpath
32
+ assert Gem::LoadPathManager.search_loadpath("test/unit")
33
+ assert ! Gem::LoadPathManager.search_loadpath("once_in_a_blue_moon")
34
+ end
35
+
36
+ def test_search_gempath
37
+ assert Gem::LoadPathManager.search_gempath("code")
38
+ assert ! Gem::LoadPathManager.search_gempath("once_in_a_blue_moon")
39
+ end
40
+ end
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'rubygems/remote_installer'
5
+ require 'test/gemutilities'
6
+
7
+ class TestLocalCache < Test::Unit::TestCase
8
+ GEMHOME = "test/temp/gemhome"
9
+ GEMCACHE = File.join(GEMHOME, "source_cache")
10
+ USRCACHE = "test/temp/.gem/user_cache"
11
+
12
+ def setup
13
+ ENV['GEMCACHE'] = USRCACHE
14
+ Gem.use_paths("test/temp/gemhome")
15
+ end
16
+
17
+ def teardown
18
+ FileUtils.chmod(0644, GEMCACHE) if File.exist? GEMCACHE
19
+ FileUtils.chmod(0644, USRCACHE) if File.exist? USRCACHE
20
+ ENV['GEMCACHE'] = nil
21
+ Gem.clear_paths
22
+ end
23
+
24
+ def test_file_names
25
+ lc = Gem::LocalSourceInfoCache.new
26
+ assert_equal File.join(Gem.dir, "source_cache"), lc.system_cache_file
27
+ assert_equal USRCACHE, lc.user_cache_file
28
+ end
29
+
30
+ def test_gem_cache_env_variable
31
+ lc = Gem::LocalSourceInfoCache.new
32
+ assert_equal USRCACHE, lc.user_cache_file
33
+ end
34
+
35
+ def test_use_system_by_default
36
+ lc = Gem::LocalSourceInfoCache.new
37
+ prep_cache_files(lc)
38
+ assert_equal "sys", lc.cache_data['key']
39
+ end
40
+
41
+ def test_use_user_cache_when_sys_no_writable
42
+ lc = Gem::LocalSourceInfoCache.new
43
+ prep_cache_files(lc)
44
+ FileUtils.chmod 0544, lc.system_cache_file
45
+
46
+ lc = Gem::LocalSourceInfoCache.new
47
+ assert_equal "usr", lc.cache_data['key']
48
+ end
49
+
50
+ def test_write_system_cache
51
+ lc = Gem::LocalSourceInfoCache.new
52
+ prep_cache_files(lc)
53
+
54
+ lc.cache_data['key'] = 'new'
55
+ lc.write_cache
56
+
57
+ assert_equal [['key', 'new']].sort, read_cache(lc.system_cache_file).to_a.sort
58
+ assert_equal [['key', 'usr']].sort, read_cache(lc.user_cache_file).to_a.sort
59
+ end
60
+
61
+ def test_flush
62
+ lc = Gem::LocalSourceInfoCache.new
63
+ prep_cache_files(lc)
64
+
65
+ lc.cache_data['key'] = 'new'
66
+ lc.update
67
+ lc.flush
68
+
69
+ assert_equal [['key','new']].sort, read_cache(lc.system_cache_file).to_a.sort
70
+ end
71
+
72
+ def test_write_user_cache
73
+ lc = Gem::LocalSourceInfoCache.new
74
+ prep_cache_files(lc)
75
+ FileUtils.chmod 0544, lc.system_cache_file
76
+ lc.cache_data['key'] = 'new'
77
+ lc.write_cache
78
+
79
+ assert_equal [['key', 'sys']].sort, read_cache(lc.system_cache_file).to_a.sort
80
+ assert_equal [['key', 'new']].sort, read_cache(lc.user_cache_file).to_a.sort
81
+ end
82
+
83
+ def test_write_user_cache_from_scratch
84
+ lc = Gem::LocalSourceInfoCache.new
85
+ prep_cache_files(lc)
86
+ FileUtils.rm_rf lc.user_cache_file
87
+ FileUtils.chmod 0544, lc.system_cache_file
88
+
89
+ lc.cache_data['key'] = 'new'
90
+ lc.write_cache
91
+
92
+ assert_equal [['key', 'sys']].sort, read_cache(lc.system_cache_file).to_a.sort
93
+ assert_equal [['key', 'new']].sort, read_cache(lc.user_cache_file).to_a.sort
94
+ end
95
+
96
+ def test_write_user_directory_and_cache_from_scratch
97
+ lc = Gem::LocalSourceInfoCache.new
98
+ prep_cache_files(lc)
99
+ FileUtils.rm_rf File.dirname(lc.user_cache_file)
100
+ FileUtils.chmod 0544, lc.system_cache_file
101
+
102
+ lc.cache_data['key'] = 'new'
103
+ lc.write_cache
104
+
105
+ assert_equal [['key','sys']].sort, read_cache(lc.system_cache_file).to_a.sort
106
+ assert_equal [['key','new']].sort, read_cache(lc.user_cache_file).to_a.sort
107
+ end
108
+
109
+ def test_read_system_cache
110
+ lc = Gem::LocalSourceInfoCache.new
111
+ prep_cache_files(lc)
112
+
113
+ assert_equal [['key','sys']].sort, lc.cache_data.to_a.sort
114
+ end
115
+
116
+ def test_read_user_cache
117
+ lc = Gem::LocalSourceInfoCache.new
118
+ prep_cache_files(lc)
119
+ FileUtils.chmod 0544, lc.system_cache_file
120
+
121
+ assert_equal [['key','usr']].sort, lc.cache_data.to_a.sort
122
+ end
123
+
124
+ def test_no_writable_cache
125
+ lc = Gem::LocalSourceInfoCache.new
126
+ prep_cache_files(lc)
127
+ FileUtils.chmod 0544, lc.system_cache_file
128
+ FileUtils.chmod 0544, lc.user_cache_file
129
+ assert_raise(RuntimeError) {
130
+ lc.cache_data
131
+ }
132
+ end
133
+
134
+ private
135
+
136
+ def prep_cache_files(lc)
137
+ [ [lc.system_cache_file, 'sys'],
138
+ [lc.user_cache_file, 'usr'],
139
+ ].each do |fn, data|
140
+ FileUtils.mkdir_p File.dirname(fn)
141
+ open(fn, "w") { |f| f.puts({'key' => data}.to_yaml) }
142
+ end
143
+ end
144
+
145
+ def age_file(file_to_age, ref_file)
146
+ while File.stat(file_to_age).mtime <= File.stat(ref_file).mtime
147
+ sleep 0.2
148
+ FileUtils.touch(file_to_age)
149
+ end
150
+ end
151
+
152
+ def read_cache(fn)
153
+ open(fn) { |f| YAML.load(f) }
154
+ end
155
+
156
+ end
157
+
@@ -0,0 +1,600 @@
1
+
2
+ require 'rubygems'
3
+ Gem::manage_gems
4
+ require 'rubygems/package'
5
+ require 'test/unit'
6
+ require 'stringio'
7
+
8
+
9
+ class File
10
+ # straight from setup.rb
11
+ def File.dir?(path)
12
+ # for corrupted windows stat()
13
+ File.directory?((path[-1,1] == '/') ? path : path + '/')
14
+ end
15
+
16
+ def File.read_b(name)
17
+ File.open(name, "rb"){|f| f.read}
18
+ end
19
+ end
20
+
21
+ module TarTester
22
+ private
23
+ def assert_headers_equal(h1, h2)
24
+ fields = %w[name 100 mode 8 uid 8 gid 8 size 12 mtime 12 checksum 8
25
+ typeflag 1 linkname 100 magic 6 version 2 uname 32
26
+ gname 32 devmajor 8 devminor 8 prefix 155]
27
+ offset = 0
28
+ until fields.empty?
29
+ name = fields.shift
30
+ length = fields.shift.to_i
31
+ if name == "checksum"
32
+ chksum_off = offset
33
+ offset += length
34
+ next
35
+ end
36
+ assert_equal(h1[offset, length], h2[offset, length],
37
+ "Field #{name} of the tar header differs.")
38
+ offset += length
39
+ end
40
+ assert_equal(h1[chksum_off, 8], h2[chksum_off, 8])
41
+ end
42
+
43
+ def tar_file_header(fname, dname, mode, length)
44
+ h = header("0", fname, dname, length, mode)
45
+ checksum = calc_checksum(h)
46
+ header("0", fname, dname, length, mode, checksum)
47
+ end
48
+
49
+ def tar_dir_header(name, prefix, mode)
50
+ h = header("5", name, prefix, 0, mode)
51
+ checksum = calc_checksum(h)
52
+ header("5", name, prefix, 0, mode, checksum)
53
+ end
54
+
55
+ def header(type, fname, dname, length, mode, checksum = nil)
56
+ # struct tarfile_entry_posix {
57
+ # char name[100]; # ASCII + (Z unless filled)
58
+ # char mode[8]; # 0 padded, octal null
59
+ # char uid[8]; # ditto
60
+ # char gid[8]; # ditto
61
+ # char size[12]; # 0 padded, octal, null
62
+ # char mtime[12]; # 0 padded, octal, null
63
+ # char checksum[8]; # 0 padded, octal, null and space
64
+ # char typeflag[1]; # file: "0" dir: "5"
65
+ # char linkname[100]; # ASCII + (Z unless filled)
66
+ # char magic[6]; # "ustar\0"
67
+ # char version[2]; # "00"
68
+ # char uname[32]; # ASCIIZ
69
+ # char gname[32]; # ASCIIZ
70
+ # char devmajor[8]; # 0 padded, octal, null
71
+ # char devminor[8]; # o padded, octal, null
72
+ # char prefix[155]; # ASCII + (Z unless filled)
73
+ # };
74
+
75
+ checksum ||= " " * 8
76
+ arr = [ASCIIZ(fname, 100), Z(to_oct(mode, 7)), Z(to_oct(0, 7)),
77
+ Z(to_oct(0,7)), Z(to_oct(length, 11)), Z(to_oct(0,11)),
78
+ checksum, type, "\0" * 100, "ustar\0", "00", ASCIIZ("wheel", 32),
79
+ ASCIIZ("wheel", 32), Z(to_oct(0,7)), Z(to_oct(0,7)),
80
+ ASCIIZ(dname, 155) ]
81
+ arr = arr.join("").split(//).map{|x| x[0]}
82
+ h = arr.pack("C100C8C8C8C12C12" + # name, mode, uid, gid, size, mtime
83
+ "C8CC100C6C2" + # checksum, typeflag, linkname, magic, version
84
+ "C32C32C8C8C155") # uname, gname, devmajor, devminor, prefix
85
+ ret = h + "\0" * (512 - h.size)
86
+ assert_equal(512, ret.size)
87
+ ret
88
+ end
89
+
90
+ def calc_checksum(header)
91
+ sum = header.unpack("C*").inject{|s,a| s + a}
92
+ SP(Z(to_oct(sum, 6)))
93
+ end
94
+
95
+ def to_oct(n, pad_size)
96
+ "%0#{pad_size}o" % n
97
+ end
98
+
99
+ def ASCIIZ(str, length)
100
+ str + "\0" * (length - str.length)
101
+ end
102
+
103
+ def SP(s)
104
+ s + " "
105
+ end
106
+
107
+ def Z(s)
108
+ s + "\0"
109
+ end
110
+
111
+ def SP_Z(s)
112
+ s + " \0"
113
+ end
114
+ end
115
+
116
+ class TC_TarHeader < Test::Unit::TestCase
117
+ include Gem::Package
118
+ include TarTester
119
+
120
+ def test_arguments_are_checked
121
+ e = Gem::Package::ArgumentError
122
+ assert_raises(e){TarHeader.new :name=>"", :size=>"", :mode=>"" }
123
+ assert_raises(e){TarHeader.new :name=>"", :size=>"", :prefix=>"" }
124
+ assert_raises(e){TarHeader.new :name=>"", :prefix=>"", :mode=>"" }
125
+ assert_raises(e){TarHeader.new :prefix=>"", :size=>"", :mode=>"" }
126
+ end
127
+
128
+ def test_basic_headers
129
+ assert_headers_equal(tar_file_header("bla", "", 012345, 10),
130
+ TarHeader.new(:name => "bla", :mode => 012345,
131
+ :size => 10, :prefix => "").to_s)
132
+ assert_headers_equal(tar_dir_header("bla", "", 012345),
133
+ TarHeader.new(:name => "bla", :mode => 012345,
134
+ :size => 0, :prefix => "",
135
+ :typeflag => "5" ).to_s)
136
+ end
137
+
138
+ def test_long_name_works
139
+ assert_headers_equal(tar_file_header("a" * 100, "", 012345, 10),
140
+ TarHeader.new(:name => "a" * 100, :mode => 012345,
141
+ :size => 10, :prefix => "").to_s)
142
+ assert_headers_equal(tar_file_header("a" * 100, "bb" * 60,
143
+ 012345, 10),
144
+ TarHeader.new(:name => "a" * 100, :mode => 012345,
145
+ :size => 10, :prefix => "bb" * 60).to_s)
146
+ end
147
+
148
+ def test_new_from_stream
149
+ header = tar_file_header("a" * 100, "", 012345, 10)
150
+ h = nil
151
+ header = StringIO.new header
152
+ assert_nothing_raised{ h = TarHeader.new_from_stream header }
153
+ assert_equal("a" * 100, h.name)
154
+ assert_equal(012345, h.mode)
155
+ assert_equal(10, h.size)
156
+ assert_equal("", h.prefix)
157
+ assert_equal("ustar", h.magic)
158
+ end
159
+ end
160
+
161
+
162
+ class TC_TarWriter < Test::Unit::TestCase
163
+ include Gem::Package
164
+ include TarTester
165
+ require 'stringio'
166
+ class DummyIO
167
+ attr_reader :data
168
+ def initialize
169
+ @data = ""
170
+ end
171
+ def write(dat)
172
+ data << dat
173
+ dat.size
174
+ end
175
+ def reset
176
+ @data = ""
177
+ end
178
+ end
179
+
180
+ def setup
181
+ @data = "a" * 10
182
+ @dummyos = DummyIO.new
183
+ @os = TarWriter.new(@dummyos)
184
+ end
185
+
186
+ def teardown
187
+ @os.close
188
+ end
189
+
190
+ def test_add_file_simple
191
+ @dummyos.reset
192
+ TarWriter.new(@dummyos) do |os|
193
+ os.add_file_simple("lib/foo/bar", 0644, 10) {|f| f.write "a" * 10 }
194
+ os.add_file_simple("lib/bar/baz", 0644, 100) {|f| f.write "fillme"}
195
+ end
196
+ assert_headers_equal(tar_file_header("lib/foo/bar", "", 0644, 10),
197
+ @dummyos.data[0,512])
198
+ assert_equal("a" * 10 + "\0" * 502, @dummyos.data[512,512])
199
+ assert_headers_equal(tar_file_header("lib/bar/baz", "", 0644, 100),
200
+ @dummyos.data[512*2,512])
201
+ assert_equal("fillme" + "\0" * 506, @dummyos.data[512*3,512])
202
+ assert_equal("\0" * 512, @dummyos.data[512*4, 512])
203
+ assert_equal("\0" * 512, @dummyos.data[512*5, 512])
204
+ end
205
+
206
+ def test_write_operations_fail_after_closed
207
+ @dummyos.reset
208
+ @os.add_file_simple("sadd", 0644, 20) { |f| }
209
+ @os.close
210
+ assert_raises(ClosedIO) { @os.flush }
211
+ assert_raises(ClosedIO) { @os.add_file("dfdsf", 0644){} }
212
+ assert_raises(ClosedIO) { @os.mkdir "sdfdsf", 0644 }
213
+ end
214
+
215
+ def test_file_name_is_split_correctly
216
+ # test insane file lengths, and
217
+ # a{100}/b{155}, etc
218
+ @dummyos.reset
219
+ names = ["a" * 155 + '/' + "b" * 100, "a" * 151 + "/" + ("qwer/" * 19) + "bla" ]
220
+ o_names = ["b" * 100, "qwer/" * 19 + "bla"]
221
+ o_prefixes = ["a" * 155, "a" * 151]
222
+ names.each {|name| @os.add_file_simple(name, 0644, 10) { } }
223
+ o_names.each_with_index do |nam, i|
224
+ assert_headers_equal(tar_file_header(nam, o_prefixes[i], 0644, 10),
225
+ @dummyos.data[2*i*512,512])
226
+ end
227
+ assert_raises(TooLongFileName) do
228
+ @os.add_file_simple(File.join("a" * 152, "b" * 10, "a" * 92), 0644,10) {}
229
+ end
230
+ assert_raises(TooLongFileName) do
231
+ @os.add_file_simple(File.join("a" * 162, "b" * 10), 0644,10) {}
232
+ end
233
+ assert_raises(TooLongFileName) do
234
+ @os.add_file_simple(File.join("a" * 10, "b" * 110), 0644,10) {}
235
+ end
236
+ end
237
+
238
+ def test_add_file
239
+ dummyos = StringIO.new
240
+ class << dummyos
241
+ def method_missing(meth, *a)
242
+ self.string.send(meth, *a)
243
+ end
244
+ end
245
+ os = TarWriter.new dummyos
246
+ content1 = ('a'..'z').to_a.join("") # 26
247
+ content2 = ('aa'..'zz').to_a.join("") # 1352
248
+ TarWriter.new(dummyos) do |os|
249
+ os.add_file("lib/foo/bar", 0644) {|f| f.write "a" * 10 }
250
+ os.add_file("lib/bar/baz", 0644) {|f| f.write content1 }
251
+ os.add_file("lib/bar/baz", 0644) {|f| f.write content2 }
252
+ os.add_file("lib/bar/baz", 0644) {|f| }
253
+ end
254
+ assert_headers_equal(tar_file_header("lib/foo/bar", "", 0644, 10),
255
+ dummyos[0,512])
256
+ assert_equal("a" * 10 + "\0" * 502, dummyos[512,512])
257
+ offset = 512 * 2
258
+ [content1, content2, ""].each do |data|
259
+ assert_headers_equal(tar_file_header("lib/bar/baz", "", 0644,
260
+ data.size),
261
+ dummyos[offset,512])
262
+ offset += 512
263
+ until !data || data == ""
264
+ chunk = data[0,512]
265
+ data[0,512] = ""
266
+ assert_equal(chunk + "\0" * (512-chunk.size),
267
+ dummyos[offset,512])
268
+ offset += 512
269
+ end
270
+ end
271
+ assert_equal("\0" * 1024, dummyos[offset,1024])
272
+ end
273
+
274
+ def test_add_file_tests_seekability
275
+ assert_raises(Gem::Package::NonSeekableIO) do
276
+ @os.add_file("libdfdsfd", 0644) {|f| }
277
+ end
278
+ end
279
+
280
+ def test_write_header
281
+ @dummyos.reset
282
+ @os.add_file_simple("lib/foo/bar", 0644, 0) { |f| }
283
+ @os.flush
284
+ assert_headers_equal(tar_file_header("lib/foo/bar", "", 0644, 0),
285
+ @dummyos.data[0,512])
286
+ @dummyos.reset
287
+ @os.mkdir("lib/foo", 0644)
288
+ assert_headers_equal(tar_dir_header("lib/foo", "", 0644),
289
+ @dummyos.data[0,512])
290
+ @os.mkdir("lib/bar", 0644)
291
+ assert_headers_equal(tar_dir_header("lib/bar", "", 0644),
292
+ @dummyos.data[512*1,512])
293
+ end
294
+
295
+ def test_write_data
296
+ @dummyos.reset
297
+ @os.add_file_simple("lib/foo/bar", 0644, 10) { |f| f.write @data }
298
+ @os.flush
299
+ assert_equal(@data + ("\0" * (512-@data.size)),
300
+ @dummyos.data[512,512])
301
+ end
302
+
303
+ def test_file_size_is_checked
304
+ @dummyos.reset
305
+ assert_raises(TarWriter::FileOverflow) do
306
+ @os.add_file_simple("lib/foo/bar", 0644, 10) {|f| f.write "1" * 100}
307
+ end
308
+ assert_nothing_raised do
309
+ @os.add_file_simple("lib/foo/bar", 0644, 10) {|f| }
310
+ end
311
+ end
312
+ end
313
+
314
+
315
+ class TC_TarReader < Test::Unit::TestCase
316
+ include Gem::Package
317
+ include TarTester
318
+ require 'stringio'
319
+
320
+ def setup
321
+ end
322
+
323
+ def teardown
324
+ end
325
+
326
+ def test_multiple_entries
327
+ str = tar_file_header("lib/foo", "", 010644, 10) + "\0" * 512
328
+ str += tar_file_header("bar", "baz", 0644, 0)
329
+ str += tar_dir_header("foo", "bar", 012345)
330
+ str += "\0" * 1024
331
+ names = %w[lib/foo bar foo]
332
+ prefixes = ["", "baz", "bar"]
333
+ modes = [010644, 0644, 012345]
334
+ sizes = [10, 0, 0]
335
+ isdir = [false, false, true]
336
+ isfile = [true, true, false]
337
+ TarReader.new(StringIO.new(str)) do |is|
338
+ i = 0
339
+ is.each_entry do |entry|
340
+ assert_kind_of(TarReader::Entry, entry)
341
+ assert_equal(names[i], entry.name)
342
+ assert_equal(prefixes[i], entry.prefix)
343
+ assert_equal(sizes[i], entry.size)
344
+ assert_equal(modes[i], entry.mode)
345
+ assert_equal(isdir[i], entry.is_directory?)
346
+ assert_equal(isfile[i], entry.is_file?)
347
+ if prefixes[i] != ""
348
+ assert_equal(File.join(prefixes[i], names[i]),
349
+ entry.full_name)
350
+ else
351
+ assert_equal(names[i], entry.name)
352
+ end
353
+ i += 1
354
+ end
355
+ assert_equal(names.size, i)
356
+ end
357
+ end
358
+
359
+ def test_rewind_entry_works
360
+ content = ('a'..'z').to_a.join(" ")
361
+ str = tar_file_header("lib/foo", "", 010644, content.size) + content +
362
+ "\0" * (512 - content.size)
363
+ str << "\0" * 1024
364
+ TarReader.new(StringIO.new(str)) do |is|
365
+ is.each_entry do |entry|
366
+ 3.times do
367
+ entry.rewind
368
+ assert_equal(content, entry.read)
369
+ assert_equal(content.size, entry.pos)
370
+ end
371
+ end
372
+ end
373
+ end
374
+
375
+ def test_rewind_works
376
+ content = ('a'..'z').to_a.join(" ")
377
+ str = tar_file_header("lib/foo", "", 010644, content.size) + content +
378
+ "\0" * (512 - content.size)
379
+ str << "\0" * 1024
380
+ TarReader.new(StringIO.new(str)) do |is|
381
+ 3.times do
382
+ is.rewind
383
+ i = 0
384
+ is.each_entry do |entry|
385
+ assert_equal(content, entry.read)
386
+ i += 1
387
+ end
388
+ assert_equal(1, i)
389
+ end
390
+ end
391
+ end
392
+
393
+ def test_read_works
394
+ contents = ('a'..'z').inject(""){|s,x| s << x * 100}
395
+ str = tar_file_header("lib/foo", "", 010644, contents.size) + contents
396
+ str += "\0" * (512 - (str.size % 512))
397
+ TarReader.new(StringIO.new(str)) do |is|
398
+ is.each_entry do |entry|
399
+ assert_kind_of(TarReader::Entry, entry)
400
+ data = entry.read(3000) # bigger than contents.size
401
+ assert_equal(contents, data)
402
+ assert_equal(true, entry.eof?)
403
+ end
404
+ end
405
+ TarReader.new(StringIO.new(str)) do |is|
406
+ is.each_entry do |entry|
407
+ assert_kind_of(TarReader::Entry, entry)
408
+ data = entry.read(100)
409
+ (entry.size - data.size).times {|i| data << entry.getc.chr }
410
+ assert_equal(contents, data)
411
+ assert_equal(nil, entry.read(10))
412
+ assert_equal(true, entry.eof?)
413
+ end
414
+ end
415
+ TarReader.new(StringIO.new(str)) do |is|
416
+ is.each_entry do |entry|
417
+ assert_kind_of(TarReader::Entry, entry)
418
+ data = entry.read
419
+ assert_equal(contents, data)
420
+ assert_equal(nil, entry.read(10))
421
+ assert_equal(nil, entry.read)
422
+ assert_equal(nil, entry.getc)
423
+ assert_equal(true, entry.eof?)
424
+ end
425
+ end
426
+ end
427
+
428
+ def test_eof_works
429
+ str = tar_file_header("bar", "baz", 0644, 0)
430
+ TarReader.new(StringIO.new(str)) do |is|
431
+ is.each_entry do |entry|
432
+ assert_kind_of(TarReader::Entry, entry)
433
+ data = entry.read
434
+ assert_equal(nil, data)
435
+ assert_equal(nil, entry.read(10))
436
+ assert_equal(nil, entry.read)
437
+ assert_equal(nil, entry.getc)
438
+ assert_equal(true, entry.eof?)
439
+ end
440
+ end
441
+ str = tar_dir_header("foo", "bar", 012345)
442
+ TarReader.new(StringIO.new(str)) do |is|
443
+ is.each_entry do |entry|
444
+ assert_kind_of(TarReader::Entry, entry)
445
+ data = entry.read
446
+ assert_equal(nil, data)
447
+ assert_equal(nil, entry.read(10))
448
+ assert_equal(nil, entry.read)
449
+ assert_equal(nil, entry.getc)
450
+ assert_equal(true, entry.eof?)
451
+ end
452
+ end
453
+ str = tar_dir_header("foo", "bar", 012345)
454
+ str += tar_file_header("bar", "baz", 0644, 0)
455
+ str += tar_file_header("bar", "baz", 0644, 0)
456
+ TarReader.new(StringIO.new(str)) do |is|
457
+ is.each_entry do |entry|
458
+ assert_kind_of(TarReader::Entry, entry)
459
+ data = entry.read
460
+ assert_equal(nil, data)
461
+ assert_equal(nil, entry.read(10))
462
+ assert_equal(nil, entry.read)
463
+ assert_equal(nil, entry.getc)
464
+ assert_equal(true, entry.eof?)
465
+ end
466
+ end
467
+ end
468
+
469
+ class TC_TarInput < Test::Unit::TestCase
470
+ include Gem::Package
471
+ include TarTester
472
+ require 'rbconfig'
473
+ require 'zlib'
474
+ # Sometimes the setgid bit doesn't take. Don't know if this
475
+ # is a problem on all systems, or just some. But for now, we
476
+ # will ignore it in the tests.
477
+ SETGID_BIT = 02000
478
+ def setup
479
+ FileUtils.mkdir_p "data__"
480
+ inner_tar = tar_file_header("bla", "", 0612, 10)
481
+ inner_tar += "0123456789" + "\0" * 502
482
+ inner_tar += tar_file_header("foo", "", 0636, 5)
483
+ inner_tar += "01234" + "\0" * 507
484
+ inner_tar += tar_dir_header("__dir__", "", 0600)
485
+ inner_tar += "\0" * 1024
486
+ str = StringIO.new ""
487
+ begin
488
+ os = Zlib::GzipWriter.new str
489
+ os.write inner_tar
490
+ ensure
491
+ os.finish
492
+ end
493
+ str.rewind
494
+ File.open("data__/bla.tar", "wb") do |f|
495
+ f.write tar_file_header("data.tar.gz", "", 0644, str.string.size)
496
+ f.write str.string
497
+ f.write "\0" * ((512 - (str.string.size % 512)) % 512 )
498
+ @spec = Gem::Specification.new do |spec|
499
+ spec.author = "Mauricio :)"
500
+ end
501
+ meta = @spec.to_yaml
502
+ f.write tar_file_header("metadata", "", 0644, meta.size)
503
+ f.write meta + "\0" * (1024 - meta.size)
504
+ f.write "\0" * 1024
505
+ end
506
+ @file = "data__/bla.tar"
507
+ @entry_names = %w{bla foo __dir__}
508
+ @entry_sizes = [10, 5, 0]
509
+ #FIXME: are these modes system dependent?
510
+ @entry_modes = [0100612, 0100636, 040600]
511
+ @entry_files = %w{data__/bla data__/foo}
512
+ @entry_contents = %w[0123456789 01234]
513
+ end
514
+
515
+ def teardown
516
+ # FileUtils.rm_rf "data__"
517
+ end
518
+
519
+ def test_each_works
520
+ TarInput.open(@file) do |is|
521
+ i = 0
522
+ is.each_with_index do |entry, i|
523
+ assert_kind_of(TarReader::Entry, entry)
524
+ assert_equal(@entry_names[i], entry.name)
525
+ assert_equal(@entry_sizes[i], entry.size)
526
+ end
527
+ assert_equal(2, i)
528
+ assert_equal(@spec, is.metadata)
529
+ end
530
+ end
531
+
532
+ def test_extract_entry_works
533
+ TarInput.open(@file) do |is|
534
+ assert_equal(@spec,is.metadata)
535
+ i = 0
536
+ is.each_with_index do |entry, i|
537
+ is.extract_entry "data__", entry
538
+ name = File.join("data__", entry.name)
539
+ if entry.is_directory?
540
+ assert File.dir?(name)
541
+ else
542
+ assert File.file?(name)
543
+ assert_equal(@entry_sizes[i], File.stat(name).size)
544
+ #FIXME: win32? !!
545
+ end
546
+ unless ::Config::CONFIG["arch"] =~ /msdos|win32/i
547
+ assert_equal(@entry_modes[i],
548
+ File.stat(name).mode & (~SETGID_BIT))
549
+ end
550
+ end
551
+ assert_equal(2, i)
552
+ end
553
+ @entry_files.each_with_index do |x, i|
554
+ assert(File.file?(x))
555
+ assert_equal(@entry_contents[i], File.read_b(x))
556
+ end
557
+ end
558
+ end
559
+
560
+ class TC_TarOutput < Test::Unit::TestCase
561
+ include Gem::Package
562
+ include TarTester
563
+ require 'zlib'
564
+
565
+ def setup
566
+ FileUtils.mkdir_p "data__", :verbose=>false
567
+ @file = "data__/bla2.tar"
568
+ end
569
+
570
+ def teardown
571
+ FileUtils.rm_rf "data__"
572
+ end
573
+
574
+ require 'zlib'
575
+ def test_file_looks_good
576
+ TarOutput.open(@file) do |os|
577
+ os.metadata = "bla".to_yaml
578
+ end
579
+ f = File.open(@file, "rb")
580
+ TarReader.new(f) do |is|
581
+ i = 0
582
+ is.each do |entry|
583
+ case i
584
+ when 0
585
+ assert_equal("data.tar.gz", entry.name)
586
+ when 1
587
+ assert_equal("metadata.gz", entry.name)
588
+ gzis = Zlib::GzipReader.new entry
589
+ assert_equal("bla".to_yaml, gzis.read)
590
+ gzis.close
591
+ end
592
+ i += 1
593
+ end
594
+ assert_equal(2, i)
595
+ end
596
+ ensure
597
+ f.close
598
+ end
599
+ end
600
+ end