userId = $this->getUniqueID(); $user = $this->createUser($this->userId, $this->userId); $storage = new \OC\Files\Storage\Temporary([]); $this->registerMount($this->userId, $storage, ''); $this->loginAsUser($this->userId); $this->logout(); $this->loginAsUser($this->userId); $appManager = \OC::$server->getAppManager(); $this->trashEnabled = $appManager->isEnabledForUser('files_trashbin', $user); $appManager->disableApp('files_trashbin'); $this->connection = \OC::$server->getDatabaseConnection(); $this->previewManager = \OC::$server->getPreviewManager(); $this->rootFolder = \OC::$server->get(IRootFolder::class); $this->mimeTypeLoader = \OC::$server->getMimeTypeLoader(); $this->timeFactory = \OCP\Server::get(ITimeFactory::class); } protected function tearDown(): void { if ($this->trashEnabled) { $appManager = \OC::$server->getAppManager(); $appManager->enableApp('files_trashbin'); } $this->logout(); parent::tearDown(); } private function getRoot(): Root { return new Root( \OC::$server->get(IRootFolder::class), \OC::$server->getSystemConfig() ); } private function setup11Previews(): array { $userFolder = $this->rootFolder->getUserFolder($this->userId); $files = []; for ($i = 0; $i < 11; $i++) { $file = $userFolder->newFile($i . '.txt'); $file->putContent('hello world!'); $this->previewManager->getPreview($file); $files[] = $file; } return $files; } private function countPreviews(Root $previewRoot, array $fileIds): int { $i = 0; foreach ($fileIds as $fileId) { try { $previewRoot->getFolder((string)$fileId); } catch (NotFoundException $e) { continue; } $i++; } return $i; } public function testCleanupSystemCron(): void { $files = $this->setup11Previews(); $fileIds = array_map(function (File $f) { return $f->getId(); }, $files); $root = $this->getRoot(); $this->assertSame(11, $this->countPreviews($root, $fileIds)); $job = new BackgroundCleanupJob($this->timeFactory, $this->connection, $root, $this->mimeTypeLoader, true); $job->run([]); foreach ($files as $file) { $file->delete(); } $root = $this->getRoot(); $this->assertSame(11, $this->countPreviews($root, $fileIds)); $job->run([]); $root = $this->getRoot(); $this->assertSame(0, $this->countPreviews($root, $fileIds)); } public function testCleanupAjax(): void { if ($this->connection->getShardDefinition('filecache')) { $this->markTestSkipped('ajax cron is not supported for sharded setups'); return; } $files = $this->setup11Previews(); $fileIds = array_map(function (File $f) { return $f->getId(); }, $files); $root = $this->getRoot(); $this->assertSame(11, $this->countPreviews($root, $fileIds)); $job = new BackgroundCleanupJob($this->timeFactory, $this->connection, $root, $this->mimeTypeLoader, false); $job->run([]); foreach ($files as $file) { $file->delete(); } $root = $this->getRoot(); $this->assertSame(11, $this->countPreviews($root, $fileIds)); $job->run([]); $root = $this->getRoot(); $this->assertSame(1, $this->countPreviews($root, $fileIds)); $job->run([]); $root = $this->getRoot(); $this->assertSame(0, $this->countPreviews($root, $fileIds)); } public function testOldPreviews(): void { if ($this->connection->getShardDefinition('filecache')) { $this->markTestSkipped('old previews are not supported for sharded setups'); return; } $appdata = \OC::$server->getAppDataDir('preview'); $f1 = $appdata->newFolder('123456781'); $f1->newFile('foo.jpg', 'foo'); $f2 = $appdata->newFolder('123456782'); $f2->newFile('foo.jpg', 'foo'); $f2 = $appdata->newFolder((string)PHP_INT_MAX - 1); $f2->newFile('foo.jpg', 'foo'); $appdata = \OC::$server->getAppDataDir('preview'); $this->assertSame(3, count($appdata->getDirectoryListing())); $job = new BackgroundCleanupJob($this->timeFactory, $this->connection, $this->getRoot(), $this->mimeTypeLoader, true); $job->run([]); $appdata = \OC::$server->getAppDataDir('preview'); $this->assertSame(0, count($appdata->getDirectoryListing())); } }