. * */ namespace Test\Files\Storage; abstract class Storage extends \UnitTestCase { /** * @var \OC\Files\Storage\Storage instance */ protected $instance; /** * the root folder of the storage should always exist, be readable and be recognized as a directory */ public function testRoot() { $this->assertTrue($this->instance->file_exists('/'),'Root folder does not exist'); $this->assertTrue($this->instance->isReadable('/'),'Root folder is not readable'); $this->assertTrue($this->instance->is_dir('/'),'Root folder is not a directory'); $this->assertFalse($this->instance->is_file('/'),'Root folder is a file'); $this->assertEqual('dir',$this->instance->filetype('/')); //without this, any further testing would be useless, not an acutal requirement for filestorage though $this->assertTrue($this->instance->isUpdatable('/'),'Root folder is not writable'); } public function testDirectories() { $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')); $this->assertTrue($this->instance->isReadable('/folder')); $this->assertTrue($this->instance->isUpdatable('/folder')); $dh=$this->instance->opendir('/'); $content=array(); while($file=readdir($dh)) { if($file!='.' and $file!='..') { $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 $dh=$this->instance->opendir('/'); $content=array(); while($file=readdir($dh)) { if($file!='.' and $file!='..') { $content[]=$file; } } $this->assertEqual(array(),$content); } /** * test the various uses of file_get_contents and file_put_contents */ public function testGetPutContents() { $sourceFile=\OC::$SERVERROOT.'/tests/data/lorem.txt'; $sourceText=file_get_contents($sourceFile); //fill a file with string data $this->instance->file_put_contents('/lorem.txt',$sourceText); $this->assertFalse($this->instance->is_dir('/lorem.txt')); $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'); } /** * test various known mimetypes */ public function testMimeType() { $this->assertEqual('httpd/unix-directory',$this->instance->getMimeType('/')); $this->assertEqual(false,$this->instance->getMimeType('/non/existing/file')); $textFile=\OC::$SERVERROOT.'/tests/data/lorem.txt'; $this->instance->file_put_contents('/lorem.txt',file_get_contents($textFile,'r')); $this->assertEqual('text/plain',$this->instance->getMimeType('/lorem.txt')); $pngFile=\OC::$SERVERROOT.'/tests/data/logo-wide.png'; $this->instance->file_put_contents('/logo-wide.png',file_get_contents($pngFile,'r')); $this->assertEqual('image/png',$this->instance->getMimeType('/logo-wide.png')); $svgFile=\OC::$SERVERROOT.'/tests/data/logo-wide.svg'; $this->instance->file_put_contents('/logo-wide.svg',file_get_contents($svgFile,'r')); $this->assertEqual('image/svg+xml',$this->instance->getMimeType('/logo-wide.svg')); } public function testCopyAndMove() { $textFile=\OC::$SERVERROOT.'/tests/data/lorem.txt'; $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')); } public function testLocal() { $textFile=\OC::$SERVERROOT.'/tests/data/lorem.txt'; $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)); $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'); } public function testStat() { $textFile=\OC::$SERVERROOT.'/tests/data/lorem.txt'; $ctimeStart=time(); $this->instance->file_put_contents('/lorem.txt',file_get_contents($textFile)); $this->assertTrue($this->instance->isReadable('/lorem.txt')); $ctimeEnd=time(); $cTime=$this->instance->filectime('/lorem.txt'); $mTime=$this->instance->filemtime('/lorem.txt'); if($cTime!=-1) {//not everything can support ctime $this->assertTrue(($ctimeStart-1)<=$cTime); $this->assertTrue($cTime<=($ctimeEnd+1)); } $this->assertTrue($this->instance->hasUpdated('/lorem.txt',$ctimeStart-1)); $this->assertTrue($this->instance->hasUpdated('/',$ctimeStart-1)); $this->assertTrue(($ctimeStart-1)<=$mTime); $this->assertTrue($mTime<=($ctimeEnd+1)); $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(); $supportsTouch = $this->instance->touch('/lorem.txt'); $mtimeEnd=time(); if($supportsTouch !== false){ $originalCTime=$cTime; $cTime=$this->instance->filectime('/lorem.txt'); $mTime=$this->instance->filemtime('/lorem.txt'); $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); } } $mtimeStart=time(); $fh=$this->instance->fopen('/lorem.txt','a'); fwrite($fh,' '); fclose($fh); clearstatcache(); $mtimeEnd=time(); $mTime=$this->instance->filemtime('/lorem.txt'); $this->assertTrue(($mtimeStart-1)<=$mTime); $this->assertTrue($mTime<=($mtimeEnd+1)); $this->instance->unlink('/lorem.txt'); $this->assertTrue($this->instance->hasUpdated('/',$mtimeStart-1)); } public function testSearch() { $textFile=\OC::$SERVERROOT.'/tests/data/lorem.txt'; $this->instance->file_put_contents('/lorem.txt',file_get_contents($textFile,'r')); $pngFile=\OC::$SERVERROOT.'/tests/data/logo-wide.png'; $this->instance->file_put_contents('/logo-wide.png',file_get_contents($pngFile,'r')); $svgFile=\OC::$SERVERROOT.'/tests/data/logo-wide.svg'; $this->instance->file_put_contents('/logo-wide.svg',file_get_contents($svgFile,'r')); $result=$this->instance->search('logo'); $this->assertEqual(2,count($result)); $this->assertContains('/logo-wide.svg',$result); $this->assertContains('/logo-wide.png',$result); } }