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