Completed
Push — master ( 87b7a4...6ce28d )
by Gaetano
11:11 queued 06:38
created

ParsingBugsTests::tearDown()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 7
c 0
b 0
f 0
nc 3
nop 0
dl 0
loc 9
rs 10
1
<?php
2
/**
3
 * NB: do not let your IDE fool you. The correct encoding for this file is NOT UTF8.
4
 */
5
include_once __DIR__ . '/../lib/xmlrpc.inc';
6
include_once __DIR__ . '/../lib/xmlrpcs.inc';
7
8
include_once __DIR__ . '/parse_args.php';
9
10
/**
11
 * Tests involving parsing of xml and handling of xmlrpc values
12
 */
13
class ParsingBugsTests extends PHPUnit_Framework_TestCase
14
{
15
    public $args = array();
16
17
    protected function setUp()
18
    {
19
        $this->args = argParser::getArgs();
20
        if ($this->args['DEBUG'] == 1)
21
            ob_start();
22
    }
23
24
    protected function tearDown()
25
    {
26
        if ($this->args['DEBUG'] != 1)
27
            return;
28
        $out = ob_get_clean();
29
        $status = $this->getStatus();
30
        if ($status == PHPUnit_Runner_BaseTestRunner::STATUS_ERROR
31
            || $status == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE) {
32
            echo $out;
33
        }
34
    }
35
36
    protected function newMsg($methodName, $params = array())
37
    {
38
        $msg = new xmlrpcmsg($methodName, $params);
39
        $msg->setDebug($this->args['DEBUG']);
40
        return $msg;
41
    }
42
43
    public function testMinusOneString()
44
    {
45
        $v = new xmlrpcval('-1');
46
        $u = new xmlrpcval('-1', 'string');
47
        $t = new xmlrpcval(-1, 'string');
48
        $this->assertEquals($v->scalarval(), $u->scalarval());
49
        $this->assertEquals($v->scalarval(), $t->scalarval());
50
    }
51
52
    /**
53
     * This looks funny, and we might call it a bug. But we strive for 100 backwards compat...
54
     */
55
    public function testMinusOneInt()
56
    {
57
        $u = new xmlrpcval();
58
        $v = new xmlrpcval(-1);
59
        $this->assertEquals($u->scalarval(), $v->scalarval());
60
    }
61
62
    public function testUnicodeInMemberName()
63
    {
64
        $str = "G" . chr(252) . "nter, El" . chr(232) . "ne";
65
        $v = array($str => new xmlrpcval(1));
66
        $r = new xmlrpcresp(new xmlrpcval($v, 'struct'));
67
        $r = $r->serialize();
68
        $m = $this->newMsg('dummy');
69
        $r = $m->parseResponse($r);
70
        $v = $r->value();
71
        $this->assertEquals(true, $v->structmemexists($str));
0 ignored issues
show
Bug introduced by
The method structmemexists() does not exist on integer. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

71
        $this->assertEquals(true, $v->/** @scrutinizer ignore-call */ structmemexists($str));

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
72
    }
73
74
    public function testUnicodeInErrorString()
75
    {
76
        $response = utf8_encode(
77
            '<?xml version="1.0"?>
78
<!-- $Id -->
79
<!-- found by G. Giunta, covers what happens when lib receives UTF8 chars in response text and comments -->
80
<!-- ' . chr(224) . chr(252) . chr(232) . '&#224;&#252;&#232; -->
81
<methodResponse>
82
<fault>
83
<value>
84
<struct>
85
<member>
86
<name>faultCode</name>
87
<value><int>888</int></value>
88
</member>
89
<member>
90
<name>faultString</name>
91
<value><string>' . chr(224) . chr(252) . chr(232) . '&#224;&#252;&#232;</string></value>
92
</member>
93
</struct>
94
</value>
95
</fault>
96
</methodResponse>');
97
        $m = $this->newMsg('dummy');
98
        $r = $m->parseResponse($response);
99
        $v = $r->faultString();
100
        $this->assertEquals(chr(224) . chr(252) . chr(232) . chr(224) . chr(252) . chr(232), $v);
101
    }
102
103
    public function testValidNumbers()
104
    {
105
        $m = $this->newMsg('dummy');
106
        $fp =
107
            '<?xml version="1.0"?>
108
<methodResponse>
109
<params>
110
<param>
111
<value>
112
<struct>
113
<member>
114
<name>integer1</name>
115
<value><int>01</int></value>
116
</member>
117
<member>
118
<name>integer2</name>
119
<value><int>+1</int></value>
120
</member>
121
<member>
122
<name>integer3</name>
123
<value><i4>1</i4></value>
124
</member>
125
<member>
126
<name>float1</name>
127
<value><double>01.10</double></value>
128
</member>
129
<member>
130
<name>float2</name>
131
<value><double>+1.10</double></value>
132
</member>
133
<member>
134
<name>float3</name>
135
<value><double>-1.10e2</double></value>
136
</member>
137
</struct>
138
</value>
139
</param>
140
</params>
141
</methodResponse>';
142
        $r = $m->parseResponse($fp);
143
        $v = $r->value();
144
        $s = $v->structmem('integer1');
145
        $t = $v->structmem('integer2');
146
        $u = $v->structmem('integer3');
147
        $x = $v->structmem('float1');
148
        $y = $v->structmem('float2');
149
        $z = $v->structmem('float3');
150
        $this->assertEquals(1, $s->scalarval());
151
        $this->assertEquals(1, $t->scalarval());
152
        $this->assertEquals(1, $u->scalarval());
153
154
        $this->assertEquals(1.1, $x->scalarval());
155
        $this->assertEquals(1.1, $y->scalarval());
156
        $this->assertEquals(-110.0, $z->scalarval());
157
    }
158
159
    public function testI8()
160
    {
161
        if (PHP_INT_SIZE == 4 ) {
162
            $this->markTestSkipped('did not find a locale which sets decimal separator to comma');
163
            return;
164
        }
165
166
        $m = $this->newMsg('dummy');
167
        $fp =
168
            '<?xml version="1.0"?>
169
<methodResponse>
170
<params>
171
<param>
172
<value>
173
<struct>
174
<member>
175
<name>integer1</name>
176
<value><i8>1</i8></value>
177
</member>
178
</struct>
179
</value>
180
</param>
181
</params>
182
</methodResponse>';
183
        $r = $m->parseResponse($fp);
184
        $v = $r->value();
185
        $s = $v->structmem('integer1');
186
        $this->assertEquals(1, $s->scalarval());
187
    }
188
189
    public function testAddScalarToStruct()
190
    {
191
        $v = new xmlrpcval(array('a' => 'b'), 'struct');
192
        // use @ operator in case error_log gets on screen
193
        $r = @$v->addscalar('c');
194
        $this->assertEquals(0, $r);
195
    }
196
197
    public function testAddStructToStruct()
198
    {
199
        $v = new xmlrpcval(array('a' => new xmlrpcval('b')), 'struct');
200
        $r = $v->addstruct(array('b' => new xmlrpcval('c')));
201
        $this->assertEquals(2, $v->structsize());
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Value::structsize() has been deprecated: use count() instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

201
        $this->assertEquals(2, /** @scrutinizer ignore-deprecated */ $v->structsize());

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
202
        $this->assertEquals(1, $r);
203
        $r = $v->addstruct(array('b' => new xmlrpcval('b')));
0 ignored issues
show
Unused Code introduced by
The assignment to $r is dead and can be removed.
Loading history...
204
        $this->assertEquals(2, $v->structsize());
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Value::structsize() has been deprecated: use count() instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

204
        $this->assertEquals(2, /** @scrutinizer ignore-deprecated */ $v->structsize());

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
205
    }
206
207
    public function testAddArrayToArray()
208
    {
209
        $v = new xmlrpcval(array(new xmlrpcval('a'), new xmlrpcval('b')), 'array');
210
        $r = $v->addarray(array(new xmlrpcval('b'), new xmlrpcval('c')));
211
        $this->assertEquals(4, $v->arraysize());
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Value::arraysize() has been deprecated: use count() instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

211
        $this->assertEquals(4, /** @scrutinizer ignore-deprecated */ $v->arraysize());

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
212
        $this->assertEquals(1, $r);
213
    }
214
215
    public function testEncodeArray()
216
    {
217
        $r = range(1, 100);
218
        $v = php_xmlrpc_encode($r);
219
        $this->assertEquals('array', $v->kindof());
220
    }
221
222
    public function testEncodeRecursive()
223
    {
224
        $v = php_xmlrpc_encode(php_xmlrpc_encode('a simple string'));
225
        $this->assertEquals('scalar', $v->kindof());
226
    }
227
228
    public function testBrokenRequests()
229
    {
230
        $s = new xmlrpc_server();
231
        // omitting the 'params' tag: not tolerated by the lib anymore
232
        $f = '<?xml version="1.0"?>
233
<methodCall>
234
<methodName>system.methodHelp</methodName>
235
<param>
236
<value><string>system.methodHelp</string></value>
237
</param>
238
</methodCall>';
239
        $r = $s->parserequest($f);
240
        $this->assertEquals(15, $r->faultCode());
241
        // omitting a 'param' tag
242
        $f = '<?xml version="1.0"?>
243
<methodCall>
244
<methodName>system.methodHelp</methodName>
245
<params>
246
<value><string>system.methodHelp</string></value>
247
</params>
248
</methodCall>';
249
        $r = $s->parserequest($f);
250
        $this->assertEquals(15, $r->faultCode());
251
        // omitting a 'value' tag
252
        $f = '<?xml version="1.0"?>
253
<methodCall>
254
<methodName>system.methodHelp</methodName>
255
<params>
256
<param><string>system.methodHelp</string></param>
257
</params>
258
</methodCall>';
259
        $r = $s->parserequest($f);
260
        $this->assertEquals(15, $r->faultCode());
261
    }
262
263
    public function testBrokenResponses()
264
    {
265
        $m = $this->newMsg('dummy');
266
        // omitting the 'params' tag: no more tolerated by the lib...
267
        $f = '<?xml version="1.0"?>
268
<methodResponse>
269
<param>
270
<value><string>system.methodHelp</string></value>
271
</param>
272
</methodResponse>';
273
        $r = $m->parseResponse($f);
274
        $this->assertEquals(2, $r->faultCode());
275
        // omitting the 'param' tag: no more tolerated by the lib...
276
        $f = '<?xml version="1.0"?>
277
<methodResponse>
278
<params>
279
<value><string>system.methodHelp</string></value>
280
</params>
281
</methodResponse>';
282
        $r = $m->parseResponse($f);
283
        $this->assertEquals(2, $r->faultCode());
284
        // omitting a 'value' tag: KO
285
        $f = '<?xml version="1.0"?>
286
<methodResponse>
287
<params>
288
<param><string>system.methodHelp</string></param>
289
</params>
290
</methodResponse>';
291
        $r = $m->parseResponse($f);
292
        $this->assertEquals(2, $r->faultCode());
293
    }
294
295
    public function testBuggyHttp()
296
    {
297
        $s = $this->newMsg('dummy');
298
        $f = 'HTTP/1.1 100 Welcome to the jungle
299
300
HTTP/1.0 200 OK
301
X-Content-Marx-Brothers: Harpo
302
        Chico and Groucho
303
Content-Length: who knows?
304
305
306
307
<?xml version="1.0"?>
308
<!-- First of all, let\'s check out if the lib properly handles a commented </methodResponse> tag... -->
309
<methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
310
<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>hello world. 2 newlines follow
311
312
313
and there they were.</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
314
<script type="text\javascript">document.write(\'Hello, my name is added nag, I\\\'m happy to serve your content for free\');</script>
315
 ';
316
        $r = $s->parseResponse($f);
317
        $v = $r->value();
318
        $s = $v->structmem('content');
319
        $this->assertEquals("hello world. 2 newlines follow\n\n\nand there they were.", $s->scalarval());
320
    }
321
322
    public function testStringBug()
323
    {
324
        $s = $this->newMsg('dummy');
325
        $f = '<?xml version="1.0"?>
326
<!-- $Id -->
327
<!-- found by [email protected], amongst others
328
 covers what happens when there\'s character data after </string>
329
 and before </value> -->
330
<methodResponse>
331
<params>
332
<param>
333
<value>
334
<struct>
335
<member>
336
<name>success</name>
337
<value>
338
<boolean>1</boolean>
339
</value>
340
</member>
341
<member>
342
<name>sessionID</name>
343
<value>
344
<string>S300510007I</string>
345
</value>
346
</member>
347
</struct>
348
</value>
349
</param>
350
</params>
351
</methodResponse> ';
352
        $r = $s->parseResponse($f);
353
        $v = $r->value();
354
        $s = $v->structmem('sessionID');
355
        $this->assertEquals('S300510007I', $s->scalarval());
356
    }
357
358
    public function testWhiteSpace()
359
    {
360
        $s = $this->newMsg('dummy');
361
        $f = '<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
362
<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>hello world. 2 newlines follow
363
364
365
and there they were.</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
366
';
367
        $r = $s->parseResponse($f);
368
        $v = $r->value();
369
        $s = $v->structmem('content');
370
        $this->assertEquals("hello world. 2 newlines follow\n\n\nand there they were.", $s->scalarval());
371
    }
372
373
    public function testDoubleDataInArrayTag()
374
    {
375
        $s = $this->newMsg('dummy');
376
        $f = '<?xml version="1.0"?><methodResponse><params><param><value><array>
377
<data></data>
378
<data></data>
379
</array></value></param></params></methodResponse>
380
';
381
        $r = $s->parseResponse($f);
382
        $v = $r->faultCode();
383
        $this->assertEquals(2, $v);
384
        $f = '<?xml version="1.0"?><methodResponse><params><param><value><array>
385
<data><value>Hello world</value></data>
386
<data></data>
387
</array></value></param></params></methodResponse>
388
';
389
        $r = $s->parseResponse($f);
390
        $v = $r->faultCode();
391
        $this->assertEquals(2, $v);
392
    }
393
394
    public function testDoubleStuffInValueTag()
395
    {
396
        $s = $this->newMsg('dummy');
397
        $f = '<?xml version="1.0"?><methodResponse><params><param><value>
398
<string>hello world</string>
399
<array><data></data></array>
400
</value></param></params></methodResponse>
401
';
402
        $r = $s->parseResponse($f);
403
        $v = $r->faultCode();
404
        $this->assertEquals(2, $v);
405
        $f = '<?xml version="1.0"?><methodResponse><params><param><value>
406
<string>hello</string>
407
<string>world</string>
408
</value></param></params></methodResponse>
409
';
410
        $r = $s->parseResponse($f);
411
        $v = $r->faultCode();
412
        $this->assertEquals(2, $v);
413
        $f = '<?xml version="1.0"?><methodResponse><params><param><value>
414
<string>hello</string>
415
<struct><member><name>hello><value>world</value></member></struct>
416
</value></param></params></methodResponse>
417
';
418
        $r = $s->parseResponse($f);
419
        $v = $r->faultCode();
420
        $this->assertEquals(2, $v);
421
    }
422
423
    public function testAutodecodeResponse()
424
    {
425
        $s = $this->newMsg('dummy');
426
        $f = '<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
427
<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>hello world. 2 newlines follow
428
429
430
and there they were.</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
431
';
432
        $r = $s->parseResponse($f, true, 'phpvals');
433
        $v = $r->value();
434
        $s = $v['content'];
435
        $this->assertEquals("hello world. 2 newlines follow\n\n\nand there they were.", $s);
436
    }
437
438
    public function testNoDecodeResponse()
439
    {
440
        $s = $this->newMsg('dummy');
441
        $f = '<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
442
<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>hello world. 2 newlines follow
443
444
445
and there they were.</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>';
446
        $r = $s->parseResponse($f, true, 'xml');
447
        $v = $r->value();
448
        $this->assertEquals($f, $v);
449
    }
450
451
    public function testAutoCoDec()
452
    {
453
        $data1 = array(1, 1.0, 'hello world', true, '20051021T23:43:00', -1, 11.0, '~!@#$%^&*()_+|', false, '20051021T23:43:00');
454
        $data2 = array('zero' => $data1, 'one' => $data1, 'two' => $data1, 'three' => $data1, 'four' => $data1, 'five' => $data1, 'six' => $data1, 'seven' => $data1, 'eight' => $data1, 'nine' => $data1);
455
        $data = array($data2, $data2, $data2, $data2, $data2, $data2, $data2, $data2, $data2, $data2);
456
        //$keys = array('zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine');
457
        $v1 = php_xmlrpc_encode($data, array('auto_dates'));
458
        $v2 = php_xmlrpc_decode_xml($v1->serialize());
459
        $this->assertEquals($v1, $v2);
460
        $r1 = new PhpXmlRpc\Response($v1);
461
        $r2 = php_xmlrpc_decode_xml($r1->serialize());
462
        $r2->serialize(); // needed to set internal member payload
463
        $this->assertEquals($r1, $r2);
464
        $m1 = new PhpXmlRpc\Request('hello dolly', array($v1));
465
        $m2 = php_xmlrpc_decode_xml($m1->serialize());
466
        $m2->serialize(); // needed to set internal member payload
467
        $this->assertEquals($m1, $m2);
468
    }
469
470
    public function testUTF8Request()
471
    {
472
        $sendstring = 'κόσμε'; // Greek word 'kosme'. NB: NOT a valid ISO8859 string!
473
        $GLOBALS['xmlrpc_internalencoding'] = 'UTF-8';
474
        \PhpXmlRpc\PhpXmlRpc::importGlobals();
475
        $f = new xmlrpcval($sendstring, 'string');
476
        $v = $f->serialize();
477
        $this->assertEquals("<value><string>&#954;&#8057;&#963;&#956;&#949;</string></value>\n", $v);
478
        $GLOBALS['xmlrpc_internalencoding'] = 'ISO-8859-1';
479
        \PhpXmlRpc\PhpXmlRpc::importGlobals();
480
    }
481
482
    public function testUTF8Response()
483
    {
484
        $string = chr(224) . chr(252) . chr(232);
485
486
        $s = $this->newMsg('dummy');
487
        $f = "HTTP/1.1 200 OK\r\nContent-type: text/xml; charset=UTF-8\r\n\r\n" . '<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
488
<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . utf8_encode($string) . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
489
';
490
        $r = $s->parseResponse($f, false, 'phpvals');
491
        $v = $r->value();
492
        $v = $v['content'];
493
        $this->assertEquals($string, $v);
494
495
        $f = '<?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
496
<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . utf8_encode($string) . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
497
';
498
        $r = $s->parseResponse($f, false, 'phpvals');
499
        $v = $r->value();
500
        $v = $v['content'];
501
        $this->assertEquals($string, $v);
502
503
        $r = php_xmlrpc_decode_xml($f);
504
        $v = $r->value();
0 ignored issues
show
Bug introduced by
The method value() does not exist on PhpXmlRpc\Request. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

504
        /** @scrutinizer ignore-call */ 
505
        $v = $r->value();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
505
        $v = $v->structmem('content')->scalarval();
506
        $this->assertEquals($string, $v);
507
    }
508
509
    public function testLatin1Response()
510
    {
511
        $string = chr(224) . chr(252) . chr(232);
512
513
        $s = $this->newMsg('dummy');
514
        $f = "HTTP/1.1 200 OK\r\nContent-type: text/xml; charset=ISO-8859-1\r\n\r\n" . '<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
515
<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . $string . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
516
';
517
        $r = $s->parseResponse($f, false, 'phpvals');
518
        $v = $r->value();
519
        $v = $v['content'];
520
        $this->assertEquals($string, $v);
521
522
        $f = '<?xml version="1.0" encoding="ISO-8859-1"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
523
<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . $string . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
524
';
525
        $r = $s->parseResponse($f, false, 'phpvals');
526
        $v = $r->value();
527
        $v = $v['content'];
528
        $this->assertEquals($string, $v);
529
530
        $r = php_xmlrpc_decode_xml($f);
531
        $v = $r->value();
532
        $v = $v->structmem('content')->scalarval();
533
        $this->assertEquals($string, $v);
534
    }
535
536
    public function testUTF8IntString()
537
    {
538
        $v = new xmlrpcval(100, 'int');
539
        $s = $v->serialize('UTF-8');
540
        $this->assertequals("<value><int>100</int></value>\n", $s);
541
    }
542
543
    public function testStringInt()
544
    {
545
        $v = new xmlrpcval('hello world', 'int');
546
        $s = $v->serialize();
547
        $this->assertequals("<value><int>0</int></value>\n", $s);
548
    }
549
550
    public function testStructMemExists()
551
    {
552
        $v = php_xmlrpc_encode(array('hello' => 'world'));
553
        $b = $v->structmemexists('hello');
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Value::structmemexists() has been deprecated: use array access, e.g. isset($val[$key]) ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

553
        $b = /** @scrutinizer ignore-deprecated */ $v->structmemexists('hello');

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
554
        $this->assertequals(true, $b);
555
        $b = $v->structmemexists('world');
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Value::structmemexists() has been deprecated: use array access, e.g. isset($val[$key]) ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

555
        $b = /** @scrutinizer ignore-deprecated */ $v->structmemexists('world');

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
556
        $this->assertequals(false, $b);
557
    }
558
559
    public function testNilvalue()
560
    {
561
        // default case: we do not accept nil values received
562
        $v = new xmlrpcval('hello', 'null');
563
        $r = new xmlrpcresp($v);
564
        $s = $r->serialize();
565
        $m = $this->newMsg('dummy');
566
        $r = $m->parseresponse($s);
567
        $this->assertequals(2, $r->faultCode());
568
        // enable reception of nil values
569
        $GLOBALS['xmlrpc_null_extension'] = true;
570
        \PhpXmlRpc\PhpXmlRpc::importGlobals();
571
        $r = $m->parseresponse($s);
572
        $v = $r->value();
573
        $this->assertequals('null', $v->scalartyp());
574
        // test with the apache version: EX:NIL
575
        $GLOBALS['xmlrpc_null_apache_encoding'] = true;
576
        \PhpXmlRpc\PhpXmlRpc::importGlobals();
577
        // serialization
578
        $v = new xmlrpcval('hello', 'null');
579
        $s = $v->serialize();
580
        $this->assertequals(1, preg_match('#<value><ex:nil/></value>#', $s));
581
        // deserialization
582
        $r = new xmlrpcresp($v);
583
        $s = $r->serialize();
584
        $r = $m->parseresponse($s);
585
        $v = $r->value();
586
        $this->assertequals('null', $v->scalartyp());
587
        $GLOBALS['xmlrpc_null_extension'] = false;
588
        \PhpXmlRpc\PhpXmlRpc::importGlobals();
589
        $r = $m->parseresponse($s);
590
        $this->assertequals(2, $r->faultCode());
591
    }
592
593
    public function testLocale()
594
    {
595
        $locale = setlocale(LC_NUMERIC, 0);
596
        /// @todo on php 5.3/win setting locale to german does not seem to set decimal separator to comma...
597
        if (setlocale(LC_NUMERIC, 'deu', 'de_DE@euro', 'de_DE', 'de', 'ge') !== false) {
598
            $v = new xmlrpcval(1.1, 'double');
599
            if (strpos($v->scalarval(), ',') == 1) {
600
                $r = $v->serialize();
601
                $this->assertequals(false, strpos($r, ','));
602
                setlocale(LC_NUMERIC, $locale);
603
            } else {
604
                setlocale(LC_NUMERIC, $locale);
605
                $this->markTestSkipped('did not find a locale which sets decimal separator to comma');
606
            }
607
        } else {
608
            $this->markTestSkipped('did not find a locale which sets decimal separator to comma');
609
        }
610
    }
611
612
    public function testArrayAccess()
613
    {
614
        $v1 = new xmlrpcval(array(new xmlrpcval('one'), new xmlrpcval('two')), 'array');
615
        $this->assertequals(1, count($v1));
616
        $out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
617
618
        foreach($v1 as $key => $val)
619
        {
620
            $this->assertArrayHasKey($key, $out);
621
            $expected = $out[$key];
622
            if (gettype($expected) == 'array') {
623
                $this->assertequals('array', gettype($val));
624
            } else {
625
                $this->assertequals($expected, $val);
626
            }
627
        }
628
629
        $v2 = new \PhpXmlRpc\Value(array(new \PhpXmlRpc\Value('one'), new \PhpXmlRpc\Value('two')), 'array');
630
        $this->assertequals(2, count($v2));
631
        $out = array(array('key' => 0, 'value'  => 'object'), array('key' => 1, 'value'  => 'object'));
632
        $i = 0;
633
        foreach($v2 as $key => $val)
634
        {
635
            $expected = $out[$i];
636
            $this->assertequals($expected['key'], $key);
637
            $this->assertequals($expected['value'], gettype($val));
638
            $i++;
639
        }
640
    }
641
642
    function testBigXML()
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
643
    {
644
        // nb: make sure that  the serialized xml corresponding to this is > 10MB in size
645
        $data = array();
646
        for ($i = 0; $i < 500000; $i++ ) {
647
            $data[] = 'hello world';
648
        }
649
650
        $encoder = new \PhpXmlRpc\Encoder();
651
        $val = $encoder->encode($data);
652
        $req = new \PhpXmlRpc\Request('test', array($val));
653
        $xml = $req->serialize();
654
        $parser = new \PhpXmlRpc\Helper\XMLParser();
655
        $parser->parse($xml);
656
657
        $this->assertequals(0, $parser->_xh['isf']);
658
    }
659
}
660