1--TEST--
2Serialize object into session, full set
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}
10if (!extension_loaded("session")) {
11   echo "skip needs session enabled";
12}
13--FILE--
14<?php
15if(!extension_loaded('msgpack')) {
16    dl('msgpack.' . PHP_SHLIB_SUFFIX);
17}
18
19class Foo {
20    private static $s1 = array();
21    protected static $s2 = array();
22    public static $s3 = array();
23
24    private $d1;
25    protected $d2;
26    public $d3;
27
28    public function __construct($foo) {
29        $this->d1 = $foo;
30        $this->d2 = $foo;
31        $this->d3 = $foo;
32    }
33}
34
35class Bar {
36    private static $s1 = array();
37    protected static $s2 = array();
38    public static $s3 = array();
39
40    public $d1;
41    private $d2;
42    protected $d3;
43
44    public function __construct() {
45    }
46
47    public function set($foo) {
48        $this->d1 = $foo;
49        $this->d2 = $foo;
50        $this->d3 = $foo;
51    }
52}
53
54$output = '';
55
56function open($path, $name) {
57    return true;
58}
59
60function close() {
61    return true;
62}
63
64function read($id) {
65    global $output;
66    $output .= "read" . PHP_EOL;
67    $a = new Bar();
68    $b = new Foo($a);
69    $a->set($b);
70    $session = array('old' => $b);
71    return msgpack_serialize($session);
72}
73
74function write($id, $data) {
75    global $output;
76    $output .= "write: ";
77    $output .= bin2hex($data) . PHP_EOL;
78    return true;
79}
80
81function destroy($id) {
82    return true;
83}
84
85function gc($time) {
86    return true;
87}
88
89ini_set('session.serialize_handler', 'msgpack');
90
91session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');
92
93session_start();
94
95$_SESSION['test'] = "foobar";
96$a = new Bar();
97$b = new Foo($a);
98$a->set($b);
99$_SESSION['new'] = $a;
100
101session_write_close();
102
103echo $output;
104var_dump($_SESSION);
105?>
106--EXPECTF--
107read
108write: 84c001a36f6c6484c0a3466f6fa700466f6f00643184c0a3426172a2643182c0040002a70042617200643282c0040002a5002a00643382c0040002a5002a00643282c0040003a2643382c0040003a474657374a6666f6f626172a36e657784c0a3426172a2643184c0a3466f6fa700466f6f00643182c0040009a5002a00643282c0040009a2643382c0040009a70042617200643282c004000aa5002a00643382c004000a
109array(3) {
110  ["old"]=>
111  object(Foo)#3 (3) {
112    [%r"?d1"?:("Foo":)?private"?%r]=>
113    object(Bar)#4 (3) {
114      ["d1"]=>
115      *RECURSION*
116      [%r"?d2"?:("Bar":)?private"?%r]=>
117      *RECURSION*
118      [%r"?d3"?:protected"?%r]=>
119      *RECURSION*
120    }
121    [%r"?d2"?:protected"?%r]=>
122    object(Bar)#4 (3) {
123      ["d1"]=>
124      *RECURSION*
125      [%r"?d2"?:("Bar":)?private"?%r]=>
126      *RECURSION*
127      [%r"?d3"?:protected"?%r]=>
128      *RECURSION*
129    }
130    ["d3"]=>
131    object(Bar)#4 (3) {
132      ["d1"]=>
133      *RECURSION*
134      [%r"?d2"?:("Bar":)?private"?%r]=>
135      *RECURSION*
136      [%r"?d3"?:protected"?%r]=>
137      *RECURSION*
138    }
139  }
140  ["test"]=>
141  string(6) "foobar"
142  ["new"]=>
143  object(Bar)#5 (3) {
144    ["d1"]=>
145    object(Foo)#6 (3) {
146      [%r"?d1"?:("Foo":)?private"?%r]=>
147      *RECURSION*
148      [%r"?d2"?:protected"?%r]=>
149      *RECURSION*
150      ["d3"]=>
151      *RECURSION*
152    }
153    [%r"?d2"?:("Bar":)?private"?%r]=>
154    object(Foo)#6 (3) {
155      [%r"?d1"?:("Foo":)?private"?%r]=>
156      *RECURSION*
157      [%r"?d2"?:protected"?%r]=>
158      *RECURSION*
159      ["d3"]=>
160      *RECURSION*
161    }
162    [%r"?d3"?:protected"?%r]=>
163    object(Foo)#6 (3) {
164      [%r"?d1"?:("Foo":)?private"?%r]=>
165      *RECURSION*
166      [%r"?d2"?:protected"?%r]=>
167      *RECURSION*
168      ["d3"]=>
169      *RECURSION*
170    }
171  }
172}
173