3 require_once( "ApiSetup.php" );
5 class UploadFromChunksTest
extends ApiSetup
{
8 global $wgEnableUploads;
10 $wgEnableUploads = true;
13 ini_set( 'file_loads', 1 );
14 ini_set( 'log_errors', 1 );
15 ini_set( 'error_reporting', 1 );
16 ini_set( 'display_errors', 1 );
19 function makeChunk( $content ) {
20 $file = tempnam( wfTempDir(), "" );
21 $fh = fopen( $file, "wb" );
23 $this->markTestIncomplete( "Couldn't open $file!\n" );
26 fwrite( $fh, $content );
29 $_FILES['chunk']['tmp_name'] = $file;
30 $_FILES['chunk']['size'] = 3;
31 $_FILES['chunk']['error'] = null;
32 $_FILES['chunk']['name'] = "test.txt";
35 function cleanChunk() {
36 if ( file_exists( $_FILES['chunk']['tmp_name'] ) )
37 unlink( $_FILES['chunk']['tmp_name'] );
40 function doApiRequest( $params, $data = null ) {
41 $session = isset( $data[2] ) ?
$data[2] : array();
44 $req = new FauxRequest( $params, true, $session );
45 $module = new ApiMain( $req, true );
48 return array( $module->getResultData(), $req, $_SESSION );
51 function testGetTitle() {
52 $filename = tempnam( wfTempDir(), "" );
53 $c = new UploadFromChunks();
54 $c->initialize( false, "temp.txt", null, $filename, 0, null );
55 $this->assertEquals( null, $c->getTitle() );
57 $c = new UploadFromChunks();
58 $c->initialize( false, "temp.png", null, $filename, 0, null );
59 $this->assertEquals( Title
::makeTitleSafe( NS_FILE
, "Temp.png" ), $c->getTitle() );
62 function testLogin() {
63 $data = $this->doApiRequest( array(
65 'lgname' => self
::$userName,
66 'lgpassword' => self
::$passWord ) );
67 $this->assertArrayHasKey( "login", $data[0] );
68 $this->assertArrayHasKey( "result", $data[0]['login'] );
69 $this->assertEquals( "Success", $data[0]['login']['result'] );
70 $this->assertArrayHasKey( 'lgtoken', $data[0]['login'] );
78 function testSetupChunkSession( $data ) {
80 $wgUser = User
::newFromName( self
::$userName );
82 $data[2]['wsEditToken'] = $data[2]['wsToken'];
83 $token = md5( $data[2]['wsToken'] ) . EDIT_TOKEN_SUFFIX
;
86 $data = $this->doApiRequest( array(
87 'filename' => 'tmp.txt',
89 'enablechunks' => true,
90 'token' => $token ), $data );
91 $this->assertArrayHasKey( 'uploadUrl', $data[0] );
92 $this->assertRegexp( '/action=upload/', $data[0]['uploadUrl'] );
93 $this->assertRegexp( '/enablechunks=true/', $data[0]['uploadUrl'] );
94 $this->assertRegexp( '/format=json/', $data[0]['uploadUrl'] );
95 $this->assertRegexp( '/chunksession=/', $data[0]['uploadUrl'] );
96 $this->assertRegexp( '/token=/', $data[0]['uploadUrl'] );
102 * @depends testSetupChunkSession
104 function testAppendChunkTypeBanned( $data ) {
106 $wgUser = User
::newFromName( self
::$userName );
108 $url = $data[0]['uploadUrl'];
109 $params = wfCgiToArray( substr( $url, strpos( $url, "?" ) ) );
112 for ( $i = 0; $i < 4; $i++
) {
113 $this->makeChunk( "123" );
114 $size +
= $_FILES['chunk']['size'];
116 $data = $this->doApiRequest( $params, $data );
117 $this->assertArrayHasKey( "result", $data[0] );
118 $this->assertTrue( (bool)$data[0]["result"] );
120 $this->assertArrayHasKey( "filesize", $data[0] );
121 $this->assertEquals( $size, $data[0]['filesize'] );
126 $data['param'] = $params;
133 function testInvalidSessionKey( $data ) {
135 $wgUser = User
::newFromName( self
::$userName );
137 $data[2]['wsEditToken'] = $data[2]['wsToken'];
138 $token = md5( $data[2]['wsToken'] ) . EDIT_TOKEN_SUFFIX
;
142 $this->doApiRequest( array(
143 'action' => 'upload',
144 'enablechunks' => true,
146 'chunksession' => 'bogus' ), $data );
147 } catch ( UsageException
$e ) {
149 $this->assertEquals( "Not a valid session key", $e->getMessage() );
152 $this->assertTrue( $exception, "Got exception" );
155 function testPerformUploadInitError() {
157 $wgUser = User
::newFromId( 1 );
159 $req = new FauxRequest(
161 'action' => 'upload',
162 'enablechunks' => 'false',
164 'filename' => 'test.png',
166 $module = new ApiMain( $req, true );
167 $gotException = false;
170 } catch ( UsageException
$e ) {
171 $this->assertEquals( "The token parameter must be set", $e->getMessage() );
172 $gotException = true;
175 $this->assertTrue( $gotException );
179 * @depends testAppendChunkTypeBanned
181 function testUploadChunkDoneTypeBanned( $data ) {
183 $wgUser = User
::newFromName( self
::$userName );
184 $token = $wgUser->editToken();
185 $params = $data['param'];
188 $this->makeChunk( "123" );
190 $gotException = false;
192 $data = $this->doApiRequest( $params, $data );
193 } catch ( UsageException
$e ) {
194 $this->assertEquals( "This type of file is banned",
196 $gotException = true;
199 $this->assertTrue( $gotException );
205 function testUploadChunkDoneDuplicate( $data ) {
206 global $wgUser, $wgVerifyMimeType;
208 $wgVerifyMimeType = false;
209 $wgUser = User
::newFromName( self
::$userName );
210 $data[2]['wsEditToken'] = $data[2]['wsToken'];
211 $token = md5( $data[2]['wsToken'] ) . EDIT_TOKEN_SUFFIX
;
212 $data = $this->doApiRequest( array(
213 'filename' => 'tmp.png',
214 'action' => 'upload',
215 'enablechunks' => true,
216 'token' => $token ), $data );
218 $url = $data[0]['uploadUrl'];
219 $params = wfCgiToArray( substr( $url, strpos( $url, "?" ) ) );
221 for ( $i = 0; $i < 4; $i++
) {
222 $this->makeChunk( "123" );
223 $size +
= $_FILES['chunk']['size'];
225 $data = $this->doApiRequest( $params, $data );
226 $this->assertArrayHasKey( "result", $data[0] );
227 $this->assertTrue( (bool)$data[0]["result"] );
229 $this->assertArrayHasKey( "filesize", $data[0] );
230 $this->assertEquals( $size, $data[0]['filesize'] );
235 $params['done'] = true;
237 $this->makeChunk( "123" );
238 $data = $this->doApiRequest( $params, $data );
241 $this->assertArrayHasKey( 'upload', $data[0] );
242 $this->assertArrayHasKey( 'result', $data[0]['upload'] );
243 $this->assertEquals( 'Warning', $data[0]['upload']['result'] );
245 $this->assertArrayHasKey( 'warnings', $data[0]['upload'] );
246 $this->assertArrayHasKey( 'exists',
247 $data[0]['upload']['warnings'] );
248 $this->assertEquals( 'Tmp.png',
249 $data[0]['upload']['warnings']['exists'] );
256 function testUploadChunkDoneGood( $data ) {
257 global $wgUser, $wgVerifyMimeType;
258 $wgVerifyMimeType = false;
260 $id = Title
::newFromText( "Twar.png", NS_FILE
)->getArticleID();
262 $oldFile = Article
::newFromID( $id );
264 $oldFile->doDeleteArticle();
267 $oldFile = wfFindFile( "Twar.png" );
272 $wgUser = User
::newFromName( self
::$userName );
273 $data[2]['wsEditToken'] = $data[2]['wsToken'];
274 $token = md5( $data[2]['wsToken'] ) . EDIT_TOKEN_SUFFIX
;
275 $data = $this->doApiRequest( array(
276 'filename' => 'twar.png',
277 'action' => 'upload',
278 'enablechunks' => true,
279 'token' => $token ), $data );
281 $url = $data[0]['uploadUrl'];
282 $params = wfCgiToArray( substr( $url, strpos( $url, "?" ) ) );
284 for ( $i = 0; $i < 5; $i++
) {
285 $this->makeChunk( "123" );
286 $size +
= $_FILES['chunk']['size'];
288 $data = $this->doApiRequest( $params, $data );
289 $this->assertArrayHasKey( "result", $data[0] );
290 $this->assertTrue( (bool)$data[0]["result"] );
292 $this->assertArrayHasKey( "filesize", $data[0] );
293 $this->assertEquals( $size, $data[0]['filesize'] );
298 $params['done'] = true;
300 $this->makeChunk( "456" );
301 $data = $this->doApiRequest( $params, $data );
305 if ( isset( $data[0]['upload'] ) ) {
306 $this->markTestSkipped( "Please run 'php maintenance/deleteArchivedFiles.php --delete --force' and 'php maintenance/deleteArchivedRevisions.php --delete'" );
309 $this->assertArrayHasKey( 'result', $data[0] );
310 $this->assertEquals( 1, $data[0]['result'] );
312 $this->assertArrayHasKey( 'done', $data[0] );
313 $this->assertEquals( 1, $data[0]['done'] );
315 $this->assertArrayHasKey( 'resultUrl', $data[0] );
316 $this->assertRegExp( '/File:Twar.png/', $data[0]['resultUrl'] );