ILIAS  trunk Revision v13.0_alpha-62-g3b72d83f2e5
ILIAS\Filesystem\Util\ZipTest Class Reference
+ Inheritance diagram for ILIAS\Filesystem\Util\ZipTest:
+ Collaboration diagram for ILIAS\Filesystem\Util\ZipTest:

Public Member Functions

 testZip ()
 
 testZip2 ()
 
 testZip3 ()
 
 testZipKeepsPathsInsideZip ()
 
 testZipDoesNotAllowPathsOutsideZip ()
 
 testLegacyZip ()
 
 LegacyZipWithTop ()
 
 testUnzip (string $zip, bool $has_multiple_root_entries, int $expected_amount_directories, array $expected_directories, int $expected_amount_files, array $expected_files)
 
 testWrongZip ()
 
 testLargeZIPs ()
 
 testLegacyUnzip (string $zip, bool $has_multiple_root_entries, int $expected_amount_directories, array $expected_directories, int $expected_amount_files, array $expected_files)
 

Static Public Member Functions

static getZips ()
 

Data Fields

const ZIPPED_ZIP = 'zipped.zip'
 

Protected Member Functions

 setUp ()
 
 tearDown ()
 

Protected Attributes

string $zips_dir = __DIR__ . '/zips/'
 
string $unzips_dir = __DIR__ . '/unzips/'
 

Static Protected Attributes

static array $files_mixed
 
static array $directories_mixed
 
static array $files_three
 

Private Member Functions

 recurseRmdir (string $path_to_directory)
 
 directoryToArray (string $path_to_directory)
 

Detailed Description

Author
Fabian Schmid fabia.nosp@m.n@sr.nosp@m..solu.nosp@m.tion.nosp@m.s

Definition at line 41 of file ZipTest.php.

Member Function Documentation

◆ directoryToArray()

ILIAS\Filesystem\Util\ZipTest::directoryToArray ( string  $path_to_directory)
private
Returns
string[]|string[][]

Definition at line 337 of file ZipTest.php.

337 : array
338 {
339 $iterator = new \RecursiveIteratorIterator(
340 new \RecursiveDirectoryIterator($path_to_directory, \RecursiveDirectoryIterator::SKIP_DOTS),
341 \RecursiveIteratorIterator::SELF_FIRST,
342 \RecursiveIteratorIterator::CATCH_GET_CHILD
343 );
344 $paths = [];
345 foreach ($iterator as $item) {
346 $relative_path = str_replace($path_to_directory . '/', '', $item->getPathname());
347 $paths[] = $item->isDir() ? $relative_path . '/' : $relative_path;
348 }
349
350 sort($paths);
351
352 return $paths;
353 }

References ILIAS\Scripts\PHPStan\$iterator, and ILIAS\UI\examples\Symbol\Glyph\Sort\sort().

+ Here is the call graph for this function:

◆ getZips()

static ILIAS\Filesystem\Util\ZipTest::getZips ( )
static

Definition at line 357 of file ZipTest.php.

357 : \Iterator
358 {
359 yield ['1_folder_mac.zip', false, 10, self::$directories_one, 15, self::$files_one];
360 yield ['1_folder_win.zip', false, 10, self::$directories_one, 15, self::$files_one];
361 yield ['3_folders_mac.zip', true, 9, self::$directories_three, 12, self::$files_three];
362 yield ['3_folders_win.zip', true, 9, self::$directories_three, 12, self::$files_three];
363 yield ['1_folder_1_file_mac.zip', true, 3, self::$directories_mixed, 5, self::$files_mixed];
364 }
static array $directories_mixed
Definition: ZipTest.php:374

◆ LegacyZipWithTop()

ILIAS\Filesystem\Util\ZipTest::LegacyZipWithTop ( )

Definition at line 188 of file ZipTest.php.

188 : void
189 {
190 $legacy = new LegacyArchives();
191
192 define('CLIENT_WEB_DIR', __DIR__);
193 define('ILIAS_WEB_DIR', 'public/data');
194 define('CLIENT_ID', 'test');
195 define('CLIENT_DATA_DIR', __DIR__);
196 define('ILIAS_ABSOLUTE_PATH', __DIR__);
197
198 mkdir($this->unzips_dir);
199 $legacy->zip($this->zips_dir, $this->unzips_dir . self::ZIPPED_ZIP, true);
200 $this->assertFileExists($this->unzips_dir . self::ZIPPED_ZIP);
201
202 $unzip_again = new Unzip(
203 new UnzipOptions(),
204 Streams::ofResource(fopen($this->unzips_dir . self::ZIPPED_ZIP, 'r'))
205 );
206 $this->assertSame(5, $unzip_again->getAmountOfFiles());
207
208 $depth = 0;
209 foreach ($unzip_again->getPaths() as $path) {
210 $parts = explode('/', $path);
211 $depth = max($depth, count($parts));
212 }
213 $this->assertEquals(2, $depth);
214 $this->recurseRmdir($this->unzips_dir);
215 }
static ofResource($resource)
Wraps an already created resource with the stream abstraction.
Definition: Streams.php:64
recurseRmdir(string $path_to_directory)
Definition: ZipTest.php:323

References ILIAS\Filesystem\Stream\Streams\ofResource(), and ILIAS\Filesystem\Util\ZipTest\recurseRmdir().

+ Here is the call graph for this function:

◆ recurseRmdir()

ILIAS\Filesystem\Util\ZipTest::recurseRmdir ( string  $path_to_directory)
private

Definition at line 323 of file ZipTest.php.

323 : bool
324 {
325 $files = array_diff(scandir($path_to_directory), ['.', '..']);
326 foreach ($files as $file) {
327 (is_dir("$path_to_directory/$file") && !is_link("$path_to_directory/$file")) ? $this->recurseRmdir(
328 "$path_to_directory/$file"
329 ) : unlink("$path_to_directory/$file");
330 }
331 return rmdir($path_to_directory);
332 }

References $files.

Referenced by ILIAS\Filesystem\Util\ZipTest\LegacyZipWithTop(), ILIAS\Filesystem\Util\ZipTest\tearDown(), and ILIAS\Filesystem\Util\ZipTest\testLegacyZip().

+ Here is the caller graph for this function:

◆ setUp()

ILIAS\Filesystem\Util\ZipTest::setUp ( )
protected

Definition at line 47 of file ZipTest.php.

47 : void
48 {
49 if (file_exists($this->unzips_dir . self::ZIPPED_ZIP)) {
50 unlink($this->unzips_dir . self::ZIPPED_ZIP);
51 }
52 if (!file_exists($this->unzips_dir)) {
53 mkdir($this->unzips_dir);
54 }
55 }

◆ tearDown()

ILIAS\Filesystem\Util\ZipTest::tearDown ( )
protected

Definition at line 57 of file ZipTest.php.

57 : void
58 {
59 if (file_exists($this->unzips_dir)) {
60 $this->recurseRmdir($this->unzips_dir);
61 }
62 }

References ILIAS\Filesystem\Util\ZipTest\recurseRmdir().

+ Here is the call graph for this function:

◆ testLargeZIPs()

ILIAS\Filesystem\Util\ZipTest::testLargeZIPs ( )

Definition at line 260 of file ZipTest.php.

260 : void
261 {
262 // get ulimit
263 $ulimit = (int) shell_exec('ulimit -n');
264 $limit = 2500;
265 if ($ulimit >= $limit) {
266 $this->markTestSkipped('ulimit is too high and would take too much resources');
267 }
268 $this->assertLessThan($limit, $ulimit);
269
270 $zip = new Zip(new ZipOptions());
271
272 $file_names = [];
273
274 for ($i = 0; $i < $ulimit * 2; $i++) {
275 $path_inside_zip = $file_names[] = 'test' . $i;
276 $zip->addStream(Streams::ofString('-'), $path_inside_zip);
277 }
278 $this->assertTrue(true); // no warning or error
279
280 // check if the zip now contains all files
281 $unzip = new Unzip(new UnzipOptions(), $zip->get());
282 $file_names_in_zip = iterator_to_array($unzip->getFiles());
283 sort($file_names);
284 sort($file_names_in_zip);
285 $this->assertEquals($file_names, $file_names_in_zip);
286 }
static ofString(string $string)
Creates a new stream with an initial value.
Definition: Streams.php:41

References ILIAS\Repository\int(), ILIAS\Filesystem\Stream\Streams\ofString(), and ILIAS\UI\examples\Symbol\Glyph\Sort\sort().

+ Here is the call graph for this function:

◆ testLegacyUnzip()

ILIAS\Filesystem\Util\ZipTest::testLegacyUnzip ( string  $zip,
bool  $has_multiple_root_entries,
int  $expected_amount_directories,
array  $expected_directories,
int  $expected_amount_files,
array  $expected_files 
)
Parameters
mixed[]$expected_directories
mixed[]$expected_files

Definition at line 293 of file ZipTest.php.

300 : void {
301 $legacy = new LegacyArchives();
302
303 $this->assertStringContainsString('.zip', $zip);
304 $zip_path = $this->zips_dir . $zip;
305 $this->assertFileExists($zip_path);
306
307 $temp_unzip_path = $this->unzips_dir . uniqid('unzip', true);
308
309 $return = $legacy->unzip(
310 $zip_path,
311 $temp_unzip_path
312 );
313
314 $this->assertTrue($return);
315
316 $unzipped_files = $this->directoryToArray($temp_unzip_path);
317 $expected_paths = array_merge($expected_directories, $expected_files);
318 sort($expected_paths);
319 $this->assertEquals($expected_paths, $unzipped_files);
320 $this->assertTrue($this->recurseRmdir($temp_unzip_path));
321 }
directoryToArray(string $path_to_directory)
Definition: ZipTest.php:337

◆ testLegacyZip()

ILIAS\Filesystem\Util\ZipTest::testLegacyZip ( )

Definition at line 146 of file ZipTest.php.

146 : void
147 {
148 $legacy = new LegacyArchives();
149
150 define('CLIENT_WEB_DIR', __DIR__);
151 define('ILIAS_WEB_DIR', 'public/data');
152 define('CLIENT_ID', 'test');
153 define('CLIENT_DATA_DIR', __DIR__);
154 define('ILIAS_ABSOLUTE_PATH', __DIR__);
155
156 $legacy->zip($this->zips_dir, $this->unzips_dir . self::ZIPPED_ZIP, false);
157 $this->assertFileExists($this->unzips_dir . self::ZIPPED_ZIP);
158
159 $unzip_again = new Unzip(
160 new UnzipOptions(),
161 Streams::ofResource(fopen($this->unzips_dir . self::ZIPPED_ZIP, 'r'))
162 );
163 $expected = [
164 0 => './',
165 1 => '3_folders_win.zip',
166 2 => '1_folder_mac.zip',
167 3 => '3_folders_mac.zip',
168 4 => '1_folder_win.zip',
169 5 => '1_folder_1_file_mac.zip'
170 ];
171 sort($expected);
172
173 $actual = iterator_to_array($unzip_again->getPaths());
174 sort($actual);
175
176 $this->assertSame($expected, $actual);
177 $this->assertSame(5, $unzip_again->getAmountOfFiles());
178
179 $depth = 0;
180 foreach ($unzip_again->getPaths() as $path) {
181 $parts = explode('/', $path);
182 $depth = max($depth, count($parts));
183 }
184 $this->assertEquals(2, $depth);
185 $this->recurseRmdir($this->unzips_dir);
186 }

References ILIAS\Filesystem\Stream\Streams\ofResource(), ILIAS\Filesystem\Util\ZipTest\recurseRmdir(), and ILIAS\UI\examples\Symbol\Glyph\Sort\sort().

+ Here is the call graph for this function:

◆ testUnzip()

ILIAS\Filesystem\Util\ZipTest::testUnzip ( string  $zip,
bool  $has_multiple_root_entries,
int  $expected_amount_directories,
array  $expected_directories,
int  $expected_amount_files,
array  $expected_files 
)
Parameters
mixed[]$expected_directories
mixed[]$expected_files

Definition at line 222 of file ZipTest.php.

229 : void {
230 $this->assertStringContainsString('.zip', $zip);
231 $zip_path = $this->zips_dir . $zip;
232 $this->assertFileExists($zip_path);
233
234 $stream = Streams::ofResource(fopen($zip_path, 'rb'));
235 $options = new UnzipOptions();
236 $unzip = new Unzip($options, $stream);
237
238 $this->assertFalse($unzip->hasZipReadingError());
239 $this->assertSame($has_multiple_root_entries, $unzip->hasMultipleRootEntriesInZip());
240 $this->assertSame($expected_amount_directories, $unzip->getAmountOfDirectories());
241 $this->assertEquals($expected_directories, iterator_to_array($unzip->getDirectories()));
242 $this->assertSame($expected_amount_files, $unzip->getAmountOfFiles());
243 $this->assertEquals($expected_files, iterator_to_array($unzip->getFiles()));
244 }

◆ testWrongZip()

ILIAS\Filesystem\Util\ZipTest::testWrongZip ( )

Definition at line 246 of file ZipTest.php.

246 : void
247 {
248 $stream = Streams::ofResource(fopen(__FILE__, 'rb'));
249 $options = new UnzipOptions();
250 $unzip = new Unzip($options, $stream);
251 $this->assertTrue($unzip->hasZipReadingError());
252 $this->assertFalse($unzip->hasMultipleRootEntriesInZip());
253 $this->assertCount(0, iterator_to_array($unzip->getFiles()));
254 $this->assertCount(0, iterator_to_array($unzip->getDirectories()));
255 $this->assertCount(0, iterator_to_array($unzip->getPaths()));
256 $this->assertSame([], iterator_to_array($unzip->getDirectories()));
257 $this->assertSame([], iterator_to_array($unzip->getFiles()));
258 }

References ILIAS\UI\Implementation\Component\Input\Field\$options, and ILIAS\Filesystem\Stream\Streams\ofResource().

+ Here is the call graph for this function:

◆ testZip()

ILIAS\Filesystem\Util\ZipTest::testZip ( )

Definition at line 64 of file ZipTest.php.

64 : void
65 {
66 $zip_options = new ZipOptions();
67 $streams = [
68 Streams::ofResource(fopen($this->zips_dir . '1_folder_1_file_mac.zip', 'r')),
69 Streams::ofResource(fopen($this->zips_dir . '1_folder_win.zip', 'r')),
70 ];
71 $zip = new Zip($zip_options, ...$streams);
72 $zip_stream = $zip->get();
73 $this->assertGreaterThan(0, $zip_stream->getSize());
74
75 $unzip_again = new Unzip(new UnzipOptions(), $zip_stream);
76 $this->assertSame(2, $unzip_again->getAmountOfFiles());
77 }

References ILIAS\Filesystem\Stream\Streams\ofResource().

+ Here is the call graph for this function:

◆ testZip2()

ILIAS\Filesystem\Util\ZipTest::testZip2 ( )

Definition at line 79 of file ZipTest.php.

79 : void
80 {
81 $zip_options = new ZipOptions();
82 $streams = [
83 Streams::ofResource(fopen($this->zips_dir . '1_folder_1_file_mac.zip', 'r')),
84 ];
85 $zip = new Zip($zip_options, ...$streams);
86 $zip_stream = $zip->get();
87 $this->assertGreaterThan(0, $zip_stream->getSize());
88
89 $unzip_again = new Unzip(new UnzipOptions(), $zip_stream);
90 $this->assertSame(1, $unzip_again->getAmountOfFiles());
91 }

References ILIAS\Filesystem\Stream\Streams\ofResource().

+ Here is the call graph for this function:

◆ testZip3()

ILIAS\Filesystem\Util\ZipTest::testZip3 ( )

Definition at line 93 of file ZipTest.php.

93 : void
94 {
95 $zip_options = new ZipOptions();
96 $streams = [
97 Streams::ofResource(fopen($this->zips_dir . '1_folder_1_file_mac.zip', 'r')),
98 Streams::ofResource(fopen($this->zips_dir . '1_folder_mac.zip', 'r')),
99 Streams::ofResource(fopen($this->zips_dir . '1_folder_win.zip', 'r')),
100 Streams::ofResource(fopen($this->zips_dir . '3_folders_mac.zip', 'r')),
101 Streams::ofResource(fopen($this->zips_dir . '3_folders_win.zip', 'r')),
102 ];
103 $zip = new Zip($zip_options, ...$streams);
104 $zip_stream = $zip->get();
105 $this->assertGreaterThan(0, $zip_stream->getSize());
106
107 $unzip_again = new Unzip(new UnzipOptions(), $zip_stream);
108 $this->assertSame(5, $unzip_again->getAmountOfFiles());
109 }

References ILIAS\Filesystem\Stream\Streams\ofResource().

+ Here is the call graph for this function:

◆ testZipDoesNotAllowPathsOutsideZip()

ILIAS\Filesystem\Util\ZipTest::testZipDoesNotAllowPathsOutsideZip ( )

Definition at line 129 of file ZipTest.php.

129 : void
130 {
131 $zip = new Zip(new ZipOptions());
132 $zip->addStream(Streams::ofString('a'), '../../etc/passwd');
133 $zip->addStream(Streams::ofString('b'), '/absolute/file.txt');
134 $zip->addStream(Streams::ofString('c'), 'folder/../../other/./file.txt');
135
136 $unzip_again = new Unzip(new UnzipOptions(), $zip->get());
137 $files = iterator_to_array($unzip_again->getFiles());
138 sort($files);
139
140 $this->assertSame(
141 ['absolute/file.txt', 'etc/passwd', 'other/file.txt'],
142 $files
143 );
144 }

References $files, ILIAS\Filesystem\Stream\Streams\ofString(), and ILIAS\UI\examples\Symbol\Glyph\Sort\sort().

+ Here is the call graph for this function:

◆ testZipKeepsPathsInsideZip()

ILIAS\Filesystem\Util\ZipTest::testZipKeepsPathsInsideZip ( )

Definition at line 111 of file ZipTest.php.

111 : void
112 {
113 $streams = [
114 'participant_a/pass_1/index.html' => Streams::ofString('a'),
115 'participant_b/pass_1/index.html' => Streams::ofString('b'),
116 ];
117 $zip = new Zip(new ZipOptions(), ...$streams);
118
119 $unzip_again = new Unzip(new UnzipOptions(), $zip->get());
120 $files = iterator_to_array($unzip_again->getFiles());
121 sort($files);
122
123 $this->assertSame(
124 ['participant_a/pass_1/index.html', 'participant_b/pass_1/index.html'],
125 $files
126 );
127 }

References $files, ILIAS\Filesystem\Stream\Streams\ofString(), and ILIAS\UI\examples\Symbol\Glyph\Sort\sort().

+ Here is the call graph for this function:

Field Documentation

◆ $directories_mixed

array ILIAS\Filesystem\Util\ZipTest::$directories_mixed
staticprotected

Definition at line 374 of file ZipTest.php.

◆ $files_mixed

array ILIAS\Filesystem\Util\ZipTest::$files_mixed
staticprotected
Initial value:
= [
0 => '03_Test.pdf',
1 => 'Ordner A/01_Test.pdf',
2 => 'Ordner A/02_Test.pdf',
3 => 'Ordner A/Ordner A_2/07_Test.pdf',
4 => 'Ordner A/Ordner A_2/08_Test.pdf'
]

Definition at line 366 of file ZipTest.php.

◆ $files_three

array ILIAS\Filesystem\Util\ZipTest::$files_three
staticprotected
Initial value:
= [
0 => 'Ordner A/01_Test.pdf',
1 => 'Ordner A/02_Test.pdf',
2 => 'Ordner A/Ordner A_2/07_Test.pdf',
3 => 'Ordner A/Ordner A_2/08_Test.pdf',
4 => 'Ordner B/03_Test.pdf',
5 => 'Ordner B/04_Test.pdf',
6 => 'Ordner B/Ordner B_2/09_Test.pdf',
7 => 'Ordner B/Ordner B_2/10_Test.pdf',
8 => 'Ordner C/05_Test.pdf',
9 => 'Ordner C/06_Test.pdf',
10 => 'Ordner C/Ordner C_2/11_Test.pdf',
11 => 'Ordner C/Ordner C_2/12_Test.pdf',
]

Definition at line 422 of file ZipTest.php.

◆ $unzips_dir

string ILIAS\Filesystem\Util\ZipTest::$unzips_dir = __DIR__ . '/unzips/'
protected

Definition at line 45 of file ZipTest.php.

◆ $zips_dir

string ILIAS\Filesystem\Util\ZipTest::$zips_dir = __DIR__ . '/zips/'
protected

Definition at line 44 of file ZipTest.php.

◆ ZIPPED_ZIP

const ILIAS\Filesystem\Util\ZipTest::ZIPPED_ZIP = 'zipped.zip'

Definition at line 43 of file ZipTest.php.


The documentation for this class was generated from the following file: