Add the missing unittest

Change-Id: I2384d9de7b9ef409db521087670070bd5afc85ff
Reviewed-by: Thiago Macieira (Intel) <thiago.macieira@intel.com>
bb10
David Faure 2011-10-22 11:35:37 +02:00 committed by Qt by Nokia
parent 83c219dfe2
commit 03fd37cdf4
2 changed files with 294 additions and 0 deletions

View File

@ -0,0 +1,12 @@
TARGET = tst_qstandardpaths
CONFIG += testcase
SOURCES += tst_qstandardpaths.cpp
QT = core testlib
CONFIG += parallel_test
wince* {
DEFINES += SRCDIR=\\\"\\\"
} else {
DEFINES += SRCDIR=\\\"$$PWD/\\\"
}

View File

@ -0,0 +1,282 @@
/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** 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.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** 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.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtTest/QtTest>
#include <qstandardpaths.h>
#include <qdebug.h>
#include <qstandardpaths.h>
#ifdef Q_OS_UNIX
#include <unistd.h>
#include <sys/types.h>
#endif
//TESTED_CLASS=QStandardPaths
//TESTED_FILES=qstandardpaths.cpp
class tst_qstandardpaths : public QObject {
Q_OBJECT
public:
tst_qstandardpaths() {
}
virtual ~tst_qstandardpaths() {
}
private slots:
void testDefaultLocations();
void testCustomLocations();
void testLocateAll();
void testDataLocation();
void testFindExecutable();
void testRuntimeDirectory();
void testCustomRuntimeDirectory();
void testAllWritableLocations_data();
void testAllWritableLocations();
private:
void setCustomLocations() {
m_thisDir = QFile::decodeName(SRCDIR);
//qDebug() << m_thisDir;
m_thisDir.chop(1); // remove trailing slash!
qputenv("XDG_CONFIG_HOME", QFile::encodeName(m_thisDir));
QDir parent(m_thisDir);
parent.cdUp();
m_globalDir = parent.path(); // gives us a trailing slash
qputenv("XDG_CONFIG_DIRS", QFile::encodeName(m_globalDir));
}
QString m_thisDir;
QString m_globalDir;
};
void tst_qstandardpaths::testDefaultLocations()
{
#ifndef Q_OS_WIN
qputenv("XDG_CONFIG_HOME", QByteArray());
qputenv("XDG_CONFIG_DIRS", QByteArray());
const QString expectedConfHome = QDir::homePath() + QString::fromLatin1("/.config");
QCOMPARE(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation), expectedConfHome);
const QStringList confDirs = QStandardPaths::standardLocations(QStandardPaths::ConfigLocation);
QCOMPARE(confDirs.count(), 2);
QVERIFY(confDirs.contains(expectedConfHome));
qputenv("XDG_DATA_HOME", QByteArray());
qputenv("XDG_DATA_DIRS", QByteArray());
const QStringList genericDataDirs = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
QCOMPARE(genericDataDirs.count(), 3);
const QString expectedDataHome = QDir::homePath() + QString::fromLatin1("/.local/share");
QCOMPARE(genericDataDirs.at(0), expectedDataHome);
QCOMPARE(genericDataDirs.at(1), QString::fromLatin1("/usr/local/share"));
QCOMPARE(genericDataDirs.at(2), QString::fromLatin1("/usr/share"));
#endif
}
void tst_qstandardpaths::testCustomLocations()
{
#ifndef Q_OS_WIN
setCustomLocations();
// test writableLocation()
QCOMPARE(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation), m_thisDir);
// test locate()
const QString thisFileName = QString::fromLatin1("tst_qstandardpaths.cpp");
QVERIFY(QFile::exists(m_thisDir + '/' + thisFileName));
const QString thisFile = QStandardPaths::locate(QStandardPaths::ConfigLocation, thisFileName);
QVERIFY(!thisFile.isEmpty());
QVERIFY(thisFile.endsWith(thisFileName));
const QString dir = QStandardPaths::locate(QStandardPaths::ConfigLocation, QString::fromLatin1("../qstandardpaths"), QStandardPaths::LocateDirectory);
QVERIFY(!dir.isEmpty());
const QString thisDirAsFile = QStandardPaths::locate(QStandardPaths::ConfigLocation, QString::fromLatin1("../qstandardpaths"));
QVERIFY(thisDirAsFile.isEmpty()); // not a file
const QStringList dirs = QStandardPaths::standardLocations(QStandardPaths::ConfigLocation);
QCOMPARE(dirs, QStringList() << m_thisDir << m_globalDir);
#endif
}
// We really need QTemporaryDir for this test...
void tst_qstandardpaths::testLocateAll()
{
#ifndef Q_OS_WIN
const QStringList appsDirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "applications", QStandardPaths::LocateDirectory);
//qDebug() << appsDirs;
foreach (const QString &dir, appsDirs)
QVERIFY2(dir.endsWith(QLatin1String("/share/applications")), qPrintable(dir));
setCustomLocations();
const QStringList allFiles = QStandardPaths::locateAll(QStandardPaths::ConfigLocation, "qstandardpaths.pro");
QCOMPARE(allFiles.first(), QString(m_thisDir + QString::fromLatin1("/qstandardpaths.pro")));
#endif
}
void tst_qstandardpaths::testDataLocation()
{
// On all platforms, DataLocation should be GenericDataLocation / organization name / app name
// This allows one app to access the data of another app.
{
const QString base = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
const QString app = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
QCOMPARE(base, app);
}
QCoreApplication::instance()->setOrganizationName("Qt");
QCoreApplication::instance()->setApplicationName("QtTest");
{
const QString base = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
const QString app = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
QCOMPARE(app, base + "/Qt/QtTest");
}
}
void tst_qstandardpaths::testFindExecutable()
{
// Search for 'sh' on unix and 'cmd.exe' on Windows
#ifdef Q_OS_WIN
const QString exeName = "cmd.exe";
#else
const QString exeName = "sh";
#endif
const QString result = QStandardPaths::findExecutable(exeName);
QVERIFY(!result.isEmpty());
#ifdef Q_OS_WIN
QVERIFY(result.endsWith("/cmd.exe"));
#else
QVERIFY(result.endsWith("/bin/sh"));
#endif
// full path as argument
QCOMPARE(QStandardPaths::findExecutable(result), result);
// exe no found
QVERIFY(QStandardPaths::findExecutable("idontexist").isEmpty());
QVERIFY(QStandardPaths::findExecutable("").isEmpty());
// link to directory
const QString target = QDir::tempPath() + QDir::separator() + QLatin1String("link.lnk");
QFile::remove(target);
QFile appFile(QCoreApplication::applicationDirPath());
QVERIFY(appFile.link(target));
QVERIFY(QStandardPaths::findExecutable(target).isEmpty());
QFile::remove(target);
// findExecutable with a relative path
#ifdef Q_OS_UNIX
const QString pwd = QDir::currentPath();
QDir::setCurrent("/bin");
QStringList possibleResults;
possibleResults << QString::fromLatin1("/bin/sh") << QString::fromLatin1("/usr/bin/sh");
const QString sh = QStandardPaths::findExecutable("./sh");
QVERIFY2(possibleResults.contains(sh), qPrintable(sh));
QDir::setCurrent(pwd);
#endif
}
void tst_qstandardpaths::testRuntimeDirectory()
{
const QString runtimeDir = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation);
QVERIFY(!runtimeDir.isEmpty());
// Check that it can automatically fix permissions
#ifdef Q_OS_UNIX
QFile file(runtimeDir);
const QFile::Permissions wantedPerms = QFile::ReadUser | QFile::WriteUser | QFile::ExeUser;
const QFile::Permissions additionalPerms = QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner;
QCOMPARE(file.permissions(), wantedPerms | additionalPerms);
QVERIFY(file.setPermissions(wantedPerms | QFile::ExeGroup));
const QString runtimeDirAgain = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation);
QCOMPARE(runtimeDirAgain, runtimeDir);
QCOMPARE(QFile(runtimeDirAgain).permissions(), wantedPerms | additionalPerms);
#endif
}
void tst_qstandardpaths::testCustomRuntimeDirectory()
{
#ifdef Q_OS_UNIX
qputenv("XDG_RUNTIME_DIR", QFile::encodeName("/tmp"));
// It's very unlikely that /tmp is 0600 or that we can chmod it
// The call below outputs
// "QStandardPaths: wrong ownership on runtime directory /tmp, 0 instead of $UID"
// but we can't reliably expect that it's owned by uid 0, I think.
const uid_t uid = geteuid();
QTest::ignoreMessage(QtWarningMsg,
qPrintable(QString::fromLatin1("QStandardPaths: wrong ownership on runtime directory /tmp, 0 instead of %1").arg(uid)));
const QString runtimeDir = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation);
QVERIFY2(runtimeDir.isEmpty(), qPrintable(runtimeDir));
#endif
}
Q_DECLARE_METATYPE(QStandardPaths::StandardLocation)
void tst_qstandardpaths::testAllWritableLocations_data()
{
QTest::addColumn<QStandardPaths::StandardLocation>("location");
QTest::newRow("DesktopLocation") << QStandardPaths::DesktopLocation;
QTest::newRow("DocumentsLocation") << QStandardPaths::DocumentsLocation;
QTest::newRow("FontsLocation") << QStandardPaths::FontsLocation;
QTest::newRow("ApplicationsLocation") << QStandardPaths::ApplicationsLocation;
QTest::newRow("MusicLocation") << QStandardPaths::MusicLocation;
QTest::newRow("MoviesLocation") << QStandardPaths::MoviesLocation;
QTest::newRow("PicturesLocation") << QStandardPaths::PicturesLocation;
QTest::newRow("TempLocation") << QStandardPaths::TempLocation;
QTest::newRow("HomeLocation") << QStandardPaths::HomeLocation;
QTest::newRow("DataLocation") << QStandardPaths::DataLocation;
}
void tst_qstandardpaths::testAllWritableLocations()
{
QFETCH(QStandardPaths::StandardLocation, location);
QStandardPaths::writableLocation(location);
QStandardPaths::displayName(location);
// Currently all desktop locations return their writable location
// with "Unix-style" paths (i.e. they use a slash, not backslash).
QString loc = QStandardPaths::writableLocation(location);
if (loc.size() > 1) // workaround for unlikely case of locations that return '/'
QCOMPARE(loc.endsWith(QLatin1Char('/')), false);
}
QTEST_MAIN(tst_qstandardpaths)
#include "tst_qstandardpaths.moc"