* Use MediaWikiTestCase::getNewTempFile and getNewTempDirectory instead of wfTempDir(). The upload api tests wrote a tempnam() file directly (where wfTempDir() is typically shared with other systems and concurrent runs). Use MediaWikiTestCase::getNewTempFile and getNewTempDirectory instead. This also ensures its removal by the teardown handler without needing manual unlink() calls. And it doesn't rely on the test passing. (Many unlink calls where at the bottom of tests, which wouldn't be reached in case of failure). * For the upload test, the presistent storing of 'Oberaargletscher_from_Oberaar.jpg' (downloaded from Commons) was removed. Note that this didn't work for Jenkins builds anyway as Jenkins builds set $wgTmpDirectory to a unique directory in tmpfs associated with an individual build. * For filebackend tests, moved directory creation from the dataProvider to the main test. Implemented addTmpFiles() to allow subclasses to register additional files (created by other means) to be cleaned up also. Removed unused $tmpName and $toPath parameters in data provider for FileBackendTest::testStore. And fixed weird double $op2 variable name to be called $op3. * Skipped parserTest.inc, MockFileBackend.php, and UploadFromUrlTestSuite.php as those don't use MediaWikiTestCase. Change-Id: Ic7feb06ef0c1006eb99485470a1a59419f972545
156 lines
3.7 KiB
PHP
156 lines
3.7 KiB
PHP
<?php
|
|
|
|
/**
|
|
* * Abstract class to support upload tests
|
|
*/
|
|
|
|
abstract class ApiTestCaseUpload extends ApiTestCase {
|
|
/**
|
|
* Fixture -- run before every test
|
|
*/
|
|
protected function setUp() {
|
|
parent::setUp();
|
|
|
|
$this->setMwGlobals( array(
|
|
'wgEnableUploads' => true,
|
|
'wgEnableAPI' => true,
|
|
) );
|
|
|
|
wfSetupSession();
|
|
|
|
$this->clearFakeUploads();
|
|
}
|
|
|
|
/**
|
|
* Helper function -- remove files and associated articles by Title
|
|
*
|
|
* @param Title $title Title to be removed
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function deleteFileByTitle( $title ) {
|
|
if ( $title->exists() ) {
|
|
$file = wfFindFile( $title, array( 'ignoreRedirect' => true ) );
|
|
$noOldArchive = ""; // yes this really needs to be set this way
|
|
$comment = "removing for test";
|
|
$restrictDeletedVersions = false;
|
|
$status = FileDeleteForm::doDelete(
|
|
$title,
|
|
$file,
|
|
$noOldArchive,
|
|
$comment,
|
|
$restrictDeletedVersions
|
|
);
|
|
|
|
if ( !$status->isGood() ) {
|
|
return false;
|
|
}
|
|
|
|
$page = WikiPage::factory( $title );
|
|
$page->doDeleteArticle( "removing for test" );
|
|
|
|
// see if it now doesn't exist; reload
|
|
$title = Title::newFromText( $title->getText(), NS_FILE );
|
|
}
|
|
|
|
return !( $title && $title instanceof Title && $title->exists() );
|
|
}
|
|
|
|
/**
|
|
* Helper function -- remove files and associated articles with a particular filename
|
|
*
|
|
* @param string $fileName Filename to be removed
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function deleteFileByFileName( $fileName ) {
|
|
return $this->deleteFileByTitle( Title::newFromText( $fileName, NS_FILE ) );
|
|
}
|
|
|
|
/**
|
|
* Helper function -- given a file on the filesystem, find matching
|
|
* content in the db (and associated articles) and remove them.
|
|
*
|
|
* @param string $filePath Path to file on the filesystem
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function deleteFileByContent( $filePath ) {
|
|
$hash = FSFile::getSha1Base36FromPath( $filePath );
|
|
$dupes = RepoGroup::singleton()->findBySha1( $hash );
|
|
$success = true;
|
|
foreach ( $dupes as $dupe ) {
|
|
$success &= $this->deleteFileByTitle( $dupe->getTitle() );
|
|
}
|
|
|
|
return $success;
|
|
}
|
|
|
|
/**
|
|
* Fake an upload by dumping the file into temp space, and adding info to $_FILES.
|
|
* (This is what PHP would normally do).
|
|
*
|
|
* @param string $fieldName Name this would have in the upload form
|
|
* @param string $fileName Name to title this
|
|
* @param string $type MIME type
|
|
* @param string $filePath Path where to find file contents
|
|
*
|
|
* @throws Exception
|
|
* @return bool
|
|
*/
|
|
function fakeUploadFile( $fieldName, $fileName, $type, $filePath ) {
|
|
$tmpName = $this->getNewTempFile();
|
|
if ( !file_exists( $filePath ) ) {
|
|
throw new Exception( "$filePath doesn't exist!" );
|
|
}
|
|
|
|
if ( !copy( $filePath, $tmpName ) ) {
|
|
throw new Exception( "couldn't copy $filePath to $tmpName" );
|
|
}
|
|
|
|
clearstatcache();
|
|
$size = filesize( $tmpName );
|
|
if ( $size === false ) {
|
|
throw new Exception( "couldn't stat $tmpName" );
|
|
}
|
|
|
|
$_FILES[$fieldName] = array(
|
|
'name' => $fileName,
|
|
'type' => $type,
|
|
'tmp_name' => $tmpName,
|
|
'size' => $size,
|
|
'error' => null
|
|
);
|
|
|
|
return true;
|
|
}
|
|
|
|
function fakeUploadChunk( $fieldName, $fileName, $type, & $chunkData ) {
|
|
$tmpName = $this->getNewTempFile();
|
|
// copy the chunk data to temp location:
|
|
if ( !file_put_contents( $tmpName, $chunkData ) ) {
|
|
throw new Exception( "couldn't copy chunk data to $tmpName" );
|
|
}
|
|
|
|
clearstatcache();
|
|
$size = filesize( $tmpName );
|
|
if ( $size === false ) {
|
|
throw new Exception( "couldn't stat $tmpName" );
|
|
}
|
|
|
|
$_FILES[$fieldName] = array(
|
|
'name' => $fileName,
|
|
'type' => $type,
|
|
'tmp_name' => $tmpName,
|
|
'size' => $size,
|
|
'error' => null
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Remove traces of previous fake uploads
|
|
*/
|
|
function clearFakeUploads() {
|
|
$_FILES = array();
|
|
}
|
|
}
|