_baba = 5;
$x->yZ = 'baba'; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
$x->a = array( 5, 111, 'x' );
$this->assertSame(
array(
'_baba' => 5,
'yZ' => 'baba',
'a' => array( 5, 111, 'x' ),
),
wp_parse_args( $x )
);
$y = new MockClass();
$this->assertSame( array(), wp_parse_args( $y ) );
}
public function test_wp_parse_args_array() {
// Arrays.
$a = array();
$this->assertSame( array(), wp_parse_args( $a ) );
$b = array(
'_baba' => 5,
'yZ' => 'baba',
'a' => array( 5, 111, 'x' ),
);
$this->assertSame(
array(
'_baba' => 5,
'yZ' => 'baba',
'a' => array( 5, 111, 'x' ),
),
wp_parse_args( $b )
);
}
public function test_wp_parse_args_defaults() {
$x = new MockClass();
$x->_baba = 5;
$x->yZ = 'baba'; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
$x->a = array( 5, 111, 'x' );
$d = array( 'pu' => 'bu' );
$this->assertSame(
array(
'pu' => 'bu',
'_baba' => 5,
'yZ' => 'baba',
'a' => array( 5, 111, 'x' ),
),
wp_parse_args( $x, $d )
);
$e = array( '_baba' => 6 );
$this->assertSame(
array(
'_baba' => 5,
'yZ' => 'baba',
'a' => array( 5, 111, 'x' ),
),
wp_parse_args( $x, $e )
);
}
public function test_wp_parse_args_other() {
$b = true;
wp_parse_str( $b, $s );
$this->assertSame( $s, wp_parse_args( $b ) );
$q = 'x=5&_baba=dudu&';
wp_parse_str( $q, $ss );
$this->assertSame( $ss, wp_parse_args( $q ) );
}
/**
* @ticket 30753
*/
public function test_wp_parse_args_boolean_strings() {
$args = wp_parse_args( 'foo=false&bar=true' );
$this->assertIsString( $args['foo'] );
$this->assertIsString( $args['bar'] );
}
/**
* @ticket 35972
*/
public function test_bool_from_yn() {
$this->assertTrue( bool_from_yn( 'Y' ) );
$this->assertTrue( bool_from_yn( 'y' ) );
$this->assertFalse( bool_from_yn( 'n' ) );
}
public function test_path_is_absolute() {
$absolute_paths = array(
'/',
'/foo/',
'/foo',
'/FOO/bar',
'/foo/bar/',
'/foo/../bar/',
'\\WINDOWS',
'C:\\',
'C:\\WINDOWS',
'\\\\sambashare\\foo',
);
foreach ( $absolute_paths as $path ) {
$this->assertTrue( path_is_absolute( $path ), "path_is_absolute('$path') should return true" );
}
}
public function test_path_is_not_absolute() {
$relative_paths = array(
'',
'.',
'..',
'../foo',
'../',
'../foo.bar',
'foo/bar',
'foo',
'FOO',
'..\\WINDOWS',
);
foreach ( $relative_paths as $path ) {
$this->assertFalse( path_is_absolute( $path ), "path_is_absolute('$path') should return false" );
}
}
/**
* Tests path_join().
*
* @ticket 55897
* @dataProvider data_path_join
*/
public function test_path_join( $base, $path, $expected ) {
$this->assertSame( $expected, path_join( $base, $path ) );
}
/**
* Data provider for test_path_join().
*
* @return string[][]
*/
public function data_path_join() {
return array(
// Absolute paths.
'absolute path should return path' => array(
'base' => 'base',
'path' => '/path',
'expected' => '/path',
),
'windows path with slashes' => array(
'base' => 'base',
'path' => '//path',
'expected' => '//path',
),
'windows path with backslashes' => array(
'base' => 'base',
'path' => '\\\\path',
'expected' => '\\\\path',
),
// Non-absolute paths.
'join base and path' => array(
'base' => 'base',
'path' => 'path',
'expected' => 'base/path',
),
'strip trailing slashes in base' => array(
'base' => 'base///',
'path' => 'path',
'expected' => 'base/path',
),
'empty path' => array(
'base' => 'base',
'path' => '',
'expected' => 'base/',
),
'empty base' => array(
'base' => '',
'path' => 'path',
'expected' => '/path',
),
'empty path and base' => array(
'base' => '',
'path' => '',
'expected' => '/',
),
);
}
/**
* @ticket 33265
* @ticket 35996
*
* @dataProvider data_wp_normalize_path
*/
public function test_wp_normalize_path( $path, $expected ) {
$this->assertSame( $expected, wp_normalize_path( $path ) );
}
public function data_wp_normalize_path() {
return array(
// Windows paths.
array( 'C:\\www\\path\\', 'C:/www/path/' ),
array( 'C:\\www\\\\path\\', 'C:/www/path/' ),
array( 'c:/www/path', 'C:/www/path' ),
array( 'c:\\www\\path\\', 'C:/www/path/' ), // Uppercase drive letter.
array( 'c:\\\\www\\path\\', 'C:/www/path/' ),
array( '\\\\Domain\\DFSRoots\\share\\path\\', '//Domain/DFSRoots/share/path/' ),
array( '\\\\Server\\share\\path', '//Server/share/path' ),
array( '\\\\Server\\share', '//Server/share' ),
// Linux paths.
array( '/www/path/', '/www/path/' ),
array( '/www/path/////', '/www/path/' ),
array( '/www/path', '/www/path' ),
// PHP stream wrappers.
array( 'php://input', 'php://input' ),
array( 'http://example.com//path.ext', 'http://example.com/path.ext' ),
array( 'file://c:\\www\\path\\', 'file://C:/www/path/' ),
);
}
public function test_wp_unique_filename() {
$testdir = DIR_TESTDATA . '/images/';
// Confidence check.
$this->assertSame( 'abcdefg.png', wp_unique_filename( $testdir, 'abcdefg.png' ), 'Test non-existing file, file name should be unchanged.' );
// Ensure correct images exist.
$this->assertFileExists( $testdir . 'test-image.png', 'Test image does not exist' );
$this->assertFileDoesNotExist( $testdir . 'test-image-1.png' );
// Check number is appended if file already exists.
$this->assertSame( 'test-image-1.png', wp_unique_filename( $testdir, 'test-image.png' ), 'File name not unique, number not appended.' );
// Check file with uppercase extension.
$this->assertSame( 'test-image-1.png', wp_unique_filename( $testdir, 'test-image.PNG' ), 'File name with uppercase extension not unique, number not appended.' );
// Check file name with already added number.
$this->assertSame( 'test-image-2-1.gif', wp_unique_filename( $testdir, 'test-image-2.gif' ), 'File name not unique, number not appended correctly.' );
// Check special chars.
$this->assertSame( 'testtest-image.png', wp_unique_filename( $testdir, 'testtést-imagé.png' ), 'Filename with special chars failed' );
// Check special chars with potential conflicting name.
$this->assertSame( 'test-image-1.png', wp_unique_filename( $testdir, 'tést-imagé.png' ), 'Filename with special chars failed' );
// Check with single quotes in name (somehow).
$this->assertSame( 'abcdefgh.png', wp_unique_filename( $testdir, "abcdefg'h.png" ), 'File with quote failed' );
// Check with double quotes in name (somehow).
$this->assertSame( 'abcdefgh.png', wp_unique_filename( $testdir, 'abcdefg"h.png' ), 'File with quote failed' );
// Test crazy name (useful for regression tests).
$this->assertSame( '12af34567890@.^_qwerty-fghjkl-zx.png', wp_unique_filename( $testdir, '12%af34567890#~!@#$..%^&*()|_+qwerty fgh`jkl zx<>?:"{}[]="\'/?.png' ), 'Failed crazy file name' );
// Test slashes in names.
$this->assertSame( 'abcdefg.png', wp_unique_filename( $testdir, 'abcde\fg.png' ), 'Slash not removed' );
$this->assertSame( 'abcdefg.png', wp_unique_filename( $testdir, 'abcde\\fg.png' ), 'Double slashed not removed' );
$this->assertSame( 'abcdefg.png', wp_unique_filename( $testdir, 'abcde\\\fg.png' ), 'Triple slashed not removed' );
}
/**
* @ticket 42437
*/
public function test_unique_filename_with_dimension_like_filename() {
$testdir = DIR_TESTDATA . '/images/';
add_filter( 'upload_dir', array( $this, 'upload_dir_patch_basedir' ) );
// Test collision with "dimension-like" original filename.
$this->assertSame( 'one-blue-pixel-100x100-1.png', wp_unique_filename( $testdir, 'one-blue-pixel-100x100.png' ) );
// Test collision with existing sub-size filename.
// Existing files: one-blue-pixel-100x100.png, one-blue-pixel-1-100x100.png.
$this->assertSame( 'one-blue-pixel-2.png', wp_unique_filename( $testdir, 'one-blue-pixel.png' ) );
// Same as above with upper case extension.
$this->assertSame( 'one-blue-pixel-2.png', wp_unique_filename( $testdir, 'one-blue-pixel.PNG' ) );
remove_filter( 'upload_dir', array( $this, 'upload_dir_patch_basedir' ) );
}
// Callback to patch "basedir" when used in `wp_unique_filename()`.
public function upload_dir_patch_basedir( $upload_dir ) {
$upload_dir['basedir'] = DIR_TESTDATA . '/images/';
return $upload_dir;
}
/**
* @ticket 53668
*/
public function test_wp_unique_filename_with_additional_image_extension() {
$testdir = DIR_TESTDATA . '/images/';
add_filter( 'upload_dir', array( $this, 'upload_dir_patch_basedir' ) );
// Set conversions for uploaded images.
add_filter( 'image_editor_output_format', array( $this, 'image_editor_output_format_handler' ) );
// Ensure the test images exist.
$this->assertFileExists( $testdir . 'test-image-1-100x100.jpg', 'test-image-1-100x100.jpg does not exist' );
$this->assertFileExists( $testdir . 'test-image-2.gif', 'test-image-2.gif does not exist' );
$this->assertFileExists( $testdir . 'test-image-3.jpg', 'test-image-3.jpg does not exist' );
$this->assertFileExists( $testdir . 'test-image-4.png', 'test-image-4.png does not exist' );
// Standard test: file does not exist and there are no possible intersections with other files.
$this->assertSame(
'abcdef.png',
wp_unique_filename( $testdir, 'abcdef.png' ),
'The abcdef.png, abcdef.gif, and abcdef.jpg images do not exist. The file name should not be changed.'
);
// Actual clash recognized.
$this->assertSame(
'canola-1.jpg',
wp_unique_filename( $testdir, 'canola.jpg' ),
'The canola.jpg image exists. The file name should be unique.'
);
// Same name with different extension and the image will be converted.
$this->assertSame(
'canola-1.png',
wp_unique_filename( $testdir, 'canola.png' ),
'The canola.jpg image exists. Uploading canola.png that will be converted to canola.jpg should produce unique file name.'
);
// Same name with different uppercase extension and the image will be converted.
$this->assertSame(
'canola-1.png',
wp_unique_filename( $testdir, 'canola.PNG' ),
'The canola.jpg image exists. Uploading canola.PNG that will be converted to canola.jpg should produce unique file name.'
);
// Actual clash with several images with different extensions.
$this->assertSame(
'test-image-5.png',
wp_unique_filename( $testdir, 'test-image.png' ),
'The test-image.png, test-image-1-100x100.jpg, test-image-2.gif, test-image-3.jpg, and test-image-4.png images exist.' .
'All of them may clash when creating sub-sizes or regenerating thumbnails in the future. The filename should be unique.'
);
// Possible clash with regenerated thumbnails in the future.
$this->assertSame(
'codeispoetry-1.jpg',
wp_unique_filename( $testdir, 'codeispoetry.jpg' ),
'The codeispoetry.png image exists. When regenerating thumbnails for it they will be converted to JPG.' .
'The name of the newly uploaded codeispoetry.jpg should be made unique.'
);
remove_filter( 'image_editor_output_format', array( $this, 'image_editor_output_format_handler' ) );
remove_filter( 'upload_dir', array( $this, 'upload_dir_patch_basedir' ) );
}
/**
* Changes the output format when editing images. When uploading a PNG file
* it will be converted to JPEG, GIF to JPEG, and PICT to BMP
* (if the image editor in PHP supports it).
*
* @param array $formats
*
* @return array
*/
public function image_editor_output_format_handler( $formats ) {
$formats['image/png'] = 'image/jpeg';
$formats['image/gif'] = 'image/jpeg';
$formats['image/pct'] = 'image/bmp';
return $formats;
}
/**
* @group add_query_arg
*/
public function test_add_query_arg() {
$old_req_uri = $_SERVER['REQUEST_URI'];
$urls = array(
'/',
'/2012/07/30/',
'edit.php',
admin_url( 'edit.php' ),
admin_url( 'edit.php', 'https' ),
);
$frag_urls = array(
'/#frag',
'/2012/07/30/#frag',
'edit.php#frag',
admin_url( 'edit.php#frag' ),
admin_url( 'edit.php#frag', 'https' ),
);
foreach ( $urls as $url ) {
$_SERVER['REQUEST_URI'] = 'nothing';
$this->assertSame( "$url?foo=1", add_query_arg( 'foo', '1', $url ) );
$this->assertSame( "$url?foo=1", add_query_arg( array( 'foo' => '1' ), $url ) );
$this->assertSame(
"$url?foo=2",
add_query_arg(
array(
'foo' => '1',
'foo' => '2',
),
$url
)
);
$this->assertSame(
"$url?foo=1&bar=2",
add_query_arg(
array(
'foo' => '1',
'bar' => '2',
),
$url
)
);
$_SERVER['REQUEST_URI'] = $url;
$this->assertSame( "$url?foo=1", add_query_arg( 'foo', '1' ) );
$this->assertSame( "$url?foo=1", add_query_arg( array( 'foo' => '1' ) ) );
$this->assertSame(
"$url?foo=2",
add_query_arg(
array(
'foo' => '1',
'foo' => '2',
)
)
);
$this->assertSame(
"$url?foo=1&bar=2",
add_query_arg(
array(
'foo' => '1',
'bar' => '2',
)
)
);
}
foreach ( $frag_urls as $frag_url ) {
$_SERVER['REQUEST_URI'] = 'nothing';
$url = str_replace( '#frag', '', $frag_url );
$this->assertSame( "$url?foo=1#frag", add_query_arg( 'foo', '1', $frag_url ) );
$this->assertSame( "$url?foo=1#frag", add_query_arg( array( 'foo' => '1' ), $frag_url ) );
$this->assertSame(
"$url?foo=2#frag",
add_query_arg(
array(
'foo' => '1',
'foo' => '2',
),
$frag_url
)
);
$this->assertSame(
"$url?foo=1&bar=2#frag",
add_query_arg(
array(
'foo' => '1',
'bar' => '2',
),
$frag_url
)
);
$_SERVER['REQUEST_URI'] = $frag_url;
$this->assertSame( "$url?foo=1#frag", add_query_arg( 'foo', '1' ) );
$this->assertSame( "$url?foo=1#frag", add_query_arg( array( 'foo' => '1' ) ) );
$this->assertSame(
"$url?foo=2#frag",
add_query_arg(
array(
'foo' => '1',
'foo' => '2',
)
)
);
$this->assertSame(
"$url?foo=1&bar=2#frag",
add_query_arg(
array(
'foo' => '1',
'bar' => '2',
)
)
);
}
$qs_urls = array(
'baz=1', // #WP4903
'/?baz',
'/2012/07/30/?baz',
'edit.php?baz',
admin_url( 'edit.php?baz' ),
admin_url( 'edit.php?baz', 'https' ),
admin_url( 'edit.php?baz&za=1' ),
admin_url( 'edit.php?baz=1&za=1' ),
admin_url( 'edit.php?baz=0&za=0' ),
);
foreach ( $qs_urls as $url ) {
$_SERVER['REQUEST_URI'] = 'nothing';
$this->assertSame( "$url&foo=1", add_query_arg( 'foo', '1', $url ) );
$this->assertSame( "$url&foo=1", add_query_arg( array( 'foo' => '1' ), $url ) );
$this->assertSame(
"$url&foo=2",
add_query_arg(
array(
'foo' => '1',
'foo' => '2',
),
$url
)
);
$this->assertSame(
"$url&foo=1&bar=2",
add_query_arg(
array(
'foo' => '1',
'bar' => '2',
),
$url
)
);
$_SERVER['REQUEST_URI'] = $url;
$this->assertSame( "$url&foo=1", add_query_arg( 'foo', '1' ) );
$this->assertSame( "$url&foo=1", add_query_arg( array( 'foo' => '1' ) ) );
$this->assertSame(
"$url&foo=2",
add_query_arg(
array(
'foo' => '1',
'foo' => '2',
)
)
);
$this->assertSame(
"$url&foo=1&bar=2",
add_query_arg(
array(
'foo' => '1',
'bar' => '2',
)
)
);
}
$_SERVER['REQUEST_URI'] = $old_req_uri;
}
/**
* @ticket 31306
*/
public function test_add_query_arg_numeric_keys() {
$url = add_query_arg( array( 'foo' => 'bar' ), '1=1' );
$this->assertSame( '1=1&foo=bar', $url );
$url = add_query_arg(
array(
'foo' => 'bar',
'1' => '2',
),
'1=1'
);
$this->assertSame( '1=2&foo=bar', $url );
$url = add_query_arg( array( '1' => '2' ), 'foo=bar' );
$this->assertSame( 'foo=bar&1=2', $url );
}
/**
* Tests that add_query_arg removes the question mark when
* a parameter is set to false.
*
* @dataProvider data_add_query_arg_removes_question_mark
*
* @ticket 44499
* @group add_query_arg
*
* @covers ::add_query_arg
*
* @param string $url Url to test.
* @param string $expected Expected URL.
*/
public function test_add_query_arg_removes_question_mark( $url, $expected, $key = 'param', $value = false ) {
$this->assertSame( $expected, add_query_arg( $key, $value, $url ) );
}
/**
* Data provider.
*
* @return array
*/
public function data_add_query_arg_removes_question_mark() {
return array(
'anchor' => array(
'url' => 'http://example.org?#anchor',
'expected' => 'http://example.org#anchor',
),
'/ then anchor' => array(
'url' => 'http://example.org/?#anchor',
'expected' => 'http://example.org/#anchor',
),
'invalid query param and anchor' => array(
'url' => 'http://example.org?param=value#anchor',
'expected' => 'http://example.org#anchor',
),
'/ then invalid query param and anchor' => array(
'url' => 'http://example.org/?param=value#anchor',
'expected' => 'http://example.org/#anchor',
),
'?#anchor when adding valid key/value args' => array(
'url' => 'http://example.org?#anchor',
'expected' => 'http://example.org?foo=bar#anchor',
'key' => 'foo',
'value' => 'bar',
),
'/?#anchor when adding valid key/value args' => array(
'url' => 'http://example.org/?#anchor',
'expected' => 'http://example.org/?foo=bar#anchor',
'key' => 'foo',
'value' => 'bar',
),
);
}
/**
* @ticket 21594
*/
public function test_get_allowed_mime_types() {
$mimes = get_allowed_mime_types();
$this->assertIsArray( $mimes );
$this->assertNotEmpty( $mimes );
add_filter( 'upload_mimes', '__return_empty_array' );
$mimes = get_allowed_mime_types();
$this->assertIsArray( $mimes );
$this->assertEmpty( $mimes );
remove_filter( 'upload_mimes', '__return_empty_array' );
$mimes = get_allowed_mime_types();
$this->assertIsArray( $mimes );
$this->assertNotEmpty( $mimes );
}
/**
* @ticket 21594
*/
public function test_wp_get_mime_types() {
$mimes = wp_get_mime_types();
$this->assertIsArray( $mimes );
$this->assertNotEmpty( $mimes );
add_filter( 'mime_types', '__return_empty_array' );
$mimes = wp_get_mime_types();
$this->assertIsArray( $mimes );
$this->assertEmpty( $mimes );
remove_filter( 'mime_types', '__return_empty_array' );
$mimes = wp_get_mime_types();
$this->assertIsArray( $mimes );
$this->assertNotEmpty( $mimes );
// 'upload_mimes' should not affect wp_get_mime_types().
add_filter( 'upload_mimes', '__return_empty_array' );
$mimes = wp_get_mime_types();
$this->assertIsArray( $mimes );
$this->assertNotEmpty( $mimes );
remove_filter( 'upload_mimes', '__return_empty_array' );
$mimes2 = wp_get_mime_types();
$this->assertIsArray( $mimes2 );
$this->assertNotEmpty( $mimes2 );
$this->assertSame( $mimes2, $mimes );
}
/**
* @ticket 23688
*/
public function test_canonical_charset() {
$orig_blog_charset = get_option( 'blog_charset' );
update_option( 'blog_charset', 'utf8' );
$this->assertSame( 'UTF-8', get_option( 'blog_charset' ) );
update_option( 'blog_charset', 'utf-8' );
$this->assertSame( 'UTF-8', get_option( 'blog_charset' ) );
update_option( 'blog_charset', 'UTF8' );
$this->assertSame( 'UTF-8', get_option( 'blog_charset' ) );
update_option( 'blog_charset', 'UTF-8' );
$this->assertSame( 'UTF-8', get_option( 'blog_charset' ) );
update_option( 'blog_charset', 'ISO-8859-1' );
$this->assertSame( 'ISO-8859-1', get_option( 'blog_charset' ) );
update_option( 'blog_charset', 'ISO8859-1' );
$this->assertSame( 'ISO-8859-1', get_option( 'blog_charset' ) );
update_option( 'blog_charset', 'iso8859-1' );
$this->assertSame( 'ISO-8859-1', get_option( 'blog_charset' ) );
update_option( 'blog_charset', 'iso-8859-1' );
$this->assertSame( 'ISO-8859-1', get_option( 'blog_charset' ) );
// Arbitrary strings are passed through.
update_option( 'blog_charset', 'foobarbaz' );
$this->assertSame( 'foobarbaz', get_option( 'blog_charset' ) );
update_option( 'blog_charset', $orig_blog_charset );
}
/**
* @dataProvider data_device_can_upload
*/
public function test_device_can_upload( $user_agent, $expected ) {
$_SERVER['HTTP_USER_AGENT'] = $user_agent;
$actual = _device_can_upload();
unset( $_SERVER['HTTP_USER_AGENT'] );
$this->assertSame( $expected, $actual );
}
public function data_device_can_upload() {
return array(
// iPhone iOS 5.0.1, Safari 5.1.
array(
'Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A406)',
false,
),
// iPad iOS 3.2, Safari 4.0.4.
array(
'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10',
false,
),
// iPod iOS 4.3.3, Safari 5.0.2.
array(
'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5',
false,
),
// iPhone iOS 6.0.0, Safari 6.0.
array(
'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25',
true,
),
// iPad iOS 6.0.0, Safari 6.0.
array(
'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25',
true,
),
// Android 2.2, Android Webkit Browser.
array(
'Mozilla/5.0 (Android 2.2; Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4',
true,
),
// BlackBerry 9900, BlackBerry browser.
array(
'Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+',
true,
),
// Windows Phone 8.0, Internet Explorer 10.0.
array(
'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)',
true,
),
// Ubuntu desktop, Firefox 41.0.
array(
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0',
true,
),
);
}
/**
* @ticket 9064
*/
public function test_wp_extract_urls() {
$original_urls = array(
'http://woo.com/1,2,3,4,5,6/-1-2-3-4-/woo.html',
'http://this.com',
'http://127.0.0.1',
'http://www111.urwyeoweytwutreyytqytwetowteuiiu.com/?346236346326&2134362574863.437',
'http://wordpress-core/1,2,3,4,5,6/-1-2-3-4-/woo.html',
'http://wordpress-core.com:8080/',
'http://www.website.com:5000',
'http://wordpress-core/?346236346326&2134362574863.437',
'http://افغانستا.icom.museum',
'http://الجزائر.icom.museum',
'http://österreich.icom.museum',
'http://বাংলাদেশ.icom.museum',
'http://беларусь.icom.museum',
'http://belgië.icom.museum',
'http://българия.icom.museum',
'http://تشادر.icom.museum',
'http://中国.icom.museum',
// 'http://القمر.icom.museum', // Comoros http://القمر.icom.museum
// 'http://κυπρος.icom.museum', // Cyprus http://κυπρος.icom.museum
'http://českárepublika.icom.museum',
// 'http://مصر.icom.museum', // Egypt http://مصر.icom.museum
'http://ελλάδα.icom.museum',
'http://magyarország.icom.museum',
'http://ísland.icom.museum',
'http://भारत.icom.museum',
'http://ايران.icom.museum',
'http://éire.icom.museum',
'http://איקו״ם.ישראל.museum',
'http://日本.icom.museum',
'http://الأردن.icom.museum',
'http://қазақстан.icom.museum',
'http://한국.icom.museum',
'http://кыргызстан.icom.museum',
'http://ລາວ.icom.museum',
'http://لبنان.icom.museum',
'http://македонија.icom.museum',
// 'http://موريتانيا.icom.museum', // Mauritania http://موريتانيا.icom.museum
'http://méxico.icom.museum',
'http://монголулс.icom.museum',
// 'http://المغرب.icom.museum', // Morocco http://المغرب.icom.museum
'http://नेपाल.icom.museum',
// 'http://عمان.icom.museum', // Oman http://عمان.icom.museum
'http://قطر.icom.museum',
'http://românia.icom.museum',
'http://россия.иком.museum',
'http://србијаицрнагора.иком.museum',
'http://இலங்கை.icom.museum',
'http://españa.icom.museum',
'http://ไทย.icom.museum',
'http://تونس.icom.museum',
'http://türkiye.icom.museum',
'http://украина.icom.museum',
'http://việtnam.icom.museum',
'ftp://127.0.0.1/',
'http://www.woo.com/video?v=exvUH2qKLTU',
'http://taco.com?burrito=enchilada#guac',
'http://example.org/?post_type=post&p=4',
'http://example.org/?post_type=post&p=5',
'http://example.org/?post_type=post&p=6',
'http://typo-in-query.org/?foo=bar&baz=missing_semicolon',
);
$blob = '
http://woo.com/1,2,3,4,5,6/-1-2-3-4-/woo.html
http://this.com
http://127.0.0.1
http://www111.urwyeoweytwutreyytqytwetowteuiiu.com/?346236346326&2134362574863.437
http://wordpress-core/1,2,3,4,5,6/-1-2-3-4-/woo.html
http://wordpress-core.com:8080/
http://www.website.com:5000
http://wordpress-core/?346236346326&2134362574863.437
http://افغانستا.icom.museum
http://الجزائر.icom.museum
http://österreich.icom.museum
http://বাংলাদেশ.icom.museum
http://беларусь.icom.museum
http://belgië.icom.museum
http://българия.icom.museum
http://تشادر.icom.museum
http://中国.icom.museum
http://českárepublika.icom.museum
http://ελλάδα.icom.museum
http://magyarország.icom.museum
http://ísland.icom.museum
http://भारत.icom.museum
http://ايران.icom.museum
http://éire.icom.museum
http://איקו״ם.ישראל.museum
http://日本.icom.museum
http://الأردن.icom.museum
http://қазақстан.icom.museum
http://한국.icom.museum
http://кыргызстан.icom.museum
http://ລາວ.icom.museum
http://لبنان.icom.museum
http://македонија.icom.museum
http://méxico.icom.museum
http://монголулс.icom.museum
http://नेपाल.icom.museum
http://قطر.icom.museum
http://românia.icom.museum
http://россия.иком.museum
http://србијаицрнагора.иком.museum
http://இலங்கை.icom.museum
http://españa.icom.museum
http://ไทย.icom.museum
http://تونس.icom.museum
http://türkiye.icom.museum
http://украина.icom.museum
http://việtnam.icom.museum
ftp://127.0.0.1/
http://www.woo.com/video?v=exvUH2qKLTU
http://taco.com?burrito=enchilada#guac
http://example.org/?post_type=post&p=4
http://example.org/?post_type=post&p=5
http://example.org/?post_type=post&p=6
http://typo-in-query.org/?foo=bar&baz=missing_semicolon
';
$urls = wp_extract_urls( $blob );
$this->assertNotEmpty( $urls );
$this->assertIsArray( $urls );
$this->assertCount( count( $original_urls ), $urls );
$this->assertSame( $original_urls, $urls );
$exploded = array_values( array_filter( array_map( 'trim', explode( "\n", $blob ) ) ) );
// wp_extract_urls() calls html_entity_decode().
$decoded = array_map( 'html_entity_decode', $exploded );
$this->assertSame( $decoded, $urls );
$this->assertSame( $original_urls, $decoded );
$blob = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore http://woo.com/1,2,3,4,5,6/-1-2-3-4-/woo.html et dolore magna aliqua.
Ut http://this.com enim ad minim veniam, quis nostrud exercitation 16.06. to 18.06.2014 ullamco http://127.0.0.1
laboris nisi ut aliquip ex http://www111.urwyeoweytwutreyytqytwetowteuiiu.com/?346236346326&2134362574863.437 ea
commodo consequat. http://wordpress-core/1,2,3,4,5,6/-1-2-3-4-/woo.html Duis aute irure dolor in reprehenderit in voluptate
velit esse http://wordpress-core.com:8080/ cillum dolore eu fugiat nulla http://www.website.com:5000 pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit http://wordpress-core/?346236346326&2134362574863.437 anim id est laborum.';
$urls = wp_extract_urls( $blob );
$this->assertNotEmpty( $urls );
$this->assertIsArray( $urls );
$this->assertCount( 8, $urls );
$this->assertSame( array_slice( $original_urls, 0, 8 ), $urls );
$blob = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore 343462^ et dolore magna aliqua.
Ut &3640i6p1yi499 enim ad minim veniam, quis nostrud exercitation 16.06. to 18.06.2014 ullamco localhost
laboris nisi ut aliquip ex 343462^ ea
commodo consequat. 343462^ Duis aute irure dolor in reprehenderit in voluptate
velit esse -3-4--321-64-4@#!$^$!@^@^ cillum dolore eu http://www.website.com:5000 fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit )(*&^%$ anim id est laborum.';
$urls = wp_extract_urls( $blob );
$this->assertNotEmpty( $urls );
$this->assertIsArray( $urls );
$this->assertCount( 8, $urls );
$this->assertSame( array_slice( $original_urls, 0, 8 ), $urls );
}
/**
* Tests for backward compatibility of `wp_extract_urls` to remove unused semicolons.
*
* @ticket 30580
*
* @covers ::wp_extract_urls
*/
public function test_wp_extract_urls_remove_semicolon() {
$expected = array(
'http://typo.com',
'http://example.org/?post_type=post&p=8',
);
$actual = wp_extract_urls(
'
http://typo.com;
http://example.org/?post_type=;p;o;s;t;&p=8;
'
);
$this->assertSame( $expected, $actual );
}
/**
* @ticket 28786
*/
public function test_wp_json_encode() {
$this->assertSame( wp_json_encode( 'a' ), '"a"' );
}
/**
* @ticket 28786
*/
public function test_wp_json_encode_utf8() {
$this->assertSame( wp_json_encode( '这' ), '"\u8fd9"' );
}
/**
* @ticket 28786
* @requires function mb_detect_order
*/
public function test_wp_json_encode_non_utf8() {
$charsets = mb_detect_order();
$old_charsets = $charsets;
if ( ! in_array( 'EUC-JP', $charsets, true ) ) {
$charsets[] = 'EUC-JP';
mb_detect_order( $charsets );
}
$eucjp = mb_convert_encoding( 'aあb', 'EUC-JP', 'UTF-8' );
$utf8 = mb_convert_encoding( $eucjp, 'UTF-8', 'EUC-JP' );
$this->assertSame( 'aあb', $utf8 );
$this->assertSame( '"a\u3042b"', wp_json_encode( $eucjp ) );
mb_detect_order( $old_charsets );
}
/**
* @ticket 28786
* @requires function mb_detect_order
*/
public function test_wp_json_encode_non_utf8_in_array() {
$charsets = mb_detect_order();
$old_charsets = $charsets;
if ( ! in_array( 'EUC-JP', $charsets, true ) ) {
$charsets[] = 'EUC-JP';
mb_detect_order( $charsets );
}
$eucjp = mb_convert_encoding( 'aあb', 'EUC-JP', 'UTF-8' );
$utf8 = mb_convert_encoding( $eucjp, 'UTF-8', 'EUC-JP' );
$this->assertSame( 'aあb', $utf8 );
$this->assertSame( '["c","a\u3042b"]', wp_json_encode( array( 'c', $eucjp ) ) );
mb_detect_order( $old_charsets );
}
/**
* @ticket 28786
*/
public function test_wp_json_encode_array() {
$this->assertSame( wp_json_encode( array( 'a' ) ), '["a"]' );
}
/**
* @ticket 28786
*/
public function test_wp_json_encode_object() {
$object = new stdClass();
$object->a = 'b';
$this->assertSame( wp_json_encode( $object ), '{"a":"b"}' );
}
/**
* @ticket 28786
*/
public function test_wp_json_encode_depth() {
$data = array( array( array( 1, 2, 3 ) ) );
$json = wp_json_encode( $data, 0, 1 );
$this->assertFalse( $json );
$data = array( 'あ', array( array( 1, 2, 3 ) ) );
$json = wp_json_encode( $data, 0, 1 );
$this->assertFalse( $json );
}
/**
* @ticket 53238
*/
public function test_wp_json_file_decode() {
$result = wp_json_file_decode(
DIR_TESTDATA . '/blocks/notice/block.json'
);
$this->assertIsObject( $result );
$this->assertSame( 'tests/notice', $result->name );
}
/**
* @ticket 53238
*/
public function test_wp_json_file_decode_associative_array() {
$result = wp_json_file_decode(
DIR_TESTDATA . '/blocks/notice/block.json',
array( 'associative' => true )
);
$this->assertIsArray( $result );
$this->assertSame( 'tests/notice', $result['name'] );
}
/**
* @ticket 36054
* @dataProvider data_mysql_to_rfc3339
*/
public function test_mysql_to_rfc3339( $expected, $actual ) {
$date_return = mysql_to_rfc3339( $actual );
$this->assertIsString( $date_return, 'The date return must be a string' );
$this->assertNotEmpty( $date_return, 'The date return could not be an empty string' );
$this->assertSame( $expected, $date_return, 'The date does not match' );
$this->assertEquals( new DateTime( $expected ), new DateTime( $date_return ), 'The date is not the same after the call method' );
}
public function data_mysql_to_rfc3339() {
return array(
array( '2016-03-15T18:54:46', '15-03-2016 18:54:46' ),
array( '2016-03-02T19:13:25', '2016-03-02 19:13:25' ),
array( '2016-03-02T19:13:00', '2016-03-02 19:13' ),
array( '2016-03-02T19:13:00', '16-03-02 19:13' ),
array( '2016-03-02T19:13:00', '16-03-02 19:13' ),
);
}
/**
* @ticket 35987
*/
public function test_wp_get_ext_types() {
$extensions = wp_get_ext_types();
$this->assertIsArray( $extensions );
$this->assertNotEmpty( $extensions );
add_filter( 'ext2type', '__return_empty_array' );
$extensions = wp_get_ext_types();
$this->assertSame( array(), $extensions );
remove_filter( 'ext2type', '__return_empty_array' );
$extensions = wp_get_ext_types();
$this->assertIsArray( $extensions );
$this->assertNotEmpty( $extensions );
}
/**
* @ticket 35987
*/
public function test_wp_ext2type() {
$extensions = wp_get_ext_types();
$this->assertNotEmpty( $extensions );
foreach ( $extensions as $type => $extension_list ) {
foreach ( $extension_list as $extension ) {
$this->assertSame( $type, wp_ext2type( $extension ) );
$this->assertSame( $type, wp_ext2type( strtoupper( $extension ) ) );
}
}
$this->assertNull( wp_ext2type( 'unknown_format' ) );
}
/**
* Tests raising the memory limit.
*
* Unfortunately as the default for 'WP_MAX_MEMORY_LIMIT' in the
* test suite is -1, we can not test the memory limit negotiations.
*
* @ticket 32075
*/
public function test_wp_raise_memory_limit() {
if ( -1 !== WP_MAX_MEMORY_LIMIT ) {
$this->markTestSkipped( 'WP_MAX_MEMORY_LIMIT should be set to -1.' );
}
$ini_limit_before = ini_get( 'memory_limit' );
$raised_limit = wp_raise_memory_limit();
$ini_limit_after = ini_get( 'memory_limit' );
$this->assertSame( $ini_limit_before, $ini_limit_after );
$this->assertFalse( $raised_limit );
$this->assertEquals( WP_MAX_MEMORY_LIMIT, $ini_limit_after );
}
/**
* Tests wp_generate_uuid4().
*
* @covers ::wp_generate_uuid4
* @ticket 38164
*/
public function test_wp_generate_uuid4() {
$uuids = array();
for ( $i = 0; $i < 20; $i += 1 ) {
$uuid = wp_generate_uuid4();
$this->assertTrue( wp_is_uuid( $uuid, 4 ) );
$uuids[] = $uuid;
}
$unique_uuids = array_unique( $uuids );
$this->assertSame( $uuids, $unique_uuids );
}
/**
* Tests wp_is_uuid().
*
* @covers ::wp_is_uuid
* @ticket 39778
*/
public function test_wp_is_valid_uuid() {
$uuids_v4 = array(
'27fe2421-780c-44c5-b39b-fff753092b55',
'b7c7713a-4ee9-45a1-87ed-944a90390fc7',
'fbedbe35-7bf5-49cc-a5ac-0343bd94360a',
'4c58e67e-123b-4290-a41c-5eeb6970fa3e',
'f54f5b78-e414-4637-84a9-a6cdc94a1beb',
'd1c533ac-abcf-44b6-9b0e-6477d2c91b09',
'7fcd683f-e5fd-454a-a8b9-ed15068830da',
'7962c750-e58c-470a-af0d-ec1eae453ff2',
'a59878ce-9a67-4493-8ca0-a756b52804b3',
'6faa519d-1e13-4415-bd6f-905ae3689d1d',
);
foreach ( $uuids_v4 as $uuid ) {
$this->assertTrue( wp_is_uuid( $uuid, 4 ) );
}
$uuids = array(
'00000000-0000-0000-0000-000000000000', // Nil.
'9e3a0460-d72d-11e4-a631-c8e0eb141dab', // Version 1.
'2c1d43b8-e6d7-376e-af7f-d4bde997cc3f', // Version 3.
'39888f87-fb62-5988-a425-b2ea63f5b81e', // Version 5.
);
foreach ( $uuids as $uuid ) {
$this->assertTrue( wp_is_uuid( $uuid ) );
$this->assertFalse( wp_is_uuid( $uuid, 4 ) );
}
$invalid_uuids = array(
'a19d5192-ea41-41e6-b006',
'this-is-not-valid',
1234,
true,
array(),
);
foreach ( $invalid_uuids as $invalid_uuid ) {
$this->assertFalse( wp_is_uuid( $invalid_uuid, 4 ) );
$this->assertFalse( wp_is_uuid( $invalid_uuid ) );
}
}
/**
* Tests wp_unique_id().
*
* @covers ::wp_unique_id
* @ticket 44883
*/
public function test_wp_unique_id() {
// Test without prefix.
$ids = array();
for ( $i = 0; $i < 20; $i += 1 ) {
$id = wp_unique_id();
$this->assertIsString( $id );
$this->assertIsNumeric( $id );
$ids[] = $id;
}
$this->assertSame( $ids, array_unique( $ids ) );
// Test with prefix.
$ids = array();
for ( $i = 0; $i < 20; $i += 1 ) {
$id = wp_unique_id( 'foo-' );
$this->assertMatchesRegularExpression( '/^foo-\d+$/', $id );
$ids[] = $id;
}
$this->assertSame( $ids, array_unique( $ids ) );
}
/**
* @ticket 40017
* @dataProvider data_wp_get_image_mime
*/
public function test_wp_get_image_mime( $file, $expected ) {
if ( ! is_callable( 'exif_imagetype' ) && ! function_exists( 'getimagesize' ) ) {
$this->markTestSkipped( 'The exif PHP extension is not loaded.' );
}
if ( is_array( $expected ) ) {
$this->assertContains( wp_get_image_mime( $file ), $expected );
} else {
$this->assertSame( $expected, wp_get_image_mime( $file ) );
}
}
/**
* Data provider for test_wp_get_image_mime().
*/
public function data_wp_get_image_mime() {
$data = array(
// Standard JPEG.
array(
DIR_TESTDATA . '/images/test-image.jpg',
'image/jpeg',
),
// Standard GIF.
array(
DIR_TESTDATA . '/images/test-image.gif',
'image/gif',
),
// Standard PNG.
array(
DIR_TESTDATA . '/images/test-image.png',
'image/png',
),
// Image with wrong extension.
array(
DIR_TESTDATA . '/images/test-image-mime-jpg.png',
'image/jpeg',
),
// Animated WebP.
array(
DIR_TESTDATA . '/images/webp-animated.webp',
'image/webp',
),
// Lossless WebP.
array(
DIR_TESTDATA . '/images/webp-lossless.webp',
'image/webp',
),
// Lossy WebP.
array(
DIR_TESTDATA . '/images/webp-lossy.webp',
'image/webp',
),
// Transparent WebP.
array(
DIR_TESTDATA . '/images/webp-transparent.webp',
'image/webp',
),
// Not an image.
array(
DIR_TESTDATA . '/uploads/dashicons.woff',
false,
),
// Animated AVIF.
array(
DIR_TESTDATA . '/images/avif-animated.avif',
'image/avif',
),
// Lossless AVIF.
array(
DIR_TESTDATA . '/images/avif-lossless.avif',
'image/avif',
),
// Lossy AVIF.
array(
DIR_TESTDATA . '/images/avif-lossy.avif',
'image/avif',
),
// Transparent AVIF.
array(
DIR_TESTDATA . '/images/avif-transparent.avif',
'image/avif',
),
// HEIC.
array(
DIR_TESTDATA . '/images/test-image.heic',
// In PHP 8.5, it returns 'image/heif'. Before that, it returns 'image/heic'.
array( 'image/heic', 'image/heif' ),
),
);
return $data;
}
/**
* @ticket 35725
* @dataProvider data_wp_getimagesize
*/
public function test_wp_getimagesize( $file, $expected ) {
if ( ! is_callable( 'exif_imagetype' ) && ! function_exists( 'getimagesize' ) ) {
$this->markTestSkipped( 'The exif PHP extension is not loaded.' );
}
$result = wp_getimagesize( $file );
// The getimagesize() function varies in its response, so
// let's restrict comparison to expected keys only.
if ( is_array( $expected ) ) {
foreach ( $expected as $k => $v ) {
$this->assertArrayHasKey( $k, $result );
$this->assertSame( $expected[ $k ], $result[ $k ] );
}
} else {
$this->assertSame( $expected, $result );
}
}
/**
* Data provider for test_wp_getimagesize().
*/
public function data_wp_getimagesize() {
$data = array(
// Standard JPEG.
array(
DIR_TESTDATA . '/images/test-image.jpg',
array(
50,
50,
IMAGETYPE_JPEG,
'width="50" height="50"',
'mime' => 'image/jpeg',
),
),
// Standard GIF.
array(
DIR_TESTDATA . '/images/test-image.gif',
array(
50,
50,
IMAGETYPE_GIF,
'width="50" height="50"',
'mime' => 'image/gif',
),
),
// Standard PNG.
array(
DIR_TESTDATA . '/images/test-image.png',
array(
50,
50,
IMAGETYPE_PNG,
'width="50" height="50"',
'mime' => 'image/png',
),
),
// Image with wrong extension.
array(
DIR_TESTDATA . '/images/test-image-mime-jpg.png',
array(
50,
50,
IMAGETYPE_JPEG,
'width="50" height="50"',
'mime' => 'image/jpeg',
),
),
// Animated WebP.
array(
DIR_TESTDATA . '/images/webp-animated.webp',
array(
100,
100,
IMAGETYPE_WEBP,
'width="100" height="100"',
'mime' => 'image/webp',
),
),
// Lossless WebP.
array(
DIR_TESTDATA . '/images/webp-lossless.webp',
array(
1200,
675,
IMAGETYPE_WEBP,
'width="1200" height="675"',
'mime' => 'image/webp',
),
),
// Lossy WebP.
array(
DIR_TESTDATA . '/images/webp-lossy.webp',
array(
1200,
675,
IMAGETYPE_WEBP,
'width="1200" height="675"',
'mime' => 'image/webp',
),
),
// Transparent WebP.
array(
DIR_TESTDATA . '/images/webp-transparent.webp',
array(
1200,
675,
IMAGETYPE_WEBP,
'width="1200" height="675"',
'mime' => 'image/webp',
),
),
// Not an image.
array(
DIR_TESTDATA . '/uploads/dashicons.woff',
false,
),
// Animated AVIF.
array(
DIR_TESTDATA . '/images/avif-animated.avif',
array(
150,
150,
IMAGETYPE_AVIF,
'width="150" height="150"',
'mime' => 'image/avif',
),
),
// Lossless AVIF.
array(
DIR_TESTDATA . '/images/avif-lossless.avif',
array(
400,
400,
IMAGETYPE_AVIF,
'width="400" height="400"',
'mime' => 'image/avif',
),
),
// Lossy AVIF.
array(
DIR_TESTDATA . '/images/avif-lossy.avif',
array(
400,
400,
IMAGETYPE_AVIF,
'width="400" height="400"',
'mime' => 'image/avif',
),
),
// Transparent AVIF.
array(
DIR_TESTDATA . '/images/avif-transparent.avif',
array(
128,
128,
IMAGETYPE_AVIF,
'width="128" height="128"',
'mime' => 'image/avif',
),
),
// Grid AVIF.
array(
DIR_TESTDATA . '/images/avif-alpha-grid2x1.avif',
array(
199,
200,
IMAGETYPE_AVIF,
'width="199" height="200"',
'mime' => 'image/avif',
),
),
);
return $data;
}
/**
* Tests that wp_getimagesize() correctly handles HEIC image files.
*
* @ticket 53645
*/
public function test_wp_getimagesize_heic() {
if ( ! is_callable( 'exif_imagetype' ) && ! function_exists( 'getimagesize' ) ) {
$this->markTestSkipped( 'The exif PHP extension is not loaded.' );
}
$file = DIR_TESTDATA . '/images/test-image.heic';
$editor = wp_get_image_editor( $file );
if ( is_wp_error( $editor ) || ! $editor->supports_mime_type( 'image/heic' ) ) {
$this->markTestSkipped( 'No HEIC support in the editor engine on this system.' );
}
$expected = array(
1180,
1180,
IMAGETYPE_HEIF,
'width="1180" height="1180"',
);
// As of PHP 8.5.0, getimagesize() supports HEIF/HEIC files.
if ( PHP_VERSION_ID >= 80500 ) {
$expected = array_merge(
$expected,
array(
'bits' => 8,
'channels' => 3,
'mime' => 'image/heif',
'width_unit' => 'px',
'height_unit' => 'px',
)
);
} else {
$expected['mime'] = 'image/heic';
}
$result = wp_getimagesize( $file );
$this->assertSame( $expected, $result );
}
/**
* @ticket 39550
* @dataProvider data_wp_check_filetype_and_ext
* @requires extension fileinfo
*/
public function test_wp_check_filetype_and_ext( $file, $filename, $expected ) {
$this->assertSame( $expected, wp_check_filetype_and_ext( $file, $filename ) );
}
public function data_wp_check_filetype_and_ext() {
$data = array(
// Standard image.
array(
DIR_TESTDATA . '/images/canola.jpg',
'canola.jpg',
array(
'ext' => 'jpg',
'type' => 'image/jpeg',
'proper_filename' => false,
),
),
// Image with wrong extension.
array(
DIR_TESTDATA . '/images/test-image-mime-jpg.png',
'test-image-mime-jpg.png',
array(
'ext' => 'jpg',
'type' => 'image/jpeg',
'proper_filename' => 'test-image-mime-jpg.jpg',
),
),
// Image without extension.
array(
DIR_TESTDATA . '/images/test-image-no-extension',
'test-image-no-extension',
array(
'ext' => false,
'type' => false,
'proper_filename' => false,
),
),
// Valid non-image file with an image extension.
array(
DIR_TESTDATA . '/formatting/big5.txt',
'big5.jpg',
array(
'ext' => false,
'type' => false,
'proper_filename' => false,
),
),
// Non-image file not allowed.
array(
DIR_TESTDATA . '/export/crazy-cdata.xml',
'crazy-cdata.xml',
array(
'ext' => false,
'type' => false,
'proper_filename' => false,
),
),
// Non-image file not allowed even if it's named like one.
array(
DIR_TESTDATA . '/export/crazy-cdata.xml',
'crazy-cdata.jpg',
array(
'ext' => false,
'type' => false,
'proper_filename' => false,
),
),
// Non-image file not allowed if it's named like something else.
array(
DIR_TESTDATA . '/export/crazy-cdata.xml',
'crazy-cdata.doc',
array(
'ext' => false,
'type' => false,
'proper_filename' => false,
),
),
// Non-image file not allowed even if it's named like one.
array(
DIR_TESTDATA . '/export/crazy-cdata.xml',
'crazy-cdata.jpg',
array(
'ext' => false,
'type' => false,
'proper_filename' => false,
),
),
// Non-image file not allowed if it's named like something else.
array(
DIR_TESTDATA . '/export/crazy-cdata.xml',
'crazy-cdata.doc',
array(
'ext' => false,
'type' => false,
'proper_filename' => false,
),
),
);
// Test a few additional file types on single sites.
if ( ! is_multisite() ) {
$data = array_merge(
$data,
array(
// Standard non-image file.
array(
DIR_TESTDATA . '/formatting/big5.txt',
'big5.txt',
array(
'ext' => 'txt',
'type' => 'text/plain',
'proper_filename' => false,
),
),
// Google Docs file for which finfo_file() returns a duplicate mime type.
array(
DIR_TESTDATA . '/uploads/double-mime-type.docx',
'double-mime-type.docx',
array(
'ext' => 'docx',
'type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'proper_filename' => false,
),
),
// Non-image file with wrong sub-type.
array(
DIR_TESTDATA . '/uploads/pages-to-word.docx',
'pages-to-word.docx',
array(
'ext' => 'docx',
'type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'proper_filename' => false,
),
),
// FLAC file.
array(
DIR_TESTDATA . '/uploads/small-audio.flac',
'small-audio.flac',
array(
'ext' => 'flac',
'type' => 'audio/flac',
'proper_filename' => false,
),
),
// Assorted text/* sample files
array(
DIR_TESTDATA . '/uploads/test.vtt',
'test.vtt',
array(
'ext' => 'vtt',
'type' => 'text/vtt',
'proper_filename' => false,
),
),
array(
DIR_TESTDATA . '/uploads/test.csv',
'test.csv',
array(
'ext' => 'csv',
'type' => 'text/csv',
'proper_filename' => false,
),
),
// RTF files.
array(
DIR_TESTDATA . '/uploads/test.rtf',
'test.rtf',
array(
'ext' => 'rtf',
'type' => 'application/rtf',
'proper_filename' => false,
),
),
)
);
}
return $data;
}
/**
* @ticket 39550
* @group ms-excluded
* @requires extension fileinfo
*/
public function test_wp_check_filetype_and_ext_with_filtered_svg() {
$file = DIR_TESTDATA . '/uploads/video-play.svg';
$filename = 'video-play.svg';
$expected = array(
'ext' => 'svg',
'type' => 'image/svg+xml',
'proper_filename' => false,
);
add_filter(
'upload_mimes',
static function ( $mimes ) {
$mimes['svg'] = 'image/svg+xml';
return $mimes;
}
);
$this->assertSame( $expected, wp_check_filetype_and_ext( $file, $filename ) );
}
/**
* @ticket 39550
* @group ms-excluded
* @requires extension fileinfo
*/
public function test_wp_check_filetype_and_ext_with_filtered_woff() {
$file = DIR_TESTDATA . '/uploads/dashicons.woff';
$filename = 'dashicons.woff';
$woff_mime_type = 'application/font-woff';
/*
* As of PHP 8.1.12, which includes libmagic/file update to version 5.42,
* the expected mime type for WOFF files is 'font/woff'.
*
* See https://github.com/php/php-src/issues/8805.
*/
if ( PHP_VERSION_ID >= 80112 ) {
$woff_mime_type = 'font/woff';
}
$expected = array(
'ext' => 'woff',
'type' => $woff_mime_type,
'proper_filename' => false,
);
add_filter(
'upload_mimes',
static function ( $mimes ) use ( $woff_mime_type ) {
$mimes['woff'] = $woff_mime_type;
return $mimes;
}
);
$this->assertSame( $expected, wp_check_filetype_and_ext( $file, $filename ) );
}
/**
* Test file path validation
*
* @ticket 42016
* @ticket 61488
* @dataProvider data_validate_file
*
* @param string $file File path.
* @param array $allowed_files List of allowed files.
* @param int $expected Expected result.
*/
public function test_validate_file( $file, $allowed_files, $expected ) {
$this->assertSame( $expected, validate_file( $file, $allowed_files ) );
}
/**
* Data provider for file validation.
*
* @return array {
* @type array ...$0 {
* @type string $0 File path.
* @type array $1 List of allowed files.
* @type int $2 Expected result.
* }
* }
*/
public function data_validate_file() {
return array(
// Allowed files:
array(
null,
array(),
0,
),
array(
'',
array(),
0,
),
array(
' ',
array(),
0,
),
array(
'.',
array(),
0,
),
array(
'..',
array(),
0,
),
array(
'./',
array(),
0,
),
array(
'foo.ext',
array( 'foo.ext' ),
0,
),
array(
'dir/foo.ext',
array(),
0,
),
array(
'foo..ext',
array(),
0,
),
array(
'dir/dir/../',
array(),
0,
),
// Directory traversal:
array(
'../',
array(),
1,
),
array(
'../../',
array(),
1,
),
array(
'../file.ext',
array(),
1,
),
array(
'../dir/../',
array(),
1,
),
array(
'/dir/dir/../../',
array(),
1,
),
array(
'/dir/dir/../../',
array( '/dir/dir/../../' ),
1,
),
// Windows drives:
array(
'c:',
array(),
2,
),
array(
'C:/WINDOWS/system32',
array( 'C:/WINDOWS/system32' ),
2,
),
// Windows Path with allowed file
array(
'Apache24\htdocs\wordpress/wp-content/themes/twentyten/style.css',
array( 'Apache24\htdocs\wordpress/wp-content/themes/twentyten/style.css' ),
0,
),
// Disallowed files:
array(
'foo.ext',
array( 'bar.ext' ),
3,
),
array(
'foo.ext',
array( '.ext' ),
3,
),
array(
'path/foo.ext',
array( 'foo.ext' ),
3,
),
);
}
/**
* Test stream URL validation.
*
* @dataProvider data_wp_is_stream
*
* @param string $path The resource path or URL.
* @param bool $expected Expected result.
*/
public function test_wp_is_stream( $path, $expected ) {
if ( ! extension_loaded( 'openssl' ) && false !== strpos( $path, 'https://' ) ) {
$this->markTestSkipped( 'The openssl PHP extension is not loaded.' );
}
$this->assertSame( $expected, wp_is_stream( $path ) );
}
/**
* Data provider for stream URL validation.
*
* @return array {
* @type array ...$0 {
* @type string $0 The resource path or URL.
* @type bool $1 Expected result.
* }
* }
*/
public function data_wp_is_stream() {
return array(
// Legitimate stream examples.
array( 'http://example.com', true ),
array( 'https://example.com', true ),
array( 'ftp://example.com', true ),
array( 'file:///path/to/some/file', true ),
array( 'php://some/php/file.php', true ),
// Non-stream examples.
array( 'fakestream://foo/bar/baz', false ),
array( '../../some/relative/path', false ),
array( 'some/other/relative/path', false ),
array( '/leading/relative/path', false ),
);
}
/**
* Test human_readable_duration().
*
* @ticket 39667
* @dataProvider data_human_readable_duration
*
* @param string $input Duration.
* @param string $expected Expected human readable duration.
*/
public function test_human_readable_duration( $input, $expected ) {
$this->assertSame( $expected, human_readable_duration( $input ) );
}
/**
* Data provider for test_duration_format().
*
* @return array {
* @type array {
* @type string $input Duration.
* @type string $expect Expected human readable duration.
* }
* }
*/
public function data_human_readable_duration() {
return array(
// Valid ii:ss cases.
array( '0:0', '0 minutes, 0 seconds' ),
array( '00:00', '0 minutes, 0 seconds' ),
array( '0:5', '0 minutes, 5 seconds' ),
array( '0:05', '0 minutes, 5 seconds' ),
array( '01:01', '1 minute, 1 second' ),
array( '30:00', '30 minutes, 0 seconds' ),
array( ' 30:00 ', '30 minutes, 0 seconds' ),
// Valid HH:ii:ss cases.
array( '0:0:0', '0 hours, 0 minutes, 0 seconds' ),
array( '00:00:00', '0 hours, 0 minutes, 0 seconds' ),
array( '00:30:34', '0 hours, 30 minutes, 34 seconds' ),
array( '01:01:01', '1 hour, 1 minute, 1 second' ),
array( '1:02:00', '1 hour, 2 minutes, 0 seconds' ),
array( '10:30:34', '10 hours, 30 minutes, 34 seconds' ),
array( '1234567890:59:59', '1234567890 hours, 59 minutes, 59 seconds' ),
// Valid ii:ss cases with negative sign.
array( '-00:00', '0 minutes, 0 seconds' ),
array( '-3:00', '3 minutes, 0 seconds' ),
array( '-03:00', '3 minutes, 0 seconds' ),
array( '-30:00', '30 minutes, 0 seconds' ),
// Valid HH:ii:ss cases with negative sign.
array( '-00:00:00', '0 hours, 0 minutes, 0 seconds' ),
array( '-1:02:00', '1 hour, 2 minutes, 0 seconds' ),
// Invalid cases.
array( null, false ),
array( '', false ),
array( ':', false ),
array( '::', false ),
array( array(), false ),
array( 'Batman Begins !', false ),
array( '', false ),
array( '-1', false ),
array( -1, false ),
array( 0, false ),
array( 1, false ),
array( '00', false ),
array( '30:-10', false ),
array( ':30:00', false ), // Missing HH.
array( 'MM:30:00', false ), // Invalid HH.
array( '30:MM:00', false ), // Invalid ii.
array( '30:30:MM', false ), // Invalid ss.
array( '30:MM', false ), // Invalid ss.
array( 'MM:00', false ), // Invalid ii.
array( 'MM:MM', false ), // Invalid ii and ss.
array( '10 :30', false ), // Containing a space.
array( '59:61', false ), // Out of bound.
array( '61:59', false ), // Out of bound.
array( '3:59:61', false ), // Out of bound.
array( '03:61:59', false ), // Out of bound.
);
}
/**
* @ticket 49404
* @dataProvider data_wp_is_json_media_type
*/
public function test_wp_is_json_media_type( $input, $expected ) {
$this->assertSame( $expected, wp_is_json_media_type( $input ) );
}
public function data_wp_is_json_media_type() {
return array(
array( 'application/ld+json', true ),
array( 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"', true ),
array( 'application/activity+json', true ),
array( 'application/json+oembed', true ),
array( 'application/json', true ),
array( 'application/nojson', false ),
array( 'application/no.json', false ),
array( 'text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, */*;q=0.8', false ),
array( 'application/activity+json, application/nojson', true ),
);
}
/**
* @ticket 53668
*/
public function test_wp_get_default_extension_for_mime_type() {
$this->assertSame( 'jpg', wp_get_default_extension_for_mime_type( 'image/jpeg' ), 'jpg not returned as default extension for "image/jpeg"' );
$this->assertNotEquals( 'jpeg', wp_get_default_extension_for_mime_type( 'image/jpeg' ), 'jpeg should not be returned as default extension for "image/jpeg"' );
$this->assertSame( 'png', wp_get_default_extension_for_mime_type( 'image/png' ), 'png not returned as default extension for "image/png"' );
$this->assertFalse( wp_get_default_extension_for_mime_type( 'wibble/wobble' ), 'false not returned for unrecognized mime type' );
$this->assertFalse( wp_get_default_extension_for_mime_type( '' ), 'false not returned when empty string as mime type supplied' );
$this->assertFalse( wp_get_default_extension_for_mime_type( ' ' ), 'false not returned when empty string as mime type supplied' );
$this->assertFalse( wp_get_default_extension_for_mime_type( 123 ), 'false not returned when int as mime type supplied' );
$this->assertFalse( wp_get_default_extension_for_mime_type( null ), 'false not returned when null as mime type supplied' );
}
/**
* @ticket 55505
* @covers ::wp_recursive_ksort
*/
public function test_wp_recursive_ksort() {
// Create an array to test.
$theme_json = array(
'version' => 1,
'settings' => array(
'typography' => array(
'fontFamilies' => array(
'fontFamily' => 'DM Sans, sans-serif',
'slug' => 'dm-sans',
'name' => 'DM Sans',
),
),
'color' => array(
'palette' => array(
array(
'slug' => 'foreground',
'color' => '#242321',
'name' => 'Foreground',
),
array(
'slug' => 'background',
'color' => '#FCFBF8',
'name' => 'Background',
),
array(
'slug' => 'primary',
'color' => '#71706E',
'name' => 'Primary',
),
array(
'slug' => 'tertiary',
'color' => '#CFCFCF',
'name' => 'Tertiary',
),
),
),
),
);
// Sort the array.
wp_recursive_ksort( $theme_json );
// Expected result.
$expected_theme_json = array(
'settings' => array(
'color' => array(
'palette' => array(
array(
'color' => '#242321',
'name' => 'Foreground',
'slug' => 'foreground',
),
array(
'color' => '#FCFBF8',
'name' => 'Background',
'slug' => 'background',
),
array(
'color' => '#71706E',
'name' => 'Primary',
'slug' => 'primary',
),
array(
'color' => '#CFCFCF',
'name' => 'Tertiary',
'slug' => 'tertiary',
),
),
),
'typography' => array(
'fontFamilies' => array(
'fontFamily' => 'DM Sans, sans-serif',
'name' => 'DM Sans',
'slug' => 'dm-sans',
),
),
),
'version' => 1,
);
$this->assertSameSetsWithIndex( $theme_json, $expected_theme_json );
}
}