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