/************************************************************************** ** ** This file is part of Installer Framework ** ** Copyright (c) 2011-2012 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** ** GNU Lesser General Public License Usage ** ** This file may be used under the terms of the GNU Lesser General Public ** License version 2.1 as published by the Free Software Foundation and ** appearing in the file LICENSE.LGPL included in the packaging of this file. ** Please review the following information to ensure the GNU Lesser General ** Public License version 2.1 requirements will be met: ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** Other Usage ** ** Alternatively, this file may be used in accordance with the terms and ** conditions contained in a signed written agreement between you and Nokia. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** **************************************************************************/ #include "extractarchiveoperationtest.h" #include "extractarchiveoperation.h" #include "init.h" #include #include #include #include #include ExtractArchiveOperationTest::ExtractArchiveOperationTest() { QInstaller::init(); } void ExtractArchiveOperationTest::init(const QString &outdir) { if (QDir(outdir).exists()) { QFAIL("output directory already exists!"); QVERIFY(false); } QDir cd(QDir::current()); QVERIFY(cd.mkdir(outdir)); } static bool recursiveRemove(const QString &path, QString *errorMsg) { if (errorMsg) errorMsg->clear(); if (!QFileInfo(path).exists()) return true; bool error = false; QString msg; //first, delete all non-dir files QDirIterator it(path, QDirIterator::Subdirectories); while (it.hasNext()) { const QString n = it.next(); if (!QFileInfo(n).isDir()) { QFile file(n); if (!file.remove()) { error = true; msg = file.errorString(); } } } QStack dirs; QDirIterator it2(path, QDirIterator::Subdirectories); while (it2.hasNext()) { const QString n = it2.next(); if (!n.endsWith(QLatin1String( "/." ) ) && !n.endsWith( QLatin1String( "/.." ))) dirs.push(n); } while (!dirs.isEmpty()) { const QString n = dirs.top(); dirs.pop(); if (!QDir(n).rmdir(QDir::currentPath() + QLatin1String("/") + n)) { error = true; msg = QObject::tr("Could not remove folder %1").arg(n); qDebug() << msg; } } if (!QDir(path).rmdir(QDir::currentPath() + QLatin1String("/") + path)) { error = true; msg = QObject::tr("Could not remove folder %1: Unknown error").arg(path); } if (errorMsg) *errorMsg = msg; return !error; } void ExtractArchiveOperationTest::cleanup(const QString &dir) { QDir d(dir); QString msg; const bool removed = recursiveRemove(dir, &msg); if (!removed) qCritical() << msg; QVERIFY(removed); } void ExtractArchiveOperationTest::testExtraction() { const QString outdir = QLatin1String("test-extract-out" ); init(outdir); KDUpdater::Application app; QInstaller::ExtractArchiveOperation op; op.setArguments(QStringList() << QLatin1String("qt-bin-test.7z") << outdir); const bool ok = op.performOperation(); if (!ok) { qCritical() << "Extraction failed:" << op.errorString(); QFAIL("Extraction failed"); } cleanup(outdir); } void ExtractArchiveOperationTest::testExtractionErrors() { const QString outdir = QLatin1String("test-extract-out"); init(outdir); KDUpdater::Application app; QInstaller::ExtractArchiveOperation op; op.setArguments(QStringList() << QLatin1String("qt-bin-test.7z") << outdir); const bool ok = op.performOperation(); if (!ok) { qCritical() << "Extraction failed:" << op.errorString(); QFAIL("Extraction failed"); } cleanup(outdir); } void ExtractArchiveOperationTest::testInvalidArchive() { const QString outdir = QLatin1String("test-extract-out"); init(outdir); KDUpdater::Application app; QInstaller::ExtractArchiveOperation op; op.setArguments(QStringList() << QLatin1String("test-noarchive.7z") << outdir); const bool ok = op.performOperation(); if (ok) { qCritical() << "ExtractArchiveOperation does not report error on extracting invalid archive"; QFAIL("Extraction failed"); } QVERIFY(op.error() != QInstaller::ExtractArchiveOperation::NoError); const QString str = op.errorString(); qDebug() << str; QVERIFY(!str.isEmpty()); cleanup(outdir); } QTEST_MAIN(ExtractArchiveOperationTest)