-
Notifications
You must be signed in to change notification settings - Fork 312
/
output_stream_test.rb
140 lines (119 loc) · 4.17 KB
/
output_stream_test.rb
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
139
140
require 'test_helper'
class ZipOutputStreamTest < MiniTest::Test
include AssertEntry
TEST_ZIP = TestZipFile::TEST_ZIP2.clone
TEST_ZIP.zip_name = 'test/data/generated/output.zip'
ASCII8BIT = 'ASCII-8BIT'
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 |entryName|
zos.put_next_entry(entryName)
File.open(entryName, 'rb') { |f| zos.write(f.read) }
end
end
end