Merge lp:~michael-sheldon/ubuntu-download-manager/qml-api-improvements into lp:ubuntu-download-manager
- qml-api-improvements
- Merge into trunk
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 | ||||||||||||
Related bugs: |
|
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.
PS Jenkins bot (ps-jenkins) wrote : | # |
- 363. By Michael Sheldon
-
Merge from trunk
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:363
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
- 364. By Michael Sheldon
-
Add tests for new QML API and custom metadata
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:364
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
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.createObjec
"hash": hash,
"headers": headers // A QVariantMap of headers
});
var metadataObj = mdt.createObjec
singleDownl
singleDownl
What I get in the downloads.sql database is:
sqlite> select * from SingleDownload;
a634b6f8888
"app-id": "/usr/bin/
}
|{
}
This seems to happen because in qml/single_
SingleDownl
…
Metadata metadata;
QMap<QString, QString> headers;
DownloadStruct dstruct(url, m_hash, m_algorithm, metadata.map(), headers);
m_manager-
I.e. m_metadata and m_headers are ignored. Am I not supposed to call SingleDownload.
Secondly, even though the sqlite output from above have “app-id” set to “/usr/bin/
system-apps-ci-bot (system-apps-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:364
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
- 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
system-apps-ci-bot (system-apps-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:365
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Preview Diff
1 | === modified file 'src/common/public/ubuntu/transfers/metadata.cpp' | |||
2 | --- src/common/public/ubuntu/transfers/metadata.cpp 2015-12-10 20:39:48 +0000 | |||
3 | +++ src/common/public/ubuntu/transfers/metadata.cpp 2016-07-12 13:11:29 +0000 | |||
4 | @@ -18,7 +18,6 @@ | |||
5 | 18 | 18 | ||
6 | 19 | #include <QProcessEnvironment> | 19 | #include <QProcessEnvironment> |
7 | 20 | #include <QCoreApplication> | 20 | #include <QCoreApplication> |
8 | 21 | #include <QDebug> | ||
9 | 22 | 21 | ||
10 | 23 | #include "metadata.h" | 22 | #include "metadata.h" |
11 | 24 | 23 | ||
12 | @@ -35,6 +34,7 @@ | |||
13 | 35 | const QString Metadata::CLICK_PACKAGE_KEY = "click-package"; | 34 | const QString Metadata::CLICK_PACKAGE_KEY = "click-package"; |
14 | 36 | const QString Metadata::DEFLATE_KEY = "deflate"; | 35 | const QString Metadata::DEFLATE_KEY = "deflate"; |
15 | 37 | const QString Metadata::EXTRACT_KEY = "extract"; | 36 | const QString Metadata::EXTRACT_KEY = "extract"; |
16 | 37 | const QString Metadata::CUSTOM_PREFIX = "custom_"; | ||
17 | 38 | const QString Metadata::APP_ID = "app-id"; | 38 | const QString Metadata::APP_ID = "app-id"; |
18 | 39 | 39 | ||
19 | 40 | namespace { | 40 | namespace { |
20 | @@ -63,14 +63,14 @@ | |||
21 | 63 | } | 63 | } |
22 | 64 | } | 64 | } |
23 | 65 | 65 | ||
25 | 66 | QString | 66 | QStringList |
26 | 67 | Metadata::command() const { | 67 | Metadata::command() const { |
27 | 68 | return (contains(Metadata::COMMAND_KEY))? | 68 | return (contains(Metadata::COMMAND_KEY))? |
29 | 69 | value(Metadata::COMMAND_KEY).toString():""; | 69 | value(Metadata::COMMAND_KEY).toStringList():QStringList(); |
30 | 70 | } | 70 | } |
31 | 71 | 71 | ||
32 | 72 | void | 72 | void |
34 | 73 | Metadata::setCommand(const QString& command) { | 73 | Metadata::setCommand(const QStringList& command) { |
35 | 74 | insert(Metadata::COMMAND_KEY, command); | 74 | insert(Metadata::COMMAND_KEY, command); |
36 | 75 | } | 75 | } |
37 | 76 | 76 | ||
38 | @@ -207,6 +207,37 @@ | |||
39 | 207 | return contains(Metadata::APP_ID); | 207 | return contains(Metadata::APP_ID); |
40 | 208 | } | 208 | } |
41 | 209 | 209 | ||
42 | 210 | QVariantMap | ||
43 | 211 | Metadata::custom() const { | ||
44 | 212 | QVariantMap custom; | ||
45 | 213 | foreach(QString key, keys()) { | ||
46 | 214 | if (key.startsWith(CUSTOM_PREFIX)) { | ||
47 | 215 | QString customKey = key; | ||
48 | 216 | customKey.replace(CUSTOM_PREFIX, ""); | ||
49 | 217 | custom.insert(customKey, values(key)[0]); | ||
50 | 218 | } | ||
51 | 219 | } | ||
52 | 220 | return custom; | ||
53 | 221 | } | ||
54 | 222 | |||
55 | 223 | void | ||
56 | 224 | Metadata::setCustom(QVariantMap custom) { | ||
57 | 225 | // We can't send nested QVariantMaps over dbus, so flatten to one map | ||
58 | 226 | foreach(QString key, custom.keys()) { | ||
59 | 227 | insert(Metadata::CUSTOM_PREFIX + key, custom[key]); | ||
60 | 228 | } | ||
61 | 229 | } | ||
62 | 230 | |||
63 | 231 | bool | ||
64 | 232 | Metadata::hasCustom() const { | ||
65 | 233 | foreach(QString key, keys()) { | ||
66 | 234 | if (key.startsWith(CUSTOM_PREFIX)) { | ||
67 | 235 | return true; | ||
68 | 236 | } | ||
69 | 237 | } | ||
70 | 238 | return false; | ||
71 | 239 | } | ||
72 | 240 | |||
73 | 210 | } // DownloadManager | 241 | } // DownloadManager |
74 | 211 | 242 | ||
75 | 212 | } // Ubuntu | 243 | } // Ubuntu |
76 | 213 | 244 | ||
77 | === modified file 'src/common/public/ubuntu/transfers/metadata.h' | |||
78 | --- src/common/public/ubuntu/transfers/metadata.h 2015-12-10 20:47:34 +0000 | |||
79 | +++ src/common/public/ubuntu/transfers/metadata.h 2016-07-12 13:11:29 +0000 | |||
80 | @@ -41,11 +41,12 @@ | |||
81 | 41 | static const QString CLICK_PACKAGE_KEY; | 41 | static const QString CLICK_PACKAGE_KEY; |
82 | 42 | static const QString DEFLATE_KEY; | 42 | static const QString DEFLATE_KEY; |
83 | 43 | static const QString EXTRACT_KEY; | 43 | static const QString EXTRACT_KEY; |
84 | 44 | static const QString CUSTOM_PREFIX; | ||
85 | 44 | static const QString APP_ID; | 45 | static const QString APP_ID; |
86 | 45 | 46 | ||
87 | 46 | // accessors to simplify the use of the metadata | 47 | // accessors to simplify the use of the metadata |
90 | 47 | QString command() const; | 48 | QStringList command() const; |
91 | 48 | void setCommand(const QString& command); | 49 | void setCommand(const QStringList& command); |
92 | 49 | bool hasCommand() const; | 50 | bool hasCommand() const; |
93 | 50 | 51 | ||
94 | 51 | QString localPath() const; | 52 | QString localPath() const; |
95 | @@ -79,6 +80,10 @@ | |||
96 | 79 | QString destinationApp() const; | 80 | QString destinationApp() const; |
97 | 80 | void setOwner(const QString &id); | 81 | void setOwner(const QString &id); |
98 | 81 | bool hasOwner() const; | 82 | bool hasOwner() const; |
99 | 83 | |||
100 | 84 | QVariantMap custom() const; | ||
101 | 85 | void setCustom(const QVariantMap custom); | ||
102 | 86 | bool hasCustom() const; | ||
103 | 82 | }; | 87 | }; |
104 | 83 | 88 | ||
105 | 84 | } // DownloadManager | 89 | } // DownloadManager |
106 | 85 | 90 | ||
107 | === modified file 'src/downloads/qml/metadata.cpp' | |||
108 | --- src/downloads/qml/metadata.cpp 2016-03-16 16:03:39 +0000 | |||
109 | +++ src/downloads/qml/metadata.cpp 2016-07-12 13:11:29 +0000 | |||
110 | @@ -153,6 +153,31 @@ | |||
111 | 153 | } | 153 | } |
112 | 154 | } | 154 | } |
113 | 155 | 155 | ||
114 | 156 | QStringList | ||
115 | 157 | Metadata::command() const { | ||
116 | 158 | return _metadata.command(); | ||
117 | 159 | } | ||
118 | 160 | |||
119 | 161 | void | ||
120 | 162 | Metadata::setCommand(QStringList command) { | ||
121 | 163 | if (command != _metadata.command()) { | ||
122 | 164 | _metadata.setCommand(command); | ||
123 | 165 | emit commandChanged(); | ||
124 | 166 | } | ||
125 | 167 | } | ||
126 | 168 | |||
127 | 169 | QVariantMap | ||
128 | 170 | Metadata::custom() const { | ||
129 | 171 | return _metadata.custom(); | ||
130 | 172 | } | ||
131 | 173 | |||
132 | 174 | void Metadata::setCustom(QVariantMap custom) { | ||
133 | 175 | if (custom != _metadata.custom()) { | ||
134 | 176 | _metadata.setCustom(custom); | ||
135 | 177 | emit customChanged(); | ||
136 | 178 | } | ||
137 | 179 | } | ||
138 | 180 | |||
139 | 156 | QVariantMap | 181 | QVariantMap |
140 | 157 | Metadata::map() const { | 182 | Metadata::map() const { |
141 | 158 | return QVariantMap(_metadata); | 183 | return QVariantMap(_metadata); |
142 | @@ -182,6 +207,20 @@ | |||
143 | 182 | to False. | 207 | to False. |
144 | 183 | */ | 208 | */ |
145 | 184 | 209 | ||
146 | 210 | /*! | ||
147 | 211 | \qmlproperty list Metadata::command | ||
148 | 212 | \internal | ||
149 | 213 | |||
150 | 214 | A command to run on the file immediately following completion of the | ||
151 | 215 | download. | ||
152 | 216 | */ | ||
153 | 217 | |||
154 | 218 | /*! | ||
155 | 219 | \qmlproperty array Metadata::custom | ||
156 | 220 | |||
157 | 221 | Metadata specific to your application that you wish to associate with | ||
158 | 222 | this download. This metadata will persist across application restarts. | ||
159 | 223 | */ | ||
160 | 185 | } | 224 | } |
161 | 186 | 225 | ||
162 | 187 | } | 226 | } |
163 | 188 | 227 | ||
164 | === modified file 'src/downloads/qml/metadata.h' | |||
165 | --- src/downloads/qml/metadata.h 2014-10-09 09:52:34 +0000 | |||
166 | +++ src/downloads/qml/metadata.h 2016-07-12 13:11:29 +0000 | |||
167 | @@ -30,6 +30,8 @@ | |||
168 | 30 | Q_PROPERTY(bool showInIndicator READ showInIndicator WRITE setShowInIndicator NOTIFY showIndicatorChanged) | 30 | Q_PROPERTY(bool showInIndicator READ showInIndicator WRITE setShowInIndicator NOTIFY showIndicatorChanged) |
169 | 31 | Q_PROPERTY(bool deflate READ deflate WRITE setDeflate NOTIFY deflateChanged) | 31 | Q_PROPERTY(bool deflate READ deflate WRITE setDeflate NOTIFY deflateChanged) |
170 | 32 | Q_PROPERTY(bool extract READ extract WRITE setExtract NOTIFY extractChanged) | 32 | Q_PROPERTY(bool extract READ extract WRITE setExtract NOTIFY extractChanged) |
171 | 33 | Q_PROPERTY(QStringList command READ command WRITE setCommand NOTIFY commandChanged) | ||
172 | 34 | Q_PROPERTY(QVariantMap custom READ custom WRITE setCustom NOTIFY customChanged) | ||
173 | 33 | 35 | ||
174 | 34 | public: | 36 | public: |
175 | 35 | explicit Metadata(QObject* parent=0); | 37 | explicit Metadata(QObject* parent=0); |
176 | @@ -47,6 +49,12 @@ | |||
177 | 47 | bool extract() const; | 49 | bool extract() const; |
178 | 48 | void setExtract(bool extract); | 50 | void setExtract(bool extract); |
179 | 49 | 51 | ||
180 | 52 | QStringList command() const; | ||
181 | 53 | void setCommand(QStringList command); | ||
182 | 54 | |||
183 | 55 | QVariantMap custom() const; | ||
184 | 56 | void setCustom(QVariantMap custom); | ||
185 | 57 | |||
186 | 50 | QVariantMap map() const; | 58 | QVariantMap map() const; |
187 | 51 | 59 | ||
188 | 52 | signals: | 60 | signals: |
189 | @@ -54,6 +62,8 @@ | |||
190 | 54 | void showIndicatorChanged(); | 62 | void showIndicatorChanged(); |
191 | 55 | void deflateChanged(); | 63 | void deflateChanged(); |
192 | 56 | void extractChanged(); | 64 | void extractChanged(); |
193 | 65 | void commandChanged(); | ||
194 | 66 | void customChanged(); | ||
195 | 57 | 67 | ||
196 | 58 | private: | 68 | private: |
197 | 59 | Transfers::Metadata _metadata; | 69 | Transfers::Metadata _metadata; |
198 | 60 | 70 | ||
199 | === modified file 'src/downloads/qml/single_download.cpp' | |||
200 | --- src/downloads/qml/single_download.cpp 2016-03-17 16:32:25 +0000 | |||
201 | +++ src/downloads/qml/single_download.cpp 2016-07-12 13:11:29 +0000 | |||
202 | @@ -231,7 +231,7 @@ | |||
203 | 231 | } | 231 | } |
204 | 232 | Metadata metadata; | 232 | Metadata metadata; |
205 | 233 | QMap<QString, QString> headers; | 233 | QMap<QString, QString> headers; |
207 | 234 | DownloadStruct dstruct(url, metadata.map(), headers); | 234 | DownloadStruct dstruct(url, m_hash, m_algorithm, metadata.map(), headers); |
208 | 235 | m_manager->createDownload(dstruct); | 235 | m_manager->createDownload(dstruct); |
209 | 236 | } else if (url.isEmpty()) { | 236 | } else if (url.isEmpty()) { |
210 | 237 | m_error.setMessage("No URL specified"); | 237 | m_error.setMessage("No URL specified"); |
211 | @@ -306,6 +306,7 @@ | |||
212 | 306 | SingleDownload::registerError(Error* error) | 306 | SingleDownload::registerError(Error* error) |
213 | 307 | { | 307 | { |
214 | 308 | m_error.setMessage(error->errorString()); | 308 | m_error.setMessage(error->errorString()); |
215 | 309 | m_download = nullptr; | ||
216 | 309 | emit errorFound(m_error); | 310 | emit errorFound(m_error); |
217 | 310 | emit errorChanged(); | 311 | emit errorChanged(); |
218 | 311 | } | 312 | } |
219 | @@ -459,6 +460,16 @@ | |||
220 | 459 | } | 460 | } |
221 | 460 | } | 461 | } |
222 | 461 | 462 | ||
223 | 463 | QString | ||
224 | 464 | SingleDownload::hash() const { | ||
225 | 465 | return m_hash; | ||
226 | 466 | } | ||
227 | 467 | |||
228 | 468 | QString | ||
229 | 469 | SingleDownload::algorithm() const { | ||
230 | 470 | return m_algorithm; | ||
231 | 471 | } | ||
232 | 472 | |||
233 | 462 | void | 473 | void |
234 | 463 | SingleDownload::setHeaders(QVariantMap headers) { | 474 | SingleDownload::setHeaders(QVariantMap headers) { |
235 | 464 | if (m_download == nullptr) { | 475 | if (m_download == nullptr) { |
236 | @@ -504,9 +515,9 @@ | |||
237 | 504 | return; | 515 | return; |
238 | 505 | } | 516 | } |
239 | 506 | 517 | ||
240 | 518 | m_metadata = metadata; | ||
241 | 507 | if (m_download == nullptr) { | 519 | if (m_download == nullptr) { |
242 | 508 | m_dirty = true; | 520 | m_dirty = true; |
243 | 509 | m_metadata = metadata; | ||
244 | 510 | } else { | 521 | } else { |
245 | 511 | m_download->setMetadata(metadata->map()); | 522 | m_download->setMetadata(metadata->map()); |
246 | 512 | if (m_download->isError()) { | 523 | if (m_download->isError()) { |
247 | @@ -522,6 +533,16 @@ | |||
248 | 522 | } | 533 | } |
249 | 523 | } | 534 | } |
250 | 524 | 535 | ||
251 | 536 | void | ||
252 | 537 | SingleDownload::setHash(QString hash) { | ||
253 | 538 | m_hash = hash; | ||
254 | 539 | } | ||
255 | 540 | |||
256 | 541 | void | ||
257 | 542 | SingleDownload::setAlgorithm(QString algorithm) { | ||
258 | 543 | m_algorithm = algorithm; | ||
259 | 544 | } | ||
260 | 545 | |||
261 | 525 | /*! | 546 | /*! |
262 | 526 | \qmlproperty bool SingleDownload::autoStart | 547 | \qmlproperty bool SingleDownload::autoStart |
263 | 527 | 548 | ||
264 | @@ -598,6 +619,32 @@ | |||
265 | 598 | */ | 619 | */ |
266 | 599 | 620 | ||
267 | 600 | /*! | 621 | /*! |
268 | 622 | \qmlproperty string SingleDownload::hash | ||
269 | 623 | \since Ubuntu.DownloadManager 1.3 | ||
270 | 624 | |||
271 | 625 | This property specifies a hash to check against the downloaded file. | ||
272 | 626 | If used, this should be set prior to calling the download() method. | ||
273 | 627 | */ | ||
274 | 628 | |||
275 | 629 | /*! | ||
276 | 630 | \qmlproperty string SingleDownload::algorithm | ||
277 | 631 | \since Ubuntu.DownloadManager 1.3 | ||
278 | 632 | |||
279 | 633 | This property indicates the algorithm to use when verifying a hash. | ||
280 | 634 | The algorithm can be of one of the following string values: | ||
281 | 635 | |||
282 | 636 | - "md5" | ||
283 | 637 | - "sha1" | ||
284 | 638 | - "sha224" | ||
285 | 639 | - "sha256" | ||
286 | 640 | - "sha384" | ||
287 | 641 | - "sha512" | ||
288 | 642 | |||
289 | 643 | If no value is specified md5 will be used. | ||
290 | 644 | If used, this should be set prior to calling the download() method. | ||
291 | 645 | */ | ||
292 | 646 | |||
293 | 647 | /*! | ||
294 | 601 | \qmlsignal SingleDownload::finished(QString path) | 648 | \qmlsignal SingleDownload::finished(QString path) |
295 | 602 | 649 | ||
296 | 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 |
297 | @@ -605,6 +652,5 @@ | |||
298 | 605 | \c onFinished | 652 | \c onFinished |
299 | 606 | */ | 653 | */ |
300 | 607 | 654 | ||
301 | 608 | |||
302 | 609 | } | 655 | } |
303 | 610 | } | 656 | } |
304 | 611 | 657 | ||
305 | === modified file 'src/downloads/qml/single_download.h' | |||
306 | --- src/downloads/qml/single_download.h 2015-10-23 16:09:48 +0000 | |||
307 | +++ src/downloads/qml/single_download.h 2016-07-12 13:11:29 +0000 | |||
308 | @@ -44,6 +44,8 @@ | |||
309 | 44 | Q_PROPERTY(QString downloadId READ downloadId NOTIFY downloadIdChanged) | 44 | Q_PROPERTY(QString downloadId READ downloadId NOTIFY downloadIdChanged) |
310 | 45 | Q_PROPERTY(QVariantMap headers READ headers WRITE setHeaders NOTIFY headersChanged) | 45 | Q_PROPERTY(QVariantMap headers READ headers WRITE setHeaders NOTIFY headersChanged) |
311 | 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) |
312 | 47 | Q_PROPERTY(QString hash READ hash WRITE setHash NOTIFY hashChanged) | ||
313 | 48 | Q_PROPERTY(QString algorithm READ algorithm WRITE setAlgorithm NOTIFY algorithmChanged) | ||
314 | 47 | 49 | ||
315 | 48 | public: | 50 | public: |
316 | 49 | explicit SingleDownload(QObject *parent = 0); | 51 | explicit SingleDownload(QObject *parent = 0); |
317 | @@ -92,12 +94,16 @@ | |||
318 | 92 | QString downloadId() const; | 94 | QString downloadId() const; |
319 | 93 | QVariantMap headers() const; | 95 | QVariantMap headers() const; |
320 | 94 | Metadata* metadata() const; | 96 | Metadata* metadata() const; |
321 | 97 | QString hash() const; | ||
322 | 98 | QString algorithm() const; | ||
323 | 95 | 99 | ||
324 | 96 | // setters | 100 | // setters |
325 | 97 | void setAllowMobileDownload(bool value); | 101 | void setAllowMobileDownload(bool value); |
326 | 98 | void setThrottle(qulonglong value); | 102 | void setThrottle(qulonglong value); |
327 | 99 | void setHeaders(QVariantMap headers); | 103 | void setHeaders(QVariantMap headers); |
328 | 100 | void setMetadata(Metadata* metadata); | 104 | void setMetadata(Metadata* metadata); |
329 | 105 | void setHash(QString hash); | ||
330 | 106 | void setAlgorithm(QString algorithm); | ||
331 | 101 | 107 | ||
332 | 102 | // only property that does not access the download obj | 108 | // only property that does not access the download obj |
333 | 103 | void setAutoStart(bool value) { | 109 | void setAutoStart(bool value) { |
334 | @@ -127,6 +133,8 @@ | |||
335 | 127 | void started(bool success); | 133 | void started(bool success); |
336 | 128 | void errorFound(DownloadError& error); | 134 | void errorFound(DownloadError& error); |
337 | 129 | void errorChanged(); | 135 | void errorChanged(); |
338 | 136 | void hashChanged(); | ||
339 | 137 | void algorithmChanged(); | ||
340 | 130 | 138 | ||
341 | 131 | public slots: | 139 | public slots: |
342 | 132 | void registerError(Error* error); | 140 | void registerError(Error* error); |
343 | @@ -172,6 +180,8 @@ | |||
344 | 172 | Download* m_download = nullptr; | 180 | Download* m_download = nullptr; |
345 | 173 | Manager* m_manager = nullptr; | 181 | Manager* m_manager = nullptr; |
346 | 174 | QString m_downloadId; | 182 | QString m_downloadId; |
347 | 183 | QString m_hash; | ||
348 | 184 | QString m_algorithm; | ||
349 | 175 | 185 | ||
350 | 176 | }; | 186 | }; |
351 | 177 | 187 | ||
352 | 178 | 188 | ||
353 | === modified file 'tests/downloads/daemon/test_metadata.cpp' | |||
354 | --- tests/downloads/daemon/test_metadata.cpp 2015-09-21 08:24:55 +0000 | |||
355 | +++ tests/downloads/daemon/test_metadata.cpp 2016-07-12 13:11:29 +0000 | |||
356 | @@ -19,23 +19,24 @@ | |||
357 | 19 | #include <stdlib.h> | 19 | #include <stdlib.h> |
358 | 20 | 20 | ||
359 | 21 | #include <QProcessEnvironment> | 21 | #include <QProcessEnvironment> |
360 | 22 | #include <QStringList> | ||
361 | 22 | 23 | ||
362 | 23 | #include "test_metadata.h" | 24 | #include "test_metadata.h" |
363 | 24 | 25 | ||
364 | 25 | using namespace Ubuntu::Transfers; | 26 | using namespace Ubuntu::Transfers; |
365 | 26 | 27 | ||
366 | 27 | void | 28 | void |
369 | 28 | TestMetadata::testCommnad_data() { | 29 | TestMetadata::testCommand_data() { |
370 | 29 | QTest::addColumn<QString>("command"); | 30 | QTest::addColumn<QStringList>("command"); |
371 | 30 | 31 | ||
375 | 31 | QTest::newRow("mkdir") << "mkdir test"; | 32 | QTest::newRow("mkdir") << (QStringList() << "mkdir" << "test"); |
376 | 32 | QTest::newRow("cd") << "cd test"; | 33 | QTest::newRow("cd") << (QStringList() << "cd" << "test"); |
377 | 33 | QTest::newRow("ls") << "ls -la"; | 34 | QTest::newRow("ls") << (QStringList() << "ls" << "-la"); |
378 | 34 | } | 35 | } |
379 | 35 | 36 | ||
380 | 36 | void | 37 | void |
383 | 37 | TestMetadata::testCommnad() { | 38 | TestMetadata::testCommand() { |
384 | 38 | QFETCH(QString, command); | 39 | QFETCH(QStringList, command); |
385 | 39 | 40 | ||
386 | 40 | Metadata metadata; | 41 | Metadata metadata; |
387 | 41 | metadata[Metadata::COMMAND_KEY] = command; | 42 | metadata[Metadata::COMMAND_KEY] = command; |
388 | @@ -43,33 +44,33 @@ | |||
389 | 43 | } | 44 | } |
390 | 44 | 45 | ||
391 | 45 | void | 46 | void |
394 | 46 | TestMetadata::testSetCommnad_data() { | 47 | TestMetadata::testSetCommand_data() { |
395 | 47 | QTest::addColumn<QString>("command"); | 48 | QTest::addColumn<QStringList>("command"); |
396 | 48 | 49 | ||
400 | 49 | QTest::newRow("mkdir") << "mkdir test"; | 50 | QTest::newRow("mkdir") << (QStringList() << "mkdir" << "test"); |
401 | 50 | QTest::newRow("cd") << "cd test"; | 51 | QTest::newRow("cd") << (QStringList() << "cd" << "test"); |
402 | 51 | QTest::newRow("ls") << "ls -la"; | 52 | QTest::newRow("ls") << (QStringList() << "ls" << "-la"); |
403 | 52 | } | 53 | } |
404 | 53 | 54 | ||
405 | 54 | void | 55 | void |
408 | 55 | TestMetadata::testSetCommnad() { | 56 | TestMetadata::testSetCommand() { |
409 | 56 | QFETCH(QString, command); | 57 | QFETCH(QStringList, command); |
410 | 57 | 58 | ||
411 | 58 | Metadata metadata; | 59 | Metadata metadata; |
412 | 59 | metadata.setCommand(command); | 60 | metadata.setCommand(command); |
414 | 60 | QCOMPARE(metadata[Metadata::COMMAND_KEY].toString(), command); | 61 | QCOMPARE(metadata[Metadata::COMMAND_KEY].toStringList(), command); |
415 | 61 | } | 62 | } |
416 | 62 | 63 | ||
417 | 63 | void | 64 | void |
419 | 64 | TestMetadata::testHasCommnadTrue() { | 65 | TestMetadata::testHasCommandTrue() { |
420 | 65 | Metadata metadata; | 66 | Metadata metadata; |
422 | 66 | metadata.setCommand("command"); | 67 | metadata.setCommand(QStringList("command")); |
423 | 67 | 68 | ||
424 | 68 | QVERIFY(metadata.hasCommand()); | 69 | QVERIFY(metadata.hasCommand()); |
425 | 69 | } | 70 | } |
426 | 70 | 71 | ||
427 | 71 | void | 72 | void |
429 | 72 | TestMetadata::testHasCommnadFalse() { | 73 | TestMetadata::testHasCommandFalse() { |
430 | 73 | Metadata metadata; | 74 | Metadata metadata; |
431 | 74 | QVERIFY(!metadata.hasCommand()); | 75 | QVERIFY(!metadata.hasCommand()); |
432 | 75 | } | 76 | } |
433 | @@ -438,5 +439,45 @@ | |||
434 | 438 | QCOMPARE(metadata.destinationApp(), appid); | 439 | QCOMPARE(metadata.destinationApp(), appid); |
435 | 439 | } | 440 | } |
436 | 440 | 441 | ||
437 | 442 | void | ||
438 | 443 | TestMetadata::testCustom_data() { | ||
439 | 444 | QTest::addColumn<QVariantMap>("custom"); | ||
440 | 445 | |||
441 | 446 | QVariantMap first; | ||
442 | 447 | QVariantMap second; | ||
443 | 448 | first.insert("test1", "Test"); | ||
444 | 449 | second.insert("test2", "Testing"); | ||
445 | 450 | second.insert("test3", "Further testing"); | ||
446 | 451 | |||
447 | 452 | QTest::newRow("first") << first; | ||
448 | 453 | QTest::newRow("second") << second; | ||
449 | 454 | } | ||
450 | 455 | |||
451 | 456 | void | ||
452 | 457 | TestMetadata::testCustom() { | ||
453 | 458 | QFETCH(QVariantMap, custom); | ||
454 | 459 | |||
455 | 460 | Metadata metadata; | ||
456 | 461 | metadata.setCustom(custom); | ||
457 | 462 | QCOMPARE(custom, metadata.custom()); | ||
458 | 463 | } | ||
459 | 464 | |||
460 | 465 | void | ||
461 | 466 | TestMetadata::testHasCustomTrue() { | ||
462 | 467 | Metadata metadata; | ||
463 | 468 | QVariantMap custom; | ||
464 | 469 | custom.insert("test1", "Test"); | ||
465 | 470 | custom.insert("test2", "Test"); | ||
466 | 471 | metadata.setCustom(custom); | ||
467 | 472 | |||
468 | 473 | QVERIFY(metadata.hasCustom()); | ||
469 | 474 | } | ||
470 | 475 | |||
471 | 476 | void | ||
472 | 477 | TestMetadata::testHasCustomFalse() { | ||
473 | 478 | Metadata metadata; | ||
474 | 479 | QVERIFY(!metadata.hasCustom()); | ||
475 | 480 | } | ||
476 | 481 | |||
477 | 441 | QTEST_MAIN(TestMetadata) | 482 | QTEST_MAIN(TestMetadata) |
478 | 442 | #include "moc_test_metadata.cpp" | 483 | #include "moc_test_metadata.cpp" |
479 | 443 | 484 | ||
480 | === modified file 'tests/downloads/daemon/test_metadata.h' | |||
481 | --- tests/downloads/daemon/test_metadata.h 2015-12-10 20:47:34 +0000 | |||
482 | +++ tests/downloads/daemon/test_metadata.h 2016-07-12 13:11:29 +0000 | |||
483 | @@ -31,12 +31,12 @@ | |||
484 | 31 | : BaseTestCase("TestMetadata", parent) { } | 31 | : BaseTestCase("TestMetadata", parent) { } |
485 | 32 | 32 | ||
486 | 33 | private slots: // NOLINT(whitespace/indent) | 33 | private slots: // NOLINT(whitespace/indent) |
493 | 34 | void testCommnad_data(); | 34 | void testCommand_data(); |
494 | 35 | void testCommnad(); | 35 | void testCommand(); |
495 | 36 | void testSetCommnad_data(); | 36 | void testSetCommand_data(); |
496 | 37 | void testSetCommnad(); | 37 | void testSetCommand(); |
497 | 38 | void testHasCommnadTrue(); | 38 | void testHasCommandTrue(); |
498 | 39 | void testHasCommnadFalse(); | 39 | void testHasCommandFalse(); |
499 | 40 | void testLocalPath_data(); | 40 | void testLocalPath_data(); |
500 | 41 | void testLocalPath(); | 41 | void testLocalPath(); |
501 | 42 | void testSetLocalPath_data(); | 42 | void testSetLocalPath_data(); |
502 | @@ -80,6 +80,10 @@ | |||
503 | 80 | void testDestinationAppIsPickedFromEnv_data(); | 80 | void testDestinationAppIsPickedFromEnv_data(); |
504 | 81 | void testDestinationAppIsPickedFromEnv(); | 81 | void testDestinationAppIsPickedFromEnv(); |
505 | 82 | void testDestinationAppIsAlreadyPresent(); | 82 | void testDestinationAppIsAlreadyPresent(); |
506 | 83 | void testCustom_data(); | ||
507 | 84 | void testCustom(); | ||
508 | 85 | void testHasCustomTrue(); | ||
509 | 86 | void testHasCustomFalse(); | ||
510 | 83 | }; | 87 | }; |
511 | 84 | 88 | ||
512 | 85 | #endif | 89 | #endif |
513 | 86 | 90 | ||
514 | === modified file 'tests/downloads/qml/test_metadata.cpp' | |||
515 | --- tests/downloads/qml/test_metadata.cpp 2014-09-18 13:22:31 +0000 | |||
516 | +++ tests/downloads/qml/test_metadata.cpp 2016-07-12 13:11:29 +0000 | |||
517 | @@ -70,5 +70,56 @@ | |||
518 | 70 | QCOMPARE(metadata->showInIndicator(), show); | 70 | QCOMPARE(metadata->showInIndicator(), show); |
519 | 71 | } | 71 | } |
520 | 72 | 72 | ||
521 | 73 | void | ||
522 | 74 | TestMetadata::testGetCommandEmpty() { | ||
523 | 75 | QScopedPointer<Metadata> metadata(new Metadata()); | ||
524 | 76 | QVERIFY(metadata->command()); | ||
525 | 77 | } | ||
526 | 78 | |||
527 | 79 | void | ||
528 | 80 | TestMetadata::testGetCommandPresent_data() { | ||
529 | 81 | QTest::addColumn<QStringList>("command"); | ||
530 | 82 | |||
531 | 83 | QTest::newRow("First") << QStringList("/bin/ls", "/tmp/"); | ||
532 | 84 | QTest::newRow("Second") << QStringList("/bin/true"); | ||
533 | 85 | } | ||
534 | 86 | |||
535 | 87 | void | ||
536 | 88 | TestMetadata::testGetCommandPresent() { | ||
537 | 89 | QFETCH(QStringList, command); | ||
538 | 90 | QScopedPointer<Metadata> metadata(new Metadata()); | ||
539 | 91 | metadata->setCommand(command); | ||
540 | 92 | QCOMPARE(metadata->command(), command); | ||
541 | 93 | } | ||
542 | 94 | |||
543 | 95 | void | ||
544 | 96 | TestMetadata::testGetCustomEmpty() { | ||
545 | 97 | QScopedPointer<Metadata> metadata(new Metadata()); | ||
546 | 98 | QVERIFY(metadata->custom()); | ||
547 | 99 | } | ||
548 | 100 | |||
549 | 101 | void | ||
550 | 102 | TestMetadata::testGetCustomPresent_data() { | ||
551 | 103 | QTest::addColumn<QVariantMap>("custom"); | ||
552 | 104 | |||
553 | 105 | QVariantMap first; | ||
554 | 106 | QVariantMap second; | ||
555 | 107 | |||
556 | 108 | first.insert("test1", "Testing"); | ||
557 | 109 | first.insert("test2", "Testing2"); | ||
558 | 110 | second.insert("test", "Test"); | ||
559 | 111 | |||
560 | 112 | QTest::newRow("First") << first; | ||
561 | 113 | QTest::newRow("Second") << second; | ||
562 | 114 | } | ||
563 | 115 | |||
564 | 116 | void | ||
565 | 117 | TestMetadata::testGetCustomPresent() { | ||
566 | 118 | QFETCH(QVariantMap, custom); | ||
567 | 119 | QScopedPointer<Metadata> metadata(new Metadata()); | ||
568 | 120 | metadata->setCustom(custom); | ||
569 | 121 | QCOMPARE(metadata->custom(), custom); | ||
570 | 122 | } | ||
571 | 123 | |||
572 | 73 | QTEST_MAIN(TestMetadata) | 124 | QTEST_MAIN(TestMetadata) |
573 | 74 | #include "moc_test_metadata.cpp" | 125 | #include "moc_test_metadata.cpp" |
574 | 75 | 126 | ||
575 | === modified file 'tests/downloads/qml/test_metadata.h' | |||
576 | --- tests/downloads/qml/test_metadata.h 2014-09-18 13:22:31 +0000 | |||
577 | +++ tests/downloads/qml/test_metadata.h 2016-07-12 13:11:29 +0000 | |||
578 | @@ -35,6 +35,12 @@ | |||
579 | 35 | void testGetShowInIndicatorEmpty(); | 35 | void testGetShowInIndicatorEmpty(); |
580 | 36 | void testGetShowInIndicatorPresent_data(); | 36 | void testGetShowInIndicatorPresent_data(); |
581 | 37 | void testGetShowInIndicatorPresent(); | 37 | void testGetShowInIndicatorPresent(); |
582 | 38 | void testGetCommandEmpty(); | ||
583 | 39 | void testGetCommandPresent_data(); | ||
584 | 40 | void testGetCommandPresent(); | ||
585 | 41 | void testGetCustomEmpty(); | ||
586 | 42 | void testGetCustomPresent_data(); | ||
587 | 43 | void testGetCustomPresent(); | ||
588 | 38 | }; | 44 | }; |
589 | 39 | 45 | ||
590 | 40 | #endif | 46 | #endif |
591 | 41 | 47 | ||
592 | === modified file 'tests/downloads/qml/test_single_download.cpp' | |||
593 | --- tests/downloads/qml/test_single_download.cpp 2014-09-18 13:22:31 +0000 | |||
594 | +++ tests/downloads/qml/test_single_download.cpp 2016-07-12 13:11:29 +0000 | |||
595 | @@ -429,5 +429,127 @@ | |||
596 | 429 | verifyMocks(); | 429 | verifyMocks(); |
597 | 430 | } | 430 | } |
598 | 431 | 431 | ||
599 | 432 | void | ||
600 | 433 | TestSingleDownload::testSetHashNullptr() { | ||
601 | 434 | QScopedPointer<TestableSingleDownload> singleDownload( | ||
602 | 435 | new TestableSingleDownload(nullptr, _man)); | ||
603 | 436 | |||
604 | 437 | singleDownload->setHash("c4e5f7fcbcef75924b2abde2b2e75f3f"); | ||
605 | 438 | // ensure that the mocks are not called and we do not crash | ||
606 | 439 | verifyMocks(); | ||
607 | 440 | } | ||
608 | 441 | |||
609 | 442 | void | ||
610 | 443 | TestSingleDownload::testSetHashError() { | ||
611 | 444 | QScopedPointer<MockError> err(new MockError(Error::DBus)); | ||
612 | 445 | QScopedPointer<TestableSingleDownload> singleDownload( | ||
613 | 446 | new TestableSingleDownload(_down, _man)); | ||
614 | 447 | |||
615 | 448 | EXPECT_CALL(*_down, setHash("c4e5f7fcbcef75924b2abde2b2e75f3f")) | ||
616 | 449 | .Times(1); | ||
617 | 450 | |||
618 | 451 | EXPECT_CALL(*_down, isError()) | ||
619 | 452 | .Times(1) | ||
620 | 453 | .WillOnce(Return(true)); | ||
621 | 454 | |||
622 | 455 | EXPECT_CALL(*_down, error()) | ||
623 | 456 | .Times(1) | ||
624 | 457 | .WillOnce(Return(err.data())); | ||
625 | 458 | |||
626 | 459 | EXPECT_CALL(*err.data(), errorString()) | ||
627 | 460 | .Times(1) | ||
628 | 461 | .WillOnce(Return(QString("My error"))); | ||
629 | 462 | |||
630 | 463 | // ensure that the diff signals are emitted | ||
631 | 464 | SignalBarrier spy(singleDownload.data(), SIGNAL(errorChanged())); | ||
632 | 465 | |||
633 | 466 | singleDownload->setHash("c4e5f7fcbcef75924b2abde2b2e75f3f"); | ||
634 | 467 | |||
635 | 468 | QVERIFY(spy.ensureSignalEmitted()); | ||
636 | 469 | verifyMocks(); | ||
637 | 470 | } | ||
638 | 471 | |||
639 | 472 | void | ||
640 | 473 | TestSingleDownload::testSetHashSuccess() { | ||
641 | 474 | QScopedPointer<TestableSingleDownload> singleDownload( | ||
642 | 475 | new TestableSingleDownload(_down, _man)); | ||
643 | 476 | |||
644 | 477 | EXPECT_CALL(*_down, setHash("c4e5f7fcbcef75924b2abde2b2e75f3f")) | ||
645 | 478 | .Times(1); | ||
646 | 479 | |||
647 | 480 | EXPECT_CALL(*_down, isError()) | ||
648 | 481 | .Times(1) | ||
649 | 482 | .WillOnce(Return(false)); | ||
650 | 483 | |||
651 | 484 | // ensure that the diff signals are emitted | ||
652 | 485 | SignalBarrier spy(singleDownload.data(), SIGNAL(hashChanged())); | ||
653 | 486 | |||
654 | 487 | singleDownload->setHash("c4e5f7fcbcef75924b2abde2b2e75f3f"); | ||
655 | 488 | |||
656 | 489 | QVERIFY(spy.ensureSignalEmitted()); | ||
657 | 490 | verifyMocks(); | ||
658 | 491 | } | ||
659 | 492 | |||
660 | 493 | void | ||
661 | 494 | TestSingleDownload::testSetAlgorithmNullptr() { | ||
662 | 495 | QScopedPointer<TestableSingleDownload> singleDownload( | ||
663 | 496 | new TestableSingleDownload(nullptr, _man)); | ||
664 | 497 | |||
665 | 498 | singleDownload->setAlgorithm("sha1"); | ||
666 | 499 | // ensure that the mocks are not called and we do not crash | ||
667 | 500 | verifyMocks(); | ||
668 | 501 | } | ||
669 | 502 | |||
670 | 503 | void | ||
671 | 504 | TestSingleDownload::testSetAlgorithmError() { | ||
672 | 505 | QScopedPointer<MockError> err(new MockError(Error::DBus)); | ||
673 | 506 | QScopedPointer<TestableSingleDownload> singleDownload( | ||
674 | 507 | new TestableSingleDownload(_down, _man)); | ||
675 | 508 | |||
676 | 509 | EXPECT_CALL(*_down, setAlgorithm("sha1")) | ||
677 | 510 | .Times(1); | ||
678 | 511 | |||
679 | 512 | EXPECT_CALL(*_down, isError()) | ||
680 | 513 | .Times(1) | ||
681 | 514 | .WillOnce(Return(true)); | ||
682 | 515 | |||
683 | 516 | EXPECT_CALL(*_down, error()) | ||
684 | 517 | .Times(1) | ||
685 | 518 | .WillOnce(Return(err.data())); | ||
686 | 519 | |||
687 | 520 | EXPECT_CALL(*err.data(), errorString()) | ||
688 | 521 | .Times(1) | ||
689 | 522 | .WillOnce(Return(QString("My error"))); | ||
690 | 523 | |||
691 | 524 | // ensure that the diff signals are emitted | ||
692 | 525 | SignalBarrier spy(singleDownload.data(), SIGNAL(errorChanged())); | ||
693 | 526 | |||
694 | 527 | singleDownload->setAlgorithm("sha1"); | ||
695 | 528 | |||
696 | 529 | QVERIFY(spy.ensureSignalEmitted()); | ||
697 | 530 | verifyMocks(); | ||
698 | 531 | } | ||
699 | 532 | |||
700 | 533 | void | ||
701 | 534 | TestSingleDownload::testSetAlgorithmSuccess() { | ||
702 | 535 | QScopedPointer<TestableSingleDownload> singleDownload( | ||
703 | 536 | new TestableSingleDownload(_down, _man)); | ||
704 | 537 | |||
705 | 538 | EXPECT_CALL(*_down, setAlgorithm("sha1")) | ||
706 | 539 | .Times(1); | ||
707 | 540 | |||
708 | 541 | EXPECT_CALL(*_down, isError()) | ||
709 | 542 | .Times(1) | ||
710 | 543 | .WillOnce(Return(false)); | ||
711 | 544 | |||
712 | 545 | // ensure that the diff signals are emitted | ||
713 | 546 | SignalBarrier spy(singleDownload.data(), SIGNAL(algorithmChanged())); | ||
714 | 547 | |||
715 | 548 | singleDownload->setAlgorithm("sha1"); | ||
716 | 549 | |||
717 | 550 | QVERIFY(spy.ensureSignalEmitted()); | ||
718 | 551 | verifyMocks(); | ||
719 | 552 | } | ||
720 | 553 | |||
721 | 432 | QTEST_MAIN(TestSingleDownload) | 554 | QTEST_MAIN(TestSingleDownload) |
722 | 433 | #include "moc_test_single_download.cpp" | 555 | #include "moc_test_single_download.cpp" |
723 | 434 | 556 | ||
724 | === modified file 'tests/downloads/qml/test_single_download.h' | |||
725 | --- tests/downloads/qml/test_single_download.h 2014-09-18 13:22:31 +0000 | |||
726 | +++ tests/downloads/qml/test_single_download.h 2016-07-12 13:11:29 +0000 | |||
727 | @@ -78,6 +78,12 @@ | |||
728 | 78 | void testSetMetadataToNullptr(); | 78 | void testSetMetadataToNullptr(); |
729 | 79 | void testSetMetadataError(); | 79 | void testSetMetadataError(); |
730 | 80 | void testSetMetadataSuccess(); | 80 | void testSetMetadataSuccess(); |
731 | 81 | void testSetHashNullptr(); | ||
732 | 82 | void testSetHashError(); | ||
733 | 83 | void testSetHashSuccess(); | ||
734 | 84 | void testSetAlgorithmNullptr(); | ||
735 | 85 | void testSetAlgorithmError(); | ||
736 | 86 | void testSetAlgorithmSuccess(); | ||
737 | 81 | 87 | ||
738 | 82 | private: | 88 | private: |
739 | 83 | void verifyMocks(); | 89 | void verifyMocks(); |
FAILED: Continuous integration, rev:362 jenkins. qa.ubuntu. com/job/ ubuntu- download- manager- ci/803/ jenkins. qa.ubuntu. com/job/ ubuntu- download- manager- wily-amd64- ci/34/console jenkins. qa.ubuntu. com/job/ ubuntu- download- manager- wily-armhf- ci/33/console
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/ubuntu- download- manager- ci/803/ rebuild
http://