MediaWiki  REL1_20
UploadTest.php
Go to the documentation of this file.
00001 <?php
00005 class UploadTest extends MediaWikiTestCase {
00006         protected $upload;
00007 
00008 
00009         function setUp() {
00010                 global $wgHooks;
00011                 parent::setUp();
00012 
00013                 $this->upload = new UploadTestHandler;
00014                 $this->hooks = $wgHooks;
00015                 $wgHooks['InterwikiLoadPrefix'][] = function( $prefix, &$data ) {
00016                         return false;
00017                 };
00018         }
00019 
00020         function tearDown() {
00021                 global $wgHooks;
00022                 $wgHooks = $this->hooks;
00023         }
00024 
00025 
00032         public function testTitleValidation( $srcFilename, $dstFilename, $code, $msg ) {
00033                 /* Check the result code */
00034                 $this->assertEquals( $code,
00035                         $this->upload->testTitleValidation( $srcFilename ),
00036                         "$msg code" );
00037 
00038                 /* If we expect a valid title, check the title itself. */
00039                 if ( $code == UploadBase::OK ) {
00040                         $this->assertEquals( $dstFilename,
00041                                 $this->upload->getTitle()->getText(),
00042                                 "$msg text" );
00043                 }
00044         }
00045         
00049         public function dataTestTitleValidation() {
00050                 return array(
00051                         /* Test a valid title */
00052                         array( 'ValidTitle.jpg', 'ValidTitle.jpg', UploadBase::OK, 
00053                                 'upload valid title' ),
00054                         /* A title with a slash */
00055                         array( 'A/B.jpg', 'B.jpg', UploadBase::OK, 
00056                                 'upload title with slash' ),
00057                         /* A title with illegal char */
00058                         array( 'A:B.jpg', 'A-B.jpg', UploadBase::OK, 
00059                                 'upload title with colon' ),
00060                         /* Stripping leading File: prefix */
00061                         array( 'File:C.jpg', 'C.jpg', UploadBase::OK, 
00062                                 'upload title with File prefix' ),
00063                         /* Test illegal suggested title (r94601) */
00064                         array( '%281%29.JPG', null, UploadBase::ILLEGAL_FILENAME, 
00065                                 'illegal title for upload' ),
00066                         /* A title without extension */
00067                         array( 'A', null, UploadBase::FILETYPE_MISSING, 
00068                                 'upload title without extension' ),
00069                         /* A title with no basename */
00070                         array( '.jpg', null, UploadBase::MIN_LENGTH_PARTNAME, 
00071                                 'upload title without basename' ),
00072                         /* A title that is longer than 255 bytes */
00073                         array( str_repeat( 'a', 255 ) . '.jpg', null, UploadBase::FILENAME_TOO_LONG, 
00074                                 'upload title longer than 255 bytes' ),
00075                         /* A title that is longer than 240 bytes */
00076                         array( str_repeat( 'a', 240 ) . '.jpg', null, UploadBase::FILENAME_TOO_LONG, 
00077                                 'upload title longer than 240 bytes' ),
00078                 );
00079         }
00080 
00084         public function testVerifyUpload() {
00085                 /* Setup with zero file size */
00086                 $this->upload->initializePathInfo( '', '', 0 );
00087                 $result = $this->upload->verifyUpload();
00088                 $this->assertEquals( UploadBase::EMPTY_FILE,
00089                         $result['status'],
00090                         'upload empty file' );
00091         }
00092 
00093         // Helper used to create an empty file of size $size.
00094         private function createFileOfSize( $size ) {
00095                 $filename = tempnam( wfTempDir(), "mwuploadtest" );
00096 
00097                 $fh = fopen( $filename, 'w' );
00098                 ftruncate( $fh, $size );
00099                 fclose( $fh );
00100 
00101                 return $filename;
00102         }
00103 
00110         public function testMaxUploadSize() {
00111                 global $wgMaxUploadSize;
00112                 $savedGlobal = $wgMaxUploadSize; // save global
00113                 global $wgFileExtensions;
00114                 $wgFileExtensions[] = 'txt';
00115 
00116                 $wgMaxUploadSize = 100;
00117 
00118                 $filename = $this->createFileOfSize( $wgMaxUploadSize );
00119                 $this->upload->initializePathInfo( basename($filename) . '.txt', $filename, 100 );
00120                 $result = $this->upload->verifyUpload();
00121                 unlink( $filename );
00122 
00123                 $this->assertEquals(
00124                         array( 'status' => UploadBase::OK ), $result );
00125 
00126                 $wgMaxUploadSize = $savedGlobal;  // restore global
00127         }
00128 }
00129 
00130 class UploadTestHandler extends UploadBase {
00131                 public function initializeFromRequest( &$request ) { }
00132                 public function testTitleValidation( $name ) {
00133                         $this->mTitle = false;
00134                         $this->mDesiredDestName = $name;
00135                         $this->mTitleError = UploadBase::OK;
00136                         $this->getTitle();
00137                         return $this->mTitleError;
00138                 }
00139 
00140 
00141 }