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