From d2d99a91a0bb47ab4f2116692f363b90a736711b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?=
 <DeepDiver1975@users.noreply.github.com>
Date: Tue, 5 Jul 2016 08:54:51 +0200
Subject: [PATCH] fix swift primary object store test (#25281)

* 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.
---
 .../files_sharing/tests/MountProviderTest.php |  3 ++
 lib/private/Files/View.php                    |  2 +-
 tests/objectstore/start-swift-ceph.sh         | 11 ++++-
 tests/objectstore/wait-for-connection         | 45 +++++++++++++++++++
 4 files changed, 59 insertions(+), 2 deletions(-)
 create mode 100755 tests/objectstore/wait-for-connection

diff --git a/apps/files_sharing/tests/MountProviderTest.php b/apps/files_sharing/tests/MountProviderTest.php
index f69098cde7b..90d9f0a8567 100644
--- a/apps/files_sharing/tests/MountProviderTest.php
+++ b/apps/files_sharing/tests/MountProviderTest.php
@@ -30,6 +30,9 @@ use OCP\Share\IShare;
 use OCP\Share\IManager;
 use OCP\Files\Mount\IMountPoint;
 
+/**
+ * @group DB
+ */
 class MountProviderTest extends \Test\TestCase {
 
 	/** @var MountProvider */
diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php
index 31549c93cb2..7d9771e6394 100644
--- a/lib/private/Files/View.php
+++ b/lib/private/Files/View.php
@@ -1980,7 +1980,7 @@ class View {
 		$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,
diff --git a/tests/objectstore/start-swift-ceph.sh b/tests/objectstore/start-swift-ceph.sh
index 089aab6a648..bbf483c2897 100755
--- a/tests/objectstore/start-swift-ceph.sh
+++ b/tests/objectstore/start-swift-ceph.sh
@@ -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
@@ -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
@@ -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
diff --git a/tests/objectstore/wait-for-connection b/tests/objectstore/wait-for-connection
new file mode 100755
index 00000000000..2c480fb733e
--- /dev/null
+++ b/tests/objectstore/wait-for-connection
@@ -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);
-- 
GitLab