diff options
Diffstat (limited to 'apps')
10 files changed, 449 insertions, 49 deletions
diff --git a/apps/files_external/3rdparty/composer/autoload_classmap.php b/apps/files_external/3rdparty/composer/autoload_classmap.php index e6bba3a9a15..97f4ce99cda 100644 --- a/apps/files_external/3rdparty/composer/autoload_classmap.php +++ b/apps/files_external/3rdparty/composer/autoload_classmap.php @@ -7,6 +7,7 @@ $baseDir = $vendorDir; return array( 'Icewind\\SMB\\AbstractShare' => $vendorDir . '/icewind/smb/src/AbstractShare.php', + 'Icewind\\SMB\\Change' => $vendorDir . '/icewind/smb/src/Change.php', 'Icewind\\SMB\\Connection' => $vendorDir . '/icewind/smb/src/Connection.php', 'Icewind\\SMB\\ErrorCodes' => $vendorDir . '/icewind/smb/src/ErrorCodes.php', 'Icewind\\SMB\\Exception\\AccessDeniedException' => $vendorDir . '/icewind/smb/src/Exception/AccessDeniedException.php', @@ -15,6 +16,7 @@ return array( 'Icewind\\SMB\\Exception\\ConnectException' => $vendorDir . '/icewind/smb/src/Exception/ConnectException.php', 'Icewind\\SMB\\Exception\\ConnectionException' => $vendorDir . '/icewind/smb/src/Exception/ConnectionException.php', 'Icewind\\SMB\\Exception\\ConnectionRefusedException' => $vendorDir . '/icewind/smb/src/Exception/ConnectionRefusedException.php', + 'Icewind\\SMB\\Exception\\DependencyException' => $vendorDir . '/icewind/smb/src/Exception/DependencyException.php', 'Icewind\\SMB\\Exception\\Exception' => $vendorDir . '/icewind/smb/src/Exception/Exception.php', 'Icewind\\SMB\\Exception\\FileInUseException' => $vendorDir . '/icewind/smb/src/Exception/FileInUseException.php', 'Icewind\\SMB\\Exception\\ForbiddenException' => $vendorDir . '/icewind/smb/src/Exception/ForbiddenException.php', @@ -31,12 +33,14 @@ return array( 'Icewind\\SMB\\Exception\\TimedOutException' => $vendorDir . '/icewind/smb/src/Exception/TimedOutException.php', 'Icewind\\SMB\\FileInfo' => $vendorDir . '/icewind/smb/src/FileInfo.php', 'Icewind\\SMB\\IFileInfo' => $vendorDir . '/icewind/smb/src/IFileInfo.php', + 'Icewind\\SMB\\INotifyHandler' => $vendorDir . '/icewind/smb/src/INotifyHandler.php', 'Icewind\\SMB\\IShare' => $vendorDir . '/icewind/smb/src/IShare.php', 'Icewind\\SMB\\NativeFileInfo' => $vendorDir . '/icewind/smb/src/NativeFileInfo.php', 'Icewind\\SMB\\NativeServer' => $vendorDir . '/icewind/smb/src/NativeServer.php', 'Icewind\\SMB\\NativeShare' => $vendorDir . '/icewind/smb/src/NativeShare.php', 'Icewind\\SMB\\NativeState' => $vendorDir . '/icewind/smb/src/NativeState.php', 'Icewind\\SMB\\NativeStream' => $vendorDir . '/icewind/smb/src/NativeStream.php', + 'Icewind\\SMB\\NotifyHandler' => $vendorDir . '/icewind/smb/src/NotifyHandler.php', 'Icewind\\SMB\\Parser' => $vendorDir . '/icewind/smb/src/Parser.php', 'Icewind\\SMB\\RawConnection' => $vendorDir . '/icewind/smb/src/RawConnection.php', 'Icewind\\SMB\\Server' => $vendorDir . '/icewind/smb/src/Server.php', diff --git a/apps/files_external/3rdparty/composer/autoload_static.php b/apps/files_external/3rdparty/composer/autoload_static.php index 9fa922caeab..c1a3a0492d0 100644 --- a/apps/files_external/3rdparty/composer/autoload_static.php +++ b/apps/files_external/3rdparty/composer/autoload_static.php @@ -37,6 +37,7 @@ class ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3 public static $classMap = array ( 'Icewind\\SMB\\AbstractShare' => __DIR__ . '/..' . '/icewind/smb/src/AbstractShare.php', + 'Icewind\\SMB\\Change' => __DIR__ . '/..' . '/icewind/smb/src/Change.php', 'Icewind\\SMB\\Connection' => __DIR__ . '/..' . '/icewind/smb/src/Connection.php', 'Icewind\\SMB\\ErrorCodes' => __DIR__ . '/..' . '/icewind/smb/src/ErrorCodes.php', 'Icewind\\SMB\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/AccessDeniedException.php', @@ -45,6 +46,7 @@ class ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3 'Icewind\\SMB\\Exception\\ConnectException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/ConnectException.php', 'Icewind\\SMB\\Exception\\ConnectionException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/ConnectionException.php', 'Icewind\\SMB\\Exception\\ConnectionRefusedException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/ConnectionRefusedException.php', + 'Icewind\\SMB\\Exception\\DependencyException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/DependencyException.php', 'Icewind\\SMB\\Exception\\Exception' => __DIR__ . '/..' . '/icewind/smb/src/Exception/Exception.php', 'Icewind\\SMB\\Exception\\FileInUseException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/FileInUseException.php', 'Icewind\\SMB\\Exception\\ForbiddenException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/ForbiddenException.php', @@ -61,12 +63,14 @@ class ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3 'Icewind\\SMB\\Exception\\TimedOutException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/TimedOutException.php', 'Icewind\\SMB\\FileInfo' => __DIR__ . '/..' . '/icewind/smb/src/FileInfo.php', 'Icewind\\SMB\\IFileInfo' => __DIR__ . '/..' . '/icewind/smb/src/IFileInfo.php', + 'Icewind\\SMB\\INotifyHandler' => __DIR__ . '/..' . '/icewind/smb/src/INotifyHandler.php', 'Icewind\\SMB\\IShare' => __DIR__ . '/..' . '/icewind/smb/src/IShare.php', 'Icewind\\SMB\\NativeFileInfo' => __DIR__ . '/..' . '/icewind/smb/src/NativeFileInfo.php', 'Icewind\\SMB\\NativeServer' => __DIR__ . '/..' . '/icewind/smb/src/NativeServer.php', 'Icewind\\SMB\\NativeShare' => __DIR__ . '/..' . '/icewind/smb/src/NativeShare.php', 'Icewind\\SMB\\NativeState' => __DIR__ . '/..' . '/icewind/smb/src/NativeState.php', 'Icewind\\SMB\\NativeStream' => __DIR__ . '/..' . '/icewind/smb/src/NativeStream.php', + 'Icewind\\SMB\\NotifyHandler' => __DIR__ . '/..' . '/icewind/smb/src/NotifyHandler.php', 'Icewind\\SMB\\Parser' => __DIR__ . '/..' . '/icewind/smb/src/Parser.php', 'Icewind\\SMB\\RawConnection' => __DIR__ . '/..' . '/icewind/smb/src/RawConnection.php', 'Icewind\\SMB\\Server' => __DIR__ . '/..' . '/icewind/smb/src/Server.php', diff --git a/apps/files_external/3rdparty/icewind/smb/src/Change.php b/apps/files_external/3rdparty/icewind/smb/src/Change.php new file mode 100644 index 00000000000..9dfd57b3973 --- /dev/null +++ b/apps/files_external/3rdparty/icewind/smb/src/Change.php @@ -0,0 +1,40 @@ +<?php +/** + * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl> + * This file is licensed under the Licensed under the MIT license: + * http://opensource.org/licenses/MIT + * + */ + +namespace Icewind\SMB; + +class Change { + private $code; + + private $path; + + /** + * Change constructor. + * + * @param $code + * @param $path + */ + public function __construct($code, $path) { + $this->code = $code; + $this->path = $path; + } + + /** + * @return integer + */ + public function getCode() { + return $this->code; + } + + /** + * @return string + */ + public function getPath() { + return $this->path; + } +} diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/DependencyException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/DependencyException.php new file mode 100644 index 00000000000..39735578798 --- /dev/null +++ b/apps/files_external/3rdparty/icewind/smb/src/Exception/DependencyException.php @@ -0,0 +1,11 @@ +<?php +/** + * Copyright (c) 2016 Robin Appelman <icewind@owncloud.com> + * This file is licensed under the Licensed under the MIT license: + * http://opensource.org/licenses/MIT + */ + +namespace Icewind\SMB\Exception; + +class DependencyException extends Exception { +} diff --git a/apps/files_external/3rdparty/icewind/smb/src/INotifyHandler.php b/apps/files_external/3rdparty/icewind/smb/src/INotifyHandler.php new file mode 100644 index 00000000000..1ee59b26ddd --- /dev/null +++ b/apps/files_external/3rdparty/icewind/smb/src/INotifyHandler.php @@ -0,0 +1,46 @@ +<?php +/** + * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl> + * This file is licensed under the Licensed under the MIT license: + * http://opensource.org/licenses/MIT + * + */ + +namespace Icewind\SMB; + + +interface INotifyHandler { + // https://msdn.microsoft.com/en-us/library/dn392331.aspx + const NOTIFY_ADDED = 1; + const NOTIFY_REMOVED = 2; + const NOTIFY_MODIFIED = 3; + const NOTIFY_RENAMED_OLD = 4; + const NOTIFY_RENAMED_NEW = 5; + const NOTIFY_ADDED_STREAM = 6; + const NOTIFY_REMOVED_STREAM = 7; + const NOTIFY_MODIFIED_STREAM = 8; + const NOTIFY_REMOVED_BY_DELETE = 9; + + /** + * Get all changes detected since the start of the notify process or the last call to getChanges + * + * @return Change[] + */ + public function getChanges(); + + /** + * Listen actively to all incoming changes + * + * Note that this is a blocking process and will cause the process to block forever if not explicitly terminated + * + * @param callable $callback + */ + public function listen($callback); + + /** + * Stop listening for changes + * + * Note that any pending changes will be discarded + */ + public function stop(); +} diff --git a/apps/files_external/3rdparty/icewind/smb/src/NotifyHandler.php b/apps/files_external/3rdparty/icewind/smb/src/NotifyHandler.php new file mode 100644 index 00000000000..194e848502b --- /dev/null +++ b/apps/files_external/3rdparty/icewind/smb/src/NotifyHandler.php @@ -0,0 +1,88 @@ +<?php +/** + * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl> + * This file is licensed under the Licensed under the MIT license: + * http://opensource.org/licenses/MIT + * + */ + +namespace Icewind\SMB; + + +class NotifyHandler implements INotifyHandler { + /** + * @var Connection + */ + private $connection; + + /** + * @var string + */ + private $path; + + private $listening = true; + + /** + * @param Connection $connection + * @param string $path + */ + public function __construct(Connection $connection, $path) { + $this->connection = $connection; + $this->path = $path; + } + + /** + * Get all changes detected since the start of the notify process or the last call to getChanges + * + * @return Change[] + */ + public function getChanges() { + if (!$this->listening) { + return []; + } + stream_set_blocking($this->connection->getOutputStream(), 0); + $lines = []; + while (($line = $this->connection->readLine())) { + $lines[] = $line; + } + stream_set_blocking($this->connection->getOutputStream(), 1); + return array_values(array_filter(array_map([$this, 'parseChangeLine'], $lines))); + } + + /** + * Listen actively to all incoming changes + * + * Note that this is a blocking process and will cause the process to block forever if not explicitly terminated + * + * @param callable $callback + */ + public function listen($callback) { + if ($this->listening) { + $this->connection->read(function ($line) use ($callback) { + return $callback($this->parseChangeLine($line)); + }); + } + } + + private function parseChangeLine($line) { + $code = (int)substr($line, 0, 4); + if ($code === 0) { + return null; + } + $subPath = str_replace('\\', '/', substr($line, 5)); + if ($this->path === '') { + return new Change($code, $subPath); + } else { + return new Change($code, $this->path . '/' . $subPath); + } + } + + public function stop() { + $this->listening = false; + $this->connection->close(); + } + + public function __destruct() { + $this->stop(); + } +} diff --git a/apps/files_external/lib/Command/Notify.php b/apps/files_external/lib/Command/Notify.php index 913299b59b4..a55b16a45c4 100644 --- a/apps/files_external/lib/Command/Notify.php +++ b/apps/files_external/lib/Command/Notify.php @@ -27,7 +27,11 @@ use OC\Core\Command\Base; use OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException; use OCA\Files_External\Lib\StorageConfig; use OCA\Files_External\Service\GlobalStoragesService; +use OCP\Files\Notify\IChange; +use OCP\Files\Notify\INotifyHandler; +use OCP\Files\Notify\IRenameChange; use OCP\Files\Storage\INotifyStorage; +use OCP\Files\Storage\IStorage; use OCP\Files\StorageNotAvailableException; use OCP\IDBConnection; use Symfony\Component\Console\Input\InputArgument; @@ -123,14 +127,16 @@ class Notify extends Base { $verbose = $input->getOption('verbose'); $path = trim($input->getOption('path'), '/'); - $storage->listen($path, function ($type, $path, $renameTarget) use ($mount, $verbose, $output) { + $notifyHandler = $storage->notify($path); + $this->selfTest($storage, $notifyHandler, $verbose, $output); + $notifyHandler->listen(function (IChange $change) use ($mount, $verbose, $output) { if ($verbose) { - $this->logUpdate($type, $path, $renameTarget, $output); + $this->logUpdate($change, $output); } - if ($type == INotifyStorage::NOTIFY_RENAMED) { - $this->markParentAsOutdated($mount->getId(), $renameTarget); + if ($change instanceof IRenameChange) { + $this->markParentAsOutdated($mount->getId(), $change->getTargetPath()); } - $this->markParentAsOutdated($mount->getId(), $path); + $this->markParentAsOutdated($mount->getId(), $change->getPath()); }); } @@ -147,8 +153,8 @@ class Notify extends Base { $this->updateQuery->execute([$parent, $mountId]); } - private function logUpdate($type, $path, $renameTarget, OutputInterface $output) { - switch ($type) { + private function logUpdate(IChange $change, OutputInterface $output) { + switch ($change->getType()) { case INotifyStorage::NOTIFY_ADDED: $text = 'added'; break; @@ -165,11 +171,42 @@ class Notify extends Base { return; } - $text .= ' ' . $path; - if ($type === INotifyStorage::NOTIFY_RENAMED) { - $text .= ' to ' . $renameTarget; + $text .= ' ' . $change->getPath(); + if ($change instanceof IRenameChange) { + $text .= ' to ' . $change->getTargetPath(); } $output->writeln($text); } + + private function selfTest(IStorage $storage, INotifyHandler $notifyHandler, $verbose, OutputInterface $output) { + usleep(100 * 1000); //give time for the notify to start + $storage->file_put_contents('/.nc_test_file.txt', 'test content'); + $storage->mkdir('/.nc_test_folder'); + $storage->file_put_contents('/.nc_test_folder/subfile.txt', 'test content'); + $storage->unlink('/.nc_test_file.txt'); + $storage->unlink('/.nc_test_folder/subfile.txt'); + $storage->rmdir('/.nc_test_folder'); + usleep(100 * 1000); //time for all changes to be processed + + $foundRootChange = false; + $foundSubfolderChange = false; + + $changes = $notifyHandler->getChanges(); + foreach ($changes as $change) { + if ($change->getPath() === '/.nc_test_file.txt') { + $foundRootChange = true; + } else if ($change->getPath() === '/.nc_test_folder/subfile.txt') { + $foundSubfolderChange = true; + } + } + + if ($foundRootChange && $foundSubfolderChange && $verbose) { + $output->writeln('<info>Self-test successful</info>'); + } else if ($foundRootChange && !$foundSubfolderChange) { + $output->writeln('<error>Error while running self-test, change is subfolder not detected</error>'); + } else if (!$foundRootChange) { + $output->writeln('<error>Error while running self-test, no changes detected</error>'); + } + } } diff --git a/apps/files_external/lib/Lib/Notify/SMBNotifyHandler.php b/apps/files_external/lib/Lib/Notify/SMBNotifyHandler.php new file mode 100644 index 00000000000..9ac74b32ad8 --- /dev/null +++ b/apps/files_external/lib/Lib/Notify/SMBNotifyHandler.php @@ -0,0 +1,150 @@ +<?php +/** + * @copyright Copyright (c) 2017 Robin Appelman <robin@icewind.nl> + * + * @author Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * 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 + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files_External\Lib\Notify; + +use OC\Files\Notify\Change; +use OC\Files\Notify\RenameChange; +use OCP\Files\Notify\IChange; +use OCP\Files\Notify\INotifyHandler; + +class SMBNotifyHandler implements INotifyHandler { + /** + * @var \Icewind\SMB\INotifyHandler + */ + private $shareNotifyHandler; + + /** + * @var string + */ + private $root; + + private $oldRenamePath = null; + + /** + * SMBNotifyHandler constructor. + * + * @param \Icewind\SMB\INotifyHandler $shareNotifyHandler + * @param string $root + */ + public function __construct(\Icewind\SMB\INotifyHandler $shareNotifyHandler, $root) { + $this->shareNotifyHandler = $shareNotifyHandler; + $this->root = $root; + } + + private function relativePath($fullPath) { + if ($fullPath === $this->root) { + return ''; + } else if (substr($fullPath, 0, strlen($this->root)) === $this->root) { + return substr($fullPath, strlen($this->root)); + } else { + return null; + } + } + + public function listen(callable $callback) { + $oldRenamePath = null; + $this->shareNotifyHandler->listen(function (\Icewind\SMB\Change $shareChange) use ($callback) { + $change = $this->mapChange($shareChange); + if (!is_null($change)) { + return $callback($change); + } else { + return true; + } + }); + } + + /** + * Get all changes detected since the start of the notify process or the last call to getChanges + * + * @return IChange[] + */ + public function getChanges() { + $shareChanges = $this->shareNotifyHandler->getChanges(); + $changes = []; + foreach ($shareChanges as $shareChange) { + $change = $this->mapChange($shareChange); + if ($change) { + $changes[] = $change; + } + } + return $changes; + } + + /** + * Stop listening for changes + * + * Note that any pending changes will be discarded + */ + public function stop() { + $this->shareNotifyHandler->stop(); + } + + /** + * @param \Icewind\SMB\Change $change + * @return IChange|null + */ + private function mapChange(\Icewind\SMB\Change $change) { + $path = $this->relativePath($change->getPath()); + if (is_null($path)) { + return null; + } + if ($change->getCode() === \Icewind\SMB\INotifyHandler::NOTIFY_RENAMED_OLD) { + $this->oldRenamePath = $path; + return null; + } + $type = $this->mapNotifyType($change->getCode()); + if (is_null($type)) { + return null; + } + if ($type === IChange::RENAMED) { + if (!is_null($this->oldRenamePath)) { + $result = new RenameChange($type, $this->oldRenamePath, $path); + $this->oldRenamePath = null; + } else { + $result = null; + } + } else { + $result = new Change($type, $path); + } + return $result; + } + + private function mapNotifyType($smbType) { + switch ($smbType) { + case \Icewind\SMB\INotifyHandler::NOTIFY_ADDED: + return IChange::ADDED; + case \Icewind\SMB\INotifyHandler::NOTIFY_REMOVED: + return IChange::REMOVED; + case \Icewind\SMB\INotifyHandler::NOTIFY_MODIFIED: + case \Icewind\SMB\INotifyHandler::NOTIFY_ADDED_STREAM: + case \Icewind\SMB\INotifyHandler::NOTIFY_MODIFIED_STREAM: + case \Icewind\SMB\INotifyHandler::NOTIFY_REMOVED_STREAM: + return IChange::MODIFIED; + case \Icewind\SMB\INotifyHandler::NOTIFY_RENAMED_NEW: + return IChange::RENAMED; + default: + return null; + } + } +} diff --git a/apps/files_external/lib/Lib/Storage/SMB.php b/apps/files_external/lib/Lib/Storage/SMB.php index 7ffc078df6f..690f8e2a334 100644 --- a/apps/files_external/lib/Lib/Storage/SMB.php +++ b/apps/files_external/lib/Lib/Storage/SMB.php @@ -46,6 +46,9 @@ use Icewind\Streams\IteratorDirectory; use OC\Cache\CappedMemoryCache; use OC\Files\Filesystem; use OC\Files\Storage\Common; +use OCA\Files_External\Lib\Notify\SMBNotifyHandler; +use OCP\Files\Notify\IChange; +use OCP\Files\Notify\IRenameChange; use OCP\Files\Storage\INotifyStorage; use OCP\Files\StorageNotAvailableException; @@ -149,7 +152,7 @@ class SMB extends Common implements INotifyStorage { foreach ($files as $file) { $this->statCache[$path . '/' . $file->getName()] = $file; } - return array_filter($files, function(IFileInfo $file) { + return array_filter($files, function (IFileInfo $file) { return !$file->isHidden(); }); } catch (ConnectException $e) { @@ -486,48 +489,18 @@ class SMB extends Common implements INotifyStorage { } public function listen($path, callable $callback) { - $fullPath = $this->buildPath($path); - $oldRenamePath = null; - $this->share->notify($fullPath)->listen(function (Change $change) use (&$oldRenamePath, $callback) { - $path = $this->relativePath($change->getPath()); - if (is_null($path)) { - return true; - } - if ($change->getCode() === INotifyHandler::NOTIFY_RENAMED_OLD) { - $oldRenamePath = $path; - return true; - } - $type = $this->mapNotifyType($change->getCode()); - if (is_null($type)) { - return true; - } - if ($type === INotifyStorage::NOTIFY_RENAMED) { - if (!is_null($oldRenamePath)) { - $result = $callback($type, $oldRenamePath, $path); - $oldRenamePath = null; - } + $this->notify($path)->listen(function (IChange $change) use ($callback) { + if ($change instanceof IRenameChange) { + return $callback($change->getType(), $change->getPath(), $change->getTargetPath()); } else { - $result = $callback($type, $path); + return $callback($change->getType(), $change->getPath()); } - return $result; }); } - private function mapNotifyType($smbType) { - switch ($smbType) { - case INotifyHandler::NOTIFY_ADDED: - return INotifyStorage::NOTIFY_ADDED; - case INotifyHandler::NOTIFY_REMOVED: - return INotifyStorage::NOTIFY_REMOVED; - case INotifyHandler::NOTIFY_MODIFIED: - case INotifyHandler::NOTIFY_ADDED_STREAM: - case INotifyHandler::NOTIFY_MODIFIED_STREAM: - case INotifyHandler::NOTIFY_REMOVED_STREAM: - return INotifyStorage::NOTIFY_MODIFIED; - case INotifyHandler::NOTIFY_RENAMED_NEW: - return INotifyStorage::NOTIFY_RENAMED; - default: - return null; - } + public function notify($path) { + $path = '/' . ltrim($path, '/'); + $shareNotifyHandler = $this->share->notify($this->buildPath($path)); + return new SMBNotifyHandler($shareNotifyHandler, $this->root); } } diff --git a/apps/files_external/tests/Storage/SmbTest.php b/apps/files_external/tests/Storage/SmbTest.php index 150d4d3a035..45c01a0c59e 100644 --- a/apps/files_external/tests/Storage/SmbTest.php +++ b/apps/files_external/tests/Storage/SmbTest.php @@ -27,7 +27,10 @@ namespace OCA\Files_External\Tests\Storage; +use OC\Files\Notify\Change; +use OC\Files\Notify\RenameChange; use \OCA\Files_External\Lib\Storage\SMB; +use OCP\Files\Notify\IChange; /** * Class SmbTest @@ -37,6 +40,10 @@ use \OCA\Files_External\Lib\Storage\SMB; * @package OCA\Files_External\Tests\Storage */ class SmbTest extends \Test\Files\Storage\Storage { + /** + * @var SMB instance + */ + protected $instance; protected function setUp() { parent::setUp(); @@ -85,4 +92,44 @@ class SmbTest extends \Test\Files\Storage\Storage { $this->assertEquals('smb::testuser@testhost//someshare//someroot/', $this->instance->getId()); $this->instance = null; } + + public function testNotifyGetChanges() { + $notifyHandler = $this->instance->notify(''); + usleep(100 * 1000); //give time for the notify to start + $this->instance->file_put_contents('/newfile.txt', 'test content'); + $this->instance->rename('/newfile.txt', 'renamed.txt'); + $this->instance->unlink('/renamed.txt'); + usleep(100 * 1000); //time for all changes to be processed + + $changes = $notifyHandler->getChanges(); + $notifyHandler->stop(); + + $expected = [ + new Change(IChange::ADDED, 'newfile.txt'), + new RenameChange(IChange::RENAMED, 'newfile.txt', 'renamed.txt'), + new Change(IChange::REMOVED, 'renamed.txt') + ]; + + foreach ($expected as $expectedChange) { + $this->assertContains($expectedChange, $changes, '', false, false); // dont check object identity + } + } + + public function testNotifyListen() { + $notifyHandler = $this->instance->notify(''); + usleep(100 * 1000); //give time for the notify to start + $this->instance->file_put_contents('/newfile.txt', 'test content'); + $this->instance->unlink('/newfile.txt'); + usleep(100 * 1000); //time for all changes to be processed + + $result = null; + + // since the notify handler buffers untill we start listening we will get the above changes + $notifyHandler->listen(function (IChange $change) use (&$result) { + $result = $change; + return false;//stop listening + }); + + $this->assertEquals(new Change(IChange::ADDED, 'newfile.txt'), $result); + } } |