1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
require 'test_helper'
class ZipOutputStreamTest < MiniTest::Test
include AssertEntry
TEST_ZIP = TestZipFile::TEST_ZIP2.clone
TEST_ZIP.zip_name = 'test/data/generated/output.zip'
def test_new
zos = ::Zip::OutputStream.new(TEST_ZIP.zip_name)
zos.comment = TEST_ZIP.comment
write_test_zip(zos)
zos.close
assert_test_zip_contents(TEST_ZIP)
end
def test_open
::Zip::OutputStream.open(TEST_ZIP.zip_name) do |zos|
zos.comment = TEST_ZIP.comment
write_test_zip(zos)
end
assert_test_zip_contents(TEST_ZIP)
end
def test_write_buffer
io = ::StringIO.new('')
buffer = ::Zip::OutputStream.write_buffer(io) do |zos|
zos.comment = TEST_ZIP.comment
write_test_zip(zos)
end
File.open(TEST_ZIP.zip_name, 'wb') { |f| f.write buffer.string }
assert_test_zip_contents(TEST_ZIP)
end
def test_write_buffer_binmode
io = ::StringIO.new('')
buffer = ::Zip::OutputStream.write_buffer(io) do |zos|
zos.comment = TEST_ZIP.comment
write_test_zip(zos)
end
assert_equal Encoding::ASCII_8BIT, buffer.external_encoding
end
def test_write_buffer_with_temp_file
tmp_file = Tempfile.new('')
::Zip::OutputStream.write_buffer(tmp_file) do |zos|
zos.comment = TEST_ZIP.comment
write_test_zip(zos)
end
tmp_file.rewind
File.open(TEST_ZIP.zip_name, 'wb') { |f| f.write(tmp_file.read) }
tmp_file.unlink
assert_test_zip_contents(TEST_ZIP)
end
def test_writing_to_closed_stream
assert_i_o_error_in_closed_stream { |zos| zos << 'hello world' }
assert_i_o_error_in_closed_stream { |zos| zos.puts 'hello world' }
assert_i_o_error_in_closed_stream { |zos| zos.write 'hello world' }
end
def test_cannot_open_file
name = TestFiles::EMPTY_TEST_DIR
begin
::Zip::OutputStream.open(name)
rescue SystemCallError
assert($ERROR_INFO.kind_of?(Errno::EISDIR) || # Linux
$ERROR_INFO.kind_of?(Errno::EEXIST) || # Windows/cygwin
$ERROR_INFO.kind_of?(Errno::EACCES), # Windows
"Expected Errno::EISDIR (or on win/cygwin: Errno::EEXIST), but was: #{$ERROR_INFO.class}")
end
end
def test_put_next_entry
stored_text = 'hello world in stored text'
entry_name = 'file1'
comment = 'my comment'
::Zip::OutputStream.open(TEST_ZIP.zip_name) do |zos|
zos.put_next_entry(entry_name, comment, nil, ::Zip::Entry::STORED)
zos << stored_text
end
assert(File.read(TEST_ZIP.zip_name)[stored_text])
::Zip::File.open(TEST_ZIP.zip_name) do |zf|
assert_equal(stored_text, zf.read(entry_name))
end
end
def test_put_next_entry_using_zip_entry_creates_entries_with_correct_timestamps
file = ::File.open('test/data/file2.txt', 'rb')
::Zip::OutputStream.open(TEST_ZIP.zip_name) do |zos|
zip_entry = ::Zip::Entry.new(zos, file.path, '', '', 0, 0, ::Zip::Entry::DEFLATED, 0, ::Zip::DOSTime.at(file.mtime))
zos.put_next_entry(zip_entry)
zos << file.read
end
::Zip::InputStream.open(TEST_ZIP.zip_name) do |io|
while (entry = io.get_next_entry)
# Compare DOS Times, since they are stored with two seconds accuracy
assert(::Zip::DOSTime.at(file.mtime).dos_equals(::Zip::DOSTime.at(entry.mtime)))
end
end
end
def test_chained_put_into_next_entry
stored_text = 'hello world in stored text'
stored_text2 = 'with chain'
entry_name = 'file1'
comment = 'my comment'
::Zip::OutputStream.open(TEST_ZIP.zip_name) do |zos|
zos.put_next_entry(entry_name, comment, nil, ::Zip::Entry::STORED)
zos << stored_text << stored_text2
end
assert(File.read(TEST_ZIP.zip_name)[stored_text])
::Zip::File.open(TEST_ZIP.zip_name) do |zf|
assert_equal(stored_text + stored_text2, zf.read(entry_name))
end
end
def assert_i_o_error_in_closed_stream
assert_raises(IOError) do
zos = ::Zip::OutputStream.new('test/data/generated/test_putOnClosedStream.zip')
zos.close
yield zos
end
end
def write_test_zip(zos)
TEST_ZIP.entry_names.each do |entry_name|
zos.put_next_entry(entry_name)
File.open(entry_name, 'rb') { |f| zos.write(f.read) }
end
end
end
|