xref: /PHP-8.0/ext/phar/tests/fopen_edgecases.phpt (revision 7aacc705)
1--TEST--
2Phar: fopen/stat/fseek/unlink/rename edge cases
3--SKIPIF--
4<?php if (!extension_loaded("phar")) die("skip"); ?>
5--INI--
6phar.readonly=0
7phar.require_hash=0
8--FILE--
9<?php
10$fname = __DIR__ . '/' . basename(__FILE__, '.php') . '.phar.php';
11$fname2 = __DIR__ . '/' . basename(__FILE__, '.php') . '.2.phar.php';
12$fname3 = __DIR__ . '/' . basename(__FILE__, '.php') . '.3.phar.php';
13$pname = 'phar://' . $fname;
14$pname2 = 'phar://' . $fname2;
15$pname3 = 'phar://' . $fname3;
16
17// create in cwd
18chdir(__DIR__);
19file_put_contents('phar://fopen_edgetest.phar/hi', 'hi');
20// append
21$a = fopen($pname . '/b/c.php', 'a');
22// invalid pharname
23$a = fopen($pname . '.phar.gz', 'r');
24// test phar_open_url() with quiet stat for code coverage
25var_dump(file_exists($pname . '.phar.gz/hi'));
26// test open for write with new phar
27$a = fopen($pname . '/hi', 'w');
28fclose($a);
29// test open for write with corrupted phar
30file_put_contents($fname2, '<?php oh crap __HALT_COMPILER();');
31$a = fopen($pname2 . '/hi', 'w');
32$a = fopen('phar://', 'r');
33$a = fopen('phar://foo.phar', 'r');
34
35file_put_contents($pname . '/hi', 'hi');
36$a = fopen($pname . '/hi', 'r');
37var_dump(fseek($a, 1), ftell($a));
38var_dump(fseek($a, 1, SEEK_CUR), ftell($a));
39fclose($a);
40
41var_dump(stat('phar://'));
42var_dump(stat('phar://foo.phar'));
43var_dump(is_dir($pname));
44
45// this tests coverage of the case where the phar exists and has no files
46$phar = new Phar($fname3);
47var_dump(file_exists($pname3 . '/test'));
48
49unlink($pname2 . '/hi');
50unlink('phar://');
51unlink('phar://foo.phar');
52unlink($pname . '/oops');
53
54rename('phar://', 'phar://');
55rename($pname . '/hi', 'phar://');
56rename('phar://foo.phar/hi', 'phar://');
57rename($pname . '/hi', 'phar://foo.phar/hi');
58
59ini_set('phar.readonly', 1);
60rename($pname . '/hi', $pname . '/there');
61ini_set('phar.readonly', 0);
62Phar::unlinkArchive($fname);
63file_put_contents($pname . '/test.php', '<?php
64$a = fopen("./notfound.php", "r");
65?>');
66include $pname . '/test.php';
67?>
68
69--CLEAN--
70<?php unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '.phar.php'); ?>
71<?php unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '.2.phar.php'); ?>
72<?php unlink(__DIR__ . '/fopen_edgetest.phar'); ?>
73--EXPECTF--
74Warning: fopen(phar://%sfopen_edgecases.phar.php/b/c.php): Failed to open stream: phar error: open mode append not supported in %sfopen_edgecases.php on line %d
75
76Warning: fopen(phar://%sfopen_edgecases.phar.php.phar.gz): Failed to open stream: phar error: invalid url or non-existent phar "phar://%sfopen_edgecases.phar.php.phar.gz" in %sfopen_edgecases.php on line %d
77bool(false)
78
79Warning: fopen(phar://%sfopen_edgecases.2.phar.php/hi): Failed to open stream: internal corruption of phar "%sfopen_edgecases.2.phar.php" (truncated manifest at stub end) in %sfopen_edgecases.php on line %d
80
81Warning: fopen(phar://): Failed to open stream: phar error: no directory in "phar://", must have at least phar:/// for root directory (always use full path to a new phar) in %sfopen_edgecases.php on line %d
82
83Warning: fopen(phar://foo.phar): Failed to open stream: %s in %sfopen_edgecases.php on line %d
84int(0)
85int(1)
86int(0)
87int(2)
88
89Warning: stat(): stat failed for phar:// in %sfopen_edgecases.php on line %d
90bool(false)
91
92Warning: stat(): stat failed for phar://foo.phar in %sfopen_edgecases.php on line %d
93bool(false)
94bool(true)
95bool(false)
96
97Warning: unlink(): internal corruption of phar "%sfopen_edgecases.2.phar.php" (truncated manifest at stub end) in %sfopen_edgecases.php on line %d
98
99Warning: unlink(): phar error: unlink failed in %sfopen_edgecases.php on line %d
100
101Warning: unlink(): phar error: no directory in "phar://", must have at least phar:/// for root directory (always use full path to a new phar) in %sfopen_edgecases.php on line %d
102
103Warning: unlink(): phar error: unlink failed in %sfopen_edgecases.php on line %d
104
105Warning: unlink(): phar error: invalid url or non-existent phar "phar://foo.phar" in %sfopen_edgecases.php on line %d
106
107Warning: unlink(): phar error: unlink failed in %sfopen_edgecases.php on line %d
108
109Warning: unlink(): unlink of "phar://%sfopen_edgecases.phar.php/oops" failed, file does not exist in %sfopen_edgecases.php on line %d
110
111Warning: rename(): phar error: cannot rename "phar://" to "phar://": invalid or non-writable url "phar://" in %sfopen_edgecases.php on line %d
112
113Warning: rename(): phar error: cannot rename "phar://%sfopen_edgecases.phar.php/hi" to "phar://": invalid or non-writable url "phar://" in %sfopen_edgecases.php on line %d
114
115Warning: rename(): phar error: cannot rename "phar://foo.phar/hi" to "phar://": invalid or non-writable url "phar://" in %sfopen_edgecases.php on line %d
116
117Warning: rename(): phar error: cannot rename "phar://%sfopen_edgecases.phar.php/hi" to "phar://foo.phar/hi", not within the same phar archive in %sfopen_edgecases.php on line %d
118
119Warning: rename(): phar error: cannot rename "phar://%sfopen_edgecases.phar.php/hi" to "phar://%sfopen_edgecases.phar.php/there": invalid or non-writable url "phar://%sfopen_edgecases.phar.php/hi" in %sfopen_edgecases.php on line %d
120
121Warning: fopen(./notfound.php): Failed to open stream: No such file or directory in phar://%sfopen_edgecases.phar.php/test.php on line %d
122
123