Merge lp:~michihenning/storage-framework/more-tests into lp:storage-framework/devel

Proposed by Michi Henning
Status: Merged
Approved by: James Henstridge
Approved revision: 89
Merged at revision: 73
Proposed branch: lp:~michihenning/storage-framework/more-tests
Merge into: lp:storage-framework/devel
Prerequisite: lp:~michihenning/storage-framework/api2
Diff against target: 1420 lines (+796/-151)
18 files modified
include/unity/storage/qt/Account.h (+1/-1)
include/unity/storage/qt/Item.h (+1/-1)
include/unity/storage/qt/VoidJob.h (+20/-4)
include/unity/storage/qt/internal/AccountImpl.h (+1/-1)
include/unity/storage/qt/internal/ItemImpl.h (+2/-1)
include/unity/storage/qt/internal/ItemJobImpl.h (+4/-4)
include/unity/storage/qt/internal/ItemListJobImpl.h (+3/-3)
include/unity/storage/qt/internal/VoidJobImpl.h (+69/-0)
src/qt/CMakeLists.txt (+4/-0)
src/qt/VoidJob.cpp (+57/-0)
src/qt/internal/AccountImpl.cpp (+16/-7)
src/qt/internal/ItemImpl.cpp (+23/-19)
src/qt/internal/ItemJobImpl.cpp (+12/-1)
src/qt/internal/ItemListJobImpl.cpp (+11/-0)
src/qt/internal/RuntimeImpl.cpp (+2/-0)
src/qt/internal/VoidJobImpl.cpp (+117/-0)
tests/remote-client/MockProvider.cpp (+32/-2)
tests/remote-client/remote-client_test.cpp (+421/-107)
To merge this branch: bzr merge lp:~michihenning/storage-framework/more-tests
Reviewer Review Type Date Requested Status
James Henstridge Approve
unity-api-1-bot continuous-integration Approve
Review via email: mp+306744@code.launchpad.net

Commit message

Added VoidJob.
Implemeted get().
Implemeted deleteItem().
Some minor refactoring and tidy-up.
Lots more tests.

Description of the change

Added VoidJob.
Implemeted get().
Implemeted deleteItem().
Some minor refactoring and tidy-up.
Lots more tests.

To post a comment you must log in.
Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :
review: Needs Fixing (continuous-integration)
88. By Michi Henning

Fixed whitespace.

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:88
https://jenkins.canonical.com/unity-api-1/job/lp-storage-framework-ci/129/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/771
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/777
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/585
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/585/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/585
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/585/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/585
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/585/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/585
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/585/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/585
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/585/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/585
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/585/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/585
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/585/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/585
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/585/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/585
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/585/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-storage-framework-ci/129/rebuild

review: Approve (continuous-integration)
Revision history for this message
James Henstridge (jamesh) wrote :

Just a few minor issues that I've included as inline comments.

review: Needs Fixing
89. By Michi Henning

Review comments from James.

Revision history for this message
Michi Henning (michihenning) wrote :

Thanks for the review!

I'll go and make the corresponding changes in the follow-up branches.

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:89
https://jenkins.canonical.com/unity-api-1/job/lp-storage-framework-ci/135/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/805
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/811
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/617
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/617/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/617
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/617/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/617
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/617/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/617
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/617/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/617
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/617/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/617
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/617/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/617
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/617/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/617
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/617/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/617
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/617/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-storage-framework-ci/135/rebuild

review: Approve (continuous-integration)
Revision history for this message
James Henstridge (jamesh) wrote :

Looks good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'include/unity/storage/qt/Account.h'
--- include/unity/storage/qt/Account.h 2016-09-26 02:12:30 +0000
+++ include/unity/storage/qt/Account.h 2016-09-29 13:09:41 +0000
@@ -94,7 +94,7 @@
9494
95template<> struct Q_DECL_EXPORT hash<unity::storage::qt::Account>95template<> struct Q_DECL_EXPORT hash<unity::storage::qt::Account>
96{96{
97 std::size_t operator()(unity::storage::qt::Account const& a)97 std::size_t operator()(unity::storage::qt::Account const& a) const
98 {98 {
99 return a.hash();99 return a.hash();
100 }100 }
101101
=== modified file 'include/unity/storage/qt/Item.h'
--- include/unity/storage/qt/Item.h 2016-09-26 02:12:30 +0000
+++ include/unity/storage/qt/Item.h 2016-09-29 13:09:41 +0000
@@ -146,7 +146,7 @@
146146
147template<> struct Q_DECL_EXPORT hash<unity::storage::qt::Item>147template<> struct Q_DECL_EXPORT hash<unity::storage::qt::Item>
148{148{
149 std::size_t operator()(unity::storage::qt::Item const& i)149 std::size_t operator()(unity::storage::qt::Item const& i) const
150 {150 {
151 return i.hash();151 return i.hash();
152 }152 }
153153
=== modified file 'include/unity/storage/qt/VoidJob.h'
--- include/unity/storage/qt/VoidJob.h 2016-09-20 23:52:45 +0000
+++ include/unity/storage/qt/VoidJob.h 2016-09-29 13:09:41 +0000
@@ -20,22 +20,29 @@
2020
21#include <QObject>21#include <QObject>
2222
23#include <memory>
24
23namespace unity25namespace unity
24{26{
25namespace storage27namespace storage
26{28{
27namespace qt29namespace qt
28{30{
31namespace internal
32{
33
34class VoidJobImpl;
35
36} // namespace internal
2937
30class StorageError;38class StorageError;
3139
32class Q_DECL_EXPORT VoidJob final : public QObject40class Q_DECL_EXPORT VoidJob final : public QObject
33{41{
34 // TODO: notify, CONSTANT where needed
35 Q_OBJECT42 Q_OBJECT
36 Q_PROPERTY(bool READ isValid FINAL)43 Q_PROPERTY(bool isValid READ isValid NOTIFY statusChanged FINAL)
37 Q_PROPERTY(unity::storage::qt::VoidJob::Status READ status NOTIFY statusChanged FINAL)44 Q_PROPERTY(unity::storage::qt::VoidJob::Status status READ status NOTIFY statusChanged FINAL)
38 Q_PROPERTY(unity::storage::qt::StorageError READ error FINAL)45 Q_PROPERTY(unity::storage::qt::StorageError error READ error NOTIFY statusChanged FINAL)
3946
40public:47public:
41 virtual ~VoidJob();48 virtual ~VoidJob();
@@ -49,8 +56,17 @@
4956
50Q_SIGNALS:57Q_SIGNALS:
51 void statusChanged(unity::storage::qt::VoidJob::Status status) const;58 void statusChanged(unity::storage::qt::VoidJob::Status status) const;
59
60private:
61 VoidJob(std::unique_ptr<internal::VoidJobImpl> p);
62
63 std::unique_ptr<internal::VoidJobImpl> const p_;
64
65 friend class internal::VoidJobImpl;
52};66};
5367
54} // namespace qt68} // namespace qt
55} // namespace storage69} // namespace storage
56} // namespace unity70} // namespace unity
71
72Q_DECLARE_METATYPE(unity::storage::qt::VoidJob::Status)
5773
=== modified file 'include/unity/storage/qt/internal/AccountImpl.h'
--- include/unity/storage/qt/internal/AccountImpl.h 2016-09-20 02:24:36 +0000
+++ include/unity/storage/qt/internal/AccountImpl.h 2016-09-29 13:09:41 +0000
@@ -63,7 +63,7 @@
6363
64 size_t hash() const;64 size_t hash() const;
6565
66 //std::shared_ptr<RuntimeImpl> runtime() const;66 std::shared_ptr<RuntimeImpl> runtime() const;
67 std::shared_ptr<ProviderInterface> provider() const;67 std::shared_ptr<ProviderInterface> provider() const;
6868
69 static Account make_account(std::shared_ptr<RuntimeImpl> const& runtime,69 static Account make_account(std::shared_ptr<RuntimeImpl> const& runtime,
7070
=== modified file 'include/unity/storage/qt/internal/ItemImpl.h'
--- include/unity/storage/qt/internal/ItemImpl.h 2016-09-26 02:12:30 +0000
+++ include/unity/storage/qt/internal/ItemImpl.h 2016-09-29 13:09:41 +0000
@@ -49,7 +49,6 @@
49 QString itemId() const;49 QString itemId() const;
50 QString name() const;50 QString name() const;
51 Account account() const;51 Account account() const;
52 //Item root() const;
53 QString etag() const;52 QString etag() const;
54 Item::Type type() const;53 Item::Type type() const;
55 QVariantMap metadata() const;54 QVariantMap metadata() const;
@@ -82,6 +81,8 @@
82 storage::internal::ItemMetadata const& md,81 storage::internal::ItemMetadata const& md,
83 std::shared_ptr<AccountImpl> const& account);82 std::shared_ptr<AccountImpl> const& account);
8483
84 std::shared_ptr<RuntimeImpl> runtime() const;
85
85private:86private:
86 //std::shared_ptr<RuntimeImpl> get_runtime(QString const& method) const;87 //std::shared_ptr<RuntimeImpl> get_runtime(QString const& method) const;
8788
8889
=== modified file 'include/unity/storage/qt/internal/ItemJobImpl.h'
--- include/unity/storage/qt/internal/ItemJobImpl.h 2016-09-26 02:12:30 +0000
+++ include/unity/storage/qt/internal/ItemJobImpl.h 2016-09-29 13:09:41 +0000
@@ -20,10 +20,10 @@
2020
21#include <unity/storage/qt/ItemJob.h>21#include <unity/storage/qt/ItemJob.h>
2222
23#include <unity/storage/qt/Account.h>
24#include <unity/storage/qt/internal/Handler.h>
25#include <unity/storage/qt/StorageError.h>23#include <unity/storage/qt/StorageError.h>
2624
25#include <QDBusPendingReply>
26
27namespace unity27namespace unity
28{28{
29namespace storage29namespace storage
@@ -33,14 +33,14 @@
3333
34class ItemMetadata;34class ItemMetadata;
3535
36}36} // namespace internal
3737
38namespace qt38namespace qt
39{39{
40namespace internal40namespace internal
41{41{
4242
43class RuntimeImpl;43class AccountImpl;
4444
45class ItemJobImpl : public QObject45class ItemJobImpl : public QObject
46{46{
4747
=== modified file 'include/unity/storage/qt/internal/ItemListJobImpl.h'
--- include/unity/storage/qt/internal/ItemListJobImpl.h 2016-09-26 02:12:30 +0000
+++ include/unity/storage/qt/internal/ItemListJobImpl.h 2016-09-29 13:09:41 +0000
@@ -20,10 +20,10 @@
2020
21#include <unity/storage/qt/ItemListJob.h>21#include <unity/storage/qt/ItemListJob.h>
2222
23#include <unity/storage/qt/Account.h>
24#include <unity/storage/qt/internal/Handler.h>
25#include <unity/storage/qt/StorageError.h>23#include <unity/storage/qt/StorageError.h>
2624
25#include <QDBusPendingReply>
26
27namespace unity27namespace unity
28{28{
29namespace storage29namespace storage
@@ -40,7 +40,7 @@
40namespace internal40namespace internal
41{41{
4242
43class RuntimeImpl;43class AccountImpl;
4444
45class ItemListJobImpl : public QObject45class ItemListJobImpl : public QObject
46{46{
4747
=== added file 'include/unity/storage/qt/internal/VoidJobImpl.h'
--- include/unity/storage/qt/internal/VoidJobImpl.h 1970-01-01 00:00:00 +0000
+++ include/unity/storage/qt/internal/VoidJobImpl.h 2016-09-29 13:09:41 +0000
@@ -0,0 +1,69 @@
1/*
2 * Copyright (C) 2016 Canonical Ltd
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License version 3 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authors: Michi Henning <michi.henning@canonical.com>
17 */
18
19#pragma once
20
21#include <unity/storage/qt/VoidJob.h>
22
23#include <unity/storage/qt/StorageError.h>
24
25#include <QDBusPendingReply>
26
27namespace unity
28{
29namespace storage
30{
31namespace qt
32{
33namespace internal
34{
35
36class ItemImpl;
37
38class VoidJobImpl : public QObject
39{
40 Q_OBJECT
41public:
42 virtual ~VoidJobImpl() = default;
43
44 bool isValid() const;
45 VoidJob::Status status() const;
46 StorageError error() const;
47
48 static VoidJob* make_void_job(std::shared_ptr<ItemImpl> const& item,
49 QString const& method,
50 QDBusPendingReply<void> const& reply);
51 static VoidJob* make_void_job(StorageError const& e);
52
53private:
54 VoidJobImpl(std::shared_ptr<ItemImpl> const& item,
55 QString const& method,
56 QDBusPendingReply<void> const& reply);
57 VoidJobImpl(StorageError const& e);
58
59 VoidJob* public_instance_;
60 VoidJob::Status status_;
61 StorageError error_;
62 QString method_;
63 std::shared_ptr<ItemImpl> item_;
64};
65
66} // namespace internal
67} // namespace qt
68} // namespace storage
69} // namespace unity
070
=== modified file 'src/qt/CMakeLists.txt'
--- src/qt/CMakeLists.txt 2016-09-16 06:25:08 +0000
+++ src/qt/CMakeLists.txt 2016-09-29 13:09:41 +0000
@@ -23,6 +23,7 @@
23 ItemListJob.cpp23 ItemListJob.cpp
24 Runtime.cpp24 Runtime.cpp
25 StorageError.cpp25 StorageError.cpp
26 VoidJob.cpp
26 internal/AccountImpl.cpp27 internal/AccountImpl.cpp
27 internal/AccountsJobImpl.cpp28 internal/AccountsJobImpl.cpp
28 internal/HandlerBase.cpp29 internal/HandlerBase.cpp
@@ -33,16 +34,19 @@
33 internal/StorageErrorImpl.cpp34 internal/StorageErrorImpl.cpp
34 internal/unmarshal_error.cpp35 internal/unmarshal_error.cpp
35 internal/validate.cpp36 internal/validate.cpp
37 internal/VoidJobImpl.cpp
36 ${generated_files}38 ${generated_files}
37 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/AccountsJob.h39 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/AccountsJob.h
38 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/Item.h40 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/Item.h
39 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/ItemJob.h41 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/ItemJob.h
40 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/ItemListJob.h42 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/ItemListJob.h
41 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/Runtime.h43 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/Runtime.h
44 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/VoidJob.h
42 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/internal/AccountsJobImpl.h45 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/internal/AccountsJobImpl.h
43 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/internal/HandlerBase.h46 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/internal/HandlerBase.h
44 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/internal/ItemJobImpl.h47 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/internal/ItemJobImpl.h
45 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/internal/ItemListJobImpl.h48 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/internal/ItemListJobImpl.h
49 ${CMAKE_SOURCE_DIR}/include/unity/storage/qt/internal/VoidJobImpl.h
46)50)
4751
48add_library(storage-framework-qt-client-v2 SHARED52add_library(storage-framework-qt-client-v2 SHARED
4953
=== added file 'src/qt/VoidJob.cpp'
--- src/qt/VoidJob.cpp 1970-01-01 00:00:00 +0000
+++ src/qt/VoidJob.cpp 2016-09-29 13:09:41 +0000
@@ -0,0 +1,57 @@
1/*
2 * Copyright (C) 2016 Canonical Ltd
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License version 3 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authors: Michi Henning <michi.henning@canonical.com>
17 */
18
19#include <unity/storage/qt/VoidJob.h>
20
21#include <unity/storage/qt/internal/VoidJobImpl.h>
22
23using namespace unity::storage::qt;
24using namespace std;
25
26namespace unity
27{
28namespace storage
29{
30namespace qt
31{
32
33VoidJob::VoidJob(unique_ptr<internal::VoidJobImpl> p)
34 : p_(move(p))
35{
36}
37
38VoidJob::~VoidJob() = default;
39
40bool VoidJob::isValid() const
41{
42 return p_->isValid();
43}
44
45VoidJob::Status VoidJob::status() const
46{
47 return p_->status();
48}
49
50StorageError VoidJob::error() const
51{
52 return p_->error();
53}
54
55} // namespace qt
56} // namespace storage
57} // namespace unity
058
=== modified file 'src/qt/internal/AccountImpl.cpp'
--- src/qt/internal/AccountImpl.cpp 2016-09-22 01:52:20 +0000
+++ src/qt/internal/AccountImpl.cpp 2016-09-29 13:09:41 +0000
@@ -24,6 +24,7 @@
24#include <unity/storage/qt/internal/ItemJobImpl.h>24#include <unity/storage/qt/internal/ItemJobImpl.h>
25#include <unity/storage/qt/internal/ItemListJobImpl.h>25#include <unity/storage/qt/internal/ItemListJobImpl.h>
26#include <unity/storage/qt/internal/RuntimeImpl.h>26#include <unity/storage/qt/internal/RuntimeImpl.h>
27#include <unity/storage/qt/internal/StorageErrorImpl.h>
27#include <unity/storage/qt/Runtime.h>28#include <unity/storage/qt/Runtime.h>
2829
29#include <boost/functional/hash.hpp>30#include <boost/functional/hash.hpp>
@@ -82,24 +83,25 @@
8283
83ItemListJob* AccountImpl::roots() const84ItemListJob* AccountImpl::roots() const
84{85{
86 QString const method = "Account::roots()";
87
85 auto runtime = runtime_.lock();88 auto runtime = runtime_.lock();
86 if (!runtime || !runtime->isValid())89 if (!runtime || !runtime->isValid())
87 {90 {
88 auto e = StorageErrorImpl::runtime_destroyed_error("Account::roots(): Runtime was destroyed previously");91 auto e = StorageErrorImpl::runtime_destroyed_error(method + ": Runtime was destroyed previously");
89 return ItemListJobImpl::make_item_list_job(e);92 return ItemListJobImpl::make_item_list_job(e);
90 }93 }
9194
92 auto validate = [](storage::internal::ItemMetadata const& md)95 auto validate = [method](storage::internal::ItemMetadata const& md)
93 {96 {
94 if (md.type != ItemType::root)97 if (md.type != ItemType::root)
95 {98 {
96 QString msg = "provider returned non-root item type: " + QString::number(int(md.type));99 QString msg = method + ": provider returned non-root item type: " + QString::number(int(md.type));
97 qCritical() << msg;100 qCritical() << msg;
98 throw StorageErrorImpl::local_comms_error(msg);101 throw StorageErrorImpl::local_comms_error(msg);
99 }102 }
100 };103 };
101104
102 QString method = "Account::roots()";
103 auto reply = provider_->Roots();105 auto reply = provider_->Roots();
104 auto This = const_pointer_cast<AccountImpl>(shared_from_this());106 auto This = const_pointer_cast<AccountImpl>(shared_from_this());
105 return ItemListJobImpl::make_item_list_job(This, method, reply, validate);107 return ItemListJobImpl::make_item_list_job(This, method, reply, validate);
@@ -107,19 +109,21 @@
107109
108ItemJob* AccountImpl::get(QString const& itemId) const110ItemJob* AccountImpl::get(QString const& itemId) const
109{111{
112 QString const method = "Account::get()";
113
110 auto runtime = runtime_.lock();114 auto runtime = runtime_.lock();
111 if (!runtime || !runtime->isValid())115 if (!runtime || !runtime->isValid())
112 {116 {
113 auto e = StorageErrorImpl::runtime_destroyed_error("Account::get(): Runtime was destroyed previously");117 auto e = StorageErrorImpl::runtime_destroyed_error(method + ": Runtime was destroyed previously");
114 return ItemJobImpl::make_item_job(e);118 return ItemJobImpl::make_item_job(e);
115 }119 }
116120
117 // TODO: use defaulted param?121 // LCOV_EXCL_START
118 auto validate = [](storage::internal::ItemMetadata const&)122 auto validate = [](storage::internal::ItemMetadata const&)
119 {123 {
120 };124 };
125 // LCOV_EXCL_STOP
121126
122 QString method = "Item::get()";
123 auto reply = provider_->Metadata(itemId);127 auto reply = provider_->Metadata(itemId);
124 auto This = const_pointer_cast<AccountImpl>(shared_from_this());128 auto This = const_pointer_cast<AccountImpl>(shared_from_this());
125 return ItemJobImpl::make_item_job(This, method, reply, validate);129 return ItemJobImpl::make_item_job(This, method, reply, validate);
@@ -187,6 +191,11 @@
187 return !operator<(other);191 return !operator<(other);
188}192}
189193
194shared_ptr<RuntimeImpl> AccountImpl::runtime() const
195{
196 return runtime_.lock();
197}
198
190shared_ptr<ProviderInterface> AccountImpl::provider() const199shared_ptr<ProviderInterface> AccountImpl::provider() const
191{200{
192 return provider_;201 return provider_;
193202
=== modified file 'src/qt/internal/ItemImpl.cpp'
--- src/qt/internal/ItemImpl.cpp 2016-09-26 02:12:30 +0000
+++ src/qt/internal/ItemImpl.cpp 2016-09-29 13:09:41 +0000
@@ -23,6 +23,8 @@
23#include <unity/storage/qt/internal/AccountImpl.h>23#include <unity/storage/qt/internal/AccountImpl.h>
24#include <unity/storage/qt/internal/ItemJobImpl.h>24#include <unity/storage/qt/internal/ItemJobImpl.h>
25#include <unity/storage/qt/internal/RuntimeImpl.h>25#include <unity/storage/qt/internal/RuntimeImpl.h>
26#include <unity/storage/qt/internal/StorageErrorImpl.h>
27#include <unity/storage/qt/internal/VoidJobImpl.h>
26#include <unity/storage/qt/internal/validate.h>28#include <unity/storage/qt/internal/validate.h>
2729
28#include <boost/functional/hash.hpp>30#include <boost/functional/hash.hpp>
@@ -70,13 +72,6 @@
70 return is_valid_ ? account_ : Account();72 return is_valid_ ? account_ : Account();
71}73}
7274
73#if 0
74Item ItemImpl::root() const
75{
76 return is_valid_ ? root_ : Item();
77}
78#endif
79
80QString ItemImpl::etag() const75QString ItemImpl::etag() const
81{76{
82 return is_valid_ ? md_.etag : "";77 return is_valid_ ? md_.etag : "";
@@ -131,7 +126,25 @@
131126
132VoidJob* ItemImpl::deleteItem() const127VoidJob* ItemImpl::deleteItem() const
133{128{
134 return nullptr; // TODO129 QString const method = "Item::deleteItem()";
130
131 assert(account_);
132 auto runtime = account_->runtime();
133 if (!runtime || !runtime->isValid())
134 {
135 auto e = StorageErrorImpl::runtime_destroyed_error(method + ": Runtime was destroyed previously");
136 return VoidJobImpl::make_void_job(e);
137 }
138
139 if (md_.type == storage::ItemType::root)
140 {
141 auto e = StorageErrorImpl::logic_error(method + ": cannot delete root");
142 return VoidJobImpl::make_void_job(e);
143 }
144
145 auto reply = account_->provider()->Delete(md_.item_id);
146 auto This = const_pointer_cast<ItemImpl>(shared_from_this());
147 return VoidJobImpl::make_void_job(This, method, reply);
135}148}
136149
137Uploader* ItemImpl::createUploader(Item::ConflictPolicy policy, qint64 sizeInBytes) const150Uploader* ItemImpl::createUploader(Item::ConflictPolicy policy, qint64 sizeInBytes) const
@@ -248,19 +261,10 @@
248 return Item(p);261 return Item(p);
249}262}
250263
251#if 0264shared_ptr<RuntimeImpl> ItemImpl::runtime() const
252shared_ptr<RuntimeImpl> ItemImpl::get_runtime(QString const& method) const
253{265{
254 auto runtime = account_->runtime_.lock();266 return account_->runtime();
255 if (!runtime || !runtime->isValid())
256 {
257 QString msg = method + ": Runtime was destroyed previously";
258 auto This = const_cast<ItemImpl*>(this);
259 This->error_ = StorageErrorImpl::runtime_destroyed_error(msg);
260 }
261 return runtime;
262}267}
263#endif
264268
265} // namespace internal269} // namespace internal
266} // namespace qt270} // namespace qt
267271
=== modified file 'src/qt/internal/ItemJobImpl.cpp'
--- src/qt/internal/ItemJobImpl.cpp 2016-09-26 02:12:30 +0000
+++ src/qt/internal/ItemJobImpl.cpp 2016-09-29 13:09:41 +0000
@@ -20,8 +20,10 @@
2020
21#include <unity/storage/internal/dbusmarshal.h>21#include <unity/storage/internal/dbusmarshal.h>
22#include <unity/storage/internal/ItemMetadata.h>22#include <unity/storage/internal/ItemMetadata.h>
23#include <unity/storage/qt/internal/AccountImpl.h>
23#include <unity/storage/qt/internal/Handler.h>24#include <unity/storage/qt/internal/Handler.h>
24#include <unity/storage/qt/internal/ItemImpl.h>25#include <unity/storage/qt/internal/ItemImpl.h>
26#include <unity/storage/qt/internal/RuntimeImpl.h>
2527
26using namespace std;28using namespace std;
2729
@@ -49,6 +51,15 @@
4951
50 auto process_reply = [this](decltype(reply)& r)52 auto process_reply = [this](decltype(reply)& r)
51 {53 {
54 auto runtime = account_->runtime();
55 if (!runtime || !runtime->isValid())
56 {
57 error_ = StorageErrorImpl::runtime_destroyed_error(method_ + ": Runtime was destroyed previously");
58 status_ = ItemJob::Error;
59 Q_EMIT public_instance_->statusChanged(status_);
60 return;
61 }
62
52 auto metadata = r.value();63 auto metadata = r.value();
53 try64 try
54 {65 {
@@ -98,7 +109,7 @@
98109
99Item ItemJobImpl::item() const110Item ItemJobImpl::item() const
100{111{
101 return Item(); // TODO112 return item_;
102}113}
103114
104ItemJob* ItemJobImpl::make_item_job(shared_ptr<AccountImpl> const& account,115ItemJob* ItemJobImpl::make_item_job(shared_ptr<AccountImpl> const& account,
105116
=== modified file 'src/qt/internal/ItemListJobImpl.cpp'
--- src/qt/internal/ItemListJobImpl.cpp 2016-09-26 02:12:30 +0000
+++ src/qt/internal/ItemListJobImpl.cpp 2016-09-29 13:09:41 +0000
@@ -20,8 +20,10 @@
2020
21#include <unity/storage/internal/dbusmarshal.h>21#include <unity/storage/internal/dbusmarshal.h>
22#include <unity/storage/internal/ItemMetadata.h>22#include <unity/storage/internal/ItemMetadata.h>
23#include <unity/storage/qt/internal/AccountImpl.h>
23#include <unity/storage/qt/internal/Handler.h>24#include <unity/storage/qt/internal/Handler.h>
24#include <unity/storage/qt/internal/ItemImpl.h>25#include <unity/storage/qt/internal/ItemImpl.h>
26#include <unity/storage/qt/internal/RuntimeImpl.h>
2527
26using namespace std;28using namespace std;
2729
@@ -49,6 +51,15 @@
4951
50 auto process_reply = [this](decltype(reply)& r)52 auto process_reply = [this](decltype(reply)& r)
51 {53 {
54 auto runtime = account_->runtime();
55 if (!runtime || !runtime->isValid())
56 {
57 error_ = StorageErrorImpl::runtime_destroyed_error(method_ + ": Runtime was destroyed previously");
58 status_ = ItemListJob::Error;
59 Q_EMIT public_instance_->statusChanged(status_);
60 return;
61 }
62
52 QList<Item> items;63 QList<Item> items;
53 auto metadata = r.value();64 auto metadata = r.value();
54 for (auto const& md : metadata)65 for (auto const& md : metadata)
5566
=== modified file 'src/qt/internal/RuntimeImpl.cpp'
--- src/qt/internal/RuntimeImpl.cpp 2016-09-26 02:12:30 +0000
+++ src/qt/internal/RuntimeImpl.cpp 2016-09-29 13:09:41 +0000
@@ -26,6 +26,7 @@
26#include <unity/storage/qt/ItemJob.h>26#include <unity/storage/qt/ItemJob.h>
27#include <unity/storage/qt/ItemListJob.h>27#include <unity/storage/qt/ItemListJob.h>
28#include <unity/storage/qt/Runtime.h>28#include <unity/storage/qt/Runtime.h>
29#include <unity/storage/qt/VoidJob.h>
2930
30#include <QDBusError>31#include <QDBusError>
31#include <QDBusMetaType>32#include <QDBusMetaType>
@@ -50,6 +51,7 @@
50 qRegisterMetaType<QList<unity::storage::qt::Item>>();51 qRegisterMetaType<QList<unity::storage::qt::Item>>();
51 qRegisterMetaType<unity::storage::qt::ItemJob::Status>();52 qRegisterMetaType<unity::storage::qt::ItemJob::Status>();
52 qRegisterMetaType<unity::storage::qt::ItemListJob::Status>();53 qRegisterMetaType<unity::storage::qt::ItemListJob::Status>();
54 qRegisterMetaType<unity::storage::qt::VoidJob::Status>();
5355
54 qDBusRegisterMetaType<unity::storage::internal::ItemMetadata>();56 qDBusRegisterMetaType<unity::storage::internal::ItemMetadata>();
55 qDBusRegisterMetaType<QList<unity::storage::internal::ItemMetadata>>();57 qDBusRegisterMetaType<QList<unity::storage::internal::ItemMetadata>>();
5658
=== added file 'src/qt/internal/VoidJobImpl.cpp'
--- src/qt/internal/VoidJobImpl.cpp 1970-01-01 00:00:00 +0000
+++ src/qt/internal/VoidJobImpl.cpp 2016-09-29 13:09:41 +0000
@@ -0,0 +1,117 @@
1/*
2 * Copyright (C) 2016 Canonical Ltd
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License version 3 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authors: Michi Henning <michi.henning@canonical.com>
17 */
18
19#include <unity/storage/qt/internal/VoidJobImpl.h>
20
21#include <unity/storage/qt/internal/Handler.h>
22#include <unity/storage/qt/internal/ItemImpl.h>
23#include <unity/storage/qt/internal/RuntimeImpl.h>
24
25using namespace std;
26
27namespace unity
28{
29namespace storage
30{
31namespace qt
32{
33namespace internal
34{
35
36VoidJobImpl::VoidJobImpl(shared_ptr<ItemImpl> const& item,
37 QString const& method,
38 QDBusPendingReply<void> const& reply)
39 : status_(VoidJob::Loading)
40 , method_(method)
41 , item_(item)
42{
43 assert(!method_.isEmpty());
44 assert(item);
45
46 auto process_reply = [this](decltype(reply)&)
47 {
48 auto runtime = item_->runtime();
49 if (!runtime || !runtime->isValid())
50 {
51 error_ = StorageErrorImpl::runtime_destroyed_error(method_ + ": Runtime was destroyed previously");
52 status_ = VoidJob::Error;
53 Q_EMIT public_instance_->statusChanged(status_);
54 return;
55 }
56
57 status_ = VoidJob::Finished;
58 Q_EMIT public_instance_->statusChanged(status_);
59 };
60
61 auto process_error = [this](StorageError const& error)
62 {
63 error_ = error;
64 status_ = VoidJob::Error;
65 Q_EMIT public_instance_->statusChanged(status_);
66 };
67
68 new Handler<void>(this, reply, process_reply, process_error);
69}
70
71VoidJobImpl::VoidJobImpl(StorageError const& error)
72 : status_(VoidJob::Error)
73 , error_(error)
74{
75}
76
77bool VoidJobImpl::isValid() const
78{
79 return status_ != VoidJob::Status::Error;
80}
81
82VoidJob::Status VoidJobImpl::status() const
83{
84 return status_;
85}
86
87StorageError VoidJobImpl::error() const
88{
89 return error_;
90}
91
92VoidJob* VoidJobImpl::make_void_job(shared_ptr<ItemImpl> const& item,
93 QString const& method,
94 QDBusPendingReply<void> const& reply)
95{
96 unique_ptr<VoidJobImpl> impl(new VoidJobImpl(item, method, reply));
97 auto job = new VoidJob(move(impl));
98 job->p_->public_instance_ = job;
99 return job;
100}
101
102VoidJob* VoidJobImpl::make_void_job(StorageError const& error)
103{
104 unique_ptr<VoidJobImpl> impl(new VoidJobImpl(error));
105 auto job = new VoidJob(move(impl));
106 job->p_->public_instance_ = job;
107 QMetaObject::invokeMethod(job,
108 "statusChanged",
109 Qt::QueuedConnection,
110 Q_ARG(unity::storage::qt::VoidJob::Status, job->p_->status_));
111 return job;
112}
113
114} // namespace internal
115} // namespace qt
116} // namespace storage
117} // namespace unity
0118
=== modified file 'tests/remote-client/MockProvider.cpp'
--- tests/remote-client/MockProvider.cpp 2016-09-16 06:25:08 +0000
+++ tests/remote-client/MockProvider.cpp 2016-09-29 13:09:41 +0000
@@ -46,7 +46,19 @@
4646
47boost::future<ItemList> MockProvider::roots(Context const&)47boost::future<ItemList> MockProvider::roots(Context const&)
48{48{
49 cerr << "roots CALLED" << endl;49 if (cmd_ == "slow_roots")
50 {
51 this_thread::sleep_for(chrono::seconds(1));
52 }
53 if (cmd_ == "not_a_root")
54 {
55 ItemList roots =
56 {
57 {"root_id", {}, "Root", "etag", ItemType::file, {}}
58 };
59 return make_ready_future<ItemList>(roots);
60 }
61
50 ItemList roots =62 ItemList roots =
51 {63 {
52 {"root_id", {}, "Root", "etag", ItemType::root, {}}64 {"root_id", {}, "Root", "etag", ItemType::root, {}}
@@ -103,6 +115,15 @@
103115
104boost::future<Item> MockProvider::metadata(string const& item_id, Context const&)116boost::future<Item> MockProvider::metadata(string const& item_id, Context const&)
105{117{
118 if (cmd_ == "slow_metadata")
119 {
120 this_thread::sleep_for(chrono::seconds(1));
121 }
122 if (cmd_ == "empty_id")
123 {
124 Item metadata{"", {}, "Root", "etag", ItemType::root, {}};
125 return make_ready_future<Item>(metadata);
126 }
106 if (item_id == "root_id")127 if (item_id == "root_id")
107 {128 {
108 Item metadata{"root_id", {}, "Root", "etag", ItemType::root, {}};129 Item metadata{"root_id", {}, "Root", "etag", ItemType::root, {}};
@@ -168,8 +189,17 @@
168}189}
169190
170boost::future<void> MockProvider::delete_item(191boost::future<void> MockProvider::delete_item(
171 string const&, Context const&)192 string const& item_id, Context const&)
172{193{
194 if (cmd_ == "slow_delete")
195 {
196 this_thread::sleep_for(chrono::seconds(1));
197 }
198 if (cmd_ == "delete_no_such_item")
199 {
200 string msg = "delete_item(): no such item: " + item_id;
201 return make_exceptional_future<void>(NotExistsException(msg, item_id));
202 }
173 return make_ready_future();203 return make_ready_future();
174}204}
175205
176206
=== modified file 'tests/remote-client/remote-client_test.cpp'
--- tests/remote-client/remote-client_test.cpp 2016-09-26 02:37:03 +0000
+++ tests/remote-client/remote-client_test.cpp 2016-09-29 13:09:41 +0000
@@ -24,6 +24,8 @@
24#include <gtest/gtest.h>24#include <gtest/gtest.h>
25#include <QSignalSpy>25#include <QSignalSpy>
2626
27#include <unordered_set>
28
27using namespace unity::storage;29using namespace unity::storage;
28using namespace unity::storage::qt;30using namespace unity::storage::qt;
29using namespace std;31using namespace std;
@@ -52,10 +54,12 @@
52 Account acc_;54 Account acc_;
53};55};
5456
55class RuntimeTest : public ProviderFixture {};
56class AccountTest : public RemoteClientTest {};57class AccountTest : public RemoteClientTest {};
58class DeleteTest : public RemoteClientTest {};
59class GetTest : public RemoteClientTest {};
60class ItemTest : public RemoteClientTest {};
57class RootsTest : public RemoteClientTest {};61class RootsTest : public RemoteClientTest {};
58class ItemTest : public RemoteClientTest {};62class RuntimeTest : public ProviderFixture {};
5963
60TEST(Runtime, lifecycle)64TEST(Runtime, lifecycle)
61{65{
@@ -75,6 +79,7 @@
75}79}
7680
77#if 081#if 0
82// TODO, how to test this?
78TEST_F(RuntimeTest, init_error)83TEST_F(RuntimeTest, init_error)
79{84{
80 QDBusConnection conn(connection());85 QDBusConnection conn(connection());
@@ -299,9 +304,12 @@
299304
300TEST_F(AccountTest, hash)305TEST_F(AccountTest, hash)
301{306{
307 unordered_set<Account>(); // Just to show that this works.
308
302 Account a1;309 Account a1;
310 EXPECT_EQ(0, hash<Account>()(a1));
303 EXPECT_EQ(0, a1.hash());311 EXPECT_EQ(0, a1.hash());
304 EXPECT_EQ(a1.hash(), qHash(a1));312 EXPECT_EQ(0, qHash(a1));
305313
306 auto a2 = runtime_->make_test_account(service_connection_->baseService(), object_path(), "a", "a", "a");314 auto a2 = runtime_->make_test_account(service_connection_->baseService(), object_path(), "a", "a", "a");
307 // Due to different return types (size_t vs uint), hash() and qHash() do not return the same value.315 // Due to different return types (size_t vs uint), hash() and qHash() do not return the same value.
@@ -317,11 +325,11 @@
317 EXPECT_EQ(StorageError::NoError, j->error().type());325 EXPECT_EQ(StorageError::NoError, j->error().type());
318 EXPECT_EQ(QList<Account>(), j->accounts()); // We haven't waited for the result yet.326 EXPECT_EQ(QList<Account>(), j->accounts()); // We haven't waited for the result yet.
319327
320 QSignalSpy spy(j.get(), &unity::storage::qt::AccountsJob::statusChanged);328 QSignalSpy spy(j.get(), &AccountsJob::statusChanged);
321 spy.wait(SIGNAL_WAIT_TIME);329 spy.wait(SIGNAL_WAIT_TIME);
322 ASSERT_EQ(1, spy.count());330 ASSERT_EQ(1, spy.count());
323 auto arg = spy.takeFirst();331 auto arg = spy.takeFirst();
324 EXPECT_EQ(AccountsJob::Finished, qvariant_cast<unity::storage::qt::AccountsJob::Status>(arg.at(0)));332 EXPECT_EQ(AccountsJob::Finished, qvariant_cast<AccountsJob::Status>(arg.at(0)));
325333
326 EXPECT_TRUE(j->isValid());334 EXPECT_TRUE(j->isValid());
327 EXPECT_EQ(AccountsJob::Finished, j->status());335 EXPECT_EQ(AccountsJob::Finished, j->status());
@@ -342,16 +350,15 @@
342 EXPECT_FALSE(j->isValid());350 EXPECT_FALSE(j->isValid());
343 EXPECT_EQ(AccountsJob::Error, j->status());351 EXPECT_EQ(AccountsJob::Error, j->status());
344 EXPECT_EQ(StorageError::RuntimeDestroyed, j->error().type());352 EXPECT_EQ(StorageError::RuntimeDestroyed, j->error().type());
345 EXPECT_EQ("Runtime::accounts(): Runtime was destroyed previously",353 EXPECT_EQ("Runtime::accounts(): Runtime was destroyed previously", j->error().message());
346 j->error().message()) << j->error().message().toStdString();
347 EXPECT_EQ(QList<Account>(), j->accounts());354 EXPECT_EQ(QList<Account>(), j->accounts());
348355
349 // Signal must be received.356 // Signal must be received.
350 QSignalSpy spy(j, &unity::storage::qt::AccountsJob::statusChanged);357 QSignalSpy spy(j, &AccountsJob::statusChanged);
351 spy.wait(SIGNAL_WAIT_TIME);358 spy.wait(SIGNAL_WAIT_TIME);
352 ASSERT_EQ(1, spy.count());359 ASSERT_EQ(1, spy.count());
353 auto arg = spy.takeFirst();360 auto arg = spy.takeFirst();
354 EXPECT_EQ(AccountsJob::Error, qvariant_cast<unity::storage::qt::AccountsJob::Status>(arg.at(0)));361 EXPECT_EQ(AccountsJob::Error, qvariant_cast<AccountsJob::Status>(arg.at(0)));
355}362}
356363
357TEST_F(RootsTest, roots)364TEST_F(RootsTest, roots)
@@ -364,19 +371,19 @@
364 EXPECT_EQ(StorageError::NoError, j->error().type());371 EXPECT_EQ(StorageError::NoError, j->error().type());
365372
366 // Check that we get the statusChanged and itemsReady signals.373 // Check that we get the statusChanged and itemsReady signals.
367 QSignalSpy ready_spy(j.get(), &unity::storage::qt::ItemListJob::itemsReady);374 QSignalSpy ready_spy(j.get(), &ItemListJob::itemsReady);
368 QSignalSpy status_spy(j.get(), &unity::storage::qt::ItemListJob::statusChanged);375 QSignalSpy status_spy(j.get(), &ItemListJob::statusChanged);
369376
370 ASSERT_TRUE(ready_spy.wait(SIGNAL_WAIT_TIME));377 ASSERT_TRUE(ready_spy.wait(SIGNAL_WAIT_TIME));
371378
372 ASSERT_EQ(1, ready_spy.count());379 ASSERT_EQ(1, ready_spy.count());
373 auto arg = ready_spy.takeFirst();380 auto arg = ready_spy.takeFirst();
374 auto items = qvariant_cast<QList<Item>>(arg.at(0));381 auto items = qvariant_cast<QList<Item>>(arg.at(0));
375 EXPECT_EQ(1, items.size());382 ASSERT_EQ(1, items.size());
376383
377 ASSERT_EQ(1, status_spy.count());384 ASSERT_EQ(1, status_spy.count());
378 arg = status_spy.takeFirst();385 arg = status_spy.takeFirst();
379 EXPECT_EQ(ItemListJob::Finished, qvariant_cast<unity::storage::qt::ItemListJob::Status>(arg.at(0)));386 EXPECT_EQ(ItemListJob::Finished, qvariant_cast<ItemListJob::Status>(arg.at(0)));
380 EXPECT_EQ(StorageError::NoError, j->error().type());387 EXPECT_EQ(StorageError::NoError, j->error().type());
381388
382 EXPECT_TRUE(j->isValid());389 EXPECT_TRUE(j->isValid());
@@ -403,38 +410,349 @@
403 EXPECT_FALSE(j->isValid());410 EXPECT_FALSE(j->isValid());
404 EXPECT_EQ(ItemListJob::Error, j->status());411 EXPECT_EQ(ItemListJob::Error, j->status());
405 EXPECT_EQ(StorageError::RuntimeDestroyed, j->error().type());412 EXPECT_EQ(StorageError::RuntimeDestroyed, j->error().type());
406 EXPECT_EQ("Account::roots(): Runtime was destroyed previously",413 EXPECT_EQ("Account::roots(): Runtime was destroyed previously", j->error().message());
407 j->error().message()) << j->error().message().toStdString();414
408415 // Signal must be received.
409 // Signal must be received.416 QSignalSpy spy(j.get(), &ItemListJob::statusChanged);
410 QSignalSpy spy(j.get(), &unity::storage::qt::ItemListJob::statusChanged);417 spy.wait(SIGNAL_WAIT_TIME);
411 spy.wait(SIGNAL_WAIT_TIME);418 ASSERT_EQ(1, spy.count());
412 ASSERT_EQ(1, spy.count());419 auto arg = spy.takeFirst();
413 auto arg = spy.takeFirst();420 EXPECT_EQ(ItemListJob::Error, qvariant_cast<ItemListJob::Status>(arg.at(0)));
414 EXPECT_EQ(ItemListJob::Error, qvariant_cast<unity::storage::qt::ItemListJob::Status>(arg.at(0)));421}
415}422
416423TEST_F(RootsTest, runtime_destroyed_while_item_list_job_running)
417TEST_F(ItemTest, comparison)424{
425 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider("slow_roots")));
426
427 unique_ptr<ItemListJob> j(acc_.roots());
428 EXPECT_TRUE(j->isValid());
429 EXPECT_EQ(ItemListJob::Loading, j->status());
430 EXPECT_EQ(StorageError::NoError, j->error().type());
431
432 EXPECT_EQ(StorageError::NoError, runtime_->shutdown().type()); // Destroy runtime, provider still sleeping
433
434 // Signal must be received.
435 QSignalSpy spy(j.get(), &ItemListJob::statusChanged);
436 spy.wait(SIGNAL_WAIT_TIME);
437 ASSERT_EQ(1, spy.count());
438 auto arg = spy.takeFirst();
439 EXPECT_EQ(ItemListJob::Error, qvariant_cast<ItemListJob::Status>(arg.at(0)));
440
441 EXPECT_EQ("Account::roots(): Runtime was destroyed previously", j->error().message());
442}
443
444TEST_F(RootsTest, not_a_root)
445{
446 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider("not_a_root")));
447
448 unique_ptr<ItemListJob> j(acc_.roots());
449
450 QSignalSpy ready_spy(j.get(), &ItemListJob::itemsReady);
451 QSignalSpy status_spy(j.get(), &ItemListJob::statusChanged);
452 status_spy.wait(SIGNAL_WAIT_TIME);
453 auto arg = status_spy.takeFirst();
454
455 // Bad metadata is ignored, so status is finished, and itemsReady was never called.
456 EXPECT_EQ(ItemListJob::Finished, qvariant_cast<ItemListJob::Status>(arg.at(0)));
457 EXPECT_EQ(0, status_spy.count());
458}
459
460TEST_F(GetTest, basic)
461{
462 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider()));
463
464 // Get root.
465 {
466 unique_ptr<ItemJob> j(acc_.get("root_id"));
467
468 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
469 spy.wait(SIGNAL_WAIT_TIME);
470
471 EXPECT_EQ("root_id", j->item().itemId());
472 EXPECT_EQ("Root", j->item().name());
473 EXPECT_EQ(Item::Root, j->item().type());
474 }
475
476 // Get a file.
477 {
478 unique_ptr<ItemJob> j(acc_.get("child_id"));
479
480 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
481 spy.wait(SIGNAL_WAIT_TIME);
482
483 EXPECT_EQ("child_id", j->item().itemId());
484 EXPECT_EQ("Child", j->item().name());
485 EXPECT_EQ(Item::File, j->item().type());
486 }
487
488 // Get a folder.
489 {
490 unique_ptr<ItemJob> j(acc_.get("child_folder_id"));
491
492 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
493 spy.wait(SIGNAL_WAIT_TIME);
494
495 EXPECT_EQ("child_folder_id", j->item().itemId());
496 EXPECT_EQ("Child_Folder", j->item().name());
497 EXPECT_EQ(Item::Folder, j->item().type());
498 }
499}
500
501TEST_F(GetTest, runtime_destroyed)
502{
503 EXPECT_EQ(StorageError::NoError, runtime_->shutdown().type()); // Destroy runtime.
504
505 unique_ptr<ItemJob> j(acc_.get("root_id"));
506 EXPECT_FALSE(j->isValid());
507 EXPECT_EQ(ItemJob::Error, j->status());
508 EXPECT_EQ(StorageError::RuntimeDestroyed, j->error().type());
509 EXPECT_EQ("Account::get(): Runtime was destroyed previously", j->error().message());
510
511 // Signal must be received.
512 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
513 spy.wait(SIGNAL_WAIT_TIME);
514 auto arg = spy.takeFirst();
515 EXPECT_EQ(ItemJob::Error, qvariant_cast<ItemJob::Status>(arg.at(0)));
516
517 EXPECT_EQ("Account::get(): Runtime was destroyed previously", j->error().message());
518}
519
520TEST_F(GetTest, runtime_destroyed_while_item_job_running)
521{
522 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider("slow_metadata")));
523
524 unique_ptr<ItemJob> j(acc_.get("child_folder_id"));
525 EXPECT_TRUE(j->isValid());
526
527 EXPECT_EQ(StorageError::NoError, runtime_->shutdown().type()); // Destroy runtime, provider still sleeping
528
529 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
530 spy.wait(SIGNAL_WAIT_TIME);
531 auto arg = spy.takeFirst();
532 EXPECT_EQ(ItemListJob::Error, qvariant_cast<ItemJob::Status>(arg.at(0)));
533
534 EXPECT_EQ("Account::get(): Runtime was destroyed previously", j->error().message());
535}
536
537TEST_F(GetTest, empty_id_from_provider)
538{
539 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider("empty_id")));
540
541 unique_ptr<ItemJob> j(acc_.get("child_folder_id"));
542 EXPECT_TRUE(j->isValid());
543
544 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
545 spy.wait(SIGNAL_WAIT_TIME);
546 auto arg = spy.takeFirst();
547 EXPECT_EQ(ItemListJob::Error, qvariant_cast<ItemJob::Status>(arg.at(0)));
548
549 EXPECT_EQ("Account::get(): received invalid metadata from provider: item_id cannot be empty", j->error().message());
550}
551
552TEST_F(GetTest, no_such_id)
553{
554 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider()));
555
556 unique_ptr<ItemJob> j(acc_.get("no_such_id"));
557 EXPECT_TRUE(j->isValid());
558
559 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
560 spy.wait(SIGNAL_WAIT_TIME);
561 auto arg = spy.takeFirst();
562 EXPECT_EQ(ItemListJob::Error, qvariant_cast<ItemJob::Status>(arg.at(0)));
563
564 EXPECT_EQ("metadata(): no such item: no_such_id", j->error().message()) << j->error().message().toStdString();
565 EXPECT_EQ("no_such_id", j->error().itemId());
566}
567
568TEST_F(DeleteTest, basic)
569{
570 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider));
571
572 Item item;
573 {
574 unique_ptr<ItemJob> j(acc_.get("child_id"));
575 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
576 ASSERT_TRUE(spy.wait(SIGNAL_WAIT_TIME));
577 item = j->item();
578 }
579
580 unique_ptr<VoidJob> j(item.deleteItem());
581 EXPECT_TRUE(j->isValid());
582 EXPECT_EQ(VoidJob::Loading, j->status());
583 EXPECT_EQ(StorageError::NoError, j->error().type());
584
585 EXPECT_EQ("child_id", item.itemId());
586
587 QSignalSpy spy(j.get(), &VoidJob::statusChanged);
588 ASSERT_TRUE(spy.wait(SIGNAL_WAIT_TIME));
589
590 EXPECT_EQ(VoidJob::Finished, j->status());
591 EXPECT_TRUE(j->isValid());
592 EXPECT_EQ(StorageError::NoError, j->error().type());
593 EXPECT_EQ(VoidJob::Finished, j->status());
594}
595
596TEST_F(DeleteTest, no_such_item)
597{
598 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider("delete_no_such_item")));
599
600 Item item;
601 {
602 unique_ptr<ItemJob> j(acc_.get("child_id"));
603 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
604 ASSERT_TRUE(spy.wait(SIGNAL_WAIT_TIME));
605 item = j->item();
606 }
607
608 unique_ptr<VoidJob> j(item.deleteItem());
609 EXPECT_TRUE(j->isValid());
610 EXPECT_EQ(VoidJob::Loading, j->status());
611 EXPECT_EQ(StorageError::NoError, j->error().type());
612
613 EXPECT_EQ("child_id", item.itemId());
614
615 QSignalSpy spy(j.get(), &VoidJob::statusChanged);
616 ASSERT_TRUE(spy.wait(SIGNAL_WAIT_TIME));
617
618 EXPECT_EQ(VoidJob::Error, j->status());
619 EXPECT_FALSE(j->isValid());
620 EXPECT_EQ(StorageError::NotExists, j->error().type());
621 EXPECT_EQ("delete_item(): no such item: child_id", j->error().message());
622}
623
624TEST_F(DeleteTest, delete_root)
625{
626 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider));
627
628 Item item;
629 {
630 unique_ptr<ItemJob> j(acc_.get("root_id"));
631 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
632 ASSERT_TRUE(spy.wait(SIGNAL_WAIT_TIME));
633 item = j->item();
634 }
635
636 unique_ptr<VoidJob> j(item.deleteItem());
637 EXPECT_FALSE(j->isValid());
638 EXPECT_EQ(VoidJob::Error, j->status());
639 EXPECT_EQ(StorageError::LogicError, j->error().type());
640
641 // Signal must be received.
642 QSignalSpy spy(j.get(), &VoidJob::statusChanged);
643 spy.wait(SIGNAL_WAIT_TIME);
644 auto arg = spy.takeFirst();
645 EXPECT_EQ(ItemJob::Error, qvariant_cast<VoidJob::Status>(arg.at(0)));
646
647 EXPECT_EQ("Item::deleteItem(): cannot delete root", j->error().message());
648}
649
650TEST_F(DeleteTest, runtime_destroyed)
651{
652 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider));
653
654 Item item;
655 {
656 unique_ptr<ItemJob> j(acc_.get("child_id"));
657 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
658 ASSERT_TRUE(spy.wait(SIGNAL_WAIT_TIME));
659 item = j->item();
660 }
661
662 EXPECT_EQ(StorageError::NoError, runtime_->shutdown().type()); // Destroy runtime.
663
664 unique_ptr<VoidJob> j(item.deleteItem());
665 EXPECT_FALSE(j->isValid());
666 EXPECT_EQ(ItemJob::Error, j->status());
667 EXPECT_EQ(StorageError::RuntimeDestroyed, j->error().type());
668 EXPECT_EQ("Item::deleteItem(): Runtime was destroyed previously", j->error().message());
669
670 // Signal must be received.
671 QSignalSpy spy(j.get(), &VoidJob::statusChanged);
672 spy.wait(SIGNAL_WAIT_TIME);
673 auto arg = spy.takeFirst();
674 EXPECT_EQ(ItemJob::Error, qvariant_cast<VoidJob::Status>(arg.at(0)));
675
676 EXPECT_EQ("Item::deleteItem(): Runtime was destroyed previously", j->error().message());
677}
678
679TEST_F(DeleteTest, runtime_destroyed_while_void_job_running)
680{
681 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider("slow_delete")));
682
683 Item item;
684 {
685 unique_ptr<ItemJob> j(acc_.get("child_id"));
686 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
687 ASSERT_TRUE(spy.wait(SIGNAL_WAIT_TIME));
688 item = j->item();
689 }
690
691 unique_ptr<VoidJob> j(item.deleteItem());
692 EXPECT_TRUE(j->isValid());
693 EXPECT_EQ(VoidJob::Loading, j->status());
694 EXPECT_EQ(StorageError::NoError, j->error().type());
695
696 EXPECT_EQ(StorageError::NoError, runtime_->shutdown().type()); // Destroy runtime.
697
698 // Signal must be received.
699 QSignalSpy spy(j.get(), &VoidJob::statusChanged);
700 spy.wait(SIGNAL_WAIT_TIME);
701 auto arg = spy.takeFirst();
702 EXPECT_EQ(VoidJob::Error, qvariant_cast<VoidJob::Status>(arg.at(0)));
703
704 EXPECT_EQ("Item::deleteItem(): Runtime was destroyed previously", j->error().message()) << j->error().message().toStdString();
705}
706
707#if 0
708// TODO: need to make internal symbols available for testing.
709TEST_F(ValidateTest, basic)
710{
711 using namespace unity::storage::qt::internal;
712
713 unity::storage::internal::ItemMetadata md;
714
715 validate("foo", md);
716}
717#endif
718
719
720TEST_F(ItemTest, comparison_and_hash)
418{721{
419 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider));722 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider));
420723
421 {724 {
422 // Both items invalid.725 // Both items invalid.
423 Item i1;726 Item i1;
424 Item a2;727 Item i2;
425 EXPECT_TRUE(i1 == a2);728 EXPECT_TRUE(i1 == i2);
426 EXPECT_FALSE(i1 != a2);729 EXPECT_FALSE(i1 != i2);
427 EXPECT_FALSE(i1 < a2);730 EXPECT_FALSE(i1 < i2);
428 EXPECT_TRUE(i1 <= a2);731 EXPECT_TRUE(i1 <= i2);
429 EXPECT_FALSE(i1 > a2);732 EXPECT_FALSE(i1 > i2);
430 EXPECT_TRUE(i1 >= a2);733 EXPECT_TRUE(i1 >= i2);
734
735 unordered_set<Item>(); // Just to show that this works.
736
737 EXPECT_EQ(0, hash<Item>()(i1));
738 EXPECT_EQ(0, i1.hash());
739 EXPECT_EQ(0, qHash(i1));
431 }740 }
432741
433#if 0
434 {742 {
435 // i1 valid, i2 invalid743 // i1 valid, i2 invalid
436 auto i1 = runtime_->make_test_account(service_connection_->baseService(), bus_path());744 unique_ptr<ItemListJob> j(acc_.roots());
437 Account i2;745
746 QSignalSpy ready_spy(j.get(), &ItemListJob::itemsReady);
747 ASSERT_TRUE(ready_spy.wait(SIGNAL_WAIT_TIME));
748
749 ASSERT_EQ(1, ready_spy.count());
750 auto arg = ready_spy.takeFirst();
751 auto items = qvariant_cast<QList<Item>>(arg.at(0));
752 ASSERT_EQ(1, items.size());
753
754 auto i1 = items[0];
755 Item i2;
438 EXPECT_FALSE(i1 == i2);756 EXPECT_FALSE(i1 == i2);
439 EXPECT_TRUE(i1 != i2);757 EXPECT_TRUE(i1 != i2);
440 EXPECT_FALSE(i1 < i2);758 EXPECT_FALSE(i1 < i2);
@@ -449,75 +767,69 @@
449 EXPECT_TRUE(i2 <= i1);767 EXPECT_TRUE(i2 <= i1);
450 EXPECT_FALSE(i2 > i1);768 EXPECT_FALSE(i2 > i1);
451 EXPECT_FALSE(i2 >= i1);769 EXPECT_FALSE(i2 >= i1);
452 }770
453771 EXPECT_NE(0, i1.hash());
454 {772 EXPECT_NE(0, qHash(i1));
455 // i1 < i2 for owner ID773 }
456 auto i1 = runtime_->make_test_account(service_connection_->baseService(), bus_path(), "a", "x", "x");774
457 auto i2 = runtime_->make_test_account(service_connection_->baseService(), bus_path(), "b", "x", "x");775 {
458776 // Both items valid with identical metadata, but different accounts (a1 < a2).
459 EXPECT_FALSE(i1 == i2);777
460 EXPECT_TRUE(i1 != i2);778 auto a1 = runtime_->make_test_account(service_connection_->baseService(), object_path(), "a", "x", "x");
461 EXPECT_TRUE(i1 < i2);779 auto a2 = runtime_->make_test_account(service_connection_->baseService(), object_path(), "b", "x", "x");
462 EXPECT_TRUE(i1 <= i2);780
463 EXPECT_FALSE(i1 > i2);781 Item i1;
464 EXPECT_FALSE(i1 >= i2);782 Item i2;
465783
466 // And with swapped operands:784 {
467 EXPECT_FALSE(i2 == i1);785 unique_ptr<ItemJob> j(a1.get("root_id"));
468 EXPECT_TRUE(i2 != i1);786 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
469 EXPECT_FALSE(i2 < i1);787 ASSERT_TRUE(spy.wait(SIGNAL_WAIT_TIME));
470 EXPECT_FALSE(i2 <= i1);788 i1 = j->item();
471 EXPECT_TRUE(i2 > i1);789 }
472 EXPECT_TRUE(i2 >= i1);790 {
473 }791 unique_ptr<ItemJob> j(a2.get("root_id"));
474792 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
475 {793 ASSERT_TRUE(spy.wait(SIGNAL_WAIT_TIME));
476 // i1 < i2 for owner794 i2 = j->item();
477 auto i1 = runtime_->make_test_account(service_connection_->baseService(), bus_path(), "a", "a", "x");795 }
478 auto i2 = runtime_->make_test_account(service_connection_->baseService(), bus_path(), "a", "b", "x");796
479797 ASSERT_EQ(i1.itemId(), i2.itemId());
480 EXPECT_FALSE(i1 == i2);798
481 EXPECT_TRUE(i1 != i2);799 EXPECT_FALSE(i1 == i2);
482 EXPECT_TRUE(i1 < i2);800 EXPECT_TRUE(i1 != i2);
483 EXPECT_TRUE(i1 <= i2);801 EXPECT_TRUE(i1 < i2);
484 EXPECT_FALSE(i1 > i2);802 EXPECT_TRUE(i1 <= i2);
485 EXPECT_FALSE(i1 >= i2);803 EXPECT_FALSE(i1 > i2);
486804 EXPECT_FALSE(i1 >= i2);
487 // And with swapped operands:805
488 EXPECT_FALSE(i2 == i1);806 // And with swapped operands:
489 EXPECT_TRUE(i2 != i1);807 EXPECT_FALSE(i2 == i1);
490 EXPECT_FALSE(i2 < i1);808 EXPECT_TRUE(i2 != i1);
491 EXPECT_FALSE(i2 <= i1);809 EXPECT_FALSE(i2 < i1);
492 EXPECT_TRUE(i2 > i1);810 EXPECT_FALSE(i2 <= i1);
493 EXPECT_TRUE(i2 >= i1);811 EXPECT_TRUE(i2 > i1);
494 }812 EXPECT_TRUE(i2 >= i1);
495813 }
496 {814
497 // i1 < i2 for description815 {
498 auto i1 = runtime_->make_test_account(service_connection_->baseService(), bus_path(), "a", "a", "a");816 // Both items valid with identical metadata, but different instances, so we do deep comparison.
499 auto i2 = runtime_->make_test_account(service_connection_->baseService(), bus_path(), "a", "a", "b");817
500818 Item i1;
501 EXPECT_FALSE(i1 == i2);819 Item i2;
502 EXPECT_TRUE(i1 != i2);820
503 EXPECT_TRUE(i1 < i2);821 {
504 EXPECT_TRUE(i1 <= i2);822 unique_ptr<ItemJob> j(acc_.get("root_id"));
505 EXPECT_FALSE(i1 > i2);823 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
506 EXPECT_FALSE(i1 >= i2);824 ASSERT_TRUE(spy.wait(SIGNAL_WAIT_TIME));
507825 i1 = j->item();
508 // And with swapped operands:826 }
509 EXPECT_FALSE(i2 == i1);827 {
510 EXPECT_TRUE(i2 != i1);828 unique_ptr<ItemJob> j(acc_.get("root_id"));
511 EXPECT_FALSE(i2 < i1);829 QSignalSpy spy(j.get(), &ItemJob::statusChanged);
512 EXPECT_FALSE(i2 <= i1);830 ASSERT_TRUE(spy.wait(SIGNAL_WAIT_TIME));
513 EXPECT_TRUE(i2 > i1);831 i2 = j->item();
514 EXPECT_TRUE(i2 >= i1);832 }
515 }
516
517 {
518 // i1 == i2
519 auto i1 = runtime_->make_test_account(service_connection_->baseService(), bus_path(), "a", "a", "a");
520 auto i2 = runtime_->make_test_account(service_connection_->baseService(), bus_path(), "a", "a", "a");
521833
522 EXPECT_TRUE(i1 == i2);834 EXPECT_TRUE(i1 == i2);
523 EXPECT_FALSE(i1 != i2);835 EXPECT_FALSE(i1 != i2);
@@ -533,8 +845,10 @@
533 EXPECT_TRUE(i2 <= i1);845 EXPECT_TRUE(i2 <= i1);
534 EXPECT_FALSE(i2 > i1);846 EXPECT_FALSE(i2 > i1);
535 EXPECT_TRUE(i2 >= i1);847 EXPECT_TRUE(i2 >= i1);
848
849 EXPECT_EQ(i1.hash(), i2.hash());
850 EXPECT_EQ(qHash(i1), qHash(i2));
536 }851 }
537#endif
538}852}
539853
540#if 0854#if 0
@@ -1290,7 +1604,7 @@
12901604
1291TEST_F(DestroyedTest, get_destroyed_while_reply_outstanding)1605TEST_F(DestroyedTest, get_destroyed_while_reply_outstanding)
1292{1606{
1293 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider("metadata slow")));1607 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider("slow_metadata")));
12941608
1295 auto root = call(acc_->roots())[0];1609 auto root = call(acc_->roots())[0];
1296 auto fut = root->get("root_id");1610 auto fut = root->get("root_id");
@@ -1328,7 +1642,7 @@
13281642
1329TEST_F(DestroyedTest, move_destroyed_while_reply_outstanding)1643TEST_F(DestroyedTest, move_destroyed_while_reply_outstanding)
1330{1644{
1331 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider("move slow")));1645 set_provider(unique_ptr<provider::ProviderBase>(new MockProvider("slow_move")));
13321646
1333 auto root = call(acc_->roots())[0];1647 auto root = call(acc_->roots())[0];
1334 auto file = dynamic_pointer_cast<File>(call(root->get("child_id")));1648 auto file = dynamic_pointer_cast<File>(call(root->get("child_id")));

Subscribers

People subscribed via source and target branches

to all changes: