Skip to content
Snippets Groups Projects
Commit fed17925 authored by Thomas Müller's avatar Thomas Müller
Browse files

adding unit tests for quota checks

parent d3a69bf4
No related branches found
No related tags found
No related merge requests found
...@@ -3,45 +3,55 @@ ...@@ -3,45 +3,55 @@
/** /**
* This plugin check user quota and deny creating files when they exceeds the quota. * This plugin check user quota and deny creating files when they exceeds the quota.
* *
* @copyright Copyright (C) 2012 entreCables S.L. All rights reserved.
* @author Sergio Cambra * @author Sergio Cambra
* @copyright Copyright (C) 2012 entreCables S.L. All rights reserved.
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
*/ */
class OC_Connector_Sabre_QuotaPlugin extends Sabre_DAV_ServerPlugin { class OC_Connector_Sabre_QuotaPlugin extends Sabre_DAV_ServerPlugin {
/** /**
* Reference to main server object * Reference to main server object
* *
* @var Sabre_DAV_Server * @var Sabre_DAV_Server
*/ */
private $server; private $server;
/** /**
* This initializes the plugin. * is kept public to allow overwrite for unit testing
* *
* This function is called by Sabre_DAV_Server, after * @var \OC\Files\View
* addPlugin is called. */
* public $fileView;
* This method should set up the requires event subscriptions.
* /**
* @param Sabre_DAV_Server $server * This initializes the plugin.
* @return void *
*/ * This function is called by Sabre_DAV_Server, after
* addPlugin is called.
*
* This method should set up the requires event subscriptions.
*
* @param Sabre_DAV_Server $server
* @return void
*/
public function initialize(Sabre_DAV_Server $server) { public function initialize(Sabre_DAV_Server $server) {
$this->server = $server; $this->server = $server;
$this->server->subscribeEvent('beforeWriteContent', array($this, 'checkQuota'), 10);
$this->server->subscribeEvent('beforeCreateFile', array($this, 'checkQuota'), 10);
$server->subscribeEvent('beforeWriteContent', array($this, 'checkQuota'), 10);
$server->subscribeEvent('beforeCreateFile', array($this, 'checkQuota'), 10);
// initialize fileView
$this->fileView = \OC\Files\Filesystem::getView();
} }
/** /**
* This method is called before any HTTP method and forces users to be authenticated * This method is called before any HTTP method and validates there is enough free space to store the file
* *
* @param string $method * @param string $method
* @throws Sabre_DAV_Exception * @throws Sabre_DAV_Exception
* @return bool * @return bool
*/ */
public function checkQuota($uri, $data = null) { public function checkQuota($uri, $data = null) {
$length = $this->getLength(); $length = $this->getLength();
if ($length) { if ($length) {
...@@ -49,7 +59,7 @@ class OC_Connector_Sabre_QuotaPlugin extends Sabre_DAV_ServerPlugin { ...@@ -49,7 +59,7 @@ class OC_Connector_Sabre_QuotaPlugin extends Sabre_DAV_ServerPlugin {
$uri='/'.$uri; $uri='/'.$uri;
} }
list($parentUri, $newName) = Sabre_DAV_URLUtil::splitPath($uri); list($parentUri, $newName) = Sabre_DAV_URLUtil::splitPath($uri);
$freeSpace = \OC\Files\Filesystem::free_space($parentUri); $freeSpace = $this->fileView->free_space($parentUri);
if ($freeSpace !== \OC\Files\FREE_SPACE_UNKNOWN && $length > $freeSpace) { if ($freeSpace !== \OC\Files\FREE_SPACE_UNKNOWN && $length > $freeSpace) {
throw new Sabre_DAV_Exception_InsufficientStorage(); throw new Sabre_DAV_Exception_InsufficientStorage();
} }
...@@ -59,15 +69,16 @@ class OC_Connector_Sabre_QuotaPlugin extends Sabre_DAV_ServerPlugin { ...@@ -59,15 +69,16 @@ class OC_Connector_Sabre_QuotaPlugin extends Sabre_DAV_ServerPlugin {
public function getLength() public function getLength()
{ {
$expected = $this->server->httpRequest->getHeader('X-Expected-Entity-Length'); $req = $this->server->httpRequest;
if ($expected) $length = $req->getHeader('X-Expected-Entity-Length');
return $expected; if (!$length) {
$length = $req->getHeader('Content-Length');
$length = $this->server->httpRequest->getHeader('Content-Length'); }
$ocLength = $this->server->httpRequest->getHeader('OC-Total-Length');
if ($length && $ocLength) $ocLength = $req->getHeader('OC-Total-Length');
if ($length && $ocLength) {
return max($length, $ocLength); return max($length, $ocLength);
}
return $length; return $length;
} }
......
...@@ -34,14 +34,68 @@ class Test_OC_Connector_Sabre_QuotaPlugin extends PHPUnit_Framework_TestCase { ...@@ -34,14 +34,68 @@ class Test_OC_Connector_Sabre_QuotaPlugin extends PHPUnit_Framework_TestCase {
$this->assertEquals($expected, $length); $this->assertEquals($expected, $length);
} }
public function lengthProvider() /**
* @dataProvider quotaOkayProvider
*/
public function testCheckQuota($quota, $headers)
{ {
$this->plugin->fileView = $this->buildFileViewMock($quota);
$this->server->httpRequest = new Sabre_HTTP_Request($headers);
$result = $this->plugin->checkQuota('');
$this->assertTrue($result);
}
/**
* @expectedException Sabre_DAV_Exception_InsufficientStorage
* @dataProvider quotaExceededProvider
*/
public function testCheckExceededQuota($quota, $headers)
{
$this->plugin->fileView = $this->buildFileViewMock($quota);
$this->server->httpRequest = new Sabre_HTTP_Request($headers);
$this->plugin->checkQuota('');
}
public function quotaOkayProvider() {
return array(
array(1024, array()),
array(1024, array('HTTP_X_EXPECTED_ENTITY_LENGTH' => '1024')),
array(1024, array('HTTP_CONTENT_LENGTH' => '512')),
array(1024, array('HTTP_OC_TOTAL_LENGTH' => '1024', 'HTTP_CONTENT_LENGTH' => '512')),
// OC\Files\FREE_SPACE_UNKNOWN = -2
array(-2, array()),
array(-2, array('HTTP_X_EXPECTED_ENTITY_LENGTH' => '1024')),
array(-2, array('HTTP_CONTENT_LENGTH' => '512')),
array(-2, array('HTTP_OC_TOTAL_LENGTH' => '1024', 'HTTP_CONTENT_LENGTH' => '512')),
);
}
public function quotaExceededProvider() {
return array(
array(1023, array('HTTP_X_EXPECTED_ENTITY_LENGTH' => '1024')),
array(511, array('HTTP_CONTENT_LENGTH' => '512')),
array(2047, array('HTTP_OC_TOTAL_LENGTH' => '2048', 'HTTP_CONTENT_LENGTH' => '1024')),
);
}
public function lengthProvider() {
return array( return array(
array(null, array()), array(null, array()),
array(1024, array('HTTP_X_EXPECTED_ENTITY_LENGTH' => '1024')), array(1024, array('HTTP_X_EXPECTED_ENTITY_LENGTH' => '1024')),
array(512, array('HTTP_CONTENT_LENGTH' => '512')), array(512, array('HTTP_CONTENT_LENGTH' => '512')),
array(2048, array('HTTP_OC_TOTAL_LENGTH' => '2048', 'HTTP_CONTENT_LENGTH' => '1024')), array(2048, array('HTTP_OC_TOTAL_LENGTH' => '2048', 'HTTP_CONTENT_LENGTH' => '1024')),
array(4096, array('HTTP_OC_TOTAL_LENGTH' => '2048', 'HTTP_X_EXPECTED_ENTITY_LENGTH' => '4096')),
); );
} }
private function buildFileViewMock($quota) {
// mock filesysten
$view = $this->getMock('\OC\Files\View', array('free_space'), array(), '', FALSE);
$view->expects($this->any())->method('free_space')->withAnyParameters()->will($this->returnValue($quota));
return $view;
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment