diff --git a/tests/auto/utils/CMakeLists.txt b/tests/auto/utils/CMakeLists.txt index 2ce149800dd..a8ef9312186 100644 --- a/tests/auto/utils/CMakeLists.txt +++ b/tests/auto/utils/CMakeLists.txt @@ -21,3 +21,4 @@ add_subdirectory(templateengine) add_subdirectory(treemodel) add_subdirectory(text) add_subdirectory(unixdevicefileaccess) +add_subdirectory(archive) diff --git a/tests/auto/utils/archive/CMakeLists.txt b/tests/auto/utils/archive/CMakeLists.txt new file mode 100644 index 00000000000..4eef25931a9 --- /dev/null +++ b/tests/auto/utils/archive/CMakeLists.txt @@ -0,0 +1,4 @@ +add_qtc_test(tst_utils_archive + DEPENDS Utils karchive + SOURCES tst_archive.cpp +) diff --git a/tests/auto/utils/archive/archive.qbs b/tests/auto/utils/archive/archive.qbs new file mode 100644 index 00000000000..15af3f2c30b --- /dev/null +++ b/tests/auto/utils/archive/archive.qbs @@ -0,0 +1,12 @@ +Project { + QtcAutotest { + name: "Archive autotest" + + Depends { name: "Utils" } + Depends { name: "karchive" } + + files: [ + "tst_archive.cpp", + ] + } +} diff --git a/tests/auto/utils/archive/tst_archive.cpp b/tests/auto/utils/archive/tst_archive.cpp new file mode 100644 index 00000000000..e4be07a2828 --- /dev/null +++ b/tests/auto/utils/archive/tst_archive.cpp @@ -0,0 +1,106 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include + +#include +#include +#include +#include + +#include +#include + +using namespace Utils; + +static const QByteArray testData = R"(Hello, World! +Compress me please! +Thank you! + +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut +labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores +et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. + +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut +labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores +et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. + +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut +labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores +et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. + +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut +labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores +et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. + +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut +labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores +et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. +)"; + +class tst_Archive : public QObject +{ + Q_OBJECT + + void testArchive(KArchive &&archive, const FilePath &testFile) + { + QVERIFY(testFile.writeFileContents(testData)); + + QVERIFY(archive.open(QIODevice::WriteOnly)); + QVERIFY(archive.addLocalFile(testFile.toFSPathString(), "data/test.txt")); + QVERIFY(archive.close()); + QVERIFY(testFile.removeFile()); + QVERIFY(!testFile.exists()); + } + + void testUnarchive(KArchive &&archive, const FilePath &testFile) + { + QVERIFY(!testFile.exists()); + + QVERIFY(archive.open(QIODevice::ReadOnly)); + QVERIFY(archive.directory()->entries().contains("data")); + QVERIFY(archive.directory()->entry("data")); + QVERIFY(archive.directory()->entry("data")->isDirectory()); + auto dataDir = static_cast(archive.directory()->entry("data")); + QVERIFY(dataDir->entries().contains("test.txt")); + QVERIFY(dataDir->entry("test.txt")->isFile()); + QVERIFY(dataDir->file("test.txt")->copyTo(".")); + + QVERIFY(testFile.exists()); + auto contents = testFile.fileContents(); + QVERIFY(contents); + QCOMPARE(*contents, QByteArray(testData)); + QVERIFY(testFile.removeFile()); + } + + template + void unArchive(const FilePath &archivePath, bool testSize = true) + { + FilePath p = FilePath::fromString("test.txt"); + + testArchive(ARCHIVE(archivePath.toFSPathString()), p); + QVERIFY(archivePath.exists()); + qDebug() << "Archive size:" << archivePath.fileSize() << "(expected roughly less than" + << testData.size() << ")"; + if (testSize) + QVERIFY(archivePath.fileSize() < testData.size()); + testUnarchive(ARCHIVE(archivePath.toFSPathString()), p); + QVERIFY(archivePath.removeFile()); + } + +private slots: + void initTestCase() {} + + void cleanupTestCase() {} + + void test7zip() { unArchive(FilePath::fromString("test.7z")); } + void testZip() { unArchive(FilePath::fromString("test.zip")); } + void testTar() { unArchive(FilePath::fromString("test.tar"), false); } + void testXZ() { unArchive(FilePath::fromString("test.tar.xz")); } + void testGZ() { unArchive(FilePath::fromString("test.tar.gz")); } + void testBZip2() { unArchive(FilePath::fromString("test.tar.bz2")); } +}; + +QTEST_GUILESS_MAIN(tst_Archive) + +#include "tst_archive.moc" diff --git a/tests/auto/utils/utils.qbs b/tests/auto/utils/utils.qbs index 14d18d29d58..9a652c1c367 100644 --- a/tests/auto/utils/utils.qbs +++ b/tests/auto/utils/utils.qbs @@ -4,6 +4,7 @@ Project { name: "Utils autotests" references: [ "ansiescapecodehandler/ansiescapecodehandler.qbs", + "archive/archive.qbs", "async/async.qbs", "commandline/commandline.qbs", "deviceshell/deviceshell.qbs",