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.
- data/ChangeLog +2335 -0
- data/README +54 -0
- data/Rakefile +293 -0
- data/Releases +98 -0
- data/TODO +7 -0
- data/bin/gem +11 -0
- data/bin/gem_server +111 -0
- data/bin/generate_yaml_index.rb +58 -0
- data/bin/update_rubygems +18 -0
- data/doc/doc.css +73 -0
- data/doc/makedoc.rb +4 -0
- data/examples/application/an-app.gemspec +26 -0
- data/examples/application/bin/myapp +3 -0
- data/examples/application/lib/somefunctionality.rb +3 -0
- data/gemspecs/README +4 -0
- data/gemspecs/cgikit-1.1.0.gemspec +18 -0
- data/gemspecs/jabber4r.gemspec +26 -0
- data/gemspecs/linguistics.gemspec +22 -0
- data/gemspecs/ook.gemspec +21 -0
- data/gemspecs/progressbar.gemspec +22 -0
- data/gemspecs/redcloth.gemspec +22 -0
- data/gemspecs/rublog.gemspec +23 -0
- data/gemspecs/ruby-doom.gemspec +21 -0
- data/gemspecs/rubyjdwp.gemspec +21 -0
- data/gemspecs/statistics.gemspec +21 -0
- data/lib/rubygems.rb +353 -0
- data/lib/rubygems/builder.rb +54 -0
- data/lib/rubygems/cmd_manager.rb +127 -0
- data/lib/rubygems/command.rb +191 -0
- data/lib/rubygems/config_file.rb +57 -0
- data/lib/rubygems/doc_manager.rb +94 -0
- data/lib/rubygems/format.rb +65 -0
- data/lib/rubygems/gem_commands.rb +925 -0
- data/lib/rubygems/gem_runner.rb +23 -0
- data/lib/rubygems/installer.rb +621 -0
- data/lib/rubygems/loadpath_manager.rb +108 -0
- data/lib/rubygems/old_format.rb +150 -0
- data/lib/rubygems/open-uri.rb +604 -0
- data/lib/rubygems/package.rb +740 -0
- data/lib/rubygems/remote_installer.rb +499 -0
- data/lib/rubygems/rubygems_version.rb +6 -0
- data/lib/rubygems/source_index.rb +130 -0
- data/lib/rubygems/specification.rb +613 -0
- data/lib/rubygems/user_interaction.rb +176 -0
- data/lib/rubygems/validator.rb +148 -0
- data/lib/rubygems/version.rb +279 -0
- data/lib/ubygems.rb +4 -0
- data/pkgs/sources/lib/sources.rb +6 -0
- data/pkgs/sources/sources.gemspec +14 -0
- data/post-install.rb +75 -0
- data/redist/session.gem +433 -0
- data/scripts/buildtests.rb +25 -0
- data/scripts/gemdoc.rb +62 -0
- data/scripts/runtest.rb +17 -0
- data/scripts/specdoc.rb +164 -0
- data/setup.rb +1360 -0
- data/test/bogussources.rb +5 -0
- data/test/data/legacy/keyedlist-0.4.0.ruby +11 -0
- data/test/data/legacy/keyedlist-0.4.0.yaml +16 -0
- data/test/data/lib/code.rb +1 -0
- data/test/data/one/README.one +1 -0
- data/test/data/one/lib/one.rb +3 -0
- data/test/data/one/one.gemspec +17 -0
- data/test/data/one/one.yaml +40 -0
- data/test/functional.rb +145 -0
- data/test/gemenvironment.rb +45 -0
- data/test/gemutilities.rb +18 -0
- data/test/insure_session.rb +46 -0
- data/test/mock/gems/gems/sources-0.0.1/lib/sources.rb +5 -0
- data/test/mock/gems/specifications/sources-0.0.1.gemspec +8 -0
- data/test/mockgemui.rb +45 -0
- data/test/onegem.rb +23 -0
- data/test/simple_gem.rb +66 -0
- data/test/test_builder.rb +13 -0
- data/test/test_cached_fetcher.rb +60 -0
- data/test/test_check_command.rb +28 -0
- data/test/test_command.rb +130 -0
- data/test/test_configfile.rb +36 -0
- data/test/test_format.rb +70 -0
- data/test/test_gemloadpaths.rb +45 -0
- data/test/test_gempaths.rb +115 -0
- data/test/test_loadmanager.rb +40 -0
- data/test/test_local_cache.rb +157 -0
- data/test/test_package.rb +600 -0
- data/test/test_parse_commands.rb +179 -0
- data/test/test_process_commands.rb +21 -0
- data/test/test_remote_fetcher.rb +162 -0
- data/test/test_remote_installer.rb +154 -0
- data/test/test_source_index.rb +58 -0
- data/test/test_specification.rb +286 -0
- data/test/test_validator.rb +53 -0
- data/test/test_version_comparison.rb +204 -0
- data/test/testgem.rc +6 -0
- data/test/user_capture.rb +1 -0
- data/test/yaml_data.rb +59 -0
- 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
|