rubyzip 1.0.0 → 1.2.0

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

Potentially problematic release.


This version of rubyzip might be problematic. Click here for more details.

Files changed (107) hide show
  1. checksums.yaml +6 -14
  2. data/README.md +173 -42
  3. data/Rakefile +10 -5
  4. data/TODO +0 -1
  5. data/lib/zip/central_directory.rb +55 -24
  6. data/lib/zip/compressor.rb +0 -0
  7. data/lib/zip/constants.rb +4 -2
  8. data/lib/zip/crypto/encryption.rb +11 -0
  9. data/lib/zip/crypto/null_encryption.rb +45 -0
  10. data/lib/zip/crypto/traditional_encryption.rb +99 -0
  11. data/lib/zip/decompressor.rb +2 -2
  12. data/lib/zip/deflater.rb +11 -6
  13. data/lib/zip/dos_time.rb +4 -5
  14. data/lib/zip/entry.rb +159 -97
  15. data/lib/zip/entry_set.rb +18 -18
  16. data/lib/zip/errors.rb +15 -6
  17. data/lib/zip/extra_field/generic.rb +8 -8
  18. data/lib/zip/extra_field/ntfs.rb +90 -0
  19. data/lib/zip/extra_field/old_unix.rb +44 -0
  20. data/lib/zip/extra_field/universal_time.rb +14 -14
  21. data/lib/zip/extra_field/unix.rb +8 -9
  22. data/lib/zip/extra_field/zip64.rb +44 -6
  23. data/lib/zip/extra_field/zip64_placeholder.rb +16 -0
  24. data/lib/zip/extra_field.rb +20 -8
  25. data/lib/zip/file.rb +126 -114
  26. data/lib/zip/filesystem.rb +140 -139
  27. data/lib/zip/inflater.rb +10 -9
  28. data/lib/zip/input_stream.rb +105 -80
  29. data/lib/zip/ioextras/abstract_input_stream.rb +15 -12
  30. data/lib/zip/ioextras/abstract_output_stream.rb +0 -2
  31. data/lib/zip/ioextras.rb +1 -3
  32. data/lib/zip/null_compressor.rb +2 -2
  33. data/lib/zip/null_decompressor.rb +4 -4
  34. data/lib/zip/null_input_stream.rb +2 -1
  35. data/lib/zip/output_stream.rb +57 -43
  36. data/lib/zip/pass_thru_compressor.rb +4 -4
  37. data/lib/zip/pass_thru_decompressor.rb +4 -5
  38. data/lib/zip/streamable_directory.rb +2 -2
  39. data/lib/zip/streamable_stream.rb +22 -13
  40. data/lib/zip/version.rb +1 -1
  41. data/lib/zip.rb +11 -2
  42. data/samples/example.rb +30 -40
  43. data/samples/example_filesystem.rb +16 -18
  44. data/samples/example_recursive.rb +35 -27
  45. data/samples/{gtkRubyzip.rb → gtk_ruby_zip.rb} +25 -27
  46. data/samples/qtzip.rb +19 -28
  47. data/samples/write_simple.rb +12 -13
  48. data/samples/zipfind.rb +29 -37
  49. data/test/basic_zip_file_test.rb +60 -0
  50. data/test/case_sensitivity_test.rb +69 -0
  51. data/test/central_directory_entry_test.rb +69 -0
  52. data/test/central_directory_test.rb +100 -0
  53. data/test/crypto/null_encryption_test.rb +53 -0
  54. data/test/crypto/traditional_encryption_test.rb +80 -0
  55. data/test/data/WarnInvalidDate.zip +0 -0
  56. data/test/data/file1.txt +46 -0
  57. data/test/data/file1.txt.deflatedData +0 -0
  58. data/test/data/file2.txt +1504 -0
  59. data/test/data/globTest/foo/bar/baz/foo.txt +0 -0
  60. data/test/data/globTest/foo.txt +0 -0
  61. data/test/data/globTest/food.txt +0 -0
  62. data/test/data/globTest.zip +0 -0
  63. data/test/data/mimetype +1 -0
  64. data/test/data/notzippedruby.rb +7 -0
  65. data/test/data/ntfs.zip +0 -0
  66. data/test/data/oddExtraField.zip +0 -0
  67. data/test/data/rubycode.zip +0 -0
  68. data/test/data/rubycode2.zip +0 -0
  69. data/test/data/test.xls +0 -0
  70. data/test/data/testDirectory.bin +0 -0
  71. data/test/data/zip64-sample.zip +0 -0
  72. data/test/data/zipWithDirs.zip +0 -0
  73. data/test/data/zipWithEncryption.zip +0 -0
  74. data/test/deflater_test.rb +65 -0
  75. data/test/encryption_test.rb +42 -0
  76. data/test/entry_set_test.rb +152 -0
  77. data/test/entry_test.rb +163 -0
  78. data/test/errors_test.rb +34 -0
  79. data/test/extra_field_test.rb +76 -0
  80. data/test/file_extract_directory_test.rb +54 -0
  81. data/test/file_extract_test.rb +83 -0
  82. data/test/file_permissions_test.rb +69 -0
  83. data/test/file_split_test.rb +57 -0
  84. data/test/file_test.rb +563 -0
  85. data/test/filesystem/dir_iterator_test.rb +58 -0
  86. data/test/filesystem/directory_test.rb +121 -0
  87. data/test/filesystem/file_mutating_test.rb +88 -0
  88. data/test/filesystem/file_nonmutating_test.rb +508 -0
  89. data/test/filesystem/file_stat_test.rb +64 -0
  90. data/test/gentestfiles.rb +122 -0
  91. data/test/inflater_test.rb +14 -0
  92. data/test/input_stream_test.rb +182 -0
  93. data/test/ioextras/abstract_input_stream_test.rb +102 -0
  94. data/test/ioextras/abstract_output_stream_test.rb +106 -0
  95. data/test/ioextras/fake_io_test.rb +18 -0
  96. data/test/local_entry_test.rb +154 -0
  97. data/test/output_stream_test.rb +128 -0
  98. data/test/pass_thru_compressor_test.rb +30 -0
  99. data/test/pass_thru_decompressor_test.rb +14 -0
  100. data/test/samples/example_recursive_test.rb +37 -0
  101. data/test/settings_test.rb +95 -0
  102. data/test/test_helper.rb +221 -0
  103. data/test/unicode_file_names_and_comments_test.rb +50 -0
  104. data/test/zip64_full_test.rb +51 -0
  105. data/test/zip64_support_test.rb +14 -0
  106. metadata +198 -22
  107. data/NEWS +0 -182
File without changes
File without changes
File without changes
Binary file
@@ -0,0 +1 @@
1
+ application/epub+zip
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ class NotZippedRuby
4
+ def return_true
5
+ true
6
+ end
7
+ end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,65 @@
1
+ require 'test_helper'
2
+
3
+ class DeflaterTest < MiniTest::Test
4
+ include CrcTest
5
+
6
+ DEFLATER_TEST_FILE = 'test/data/generated/deflatertest.bin'
7
+ BEST_COMP_FILE = 'test/data/generated/compressiontest_best_compression.bin'
8
+ DEFAULT_COMP_FILE = 'test/data/generated/compressiontest_default_compression.bin'
9
+ NO_COMP_FILE = 'test/data/generated/compressiontest_no_compression.bin'
10
+
11
+ def test_output_operator
12
+ txt = load_file('test/data/file2.txt')
13
+ deflate(txt, DEFLATER_TEST_FILE)
14
+ inflatedTxt = inflate(DEFLATER_TEST_FILE)
15
+ assert_equal(txt, inflatedTxt)
16
+ end
17
+
18
+ def test_default_compression
19
+ txt = load_file('test/data/file2.txt')
20
+
21
+ Zip.default_compression = ::Zlib::BEST_COMPRESSION
22
+ deflate(txt, BEST_COMP_FILE)
23
+ Zip.default_compression = ::Zlib::DEFAULT_COMPRESSION
24
+ deflate(txt, DEFAULT_COMP_FILE)
25
+ Zip.default_compression = ::Zlib::NO_COMPRESSION
26
+ deflate(txt, NO_COMP_FILE)
27
+
28
+ best = File.size(BEST_COMP_FILE)
29
+ default = File.size(DEFAULT_COMP_FILE)
30
+ no = File.size(NO_COMP_FILE)
31
+
32
+ assert(best < default)
33
+ assert(best < no)
34
+ assert(default < no)
35
+ end
36
+
37
+ private
38
+
39
+ def load_file(fileName)
40
+ txt = nil
41
+ File.open(fileName, 'rb') { |f| txt = f.read }
42
+ end
43
+
44
+ def deflate(data, fileName)
45
+ File.open(fileName, 'wb') do |file|
46
+ deflater = ::Zip::Deflater.new(file)
47
+ deflater << data
48
+ deflater.finish
49
+ assert_equal(deflater.size, data.size)
50
+ file << 'trailing data for zlib with -MAX_WBITS'
51
+ end
52
+ end
53
+
54
+ def inflate(fileName)
55
+ txt = nil
56
+ File.open(fileName, 'rb') do |file|
57
+ inflater = ::Zip::Inflater.new(file)
58
+ txt = inflater.sysread
59
+ end
60
+ end
61
+
62
+ def test_crc
63
+ run_crc_test(::Zip::Deflater)
64
+ end
65
+ end
@@ -0,0 +1,42 @@
1
+ require 'test_helper'
2
+
3
+ class EncryptionTest < MiniTest::Test
4
+ ENCRYPT_ZIP_TEST_FILE = 'test/data/zipWithEncryption.zip'
5
+ INPUT_FILE1 = 'test/data/file1.txt'
6
+
7
+ def setup
8
+ @default_compression = Zip.default_compression
9
+ Zip.default_compression = ::Zlib::DEFAULT_COMPRESSION
10
+ end
11
+
12
+ def teardown
13
+ Zip.default_compression = @default_compression
14
+ end
15
+
16
+ def test_encrypt
17
+ test_file = open(ENCRYPT_ZIP_TEST_FILE, 'rb').read
18
+
19
+ @rand = [250, 143, 107, 13, 143, 22, 155, 75, 228, 150, 12]
20
+ @output = ::Zip::DOSTime.stub(:now, ::Zip::DOSTime.new(2014, 12, 17, 15, 56, 24)) do
21
+ Random.stub(:rand, ->(_range) { @rand.shift }) do
22
+ Zip::OutputStream.write_buffer(::StringIO.new(''), Zip::TraditionalEncrypter.new('password')) do |zos|
23
+ zos.put_next_entry('file1.txt')
24
+ zos.write open(INPUT_FILE1).read
25
+ end.string
26
+ end
27
+ end
28
+
29
+ @output.unpack('C*').each_with_index do |c, i|
30
+ assert_equal test_file[i].ord, c
31
+ end
32
+ end
33
+
34
+ def test_decrypt
35
+ Zip::InputStream.open(ENCRYPT_ZIP_TEST_FILE, 0, Zip::TraditionalDecrypter.new('password')) do |zis|
36
+ entry = zis.get_next_entry
37
+ assert_equal 'file1.txt', entry.name
38
+ assert_equal 1327, entry.size
39
+ assert_equal open(INPUT_FILE1, 'r').read, zis.read
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,152 @@
1
+ require 'test_helper'
2
+
3
+ class ZipEntrySetTest < MiniTest::Test
4
+ ZIP_ENTRIES = [
5
+ ::Zip::Entry.new('zipfile.zip', 'name1', 'comment1'),
6
+ ::Zip::Entry.new('zipfile.zip', 'name3', 'comment1'),
7
+ ::Zip::Entry.new('zipfile.zip', 'name2', 'comment1'),
8
+ ::Zip::Entry.new('zipfile.zip', 'name4', 'comment1'),
9
+ ::Zip::Entry.new('zipfile.zip', 'name5', 'comment1'),
10
+ ::Zip::Entry.new('zipfile.zip', 'name6', 'comment1')
11
+ ]
12
+
13
+ def setup
14
+ @zipEntrySet = ::Zip::EntrySet.new(ZIP_ENTRIES)
15
+ end
16
+
17
+ def teardown
18
+ ::Zip.reset!
19
+ end
20
+
21
+ def test_include
22
+ assert(@zipEntrySet.include?(ZIP_ENTRIES.first))
23
+ assert(!@zipEntrySet.include?(::Zip::Entry.new('different.zip', 'different', 'aComment')))
24
+ end
25
+
26
+ def test_size
27
+ assert_equal(ZIP_ENTRIES.size, @zipEntrySet.size)
28
+ assert_equal(ZIP_ENTRIES.size, @zipEntrySet.length)
29
+ @zipEntrySet << ::Zip::Entry.new('a', 'b', 'c')
30
+ assert_equal(ZIP_ENTRIES.size + 1, @zipEntrySet.length)
31
+ end
32
+
33
+ def test_add
34
+ zes = ::Zip::EntrySet.new
35
+ entry1 = ::Zip::Entry.new('zf.zip', 'name1')
36
+ entry2 = ::Zip::Entry.new('zf.zip', 'name2')
37
+ zes << entry1
38
+ assert(zes.include?(entry1))
39
+ zes.push(entry2)
40
+ assert(zes.include?(entry2))
41
+ end
42
+
43
+ def test_delete
44
+ assert_equal(ZIP_ENTRIES.size, @zipEntrySet.size)
45
+ entry = @zipEntrySet.delete(ZIP_ENTRIES.first)
46
+ assert_equal(ZIP_ENTRIES.size - 1, @zipEntrySet.size)
47
+ assert_equal(ZIP_ENTRIES.first, entry)
48
+
49
+ entry = @zipEntrySet.delete(ZIP_ENTRIES.first)
50
+ assert_equal(ZIP_ENTRIES.size - 1, @zipEntrySet.size)
51
+ assert_nil(entry)
52
+ end
53
+
54
+ def test_each
55
+ # Used each instead each_with_index due the bug in jRuby
56
+ count = 0
57
+ @zipEntrySet.each do |entry|
58
+ assert(ZIP_ENTRIES.include?(entry))
59
+ count += 1
60
+ end
61
+ assert_equal(ZIP_ENTRIES.size, count)
62
+ end
63
+
64
+ def test_entries
65
+ assert_equal(ZIP_ENTRIES, @zipEntrySet.entries)
66
+ end
67
+
68
+ def test_find_entry
69
+ entries = [::Zip::Entry.new('zipfile.zip', 'MiXeDcAsEnAmE', 'comment1')]
70
+
71
+ ::Zip.case_insensitive_match = true
72
+ zipEntrySet = ::Zip::EntrySet.new(entries)
73
+ assert_equal(entries[0], zipEntrySet.find_entry('MiXeDcAsEnAmE'))
74
+ assert_equal(entries[0], zipEntrySet.find_entry('mixedcasename'))
75
+
76
+ ::Zip.case_insensitive_match = false
77
+ zipEntrySet = ::Zip::EntrySet.new(entries)
78
+ assert_equal(entries[0], zipEntrySet.find_entry('MiXeDcAsEnAmE'))
79
+ assert_equal(nil, zipEntrySet.find_entry('mixedcasename'))
80
+ end
81
+
82
+ def test_entries_with_sort
83
+ ::Zip.sort_entries = true
84
+ assert_equal(ZIP_ENTRIES.sort, @zipEntrySet.entries)
85
+ ::Zip.sort_entries = false
86
+ assert_equal(ZIP_ENTRIES, @zipEntrySet.entries)
87
+ end
88
+
89
+ def test_entries_sorted_in_each
90
+ ::Zip.sort_entries = true
91
+ arr = []
92
+ @zipEntrySet.each do |entry|
93
+ arr << entry
94
+ end
95
+ assert_equal(ZIP_ENTRIES.sort, arr)
96
+ end
97
+
98
+ def test_compound
99
+ newEntry = ::Zip::Entry.new('zf.zip', 'new entry', "new entry's comment")
100
+ assert_equal(ZIP_ENTRIES.size, @zipEntrySet.size)
101
+ @zipEntrySet << newEntry
102
+ assert_equal(ZIP_ENTRIES.size + 1, @zipEntrySet.size)
103
+ assert(@zipEntrySet.include?(newEntry))
104
+
105
+ @zipEntrySet.delete(newEntry)
106
+ assert_equal(ZIP_ENTRIES.size, @zipEntrySet.size)
107
+ end
108
+
109
+ def test_dup
110
+ copy = @zipEntrySet.dup
111
+ assert_equal(@zipEntrySet, copy)
112
+
113
+ # demonstrate that this is a deep copy
114
+ copy.entries[0].name = 'a totally different name'
115
+ assert(@zipEntrySet != copy)
116
+ end
117
+
118
+ def test_parent
119
+ entries = [
120
+ ::Zip::Entry.new('zf.zip', 'a/'),
121
+ ::Zip::Entry.new('zf.zip', 'a/b/'),
122
+ ::Zip::Entry.new('zf.zip', 'a/b/c/')
123
+ ]
124
+ entrySet = ::Zip::EntrySet.new(entries)
125
+
126
+ assert_equal(nil, entrySet.parent(entries[0]))
127
+ assert_equal(entries[0], entrySet.parent(entries[1]))
128
+ assert_equal(entries[1], entrySet.parent(entries[2]))
129
+ end
130
+
131
+ def test_glob
132
+ res = @zipEntrySet.glob('name[2-4]')
133
+ assert_equal(3, res.size)
134
+ assert_equal(ZIP_ENTRIES[1, 3].sort, res.sort)
135
+ end
136
+
137
+ def test_glob2
138
+ entries = [
139
+ ::Zip::Entry.new('zf.zip', 'a/'),
140
+ ::Zip::Entry.new('zf.zip', 'a/b/b1'),
141
+ ::Zip::Entry.new('zf.zip', 'a/b/c/'),
142
+ ::Zip::Entry.new('zf.zip', 'a/b/c/c1')
143
+ ]
144
+ entrySet = ::Zip::EntrySet.new(entries)
145
+
146
+ assert_equal(entries[0, 1], entrySet.glob('*'))
147
+ # assert_equal(entries[FIXME], entrySet.glob("**"))
148
+ # res = entrySet.glob('a*')
149
+ # assert_equal(entries.size, res.size)
150
+ # assert_equal(entrySet.map { |e| e.name }, res.map { |e| e.name })
151
+ end
152
+ end
@@ -0,0 +1,163 @@
1
+ require 'test_helper'
2
+
3
+ class ZipEntryTest < MiniTest::Test
4
+ TEST_ZIPFILE = 'someZipFile.zip'
5
+ TEST_COMMENT = 'a comment'
6
+ TEST_COMPRESSED_SIZE = 1234
7
+ TEST_CRC = 325_324
8
+ TEST_EXTRA = 'Some data here'
9
+ TEST_COMPRESSIONMETHOD = ::Zip::Entry::DEFLATED
10
+ TEST_NAME = 'entry name'
11
+ TEST_SIZE = 8432
12
+ TEST_ISDIRECTORY = false
13
+ TEST_TIME = Time.now
14
+
15
+ def test_constructor_and_getters
16
+ entry = ::Zip::Entry.new(TEST_ZIPFILE,
17
+ TEST_NAME,
18
+ TEST_COMMENT,
19
+ TEST_EXTRA,
20
+ TEST_COMPRESSED_SIZE,
21
+ TEST_CRC,
22
+ TEST_COMPRESSIONMETHOD,
23
+ TEST_SIZE,
24
+ TEST_TIME)
25
+
26
+ assert_equal(TEST_COMMENT, entry.comment)
27
+ assert_equal(TEST_COMPRESSED_SIZE, entry.compressed_size)
28
+ assert_equal(TEST_CRC, entry.crc)
29
+ assert_instance_of(::Zip::ExtraField, entry.extra)
30
+ assert_equal(TEST_COMPRESSIONMETHOD, entry.compression_method)
31
+ assert_equal(TEST_NAME, entry.name)
32
+ assert_equal(TEST_SIZE, entry.size)
33
+ assert_equal(TEST_TIME, entry.time)
34
+ end
35
+
36
+ def test_is_directory_and_is_file
37
+ assert(::Zip::Entry.new(TEST_ZIPFILE, 'hello').file?)
38
+ assert(!::Zip::Entry.new(TEST_ZIPFILE, 'hello').directory?)
39
+
40
+ assert(::Zip::Entry.new(TEST_ZIPFILE, 'dir/hello').file?)
41
+ assert(!::Zip::Entry.new(TEST_ZIPFILE, 'dir/hello').directory?)
42
+
43
+ assert(::Zip::Entry.new(TEST_ZIPFILE, 'hello/').directory?)
44
+ assert(!::Zip::Entry.new(TEST_ZIPFILE, 'hello/').file?)
45
+
46
+ assert(::Zip::Entry.new(TEST_ZIPFILE, 'dir/hello/').directory?)
47
+ assert(!::Zip::Entry.new(TEST_ZIPFILE, 'dir/hello/').file?)
48
+ end
49
+
50
+ def test_equality
51
+ entry1 = ::Zip::Entry.new('file.zip', 'name', 'isNotCompared',
52
+ 'something extra', 123, 1234,
53
+ ::Zip::Entry::DEFLATED, 10_000)
54
+ entry2 = ::Zip::Entry.new('file.zip', 'name', 'isNotComparedXXX',
55
+ 'something extra', 123, 1234,
56
+ ::Zip::Entry::DEFLATED, 10_000)
57
+ entry3 = ::Zip::Entry.new('file.zip', 'name2', 'isNotComparedXXX',
58
+ 'something extra', 123, 1234,
59
+ ::Zip::Entry::DEFLATED, 10_000)
60
+ entry4 = ::Zip::Entry.new('file.zip', 'name2', 'isNotComparedXXX',
61
+ 'something extraXX', 123, 1234,
62
+ ::Zip::Entry::DEFLATED, 10_000)
63
+ entry5 = ::Zip::Entry.new('file.zip', 'name2', 'isNotComparedXXX',
64
+ 'something extraXX', 12, 1234,
65
+ ::Zip::Entry::DEFLATED, 10_000)
66
+ entry6 = ::Zip::Entry.new('file.zip', 'name2', 'isNotComparedXXX',
67
+ 'something extraXX', 12, 123,
68
+ ::Zip::Entry::DEFLATED, 10_000)
69
+ entry7 = ::Zip::Entry.new('file.zip', 'name2', 'isNotComparedXXX',
70
+ 'something extraXX', 12, 123,
71
+ ::Zip::Entry::STORED, 10_000)
72
+ entry8 = ::Zip::Entry.new('file.zip', 'name2', 'isNotComparedXXX',
73
+ 'something extraXX', 12, 123,
74
+ ::Zip::Entry::STORED, 100_000)
75
+
76
+ assert_equal(entry1, entry1)
77
+ assert_equal(entry1, entry2)
78
+
79
+ assert(entry2 != entry3)
80
+ assert(entry3 != entry4)
81
+ assert(entry4 != entry5)
82
+ assert(entry5 != entry6)
83
+ assert(entry6 != entry7)
84
+ assert(entry7 != entry8)
85
+
86
+ assert(entry7 != 'hello')
87
+ assert(entry7 != 12)
88
+ end
89
+
90
+ def test_compare
91
+ assert_equal(0, (::Zip::Entry.new('zf.zip', 'a') <=> ::Zip::Entry.new('zf.zip', 'a')))
92
+ assert_equal(1, (::Zip::Entry.new('zf.zip', 'b') <=> ::Zip::Entry.new('zf.zip', 'a')))
93
+ assert_equal(-1, (::Zip::Entry.new('zf.zip', 'a') <=> ::Zip::Entry.new('zf.zip', 'b')))
94
+
95
+ entries = [
96
+ ::Zip::Entry.new('zf.zip', '5'),
97
+ ::Zip::Entry.new('zf.zip', '1'),
98
+ ::Zip::Entry.new('zf.zip', '3'),
99
+ ::Zip::Entry.new('zf.zip', '4'),
100
+ ::Zip::Entry.new('zf.zip', '0'),
101
+ ::Zip::Entry.new('zf.zip', '2')
102
+ ]
103
+
104
+ entries.sort!
105
+ assert_equal('0', entries[0].to_s)
106
+ assert_equal('1', entries[1].to_s)
107
+ assert_equal('2', entries[2].to_s)
108
+ assert_equal('3', entries[3].to_s)
109
+ assert_equal('4', entries[4].to_s)
110
+ assert_equal('5', entries[5].to_s)
111
+ end
112
+
113
+ def test_parent_as_string
114
+ entry1 = ::Zip::Entry.new('zf.zip', 'aa')
115
+ entry2 = ::Zip::Entry.new('zf.zip', 'aa/')
116
+ entry3 = ::Zip::Entry.new('zf.zip', 'aa/bb')
117
+ entry4 = ::Zip::Entry.new('zf.zip', 'aa/bb/')
118
+ entry5 = ::Zip::Entry.new('zf.zip', 'aa/bb/cc')
119
+ entry6 = ::Zip::Entry.new('zf.zip', 'aa/bb/cc/')
120
+
121
+ assert_equal(nil, entry1.parent_as_string)
122
+ assert_equal(nil, entry2.parent_as_string)
123
+ assert_equal('aa/', entry3.parent_as_string)
124
+ assert_equal('aa/', entry4.parent_as_string)
125
+ assert_equal('aa/bb/', entry5.parent_as_string)
126
+ assert_equal('aa/bb/', entry6.parent_as_string)
127
+ end
128
+
129
+ def test_entry_name_cannot_start_with_slash
130
+ assert_raises(::Zip::EntryNameError) { ::Zip::Entry.new('zf.zip', '/hej/der') }
131
+ end
132
+
133
+ def test_store_file_without_compression
134
+ File.delete('/tmp/no_compress.zip') if File.exist?('/tmp/no_compress.zip')
135
+ files = Dir[File.join('test/data/globTest', '**', '**')]
136
+
137
+ Zip.setup do |z|
138
+ z.write_zip64_support = false
139
+ end
140
+
141
+ zipfile = Zip::File.open('/tmp/no_compress.zip', Zip::File::CREATE)
142
+ mimetype_entry = Zip::Entry.new(zipfile, # @zipfile
143
+ 'mimetype', # @name
144
+ '', # @comment
145
+ '', # @extra
146
+ 0, # @compressed_size
147
+ 0, # @crc
148
+ Zip::Entry::STORED) # @comppressed_method
149
+
150
+ zipfile.add(mimetype_entry, 'test/data/mimetype')
151
+
152
+ files.each do |file|
153
+ zipfile.add(file.sub('test/data/globTest/', ''), file)
154
+ end
155
+ zipfile.close
156
+
157
+ f = File.open('/tmp/no_compress.zip', 'rb')
158
+ first_100_bytes = f.read(100)
159
+ f.close
160
+
161
+ assert_match(/mimetypeapplication\/epub\+zip/, first_100_bytes)
162
+ end
163
+ end
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+ require 'test_helper'
3
+
4
+ class ErrorsTest < MiniTest::Test
5
+ def test_rescue_legacy_zip_error
6
+ raise ::Zip::Error
7
+ rescue ::Zip::ZipError
8
+ end
9
+
10
+ def test_rescue_legacy_zip_entry_exists_error
11
+ raise ::Zip::EntryExistsError
12
+ rescue ::Zip::ZipEntryExistsError
13
+ end
14
+
15
+ def test_rescue_legacy_zip_destination_file_exists_error
16
+ raise ::Zip::DestinationFileExistsError
17
+ rescue ::Zip::ZipDestinationFileExistsError
18
+ end
19
+
20
+ def test_rescue_legacy_zip_compression_method_error
21
+ raise ::Zip::CompressionMethodError
22
+ rescue ::Zip::ZipCompressionMethodError
23
+ end
24
+
25
+ def test_rescue_legacy_zip_entry_name_error
26
+ raise ::Zip::EntryNameError
27
+ rescue ::Zip::ZipEntryNameError
28
+ end
29
+
30
+ def test_rescue_legacy_zip_internal_error
31
+ raise ::Zip::InternalError
32
+ rescue ::Zip::ZipInternalError
33
+ end
34
+ end
@@ -0,0 +1,76 @@
1
+ require 'test_helper'
2
+
3
+ class ZipExtraFieldTest < MiniTest::Test
4
+ def test_new
5
+ extra_pure = ::Zip::ExtraField.new('')
6
+ extra_withstr = ::Zip::ExtraField.new('foo')
7
+ assert_instance_of(::Zip::ExtraField, extra_pure)
8
+ assert_instance_of(::Zip::ExtraField, extra_withstr)
9
+ end
10
+
11
+ def test_unknownfield
12
+ extra = ::Zip::ExtraField.new('foo')
13
+ assert_equal(extra['Unknown'], 'foo')
14
+ extra.merge('a')
15
+ assert_equal(extra['Unknown'], 'fooa')
16
+ extra.merge('barbaz')
17
+ assert_equal(extra.to_s, 'fooabarbaz')
18
+ end
19
+
20
+ def test_ntfs
21
+ str = "\x0A\x00 \x00\x00\x00\x00\x00\x01\x00\x18\x00\xC0\x81\x17\xE8B\xCE\xCF\x01\xC0\x81\x17\xE8B\xCE\xCF\x01\xC0\x81\x17\xE8B\xCE\xCF\x01"
22
+ extra = ::Zip::ExtraField.new(str)
23
+ assert(extra.member?('NTFS'))
24
+ t = ::Zip::DOSTime.at(1_410_496_497.405178)
25
+ assert_equal(t, extra['NTFS'].mtime)
26
+ assert_equal(t, extra['NTFS'].atime)
27
+ assert_equal(t, extra['NTFS'].ctime)
28
+ end
29
+
30
+ def test_merge
31
+ str = "UT\x5\0\x3\250$\r@Ux\0\0"
32
+ extra1 = ::Zip::ExtraField.new('')
33
+ extra2 = ::Zip::ExtraField.new(str)
34
+ assert(!extra1.member?('UniversalTime'))
35
+ assert(extra2.member?('UniversalTime'))
36
+ extra1.merge(str)
37
+ assert_equal(extra1['UniversalTime'].mtime, extra2['UniversalTime'].mtime)
38
+ end
39
+
40
+ def test_length
41
+ str = "UT\x5\0\x3\250$\r@Ux\0\0Te\0\0testit"
42
+ extra = ::Zip::ExtraField.new(str)
43
+ assert_equal(extra.local_size, extra.to_local_bin.size)
44
+ assert_equal(extra.c_dir_size, extra.to_c_dir_bin.size)
45
+ extra.merge('foo')
46
+ assert_equal(extra.local_size, extra.to_local_bin.size)
47
+ assert_equal(extra.c_dir_size, extra.to_c_dir_bin.size)
48
+ end
49
+
50
+ def test_to_s
51
+ str = "UT\x5\0\x3\250$\r@Ux\0\0Te\0\0testit"
52
+ extra = ::Zip::ExtraField.new(str)
53
+ assert_instance_of(String, extra.to_s)
54
+
55
+ s = extra.to_s
56
+ extra.merge('foo')
57
+ assert_equal(s.length + 3, extra.to_s.length)
58
+ end
59
+
60
+ def test_equality
61
+ str = "UT\x5\0\x3\250$\r@"
62
+ extra1 = ::Zip::ExtraField.new(str)
63
+ extra2 = ::Zip::ExtraField.new(str)
64
+ extra3 = ::Zip::ExtraField.new(str)
65
+ assert_equal(extra1, extra2)
66
+
67
+ extra2['UniversalTime'].mtime = ::Zip::DOSTime.now
68
+ assert(extra1 != extra2)
69
+
70
+ extra3.create('IUnix')
71
+ assert(extra1 != extra3)
72
+
73
+ extra1.create('IUnix')
74
+ assert_equal(extra1, extra3)
75
+ end
76
+ end
@@ -0,0 +1,54 @@
1
+ require 'test_helper'
2
+
3
+ class ZipFileExtractDirectoryTest < MiniTest::Test
4
+ include CommonZipFileFixture
5
+
6
+ TEST_OUT_NAME = 'test/data/generated/emptyOutDir'
7
+
8
+ def open_zip(&aProc)
9
+ assert(!aProc.nil?)
10
+ ::Zip::File.open(TestZipFile::TEST_ZIP4.zip_name, &aProc)
11
+ end
12
+
13
+ def extract_test_dir(&aProc)
14
+ open_zip do |zf|
15
+ zf.extract(TestFiles::EMPTY_TEST_DIR, TEST_OUT_NAME, &aProc)
16
+ end
17
+ end
18
+
19
+ def setup
20
+ super
21
+
22
+ Dir.rmdir(TEST_OUT_NAME) if File.directory? TEST_OUT_NAME
23
+ File.delete(TEST_OUT_NAME) if File.exist? TEST_OUT_NAME
24
+ end
25
+
26
+ def test_extract_directory
27
+ extract_test_dir
28
+ assert(File.directory?(TEST_OUT_NAME))
29
+ end
30
+
31
+ def test_extract_directory_exists_as_dir
32
+ Dir.mkdir TEST_OUT_NAME
33
+ extract_test_dir
34
+ assert(File.directory?(TEST_OUT_NAME))
35
+ end
36
+
37
+ def test_extract_directory_exists_as_file
38
+ File.open(TEST_OUT_NAME, 'w') { |f| f.puts 'something' }
39
+ assert_raises(::Zip::DestinationFileExistsError) { extract_test_dir }
40
+ end
41
+
42
+ def test_extract_directory_exists_as_file_overwrite
43
+ File.open(TEST_OUT_NAME, 'w') { |f| f.puts 'something' }
44
+ gotCalled = false
45
+ extract_test_dir do |entry, destPath|
46
+ gotCalled = true
47
+ assert_equal(TEST_OUT_NAME, destPath)
48
+ assert(entry.directory?)
49
+ true
50
+ end
51
+ assert(gotCalled)
52
+ assert(File.directory?(TEST_OUT_NAME))
53
+ end
54
+ end