From c5ab74348c01593e3f0c3a05701b224b019ecd87 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 5 Mar 2019 17:55:35 +0100 Subject: [PATCH 1/3] Avoid duplicate App container creation Signed-off-by: Joas Schilling --- lib/private/ServerContainer.php | 13 +++++++++++++ lib/public/AppFramework/App.php | 7 ++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/private/ServerContainer.php b/lib/private/ServerContainer.php index e1447d2f06b..4c8107fe1be 100644 --- a/lib/private/ServerContainer.php +++ b/lib/private/ServerContainer.php @@ -71,6 +71,19 @@ class ServerContainer extends SimpleContainer { $this->appContainers[strtolower(App::buildAppNamespace($appName, ''))] = $container; } + /** + * @param string $appName + * @return DIContainer + * @throws QueryException + */ + public function getRegisteredAppContainer(string $appName) { + if (isset($this->appContainers[strtolower(App::buildAppNamespace($appName, ''))])) { + return $this->appContainers[strtolower(App::buildAppNamespace($appName, ''))]; + } + + throw new QueryException(); + } + /** * @param string $namespace * @param string $sensitiveNamespace diff --git a/lib/public/AppFramework/App.php b/lib/public/AppFramework/App.php index b6ed2da5076..06524e4bf02 100644 --- a/lib/public/AppFramework/App.php +++ b/lib/public/AppFramework/App.php @@ -66,11 +66,16 @@ class App { /** + * @param string $appName * @param array $urlParams an array with variables extracted from the routes * @since 6.0.0 */ public function __construct(string $appName, array $urlParams = []) { - $this->container = new \OC\AppFramework\DependencyInjection\DIContainer($appName, $urlParams); + try { + $this->container = \OC::$server->getRegisteredAppContainer($appName); + } catch (QueryException $e) { + $this->container = new \OC\AppFramework\DependencyInjection\DIContainer($appName, $urlParams); + } } /** From a788da6ac22f331ac4789f24e908bb340ce89f6a Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 5 Mar 2019 18:00:46 +0100 Subject: [PATCH 2/3] Make the file strict Signed-off-by: Joas Schilling --- lib/private/ServerContainer.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/private/ServerContainer.php b/lib/private/ServerContainer.php index 4c8107fe1be..8c2b49bb085 100644 --- a/lib/private/ServerContainer.php +++ b/lib/private/ServerContainer.php @@ -1,4 +1,5 @@ namespaces[$appNamespace] = $appName; @@ -67,7 +68,7 @@ class ServerContainer extends SimpleContainer { * @param string $appName * @param DIContainer $container */ - public function registerAppContainer($appName, DIContainer $container) { + public function registerAppContainer(string $appName, DIContainer $container): void { $this->appContainers[strtolower(App::buildAppNamespace($appName, ''))] = $container; } @@ -76,7 +77,7 @@ class ServerContainer extends SimpleContainer { * @return DIContainer * @throws QueryException */ - public function getRegisteredAppContainer(string $appName) { + public function getRegisteredAppContainer(string $appName): DIContainer { if (isset($this->appContainers[strtolower(App::buildAppNamespace($appName, ''))])) { return $this->appContainers[strtolower(App::buildAppNamespace($appName, ''))]; } @@ -90,7 +91,7 @@ class ServerContainer extends SimpleContainer { * @return DIContainer * @throws QueryException */ - protected function getAppContainer($namespace, $sensitiveNamespace) { + protected function getAppContainer(string $namespace, string $sensitiveNamespace): DIContainer { if (isset($this->appContainers[$namespace])) { return $this->appContainers[$namespace]; } From e13253c66ac4bbe5a73db08ffb9244e7f9669f19 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 6 Mar 2019 11:06:03 +0100 Subject: [PATCH 3/3] "Fix" the unit tests Signed-off-by: Joas Schilling --- apps/dav/lib/AppInfo/Application.php | 2 +- .../tests/unit/AppInfo/ApplicationTest.php | 21 ++----------------- 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php index a90e42d56f8..41570ee7442 100644 --- a/apps/dav/lib/AppInfo/Application.php +++ b/apps/dav/lib/AppInfo/Application.php @@ -77,7 +77,7 @@ class Application extends App { } /** - * @param IManager $contactsManager + * @param IContactsManager $contactsManager */ public function setupSystemContactsProvider(IContactsManager $contactsManager) { /** @var ContactsManager $cm */ diff --git a/apps/dav/tests/unit/AppInfo/ApplicationTest.php b/apps/dav/tests/unit/AppInfo/ApplicationTest.php index d4f53d360a9..d34749ec92b 100644 --- a/apps/dav/tests/unit/AppInfo/ApplicationTest.php +++ b/apps/dav/tests/unit/AppInfo/ApplicationTest.php @@ -26,7 +26,6 @@ namespace OCA\DAV\Tests\unit\AppInfo; use OCA\DAV\AppInfo\Application; use OCA\DAV\CardDAV\CardDavBackend; use OCA\DAV\CardDAV\ContactsManager; -use OCP\Contacts\IManager; use Test\TestCase; /** @@ -43,24 +42,8 @@ class ApplicationTest extends TestCase { // assert service instances in the container are properly setup $s = $c->query(ContactsManager::class); - $this->assertInstanceOf('OCA\DAV\CardDAV\ContactsManager', $s); + $this->assertInstanceOf(ContactsManager::class, $s); $s = $c->query(CardDavBackend::class); - $this->assertInstanceOf('OCA\DAV\CardDAV\CardDavBackend', $s); - } - - public function testContactsManagerSetup() { - $app = new Application(); - $c = $app->getContainer(); - $c->registerService(CardDavBackend::class, function() { - $service = $this->createMock(CardDavBackend::class); - $service->method('getAddressBooksForUser')->willReturn([]); - return $service; - }); - - // assert setupContactsProvider() is proper - /** @var IManager|\PHPUnit_Framework_MockObject_MockObject $cm */ - $cm = $this->createMock(IManager::class); - $app->setupContactsProvider($cm, 'xxx'); - $this->addToAssertionCount(1); + $this->assertInstanceOf(CardDavBackend::class, $s); } }