+ 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<ViewProperties> 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<ViewProperties> 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<ViewProperties> 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));
+ }