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
|
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_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 Exception
assert($!.kind_of?(Errno::EISDIR) || # Linux
$!.kind_of?(Errno::EEXIST) || # Windows/cygwin
$!.kind_of?(Errno::EACCES), # Windows
"Expected Errno::EISDIR (or on win/cygwin: Errno::EEXIST), but was: #{$!.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)
assert(::Zip::DOSTime.at(file.mtime).dos_equals(::Zip::DOSTime.at(entry.mtime))) # Compare DOS Times, since they are stored with two seconds accuracy
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 |entryName|
zos.put_next_entry(entryName)
File.open(entryName, 'rb') { |f| zos.write(f.read) }
end
end
end
|