1--TEST--
2Check for unbuffered streaming unserialization (single)
3--SKIPIF--
4<?php
5if ((version_compare(PHP_VERSION, '5.2.13') <= 0) ||
6    (version_compare(PHP_VERSION, '5.3.0') >= 0 &&
7     version_compare(PHP_VERSION, '5.3.2') <= 0)) {
8    echo "skip tests in PHP 5.2.14/5.3.3 or newer";
9}
10--FILE--
11<?php
12if(!extension_loaded('msgpack')) {
13    dl('msgpack.' . PHP_SHLIB_SUFFIX);
14}
15
16$unpacker = new MessagePackUnpacker();
17
18function test($type, $variable, $test = null) {
19    $serialized = msgpack_serialize($variable);
20
21    global $unpacker;
22
23    $length = strlen($serialized);
24
25    $str = "";
26    $offset = 0;
27
28    for ($i = 0; $i < $length;) {
29        $len = rand(1, 10);
30        $str .= substr($serialized, $i, $len);
31
32        if ($unpacker->execute($str, $offset))
33        {
34            $unserialized = $unpacker->data();
35            var_dump($unserialized);
36
37            $unpacker->reset();
38            $str = "";
39            $offset = 0;
40        }
41
42        $i += $len;
43    }
44
45    if (!is_bool($test))
46    {
47        echo $unserialized === $variable ? 'OK' : 'ERROR', PHP_EOL;
48    }
49    else
50    {
51        echo $test || $unserialized == $variable ? 'OK' : 'ERROR', PHP_EOL;
52    }
53}
54
55test('null', null);
56
57test('bool: true', true);
58test('bool: false', false);
59
60test('zero: 0', 0);
61test('small: 1', 1);
62test('small: -1', -1);
63test('medium: 1000', 1000);
64test('medium: -1000', -1000);
65test('large: 100000', 100000);
66test('large: -100000', -100000);
67
68test('double: 123.456', 123.456);
69
70test('empty: ""', "");
71test('string: "foobar"', "foobar");
72
73test('array: empty', array(), false);
74test('array(1, 2, 3)', array(1, 2, 3), false);
75test('array(array(1, 2, 3), arr...', array(array(1, 2, 3), array(4, 5, 6), array(7, 8, 9)), false);
76
77test('array("foo", "foo", "foo")', array("foo", "foo", "foo"), false);
78test('array("one" => 1, "two" => 2))', array("one" => 1, "two" => 2), false);
79test('array("kek" => "lol", "lol" => "kek")', array("kek" => "lol", "lol" => "kek"), false);
80test('array("" => "empty")', array("" => "empty"), false);
81
82$a = array('foo');
83test('array($a, $a)', array($a, $a), false);
84test('array(&$a, &$a)', array(&$a, &$a), false);
85
86$a = array(null);
87$b = array(&$a);
88$a[0] = &$b;
89
90test('cyclic', $a, true);
91
92$a = array(
93    'a' => array(
94        'b' => 'c',
95        'd' => 'e'
96        ),
97    'f' => array(
98        'g' => 'h'
99        )
100    );
101
102test('array', $a, false);
103
104class Obj {
105    public $a;
106    protected $b;
107    private $c;
108
109    function __construct($a, $b, $c) {
110        $this->a = $a;
111        $this->b = $b;
112        $this->c = $c;
113    }
114}
115
116test('object', new Obj(1, 2, 3), false);
117
118test('object', array(new Obj(1, 2, 3), new Obj(4, 5, 6)), false);
119
120$o = new Obj(1, 2, 3);
121
122test('object', array(&$o, &$o), false);
123--EXPECTF--
124NULL
125OK
126bool(true)
127OK
128bool(false)
129OK
130int(0)
131OK
132int(1)
133OK
134int(-1)
135OK
136int(1000)
137OK
138int(-1000)
139OK
140int(100000)
141OK
142int(-100000)
143OK
144float(123.456)
145OK
146string(0) ""
147OK
148string(6) "foobar"
149OK
150array(0) {
151}
152OK
153array(3) {
154  [0]=>
155  int(1)
156  [1]=>
157  int(2)
158  [2]=>
159  int(3)
160}
161OK
162array(3) {
163  [0]=>
164  array(3) {
165    [0]=>
166    int(1)
167    [1]=>
168    int(2)
169    [2]=>
170    int(3)
171  }
172  [1]=>
173  array(3) {
174    [0]=>
175    int(4)
176    [1]=>
177    int(5)
178    [2]=>
179    int(6)
180  }
181  [2]=>
182  array(3) {
183    [0]=>
184    int(7)
185    [1]=>
186    int(8)
187    [2]=>
188    int(9)
189  }
190}
191OK
192array(3) {
193  [0]=>
194  string(3) "foo"
195  [1]=>
196  string(3) "foo"
197  [2]=>
198  string(3) "foo"
199}
200OK
201array(2) {
202  ["one"]=>
203  int(1)
204  ["two"]=>
205  int(2)
206}
207OK
208array(2) {
209  ["kek"]=>
210  string(3) "lol"
211  ["lol"]=>
212  string(3) "kek"
213}
214OK
215array(1) {
216  [""]=>
217  string(5) "empty"
218}
219OK
220array(2) {
221  [0]=>
222  array(1) {
223    [0]=>
224    string(3) "foo"
225  }
226  [1]=>
227  array(1) {
228    [0]=>
229    string(3) "foo"
230  }
231}
232OK
233array(2) {
234  [0]=>
235  &array(1) {
236    [0]=>
237    string(3) "foo"
238  }
239  [1]=>
240  &array(1) {
241    [0]=>
242    string(3) "foo"
243  }
244}
245OK
246array(1) {
247  [0]=>
248  &array(1) {
249    [0]=>
250    array(1) {
251      [0]=>
252      *RECURSION*
253    }
254  }
255}
256OK
257array(2) {
258  ["a"]=>
259  array(2) {
260    ["b"]=>
261    string(1) "c"
262    ["d"]=>
263    string(1) "e"
264  }
265  ["f"]=>
266  array(1) {
267    ["g"]=>
268    string(1) "h"
269  }
270}
271OK
272object(Obj)#%d (3) {
273  ["a"]=>
274  int(1)
275  [%r"?b"?:protected"?%r]=>
276  int(2)
277  [%r"?c"?:("Obj":)?private"?%r]=>
278  int(3)
279}
280OK
281array(2) {
282  [0]=>
283  object(Obj)#%d (3) {
284    ["a"]=>
285    int(1)
286    [%r"?b"?:protected"?%r]=>
287    int(2)
288    [%r"?c"?:("Obj":)?private"?%r]=>
289    int(3)
290  }
291  [1]=>
292  object(Obj)#%d (3) {
293    ["a"]=>
294    int(4)
295    [%r"?b"?:protected"?%r]=>
296    int(5)
297    [%r"?c"?:("Obj":)?private"?%r]=>
298    int(6)
299  }
300}
301OK
302array(2) {
303  [0]=>
304  &object(Obj)#%d (3) {
305    ["a"]=>
306    int(1)
307    [%r"?b"?:protected"?%r]=>
308    int(2)
309    [%r"?c"?:("Obj":)?private"?%r]=>
310    int(3)
311  }
312  [1]=>
313  &object(Obj)#%d (3) {
314    ["a"]=>
315    int(1)
316    [%r"?b"?:protected"?%r]=>
317    int(2)
318    [%r"?c"?:("Obj":)?private"?%r]=>
319    int(3)
320  }
321}
322OK
323