Make WordPress Core

Changeset 53890


Ignore:
Timestamp:
08/13/2022 12:09:41 PM (4 years ago)
Author:
SergeyBiryukov
Message:

Tests: Bring some consistency to serialization tests.

There were two sets of tests for is_serialized():

  • One in the functions.php file, based on the same file name in core.
  • One in a separate class in the functions directory.

To avoid confusion and make it easier to decide where new tests should go in the future, the existing tests are now combined in the latter location.

Includes:

  • Moving is_serialized() and maybe_serialize() tests into their own classes.
  • Using named data providers to make test output more descriptive.
  • Combining test cases and removing duplicates.

Follow-up to [278/tests], [279/tests], [328/tests], [32631], [45754], [47452], [49382], [53886], [53889].

See #55652.

Location:
trunk/tests/phpunit/tests
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/functions.php

    r53461 r53890  
    372372
    373373                return $formats;
    374         }
    375 
    376         /**
    377          * @dataProvider data_is_not_serialized
    378          */
    379         public function test_maybe_serialize( $value ) {
    380                 if ( is_array( $value ) || is_object( $value ) ) {
    381                         $expected = serialize( $value );
    382                 } else {
    383                         $expected = $value;
    384                 }
    385 
    386                 $this->assertSame( $expected, maybe_serialize( $value ) );
    387         }
    388 
    389         /**
    390          * @dataProvider data_is_serialized
    391          */
    392         public function test_maybe_serialize_with_double_serialization( $value ) {
    393                 $expected = serialize( $value );
    394 
    395                 $this->assertSame( $expected, maybe_serialize( $value ) );
    396         }
    397 
    398         /**
    399          * @dataProvider data_is_serialized
    400          * @dataProvider data_is_not_serialized
    401          */
    402         public function test_maybe_unserialize( $value, $is_serialized ) {
    403                 if ( $is_serialized ) {
    404                         $expected = unserialize( trim( $value ) );
    405                 } else {
    406                         $expected = $value;
    407                 }
    408 
    409                 if ( is_object( $expected ) ) {
    410                         $this->assertEquals( $expected, maybe_unserialize( $value ) );
    411                 } else {
    412                         $this->assertSame( $expected, maybe_unserialize( $value ) );
    413                 }
    414         }
    415 
    416         /**
    417          * @dataProvider data_is_serialized
    418          * @dataProvider data_is_not_serialized
    419          */
    420         public function test_is_serialized( $value, $expected ) {
    421                 $this->assertSame( $expected, is_serialized( $value ) );
    422         }
    423 
    424         /**
    425          * @dataProvider data_serialize_deserialize_objects
    426          */
    427         public function test_deserialize_request_utility_filtered_iterator_objects( $value ) {
    428                 $serialized = maybe_serialize( $value );
    429                 if ( get_class( $value ) === 'Requests_Utility_FilteredIterator' ) {
    430                         $new_value = unserialize( $serialized );
    431                         $property  = ( new ReflectionClass( 'Requests_Utility_FilteredIterator' ) )->getProperty( 'callback' );
    432                         $property->setAccessible( true );
    433                         $callback_value = $property->getValue( $new_value );
    434                         $this->assertSame( null, $callback_value );
    435                 } else {
    436                         $this->assertSame( $value->count(), unserialize( $serialized )->count() );
    437                 }
    438         }
    439 
    440         public function data_serialize_deserialize_objects() {
    441                 return array(
    442                         array( new Requests_Utility_FilteredIterator( array( 1 ), 'md5' ) ),
    443                         array( new Requests_Utility_FilteredIterator( array( 1, 2 ), 'sha1' ) ),
    444                         array( new ArrayIterator( array( 1, 2, 3 ) ) ),
    445                 );
    446         }
    447 
    448         public function data_is_serialized() {
    449                 return array(
    450                         array( serialize( null ), true ),
    451                         array( serialize( true ), true ),
    452                         array( serialize( false ), true ),
    453                         array( serialize( -25 ), true ),
    454                         array( serialize( 25 ), true ),
    455                         array( serialize( 1.1 ), true ),
    456                         array( serialize( 'this string will be serialized' ), true ),
    457                         array( serialize( "a\nb" ), true ),
    458                         array( serialize( array() ), true ),
    459                         array( serialize( array( 1, 1, 2, 3, 5, 8, 13 ) ), true ),
    460                         array(
    461                                 serialize(
    462                                         (object) array(
    463                                                 'test' => true,
    464                                                 '3',
    465                                                 4,
    466                                         )
    467                                 ),
    468                                 true,
    469                         ),
    470                         array( '   s:25:"this string is serialized";   ', true ),
    471                 );
    472         }
    473 
    474         public function data_is_not_serialized() {
    475                 return array(
    476                         array( null, false ),
    477                         array( true, false ),
    478                         array( false, false ),
    479                         array( -25, false ),
    480                         array( 25, false ),
    481                         array( 1.1, false ),
    482                         array( 'this string will be serialized', false ),
    483                         array( "a\nb", false ),
    484                         array( array(), false ),
    485                         array( array( 1, 1, 2, 3, 5, 8, 13 ), false ),
    486                         array(
    487                                 (object) array(
    488                                         'test' => true,
    489                                         '3',
    490                                         4,
    491                                 ),
    492                                 false,
    493                         ),
    494                         array( 'a string', false ),
    495                         array( 'garbage:a:0:garbage;', false ),
    496                         array( 's:4:test;', false ),
    497                 );
    498         }
    499 
    500         /**
    501          * @ticket 46570
    502          * @dataProvider data_is_serialized_should_return_true_for_large_floats
    503          */
    504         public function test_is_serialized_should_return_true_for_large_floats( $value ) {
    505                 $this->assertTrue( is_serialized( $value ) );
    506         }
    507 
    508         public function data_is_serialized_should_return_true_for_large_floats() {
    509                 return array(
    510                         array( serialize( 1.7976931348623157E+308 ) ),
    511                         array( serialize( array( 1.7976931348623157E+308, 1.23e50 ) ) ),
    512                 );
    513         }
    514 
    515         /**
    516          * @ticket 17375
    517          */
    518         public function test_no_new_serializable_types() {
    519                 $this->assertFalse( is_serialized( 'C:16:"Serialized_Class":6:{a:0:{}}' ) );
    520374        }
    521375
  • trunk/tests/phpunit/tests/functions/isSerialized.php

    r53886 r53890  
    1212
    1313        /**
    14          * Run tests on `is_serialized()`.
    15          *
    1614         * @dataProvider data_is_serialized
     15         * @dataProvider data_is_not_serialized
    1716         *
    1817         * @param mixed $data     Data value to test.
    1918         * @param bool  $expected Expected function result.
    2019         */
    21         public function test_is_serialized_string( $data, $expected ) {
     20        public function test_is_serialized( $data, $expected ) {
    2221                $this->assertSame( $expected, is_serialized( $data ) );
    2322        }
    2423
    2524        /**
    26          * Data provider method for testing `is_serialized()`.
     25         * Data provider for `test_is_serialized()`.
    2726         *
    2827         * @return array
     
    3029        public function data_is_serialized() {
    3130                return array(
    32                         'an array'                             => array(
     31                        'serialized empty array'            => array(
     32                                'data'     => serialize( array() ),
     33                                'expected' => true,
     34                        ),
     35                        'serialized non-empty array'        => array(
     36                                'data'     => serialize( array( 1, 1, 2, 3, 5, 8, 13 ) ),
     37                                'expected' => true,
     38                        ),
     39                        'serialized empty object'           => array(
     40                                'data'     => serialize( new stdClass() ),
     41                                'expected' => true,
     42                        ),
     43                        'serialized non-empty object'       => array(
     44                                'data'     => serialize(
     45                                        (object) array(
     46                                                'test' => true,
     47                                                '1',
     48                                                2,
     49                                        )
     50                                ),
     51                                'expected' => true,
     52                        ),
     53                        'serialized null'                   => array(
     54                                'data'     => serialize( null ),
     55                                'expected' => true,
     56                        ),
     57                        'serialized boolean true'           => array(
     58                                'data'     => serialize( true ),
     59                                'expected' => true,
     60                        ),
     61                        'serialized boolean false'          => array(
     62                                'data'     => serialize( false ),
     63                                'expected' => true,
     64                        ),
     65                        'serialized integer -1'             => array(
     66                                'data'     => serialize( -1 ),
     67                                'expected' => true,
     68                        ),
     69                        'serialized integer 1'              => array(
     70                                'data'     => serialize( -1 ),
     71                                'expected' => true,
     72                        ),
     73                        'serialized float 1.1'              => array(
     74                                'data'     => serialize( 1.1 ),
     75                                'expected' => true,
     76                        ),
     77                        'serialized string'                 => array(
     78                                'data'     => serialize( 'this string will be serialized' ),
     79                                'expected' => true,
     80                        ),
     81                        'serialized string with line break' => array(
     82                                'data'     => serialize( "a\nb" ),
     83                                'expected' => true,
     84                        ),
     85                        'serialized string with leading and trailing spaces' => array(
     86                                'data'     => '   s:25:"this string is serialized";   ',
     87                                'expected' => true,
     88                        ),
     89                        'serialized enum'                   => array(
     90                                'data'     => 'E:7:"Foo:bar";',
     91                                'expected' => true,
     92                        ),
     93                );
     94        }
     95
     96        /**
     97         * Data provider for `test_is_serialized()`.
     98         *
     99         * @return array
     100         */
     101        public function data_is_not_serialized() {
     102                return array(
     103                        'an empty array'                             => array(
    33104                                'data'     => array(),
    34105                                'expected' => false,
    35106                        ),
    36                         'an object'                            => array(
     107                        'a non-empty array'                          => array(
     108                                'data'     => array( 1, 1, 2, 3, 5, 8, 13 ),
     109                                'expected' => false,
     110                        ),
     111                        'an empty object'                            => array(
    37112                                'data'     => new stdClass(),
    38113                                'expected' => false,
    39114                        ),
    40                         'a boolean false'                      => array(
     115                        'a non-empty object'                         => array(
     116                                'data'     => (object) array(
     117                                        'test' => true,
     118                                        '1',
     119                                        2,
     120                                ),
     121                                'expected' => false,
     122                        ),
     123                        'null'                                       => array(
     124                                'data'     => null,
     125                                'expected' => false,
     126                        ),
     127                        'a boolean true'                             => array(
     128                                'data'     => true,
     129                                'expected' => false,
     130                        ),
     131                        'a boolean false'                            => array(
    41132                                'data'     => false,
    42133                                'expected' => false,
    43134                        ),
    44                         'a boolean true'                       => array(
    45                                 'data'     => true,
    46                                 'expected' => false,
    47                         ),
    48                         'an integer 0'                         => array(
     135                        'an integer -1'                              => array(
     136                                'data'     => -1,
     137                                'expected' => false,
     138                        ),
     139                        'an integer 0'                               => array(
    49140                                'data'     => 0,
    50141                                'expected' => false,
    51142                        ),
    52                         'an integer 1'                         => array(
     143                        'an integer 1'                               => array(
    53144                                'data'     => 1,
    54145                                'expected' => false,
    55146                        ),
    56                         'a float 0.0'                          => array(
     147                        'a float 0.0'                                => array(
    57148                                'data'     => 0.0,
    58149                                'expected' => false,
    59150                        ),
    60                         'a float 1.0'                          => array(
    61                                 'data'     => 1.0,
    62                                 'expected' => false,
    63                         ),
    64                         'string that is too short'             => array(
     151                        'a float 1.1'                                => array(
     152                                'data'     => 1.1,
     153                                'expected' => false,
     154                        ),
     155                        'a string'                                   => array(
     156                                'data'     => 'a string',
     157                                'expected' => false,
     158                        ),
     159                        'a string with line break'                   => array(
     160                                'data'     => "a\nb",
     161                                'expected' => false,
     162                        ),
     163                        'a string with leading and trailing garbage' => array(
     164                                'data'     => 'garbage:a:0:garbage;',
     165                                'expected' => false,
     166                        ),
     167                        'a string with missing double quotes'        => array(
     168                                'data'     => 's:4:test;',
     169                                'expected' => false,
     170                        ),
     171                        'a string that is too short'                 => array(
    65172                                'data'     => 's:3',
    66173                                'expected' => false,
    67174                        ),
    68                         'not a colon in second position'       => array(
     175                        'not a colon in second position'             => array(
    69176                                'data'     => 's!3:"foo";',
    70177                                'expected' => false,
    71178                        ),
    72                         'no trailing semicolon (strict check)' => array(
     179                        'no trailing semicolon (strict check)'       => array(
    73180                                'data'     => 's:3:"foo"',
    74181                                'expected' => false,
    75182                        ),
    76                         'valid serialized null'                => array(
    77                                 'data'     => 'N;',
    78                                 'expected' => true,
    79                         ),
    80                         'valid serialized Enum'                => array(
    81                                 'data'     => 'E:7:"Foo:bar";',
    82                                 'expected' => true,
    83                         ),
    84183                );
    85184        }
     185
     186        /**
     187         * @ticket 46570
     188         * @dataProvider data_is_serialized_should_return_true_for_large_floats
     189         */
     190        public function test_is_serialized_should_return_true_for_large_floats( $value ) {
     191                $this->assertTrue( is_serialized( $value ) );
     192        }
     193
     194        public function data_is_serialized_should_return_true_for_large_floats() {
     195                return array(
     196                        array( serialize( 1.7976931348623157E+308 ) ),
     197                        array( serialize( array( 1.7976931348623157E+308, 1.23e50 ) ) ),
     198                );
     199        }
     200
     201        /**
     202         * @ticket 17375
     203         */
     204        public function test_no_new_serializable_types() {
     205                $this->assertFalse( is_serialized( 'C:16:"Serialized_Class":6:{a:0:{}}' ) );
     206        }
    86207}
  • trunk/tests/phpunit/tests/functions/isSerializedString.php

    r53889 r53890  
    3232                                'expected' => false,
    3333                        ),
    34                         'a class'                                 => array(
     34                        'an object'                               => array(
    3535                                'data'     => new stdClass(),
    3636                                'expected' => false,
Note: See TracChangeset for help on using the changeset viewer.