qt5base-lts/tests/auto/qdesktopservices/tst_qdesktopservices.cpp
Qt by Nokia 38be0d1383 Initial import from the monolithic Qt.
This is the beginning of revision history for this module. If you
want to look at revision history older than this, please refer to the
Qt Git wiki for how to use Git history grafting. At the time of
writing, this wiki is located here:

http://qt.gitorious.org/qt/pages/GitIntroductionWithQt

If you have already performed the grafting and you don't see any
history beyond this commit, try running "git log" with the "--follow"
argument.

Branched from the monolithic repo, Qt master branch, at commit
896db169ea224deb96c59ce8af800d019de63f12
2011-04-27 12:05:43 +02:00

389 lines
15 KiB
C++

/****************************************************************************
**
** 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$
** No Commercial Usage
** This file contains pre-release code and may not be distributed.
** You may use this file in accordance with the terms and conditions
** contained in the Technology Preview License Agreement accompanying
** this package.
**
** GNU Lesser General Public License Usage
** Alternatively, 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.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtTest/QtTest>
#include <QStandardItemModel>
#include <qdebug.h>
#include <qdesktopservices.h>
//#define RUN_MANUAL_TESTS
//TESTED_CLASS=
//TESTED_FILES=
class tst_qdesktopservices : public QObject {
Q_OBJECT
public:
tst_qdesktopservices();
virtual ~tst_qdesktopservices();
private slots:
void init();
void cleanup();
void openUrl();
#ifdef Q_OS_SYMBIAN
// These test are manual ones, you need to check from device that
// correct system application is started with correct content
// When you want to run these test, uncomment //#define RUN_MANUAL_TESTS
void openHttpUrl_data();
void openHttpUrl();
void openMailtoUrl_data();
void openMailtoUrl();
void openFileUrl_data();
void openFileUrl();
void openMultipleFileUrls();
#endif
void handlers();
void storageLocation_data();
void storageLocation();
void storageLocationDoesNotEndWithSlash_data();
void storageLocationDoesNotEndWithSlash();
protected:
};
tst_qdesktopservices::tst_qdesktopservices()
{
QCoreApplication::setOrganizationName("Nokia");
QCoreApplication::setApplicationName("tst_qdesktopservices");
}
tst_qdesktopservices::~tst_qdesktopservices()
{
}
void tst_qdesktopservices::init()
{
}
void tst_qdesktopservices::cleanup()
{
}
void tst_qdesktopservices::openUrl()
{
// At the bare minimum check that they return false for invalid url's
QCOMPARE(QDesktopServices::openUrl(QUrl()), false);
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
// this test is only valid on windows on other systems it might mean open a new document in the application handling .file
QCOMPARE(QDesktopServices::openUrl(QUrl("file://invalid.file")), false);
#endif
}
#ifdef Q_OS_SYMBIAN
void tst_qdesktopservices::openHttpUrl_data()
{
QTest::addColumn<QUrl>("url");
QTest::addColumn<bool>("result");
QTest::newRow("BasicWithHttp") << QUrl("http://www.google.fi") << true;
QTest::newRow("BasicWithoutHttp") << QUrl("www.nokia.fi") << true;
QTest::newRow("BasicWithUserAndPw") << QUrl("http://s60prereleases:oslofjord@pepper.troll.no/s60prereleases/patches/") << true;
QTest::newRow("URL with space") << QUrl("http://www.manataka.org/Contents Page.html") << true;
}
void tst_qdesktopservices::openHttpUrl()
{
#ifndef RUN_MANUAL_TESTS
QSKIP("Test disabled -- only for manual purposes", SkipAll);
#endif
QFETCH(QUrl, url);
QFETCH(bool, result);
QCOMPARE(QDesktopServices::openUrl(url), result);
QTest::qWait(30000);
}
void tst_qdesktopservices::openMailtoUrl_data()
{
QTest::addColumn<QUrl>("url");
QTest::addColumn<bool>("result");
// http://en.wikipedia.org/wiki/E-mail_address
// RFC Valid e-mail addresses
QTest::newRow("Wiki valid email 1") << QUrl("mailto:abc@example.com") << true;
QTest::newRow("Wiki valid email 2") << QUrl("mailto:Abc@example.com") << true;
QTest::newRow("Wiki valid email 3") << QUrl("mailto:aBC@example.com") << true;
QTest::newRow("Wiki valid email 4") << QUrl("mailto:abc.123@example.com") << true;
QTest::newRow("Wiki valid email 5") << QUrl("mailto:1234567890@example.com") << true;
QTest::newRow("Wiki valid email 6") << QUrl("mailto:_______@example.com") << true;
QTest::newRow("Wiki valid email 7") << QUrl("mailto:abc+mailbox/department=shipping@example.com") << true;
// S60 email client considers the next URL invalid, even ity should be valid
QTest::newRow("Wiki valid email 8") << QUrl("mailto:!#$%&'*+-/=?^_`.{|}~@example.com") << true; // all of these characters are allowed
QTest::newRow("Wiki valid email 9") << QUrl("mailto:\"abc@def\"@example.com") << true; // anything goes inside quotation marks
QTest::newRow("Wiki valid email 10") << QUrl("mailto:\"Fred \\\"quota\\\" Bloggs\"@example.com") << true; // however, quotes need escaping
// RFC invalid e-mail addresses
// These return true even though they are invalid, but check that user is notified about invalid URL in mail application
QTest::newRow("Wiki invalid email 1") << QUrl("mailto:Abc.example.com") << true; // character @ is missing
QTest::newRow("Wiki invalid email 2") << QUrl("mailto:Abc.@example.com") << true; // character dot(.) is last in local part
QTest::newRow("Wiki invalid email 3") << QUrl("mailto:Abc..123@example.com") << true; // character dot(.) is double
QTest::newRow("Wiki invalid email 4") << QUrl("mailto:A@b@c@example.com") << true; // only one @ is allowed outside quotations marks
QTest::newRow("Wiki invalid email 5") << QUrl("mailto:()[]\\;:,<>@example.com") << true; // none of the characters before the @ is allowed outside quotation marks
QTest::newRow("Basic") << QUrl("mailto:test@nokia.com") << true;
QTest::newRow("BasicSeveralAddr") << QUrl("mailto:test@nokia.com,test2@nokia.com,test3@nokia.com") << true;
QTest::newRow("BasicAndSubject") << QUrl("mailto:test@nokia.com?subject=hello nokia") << true;
QTest::newRow("BasicAndTo") << QUrl("mailto:test@nokia.com?to=test2@nokia.com") << true;
QTest::newRow("BasicAndCc") << QUrl("mailto:test@nokia.com?cc=mycc@address.com") << true;
QTest::newRow("BasicAndBcc") << QUrl("mailto:test@nokia.com?bcc=mybcc@address.com") << true;
QTest::newRow("BasicAndBody") << QUrl("mailto:test@nokia.com?body=Test email message body") << true;
// RFC examples, these are actually invalid because there is not host defined
// Check that user is notified about invalid URL in mail application
QTest::newRow("RFC2368 Example 1") << QUrl::fromEncoded("mailto:addr1%2C%20addr2") << true;
QTest::newRow("RFC2368 Example 2") << QUrl::fromEncoded("mailto:?to=addr1%2C%20addr2") << true;
QTest::newRow("RFC2368 Example 3") << QUrl("mailto:addr1?to=addr2") << true;
QTest::newRow("RFC2368 Example 4") << QUrl("mailto:joe@example.com?cc=bob@example.com&body=hello") << true;
QTest::newRow("RFC2368 Example 5") << QUrl("mailto:?to=joe@example.com&cc=bob@example.com&body=hello") << true;
QTest::newRow("RFC2368 Example 6") << QUrl("mailto:foobar@example.com?In-Reply-To=%3c3469A91.D10AF4C@example.com") << true; // OpaqueData
QTest::newRow("RFC2368 Example 7") << QUrl::fromEncoded("mailto:infobot@example.com?body=send%20current-issue%0D%0Asend%20index") << true;
QTest::newRow("RFC2368 Example 8") << QUrl::fromEncoded("mailto:infobot@example.com?body=send%20current-issue") << true;
QTest::newRow("RFC2368 Example 9") << QUrl("mailto:infobot@example.com?subject=current-issue") << true;
QTest::newRow("RFC2368 Example 10") << QUrl("mailto:chris@example.com") << true;
//QTest::newRow("RFC2368 Example 11 - illegal chars") << QUrl("mailto:joe@example.com?cc=bob@example.com?body=hello") << false;
QTest::newRow("RFC2368 Example 12") << QUrl::fromEncoded("mailto:gorby%25kremvax@example.com") << true; // encoded reserved chars '%'
QTest::newRow("RFC2368 Example 13") << QUrl::fromEncoded("mailto:unlikely%3Faddress@example.com?blat=foop") << true; // encoded reserved chars `?'
}
void tst_qdesktopservices::openMailtoUrl()
{
#ifndef RUN_MANUAL_TESTS
QSKIP("Test disabled -- only for manual purposes", SkipAll);
#endif
QFETCH(QUrl, url);
QFETCH(bool, result);
QCOMPARE(QDesktopServices::openUrl(url), result);
QTest::qWait(5000);
}
void tst_qdesktopservices::openFileUrl_data()
{
QTest::addColumn<QUrl>("url");
QTest::addColumn<bool>("result");
// Text files
QTest::newRow("DOS text file") << QUrl("file:///c:/data/others/dosfile.txt") << true;
QTest::newRow("No EOF text file") << QUrl("file:///c:/data/others/noendofline.txt") << true;
QTest::newRow("text file") << QUrl("file:///c:/data/others/testfile.txt") << true;
QTest::newRow("text file with space") << QUrl("file:///c:/data/others/test file.txt") << true;
// Images
QTest::newRow("BMP image") << QUrl("file:///c:/data/images/image.bmp") << true;
QTest::newRow("GIF image") << QUrl("file:///c:/data/images/image.gif") << true;
QTest::newRow("JPG image") << QUrl("file:///c:/data/images/image.jpg") << true;
QTest::newRow("PNG image") << QUrl("file:///c:/data/images/image.png") << true;
// Audio
QTest::newRow("MP4 audio") << QUrl("file:///c:/data/sounds/aac-only.mp4") << true;
QTest::newRow("3GP audio") << QUrl("file:///c:/data/sounds/audio_3gpp.3gp") << true;
// Video
QTest::newRow("MP4 video") << QUrl("file:///c:/data/videos/vid-mpeg4-22k.mp4") << true;
// Installs
QTest::newRow("SISX") << QUrl("file:///c:/data/installs/ErrRd.sisx") << true;
// Errors
QTest::newRow("File does not exist") << QUrl("file:///c:/thisfileneverexists.txt") << false;
}
void tst_qdesktopservices::openFileUrl()
{
#ifndef RUN_MANUAL_TESTS
QSKIP("Test disabled -- only for manual purposes", SkipAll);
#endif
QFETCH(QUrl, url);
QFETCH(bool, result);
QCOMPARE(QDesktopServices::openUrl(url), result);
QTest::qWait(5000);
}
void tst_qdesktopservices::openMultipleFileUrls()
{
#ifndef RUN_MANUAL_TESTS
QSKIP("Test disabled -- only for manual purposes", SkipAll);
#endif
QCOMPARE(QDesktopServices::openUrl(QUrl("file:///c:/data/images/image.bmp")), true);
QCOMPARE(QDesktopServices::openUrl(QUrl("file:///c:/data/images/image.png")), true);
QCOMPARE(QDesktopServices::openUrl(QUrl("file:///c:/data/others/noendofline.txt")), true);
QCOMPARE(QDesktopServices::openUrl(QUrl("file:///c:/data/installs/ErrRd.sisx")), true);
}
#endif
class MyUrlHandler : public QObject
{
Q_OBJECT
public:
QUrl lastHandledUrl;
public slots:
inline void handle(const QUrl &url) {
lastHandledUrl = url;
}
};
void tst_qdesktopservices::handlers()
{
MyUrlHandler fooHandler;
MyUrlHandler barHandler;
QDesktopServices::setUrlHandler(QString("foo"), &fooHandler, "handle");
QDesktopServices::setUrlHandler(QString("bar"), &barHandler, "handle");
QUrl fooUrl("foo://blub/meh");
QUrl barUrl("bar://hmm/hmmmm");
QVERIFY(QDesktopServices::openUrl(fooUrl));
QVERIFY(QDesktopServices::openUrl(barUrl));
QCOMPARE(fooHandler.lastHandledUrl.toString(), fooUrl.toString());
QCOMPARE(barHandler.lastHandledUrl.toString(), barUrl.toString());
}
Q_DECLARE_METATYPE(QDesktopServices::StandardLocation)
void tst_qdesktopservices::storageLocation_data()
{
QTest::addColumn<QDesktopServices::StandardLocation>("location");
QTest::newRow("DesktopLocation") << QDesktopServices::DesktopLocation;
QTest::newRow("DocumentsLocation") << QDesktopServices::DocumentsLocation;
QTest::newRow("FontsLocation") << QDesktopServices::FontsLocation;
QTest::newRow("ApplicationsLocation") << QDesktopServices::ApplicationsLocation;
QTest::newRow("MusicLocation") << QDesktopServices::MusicLocation;
QTest::newRow("MoviesLocation") << QDesktopServices::MoviesLocation;
QTest::newRow("PicturesLocation") << QDesktopServices::PicturesLocation;
QTest::newRow("TempLocation") << QDesktopServices::TempLocation;
QTest::newRow("HomeLocation") << QDesktopServices::HomeLocation;
QTest::newRow("DataLocation") << QDesktopServices::DataLocation;
}
void tst_qdesktopservices::storageLocation()
{
QFETCH(QDesktopServices::StandardLocation, location);
#ifdef Q_OS_SYMBIAN
QString storageLocation = QDesktopServices::storageLocation(location);
QString displayName = QDesktopServices::displayName(location);
//qDebug( "displayName: %s", displayName );
storageLocation = storageLocation.toLower();
displayName = displayName.toLower();
QString drive = QDir::currentPath().left(2).toLower();
if( drive == "z:" )
drive = "c:";
switch(location) {
case QDesktopServices::DesktopLocation:
QCOMPARE( storageLocation, drive + QString("/data") );
break;
case QDesktopServices::DocumentsLocation:
QCOMPARE( storageLocation, drive + QString("/data") );
break;
case QDesktopServices::FontsLocation:
// Currently point always to ROM
QCOMPARE( storageLocation, QString("z:/resource/fonts") );
break;
case QDesktopServices::ApplicationsLocation:
#ifdef Q_CC_NOKIAX86
QCOMPARE( storageLocation, QString("z:/sys/bin") );
#else
QCOMPARE( storageLocation, drive + QString("/sys/bin") );
#endif
break;
case QDesktopServices::MusicLocation:
QCOMPARE( storageLocation, drive + QString("/data/sounds") );
break;
case QDesktopServices::MoviesLocation:
QCOMPARE( storageLocation, drive + QString("/data/videos") );
break;
case QDesktopServices::PicturesLocation:
QCOMPARE( storageLocation, drive + QString("/data/images") );
break;
case QDesktopServices::TempLocation:
QCOMPARE( storageLocation, QDir::tempPath().toLower());
break;
case QDesktopServices::HomeLocation:
QCOMPARE( storageLocation, QDir::homePath().toLower());
break;
case QDesktopServices::DataLocation:
// Just check the folder not the drive
QCOMPARE( storageLocation.mid(2), QDir::currentPath().mid(2).toLower());
break;
default:
QCOMPARE( storageLocation, QString() );
break;
}
#else
QDesktopServices::storageLocation(location);
QDesktopServices::displayName(location);
#endif
}
void tst_qdesktopservices::storageLocationDoesNotEndWithSlash_data()
{
storageLocation_data();
}
void tst_qdesktopservices::storageLocationDoesNotEndWithSlash()
{
// Currently all desktop locations return their storage location
// with "Unix-style" paths (i.e. they use a slash, not backslash).
QFETCH(QDesktopServices::StandardLocation, location);
QString loc = QDesktopServices::storageLocation(location);
if (loc.size() > 1) // workaround for unlikely case of locations that return '/'
QCOMPARE(loc.endsWith(QLatin1Char('/')), false);
}
QTEST_MAIN(tst_qdesktopservices)
#include "tst_qdesktopservices.moc"