|
|
|
|
@ -404,4 +404,84 @@ class File extends \Test\TestCase {
|
|
|
|
|
$params[Filesystem::signal_param_path]
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Test whether locks are set before and after the operation
|
|
|
|
|
*/
|
|
|
|
|
public function testPutLocking() {
|
|
|
|
|
$view = new \OC\Files\View('/' . $this->user . '/files/');
|
|
|
|
|
|
|
|
|
|
$path = 'test-locking.txt';
|
|
|
|
|
$info = new \OC\Files\FileInfo(
|
|
|
|
|
'/' . $this->user . '/files/' . $path,
|
|
|
|
|
null,
|
|
|
|
|
null,
|
|
|
|
|
['permissions' => \OCP\Constants::PERMISSION_ALL],
|
|
|
|
|
null
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$file = new \OC\Connector\Sabre\File($view, $info);
|
|
|
|
|
|
|
|
|
|
$this->assertFalse(
|
|
|
|
|
$this->isFileLocked($view, $path, \OCP\Lock\ILockingProvider::LOCK_SHARED),
|
|
|
|
|
'File unlocked before put'
|
|
|
|
|
);
|
|
|
|
|
$this->assertFalse(
|
|
|
|
|
$this->isFileLocked($view, $path, \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE),
|
|
|
|
|
'File unlocked before put'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$wasLockedPre = false;
|
|
|
|
|
$wasLockedPost = false;
|
|
|
|
|
$eventHandler = $this->getMockBuilder('\stdclass')
|
|
|
|
|
->setMethods(['writeCallback', 'postWriteCallback'])
|
|
|
|
|
->getMock();
|
|
|
|
|
|
|
|
|
|
// both pre and post hooks might need access to the file,
|
|
|
|
|
// so only shared lock is acceptable
|
|
|
|
|
$eventHandler->expects($this->once())
|
|
|
|
|
->method('writeCallback')
|
|
|
|
|
->will($this->returnCallback(
|
|
|
|
|
function() use ($view, $path, &$wasLockedPre){
|
|
|
|
|
$wasLockedPre = $this->isFileLocked($view, $path, \OCP\Lock\ILockingProvider::LOCK_SHARED);
|
|
|
|
|
$wasLockedPre = $wasLockedPre && !$this->isFileLocked($view, $path, \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE);
|
|
|
|
|
}
|
|
|
|
|
));
|
|
|
|
|
$eventHandler->expects($this->once())
|
|
|
|
|
->method('postWriteCallback')
|
|
|
|
|
->will($this->returnCallback(
|
|
|
|
|
function() use ($view, $path, &$wasLockedPost){
|
|
|
|
|
$wasLockedPost = $this->isFileLocked($view, $path, \OCP\Lock\ILockingProvider::LOCK_SHARED);
|
|
|
|
|
$wasLockedPost = $wasLockedPost && !$this->isFileLocked($view, $path, \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE);
|
|
|
|
|
}
|
|
|
|
|
));
|
|
|
|
|
|
|
|
|
|
\OCP\Util::connectHook(
|
|
|
|
|
Filesystem::CLASSNAME,
|
|
|
|
|
Filesystem::signal_write,
|
|
|
|
|
$eventHandler,
|
|
|
|
|
'writeCallback'
|
|
|
|
|
);
|
|
|
|
|
\OCP\Util::connectHook(
|
|
|
|
|
Filesystem::CLASSNAME,
|
|
|
|
|
Filesystem::signal_post_write,
|
|
|
|
|
$eventHandler,
|
|
|
|
|
'postWriteCallback'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$this->assertNotEmpty($file->put($this->getStream('test data')));
|
|
|
|
|
|
|
|
|
|
$this->assertTrue($wasLockedPre, 'File was locked during pre-hooks');
|
|
|
|
|
$this->assertTrue($wasLockedPost, 'File was locked during post-hooks');
|
|
|
|
|
|
|
|
|
|
$this->assertFalse(
|
|
|
|
|
$this->isFileLocked($view, $path, \OCP\Lock\ILockingProvider::LOCK_SHARED),
|
|
|
|
|
'File unlocked after put'
|
|
|
|
|
);
|
|
|
|
|
$this->assertFalse(
|
|
|
|
|
$this->isFileLocked($view, $path, \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE),
|
|
|
|
|
'File unlocked after put'
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|