2012-02-12 17:06:32 +00:00
< ? php
/**
* ownCloud
*
* @ author Robin Appelman
* @ copyright 2012 Robin Appelman icewind @ owncloud . com
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation ; either
* version 3 of the License , or any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details .
*
* You should have received a copy of the GNU Affero General Public
* License along with this library . If not , see < http :// www . gnu . org / licenses />.
*
*/
2012-09-22 12:51:15 +00:00
namespace Test\Files\Storage ;
abstract class Storage extends \UnitTestCase {
2012-02-12 17:06:32 +00:00
/**
2012-09-07 16:30:48 +00:00
* @ var \OC\Files\Storage\Storage instance
2012-02-12 17:06:32 +00:00
*/
protected $instance ;
/**
* the root folder of the storage should always exist , be readable and be recognized as a directory
*/
2012-09-07 13:22:01 +00:00
public function testRoot () {
2012-02-12 17:06:32 +00:00
$this -> assertTrue ( $this -> instance -> file_exists ( '/' ), 'Root folder does not exist' );
2012-08-15 15:55:54 +00:00
$this -> assertTrue ( $this -> instance -> isReadable ( '/' ), 'Root folder is not readable' );
2012-02-12 17:06:32 +00:00
$this -> assertTrue ( $this -> instance -> is_dir ( '/' ), 'Root folder is not a directory' );
$this -> assertFalse ( $this -> instance -> is_file ( '/' ), 'Root folder is a file' );
2012-02-13 09:25:45 +00:00
$this -> assertEqual ( 'dir' , $this -> instance -> filetype ( '/' ));
2012-02-12 17:06:32 +00:00
//without this, any further testing would be useless, not an acutal requirement for filestorage though
2012-08-15 15:55:54 +00:00
$this -> assertTrue ( $this -> instance -> isUpdatable ( '/' ), 'Root folder is not writable' );
2012-02-12 17:06:32 +00:00
}
2012-02-13 09:25:45 +00:00
2012-09-07 13:22:01 +00:00
public function testDirectories () {
2012-02-13 09:25:45 +00:00
$this -> assertFalse ( $this -> instance -> file_exists ( '/folder' ));
$this -> assertTrue ( $this -> instance -> mkdir ( '/folder' ));
$this -> assertTrue ( $this -> instance -> file_exists ( '/folder' ));
$this -> assertTrue ( $this -> instance -> is_dir ( '/folder' ));
$this -> assertFalse ( $this -> instance -> is_file ( '/folder' ));
$this -> assertEqual ( 'dir' , $this -> instance -> filetype ( '/folder' ));
$this -> assertEqual ( 0 , $this -> instance -> filesize ( '/folder' ));
2012-08-15 15:55:54 +00:00
$this -> assertTrue ( $this -> instance -> isReadable ( '/folder' ));
$this -> assertTrue ( $this -> instance -> isUpdatable ( '/folder' ));
2012-02-13 09:25:45 +00:00
$dh = $this -> instance -> opendir ( '/' );
$content = array ();
2012-09-07 13:22:01 +00:00
while ( $file = readdir ( $dh )) {
if ( $file != '.' and $file != '..' ) {
2012-02-13 09:25:45 +00:00
$content [] = $file ;
}
}
$this -> assertEqual ( array ( 'folder' ), $content );
$this -> assertFalse ( $this -> instance -> mkdir ( '/folder' )); //cant create existing folders
$this -> assertTrue ( $this -> instance -> rmdir ( '/folder' ));
$this -> assertFalse ( $this -> instance -> file_exists ( '/folder' ));
$this -> assertFalse ( $this -> instance -> rmdir ( '/folder' )); //cant remove non existing folders
2012-04-18 18:46:00 +00:00
$dh = $this -> instance -> opendir ( '/' );
$content = array ();
2012-09-07 13:22:01 +00:00
while ( $file = readdir ( $dh )) {
if ( $file != '.' and $file != '..' ) {
2012-04-18 18:46:00 +00:00
$content [] = $file ;
}
}
$this -> assertEqual ( array (), $content );
2012-02-13 09:25:45 +00:00
}
2012-02-12 17:06:32 +00:00
/**
* test the various uses of file_get_contents and file_put_contents
*/
2012-09-07 13:22:01 +00:00
public function testGetPutContents () {
2012-09-22 12:51:15 +00:00
$sourceFile = \OC :: $SERVERROOT . '/tests/data/lorem.txt' ;
2012-02-12 17:06:32 +00:00
$sourceText = file_get_contents ( $sourceFile );
//fill a file with string data
$this -> instance -> file_put_contents ( '/lorem.txt' , $sourceText );
2012-05-17 23:54:02 +00:00
$this -> assertFalse ( $this -> instance -> is_dir ( '/lorem.txt' ));
2012-02-12 17:06:32 +00:00
$this -> assertEqual ( $sourceText , $this -> instance -> file_get_contents ( '/lorem.txt' ), 'data returned from file_get_contents is not equal to the source data' );
//empty the file
$this -> instance -> file_put_contents ( '/lorem.txt' , '' );
$this -> assertEqual ( '' , $this -> instance -> file_get_contents ( '/lorem.txt' ), 'file not emptied' );
}
2012-02-13 09:25:45 +00:00
/**
* test various known mimetypes
*/
2012-09-07 13:22:01 +00:00
public function testMimeType () {
2012-02-13 09:25:45 +00:00
$this -> assertEqual ( 'httpd/unix-directory' , $this -> instance -> getMimeType ( '/' ));
$this -> assertEqual ( false , $this -> instance -> getMimeType ( '/non/existing/file' ));
2012-09-22 12:51:15 +00:00
$textFile = \OC :: $SERVERROOT . '/tests/data/lorem.txt' ;
2012-02-27 11:01:06 +00:00
$this -> instance -> file_put_contents ( '/lorem.txt' , file_get_contents ( $textFile , 'r' ));
2012-02-13 09:25:45 +00:00
$this -> assertEqual ( 'text/plain' , $this -> instance -> getMimeType ( '/lorem.txt' ));
2012-09-22 12:51:15 +00:00
$pngFile = \OC :: $SERVERROOT . '/tests/data/logo-wide.png' ;
2012-02-27 11:01:06 +00:00
$this -> instance -> file_put_contents ( '/logo-wide.png' , file_get_contents ( $pngFile , 'r' ));
2012-02-13 09:25:45 +00:00
$this -> assertEqual ( 'image/png' , $this -> instance -> getMimeType ( '/logo-wide.png' ));
2012-09-22 12:51:15 +00:00
$svgFile = \OC :: $SERVERROOT . '/tests/data/logo-wide.svg' ;
2012-02-27 11:01:06 +00:00
$this -> instance -> file_put_contents ( '/logo-wide.svg' , file_get_contents ( $svgFile , 'r' ));
2012-02-13 09:25:45 +00:00
$this -> assertEqual ( 'image/svg+xml' , $this -> instance -> getMimeType ( '/logo-wide.svg' ));
}
2012-02-27 11:20:47 +00:00
2012-09-07 13:22:01 +00:00
public function testCopyAndMove () {
2012-09-22 12:51:15 +00:00
$textFile = \OC :: $SERVERROOT . '/tests/data/lorem.txt' ;
2012-02-27 11:20:47 +00:00
$this -> instance -> file_put_contents ( '/source.txt' , file_get_contents ( $textFile ));
$this -> instance -> copy ( '/source.txt' , '/target.txt' );
$this -> assertTrue ( $this -> instance -> file_exists ( '/target.txt' ));
$this -> assertEqual ( $this -> instance -> file_get_contents ( '/source.txt' ), $this -> instance -> file_get_contents ( '/target.txt' ));
$this -> instance -> rename ( '/source.txt' , '/target2.txt' );
$this -> assertTrue ( $this -> instance -> file_exists ( '/target2.txt' ));
$this -> assertFalse ( $this -> instance -> file_exists ( '/source.txt' ));
$this -> assertEqual ( file_get_contents ( $textFile ), $this -> instance -> file_get_contents ( '/target.txt' ));
}
2012-02-28 11:06:34 +00:00
2012-09-07 13:22:01 +00:00
public function testLocal () {
2012-09-22 12:51:15 +00:00
$textFile = \OC :: $SERVERROOT . '/tests/data/lorem.txt' ;
2012-02-28 11:06:34 +00:00
$this -> instance -> file_put_contents ( '/lorem.txt' , file_get_contents ( $textFile ));
$localFile = $this -> instance -> getLocalFile ( '/lorem.txt' );
$this -> assertTrue ( file_exists ( $localFile ));
$this -> assertEqual ( file_get_contents ( $localFile ), file_get_contents ( $textFile ));
2012-08-19 00:30:33 +00:00
$this -> instance -> mkdir ( '/folder' );
$this -> instance -> file_put_contents ( '/folder/lorem.txt' , file_get_contents ( $textFile ));
$this -> instance -> file_put_contents ( '/folder/bar.txt' , 'asd' );
$this -> instance -> mkdir ( '/folder/recursive' );
$this -> instance -> file_put_contents ( '/folder/recursive/file.txt' , 'foo' );
$localFolder = $this -> instance -> getLocalFolder ( '/folder' );
$this -> assertTrue ( is_dir ( $localFolder ));
$this -> assertTrue ( file_exists ( $localFolder . '/lorem.txt' ));
$this -> assertEqual ( file_get_contents ( $localFolder . '/lorem.txt' ), file_get_contents ( $textFile ));
$this -> assertEqual ( file_get_contents ( $localFolder . '/bar.txt' ), 'asd' );
$this -> assertEqual ( file_get_contents ( $localFolder . '/recursive/file.txt' ), 'foo' );
2012-02-28 11:06:34 +00:00
}
2012-02-29 22:47:53 +00:00
2012-09-07 13:22:01 +00:00
public function testStat () {
2012-09-22 12:51:15 +00:00
$textFile = \OC :: $SERVERROOT . '/tests/data/lorem.txt' ;
2012-02-29 22:47:53 +00:00
$ctimeStart = time ();
$this -> instance -> file_put_contents ( '/lorem.txt' , file_get_contents ( $textFile ));
2012-08-15 15:55:54 +00:00
$this -> assertTrue ( $this -> instance -> isReadable ( '/lorem.txt' ));
2012-02-29 22:47:53 +00:00
$ctimeEnd = time ();
$cTime = $this -> instance -> filectime ( '/lorem.txt' );
$mTime = $this -> instance -> filemtime ( '/lorem.txt' );
2012-09-07 13:22:01 +00:00
if ( $cTime !=- 1 ) { //not everything can support ctime
2012-03-22 18:54:24 +00:00
$this -> assertTrue (( $ctimeStart - 1 ) <= $cTime );
$this -> assertTrue ( $cTime <= ( $ctimeEnd + 1 ));
}
2012-06-15 14:43:24 +00:00
$this -> assertTrue ( $this -> instance -> hasUpdated ( '/lorem.txt' , $ctimeStart - 1 ));
$this -> assertTrue ( $this -> instance -> hasUpdated ( '/' , $ctimeStart - 1 ));
2012-03-22 18:54:24 +00:00
$this -> assertTrue (( $ctimeStart - 1 ) <= $mTime );
$this -> assertTrue ( $mTime <= ( $ctimeEnd + 1 ));
2012-02-29 22:47:53 +00:00
$this -> assertEqual ( filesize ( $textFile ), $this -> instance -> filesize ( '/lorem.txt' ));
$stat = $this -> instance -> stat ( '/lorem.txt' );
//only size, mtime and ctime are requered in the result
$this -> assertEqual ( $stat [ 'size' ], $this -> instance -> filesize ( '/lorem.txt' ));
$this -> assertEqual ( $stat [ 'mtime' ], $mTime );
$this -> assertEqual ( $stat [ 'ctime' ], $cTime );
$mtimeStart = time ();
2012-10-06 11:45:46 +00:00
$supportsTouch = $this -> instance -> touch ( '/lorem.txt' );
2012-02-29 22:47:53 +00:00
$mtimeEnd = time ();
2012-10-06 11:45:46 +00:00
if ( $supportsTouch !== false ){
$originalCTime = $cTime ;
$cTime = $this -> instance -> filectime ( '/lorem.txt' );
2012-03-02 17:42:04 +00:00
$mTime = $this -> instance -> filemtime ( '/lorem.txt' );
2012-10-06 11:45:46 +00:00
$this -> assertTrue (( $mtimeStart - 1 ) <= $mTime );
$this -> assertTrue ( $mTime <= ( $mtimeEnd + 1 ));
$this -> assertEqual ( $cTime , $originalCTime );
$this -> assertTrue ( $this -> instance -> hasUpdated ( '/lorem.txt' , $mtimeStart - 1 ));
if ( $this -> instance -> touch ( '/lorem.txt' , 100 ) !== false ) {
$mTime = $this -> instance -> filemtime ( '/lorem.txt' );
$this -> assertEqual ( $mTime , 100 );
}
2012-03-02 17:42:04 +00:00
}
2012-10-06 11:45:46 +00:00
2012-02-29 22:47:53 +00:00
$mtimeStart = time ();
$fh = $this -> instance -> fopen ( '/lorem.txt' , 'a' );
fwrite ( $fh , ' ' );
fclose ( $fh );
clearstatcache ();
$mtimeEnd = time ();
$mTime = $this -> instance -> filemtime ( '/lorem.txt' );
2012-03-22 18:54:24 +00:00
$this -> assertTrue (( $mtimeStart - 1 ) <= $mTime );
$this -> assertTrue ( $mTime <= ( $mtimeEnd + 1 ));
2012-06-15 14:43:24 +00:00
$this -> instance -> unlink ( '/lorem.txt' );
$this -> assertTrue ( $this -> instance -> hasUpdated ( '/' , $mtimeStart - 1 ));
2012-02-29 22:47:53 +00:00
}
2012-03-02 17:42:04 +00:00
2012-09-07 13:22:01 +00:00
public function testSearch () {
2012-09-22 12:51:15 +00:00
$textFile = \OC :: $SERVERROOT . '/tests/data/lorem.txt' ;
2012-03-02 17:42:04 +00:00
$this -> instance -> file_put_contents ( '/lorem.txt' , file_get_contents ( $textFile , 'r' ));
2012-09-22 12:51:15 +00:00
$pngFile = \OC :: $SERVERROOT . '/tests/data/logo-wide.png' ;
2012-03-02 17:42:04 +00:00
$this -> instance -> file_put_contents ( '/logo-wide.png' , file_get_contents ( $pngFile , 'r' ));
2012-09-22 12:51:15 +00:00
$svgFile = \OC :: $SERVERROOT . '/tests/data/logo-wide.svg' ;
2012-03-02 17:42:04 +00:00
$this -> instance -> file_put_contents ( '/logo-wide.svg' , file_get_contents ( $svgFile , 'r' ));
$result = $this -> instance -> search ( 'logo' );
$this -> assertEqual ( 2 , count ( $result ));
2012-10-03 19:06:01 +00:00
$this -> assertContains ( '/logo-wide.svg' , $result );
$this -> assertContains ( '/logo-wide.png' , $result );
2012-03-02 17:42:04 +00:00
}
2012-02-12 17:06:32 +00:00
}