Chris@18
|
1 <?php
|
Chris@18
|
2
|
Chris@18
|
3 namespace Tests\Brumann\Polyfill;
|
Chris@18
|
4
|
Chris@18
|
5 use Brumann\Polyfill\Unserialize;
|
Chris@18
|
6
|
Chris@18
|
7 class UnserializeTest extends \PHPUnit_Framework_TestCase
|
Chris@18
|
8 {
|
Chris@18
|
9 public function test_unserialize_without_options_returns_instance()
|
Chris@18
|
10 {
|
Chris@18
|
11 $foo = new Foo();
|
Chris@18
|
12 $serialized = serialize($foo);
|
Chris@18
|
13
|
Chris@18
|
14 $unserialized = Unserialize::unserialize($serialized);
|
Chris@18
|
15
|
Chris@18
|
16 $this->assertInstanceOf('Tests\\Brumann\\Polyfill\\Foo', $unserialized);
|
Chris@18
|
17 }
|
Chris@18
|
18
|
Chris@18
|
19 public function test_unserialize_with_cqn_returns_instance()
|
Chris@18
|
20 {
|
Chris@18
|
21 $foo = new Foo();
|
Chris@18
|
22 $serialized = serialize($foo);
|
Chris@18
|
23 $options = array(
|
Chris@18
|
24 'allowed_classes' => array('Tests\\Brumann\\Polyfill\\Foo'),
|
Chris@18
|
25 );
|
Chris@18
|
26
|
Chris@18
|
27 $unserialized = Unserialize::unserialize($serialized, $options);
|
Chris@18
|
28
|
Chris@18
|
29 $this->assertInstanceOf('Tests\\Brumann\\Polyfill\\Foo', $unserialized);
|
Chris@18
|
30 }
|
Chris@18
|
31
|
Chris@18
|
32 public function test_unserialize_with_fqcn_allowed_returns_instance()
|
Chris@18
|
33 {
|
Chris@18
|
34 $foo = new Foo();
|
Chris@18
|
35 $serialized = serialize($foo);
|
Chris@18
|
36 $options = array(
|
Chris@18
|
37 'allowed_classes' => array('\\Tests\\Brumann\\Polyfill\\Foo'),
|
Chris@18
|
38 );
|
Chris@18
|
39
|
Chris@18
|
40 $unserialized = Unserialize::unserialize($serialized, $options);
|
Chris@18
|
41
|
Chris@18
|
42 $this->assertInstanceOf('__PHP_Incomplete_Class', $unserialized);
|
Chris@18
|
43 }
|
Chris@18
|
44
|
Chris@18
|
45 public function test_unserialize_with_allowed_classes_false_returns_incomplete_object()
|
Chris@18
|
46 {
|
Chris@18
|
47 $foo = new Foo();
|
Chris@18
|
48 $serialized = serialize($foo);
|
Chris@18
|
49 $options = array(
|
Chris@18
|
50 'allowed_classes' => false,
|
Chris@18
|
51 );
|
Chris@18
|
52
|
Chris@18
|
53 $unserialized = Unserialize::unserialize($serialized, $options);
|
Chris@18
|
54
|
Chris@18
|
55 $this->assertInstanceOf('__PHP_Incomplete_Class', $unserialized);
|
Chris@18
|
56 }
|
Chris@18
|
57
|
Chris@18
|
58 /**
|
Chris@18
|
59 * @requires PHP < 7.0
|
Chris@18
|
60 *
|
Chris@18
|
61 * @expectedException \PHPUnit_Framework_Error_Warning
|
Chris@18
|
62 * @expectedMessage allowed_classes option should be array or boolean
|
Chris@18
|
63 */
|
Chris@18
|
64 public function test_unserialize_with_allowed_classes_null_behaves_like_php71()
|
Chris@18
|
65 {
|
Chris@18
|
66 $foo = new Foo();
|
Chris@18
|
67 $serialized = serialize($foo);
|
Chris@18
|
68 $options = array(
|
Chris@18
|
69 'allowed_classes' => null,
|
Chris@18
|
70 );
|
Chris@18
|
71
|
Chris@18
|
72 Unserialize::unserialize($serialized, $options);
|
Chris@18
|
73 }
|
Chris@18
|
74
|
Chris@18
|
75 /**
|
Chris@18
|
76 * @expectedException \PHPUnit_Framework_Error_Notice
|
Chris@18
|
77 * @expectedExceptionMessage tried to execute a method or access a property of an incomplete object.
|
Chris@18
|
78 */
|
Chris@18
|
79 public function test_accessing_property_of_incomplete_object_returns_warning()
|
Chris@18
|
80 {
|
Chris@18
|
81 $bar = new \stdClass();
|
Chris@18
|
82 $bar->foo = new Foo();
|
Chris@18
|
83 $serialized = serialize($bar);
|
Chris@18
|
84 $options = array(
|
Chris@18
|
85 'allowed_classes' => array('Tests\\Brumann\\Polyfill\\Foo'),
|
Chris@18
|
86 );
|
Chris@18
|
87
|
Chris@18
|
88 $unserialized = Unserialize::unserialize($serialized, $options);
|
Chris@18
|
89
|
Chris@18
|
90 $this->assertInstanceOf('__PHP_Incomplete_Class', $unserialized);
|
Chris@18
|
91 $unserialized->foo;
|
Chris@18
|
92 }
|
Chris@18
|
93
|
Chris@18
|
94 public function test_unserialize_only_parent_object()
|
Chris@18
|
95 {
|
Chris@18
|
96 $foo = new Foo();
|
Chris@18
|
97 $foo->bar = new \stdClass();
|
Chris@18
|
98 $serialized = serialize($foo);
|
Chris@18
|
99 $options = array(
|
Chris@18
|
100 'allowed_classes' => array('Tests\\Brumann\\Polyfill\\Foo'),
|
Chris@18
|
101 );
|
Chris@18
|
102
|
Chris@18
|
103 $unserialized = Unserialize::unserialize($serialized, $options);
|
Chris@18
|
104
|
Chris@18
|
105 $this->assertInstanceOf('\\Tests\\Brumann\\Polyfill\\Foo', $unserialized);
|
Chris@18
|
106 $this->assertInstanceOf('__PHP_Incomplete_Class', $unserialized->bar);
|
Chris@18
|
107 }
|
Chris@18
|
108
|
Chris@18
|
109 public function test_unserialize_parent_and_embedded_object()
|
Chris@18
|
110 {
|
Chris@18
|
111 $foo = new Foo();
|
Chris@18
|
112 $foo->foo = new Foo();
|
Chris@18
|
113 $serialized = serialize($foo);
|
Chris@18
|
114 $options = array(
|
Chris@18
|
115 'allowed_classes' => array('Tests\\Brumann\\Polyfill\\Foo'),
|
Chris@18
|
116 );
|
Chris@18
|
117
|
Chris@18
|
118 $unserialized = Unserialize::unserialize($serialized, $options);
|
Chris@18
|
119
|
Chris@18
|
120 $this->assertInstanceOf('\\Tests\\Brumann\\Polyfill\\Foo', $unserialized);
|
Chris@18
|
121 $this->assertInstanceOf('\\Tests\\Brumann\\Polyfill\\Foo', $unserialized->foo);
|
Chris@18
|
122 }
|
Chris@18
|
123
|
Chris@18
|
124 public function test_unserialize_with_allowed_classes_false_serializes_string()
|
Chris@18
|
125 {
|
Chris@18
|
126 $string = 'This is an ordinary string';
|
Chris@18
|
127 $serialized = serialize($string);
|
Chris@18
|
128 $options = array(
|
Chris@18
|
129 'allowed_classes' => false,
|
Chris@18
|
130 );
|
Chris@18
|
131
|
Chris@18
|
132 $unserialized = Unserialize::unserialize($serialized, $options);
|
Chris@18
|
133
|
Chris@18
|
134 $this->assertEquals($string, $unserialized);
|
Chris@18
|
135 }
|
Chris@18
|
136
|
Chris@18
|
137 public function test_unserialize_with_allowed_classes_false_serializes_bool()
|
Chris@18
|
138 {
|
Chris@18
|
139 $bool = true;
|
Chris@18
|
140 $serialized = serialize($bool);
|
Chris@18
|
141 $options = array(
|
Chris@18
|
142 'allowed_classes' => false,
|
Chris@18
|
143 );
|
Chris@18
|
144
|
Chris@18
|
145 $unserialized = Unserialize::unserialize($serialized, $options);
|
Chris@18
|
146
|
Chris@18
|
147 $this->assertEquals($bool, $unserialized);
|
Chris@18
|
148 }
|
Chris@18
|
149
|
Chris@18
|
150 public function test_unserialize_with_allowed_classes_false_serializes_array()
|
Chris@18
|
151 {
|
Chris@18
|
152 $array = array(
|
Chris@18
|
153 'key' => 42,
|
Chris@18
|
154 1 => 'foo',
|
Chris@18
|
155 'bar' => 'baz',
|
Chris@18
|
156 2 => 23,
|
Chris@18
|
157 4 => true,
|
Chris@18
|
158 );
|
Chris@18
|
159 $serialized = serialize($array);
|
Chris@18
|
160 $options = array(
|
Chris@18
|
161 'allowed_classes' => false,
|
Chris@18
|
162 );
|
Chris@18
|
163
|
Chris@18
|
164 $unserialized = Unserialize::unserialize($serialized, $options);
|
Chris@18
|
165
|
Chris@18
|
166 $this->assertSame($array, $unserialized);
|
Chris@18
|
167 }
|
Chris@18
|
168
|
Chris@18
|
169 public function test_double_serialized_unserializes_as_first_serialized()
|
Chris@18
|
170 {
|
Chris@18
|
171 $foo = new Foo();
|
Chris@18
|
172 $first = serialize($foo);
|
Chris@18
|
173 $second = serialize($first);
|
Chris@18
|
174 $options = array(
|
Chris@18
|
175 'allowed_classes' => false,
|
Chris@18
|
176 );
|
Chris@18
|
177
|
Chris@18
|
178 $unserialized = Unserialize::unserialize($second, $options);
|
Chris@18
|
179
|
Chris@18
|
180 $this->assertSame($first, $unserialized);
|
Chris@18
|
181 }
|
Chris@18
|
182
|
Chris@18
|
183 public function test_double_unserialize_double_serialized()
|
Chris@18
|
184 {
|
Chris@18
|
185 $foo = new Foo();
|
Chris@18
|
186 $serialized = serialize(serialize($foo));
|
Chris@18
|
187 $options = array(
|
Chris@18
|
188 'allowed_classes' => false,
|
Chris@18
|
189 );
|
Chris@18
|
190
|
Chris@18
|
191 $first = Unserialize::unserialize($serialized, $options);
|
Chris@18
|
192 $unserialized = Unserialize::unserialize($first, $options);
|
Chris@18
|
193
|
Chris@18
|
194 $this->assertInstanceOf('__PHP_Incomplete_Class', $unserialized);
|
Chris@18
|
195 }
|
Chris@18
|
196 }
|