Make WordPress Core


Ignore:
Timestamp:
10/18/2024 11:35:02 PM (19 months ago)
Author:
azaozz
Message:

Upgrade/Install: Return WP_Error when source files cannot be found.

Fixes a fatal error in array_keys() (PHP 8.0+) as $wp_filesystem->dirlist() will return false when the source directory doesn't exist or becomes unreadable for some reason.

Props: verygoode, lifelightweb, da5f656f, costdev, afragen, azaozz
Fixes #61114

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/admin/wpUpgrader.php

    r58022 r59257  
    950950
    951951    /**
     952     * Tests that `WP_Upgrader::install_package()` returns a WP_Error object
     953     * when the source directory's file list cannot be retrieved.
     954     *
     955     * @ticket 61114
     956     *
     957     * @covers WP_Upgrader::install_package
     958     */
     959    public function test_install_package_should_return_wp_error_when_source_directory_file_list_cannot_be_retrieved() {
     960        self::$instance->generic_strings();
     961
     962        self::$upgrader_skin_mock
     963                ->expects( $this->once() )
     964                ->method( 'feedback' )
     965                ->with( 'installing_package' );
     966
     967        self::$wp_filesystem_mock
     968                ->expects( $this->once() )
     969                ->method( 'dirlist' )
     970                ->willReturn( false );
     971
     972        $args = array(
     973            'source'      => '/',
     974            'destination' => '/',
     975        );
     976
     977        $actual = self::$instance->install_package( $args );
     978
     979        $this->assertWPError(
     980            $actual,
     981            'WP_Upgrader::install_package() did not return a WP_Error object'
     982        );
     983
     984        $this->assertSame(
     985            'source_read_failed',
     986            $actual->get_error_code(),
     987            'Unexpected WP_Error code'
     988        );
     989    }
     990
     991    /**
     992     * Tests that `WP_Upgrader::install_package()` returns a WP_Error object
     993     * when the source directory is filtered and its file list cannot be retrieved.
     994     *
     995     * @ticket 61114
     996     *
     997     * @covers WP_Upgrader::install_package
     998     *
     999     * @runInSeparateProcess
     1000     * @preserveGlobalState disabled
     1001     */
     1002    public function test_install_package_should_return_wp_error_when_a_filtered_source_directory_file_list_cannot_be_retrieved() {
     1003        define( 'FS_CHMOD_DIR', 0755 );
     1004
     1005        self::$instance->generic_strings();
     1006
     1007        self::$upgrader_skin_mock
     1008                ->expects( $this->once() )
     1009                ->method( 'feedback' )
     1010                ->with( 'installing_package' );
     1011
     1012        $first_source = array(
     1013            'subdir' => array(
     1014                'name'  => 'subdir',
     1015                'type'  => 'd',
     1016                'files' => array( 'subfile.php' ),
     1017            ),
     1018        );
     1019
     1020        self::$wp_filesystem_mock
     1021                ->expects( $this->exactly( 2 ) )
     1022                ->method( 'dirlist' )
     1023                ->willReturn( $first_source, false );
     1024
     1025        $args = array(
     1026            'source'      => '/',
     1027            'destination' => '/',
     1028        );
     1029
     1030        // Filter the source to something else.
     1031        add_filter(
     1032            'upgrader_source_selection',
     1033            static function () {
     1034                return '/not_original_source/';
     1035            }
     1036        );
     1037
     1038        $actual = self::$instance->install_package( $args );
     1039
     1040        $this->assertWPError(
     1041            $actual,
     1042            'WP_Upgrader::install_package() did not return a WP_Error object'
     1043        );
     1044
     1045        $this->assertSame(
     1046            'new_source_read_failed',
     1047            $actual->get_error_code(),
     1048            'Unexpected WP_Error code'
     1049        );
     1050    }
     1051
     1052    /**
    9521053     * Tests that `WP_Upgrader::install_package()` adds a trailing slash to
    9531054     * the source directory of a single file.
Note: See TracChangeset for help on using the changeset viewer.