Merge lp:~michael-sheldon/ubuntu-download-manager/qml-api-improvements into lp:ubuntu-download-manager

Proposed by Michael Sheldon
Status: Merged
Approved by: Jonas G. Drange
Approved revision: 365
Merged at revision: 364
Proposed branch: lp:~michael-sheldon/ubuntu-download-manager/qml-api-improvements
Merge into: lp:ubuntu-download-manager
Diff against target: 739 lines (+404/-33)
12 files modified
src/common/public/ubuntu/transfers/metadata.cpp (+35/-4)
src/common/public/ubuntu/transfers/metadata.h (+7/-2)
src/downloads/qml/metadata.cpp (+39/-0)
src/downloads/qml/metadata.h (+10/-0)
src/downloads/qml/single_download.cpp (+49/-3)
src/downloads/qml/single_download.h (+10/-0)
tests/downloads/daemon/test_metadata.cpp (+59/-18)
tests/downloads/daemon/test_metadata.h (+10/-6)
tests/downloads/qml/test_metadata.cpp (+51/-0)
tests/downloads/qml/test_metadata.h (+6/-0)
tests/downloads/qml/test_single_download.cpp (+122/-0)
tests/downloads/qml/test_single_download.h (+6/-0)
To merge this branch: bzr merge lp:~michael-sheldon/ubuntu-download-manager/qml-api-improvements
Reviewer Review Type Date Requested Status
system-apps-ci-bot continuous-integration Needs Fixing
Jonas G. Drange (community) Needs Information
PS Jenkins bot continuous-integration Approve
Review via email: mp+291894@code.launchpad.net

Commit message

Expose post-processing command to unconfined clients via QML, expose hashing support via QML and allow clients to set custom metadata.

Description of the change

Expose post-processing command to unconfined clients via QML, expose hashing support via QML and allow clients to set custom metadata.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
363. By Michael Sheldon

Merge from trunk

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
364. By Michael Sheldon

Add tests for new QML API and custom metadata

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Jonas G. Drange (jonas-drange) wrote :

I've encountered a couple of issues in using this new qml feature that might be caused by ignorance on my part, please bear with me.

First, when I create a SingleDownload and add a Metadata object to it, no matter what values I set on the Metadata object, it is ignored. E.g., I do:

    Component { id: sdl; SingleDownload {} }
    Component { id: mdt; Metadata {} }

    var singleDownloadObj = sdl.createObject(UpdateManager, {
        "autoStart": false,
        "hash": hash,
        "algorithm": algorithm,
        "headers": headers // A QVariantMap of headers
    });

    var metadataObj = mdt.createObject(UpdateManager, metadata); // QVariantMap of metadata
    singleDownloadObj.metadata = metadataObj;
    singleDownloadObj.download(url);

What I get in the downloads.sql database is:

    sqlite> select * from SingleDownload;
    a634b6f8888d48309f51f2d9d3b960d4|unconfined|http://localhost:9009/download|/com/canonical/applications/download/a634b6f8888d48309f51f2d9d3b960d4|/home/jonas/.local/share/ubuntu-download-manager/Downloads/download (11)|1232223sdfdsffs|sha512|idle|0|0|{
        "app-id": "/usr/bin/system-settings"
    }
    |{
    }

This seems to happen because in qml/single_download.cpp:232 we have:
    SingleDownload::download(QString url)
    …
    Metadata metadata;
    QMap<QString, QString> headers;
    DownloadStruct dstruct(url, m_hash, m_algorithm, metadata.map(), headers);
    m_manager->createDownload(dstruct);

I.e. m_metadata and m_headers are ignored. Am I not supposed to call SingleDownload.download?

Secondly, even though the sqlite output from above have “app-id” set to “/usr/bin/system-settings”, the sqlite “appId” field is set to “unconfined”. For the QML plugin to returned unconfined downloads (not using u-a-l), I have to specifically set APP_ID=unconfined. Is this expected?

review: Needs Information
Revision history for this message
system-apps-ci-bot (system-apps-ci-bot) wrote :
review: Needs Fixing (continuous-integration)
365. By Michael Sheldon

Invalidate internal download object when an error occurs as the remote end will have removed the download, and always keep a copy of metadata available for reading after an error or when a download has finished

Revision history for this message
system-apps-ci-bot (system-apps-ci-bot) wrote :

FAILED: Continuous integration, rev:365
https://jenkins.canonical.com/system-apps/job/lp-ubuntu-download-manager-ci/5/
Executed test runs:
    FAILURE: https://jenkins.canonical.com/system-apps/job/build/945/console
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-0-fetch/945
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=vivid+overlay/850
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=xenial+overlay/850
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-1-sourcepkg/release=yakkety/850
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/847/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/847/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/847/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/847/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/847/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/847/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/847/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/847/console
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/847/console

Click here to trigger a rebuild:
https://jenkins.canonical.com/system-apps/job/lp-ubuntu-download-manager-ci/5/rebuild

review: Needs Fixing (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/common/public/ubuntu/transfers/metadata.cpp'
--- src/common/public/ubuntu/transfers/metadata.cpp 2015-12-10 20:39:48 +0000
+++ src/common/public/ubuntu/transfers/metadata.cpp 2016-07-12 13:11:29 +0000
@@ -18,7 +18,6 @@
1818
19#include <QProcessEnvironment>19#include <QProcessEnvironment>
20#include <QCoreApplication>20#include <QCoreApplication>
21#include <QDebug>
2221
23#include "metadata.h"22#include "metadata.h"
2423
@@ -35,6 +34,7 @@
35const QString Metadata::CLICK_PACKAGE_KEY = "click-package";34const QString Metadata::CLICK_PACKAGE_KEY = "click-package";
36const QString Metadata::DEFLATE_KEY = "deflate";35const QString Metadata::DEFLATE_KEY = "deflate";
37const QString Metadata::EXTRACT_KEY = "extract";36const QString Metadata::EXTRACT_KEY = "extract";
37const QString Metadata::CUSTOM_PREFIX = "custom_";
38const QString Metadata::APP_ID = "app-id";38const QString Metadata::APP_ID = "app-id";
3939
40namespace {40namespace {
@@ -63,14 +63,14 @@
63 }63 }
64}64}
6565
66QString66QStringList
67Metadata::command() const {67Metadata::command() const {
68 return (contains(Metadata::COMMAND_KEY))?68 return (contains(Metadata::COMMAND_KEY))?
69 value(Metadata::COMMAND_KEY).toString():"";69 value(Metadata::COMMAND_KEY).toStringList():QStringList();
70}70}
7171
72void72void
73Metadata::setCommand(const QString& command) {73Metadata::setCommand(const QStringList& command) {
74 insert(Metadata::COMMAND_KEY, command);74 insert(Metadata::COMMAND_KEY, command);
75}75}
7676
@@ -207,6 +207,37 @@
207 return contains(Metadata::APP_ID);207 return contains(Metadata::APP_ID);
208}208}
209209
210QVariantMap
211Metadata::custom() const {
212 QVariantMap custom;
213 foreach(QString key, keys()) {
214 if (key.startsWith(CUSTOM_PREFIX)) {
215 QString customKey = key;
216 customKey.replace(CUSTOM_PREFIX, "");
217 custom.insert(customKey, values(key)[0]);
218 }
219 }
220 return custom;
221}
222
223void
224Metadata::setCustom(QVariantMap custom) {
225 // We can't send nested QVariantMaps over dbus, so flatten to one map
226 foreach(QString key, custom.keys()) {
227 insert(Metadata::CUSTOM_PREFIX + key, custom[key]);
228 }
229}
230
231bool
232Metadata::hasCustom() const {
233 foreach(QString key, keys()) {
234 if (key.startsWith(CUSTOM_PREFIX)) {
235 return true;
236 }
237 }
238 return false;
239}
240
210} // DownloadManager241} // DownloadManager
211242
212} // Ubuntu243} // Ubuntu
213244
=== modified file 'src/common/public/ubuntu/transfers/metadata.h'
--- src/common/public/ubuntu/transfers/metadata.h 2015-12-10 20:47:34 +0000
+++ src/common/public/ubuntu/transfers/metadata.h 2016-07-12 13:11:29 +0000
@@ -41,11 +41,12 @@
41 static const QString CLICK_PACKAGE_KEY;41 static const QString CLICK_PACKAGE_KEY;
42 static const QString DEFLATE_KEY;42 static const QString DEFLATE_KEY;
43 static const QString EXTRACT_KEY;43 static const QString EXTRACT_KEY;
44 static const QString CUSTOM_PREFIX;
44 static const QString APP_ID;45 static const QString APP_ID;
4546
46 // accessors to simplify the use of the metadata47 // accessors to simplify the use of the metadata
47 QString command() const;48 QStringList command() const;
48 void setCommand(const QString& command);49 void setCommand(const QStringList& command);
49 bool hasCommand() const;50 bool hasCommand() const;
5051
51 QString localPath() const;52 QString localPath() const;
@@ -79,6 +80,10 @@
79 QString destinationApp() const;80 QString destinationApp() const;
80 void setOwner(const QString &id);81 void setOwner(const QString &id);
81 bool hasOwner() const;82 bool hasOwner() const;
83
84 QVariantMap custom() const;
85 void setCustom(const QVariantMap custom);
86 bool hasCustom() const;
82};87};
8388
84} // DownloadManager89} // DownloadManager
8590
=== modified file 'src/downloads/qml/metadata.cpp'
--- src/downloads/qml/metadata.cpp 2016-03-16 16:03:39 +0000
+++ src/downloads/qml/metadata.cpp 2016-07-12 13:11:29 +0000
@@ -153,6 +153,31 @@
153 }153 }
154}154}
155155
156QStringList
157Metadata::command() const {
158 return _metadata.command();
159}
160
161void
162Metadata::setCommand(QStringList command) {
163 if (command != _metadata.command()) {
164 _metadata.setCommand(command);
165 emit commandChanged();
166 }
167}
168
169QVariantMap
170Metadata::custom() const {
171 return _metadata.custom();
172}
173
174void Metadata::setCustom(QVariantMap custom) {
175 if (custom != _metadata.custom()) {
176 _metadata.setCustom(custom);
177 emit customChanged();
178 }
179}
180
156QVariantMap181QVariantMap
157Metadata::map() const {182Metadata::map() const {
158 return QVariantMap(_metadata);183 return QVariantMap(_metadata);
@@ -182,6 +207,20 @@
182 to False.207 to False.
183*/208*/
184209
210/*!
211 \qmlproperty list Metadata::command
212 \internal
213
214 A command to run on the file immediately following completion of the
215 download.
216*/
217
218/*!
219 \qmlproperty array Metadata::custom
220
221 Metadata specific to your application that you wish to associate with
222 this download. This metadata will persist across application restarts.
223*/
185}224}
186225
187}226}
188227
=== modified file 'src/downloads/qml/metadata.h'
--- src/downloads/qml/metadata.h 2014-10-09 09:52:34 +0000
+++ src/downloads/qml/metadata.h 2016-07-12 13:11:29 +0000
@@ -30,6 +30,8 @@
30 Q_PROPERTY(bool showInIndicator READ showInIndicator WRITE setShowInIndicator NOTIFY showIndicatorChanged)30 Q_PROPERTY(bool showInIndicator READ showInIndicator WRITE setShowInIndicator NOTIFY showIndicatorChanged)
31 Q_PROPERTY(bool deflate READ deflate WRITE setDeflate NOTIFY deflateChanged)31 Q_PROPERTY(bool deflate READ deflate WRITE setDeflate NOTIFY deflateChanged)
32 Q_PROPERTY(bool extract READ extract WRITE setExtract NOTIFY extractChanged)32 Q_PROPERTY(bool extract READ extract WRITE setExtract NOTIFY extractChanged)
33 Q_PROPERTY(QStringList command READ command WRITE setCommand NOTIFY commandChanged)
34 Q_PROPERTY(QVariantMap custom READ custom WRITE setCustom NOTIFY customChanged)
3335
34 public:36 public:
35 explicit Metadata(QObject* parent=0);37 explicit Metadata(QObject* parent=0);
@@ -47,6 +49,12 @@
47 bool extract() const;49 bool extract() const;
48 void setExtract(bool extract);50 void setExtract(bool extract);
4951
52 QStringList command() const;
53 void setCommand(QStringList command);
54
55 QVariantMap custom() const;
56 void setCustom(QVariantMap custom);
57
50 QVariantMap map() const;58 QVariantMap map() const;
5159
52 signals:60 signals:
@@ -54,6 +62,8 @@
54 void showIndicatorChanged();62 void showIndicatorChanged();
55 void deflateChanged();63 void deflateChanged();
56 void extractChanged();64 void extractChanged();
65 void commandChanged();
66 void customChanged();
5767
58 private:68 private:
59 Transfers::Metadata _metadata;69 Transfers::Metadata _metadata;
6070
=== modified file 'src/downloads/qml/single_download.cpp'
--- src/downloads/qml/single_download.cpp 2016-03-17 16:32:25 +0000
+++ src/downloads/qml/single_download.cpp 2016-07-12 13:11:29 +0000
@@ -231,7 +231,7 @@
231 }231 }
232 Metadata metadata;232 Metadata metadata;
233 QMap<QString, QString> headers;233 QMap<QString, QString> headers;
234 DownloadStruct dstruct(url, metadata.map(), headers);234 DownloadStruct dstruct(url, m_hash, m_algorithm, metadata.map(), headers);
235 m_manager->createDownload(dstruct);235 m_manager->createDownload(dstruct);
236 } else if (url.isEmpty()) {236 } else if (url.isEmpty()) {
237 m_error.setMessage("No URL specified");237 m_error.setMessage("No URL specified");
@@ -306,6 +306,7 @@
306SingleDownload::registerError(Error* error)306SingleDownload::registerError(Error* error)
307{307{
308 m_error.setMessage(error->errorString());308 m_error.setMessage(error->errorString());
309 m_download = nullptr;
309 emit errorFound(m_error);310 emit errorFound(m_error);
310 emit errorChanged();311 emit errorChanged();
311}312}
@@ -459,6 +460,16 @@
459 }460 }
460}461}
461462
463QString
464SingleDownload::hash() const {
465 return m_hash;
466}
467
468QString
469SingleDownload::algorithm() const {
470 return m_algorithm;
471}
472
462void473void
463SingleDownload::setHeaders(QVariantMap headers) {474SingleDownload::setHeaders(QVariantMap headers) {
464 if (m_download == nullptr) {475 if (m_download == nullptr) {
@@ -504,9 +515,9 @@
504 return;515 return;
505 }516 }
506517
518 m_metadata = metadata;
507 if (m_download == nullptr) {519 if (m_download == nullptr) {
508 m_dirty = true;520 m_dirty = true;
509 m_metadata = metadata;
510 } else {521 } else {
511 m_download->setMetadata(metadata->map());522 m_download->setMetadata(metadata->map());
512 if (m_download->isError()) {523 if (m_download->isError()) {
@@ -522,6 +533,16 @@
522 }533 }
523}534}
524535
536void
537SingleDownload::setHash(QString hash) {
538 m_hash = hash;
539}
540
541void
542SingleDownload::setAlgorithm(QString algorithm) {
543 m_algorithm = algorithm;
544}
545
525/*!546/*!
526 \qmlproperty bool SingleDownload::autoStart547 \qmlproperty bool SingleDownload::autoStart
527548
@@ -598,6 +619,32 @@
598*/619*/
599620
600/*!621/*!
622 \qmlproperty string SingleDownload::hash
623 \since Ubuntu.DownloadManager 1.3
624
625 This property specifies a hash to check against the downloaded file.
626 If used, this should be set prior to calling the download() method.
627*/
628
629/*!
630 \qmlproperty string SingleDownload::algorithm
631 \since Ubuntu.DownloadManager 1.3
632
633 This property indicates the algorithm to use when verifying a hash.
634 The algorithm can be of one of the following string values:
635
636 - "md5"
637 - "sha1"
638 - "sha224"
639 - "sha256"
640 - "sha384"
641 - "sha512"
642
643 If no value is specified md5 will be used.
644 If used, this should be set prior to calling the download() method.
645*/
646
647/*!
601 \qmlsignal SingleDownload::finished(QString path)648 \qmlsignal SingleDownload::finished(QString path)
602649
603 This signal is emitted when a download has finished. The downloaded file 650 This signal is emitted when a download has finished. The downloaded file
@@ -605,6 +652,5 @@
605 \c onFinished652 \c onFinished
606*/653*/
607654
608
609}655}
610}656}
611657
=== modified file 'src/downloads/qml/single_download.h'
--- src/downloads/qml/single_download.h 2015-10-23 16:09:48 +0000
+++ src/downloads/qml/single_download.h 2016-07-12 13:11:29 +0000
@@ -44,6 +44,8 @@
44 Q_PROPERTY(QString downloadId READ downloadId NOTIFY downloadIdChanged)44 Q_PROPERTY(QString downloadId READ downloadId NOTIFY downloadIdChanged)
45 Q_PROPERTY(QVariantMap headers READ headers WRITE setHeaders NOTIFY headersChanged)45 Q_PROPERTY(QVariantMap headers READ headers WRITE setHeaders NOTIFY headersChanged)
46 Q_PROPERTY(Ubuntu::DownloadManager::Metadata* metadata READ metadata WRITE setMetadata NOTIFY metadataChanged)46 Q_PROPERTY(Ubuntu::DownloadManager::Metadata* metadata READ metadata WRITE setMetadata NOTIFY metadataChanged)
47 Q_PROPERTY(QString hash READ hash WRITE setHash NOTIFY hashChanged)
48 Q_PROPERTY(QString algorithm READ algorithm WRITE setAlgorithm NOTIFY algorithmChanged)
4749
48 public:50 public:
49 explicit SingleDownload(QObject *parent = 0);51 explicit SingleDownload(QObject *parent = 0);
@@ -92,12 +94,16 @@
92 QString downloadId() const;94 QString downloadId() const;
93 QVariantMap headers() const;95 QVariantMap headers() const;
94 Metadata* metadata() const;96 Metadata* metadata() const;
97 QString hash() const;
98 QString algorithm() const;
9599
96 // setters100 // setters
97 void setAllowMobileDownload(bool value);101 void setAllowMobileDownload(bool value);
98 void setThrottle(qulonglong value);102 void setThrottle(qulonglong value);
99 void setHeaders(QVariantMap headers);103 void setHeaders(QVariantMap headers);
100 void setMetadata(Metadata* metadata);104 void setMetadata(Metadata* metadata);
105 void setHash(QString hash);
106 void setAlgorithm(QString algorithm);
101107
102 // only property that does not access the download obj108 // only property that does not access the download obj
103 void setAutoStart(bool value) {109 void setAutoStart(bool value) {
@@ -127,6 +133,8 @@
127 void started(bool success);133 void started(bool success);
128 void errorFound(DownloadError& error);134 void errorFound(DownloadError& error);
129 void errorChanged();135 void errorChanged();
136 void hashChanged();
137 void algorithmChanged();
130138
131public slots:139public slots:
132 void registerError(Error* error);140 void registerError(Error* error);
@@ -172,6 +180,8 @@
172 Download* m_download = nullptr;180 Download* m_download = nullptr;
173 Manager* m_manager = nullptr;181 Manager* m_manager = nullptr;
174 QString m_downloadId;182 QString m_downloadId;
183 QString m_hash;
184 QString m_algorithm;
175185
176};186};
177187
178188
=== modified file 'tests/downloads/daemon/test_metadata.cpp'
--- tests/downloads/daemon/test_metadata.cpp 2015-09-21 08:24:55 +0000
+++ tests/downloads/daemon/test_metadata.cpp 2016-07-12 13:11:29 +0000
@@ -19,23 +19,24 @@
19#include <stdlib.h>19#include <stdlib.h>
2020
21#include <QProcessEnvironment>21#include <QProcessEnvironment>
22#include <QStringList>
2223
23#include "test_metadata.h"24#include "test_metadata.h"
2425
25using namespace Ubuntu::Transfers;26using namespace Ubuntu::Transfers;
2627
27void28void
28TestMetadata::testCommnad_data() {29TestMetadata::testCommand_data() {
29 QTest::addColumn<QString>("command");30 QTest::addColumn<QStringList>("command");
3031
31 QTest::newRow("mkdir") << "mkdir test";32 QTest::newRow("mkdir") << (QStringList() << "mkdir" << "test");
32 QTest::newRow("cd") << "cd test";33 QTest::newRow("cd") << (QStringList() << "cd" << "test");
33 QTest::newRow("ls") << "ls -la";34 QTest::newRow("ls") << (QStringList() << "ls" << "-la");
34}35}
3536
36void37void
37TestMetadata::testCommnad() {38TestMetadata::testCommand() {
38 QFETCH(QString, command);39 QFETCH(QStringList, command);
3940
40 Metadata metadata;41 Metadata metadata;
41 metadata[Metadata::COMMAND_KEY] = command;42 metadata[Metadata::COMMAND_KEY] = command;
@@ -43,33 +44,33 @@
43}44}
4445
45void46void
46TestMetadata::testSetCommnad_data() {47TestMetadata::testSetCommand_data() {
47 QTest::addColumn<QString>("command");48 QTest::addColumn<QStringList>("command");
4849
49 QTest::newRow("mkdir") << "mkdir test";50 QTest::newRow("mkdir") << (QStringList() << "mkdir" << "test");
50 QTest::newRow("cd") << "cd test";51 QTest::newRow("cd") << (QStringList() << "cd" << "test");
51 QTest::newRow("ls") << "ls -la";52 QTest::newRow("ls") << (QStringList() << "ls" << "-la");
52}53}
5354
54void55void
55TestMetadata::testSetCommnad() {56TestMetadata::testSetCommand() {
56 QFETCH(QString, command);57 QFETCH(QStringList, command);
5758
58 Metadata metadata;59 Metadata metadata;
59 metadata.setCommand(command);60 metadata.setCommand(command);
60 QCOMPARE(metadata[Metadata::COMMAND_KEY].toString(), command);61 QCOMPARE(metadata[Metadata::COMMAND_KEY].toStringList(), command);
61}62}
6263
63void64void
64TestMetadata::testHasCommnadTrue() {65TestMetadata::testHasCommandTrue() {
65 Metadata metadata;66 Metadata metadata;
66 metadata.setCommand("command");67 metadata.setCommand(QStringList("command"));
6768
68 QVERIFY(metadata.hasCommand());69 QVERIFY(metadata.hasCommand());
69}70}
7071
71void72void
72TestMetadata::testHasCommnadFalse() {73TestMetadata::testHasCommandFalse() {
73 Metadata metadata;74 Metadata metadata;
74 QVERIFY(!metadata.hasCommand());75 QVERIFY(!metadata.hasCommand());
75}76}
@@ -438,5 +439,45 @@
438 QCOMPARE(metadata.destinationApp(), appid);439 QCOMPARE(metadata.destinationApp(), appid);
439}440}
440441
442void
443TestMetadata::testCustom_data() {
444 QTest::addColumn<QVariantMap>("custom");
445
446 QVariantMap first;
447 QVariantMap second;
448 first.insert("test1", "Test");
449 second.insert("test2", "Testing");
450 second.insert("test3", "Further testing");
451
452 QTest::newRow("first") << first;
453 QTest::newRow("second") << second;
454}
455
456void
457TestMetadata::testCustom() {
458 QFETCH(QVariantMap, custom);
459
460 Metadata metadata;
461 metadata.setCustom(custom);
462 QCOMPARE(custom, metadata.custom());
463}
464
465void
466TestMetadata::testHasCustomTrue() {
467 Metadata metadata;
468 QVariantMap custom;
469 custom.insert("test1", "Test");
470 custom.insert("test2", "Test");
471 metadata.setCustom(custom);
472
473 QVERIFY(metadata.hasCustom());
474}
475
476void
477TestMetadata::testHasCustomFalse() {
478 Metadata metadata;
479 QVERIFY(!metadata.hasCustom());
480}
481
441QTEST_MAIN(TestMetadata)482QTEST_MAIN(TestMetadata)
442#include "moc_test_metadata.cpp"483#include "moc_test_metadata.cpp"
443484
=== modified file 'tests/downloads/daemon/test_metadata.h'
--- tests/downloads/daemon/test_metadata.h 2015-12-10 20:47:34 +0000
+++ tests/downloads/daemon/test_metadata.h 2016-07-12 13:11:29 +0000
@@ -31,12 +31,12 @@
31 : BaseTestCase("TestMetadata", parent) { }31 : BaseTestCase("TestMetadata", parent) { }
3232
33 private slots: // NOLINT(whitespace/indent)33 private slots: // NOLINT(whitespace/indent)
34 void testCommnad_data();34 void testCommand_data();
35 void testCommnad();35 void testCommand();
36 void testSetCommnad_data();36 void testSetCommand_data();
37 void testSetCommnad();37 void testSetCommand();
38 void testHasCommnadTrue();38 void testHasCommandTrue();
39 void testHasCommnadFalse();39 void testHasCommandFalse();
40 void testLocalPath_data();40 void testLocalPath_data();
41 void testLocalPath();41 void testLocalPath();
42 void testSetLocalPath_data();42 void testSetLocalPath_data();
@@ -80,6 +80,10 @@
80 void testDestinationAppIsPickedFromEnv_data();80 void testDestinationAppIsPickedFromEnv_data();
81 void testDestinationAppIsPickedFromEnv();81 void testDestinationAppIsPickedFromEnv();
82 void testDestinationAppIsAlreadyPresent();82 void testDestinationAppIsAlreadyPresent();
83 void testCustom_data();
84 void testCustom();
85 void testHasCustomTrue();
86 void testHasCustomFalse();
83};87};
8488
85#endif89#endif
8690
=== modified file 'tests/downloads/qml/test_metadata.cpp'
--- tests/downloads/qml/test_metadata.cpp 2014-09-18 13:22:31 +0000
+++ tests/downloads/qml/test_metadata.cpp 2016-07-12 13:11:29 +0000
@@ -70,5 +70,56 @@
70 QCOMPARE(metadata->showInIndicator(), show);70 QCOMPARE(metadata->showInIndicator(), show);
71}71}
7272
73void
74TestMetadata::testGetCommandEmpty() {
75 QScopedPointer<Metadata> metadata(new Metadata());
76 QVERIFY(metadata->command());
77}
78
79void
80TestMetadata::testGetCommandPresent_data() {
81 QTest::addColumn<QStringList>("command");
82
83 QTest::newRow("First") << QStringList("/bin/ls", "/tmp/");
84 QTest::newRow("Second") << QStringList("/bin/true");
85}
86
87void
88TestMetadata::testGetCommandPresent() {
89 QFETCH(QStringList, command);
90 QScopedPointer<Metadata> metadata(new Metadata());
91 metadata->setCommand(command);
92 QCOMPARE(metadata->command(), command);
93}
94
95void
96TestMetadata::testGetCustomEmpty() {
97 QScopedPointer<Metadata> metadata(new Metadata());
98 QVERIFY(metadata->custom());
99}
100
101void
102TestMetadata::testGetCustomPresent_data() {
103 QTest::addColumn<QVariantMap>("custom");
104
105 QVariantMap first;
106 QVariantMap second;
107
108 first.insert("test1", "Testing");
109 first.insert("test2", "Testing2");
110 second.insert("test", "Test");
111
112 QTest::newRow("First") << first;
113 QTest::newRow("Second") << second;
114}
115
116void
117TestMetadata::testGetCustomPresent() {
118 QFETCH(QVariantMap, custom);
119 QScopedPointer<Metadata> metadata(new Metadata());
120 metadata->setCustom(custom);
121 QCOMPARE(metadata->custom(), custom);
122}
123
73QTEST_MAIN(TestMetadata)124QTEST_MAIN(TestMetadata)
74#include "moc_test_metadata.cpp"125#include "moc_test_metadata.cpp"
75126
=== modified file 'tests/downloads/qml/test_metadata.h'
--- tests/downloads/qml/test_metadata.h 2014-09-18 13:22:31 +0000
+++ tests/downloads/qml/test_metadata.h 2016-07-12 13:11:29 +0000
@@ -35,6 +35,12 @@
35 void testGetShowInIndicatorEmpty();35 void testGetShowInIndicatorEmpty();
36 void testGetShowInIndicatorPresent_data();36 void testGetShowInIndicatorPresent_data();
37 void testGetShowInIndicatorPresent();37 void testGetShowInIndicatorPresent();
38 void testGetCommandEmpty();
39 void testGetCommandPresent_data();
40 void testGetCommandPresent();
41 void testGetCustomEmpty();
42 void testGetCustomPresent_data();
43 void testGetCustomPresent();
38};44};
3945
40#endif46#endif
4147
=== modified file 'tests/downloads/qml/test_single_download.cpp'
--- tests/downloads/qml/test_single_download.cpp 2014-09-18 13:22:31 +0000
+++ tests/downloads/qml/test_single_download.cpp 2016-07-12 13:11:29 +0000
@@ -429,5 +429,127 @@
429 verifyMocks();429 verifyMocks();
430}430}
431431
432void
433TestSingleDownload::testSetHashNullptr() {
434 QScopedPointer<TestableSingleDownload> singleDownload(
435 new TestableSingleDownload(nullptr, _man));
436
437 singleDownload->setHash("c4e5f7fcbcef75924b2abde2b2e75f3f");
438 // ensure that the mocks are not called and we do not crash
439 verifyMocks();
440}
441
442void
443TestSingleDownload::testSetHashError() {
444 QScopedPointer<MockError> err(new MockError(Error::DBus));
445 QScopedPointer<TestableSingleDownload> singleDownload(
446 new TestableSingleDownload(_down, _man));
447
448 EXPECT_CALL(*_down, setHash("c4e5f7fcbcef75924b2abde2b2e75f3f"))
449 .Times(1);
450
451 EXPECT_CALL(*_down, isError())
452 .Times(1)
453 .WillOnce(Return(true));
454
455 EXPECT_CALL(*_down, error())
456 .Times(1)
457 .WillOnce(Return(err.data()));
458
459 EXPECT_CALL(*err.data(), errorString())
460 .Times(1)
461 .WillOnce(Return(QString("My error")));
462
463 // ensure that the diff signals are emitted
464 SignalBarrier spy(singleDownload.data(), SIGNAL(errorChanged()));
465
466 singleDownload->setHash("c4e5f7fcbcef75924b2abde2b2e75f3f");
467
468 QVERIFY(spy.ensureSignalEmitted());
469 verifyMocks();
470}
471
472void
473TestSingleDownload::testSetHashSuccess() {
474 QScopedPointer<TestableSingleDownload> singleDownload(
475 new TestableSingleDownload(_down, _man));
476
477 EXPECT_CALL(*_down, setHash("c4e5f7fcbcef75924b2abde2b2e75f3f"))
478 .Times(1);
479
480 EXPECT_CALL(*_down, isError())
481 .Times(1)
482 .WillOnce(Return(false));
483
484 // ensure that the diff signals are emitted
485 SignalBarrier spy(singleDownload.data(), SIGNAL(hashChanged()));
486
487 singleDownload->setHash("c4e5f7fcbcef75924b2abde2b2e75f3f");
488
489 QVERIFY(spy.ensureSignalEmitted());
490 verifyMocks();
491}
492
493void
494TestSingleDownload::testSetAlgorithmNullptr() {
495 QScopedPointer<TestableSingleDownload> singleDownload(
496 new TestableSingleDownload(nullptr, _man));
497
498 singleDownload->setAlgorithm("sha1");
499 // ensure that the mocks are not called and we do not crash
500 verifyMocks();
501}
502
503void
504TestSingleDownload::testSetAlgorithmError() {
505 QScopedPointer<MockError> err(new MockError(Error::DBus));
506 QScopedPointer<TestableSingleDownload> singleDownload(
507 new TestableSingleDownload(_down, _man));
508
509 EXPECT_CALL(*_down, setAlgorithm("sha1"))
510 .Times(1);
511
512 EXPECT_CALL(*_down, isError())
513 .Times(1)
514 .WillOnce(Return(true));
515
516 EXPECT_CALL(*_down, error())
517 .Times(1)
518 .WillOnce(Return(err.data()));
519
520 EXPECT_CALL(*err.data(), errorString())
521 .Times(1)
522 .WillOnce(Return(QString("My error")));
523
524 // ensure that the diff signals are emitted
525 SignalBarrier spy(singleDownload.data(), SIGNAL(errorChanged()));
526
527 singleDownload->setAlgorithm("sha1");
528
529 QVERIFY(spy.ensureSignalEmitted());
530 verifyMocks();
531}
532
533void
534TestSingleDownload::testSetAlgorithmSuccess() {
535 QScopedPointer<TestableSingleDownload> singleDownload(
536 new TestableSingleDownload(_down, _man));
537
538 EXPECT_CALL(*_down, setAlgorithm("sha1"))
539 .Times(1);
540
541 EXPECT_CALL(*_down, isError())
542 .Times(1)
543 .WillOnce(Return(false));
544
545 // ensure that the diff signals are emitted
546 SignalBarrier spy(singleDownload.data(), SIGNAL(algorithmChanged()));
547
548 singleDownload->setAlgorithm("sha1");
549
550 QVERIFY(spy.ensureSignalEmitted());
551 verifyMocks();
552}
553
432QTEST_MAIN(TestSingleDownload)554QTEST_MAIN(TestSingleDownload)
433#include "moc_test_single_download.cpp"555#include "moc_test_single_download.cpp"
434556
=== modified file 'tests/downloads/qml/test_single_download.h'
--- tests/downloads/qml/test_single_download.h 2014-09-18 13:22:31 +0000
+++ tests/downloads/qml/test_single_download.h 2016-07-12 13:11:29 +0000
@@ -78,6 +78,12 @@
78 void testSetMetadataToNullptr();78 void testSetMetadataToNullptr();
79 void testSetMetadataError();79 void testSetMetadataError();
80 void testSetMetadataSuccess();80 void testSetMetadataSuccess();
81 void testSetHashNullptr();
82 void testSetHashError();
83 void testSetHashSuccess();
84 void testSetAlgorithmNullptr();
85 void testSetAlgorithmError();
86 void testSetAlgorithmSuccess();
8187
82 private:88 private:
83 void verifyMocks();89 void verifyMocks();

Subscribers

People subscribed via source and target branches