1--TEST--
2Filter errors: user filter
3--FILE--
4<?php
5require 'filter_errors.inc';
6
7class test_filter0 extends php_user_filter {
8    function filter($in, $out, &$consumed, $closing): int {
9        return PSFS_ERR_FATAL;
10    }
11}
12class test_filter1 extends php_user_filter {
13    function filter($in, $out, &$consumed, $closing): int {
14        $bucket = stream_bucket_make_writeable($in);
15        return PSFS_ERR_FATAL;
16    }
17}
18class test_filter2 extends php_user_filter {
19    function filter($in, $out, &$consumed, $closing): int {
20        while ($bucket = stream_bucket_make_writeable($in)) {
21            $consumed += $bucket->datalen;
22            stream_bucket_append($out, $bucket);
23        }
24        return PSFS_ERR_FATAL;
25    }
26}
27class test_filter3 extends php_user_filter {
28    function filter($in, $out, &$consumed, $closing): int {
29        if (!$closing) {
30            $bucket = stream_bucket_new($this->stream, "42");
31            stream_bucket_append($out, $bucket);
32        }
33        return PSFS_ERR_FATAL;
34    }
35}
36class test_filter4 extends php_user_filter {
37    function filter($in, $out, &$consumed, $closing): int {
38        if (!$closing) {
39            $bucket = stream_bucket_new($this->stream, "42");
40        }
41        return PSFS_ERR_FATAL;
42    }
43}
44
45for($i = 0; $i < 5; ++$i) {
46    echo "test_filter$i\n";
47    var_dump(stream_filter_register("test_filter$i", "test_filter$i"));
48    filter_errors_test("test_filter$i", "42");
49}
50
51echo "test append / read / remove\n";
52for($i = 0; $i < 5; ++$i) {
53    echo "test_filter$i\n";
54    $stream = fopen('php://memory', 'wb+');
55    fwrite($stream, "42");
56    fseek($stream, 0, SEEK_SET);
57    $f = stream_filter_append($stream, "test_filter$i");
58    stream_get_contents($stream);
59    stream_filter_remove($f);
60}
61
62echo "test append all / read / remove all\n";
63$stream = fopen('php://memory', 'wb+');
64fwrite($stream, "42");
65fseek($stream, 0, SEEK_SET);
66$filters = array();
67for($i = 0; $i < 5; ++$i) {
68    echo "test_filter$i\n";
69    $filters[] = stream_filter_append($stream, "test_filter$i");
70}
71stream_get_contents($stream);
72foreach($filters as $filter) {
73    stream_filter_remove($filter);
74}
75
76echo "test append all / read / close\n";
77$stream = fopen('php://memory', 'wb+');
78fwrite($stream, "42");
79fseek($stream, 0, SEEK_SET);
80$filters = array();
81for($i = 0; $i < 5; ++$i) {
82    echo "test_filter$i\n";
83    $filters[] = stream_filter_append($stream, "test_filter$i");
84}
85stream_get_contents($stream);
86fclose($stream);
87
88?>
89--EXPECTF--
90test_filter0
91bool(true)
92test filtering of buffered data
93
94Warning: stream_filter_append(): Unprocessed filter buckets remaining on input brigade in %s
95
96Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s
97test filtering of non buffered data
98
99Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
100test_filter1
101bool(true)
102test filtering of buffered data
103
104Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s
105test filtering of non buffered data
106test_filter2
107bool(true)
108test filtering of buffered data
109
110Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s
111test filtering of non buffered data
112test_filter3
113bool(true)
114test filtering of buffered data
115
116Warning: stream_filter_append(): Unprocessed filter buckets remaining on input brigade in %s
117
118Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s
119test filtering of non buffered data
120
121Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
122test_filter4
123bool(true)
124test filtering of buffered data
125
126Warning: stream_filter_append(): Unprocessed filter buckets remaining on input brigade in %s
127
128Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s
129test filtering of non buffered data
130
131Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
132test append / read / remove
133test_filter0
134
135Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
136
137Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
138test_filter1
139
140Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
141test_filter2
142
143Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
144test_filter3
145
146Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
147
148Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
149test_filter4
150
151Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
152
153Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
154test append all / read / remove all
155test_filter0
156test_filter1
157test_filter2
158test_filter3
159test_filter4
160
161Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
162
163Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
164
165Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
166
167Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
168
169Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
170
171Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
172test append all / read / close
173test_filter0
174test_filter1
175test_filter2
176test_filter3
177test_filter4
178
179Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
180