#include #include #include #include #include "common/filefunctions.h" namespace { // Collects qDebug/qWarning/qCritical output for inspection QStringList g_captured_messages; void CaptureMessageHandler(QtMsgType, const QMessageLogContext &, const QString &msg) { g_captured_messages.append(msg); } } // namespace TEST(CommonFileFunctions, EnsureFilenameExtension) { EXPECT_EQ(olive::FileFunctions::EnsureFilenameExtension( QStringLiteral("project"), QStringLiteral("ove")), QStringLiteral("project.ove")); EXPECT_EQ(olive::FileFunctions::EnsureFilenameExtension( QStringLiteral("project.ove"), QStringLiteral("ove")), QStringLiteral("project.ove")); EXPECT_EQ(olive::FileFunctions::EnsureFilenameExtension( QStringLiteral("PROJECT"), QStringLiteral("ove")), QStringLiteral("PROJECT.ove")); EXPECT_TRUE(olive::FileFunctions::EnsureFilenameExtension( QString(), QStringLiteral("ove")) .isEmpty()); EXPECT_EQ(olive::FileFunctions::EnsureFilenameExtension( QStringLiteral("project"), QString()), QStringLiteral("project")); } TEST(CommonFileFunctions, GetSafeTemporaryFilename) { QTemporaryDir dir; ASSERT_TRUE(dir.isValid()); QString base = dir.filePath(QStringLiteral("test.ove")); QString first = olive::FileFunctions::GetSafeTemporaryFilename(base); EXPECT_FALSE(QFileInfo::exists(first)); EXPECT_TRUE(first.contains(QStringLiteral(".tmp0."))); QFile f(first); f.open(QIODevice::WriteOnly); f.close(); QString second = olive::FileFunctions::GetSafeTemporaryFilename(base); EXPECT_NE(first, second); EXPECT_TRUE(second.contains(QStringLiteral(".tmp1."))); } TEST(CommonFileFunctions, DirectoryIsValid) { QTemporaryDir dir; ASSERT_TRUE(dir.isValid()); EXPECT_TRUE( olive::FileFunctions::DirectoryIsValid(QDir(dir.path()), false)); QDir nonexistent(dir.filePath(QStringLiteral("subdir/nested"))); EXPECT_TRUE(olive::FileFunctions::DirectoryIsValid(nonexistent, true)); EXPECT_TRUE(nonexistent.exists()); } TEST(CommonFileFunctions, RenameFileAllowOverwrite) { QTemporaryDir dir; ASSERT_TRUE(dir.isValid()); QString from = dir.filePath(QStringLiteral("from.txt")); QString to = dir.filePath(QStringLiteral("to.txt")); QFile f(from); f.open(QIODevice::WriteOnly); f.write("source"); f.close(); QFile t(to); t.open(QIODevice::WriteOnly); t.write("existing"); t.close(); EXPECT_TRUE(olive::FileFunctions::RenameFileAllowOverwrite(from, to)); EXPECT_FALSE(QFileInfo::exists(from)); QFile result(to); result.open(QIODevice::ReadOnly); EXPECT_EQ(result.readAll(), QByteArray("source")); } TEST(CommonFileFunctions, CanCopyDirectoryWithoutOverwriting) { QTemporaryDir src; QTemporaryDir dst; ASSERT_TRUE(src.isValid()); ASSERT_TRUE(dst.isValid()); QString src_file = QDir(src.path()).filePath(QStringLiteral("file.txt")); QFile f(src_file); f.open(QIODevice::WriteOnly); f.close(); EXPECT_TRUE(olive::FileFunctions::CanCopyDirectoryWithoutOverwriting( src.path(), dst.path())); QString dst_file = QDir(dst.path()).filePath(QStringLiteral("file.txt")); QFile g(dst_file); g.open(QIODevice::WriteOnly); g.close(); EXPECT_FALSE(olive::FileFunctions::CanCopyDirectoryWithoutOverwriting( src.path(), dst.path())); } TEST(CommonFileFunctions, CopyDirectory) { QTemporaryDir src; QTemporaryDir dst; ASSERT_TRUE(src.isValid()); ASSERT_TRUE(dst.isValid()); QString src_file = QDir(src.path()).filePath(QStringLiteral("file.txt")); QFile f(src_file); f.open(QIODevice::WriteOnly); f.write("copied"); f.close(); QString dst_dir = QDir(dst.path()).filePath(QStringLiteral("copied")); olive::FileFunctions::CopyDirectory(src.path(), dst_dir, false); QFile result(QDir(dst_dir).filePath(QStringLiteral("file.txt"))); EXPECT_TRUE(result.open(QIODevice::ReadOnly)); EXPECT_EQ(result.readAll(), QByteArray("copied")); } TEST(CommonFileFunctions, ReadFileAsString) { QTemporaryFile f; ASSERT_TRUE(f.open()); f.write("hello world"); f.close(); EXPECT_EQ(olive::FileFunctions::ReadFileAsString(f.fileName()), QStringLiteral("hello world")); EXPECT_TRUE(olive::FileFunctions::ReadFileAsString( QStringLiteral("/nonexistent/path")) .isEmpty()); } TEST(CommonFileFunctions, GetUniqueFileIdentifier) { QTemporaryFile f; ASSERT_TRUE(f.open()); f.close(); QString id1 = olive::FileFunctions::GetUniqueFileIdentifier(f.fileName()); QString id2 = olive::FileFunctions::GetUniqueFileIdentifier(f.fileName()); EXPECT_FALSE(id1.isEmpty()); EXPECT_EQ(id1, id2); EXPECT_TRUE(olive::FileFunctions::GetUniqueFileIdentifier( QStringLiteral("/nonexistent")) .isEmpty()); } TEST(CommonFileFunctions, GetConfigurationLocation) { QString loc = olive::FileFunctions::GetConfigurationLocation(); EXPECT_FALSE(loc.isEmpty()); EXPECT_TRUE(QDir(loc).exists()); } TEST(CommonFileFunctions, GetTempFilePath) { QString temp = olive::FileFunctions::GetTempFilePath(); EXPECT_FALSE(temp.isEmpty()); EXPECT_TRUE(QDir(temp).exists()); } TEST(CommonFileFunctions, GetAutoRecoveryRoot) { QString root = olive::FileFunctions::GetAutoRecoveryRoot(); EXPECT_FALSE(root.isEmpty()); } TEST(CommonFileFunctions, DirectoryIsValidExisting) { QTemporaryDir dir; ASSERT_TRUE(dir.isValid()); EXPECT_TRUE( olive::FileFunctions::DirectoryIsValid(QDir(dir.path()), false)); } TEST(CommonFileFunctions, CopyDirectoryWithOverwrite) { QTemporaryDir src; QTemporaryDir dst; ASSERT_TRUE(src.isValid()); ASSERT_TRUE(dst.isValid()); QString src_file = QDir(src.path()).filePath(QStringLiteral("file.txt")); QFile f(src_file); f.open(QIODevice::WriteOnly); f.write("new content"); f.close(); QString dst_file = QDir(dst.path()).filePath(QStringLiteral("file.txt")); QFile g(dst_file); g.open(QIODevice::WriteOnly); g.write("old content"); g.close(); olive::FileFunctions::CopyDirectory(src.path(), dst.path(), true); QFile result(dst_file); result.open(QIODevice::ReadOnly); EXPECT_EQ(result.readAll(), QByteArray("new content")); } TEST(CommonFileFunctions, CopyDirectorySourceMissing) { QTemporaryDir dst; ASSERT_TRUE(dst.isValid()); // A missing source must log a critical error naming the source and // leave the destination untouched g_captured_messages.clear(); QtMessageHandler old = qInstallMessageHandler(CaptureMessageHandler); olive::FileFunctions::CopyDirectory(QStringLiteral("/nonexistent/path"), dst.path(), false); qInstallMessageHandler(old); ASSERT_EQ(g_captured_messages.size(), 1); EXPECT_TRUE(g_captured_messages.first().contains( QStringLiteral("Failed to copy directory"))); EXPECT_TRUE(g_captured_messages.first().contains( QStringLiteral("/nonexistent/path"))); EXPECT_TRUE( QDir(dst.path()).entryList(QDir::NoDotAndDotDot).isEmpty()); }