X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/1a6b3c0a2baba955259d6083c0a3f25dfb44a682..fdf854bd81d9e42df2d8672d49a0b7fcdb7443a5:/src/tests/viewpropertiestest.cpp diff --git a/src/tests/viewpropertiestest.cpp b/src/tests/viewpropertiestest.cpp index 5193bb35a..9c2c9466b 100644 --- a/src/tests/viewpropertiestest.cpp +++ b/src/tests/viewpropertiestest.cpp @@ -1,45 +1,44 @@ -/*************************************************************************** - * Copyright (C) 2012 by Peter Penz * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * 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 General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ +/* + * SPDX-FileCopyrightText: 2012 Peter Penz + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ -#include "dolphin_generalsettings.h" #include "views/viewproperties.h" +#include "dolphin_generalsettings.h" #include "testdir.h" +#include + +#include #include -#include class ViewPropertiesTest : public QObject { Q_OBJECT -private slots: +private Q_SLOTS: + void initTestCase(); void init(); void cleanup(); void testReadOnlyBehavior(); + void testReadOnlyDirectory(); void testAutoSave(); + void testParamMigrationToFileAttr(); + void testParamMigrationToFileAttrKeepDirectory(); + void testExtendedAttributeFull(); private: bool m_globalViewProps; - TestDir* m_testDir; + TestDir *m_testDir; }; +void ViewPropertiesTest::initTestCase() +{ + QStandardPaths::setTestModeEnabled(true); +} + void ViewPropertiesTest::init() { m_globalViewProps = GeneralSettings::self()->globalViewProps(); @@ -75,10 +74,49 @@ void ViewPropertiesTest::testReadOnlyBehavior() QScopedPointer props(new ViewProperties(m_testDir->url())); QVERIFY(props->isAutoSaveEnabled()); const QByteArray sortRole = props->sortRole(); - Q_UNUSED(sortRole); + Q_UNUSED(sortRole) + props.reset(); + + QVERIFY(!QFile::exists(dotDirectoryFile)); +} + +void ViewPropertiesTest::testReadOnlyDirectory() +{ + auto localFolder = m_testDir->url().toLocalFile(); + QString dotDirectoryFile = localFolder + "/.directory"; + QVERIFY(!QFile::exists(dotDirectoryFile)); + + // restrict write permissions + QVERIFY(QFile(localFolder).setPermissions(QFileDevice::ReadOwner)); + + QScopedPointer props(new ViewProperties(m_testDir->url())); + QVERIFY(props->isAutoSaveEnabled()); + props->setSortRole("someNewSortRole"); props.reset(); + const auto destinationDir = props->destinationDir(QStringLiteral("local")) + localFolder; + qDebug() << destinationDir; + QVERIFY(QDir(destinationDir).exists()); + QVERIFY(!QFile::exists(dotDirectoryFile)); + KFileMetaData::UserMetaData metadata(localFolder); + auto viewProperties = metadata.attribute(QStringLiteral("kde.fm.viewproperties#1")); + QVERIFY(viewProperties.isEmpty()); + + props.reset(new ViewProperties(m_testDir->url())); + QVERIFY(props->isAutoSaveEnabled()); + QCOMPARE(props->sortRole(), "someNewSortRole"); + props.reset(); + + metadata = KFileMetaData::UserMetaData(destinationDir); + if (metadata.isSupported()) { + QVERIFY(metadata.hasAttribute("kde.fm.viewproperties#1")); + } else { + QVERIFY(QFile::exists(destinationDir + "/.directory")); + } + + // un-restrict write permissions + QFile(localFolder).setPermissions(QFileDevice::ReadOwner | QFileDevice::WriteOwner); } void ViewPropertiesTest::testAutoSave() @@ -91,7 +129,151 @@ void ViewPropertiesTest::testAutoSave() props->setSortRole("someNewSortRole"); props.reset(); - QVERIFY(QFile::exists(dotDirectoryFile)); + KFileMetaData::UserMetaData metadata(m_testDir->url().toLocalFile()); + if (metadata.isSupported()) { + auto viewProperties = metadata.attribute(QStringLiteral("kde.fm.viewproperties#1")); + QVERIFY(!viewProperties.isEmpty()); + QVERIFY(!QFile::exists(dotDirectoryFile)); + } else { + QVERIFY(QFile::exists(dotDirectoryFile)); + } +} + +void ViewPropertiesTest::testParamMigrationToFileAttr() +{ + QString dotDirectoryFilePath = m_testDir->url().toLocalFile() + "/.directory"; + QVERIFY(!QFile::exists(dotDirectoryFilePath)); + + const char *settingsContent = R"SETTINGS(" +[Dolphin] +Version=4 +ViewMode=1 +Timestamp=2023,12,29,10,44,15.793 +VisibleRoles=text,CustomizedDetails,Details_text,Details_modificationtime,Details_type + +[Settings] +HiddenFilesShown=true)SETTINGS"; + auto dotDirectoryFile = QFile(dotDirectoryFilePath); + QVERIFY(dotDirectoryFile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)); + QTextStream out(&dotDirectoryFile); + out << settingsContent; + dotDirectoryFile.close(); + + KFileMetaData::UserMetaData metadata(m_testDir->url().toLocalFile()); + { + QScopedPointer props(new ViewProperties(m_testDir->url())); + QCOMPARE(props->viewMode(), DolphinView::Mode::DetailsView); + QVERIFY(props->hiddenFilesShown()); + props->save(); + + if (metadata.isSupported()) { + auto viewProperties = metadata.attribute(QStringLiteral("kde.fm.viewproperties#1")); + QVERIFY(!viewProperties.isEmpty()); + QVERIFY(!QFile::exists(dotDirectoryFilePath)); + } else { + QVERIFY(QFile::exists(dotDirectoryFilePath)); + } + } + + ViewProperties props(m_testDir->url()); + QCOMPARE(props.viewMode(), DolphinView::Mode::DetailsView); + QVERIFY(props.hiddenFilesShown()); +} + +void ViewPropertiesTest::testParamMigrationToFileAttrKeepDirectory() +{ + QString dotDirectoryFilePath = m_testDir->url().toLocalFile() + "/.directory"; + QVERIFY(!QFile::exists(dotDirectoryFilePath)); + + const char *settingsContent = R"SETTINGS(" +[Dolphin] +Version=4 +ViewMode=1 +Timestamp=2023,12,29,10,44,15.793 +VisibleRoles=text,CustomizedDetails,Details_text,Details_modificationtime,Details_type + +[Settings] +HiddenFilesShown=true + +[Other] +ThoseShouldBeKept=true +)SETTINGS"; + auto dotDirectoryFile = QFile(dotDirectoryFilePath); + QVERIFY(dotDirectoryFile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)); + QTextStream out(&dotDirectoryFile); + out << settingsContent; + dotDirectoryFile.close(); + + KFileMetaData::UserMetaData metadata(m_testDir->url().toLocalFile()); + { + QScopedPointer props(new ViewProperties(m_testDir->url())); + QCOMPARE(props->viewMode(), DolphinView::Mode::DetailsView); + QVERIFY(props->hiddenFilesShown()); + props->save(); + + if (metadata.isSupported()) { + auto viewProperties = metadata.attribute(QStringLiteral("kde.fm.viewproperties#1")); + QVERIFY(!viewProperties.isEmpty()); + } + + QVERIFY(QFile::exists(dotDirectoryFilePath)); + KConfig directorySettings(dotDirectoryFilePath, KConfig::SimpleConfig); + QCOMPARE(directorySettings.groupList(), {"Other"}); + } + + ViewProperties props(m_testDir->url()); + QVERIFY(props.hiddenFilesShown()); + QCOMPARE(props.viewMode(), DolphinView::Mode::DetailsView); + + QVERIFY(QFile::exists(dotDirectoryFilePath)); +} + +void ViewPropertiesTest::testExtendedAttributeFull() +{ +#ifndef Q_OS_UNIX + QSKIP("Only unix is supported, for this test"); +#endif + QString dotDirectoryFile = m_testDir->url().toLocalFile() + "/.directory"; + QVERIFY(!QFile::exists(dotDirectoryFile)); + + KFileMetaData::UserMetaData metadata(m_testDir->url().toLocalFile()); + if (!metadata.isSupported()) { + QSKIP("need extended attribute/filesystem metadata to be usefull"); + } + + QStorageInfo storageInfo(m_testDir->url().toLocalFile()); + auto blockSize = storageInfo.blockSize(); + + KFileMetaData::UserMetaData::Error result; + // write a close to block size theorical maximum size for attributes in Linux for ext4 + // and btrfs (4Kib typically) when ReiserFS/XFS allow XATTR_SIZE_MAX (64Kib) + result = metadata.setAttribute("data", QString(blockSize - 50, 'a')); + if (result != KFileMetaData::UserMetaData::NoSpace) { + QSKIP("File system supports metadata bigger than file system block size"); + } + + // write a close to 4k attribute, maximum size in Linux for ext4 + // so next writing the file metadata fails + result = metadata.setAttribute("data", QString(blockSize - 60, 'a')); + QCOMPARE(result, KFileMetaData::UserMetaData::NoError); + + QScopedPointer props(new ViewProperties(m_testDir->url())); + QVERIFY(props->isAutoSaveEnabled()); + props->setSortRole("someNewSortRole"); + props.reset(); + + if (metadata.isSupported()) { + auto viewProperties = metadata.attribute(QStringLiteral("kde.fm.viewproperties#1")); + QVERIFY(viewProperties.isEmpty()); + QVERIFY(QFile::exists(dotDirectoryFile)); + + QFile dotDirectory(dotDirectoryFile); + KConfig viewSettings(dotDirectoryFile, KConfig::SimpleConfig); + QCOMPARE(viewSettings.groupList(), {"Dolphin"}); + QCOMPARE(viewSettings.group("Dolphin").readEntry("SortRole"), "someNewSortRole"); + } else { + QVERIFY(QFile::exists(dotDirectoryFile)); + } } QTEST_GUILESS_MAIN(ViewPropertiesTest)