Some bugzilla.wikimedia.org -> phabricator.wikimedia.org changes
[lhc/web/wiklou.git] / tests / phpunit / includes / api / format / ApiFormatPhpTest.php
1 <?php
2
3 /**
4 * @group API
5 * @covers ApiFormatPhp
6 */
7 class ApiFormatPhpTest extends ApiFormatTestBase {
8
9 protected $printerName = 'php';
10
11 private static function addFormatVersion( $format, $arr ) {
12 foreach ( $arr as &$p ) {
13 if ( !isset( $p[2] ) ) {
14 $p[2] = array( 'formatversion' => $format );
15 } else {
16 $p[2]['formatversion'] = $format;
17 }
18 }
19 return $arr;
20 }
21
22 public static function provideGeneralEncoding() {
23 return array_merge(
24 self::addFormatVersion( 1, array(
25 // Basic types
26 array( array( null ), 'a:1:{i:0;N;}' ),
27 array( array( true ), 'a:1:{i:0;s:0:"";}' ),
28 array( array( false ), 'a:0:{}' ),
29 array( array( true, ApiResult::META_BC_BOOLS => array( 0 ) ),
30 'a:1:{i:0;b:1;}' ),
31 array( array( false, ApiResult::META_BC_BOOLS => array( 0 ) ),
32 'a:1:{i:0;b:0;}' ),
33 array( array( 42 ), 'a:1:{i:0;i:42;}' ),
34 array( array( 42.5 ), 'a:1:{i:0;d:42.5;}' ),
35 array( array( 1e42 ), 'a:1:{i:0;d:1.0E+42;}' ),
36 array( array( 'foo' ), 'a:1:{i:0;s:3:"foo";}' ),
37 array( array( 'fóo' ), 'a:1:{i:0;s:4:"fóo";}' ),
38
39 // Arrays and objects
40 array( array( array() ), 'a:1:{i:0;a:0:{}}' ),
41 array( array( array( 1 ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
42 array( array( array( 'x' => 1 ) ), 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ),
43 array( array( array( 2 => 1 ) ), 'a:1:{i:0;a:1:{i:2;i:1;}}' ),
44 array( array( (object)array() ), 'a:1:{i:0;a:0:{}}' ),
45 array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
46 array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
47 array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ),
48 array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
49 'a:1:{i:0;a:1:{i:0;a:2:{s:3:"key";s:1:"x";s:1:"*";i:1;}}}' ),
50 array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ),
51 array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), 'a:1:{i:0;a:2:{i:0;s:1:"a";i:1;s:1:"b";}}' ),
52
53 // Content
54 array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
55 'a:1:{s:1:"*";s:3:"foo";}' ),
56
57 // BC Subelements
58 array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
59 'a:1:{s:3:"foo";a:1:{s:1:"*";s:3:"foo";}}' ),
60 ) ),
61 self::addFormatVersion( 2, array(
62 // Basic types
63 array( array( null ), 'a:1:{i:0;N;}' ),
64 array( array( true ), 'a:1:{i:0;b:1;}' ),
65 array( array( false ), 'a:1:{i:0;b:0;}' ),
66 array( array( true, ApiResult::META_BC_BOOLS => array( 0 ) ),
67 'a:1:{i:0;b:1;}' ),
68 array( array( false, ApiResult::META_BC_BOOLS => array( 0 ) ),
69 'a:1:{i:0;b:0;}' ),
70 array( array( 42 ), 'a:1:{i:0;i:42;}' ),
71 array( array( 42.5 ), 'a:1:{i:0;d:42.5;}' ),
72 array( array( 1e42 ), 'a:1:{i:0;d:1.0E+42;}' ),
73 array( array( 'foo' ), 'a:1:{i:0;s:3:"foo";}' ),
74 array( array( 'fóo' ), 'a:1:{i:0;s:4:"fóo";}' ),
75
76 // Arrays and objects
77 array( array( array() ), 'a:1:{i:0;a:0:{}}' ),
78 array( array( array( 1 ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
79 array( array( array( 'x' => 1 ) ), 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ),
80 array( array( array( 2 => 1 ) ), 'a:1:{i:0;a:1:{i:2;i:1;}}' ),
81 array( array( (object)array() ), 'a:1:{i:0;a:0:{}}' ),
82 array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
83 array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
84 array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ),
85 array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
86 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ),
87 array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
88 array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), 'a:1:{i:0;a:2:{i:0;s:1:"a";i:1;s:1:"b";}}' ),
89
90 // Content
91 array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
92 'a:1:{s:7:"content";s:3:"foo";}' ),
93
94 // BC Subelements
95 array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
96 'a:1:{s:3:"foo";s:3:"foo";}' ),
97 ) )
98 );
99 }
100
101 public function testCrossDomainMangling() {
102 $config = new HashConfig( array( 'MangleFlashPolicy' => false ) );
103 $context = new RequestContext;
104 $context->setConfig( new MultiConfig( array(
105 $config,
106 $context->getConfig(),
107 ) ) );
108 $main = new ApiMain( $context );
109 $main->getResult()->addValue( null, null, '< Cross-Domain-Policy >' );
110
111 if ( !function_exists( 'wfOutputHandler' ) ) {
112 function wfOutputHandler( $s ) {
113 return $s;
114 }
115 }
116
117 $printer = $main->createPrinterByName( 'php' );
118 ob_start( 'wfOutputHandler' );
119 $printer->initPrinter();
120 $printer->execute();
121 $printer->closePrinter();
122 $ret = ob_get_clean();
123 $this->assertSame( 'a:1:{i:0;s:23:"< Cross-Domain-Policy >";}', $ret );
124
125 $config->set( 'MangleFlashPolicy', true );
126 $printer = $main->createPrinterByName( 'php' );
127 ob_start( 'wfOutputHandler' );
128 try {
129 $printer->initPrinter();
130 $printer->execute();
131 $printer->closePrinter();
132 ob_end_clean();
133 $this->fail( 'Expected exception not thrown' );
134 } catch ( UsageException $ex ) {
135 ob_end_clean();
136 $this->assertSame(
137 'This response cannot be represented using format=php. See https://phabricator.wikimedia.org/T68776',
138 $ex->getMessage(),
139 'Expected exception'
140 );
141 }
142 }
143
144 }