aboutsummaryrefslogtreecommitdiffstats
path: root/tests/lib/Updater/VersionCheckTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lib/Updater/VersionCheckTest.php')
-rw-r--r--tests/lib/Updater/VersionCheckTest.php378
1 files changed, 378 insertions, 0 deletions
diff --git a/tests/lib/Updater/VersionCheckTest.php b/tests/lib/Updater/VersionCheckTest.php
new file mode 100644
index 00000000000..1936062a5d0
--- /dev/null
+++ b/tests/lib/Updater/VersionCheckTest.php
@@ -0,0 +1,378 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+namespace Test\Updater;
+
+use OC\Updater\VersionCheck;
+use OCP\Http\Client\IClientService;
+use OCP\IAppConfig;
+use OCP\IConfig;
+use OCP\IUserManager;
+use OCP\Server;
+use OCP\ServerVersion;
+use OCP\Support\Subscription\IRegistry;
+use Psr\Log\LoggerInterface;
+
+class VersionCheckTest extends \Test\TestCase {
+ /** @var ServerVersion|\PHPUnit\Framework\MockObject\MockObject */
+ private $serverVersion;
+ /** @var IConfig| \PHPUnit\Framework\MockObject\MockObject */
+ private $config;
+ /** @var IAppConfig| \PHPUnit\Framework\MockObject\MockObject */
+ private $appConfig;
+ /** @var VersionCheck | \PHPUnit\Framework\MockObject\MockObject */
+ private $updater;
+ /** @var IRegistry | \PHPUnit\Framework\Mo2ckObject\MockObject */
+ private $registry;
+ /** @var LoggerInterface | \PHPUnit\Framework\Mo2ckObject\MockObject */
+ private $logger;
+
+ protected function setUp(): void {
+ parent::setUp();
+ $this->serverVersion = $this->createMock(ServerVersion::class);
+ $this->config = $this->createMock(IConfig::class);
+ $this->appConfig = $this->createMock(IAppConfig::class);
+ $clientService = $this->createMock(IClientService::class);
+
+ $this->serverVersion->method('getChannel')->willReturn('git');
+
+ $this->registry = $this->createMock(IRegistry::class);
+ $this->registry
+ ->method('delegateHasValidSubscription')
+ ->willReturn(false);
+ $this->logger = $this->createMock(LoggerInterface::class);
+ $this->updater = $this->getMockBuilder(VersionCheck::class)
+ ->onlyMethods(['getUrlContent'])
+ ->setConstructorArgs([
+ $this->serverVersion,
+ $clientService,
+ $this->config,
+ $this->appConfig,
+ $this->createMock(IUserManager::class),
+ $this->registry,
+ $this->logger,
+ ])
+ ->getMock();
+ }
+
+ /**
+ * @param string $baseUrl
+ * @return string
+ */
+ private function buildUpdateUrl($baseUrl) {
+ $serverVersion = Server::get(ServerVersion::class);
+ return $baseUrl . '?version=' . implode('x', $serverVersion->getVersion()) . 'xinstalledatx' . time() . 'x' . $serverVersion->getChannel() . 'xxx' . PHP_MAJOR_VERSION . 'x' . PHP_MINOR_VERSION . 'x' . PHP_RELEASE_VERSION . 'x0x0';
+ }
+
+ public function testCheckInCache(): void {
+ $expectedResult = [
+ 'version' => '8.0.4.2',
+ 'versionstring' => 'ownCloud 8.0.4',
+ 'url' => 'https://download.example.org/community/owncloud-8.0.4.zip',
+ 'web' => 'http://doc.example.org/server/8.0/admin_manual/maintenance/upgrade.html',
+ 'changes' => '',
+ ];
+
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueBool')
+ ->with('has_internet_connection', true)
+ ->willReturn(true);
+ $this->appConfig
+ ->expects($this->once())
+ ->method('getValueInt')
+ ->with('core', 'lastupdatedat')
+ ->willReturn(time());
+ $this->config
+ ->expects($this->once())
+ ->method('getAppValue')
+ ->with('core', 'lastupdateResult')
+ ->willReturn(json_encode($expectedResult));
+
+ $this->assertSame($expectedResult, $this->updater->check());
+ }
+
+ public function testCheckWithoutUpdateUrl(): void {
+ $expectedResult = [
+ 'version' => '8.0.4.2',
+ 'versionstring' => 'ownCloud 8.0.4',
+ 'url' => 'https://download.example.org/community/owncloud-8.0.4.zip',
+ 'web' => 'http://doc.example.org/server/8.0/admin_manual/maintenance/upgrade.html',
+ 'changes' => '',
+ 'autoupdater' => '0',
+ 'eol' => '1',
+ ];
+
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueBool')
+ ->with('has_internet_connection', true)
+ ->willReturn(true);
+ $this->appConfig
+ ->expects($this->exactly(2))
+ ->method('getValueInt')
+ ->with('core', 'lastupdatedat')
+ ->willReturnOnConsecutiveCalls(
+ 0,
+ time(),
+ );
+ $this->config
+ ->expects($this->exactly(2))
+ ->method('getAppValue')
+ ->with('core', 'installedat')
+ ->willReturn('installedat');
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueString')
+ ->with('updater.server.url', 'https://updates.nextcloud.com/updater_server/')
+ ->willReturnArgument(1);
+ $this->appConfig
+ ->expects($this->once())
+ ->method('setValueInt')
+ ->with('core', 'lastupdatedat', time());
+ $this->config
+ ->expects($this->once())
+ ->method('setAppValue')
+ ->with('core', 'lastupdateResult', json_encode($expectedResult));
+
+ $updateXml = '<?xml version="1.0"?>
+<owncloud>
+ <version>8.0.4.2</version>
+ <versionstring>ownCloud 8.0.4</versionstring>
+ <url>https://download.example.org/community/owncloud-8.0.4.zip</url>
+ <web>http://doc.example.org/server/8.0/admin_manual/maintenance/upgrade.html</web>
+ <autoupdater>0</autoupdater>
+ <eol>1</eol>
+</owncloud>';
+ $this->updater
+ ->expects($this->once())
+ ->method('getUrlContent')
+ ->with($this->buildUpdateUrl('https://updates.nextcloud.com/updater_server/'))
+ ->willReturn($updateXml);
+
+ $this->assertSame($expectedResult, $this->updater->check());
+ }
+
+ public function testCheckWithInvalidXml(): void {
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueBool')
+ ->with('has_internet_connection', true)
+ ->willReturn(true);
+ $this->appConfig
+ ->expects($this->exactly(2))
+ ->method('getValueInt')
+ ->with('core', 'lastupdatedat')
+ ->willReturnOnConsecutiveCalls(
+ 0,
+ time(),
+ );
+ $this->config
+ ->expects($this->exactly(2))
+ ->method('getAppValue')
+ ->with('core', 'installedat')
+ ->willReturn('installedat');
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueString')
+ ->with('updater.server.url', 'https://updates.nextcloud.com/updater_server/')
+ ->willReturnArgument(1);
+ $this->appConfig
+ ->expects($this->once())
+ ->method('setValueInt')
+ ->with('core', 'lastupdatedat', time());
+ $this->config
+ ->expects($this->once())
+ ->method('setAppValue')
+ ->with('core', 'lastupdateResult', $this->isType('string'));
+
+ $updateXml = 'Invalid XML Response!';
+ $this->updater
+ ->expects($this->once())
+ ->method('getUrlContent')
+ ->with($this->buildUpdateUrl('https://updates.nextcloud.com/updater_server/'))
+ ->willReturn($updateXml);
+
+ $this->assertSame([], $this->updater->check());
+ }
+
+ public function testCheckWithEmptyValidXmlResponse(): void {
+ $expectedResult = [
+ 'version' => '',
+ 'versionstring' => '',
+ 'url' => '',
+ 'web' => '',
+ 'changes' => '',
+ 'autoupdater' => '',
+ 'eol' => '0',
+ ];
+
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueBool')
+ ->with('has_internet_connection', true)
+ ->willReturn(true);
+ $this->appConfig
+ ->expects($this->exactly(2))
+ ->method('getValueInt')
+ ->with('core', 'lastupdatedat')
+ ->willReturnOnConsecutiveCalls(
+ 0,
+ time(),
+ );
+ $this->config
+ ->expects($this->exactly(2))
+ ->method('getAppValue')
+ ->with('core', 'installedat')
+ ->willReturn('installedat');
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueString')
+ ->with('updater.server.url', 'https://updates.nextcloud.com/updater_server/')
+ ->willReturnArgument(1);
+ $this->appConfig
+ ->expects($this->once())
+ ->method('setValueInt')
+ ->with('core', 'lastupdatedat', time());
+ $this->config
+ ->expects($this->once())
+ ->method('setAppValue')
+ ->with('core', 'lastupdateResult', $this->isType('string'));
+
+ $updateXml = '<?xml version="1.0"?>
+<owncloud>
+ <version></version>
+ <versionstring></versionstring>
+ <url></url>
+ <web></web>
+ <autoupdater></autoupdater>
+</owncloud>';
+ $this->updater
+ ->expects($this->once())
+ ->method('getUrlContent')
+ ->with($this->buildUpdateUrl('https://updates.nextcloud.com/updater_server/'))
+ ->willReturn($updateXml);
+
+ $this->assertSame($expectedResult, $this->updater->check());
+ }
+
+ public function testCheckWithEmptyInvalidXmlResponse(): void {
+ $expectedResult = [];
+
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueBool')
+ ->with('has_internet_connection', true)
+ ->willReturn(true);
+ $this->appConfig
+ ->expects($this->exactly(2))
+ ->method('getValueInt')
+ ->with('core', 'lastupdatedat')
+ ->willReturnOnConsecutiveCalls(
+ 0,
+ time(),
+ );
+ $this->config
+ ->expects($this->exactly(2))
+ ->method('getAppValue')
+ ->with('core', 'installedat')
+ ->willReturn('installedat');
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueString')
+ ->with('updater.server.url', 'https://updates.nextcloud.com/updater_server/')
+ ->willReturnArgument(1);
+ $this->appConfig
+ ->expects($this->once())
+ ->method('setValueInt')
+ ->with('core', 'lastupdatedat', time());
+ $this->config
+ ->expects($this->once())
+ ->method('setAppValue')
+ ->with('core', 'lastupdateResult', $this->isType('string'));
+
+ $updateXml = '';
+ $this->updater
+ ->expects($this->once())
+ ->method('getUrlContent')
+ ->with($this->buildUpdateUrl('https://updates.nextcloud.com/updater_server/'))
+ ->willReturn($updateXml);
+
+ $this->assertSame($expectedResult, $this->updater->check());
+ }
+
+ public function testCheckWithMissingAttributeXmlResponse(): void {
+ $expectedResult = [
+ 'version' => '',
+ 'versionstring' => '',
+ 'url' => '',
+ 'web' => '',
+ 'changes' => '',
+ 'autoupdater' => '',
+ 'eol' => '0',
+ ];
+
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueBool')
+ ->with('has_internet_connection', true)
+ ->willReturn(true);
+ $this->appConfig
+ ->expects($this->exactly(2))
+ ->method('getValueInt')
+ ->with('core', 'lastupdatedat')
+ ->willReturnOnConsecutiveCalls(
+ 0,
+ time(),
+ );
+ $this->config
+ ->expects($this->exactly(2))
+ ->method('getAppValue')
+ ->with('core', 'installedat')
+ ->willReturn('installedat');
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueString')
+ ->with('updater.server.url', 'https://updates.nextcloud.com/updater_server/')
+ ->willReturnArgument(1);
+ $this->appConfig
+ ->expects($this->once())
+ ->method('setValueInt')
+ ->with('core', 'lastupdatedat', time());
+ $this->config
+ ->expects($this->once())
+ ->method('setAppValue')
+ ->with('core', 'lastupdateResult', $this->isType('string'));
+
+ // missing autoupdater element should still not fail
+ $updateXml = '<?xml version="1.0"?>
+<owncloud>
+ <version></version>
+ <versionstring></versionstring>
+ <url></url>
+ <web></web>
+</owncloud>';
+ $this->updater
+ ->expects($this->once())
+ ->method('getUrlContent')
+ ->with($this->buildUpdateUrl('https://updates.nextcloud.com/updater_server/'))
+ ->willReturn($updateXml);
+
+ $this->assertSame($expectedResult, $this->updater->check());
+ }
+
+ public function testNoInternet(): void {
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValueBool')
+ ->with('has_internet_connection', true)
+ ->willReturn(false);
+
+ $this->assertFalse($this->updater->check());
+ }
+}