file.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?php
  2. /**
  3. * @group file
  4. */
  5. class Tests_File extends WP_UnitTestCase {
  6. function setUp() {
  7. parent::setUp();
  8. $this->dir = dirname(tempnam('/tmp', 'foo'));
  9. $this->badchars = '"\'[]*&?$';
  10. }
  11. /**
  12. * @group plugins
  13. * @group themes
  14. */
  15. function test_get_file_data() {
  16. $theme_headers = array(
  17. 'Name' => 'Theme Name',
  18. 'ThemeURI' => 'Theme URI',
  19. 'Description' => 'Description',
  20. 'Version' => 'Version',
  21. 'Author' => 'Author',
  22. 'AuthorURI' => 'Author URI',
  23. );
  24. $actual = get_file_data( DIR_TESTDATA . '/themedir1/default/style.css', $theme_headers );
  25. $expected = array(
  26. 'Name' => 'WordPress Default',
  27. 'ThemeURI' => 'http://wordpress.org/',
  28. 'Description' => 'The default WordPress theme based on the famous <a href="http://binarybonsai.com/kubrick/">Kubrick</a>.',
  29. 'Version' => '1.6',
  30. 'Author' => 'Michael Heilemann',
  31. 'AuthorURI' => 'http://binarybonsai.com/',
  32. );
  33. foreach ( $actual as $header => $value )
  34. $this->assertEquals( $expected[ $header ], $value, $header );
  35. }
  36. /**
  37. * @group plugins
  38. * @group themes
  39. */
  40. function test_get_file_data_cr_line_endings() {
  41. $headers = array( 'SomeHeader' => 'Some Header', 'Description' => 'Description', 'Author' => 'Author' );
  42. $actual = get_file_data( DIR_TESTDATA . '/formatting/cr-line-endings-file-header.php', $headers );
  43. $expected = array(
  44. 'SomeHeader' => 'Some header value!',
  45. 'Description' => 'This file is using CR line endings for a testcase.',
  46. 'Author' => 'A Very Old Mac',
  47. );
  48. foreach ( $actual as $header => $value )
  49. $this->assertEquals( $expected[ $header ], $value, $header );
  50. }
  51. function is_unique_writable_file($path, $filename) {
  52. $fullpath = $path . DIRECTORY_SEPARATOR . $filename;
  53. $fp = fopen( $fullpath, 'x' );
  54. // file already exists?
  55. if (!$fp)
  56. return false;
  57. // write some random contents
  58. $c = rand_str();
  59. fwrite($fp, $c);
  60. fclose($fp);
  61. if ( file_get_contents($fullpath) === $c )
  62. $result = true;
  63. else
  64. $result = false;
  65. return $result;
  66. }
  67. function test_unique_filename_is_valid() {
  68. // make sure it produces a valid, writable, unique filename
  69. $filename = wp_unique_filename( $this->dir, rand_str() . '.txt' );
  70. $this->assertTrue( $this->is_unique_writable_file($this->dir, $filename) );
  71. unlink($this->dir . DIRECTORY_SEPARATOR . $filename);
  72. }
  73. function test_unique_filename_is_unique() {
  74. // make sure it produces two unique filenames
  75. $name = rand_str();
  76. $filename1 = wp_unique_filename( $this->dir, $name . '.txt' );
  77. $this->assertTrue( $this->is_unique_writable_file($this->dir, $filename1) );
  78. $filename2 = wp_unique_filename( $this->dir, $name . '.txt' );
  79. $this->assertTrue( $this->is_unique_writable_file($this->dir, $filename2) );
  80. // the two should be different
  81. $this->assertNotEquals( $filename1, $filename2 );
  82. unlink($this->dir . DIRECTORY_SEPARATOR . $filename1);
  83. unlink($this->dir . DIRECTORY_SEPARATOR . $filename2);
  84. }
  85. function test_unique_filename_is_sanitized() {
  86. $name = rand_str();
  87. $filename = wp_unique_filename( $this->dir, $name . $this->badchars . '.txt' );
  88. // make sure the bad characters were all stripped out
  89. $this->assertEquals( $name . '.txt', $filename );
  90. $this->assertTrue( $this->is_unique_writable_file($this->dir, $filename) );
  91. unlink($this->dir . DIRECTORY_SEPARATOR . $filename);
  92. }
  93. function test_unique_filename_with_slashes() {
  94. $name = rand_str();
  95. // "foo/foo.txt"
  96. $filename = wp_unique_filename( $this->dir, $name . '/' . $name . '.txt' );
  97. // the slash should be removed, i.e. "foofoo.txt"
  98. $this->assertEquals( $name . $name . '.txt', $filename );
  99. $this->assertTrue( $this->is_unique_writable_file($this->dir, $filename) );
  100. unlink($this->dir . DIRECTORY_SEPARATOR . $filename);
  101. }
  102. function test_unique_filename_multiple_ext() {
  103. $name = rand_str();
  104. $filename = wp_unique_filename( $this->dir, $name . '.php.txt' );
  105. // "foo.php.txt" becomes "foo.php_.txt"
  106. $this->assertEquals( $name . '.php_.txt', $filename );
  107. $this->assertTrue( $this->is_unique_writable_file($this->dir, $filename) );
  108. unlink($this->dir . DIRECTORY_SEPARATOR . $filename);
  109. }
  110. function test_unique_filename_no_ext() {
  111. $name = rand_str();
  112. $filename = wp_unique_filename( $this->dir, $name );
  113. $this->assertEquals( $name, $filename );
  114. $this->assertTrue( $this->is_unique_writable_file($this->dir, $filename) );
  115. unlink($this->dir . DIRECTORY_SEPARATOR . $filename);
  116. }
  117. }