Skip to content

Commit

Permalink
fix swift primary object store test (#25281)
Browse files Browse the repository at this point in the history
* Wait for socket to be open

* Fix call on null

* Allow DB access for MountProviderTest

Makes unit tests pass when using object store, since their FS access is
actually oc_filecache DB access. It is currently not possible to mock
or bypass the logic from "SharedMount::verifyMountPoint()" triggered by
this test.
  • Loading branch information
DeepDiver1975 committed Jul 6, 2016
1 parent ad67b3f commit 7fb871e
Show file tree
Hide file tree
Showing 4 changed files with 195 additions and 2 deletions.
139 changes: 139 additions & 0 deletions apps/files_sharing/tests/mountprovidertest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
<?php
/**
* @author Vincent Petry <pvince81@owncloud.com>
*
* @copyright Copyright (c) 2016, ownCloud, Inc.
* @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 OCA\Files_Sharing\Tests;

use OCA\Files_Sharing\MountProvider;
use OCP\Files\Storage\IStorageFactory;
use OCP\IConfig;
use OCP\ILogger;
use OCP\IUser;
use OCP\Share\IShare;
use OCP\Share\IManager;
use OCP\Files\Mount\IMountPoint;

/**
* @group DB
*/
class MountProviderTest extends \Test\TestCase {

/** @var MountProvider */
private $provider;

/** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */
private $config;

/** @var IUser|\PHPUnit_Framework_MockObject_MockObject */
private $user;

/** @var IStorageFactory|\PHPUnit_Framework_MockObject_MockObject */
private $loader;

/** @var IManager|\PHPUnit_Framework_MockObject_MockObject */
private $shareManager;

/** @var ILogger | \PHPUnit_Framework_MockObject_MockObject */
private $logger;

public function setUp() {
parent::setUp();

$this->config = $this->getMock('OCP\IConfig');
$this->user = $this->getMock('OCP\IUser');
$this->loader = $this->getMock('OCP\Files\Storage\IStorageFactory');
$this->shareManager = $this->getMock('\OCP\Share\IManager');
$this->logger = $this->getMock('\OCP\ILogger');

$this->provider = new MountProvider($this->config, $this->shareManager, $this->logger);
}

public function testExcludeShares() {
/** @var IShare | \PHPUnit_Framework_MockObject_MockObject $share1 */
$share1 = $this->getMock('\OCP\Share\IShare');
$share1->expects($this->once())
->method('getPermissions')
->will($this->returnValue(0));

$share2 = $this->getMock('\OCP\Share\IShare');
$share2->expects($this->once())
->method('getPermissions')
->will($this->returnValue(31));
$share2->expects($this->any())
->method('getShareOwner')
->will($this->returnValue('user2'));
$share2->expects($this->any())
->method('getTarget')
->will($this->returnValue('/share2'));

$share3 = $this->getMock('\OCP\Share\IShare');
$share3->expects($this->once())
->method('getPermissions')
->will($this->returnValue(0));

/** @var IShare | \PHPUnit_Framework_MockObject_MockObject $share4 */
$share4 = $this->getMock('\OCP\Share\IShare');
$share4->expects($this->once())
->method('getPermissions')
->will($this->returnValue(31));
$share4->expects($this->any())
->method('getShareOwner')
->will($this->returnValue('user2'));
$share4->expects($this->any())
->method('getTarget')
->will($this->returnValue('/share4'));

$share5 = $this->getMock('\OCP\Share\IShare');
$share5->expects($this->once())
->method('getPermissions')
->will($this->returnValue(31));
$share5->expects($this->any())
->method('getShareOwner')
->will($this->returnValue('user1'));

$userShares = [$share1, $share2];
$groupShares = [$share3, $share4, $share5];

$this->user->expects($this->any())
->method('getUID')
->will($this->returnValue('user1'));

$this->shareManager->expects($this->at(0))
->method('getSharedWith')
->with('user1', \OCP\Share::SHARE_TYPE_USER)
->will($this->returnValue($userShares));
$this->shareManager->expects($this->at(1))
->method('getSharedWith')
->with('user1', \OCP\Share::SHARE_TYPE_GROUP, null, -1)
->will($this->returnValue($groupShares));

$mounts = $this->provider->getMountsForUser($this->user, $this->loader);

$this->assertCount(2, $mounts);
$this->assertSharedMount($share1, $mounts[0]);
$this->assertSharedMount($share4, $mounts[1]);
}

private function assertSharedMount(IShare $share, IMountPoint $mount) {
$this->assertInstanceOf('OCA\Files_Sharing\SharedMount', $mount);
$this->assertEquals($share, $mount->getShare());
}
}

2 changes: 1 addition & 1 deletion lib/private/files/view.php
Original file line number Diff line number Diff line change
Expand Up @@ -1959,7 +1959,7 @@ private function unlockPath($path, $type, $lockMountPoint = false) {
$mount = $this->getMountForLock($absolutePath, $lockMountPoint);
if ($mount) {
$storage = $mount->getStorage();
if ($storage->instanceOfStorage('\OCP\Files\Storage\ILockingStorage')) {
if ($storage && $storage->instanceOfStorage('\OCP\Files\Storage\ILockingStorage')) {
$storage->releaseLock(
$mount->getInternalPath($absolutePath),
$type,
Expand Down
11 changes: 10 additions & 1 deletion tests/objectstore/start-swift-ceph.sh
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ thisFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# create readiness notification socket
notify_sock=$(readlink -f "$thisFolder"/dockerContainerCeph.$EXECUTOR_NUMBER.swift.sock)
rm -f "$notify_sock" # in case an unfinished test left one behind
mkfifo "$notify_sock"

port=5034
Expand Down Expand Up @@ -67,7 +68,13 @@ if [[ $ready != 'READY=1' ]]; then
docker logs $container
exit 1
fi
sleep 1
if ! "$thisFolder"/wait-for-connection ${host} 80 600; then
echo "[ERROR] Waited 600 seconds, no response" >&2
docker logs $container
exit 1
fi
echo "Waiting another 15 seconds"
sleep 15

cat > $thisFolder/swift.config.php <<DELIM
<?php
Expand Down Expand Up @@ -101,5 +108,7 @@ if [ -n "$DEBUG" ]; then
cat $thisFolder/swift.config.php
echo "### contents of $thisFolder/dockerContainerCeph.$EXECUTOR_NUMBER.swift"
cat $thisFolder/dockerContainerCeph.$EXECUTOR_NUMBER.swift
echo "### docker logs"
docker logs $container
echo "############## DEBUG info end ###########"
fi
45 changes: 45 additions & 0 deletions tests/objectstore/wait-for-connection
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#!/usr/bin/php
<?php

$timeout = 60;

switch ($argc) {
case 4:
$timeout = (float)$argv[3];
case 3:
$host = $argv[1];
$port = (int)$argv[2];
break;
default:
fwrite(STDERR, 'Usage: '.$argv[0].' host port [timeout]'."\n");
exit(2);
}

if ($timeout < 0) {
fwrite(STDERR, 'Timeout must be greater than zero'."\n");
exit(2);
}
if ($port < 1) {
fwrite(STDERR, 'Port must be an integer greater than zero'."\n");
exit(2);
}

$socketTimeout = (float)ini_get('default_socket_timeout');
if ($socketTimeout > $timeout) {
$socketTimeout = $timeout;
}

$stopTime = time() + $timeout;
do {
$sock = @fsockopen($host, $port, $errno, $errstr, $socketTimeout);
if ($sock !== false) {
fclose($sock);
fwrite(STDOUT, "\n");
exit(0);
}
sleep(1);
fwrite(STDOUT, '.');
} while (time() < $stopTime);

fwrite(STDOUT, "\n");
exit(1);

0 comments on commit 7fb871e

Please sign in to comment.