2 * SPDX-FileCopyrightText: 2012 Peter Penz <peter.penz19@gmail.com>
4 * SPDX-License-Identifier: GPL-2.0-or-later
7 #include "views/viewproperties.h"
8 #include "dolphin_generalsettings.h"
11 #include <KFileMetaData/UserMetaData>
13 #include <QStorageInfo>
16 class ViewPropertiesTest
: public QObject
25 void testReadOnlyBehavior();
26 void testReadOnlyDirectory();
28 void testParamMigrationToFileAttr();
29 void testParamMigrationToFileAttrKeepDirectory();
30 void testExtendedAttributeFull();
33 bool m_globalViewProps
;
37 void ViewPropertiesTest::initTestCase()
39 QStandardPaths::setTestModeEnabled(true);
42 void ViewPropertiesTest::init()
44 m_globalViewProps
= GeneralSettings::self()->globalViewProps();
45 GeneralSettings::self()->setGlobalViewProps(false);
46 GeneralSettings::self()->save();
48 // It is mandatory to create the test-directory inside the home-directory
49 // of the user: ViewProperties does not write inside directories
50 // outside the home-directory to prevent overwriting other user-settings
51 // in case if write-permissions are given.
52 m_testDir
= new TestDir(QDir::homePath() + "/.viewPropertiesTest-");
55 void ViewPropertiesTest::cleanup()
60 GeneralSettings::self()->setGlobalViewProps(m_globalViewProps
);
61 GeneralSettings::self()->save();
65 * Test whether only reading properties won't result in creating
66 * a .directory file when destructing the ViewProperties instance
67 * and autosaving is enabled.
69 void ViewPropertiesTest::testReadOnlyBehavior()
71 QString dotDirectoryFile
= m_testDir
->url().toLocalFile() + "/.directory";
72 QVERIFY(!QFile::exists(dotDirectoryFile
));
74 QScopedPointer
<ViewProperties
> props(new ViewProperties(m_testDir
->url()));
75 QVERIFY(props
->isAutoSaveEnabled());
76 const QByteArray sortRole
= props
->sortRole();
80 QVERIFY(!QFile::exists(dotDirectoryFile
));
83 void ViewPropertiesTest::testReadOnlyDirectory()
85 auto localFolder
= m_testDir
->url().toLocalFile();
86 QString dotDirectoryFile
= localFolder
+ "/.directory";
87 QVERIFY(!QFile::exists(dotDirectoryFile
));
89 // restrict write permissions
90 QVERIFY(QFile(localFolder
).setPermissions(QFileDevice::ReadOwner
));
92 QScopedPointer
<ViewProperties
> props(new ViewProperties(m_testDir
->url()));
93 QVERIFY(props
->isAutoSaveEnabled());
94 props
->setSortRole("someNewSortRole");
97 const auto destinationDir
= props
->destinationDir(QStringLiteral("local")) + localFolder
;
98 qDebug() << destinationDir
;
99 QVERIFY(QDir(destinationDir
).exists());
101 QVERIFY(!QFile::exists(dotDirectoryFile
));
102 KFileMetaData::UserMetaData
metadata(localFolder
);
103 auto viewProperties
= metadata
.attribute(QStringLiteral("kde.fm.viewproperties#1"));
104 QVERIFY(viewProperties
.isEmpty());
106 props
.reset(new ViewProperties(m_testDir
->url()));
107 QVERIFY(props
->isAutoSaveEnabled());
108 QCOMPARE(props
->sortRole(), "someNewSortRole");
111 metadata
= KFileMetaData::UserMetaData(destinationDir
);
112 if (metadata
.isSupported()) {
113 QVERIFY(metadata
.hasAttribute("kde.fm.viewproperties#1"));
115 QVERIFY(QFile::exists(destinationDir
+ "/.directory"));
118 // un-restrict write permissions
119 QFile(localFolder
).setPermissions(QFileDevice::ReadOwner
| QFileDevice::WriteOwner
);
122 void ViewPropertiesTest::testAutoSave()
124 QString dotDirectoryFile
= m_testDir
->url().toLocalFile() + "/.directory";
125 QVERIFY(!QFile::exists(dotDirectoryFile
));
127 QScopedPointer
<ViewProperties
> props(new ViewProperties(m_testDir
->url()));
128 QVERIFY(props
->isAutoSaveEnabled());
129 props
->setSortRole("someNewSortRole");
132 KFileMetaData::UserMetaData
metadata(m_testDir
->url().toLocalFile());
133 if (metadata
.isSupported()) {
134 auto viewProperties
= metadata
.attribute(QStringLiteral("kde.fm.viewproperties#1"));
135 QVERIFY(!viewProperties
.isEmpty());
136 QVERIFY(!QFile::exists(dotDirectoryFile
));
138 QVERIFY(QFile::exists(dotDirectoryFile
));
142 void ViewPropertiesTest::testParamMigrationToFileAttr()
144 QString dotDirectoryFilePath
= m_testDir
->url().toLocalFile() + "/.directory";
145 QVERIFY(!QFile::exists(dotDirectoryFilePath
));
147 const char *settingsContent
= R
"SETTINGS("
151 Timestamp
=2023,12,29,10,44,15.793
152 VisibleRoles
=text
,CustomizedDetails
,Details_text
,Details_modificationtime
,Details_type
155 HiddenFilesShown
=true)SETTINGS
";
156 auto dotDirectoryFile = QFile(dotDirectoryFilePath);
157 QVERIFY(dotDirectoryFile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate));
158 QTextStream out(&dotDirectoryFile);
159 out << settingsContent;
160 dotDirectoryFile.close();
162 KFileMetaData::UserMetaData metadata(m_testDir->url().toLocalFile());
164 QScopedPointer<ViewProperties> props(new ViewProperties(m_testDir->url()));
165 QCOMPARE(props->viewMode(), DolphinView::Mode::DetailsView);
166 QVERIFY(props->hiddenFilesShown());
169 if (metadata.isSupported()) {
170 auto viewProperties = metadata.attribute(QStringLiteral("kde
.fm
.viewproperties
#1"));
171 QVERIFY(!viewProperties.isEmpty());
172 QVERIFY(!QFile::exists(dotDirectoryFilePath));
174 QVERIFY(QFile::exists(dotDirectoryFilePath));
178 ViewProperties props(m_testDir->url());
179 QCOMPARE(props.viewMode(), DolphinView::Mode::DetailsView);
180 QVERIFY(props.hiddenFilesShown());
183 void ViewPropertiesTest::testParamMigrationToFileAttrKeepDirectory()
185 QString dotDirectoryFilePath = m_testDir->url().toLocalFile() + "/.directory";
186 QVERIFY(!QFile::exists(dotDirectoryFilePath));
188 const char *settingsContent = R"SETTINGS("
192 Timestamp=2023,12,29,10,44,15.793
193 VisibleRoles=text,CustomizedDetails,Details_text,Details_modificationtime,Details_type
196 HiddenFilesShown=true
199 ThoseShouldBeKept=true
201 auto dotDirectoryFile
= QFile(dotDirectoryFilePath
);
202 QVERIFY(dotDirectoryFile
.open(QIODevice::WriteOnly
| QIODevice::Text
| QIODevice::Truncate
));
203 QTextStream
out(&dotDirectoryFile
);
204 out
<< settingsContent
;
205 dotDirectoryFile
.close();
207 KFileMetaData::UserMetaData
metadata(m_testDir
->url().toLocalFile());
209 QScopedPointer
<ViewProperties
> props(new ViewProperties(m_testDir
->url()));
210 QCOMPARE(props
->viewMode(), DolphinView::Mode::DetailsView
);
211 QVERIFY(props
->hiddenFilesShown());
214 if (metadata
.isSupported()) {
215 auto viewProperties
= metadata
.attribute(QStringLiteral("kde.fm.viewproperties#1"));
216 QVERIFY(!viewProperties
.isEmpty());
219 QVERIFY(QFile::exists(dotDirectoryFilePath
));
220 KConfig
directorySettings(dotDirectoryFilePath
, KConfig::SimpleConfig
);
221 QCOMPARE(directorySettings
.groupList(), {"Other"});
224 ViewProperties
props(m_testDir
->url());
225 QVERIFY(props
.hiddenFilesShown());
226 QCOMPARE(props
.viewMode(), DolphinView::Mode::DetailsView
);
228 QVERIFY(QFile::exists(dotDirectoryFilePath
));
231 void ViewPropertiesTest::testExtendedAttributeFull()
234 QSKIP("Only unix is supported, for this test");
236 QString dotDirectoryFile
= m_testDir
->url().toLocalFile() + "/.directory";
237 QVERIFY(!QFile::exists(dotDirectoryFile
));
239 KFileMetaData::UserMetaData
metadata(m_testDir
->url().toLocalFile());
240 if (!metadata
.isSupported()) {
241 QSKIP("need extended attribute/filesystem metadata to be usefull");
244 QStorageInfo
storageInfo(m_testDir
->url().toLocalFile());
245 auto blockSize
= storageInfo
.blockSize();
247 KFileMetaData::UserMetaData::Error result
;
248 // write a close to block size theorical maximum size for attributes in Linux for ext4
249 // and btrfs (4Kib typically) when ReiserFS/XFS allow XATTR_SIZE_MAX (64Kib)
250 result
= metadata
.setAttribute("data", QString(blockSize
- 50, 'a'));
251 if (result
!= KFileMetaData::UserMetaData::NoSpace
) {
252 QSKIP("File system supports metadata bigger than file system block size");
255 // write a close to 4k attribute, maximum size in Linux for ext4
256 // so next writing the file metadata fails
257 result
= metadata
.setAttribute("data", QString(blockSize
- 60, 'a'));
258 QCOMPARE(result
, KFileMetaData::UserMetaData::NoError
);
260 QScopedPointer
<ViewProperties
> props(new ViewProperties(m_testDir
->url()));
261 QVERIFY(props
->isAutoSaveEnabled());
262 props
->setSortRole("someNewSortRole");
265 if (metadata
.isSupported()) {
266 auto viewProperties
= metadata
.attribute(QStringLiteral("kde.fm.viewproperties#1"));
267 QVERIFY(viewProperties
.isEmpty());
268 QVERIFY(QFile::exists(dotDirectoryFile
));
270 QFile
dotDirectory(dotDirectoryFile
);
271 KConfig
viewSettings(dotDirectoryFile
, KConfig::SimpleConfig
);
272 QCOMPARE(viewSettings
.groupList(), {"Dolphin"});
273 QCOMPARE(viewSettings
.group("Dolphin").readEntry("SortRole"), "someNewSortRole");
275 QVERIFY(QFile::exists(dotDirectoryFile
));
279 QTEST_GUILESS_MAIN(ViewPropertiesTest
)
281 #include "viewpropertiestest.moc"