rubygems-update 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


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

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