aboutsummaryrefslogtreecommitdiffstats
path: root/tests/phpunit/unit/includes/json
diff options
context:
space:
mode:
authorLegoktm <legoktm@member.fsf.org>2019-06-13 23:00:08 +0000
committerLegoktm <legoktm@member.fsf.org>2019-06-13 23:00:08 +0000
commit4e35134f7a3228a8195a07f49c85188e57ab8487 (patch)
treed9750a18496af4c52eb5dfce56f0d0b79fbd32cb /tests/phpunit/unit/includes/json
parent0a2b996278e57a8b8c5377cd3a3eaa54f993d4a9 (diff)
downloadmediawikicore-4e35134f7a3228a8195a07f49c85188e57ab8487.tar.gz
mediawikicore-4e35134f7a3228a8195a07f49c85188e57ab8487.zip
Revert "Separate MediaWiki unit and integration tests"
This reverts commit 0a2b996278e57a8b8c5377cd3a3eaa54f993d4a9. Reason for revert: Broke postgres tests. Change-Id: I27d8e0c807ad5f0748b9611a4f3df84cc213fbe1
Diffstat (limited to 'tests/phpunit/unit/includes/json')
-rw-r--r--tests/phpunit/unit/includes/json/FormatJsonTest.php436
1 files changed, 0 insertions, 436 deletions
diff --git a/tests/phpunit/unit/includes/json/FormatJsonTest.php b/tests/phpunit/unit/includes/json/FormatJsonTest.php
deleted file mode 100644
index f07eea780d90..000000000000
--- a/tests/phpunit/unit/includes/json/FormatJsonTest.php
+++ /dev/null
@@ -1,436 +0,0 @@
-<?php
-
-/**
- * @covers FormatJson
- */
-class FormatJsonTest extends \MediaWikiUnitTestCase {
-
- public static function provideEncoderPrettyPrinting() {
- return [
- // Four spaces
- [ true, ' ' ],
- [ ' ', ' ' ],
- // Two spaces
- [ ' ', ' ' ],
- // One tab
- [ "\t", "\t" ],
- ];
- }
-
- /**
- * @dataProvider provideEncoderPrettyPrinting
- */
- public function testEncoderPrettyPrinting( $pretty, $expectedIndent ) {
- $obj = [
- 'emptyObject' => new stdClass,
- 'emptyArray' => [],
- 'string' => 'foobar\\',
- 'filledArray' => [
- [
- 123,
- 456,
- ],
- // Nested json works without problems
- '"7":["8",{"9":"10"}]',
- // Whitespace clean up doesn't touch strings that look alike
- "{\n\t\"emptyObject\": {\n\t},\n\t\"emptyArray\": [ ]\n}",
- ],
- ];
-
- // No trailing whitespace, no trailing linefeed
- $json = '{
- "emptyObject": {},
- "emptyArray": [],
- "string": "foobar\\\\",
- "filledArray": [
- [
- 123,
- 456
- ],
- "\"7\":[\"8\",{\"9\":\"10\"}]",
- "{\n\t\"emptyObject\": {\n\t},\n\t\"emptyArray\": [ ]\n}"
- ]
-}';
-
- $json = str_replace( "\r", '', $json ); // Windows compat
- $json = str_replace( "\t", $expectedIndent, $json );
- $this->assertSame( $json, FormatJson::encode( $obj, $pretty ) );
- }
-
- public static function provideEncodeDefault() {
- return self::getEncodeTestCases( [] );
- }
-
- /**
- * @dataProvider provideEncodeDefault
- */
- public function testEncodeDefault( $from, $to ) {
- $this->assertSame( $to, FormatJson::encode( $from ) );
- }
-
- public static function provideEncodeUtf8() {
- return self::getEncodeTestCases( [ 'unicode' ] );
- }
-
- /**
- * @dataProvider provideEncodeUtf8
- */
- public function testEncodeUtf8( $from, $to ) {
- $this->assertSame( $to, FormatJson::encode( $from, false, FormatJson::UTF8_OK ) );
- }
-
- public static function provideEncodeXmlMeta() {
- return self::getEncodeTestCases( [ 'xmlmeta' ] );
- }
-
- /**
- * @dataProvider provideEncodeXmlMeta
- */
- public function testEncodeXmlMeta( $from, $to ) {
- $this->assertSame( $to, FormatJson::encode( $from, false, FormatJson::XMLMETA_OK ) );
- }
-
- public static function provideEncodeAllOk() {
- return self::getEncodeTestCases( [ 'unicode', 'xmlmeta' ] );
- }
-
- /**
- * @dataProvider provideEncodeAllOk
- */
- public function testEncodeAllOk( $from, $to ) {
- $this->assertSame( $to, FormatJson::encode( $from, false, FormatJson::ALL_OK ) );
- }
-
- public function testEncodePhpBug46944() {
- $this->assertNotEquals(
- '\ud840\udc00',
- strtolower( FormatJson::encode( "\xf0\xa0\x80\x80" ) ),
- 'Test encoding an broken json_encode character (U+20000)'
- );
- }
-
- public function testEncodeFail() {
- // Set up a recursive object that can't be encoded.
- $a = new stdClass;
- $b = new stdClass;
- $a->b = $b;
- $b->a = $a;
- $this->assertFalse( FormatJson::encode( $a ) );
- }
-
- public function testDecodeReturnType() {
- $this->assertInternalType(
- 'object',
- FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}' ),
- 'Default to object'
- );
-
- $this->assertInternalType(
- 'array',
- FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}', true ),
- 'Optional array'
- );
- }
-
- public static function provideParse() {
- return [
- [ null ],
- [ true ],
- [ false ],
- [ 0 ],
- [ 1 ],
- [ 1.2 ],
- [ '' ],
- [ 'str' ],
- [ [ 0, 1, 2 ] ],
- [ [ 'a' => 'b' ] ],
- [ [ 'a' => 'b' ] ],
- [ [ 'a' => 'b', 'x' => [ 'c' => 'd' ] ] ],
- ];
- }
-
- /**
- * Recursively convert arrays into stdClass
- * @param array|string|bool|int|float|null $value
- * @return stdClass|string|bool|int|float|null
- */
- public static function toObject( $value ) {
- return !is_array( $value ) ? $value : (object)array_map( __METHOD__, $value );
- }
-
- /**
- * @dataProvider provideParse
- * @param mixed $value
- */
- public function testParse( $value ) {
- $expected = self::toObject( $value );
- $json = FormatJson::encode( $expected, false, FormatJson::ALL_OK );
- $this->assertJson( $json );
-
- $st = FormatJson::parse( $json );
- $this->assertInstanceOf( Status::class, $st );
- $this->assertTrue( $st->isGood() );
- $this->assertEquals( $expected, $st->getValue() );
-
- $st = FormatJson::parse( $json, FormatJson::FORCE_ASSOC );
- $this->assertInstanceOf( Status::class, $st );
- $this->assertTrue( $st->isGood() );
- $this->assertEquals( $value, $st->getValue() );
- }
-
- /**
- * Test data for testParseTryFixing.
- *
- * Some PHP interpreters use json-c rather than the JSON.org canonical
- * parser to avoid being encumbered by the "shall be used for Good, not
- * Evil" clause of the JSON.org parser's license. By default, json-c
- * parses in a non-strict mode which allows trailing commas for array and
- * object delarations among other things, so our JSON_ERROR_SYNTAX rescue
- * block is not always triggered. It however isn't lenient in exactly the
- * same ways as our TRY_FIXING mode, so the assertions in this test are
- * a bit more complicated than they ideally would be:
- *
- * Optional third argument: true if json-c parses the value without
- * intervention, false otherwise. Defaults to true.
- *
- * Optional fourth argument: expected cannonical JSON serialization of
- * json-c parsed result. Defaults to the second argument's value.
- */
- public static function provideParseTryFixing() {
- return [
- [ "[,]", '[]', false ],
- [ "[ , ]", '[]', false ],
- [ "[ , }", false ],
- [ '[1],', false, true, '[1]' ],
- [ "[1,]", '[1]' ],
- [ "[1\n,]", '[1]' ],
- [ "[1,\n]", '[1]' ],
- [ "[1,]\n", '[1]' ],
- [ "[1\n,\n]\n", '[1]' ],
- [ '["a,",]', '["a,"]' ],
- [ "[[1,]\n,[2,\n],[3\n,]]", '[[1],[2],[3]]' ],
- // I wish we could parse this, but would need quote parsing
- [ '[[1,],[2,],[3,]]', false, true, '[[1],[2],[3]]' ],
- [ '[1,,]', false, false, '[1]' ],
- ];
- }
-
- /**
- * @dataProvider provideParseTryFixing
- * @param string $value
- * @param string|bool $expected Expected result with strict parser
- * @param bool $jsoncParses Will json-c parse this value without TRY_FIXING?
- * @param string|bool $expectedJsonc Expected result with lenient parser
- * if different from the strict expectation
- */
- public function testParseTryFixing(
- $value, $expected,
- $jsoncParses = true, $expectedJsonc = null
- ) {
- // PHP5 results are always expected to have isGood() === false
- $expectedGoodStatus = false;
-
- // Check to see if json parser allows trailing commas
- if ( json_decode( '[1,]' ) !== null ) {
- // Use json-c specific expected result if provided
- $expected = ( $expectedJsonc === null ) ? $expected : $expectedJsonc;
- // If json-c parses the value natively, expect isGood() === true
- $expectedGoodStatus = $jsoncParses;
- }
-
- $st = FormatJson::parse( $value, FormatJson::TRY_FIXING );
- $this->assertInstanceOf( Status::class, $st );
- if ( $expected === false ) {
- $this->assertFalse( $st->isOK(), 'Expected isOK() == false' );
- } else {
- $this->assertSame( $expectedGoodStatus, $st->isGood(),
- 'Expected isGood() == ' . ( $expectedGoodStatus ? 'true' : 'false' )
- );
- $this->assertTrue( $st->isOK(), 'Expected isOK == true' );
- $val = FormatJson::encode( $st->getValue(), false, FormatJson::ALL_OK );
- $this->assertEquals( $expected, $val );
- }
- }
-
- public static function provideParseErrors() {
- return [
- [ 'aaa' ],
- [ '{"j": 1 ] }' ],
- ];
- }
-
- /**
- * @dataProvider provideParseErrors
- * @param mixed $value
- */
- public function testParseErrors( $value ) {
- $st = FormatJson::parse( $value );
- $this->assertInstanceOf( Status::class, $st );
- $this->assertFalse( $st->isOK() );
- }
-
- public function provideStripComments() {
- return [
- [ '{"a":"b"}', '{"a":"b"}' ],
- [ "{\"a\":\"b\"}\n", "{\"a\":\"b\"}\n" ],
- [ '/*c*/{"c":"b"}', '{"c":"b"}' ],
- [ '{"a":"c"}/*c*/', '{"a":"c"}' ],
- [ '/*c//d*/{"c":"b"}', '{"c":"b"}' ],
- [ '{/*c*/"c":"b"}', '{"c":"b"}' ],
- [ "/*\nc\r\n*/{\"c\":\"b\"}", '{"c":"b"}' ],
- [ "//c\n{\"c\":\"b\"}", '{"c":"b"}' ],
- [ "//c\r\n{\"c\":\"b\"}", '{"c":"b"}' ],
- [ '{"a":"c"}//c', '{"a":"c"}' ],
- [ "{\"a-c\"://c\n\"b\"}", '{"a-c":"b"}' ],
- [ '{"/*a":"b"}', '{"/*a":"b"}' ],
- [ '{"a":"//b"}', '{"a":"//b"}' ],
- [ '{"a":"b/*c*/"}', '{"a":"b/*c*/"}' ],
- [ "{\"\\\"/*a\":\"b\"}", "{\"\\\"/*a\":\"b\"}" ],
- [ '', '' ],
- [ '/*c', '' ],
- [ '//c', '' ],
- [ '"http://example.com"', '"http://example.com"' ],
- [ "\0", "\0" ],
- [ '"Blåbærsyltetøy"', '"Blåbærsyltetøy"' ],
- ];
- }
-
- /**
- * @covers FormatJson::stripComments
- * @dataProvider provideStripComments
- * @param string $json
- * @param string $expect
- */
- public function testStripComments( $json, $expect ) {
- $this->assertSame( $expect, FormatJson::stripComments( $json ) );
- }
-
- public function provideParseStripComments() {
- return [
- [ '/* blah */true', true ],
- [ "// blah \ntrue", true ],
- [ '[ "a" , /* blah */ "b" ]', [ 'a', 'b' ] ],
- ];
- }
-
- /**
- * @covers FormatJson::parse
- * @covers FormatJson::stripComments
- * @dataProvider provideParseStripComments
- * @param string $json
- * @param mixed $expect
- */
- public function testParseStripComments( $json, $expect ) {
- $st = FormatJson::parse( $json, FormatJson::STRIP_COMMENTS );
- $this->assertInstanceOf( Status::class, $st );
- $this->assertTrue( $st->isGood() );
- $this->assertEquals( $expect, $st->getValue() );
- }
-
- /**
- * Generate a set of test cases for a particular combination of encoder options.
- *
- * @param array $unescapedGroups List of character groups to leave unescaped
- * @return array Arrays of unencoded strings and corresponding encoded strings
- */
- private static function getEncodeTestCases( array $unescapedGroups ) {
- $groups = [
- 'always' => [
- // Forward slash (always unescaped)
- '/' => '/',
-
- // Control characters
- "\0" => '\u0000',
- "\x08" => '\b',
- "\t" => '\t',
- "\n" => '\n',
- "\r" => '\r',
- "\f" => '\f',
- "\x1f" => '\u001f', // representative example
-
- // Double quotes
- '"' => '\"',
-
- // Backslashes
- '\\' => '\\\\',
- '\\\\' => '\\\\\\\\',
- '\\u00e9' => '\\\u00e9', // security check for Unicode unescaping
-
- // Line terminators
- "\xe2\x80\xa8" => '\u2028',
- "\xe2\x80\xa9" => '\u2029',
- ],
- 'unicode' => [
- "\xc3\xa9" => '\u00e9',
- "\xf0\x9d\x92\x9e" => '\ud835\udc9e', // U+1D49E, outside the BMP
- ],
- 'xmlmeta' => [
- '<' => '\u003C', // JSON_HEX_TAG uses uppercase hex digits
- '>' => '\u003E',
- '&' => '\u0026',
- ],
- ];
-
- $cases = [];
- foreach ( $groups as $name => $rules ) {
- $leaveUnescaped = in_array( $name, $unescapedGroups );
- foreach ( $rules as $from => $to ) {
- $cases[] = [ $from, '"' . ( $leaveUnescaped ? $from : $to ) . '"' ];
- }
- }
-
- return $cases;
- }
-
- public function provideEmptyJsonKeyStrings() {
- return [
- [
- '{"":"foo"}',
- '{"":"foo"}',
- ''
- ],
- [
- '{"_empty_":"foo"}',
- '{"_empty_":"foo"}',
- '_empty_' ],
- [
- '{"\u005F\u0065\u006D\u0070\u0074\u0079\u005F":"foo"}',
- '{"_empty_":"foo"}',
- '_empty_'
- ],
- [
- '{"_empty_":"bar","":"foo"}',
- '{"_empty_":"bar","":"foo"}',
- ''
- ],
- [
- '{"":"bar","_empty_":"foo"}',
- '{"":"bar","_empty_":"foo"}',
- '_empty_'
- ]
- ];
- }
-
- /**
- * @covers FormatJson::encode
- * @covers FormatJson::decode
- * @dataProvider provideEmptyJsonKeyStrings
- * @param string $json
- *
- * Decoding behavior with empty keys can be surprising.
- * See https://phabricator.wikimedia.org/T206411
- */
- public function testEmptyJsonKeyArray( $json, $expect, $php71Name ) {
- // Decoding to array is consistent across supported PHP versions
- $this->assertSame( $expect, FormatJson::encode(
- FormatJson::decode( $json, true ) ) );
-
- // Decoding to object differs between supported PHP versions
- $obj = FormatJson::decode( $json );
- if ( version_compare( PHP_VERSION, '7.1', '<' ) ) {
- $this->assertEquals( 'foo', $obj->_empty_ );
- } else {
- $this->assertEquals( 'foo', $obj->{$php71Name} );
- }
- }
-}