Signed-off-by: Robin Appelman <robin@icewind.nl>tags/v12.0.0beta1
@@ -667,7 +667,6 @@ class OC { | |||
} | |||
// register the stream wrappers | |||
stream_wrapper_register('static', 'OC\Files\Stream\StaticStream'); | |||
stream_wrapper_register('close', 'OC\Files\Stream\Close'); | |||
stream_wrapper_register('quota', 'OC\Files\Stream\Quota'); | |||
@@ -1,171 +0,0 @@ | |||
<?php | |||
/** | |||
* @copyright Copyright (c) 2016, ownCloud, Inc. | |||
* | |||
* @author Morris Jobke <hey@morrisjobke.de> | |||
* @author Robin Appelman <robin@icewind.nl> | |||
* | |||
* @license AGPL-3.0 | |||
* | |||
* This code is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License, version 3, | |||
* as published by the Free Software Foundation. | |||
* | |||
* This program 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, version 3, | |||
* along with this program. If not, see <http://www.gnu.org/licenses/> | |||
* | |||
*/ | |||
namespace OC\Files\Stream; | |||
class StaticStream { | |||
const MODE_FILE = 0100000; | |||
public $context; | |||
protected static $data = array(); | |||
protected $path = ''; | |||
protected $pointer = 0; | |||
protected $writable = false; | |||
public function stream_close() { | |||
} | |||
public function stream_eof() { | |||
return $this->pointer >= strlen(self::$data[$this->path]); | |||
} | |||
public function stream_flush() { | |||
} | |||
public static function clear() { | |||
self::$data = array(); | |||
} | |||
public function stream_open($path, $mode, $options, &$opened_path) { | |||
switch ($mode[0]) { | |||
case 'r': | |||
if (!isset(self::$data[$path])) return false; | |||
$this->path = $path; | |||
$this->writable = isset($mode[1]) && $mode[1] == '+'; | |||
break; | |||
case 'w': | |||
self::$data[$path] = ''; | |||
$this->path = $path; | |||
$this->writable = true; | |||
break; | |||
case 'a': | |||
if (!isset(self::$data[$path])) self::$data[$path] = ''; | |||
$this->path = $path; | |||
$this->writable = true; | |||
$this->pointer = strlen(self::$data[$path]); | |||
break; | |||
case 'x': | |||
if (isset(self::$data[$path])) return false; | |||
$this->path = $path; | |||
$this->writable = true; | |||
break; | |||
case 'c': | |||
if (!isset(self::$data[$path])) self::$data[$path] = ''; | |||
$this->path = $path; | |||
$this->writable = true; | |||
break; | |||
default: | |||
return false; | |||
} | |||
$opened_path = $this->path; | |||
return true; | |||
} | |||
public function stream_read($count) { | |||
$bytes = min(strlen(self::$data[$this->path]) - $this->pointer, $count); | |||
$data = substr(self::$data[$this->path], $this->pointer, $bytes); | |||
$this->pointer += $bytes; | |||
return $data; | |||
} | |||
public function stream_seek($offset, $whence = SEEK_SET) { | |||
$len = strlen(self::$data[$this->path]); | |||
switch ($whence) { | |||
case SEEK_SET: | |||
if ($offset <= $len) { | |||
$this->pointer = $offset; | |||
return true; | |||
} | |||
break; | |||
case SEEK_CUR: | |||
if ($this->pointer + $offset <= $len) { | |||
$this->pointer += $offset; | |||
return true; | |||
} | |||
break; | |||
case SEEK_END: | |||
if ($len + $offset <= $len) { | |||
$this->pointer = $len + $offset; | |||
return true; | |||
} | |||
break; | |||
} | |||
return false; | |||
} | |||
public function stream_stat() { | |||
return $this->url_stat($this->path); | |||
} | |||
public function stream_tell() { | |||
return $this->pointer; | |||
} | |||
public function stream_write($data) { | |||
if (!$this->writable) return 0; | |||
$size = strlen($data); | |||
if ($this->stream_eof()) { | |||
self::$data[$this->path] .= $data; | |||
} else { | |||
self::$data[$this->path] = substr_replace( | |||
self::$data[$this->path], | |||
$data, | |||
$this->pointer | |||
); | |||
} | |||
$this->pointer += $size; | |||
return $size; | |||
} | |||
public function unlink($path) { | |||
if (isset(self::$data[$path])) { | |||
unset(self::$data[$path]); | |||
} | |||
return true; | |||
} | |||
public function url_stat($path) { | |||
if (isset(self::$data[$path])) { | |||
$size = strlen(self::$data[$path]); | |||
$time = time(); | |||
$data = array( | |||
'dev' => 0, | |||
'ino' => 0, | |||
'mode' => self::MODE_FILE | 0777, | |||
'nlink' => 1, | |||
'uid' => 0, | |||
'gid' => 0, | |||
'rdev' => '', | |||
'size' => $size, | |||
'atime' => $time, | |||
'mtime' => $time, | |||
'ctime' => $time, | |||
'blksize' => -1, | |||
'blocks' => -1, | |||
); | |||
return array_values($data) + $data; | |||
} | |||
return false; | |||
} | |||
} |
@@ -10,6 +10,7 @@ namespace Test\DB; | |||
use Doctrine\DBAL\Platforms\SqlitePlatform; | |||
use OC_DB; | |||
use OCP\ITempManager; | |||
use OCP\Security\ISecureRandom; | |||
use Test\TestCase; | |||
@@ -19,14 +20,20 @@ use Test\TestCase; | |||
* @group DB | |||
*/ | |||
class DBSchemaTest extends TestCase { | |||
protected $schema_file = 'static://test_db_scheme'; | |||
protected $schema_file2 = 'static://test_db_scheme2'; | |||
protected $schema_file; | |||
protected $schema_file2; | |||
protected $table1; | |||
protected $table2; | |||
/** @var ITempManager */ | |||
protected $tempManager; | |||
protected function setUp() { | |||
parent::setUp(); | |||
$this->tempManager = \OC::$server->getTempManager(); | |||
$this->schema_file = $this->tempManager->getTemporaryFile(); | |||
$this->schema_file2 = $this->tempManager->getTemporaryFile(); | |||
$dbfile = \OC::$SERVERROOT.'/tests/data/db_structure.xml'; | |||
$dbfile2 = \OC::$SERVERROOT.'/tests/data/db_structure2.xml'; | |||
@@ -73,7 +80,7 @@ class DBSchemaTest extends TestCase { | |||
} | |||
public function doTestSchemaDumping() { | |||
$outfile = 'static://db_out.xml'; | |||
$outfile = $this->tempManager->getTemporaryFile(); | |||
OC_DB::getDbStructure($outfile); | |||
$content = file_get_contents($outfile); | |||
$this->assertContains($this->table1, $content); |
@@ -18,9 +18,14 @@ use OC_DB; | |||
class LegacyDBTest extends \Test\TestCase { | |||
protected $backupGlobals = FALSE; | |||
protected static $schema_file = 'static://test_db_scheme'; | |||
protected static $schema_file; | |||
protected $test_prefix; | |||
public static function setUpBeforeClass() { | |||
self::$schema_file = \OC::$server->getTempManager()->getTemporaryFile(); | |||
} | |||
/** | |||
* @var string | |||
*/ |
@@ -47,9 +47,13 @@ class SchemaDiffTest extends TestCase { | |||
/** @var string */ | |||
private $testPrefix; | |||
private $schemaFile; | |||
protected function setUp() { | |||
parent::setUp(); | |||
$this->schemaFile = \OC::$server->getTempManager()->getTemporaryFile(); | |||
$this->config = \OC::$server->getConfig(); | |||
$this->connection = \OC::$server->getDatabaseConnection(); | |||
$this->manager = new MDB2SchemaManager($this->connection); | |||
@@ -57,7 +61,7 @@ class SchemaDiffTest extends TestCase { | |||
} | |||
protected function tearDown() { | |||
$this->manager->removeDBStructure('static://test_db_scheme'); | |||
$this->manager->removeDBStructure($this->schemaFile); | |||
parent::tearDown(); | |||
} | |||
@@ -68,7 +72,7 @@ class SchemaDiffTest extends TestCase { | |||
public function testZeroChangeOnSchemaMigrations($xml) { | |||
$xml = str_replace( '*dbprefix*', $this->testPrefix, $xml ); | |||
$schemaFile = 'static://test_db_scheme'; | |||
$schemaFile = $this->schemaFile; | |||
file_put_contents($schemaFile, $xml); | |||
// apply schema |
@@ -1,70 +0,0 @@ | |||
<?php | |||
/** | |||
* Copyright (c) 2013 Robin Appelman <icewind@owncloud.com> | |||
* This file is licensed under the Affero General Public License version 3 or | |||
* later. | |||
* See the COPYING-README file. | |||
*/ | |||
namespace Test\Files\Stream; | |||
class StaticStreamTest extends \Test\TestCase { | |||
private $sourceFile; | |||
private $sourceText; | |||
protected function setUp() { | |||
parent::setUp(); | |||
$this->sourceFile = \OC::$SERVERROOT . '/tests/data/lorem.txt'; | |||
$this->sourceText = file_get_contents($this->sourceFile); | |||
} | |||
protected function tearDown() { | |||
\OC\Files\Stream\StaticStream::clear(); | |||
parent::tearDown(); | |||
} | |||
public function testContent() { | |||
file_put_contents('static://foo', $this->sourceText); | |||
$this->assertEquals($this->sourceText, file_get_contents('static://foo')); | |||
} | |||
public function testMultipleFiles() { | |||
file_put_contents('static://foo', $this->sourceText); | |||
file_put_contents('static://bar', strrev($this->sourceText)); | |||
$this->assertEquals($this->sourceText, file_get_contents('static://foo')); | |||
$this->assertEquals(strrev($this->sourceText), file_get_contents('static://bar')); | |||
} | |||
public function testOverwrite() { | |||
file_put_contents('static://foo', $this->sourceText); | |||
file_put_contents('static://foo', 'qwerty'); | |||
$this->assertEquals('qwerty', file_get_contents('static://foo')); | |||
} | |||
public function testIsFile() { | |||
$this->assertFalse(is_file('static://foo')); | |||
file_put_contents('static://foo', $this->sourceText); | |||
$this->assertTrue(is_file('static://foo')); | |||
} | |||
public function testIsDir() { | |||
$this->assertFalse(is_dir('static://foo')); | |||
file_put_contents('static://foo', $this->sourceText); | |||
$this->assertFalse(is_dir('static://foo')); | |||
} | |||
public function testFileType() { | |||
file_put_contents('static://foo', $this->sourceText); | |||
$this->assertEquals('file', filetype('static://foo')); | |||
} | |||
public function testUnlink() { | |||
$this->assertFalse(file_exists('static://foo')); | |||
file_put_contents('static://foo', $this->sourceText); | |||
$this->assertTrue(file_exists('static://foo')); | |||
unlink('static://foo'); | |||
clearstatcache(); | |||
$this->assertFalse(file_exists('static://foo')); | |||
} | |||
} |