Add the missing unittest
Change-Id: I2384d9de7b9ef409db521087670070bd5afc85ff Reviewed-by: Thiago Macieira (Intel) <thiago.macieira@intel.com>bb10
parent
83c219dfe2
commit
03fd37cdf4
|
|
@ -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/\\\"
|
||||
}
|
||||
|
||||
|
|
@ -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"
|
||||
Loading…
Reference in New Issue