Merge lp:~renatofilho/qtorganizer5-eds/fix-engine-crash into lp:qtorganizer5-eds

Proposed by Renato Araujo Oliveira Filho
Status: Merged
Merged at revision: 59
Proposed branch: lp:~renatofilho/qtorganizer5-eds/fix-engine-crash
Merge into: lp:qtorganizer5-eds
Diff against target: 1190 lines (+374/-182)
33 files modified
CMakeLists.txt (+1/-1)
buildOnDevice.sh (+2/-2)
config.h.in (+1/-0)
organizer/qorganizer-eds-engine.cpp (+29/-21)
organizer/qorganizer-eds-engine.h (+5/-0)
organizer/qorganizer-eds-fetchbyidrequestdata.cpp (+4/-2)
organizer/qorganizer-eds-fetchbyidrequestdata.h (+2/-1)
organizer/qorganizer-eds-fetchocurrencedata.cpp (+5/-2)
organizer/qorganizer-eds-fetchocurrencedata.h (+2/-1)
organizer/qorganizer-eds-fetchrequestdata.cpp (+5/-3)
organizer/qorganizer-eds-fetchrequestdata.h (+2/-1)
organizer/qorganizer-eds-removebyidrequestdata.cpp (+5/-2)
organizer/qorganizer-eds-removebyidrequestdata.h (+2/-1)
organizer/qorganizer-eds-removecollectionrequestdata.cpp (+6/-11)
organizer/qorganizer-eds-removecollectionrequestdata.h (+2/-1)
organizer/qorganizer-eds-removerequestdata.cpp (+4/-2)
organizer/qorganizer-eds-removerequestdata.h (+2/-1)
organizer/qorganizer-eds-requestdata.cpp (+69/-23)
organizer/qorganizer-eds-requestdata.h (+14/-6)
organizer/qorganizer-eds-savecollectionrequestdata.cpp (+10/-6)
organizer/qorganizer-eds-savecollectionrequestdata.h (+3/-2)
organizer/qorganizer-eds-saverequestdata.cpp (+5/-6)
organizer/qorganizer-eds-saverequestdata.h (+2/-1)
organizer/qorganizer-eds-source-registry.cpp (+1/-4)
tests/unittest/CMakeLists.txt (+6/-5)
tests/unittest/cancel-operation-test.cpp (+99/-0)
tests/unittest/collections-test.cpp (+21/-7)
tests/unittest/eds-base-test.cpp (+34/-60)
tests/unittest/eds-base-test.h (+2/-3)
tests/unittest/event-test.cpp (+2/-2)
tests/unittest/fetchitem-test.cpp (+4/-3)
tests/unittest/recurrence-test.cpp (+7/-2)
tests/unittest/run-eds-test.sh (+16/-0)
To merge this branch: bzr merge lp:~renatofilho/qtorganizer5-eds/fix-engine-crash
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Approve
Ubuntu Phablet Team Pending
Review via email: mp+219586@code.launchpad.net

Commit message

Only destroy request data in the requestDestroyed function.
Return the items in the requested order.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
61. By Renato Araujo Oliveira Filho

Fixed collection update signal.
Avoid delete request while wait to finish.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
62. By Renato Araujo Oliveira Filho <renato@ubuntu>

Try t fix faling test.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
63. By Renato Araujo Oliveira Filho

Reduce the wait time during the test cleanup.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
64. By Renato Araujo Oliveira Filho

WIP

65. By Renato Araujo Oliveira Filho <renato@ubuntu>

Make EDS tests more reliable.

66. By Renato Araujo Oliveira Filho

Test cancel operation.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
67. By Renato Araujo Oliveira Filho

Added missing file.

68. By Renato Araujo Oliveira Filho

Removed unused functions.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
69. By Renato Araujo Oliveira Filho

Fixed organizer plugin load during tests.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
70. By Renato Araujo Oliveira Filho

Added test for select and unselect a collection.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
71. By Renato Araujo Oliveira Filho

Removed commented code.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
72. By Renato Araujo Oliveira Filho

Return the item in the the correct sort order.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'CMakeLists.txt'
2--- CMakeLists.txt 2013-12-05 15:30:17 +0000
3+++ CMakeLists.txt 2014-06-10 18:21:21 +0000
4@@ -70,7 +70,7 @@
5 set(EVOLUTION_SOURCE_SERVICE_NAME "org.gnome.evolution.dataserver.Sources2")
6 endif()
7
8-add_subdirectory(qorganizer)
9+add_subdirectory(organizer)
10 if(DBUS_RUNNER)
11 if(EVOLUTION_CALENDAR_FACTORY)
12 enable_testing()
13
14=== modified file 'buildOnDevice.sh'
15--- buildOnDevice.sh 2014-04-19 13:41:01 +0000
16+++ buildOnDevice.sh 2014-06-10 18:21:21 +0000
17@@ -72,9 +72,9 @@
18 # same options as in debian/rules
19 #QMAKE_OPTIONS="-recursive MALIIT_DEFAULT_PROFILE=ubuntu CONFIG+=\\\"debug nodoc enable-presage enable-hunspell enable-pinyin\\\""
20 exec_with_ssh "mkdir -p $CODE_DIR/build"
21- exec_with_ssh "cd $CODE_DIR/build && cmake ../ -DCMAKE_BUILD_TYPE=Debug && make -j 4"
22+ exec_with_ssh "cd $CODE_DIR/build && cmake ../ -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug && make -j 4"
23 echo "Installing"
24- exec_with_ssh "cd $CODE_DIR/build && " $SUDO " make install"
25+ exec_with_ssh "cd $CODE_DIR/build && " $SUDO " make install/fast"
26 }
27
28 run() {
29
30=== modified file 'config.h.in'
31--- config.h.in 2013-12-02 01:42:41 +0000
32+++ config.h.in 2014-06-10 18:21:21 +0000
33@@ -4,5 +4,6 @@
34 #define TMP_DIR "@TMP_DIR@"
35 #define EVOLUTION_CALENDAR_FACTORY "@EVOLUTION_CALENDAR_FACTORY@"
36 #define EVOLUTION_CALENDAR_SERVICE "org.gnome.evolution.dataserver.Calendar4"
37+#define QORGANIZER_DEV_PATH "@CMAKE_BINARY_DIR@"
38
39 #endif
40
41=== renamed directory 'qorganizer' => 'organizer'
42=== modified file 'organizer/qorganizer-eds-engine.cpp'
43--- qorganizer/qorganizer-eds-engine.cpp 2014-05-08 16:45:14 +0000
44+++ organizer/qorganizer-eds-engine.cpp 2014-06-10 18:21:21 +0000
45@@ -90,17 +90,17 @@
46 }
47 connect(d->m_sourceRegistry, SIGNAL(sourceAdded(QString)), SLOT(onSourceAdded(QString)));
48 connect(d->m_sourceRegistry, SIGNAL(sourceRemoved(QString)), SLOT(onSourceRemoved(QString)));
49+ connect(d->m_sourceRegistry, SIGNAL(sourceUpdated(QString)), SLOT(onSourceUpdated(QString)));
50 d->m_sourceRegistry->load();
51 }
52
53 QOrganizerEDSEngine::~QOrganizerEDSEngine()
54 {
55- QList<QOrganizerAbstractRequest*> reqs = m_runningRequests.keys();
56- Q_FOREACH(QOrganizerAbstractRequest *req, reqs) {
57- req->cancel();
58+ while(m_runningRequests.count()) {
59+ QOrganizerAbstractRequest *req = m_runningRequests.keys().first();
60+ QOrganizerEDSEngine::requestDestroyed(req);
61 }
62
63- Q_ASSERT(m_runningRequests.count() == 0);
64 d->m_sharedEngines.remove(this);
65 if (!d->m_refCount.deref()) {
66 delete d;
67@@ -811,9 +811,11 @@
68 startRequest(req);
69 waitForRequestFinished(req, 0);
70
71- *error = req->error();
72+ if (error) {
73+ *error = req->error();
74+ }
75
76- if (*error == QOrganizerManager::NoError) {
77+ if (req->error() == QOrganizerManager::NoError) {
78 return req->collections();
79 } else {
80 return QList<QOrganizerCollection>();
81@@ -941,8 +943,11 @@
82 startRequest(req);
83 waitForRequestFinished(req, 0);
84
85- *error = req->error();
86- return(*error == QOrganizerManager::NoError);
87+ if (error) {
88+ *error = req->error();
89+ }
90+
91+ return(req->error() == QOrganizerManager::NoError);
92 }
93
94 void QOrganizerEDSEngine::removeCollectionAsync(QtOrganizer::QOrganizerCollectionRemoveRequest *req)
95@@ -1008,12 +1013,7 @@
96
97 void QOrganizerEDSEngine::releaseRequestData(RequestData *data)
98 {
99- if (data->cancelled()) {
100- // if request was cancelled data will be destroyed later
101- data->continueCancel();
102- } else {
103- delete data;
104- }
105+ data->deleteLater();
106 }
107
108 void QOrganizerEDSEngine::requestDestroyed(QOrganizerAbstractRequest* req)
109@@ -1021,7 +1021,7 @@
110 RequestData *data = m_runningRequests.take(req);
111 if (data) {
112 data->cancel();
113- delete data;
114+ data->deleteLater();
115 }
116 }
117
118@@ -1073,10 +1073,10 @@
119
120 bool QOrganizerEDSEngine::cancelRequest(QOrganizerAbstractRequest* req)
121 {
122- RequestData *data = m_runningRequests.take(req);
123+ RequestData *data = m_runningRequests.value(req);
124 if (data) {
125 data->cancel();
126- delete data;
127+ data->deleteLater();
128 return true;
129 }
130 return false;
131@@ -1087,10 +1087,11 @@
132 Q_ASSERT(req);
133 Q_UNUSED(msecs);
134
135- QPointer<QOrganizerAbstractRequest> r(req);
136-
137- while(r && (r->state() == QOrganizerAbstractRequest::ActiveState)) {
138- QCoreApplication::processEvents();
139+ RequestData *data = m_runningRequests.value(req);
140+ if (data) {
141+ data->wait();
142+ // We can delete the operation already finished
143+ data->deleteLater();
144 }
145
146 return true;
147@@ -1186,11 +1187,18 @@
148 void QOrganizerEDSEngine::onSourceAdded(const QString &collectionId)
149 {
150 d->watch(collectionId);
151+ Q_EMIT collectionsAdded(QList<QOrganizerCollectionId>() << QOrganizerCollectionId::fromString(collectionId));
152 }
153
154 void QOrganizerEDSEngine::onSourceRemoved(const QString &collectionId)
155 {
156 d->unWatch(collectionId);
157+ Q_EMIT collectionsRemoved(QList<QOrganizerCollectionId>() << QOrganizerCollectionId::fromString(collectionId));
158+}
159+
160+void QOrganizerEDSEngine::onSourceUpdated(const QString &collectionId)
161+{
162+ Q_EMIT collectionsChanged(QList<QOrganizerCollectionId>() << QOrganizerCollectionId::fromString(collectionId));
163 }
164
165 void QOrganizerEDSEngine::onViewChanged(QOrganizerItemChangeSet *change)
166
167=== modified file 'organizer/qorganizer-eds-engine.h'
168--- qorganizer/qorganizer-eds-engine.h 2014-04-18 03:16:33 +0000
169+++ organizer/qorganizer-eds-engine.h 2014-06-10 18:21:21 +0000
170@@ -128,6 +128,7 @@
171 protected Q_SLOTS:
172 void onSourceAdded(const QString &collectionId);
173 void onSourceRemoved(const QString &collectionId);
174+ void onSourceUpdated(const QString &collectionId);
175 void onViewChanged(QtOrganizer::QOrganizerItemChangeSet *change);
176
177 protected:
178@@ -247,5 +248,9 @@
179 friend class FetchOcurrenceData;
180 };
181
182+using namespace QtOrganizer;
183+Q_DECLARE_METATYPE(QList<QOrganizerCollectionId>)
184+Q_DECLARE_METATYPE(QList<QOrganizerItemId>)
185+
186 #endif
187
188
189=== modified file 'organizer/qorganizer-eds-fetchbyidrequestdata.cpp'
190--- qorganizer/qorganizer-eds-fetchbyidrequestdata.cpp 2013-12-03 20:01:45 +0000
191+++ organizer/qorganizer-eds-fetchbyidrequestdata.cpp 2014-06-10 18:21:21 +0000
192@@ -65,13 +65,15 @@
193 return (m_current >= ids.count());
194 }
195
196-void FetchByIdRequestData::finish(QOrganizerManager::Error error)
197+void FetchByIdRequestData::finish(QOrganizerManager::Error error,
198+ QOrganizerAbstractRequest::State state)
199 {
200 QOrganizerManagerEngine::updateItemFetchByIdRequest(request<QOrganizerItemFetchByIdRequest>(),
201 m_results,
202 error,
203 m_errors,
204- QOrganizerAbstractRequest::FinishedState);
205+ state);
206+ RequestData::finish(error, state);
207 }
208
209 int FetchByIdRequestData::appendResult(const QOrganizerItem &result)
210
211=== modified file 'organizer/qorganizer-eds-fetchbyidrequestdata.h'
212--- qorganizer/qorganizer-eds-fetchbyidrequestdata.h 2013-12-03 20:01:45 +0000
213+++ organizer/qorganizer-eds-fetchbyidrequestdata.h 2014-06-10 18:21:21 +0000
214@@ -34,7 +34,8 @@
215 QString currentCollectionId() const;
216 bool end() const;
217
218- void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError);
219+ void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError,
220+ QtOrganizer::QOrganizerAbstractRequest::State state = QtOrganizer::QOrganizerAbstractRequest::FinishedState);
221 int appendResult(const QtOrganizer::QOrganizerItem &result);
222
223 private:
224
225=== modified file 'organizer/qorganizer-eds-fetchocurrencedata.cpp'
226--- qorganizer/qorganizer-eds-fetchocurrencedata.cpp 2014-02-25 18:43:06 +0000
227+++ organizer/qorganizer-eds-fetchocurrencedata.cpp 2014-06-10 18:21:21 +0000
228@@ -62,7 +62,8 @@
229 return endDate.toTime_t();
230 }
231
232-void FetchOcurrenceData::finish(QOrganizerManager::Error error)
233+void FetchOcurrenceData::finish(QOrganizerManager::Error error,
234+ QtOrganizer::QOrganizerAbstractRequest::State state)
235 {
236 QList<QtOrganizer::QOrganizerItem> results;
237
238@@ -76,7 +77,9 @@
239 QOrganizerManagerEngine::updateItemOccurrenceFetchRequest(request<QOrganizerItemOccurrenceFetchRequest>(),
240 results,
241 error,
242- QOrganizerAbstractRequest::FinishedState);
243+ state);
244+
245+ RequestData::finish(error, state);
246 }
247
248 void FetchOcurrenceData::appendResult(icalcomponent *comp)
249
250=== modified file 'organizer/qorganizer-eds-fetchocurrencedata.h'
251--- qorganizer/qorganizer-eds-fetchocurrencedata.h 2014-02-25 18:43:06 +0000
252+++ organizer/qorganizer-eds-fetchocurrencedata.h 2014-06-10 18:21:21 +0000
253@@ -32,7 +32,8 @@
254 time_t startDate() const;
255 time_t endDate() const;
256
257- void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError);
258+ void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError,
259+ QtOrganizer::QOrganizerAbstractRequest::State state = QtOrganizer::QOrganizerAbstractRequest::FinishedState);
260 void appendResult(icalcomponent *comp);
261
262 private:
263
264=== modified file 'organizer/qorganizer-eds-fetchrequestdata.cpp'
265--- qorganizer/qorganizer-eds-fetchrequestdata.cpp 2014-04-14 18:43:25 +0000
266+++ organizer/qorganizer-eds-fetchrequestdata.cpp 2014-06-10 18:21:21 +0000
267@@ -97,13 +97,15 @@
268 return (endDate.isValid() && startDate.isValid());
269 }
270
271-void FetchRequestData::finish(QOrganizerManager::Error error)
272+void FetchRequestData::finish(QOrganizerManager::Error error,
273+ QOrganizerAbstractRequest::State state)
274 {
275 QOrganizerManagerEngine::updateItemFetchRequest(request<QOrganizerItemFetchRequest>(),
276 m_results,
277 error,
278- QOrganizerAbstractRequest::FinishedState);
279+ state);
280 // TODO: emit changeset???
281+ RequestData::finish(error, state);
282 }
283
284 void FetchRequestData::appendResult(icalcomponent *comp)
285@@ -117,7 +119,7 @@
286 QOrganizerItemFetchRequest *req = request<QOrganizerItemFetchRequest>();
287 Q_FOREACH(const QOrganizerItem &item, results) {
288 if (QOrganizerManagerEngine::testFilter(req->filter(), item)) {
289- m_results << item;
290+ QOrganizerManagerEngine::addSorted(&m_results, item, req->sorting());
291 count++;
292 }
293 }
294
295=== modified file 'organizer/qorganizer-eds-fetchrequestdata.h'
296--- qorganizer/qorganizer-eds-fetchrequestdata.h 2014-02-25 17:12:32 +0000
297+++ organizer/qorganizer-eds-fetchrequestdata.h 2014-06-10 18:21:21 +0000
298@@ -36,7 +36,8 @@
299 time_t endDate() const;
300 bool hasDateInterval() const;
301
302- void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError);
303+ void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError,
304+ QtOrganizer::QOrganizerAbstractRequest::State state = QtOrganizer::QOrganizerAbstractRequest::FinishedState);
305 void appendResult(icalcomponent *comp);
306 int appendResults(QList<QtOrganizer::QOrganizerItem> results);
307 QString dateFilter();
308
309=== modified file 'organizer/qorganizer-eds-removebyidrequestdata.cpp'
310--- qorganizer/qorganizer-eds-removebyidrequestdata.cpp 2014-04-18 03:16:33 +0000
311+++ organizer/qorganizer-eds-removebyidrequestdata.cpp 2014-06-10 18:21:21 +0000
312@@ -46,15 +46,18 @@
313 {
314 }
315
316-void RemoveByIdRequestData::finish(QtOrganizer::QOrganizerManager::Error error)
317+void RemoveByIdRequestData::finish(QtOrganizer::QOrganizerManager::Error error,
318+ QtOrganizer::QOrganizerAbstractRequest::State state)
319 {
320 e_client_refresh_sync(m_client, 0, 0);
321 QOrganizerManagerEngine::updateItemRemoveByIdRequest(request<QOrganizerItemRemoveByIdRequest>(),
322 error,
323 QMap<int, QOrganizerManager::Error>(),
324- QOrganizerAbstractRequest::FinishedState);
325+ state);
326 //The signal will be fired by the view watcher. Check ViewWatcher::onObjectsRemoved
327 //emitChangeset(&m_changeSet);
328+
329+ RequestData::finish(error, state);
330 }
331
332 GSList *RemoveByIdRequestData::compIds() const
333
334=== modified file 'organizer/qorganizer-eds-removebyidrequestdata.h'
335--- qorganizer/qorganizer-eds-removebyidrequestdata.h 2014-01-05 18:18:32 +0000
336+++ organizer/qorganizer-eds-removebyidrequestdata.h 2014-06-10 18:21:21 +0000
337@@ -31,7 +31,8 @@
338
339 QString collectionId() const;
340
341- void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError);
342+ void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError,
343+ QtOrganizer::QOrganizerAbstractRequest::State state = QtOrganizer::QOrganizerAbstractRequest::FinishedState);
344
345 GSList *compIds() const;
346
347
348=== modified file 'organizer/qorganizer-eds-removecollectionrequestdata.cpp'
349--- qorganizer/qorganizer-eds-removecollectionrequestdata.cpp 2013-12-03 01:23:34 +0000
350+++ organizer/qorganizer-eds-removecollectionrequestdata.cpp 2014-06-10 18:21:21 +0000
351@@ -39,21 +39,16 @@
352 {
353 }
354
355-void RemoveCollectionRequestData::finish(QtOrganizer::QOrganizerManager::Error error)
356+void RemoveCollectionRequestData::finish(QOrganizerManager::Error error,
357+ QOrganizerAbstractRequest::State state)
358 {
359 QOrganizerManagerEngine::updateCollectionRemoveRequest(request<QOrganizerCollectionRemoveRequest>(),
360 error,
361 m_errorMap,
362- QOrganizerAbstractRequest::FinishedState);
363-
364- QList<QOrganizerCollectionId> removedIds = m_pendingCollections;
365- Q_FOREACH(int index, m_errorMap.keys()) {
366- removedIds.removeAt(index);
367- }
368-
369- QOrganizerCollectionChangeSet cs;
370- cs.insertRemovedCollections(removedIds);
371- emitChangeset(&cs);
372+ state);
373+
374+ // changes will be fired by source-registry
375+ RequestData::finish(error, state);
376 }
377
378 void RemoveCollectionRequestData::commit(QtOrganizer::QOrganizerManager::Error error)
379
380=== modified file 'organizer/qorganizer-eds-removecollectionrequestdata.h'
381--- qorganizer/qorganizer-eds-removecollectionrequestdata.h 2013-12-03 01:23:34 +0000
382+++ organizer/qorganizer-eds-removecollectionrequestdata.h 2014-06-10 18:21:21 +0000
383@@ -29,7 +29,8 @@
384 RemoveCollectionRequestData(QOrganizerEDSEngine *engine, QtOrganizer::QOrganizerAbstractRequest *req);
385 ~RemoveCollectionRequestData();
386
387- void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError);
388+ void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError,
389+ QtOrganizer::QOrganizerAbstractRequest::State state = QtOrganizer::QOrganizerAbstractRequest::FinishedState);
390
391 ESource* begin();
392 void commit(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError);
393
394=== modified file 'organizer/qorganizer-eds-removerequestdata.cpp'
395--- qorganizer/qorganizer-eds-removerequestdata.cpp 2014-04-18 03:16:33 +0000
396+++ organizer/qorganizer-eds-removerequestdata.cpp 2014-06-10 18:21:21 +0000
397@@ -65,16 +65,18 @@
398 return ids;
399 }
400
401-void RemoveRequestData::finish(QtOrganizer::QOrganizerManager::Error error)
402+void RemoveRequestData::finish(QOrganizerManager::Error error,
403+ QOrganizerAbstractRequest::State state)
404 {
405 e_client_refresh_sync(m_client, 0, 0);
406 QOrganizerManagerEngine::updateItemRemoveRequest(request<QOrganizerItemRemoveRequest>(),
407 error,
408 QMap<int, QOrganizerManager::Error>(),
409- QOrganizerAbstractRequest::FinishedState);
410+ state);
411
412 //The signal will be fired by the view watcher. Check ViewWatcher::onObjectsRemoved
413 //emitChangeset(&m_changeSet);
414+ RequestData::finish(error, state);
415 }
416
417 GSList *RemoveRequestData::compIds() const
418
419=== modified file 'organizer/qorganizer-eds-removerequestdata.h'
420--- qorganizer/qorganizer-eds-removerequestdata.h 2013-12-31 15:42:33 +0000
421+++ organizer/qorganizer-eds-removerequestdata.h 2014-06-10 18:21:21 +0000
422@@ -32,7 +32,8 @@
423 QList<QtOrganizer::QOrganizerCollectionId> pendingCollections() const;
424 QtOrganizer::QOrganizerCollectionId collectionId() const;
425
426- void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError);
427+ void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError,
428+ QtOrganizer::QOrganizerAbstractRequest::State state = QtOrganizer::QOrganizerAbstractRequest::FinishedState);
429
430 GSList *compIds() const;
431
432
433=== modified file 'organizer/qorganizer-eds-requestdata.cpp'
434--- qorganizer/qorganizer-eds-requestdata.cpp 2014-04-18 20:30:59 +0000
435+++ organizer/qorganizer-eds-requestdata.cpp 2014-06-10 18:21:21 +0000
436@@ -18,6 +18,9 @@
437
438 #include "qorganizer-eds-requestdata.h"
439
440+#include <QtCore/QDebug>
441+#include <QtCore/QCoreApplication>
442+
443 #include <QtOrganizer/QOrganizerAbstractRequest>
444 #include <QtOrganizer/QOrganizerManagerEngine>
445
446@@ -25,9 +28,9 @@
447
448 RequestData::RequestData(QOrganizerEDSEngine *engine, QtOrganizer::QOrganizerAbstractRequest *req)
449 : m_parent(engine),
450- m_req(req),
451 m_client(0),
452- m_canceling(false)
453+ m_finished(false),
454+ m_req(req)
455 {
456 QOrganizerManagerEngine::updateRequestState(req, QOrganizerAbstractRequest::ActiveState);
457 m_cancellable = g_cancellable_new();
458@@ -36,7 +39,6 @@
459
460 RequestData::~RequestData()
461 {
462- Q_ASSERT(m_req->state() != QOrganizerAbstractRequest::ActiveState);
463 if (m_cancellable) {
464 g_clear_object(&m_cancellable);
465 }
466@@ -44,14 +46,10 @@
467 if (m_client) {
468 g_clear_object(&m_client);
469 }
470-
471- m_parent->m_runningRequests.remove(m_req);
472 }
473
474 GCancellable* RequestData::cancellable() const
475 {
476- g_cancellable_reset(m_cancellable);
477- //g_object_ref(m_cancellable);
478 return m_cancellable;
479 }
480
481@@ -73,26 +71,74 @@
482
483 void RequestData::cancel()
484 {
485- m_canceling = true;
486+ QMutexLocker locker(&m_canceling);
487 if (m_cancellable) {
488+ gulong id = g_cancellable_connect(m_cancellable,
489+ (GCallback) RequestData::onCancelled,
490+ this, NULL);
491+ // wait the cancel
492+ wait();
493+
494+ // cancel
495 g_cancellable_cancel(m_cancellable);
496- m_parent->waitForRequestFinished(m_req, 0);
497+
498+ // done
499+ g_cancellable_disconnect(m_cancellable, id);
500 m_cancellable = 0;
501 }
502- m_canceling = false;
503-}
504-
505-bool RequestData::cancelled() const
506-{
507- if (!m_req.isNull()) {
508- return m_canceling;
509- }
510- return false;
511-}
512-
513-void RequestData::continueCancel()
514-{
515- QOrganizerManagerEngine::updateRequestState(m_req, QOrganizerAbstractRequest::CanceledState);
516+}
517+
518+void RequestData::wait()
519+{
520+ QMutexLocker locker(&m_waiting);
521+ while(!m_finished) {
522+ QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
523+ }
524+}
525+
526+bool RequestData::isWaiting()
527+{
528+ bool result = true;
529+ if (m_waiting.tryLock()) {
530+ result = false;
531+ m_waiting.unlock();
532+ }
533+ return result;
534+}
535+
536+bool RequestData::isCanceling()
537+{
538+ bool result = true;
539+ if (m_canceling.tryLock()) {
540+ result = false;
541+ m_canceling.unlock();
542+ }
543+ return result;
544+}
545+
546+void RequestData::deleteLater()
547+{
548+ if (isWaiting() || isCanceling()) {
549+ // still running
550+ return;
551+ }
552+ m_parent->m_runningRequests.remove(m_req);
553+ delete this;
554+}
555+
556+void RequestData::finish(QOrganizerManager::Error error, QtOrganizer::QOrganizerAbstractRequest::State state)
557+{
558+ Q_UNUSED(error);
559+ Q_UNUSED(state);
560+ m_finished = true;
561+}
562+
563+void RequestData::onCancelled(GCancellable *cancellable, RequestData *self)
564+{
565+ Q_UNUSED(cancellable);
566+ if (self->m_req) {
567+ self->finish(QOrganizerManager::UnspecifiedError, QOrganizerAbstractRequest::CanceledState);
568+ }
569 }
570
571 void RequestData::setClient(EClient *client)
572
573=== modified file 'organizer/qorganizer-eds-requestdata.h'
574--- qorganizer/qorganizer-eds-requestdata.h 2014-04-18 19:55:27 +0000
575+++ organizer/qorganizer-eds-requestdata.h 2014-06-10 18:21:21 +0000
576@@ -24,6 +24,7 @@
577
578 #include <QtCore/QPointer>
579 #include <QtCore/QMutex>
580+#include <QtCore/QEventLoop>
581
582 #include <QtOrganizer/QOrganizerAbstractRequest>
583 #include <QtOrganizer/QOrganizerManager>
584@@ -33,16 +34,17 @@
585 {
586 public:
587 RequestData(QOrganizerEDSEngine *engine, QtOrganizer::QOrganizerAbstractRequest *req);
588- virtual ~RequestData();
589 GCancellable* cancellable() const;
590 bool isLive() const;
591 void setClient(EClient *client);
592 ECalClient *client() const;
593- virtual void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError) = 0;
594 QOrganizerEDSEngine *parent() const;
595 virtual void cancel();
596- bool cancelled() const;
597- void continueCancel();
598+ void deleteLater();
599+ virtual void finish(QtOrganizer::QOrganizerManager::Error error, QtOrganizer::QOrganizerAbstractRequest::State state) = 0;
600+ void wait();
601+ bool isWaiting();
602+ bool isCanceling();
603
604 template<class T>
605 T* request() const {
606@@ -56,13 +58,19 @@
607
608 protected:
609 QOrganizerEDSEngine *m_parent;
610+ EClient *m_client;
611 QtOrganizer::QOrganizerItemChangeSet m_changeSet;
612- EClient *m_client;
613- bool m_canceling;
614+ QMutex m_waiting;
615+ QMutex m_canceling;
616+ bool m_finished;
617+
618+ virtual ~RequestData();
619
620 private:
621 QPointer<QtOrganizer::QOrganizerAbstractRequest> m_req;
622 GCancellable *m_cancellable;
623+
624+ static void onCancelled(GCancellable *cancellable, RequestData *self);
625 };
626
627 #endif
628
629=== modified file 'organizer/qorganizer-eds-savecollectionrequestdata.cpp'
630--- qorganizer/qorganizer-eds-savecollectionrequestdata.cpp 2014-03-21 18:04:50 +0000
631+++ organizer/qorganizer-eds-savecollectionrequestdata.cpp 2014-06-10 18:21:21 +0000
632@@ -50,16 +50,20 @@
633 }
634 }
635
636-void SaveCollectionRequestData::finish(QtOrganizer::QOrganizerManager::Error error)
637+void SaveCollectionRequestData::finish(QtOrganizer::QOrganizerManager::Error error,
638+ QtOrganizer::QOrganizerAbstractRequest::State state)
639 {
640 QOrganizerManagerEngine::updateCollectionSaveRequest(request<QOrganizerCollectionSaveRequest>(),
641 m_results.values(),
642 error,
643 m_errorMap,
644- QOrganizerAbstractRequest::FinishedState);
645-
646- emitChangeset(&m_changeSet);
647+ state);
648+
649+
650+ // changes will be fired by source-registry
651 m_changeSet.clearAll();
652+
653+ RequestData::finish(error, state);
654 }
655
656 void SaveCollectionRequestData::commitSourceCreated()
657@@ -181,11 +185,11 @@
658
659 // update name
660 QString name = collection.metaData(QOrganizerCollection::KeyName).toString();
661- e_source_set_display_name(source, name.toUtf8().data());
662+ e_source_set_display_name(source, name.toUtf8().constData());
663
664 // update color
665 QString color = collection.metaData(QOrganizerCollection::KeyColor).toString();
666- e_source_selectable_set_color(E_SOURCE_SELECTABLE(extCalendar), color.toUtf8().data());
667+ e_source_selectable_set_color(E_SOURCE_SELECTABLE(extCalendar), color.toUtf8().constData());
668
669 // update selected
670 bool selected = collection.extendedMetaData(COLLECTION_SELECTED_METADATA).toBool();
671
672=== modified file 'organizer/qorganizer-eds-savecollectionrequestdata.h'
673--- qorganizer/qorganizer-eds-savecollectionrequestdata.h 2014-03-21 18:04:50 +0000
674+++ organizer/qorganizer-eds-savecollectionrequestdata.h 2014-06-10 18:21:21 +0000
675@@ -28,7 +28,8 @@
676 QtOrganizer::QOrganizerAbstractRequest *req);
677 ~SaveCollectionRequestData();
678
679- void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError);
680+ void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError,
681+ QtOrganizer::QOrganizerAbstractRequest::State state = QtOrganizer::QOrganizerAbstractRequest::FinishedState);
682 bool isNew(int index) const;
683 bool prepareToCreate();
684 bool prepareToUpdate();
685@@ -46,7 +47,7 @@
686
687 QMap<int, QtOrganizer::QOrganizerManager::Error> m_errorMap;
688 QMap<int, QtOrganizer::QOrganizerCollection> m_results;
689- QMap<int, ESource*> m_sources;
690+ QMap<int, ESource*> m_sources;
691 QMap<int, ESource*> m_sourcesToCreate;
692 QMap<int, ESource*> m_sourcesToUpdate;
693 QtOrganizer::QOrganizerCollectionChangeSet m_changeSet;
694
695=== modified file 'organizer/qorganizer-eds-saverequestdata.cpp'
696--- qorganizer/qorganizer-eds-saverequestdata.cpp 2014-04-18 03:16:33 +0000
697+++ organizer/qorganizer-eds-saverequestdata.cpp 2014-06-10 18:21:21 +0000
698@@ -46,18 +46,17 @@
699 {
700 }
701
702-void SaveRequestData::finish(QtOrganizer::QOrganizerManager::Error error)
703+void SaveRequestData::finish(QtOrganizer::QOrganizerManager::Error error,
704+ QtOrganizer::QOrganizerAbstractRequest::State state)
705 {
706 e_client_refresh_sync(m_client, 0, 0);
707 QOrganizerManagerEngine::updateItemSaveRequest(request<QOrganizerItemSaveRequest>(),
708 m_result,
709 error,
710 m_erros,
711- QOrganizerAbstractRequest::FinishedState);
712- Q_FOREACH(const QOrganizerItem &item, m_result) {
713- m_changeSet.insertAddedItem(item.id());
714- }
715- emitChangeset(&m_changeSet);
716+ state);
717+ // Change will be fired by the viewwatcher
718+ RequestData::finish(error, state);
719 }
720
721 void SaveRequestData::appendResults(QList<QOrganizerItem> result)
722
723=== modified file 'organizer/qorganizer-eds-saverequestdata.h'
724--- qorganizer/qorganizer-eds-saverequestdata.h 2014-04-14 01:44:59 +0000
725+++ organizer/qorganizer-eds-saverequestdata.h 2014-06-10 18:21:21 +0000
726@@ -29,7 +29,8 @@
727 QtOrganizer::QOrganizerAbstractRequest *req);
728 ~SaveRequestData();
729
730- void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError);
731+ void finish(QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError,
732+ QtOrganizer::QOrganizerAbstractRequest::State state = QtOrganizer::QOrganizerAbstractRequest::FinishedState);
733
734
735 QString nextCollection();
736
737=== modified file 'organizer/qorganizer-eds-source-registry.cpp'
738--- qorganizer/qorganizer-eds-source-registry.cpp 2014-03-21 18:54:45 +0000
739+++ organizer/qorganizer-eds-source-registry.cpp 2014-06-10 18:21:21 +0000
740@@ -300,10 +300,6 @@
741 void SourceRegistry::updateCollection(QOrganizerCollection *collection,
742 ESource *source)
743 {
744- //TODO get metadata (color, etc..)
745- collection->setMetaData(QOrganizerCollection::KeyName,
746- QString::fromUtf8(e_source_get_display_name(source)));
747-
748 // name
749 collection->setMetaData(QOrganizerCollection::KeyName,
750 QString::fromUtf8(e_source_get_display_name(source)));
751@@ -328,4 +324,5 @@
752 // selected
753 bool selected = (e_source_selectable_get_selected(E_SOURCE_SELECTABLE(extCalendar)) == TRUE);
754 collection->setExtendedMetaData(COLLECTION_SELECTED_METADATA, selected);
755+
756 }
757
758=== modified file 'tests/unittest/CMakeLists.txt'
759--- tests/unittest/CMakeLists.txt 2014-02-25 18:46:32 +0000
760+++ tests/unittest/CMakeLists.txt 2014-06-10 18:21:21 +0000
761@@ -21,16 +21,16 @@
762 )
763
764 add_test(${TESTNAME}
765- ${DBUS_RUNNER} --keep-env
766- --task ${CMAKE_CURRENT_BINARY_DIR}/${TESTNAME} --task-name ${TESTNAME} --wait-until-complete --wait-for=org.gnome.evolution.dataserver.Calendar4
767- --task ${EVOLUTION_CALENDAR_FACTORY} --task-name "evolution" -r --wait-for=${EVOLUTION_SOURCE_SERVICE_NAME}
768- --task ${EVOLUTION_SOURCE_REGISTRY} --task-name "source-registry" --wait-for=org.gtk.vfs.Daemon -r
769- --task ${GVFSD} --task-name "gvfsd" -r)
770+ ${CMAKE_CURRENT_SOURCE_DIR}/run-eds-test.sh ${DBUS_RUNNER} ${CMAKE_CURRENT_BINARY_DIR}/${TESTNAME} ${TESTNAME}
771+ ${EVOLUTION_CALENDAR_FACTORY} ${EVOLUTION_SOURCE_SERVICE_NAME}
772+ ${EVOLUTION_SOURCE_REGISTRY}
773+ ${GVFSD})
774 update_test_properties(${TESTNAME})
775 endmacro(declare_test testname)
776
777 macro(update_test_properties TESTNAME)
778 set(TEST_TMP_DIR "${TMP_DIR}/${TESTNAME}")
779+ set(ENV_VARS_LIST "")
780 list(APPEND ENV_VARS_LIST "QT_QPA_PLATFORM=minimal")
781 list(APPEND ENV_VARS_LIST "HOME=${TEST_TMP_DIR}")
782 list(APPEND ENV_VARS_LIST "XDG_RUNTIME_DIR=${TEST_TMP_DIR}")
783@@ -74,3 +74,4 @@
784 declare_test(event-test)
785 declare_test(fetchitem-test)
786 declare_test(recurrence-test)
787+declare_test(cancel-operation-test)
788
789=== added file 'tests/unittest/cancel-operation-test.cpp'
790--- tests/unittest/cancel-operation-test.cpp 1970-01-01 00:00:00 +0000
791+++ tests/unittest/cancel-operation-test.cpp 2014-06-10 18:21:21 +0000
792@@ -0,0 +1,99 @@
793+/*
794+ * Copyright 2013 Canonical Ltd.
795+ *
796+ * This file is part of qtorganizer5-eds.
797+ *
798+ * contact-service-app is free software; you can redistribute it and/or modify
799+ * it under the terms of the GNU General Public License as published by
800+ * the Free Software Foundation; version 3.
801+ *
802+ * contact-service-app is distributed in the hope that it will be useful,
803+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
804+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
805+ * GNU General Public License for more details.
806+ *
807+ * You should have received a copy of the GNU General Public License
808+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
809+ */
810+
811+
812+#include <QObject>
813+#include <QtTest>
814+#include <QDebug>
815+
816+#include <QtOrganizer>
817+
818+#include "qorganizer-eds-engine.h"
819+#include "eds-base-test.h"
820+
821+
822+using namespace QtOrganizer;
823+
824+class CancelOperationTest : public QObject, public EDSBaseTest
825+{
826+ Q_OBJECT
827+private:
828+ static const QString defaultCollectionName;
829+
830+ QOrganizerEDSEngine *m_engine;
831+ QOrganizerCollection m_collection;
832+
833+private Q_SLOTS:
834+ void init()
835+ {
836+ EDSBaseTest::init();
837+ m_engine = QOrganizerEDSEngine::createEDSEngine(QMap<QString, QString>());
838+
839+
840+ QtOrganizer::QOrganizerManager::Error error;
841+ m_collection = QOrganizerCollection();
842+ m_collection.setMetaData(QOrganizerCollection::KeyName, defaultCollectionName);
843+
844+ bool saveResult = m_engine->saveCollection(&m_collection, &error);
845+ QVERIFY(saveResult);
846+ QCOMPARE(error, QtOrganizer::QOrganizerManager::NoError);
847+
848+ }
849+
850+ void cleanup()
851+ {
852+ delete m_engine;
853+ m_engine = 0;
854+ EDSBaseTest::cleanup();
855+ }
856+
857+ void cancelOperationBeforeStart()
858+ {
859+ // initial collections
860+ QList<QOrganizerCollection> collections = m_engine->collections(0);
861+ int initialCollectionsCount = collections.count();
862+
863+ QOrganizerEvent event;
864+ event.setStartDateTime(QDateTime::currentDateTime());
865+ event.setDisplayLabel("displayLabelValue");
866+ event.setDescription("descriptionValue");
867+ event.setCollectionId(m_collection.id());
868+
869+ // Try cancel a create item operation
870+ QSignalSpy createdItem(m_engine, SIGNAL(itemsAdded(QList<QOrganizerItemId>)));
871+ QOrganizerItemSaveRequest req;
872+ req.setItem(event);
873+ m_engine->startRequest(&req);
874+ QCOMPARE(req.state(), QOrganizerAbstractRequest::ActiveState);
875+ m_engine->cancelRequest(&req);
876+ QCOMPARE(req.state(), QOrganizerAbstractRequest::CanceledState);
877+ QTRY_COMPARE(createdItem.count(), 0);
878+
879+ // check if collection was not create
880+ collections = m_engine->collections(0);
881+ QCOMPARE(collections.count(), initialCollectionsCount);
882+ }
883+
884+};
885+
886+const QString CancelOperationTest::defaultCollectionName = QStringLiteral("CancelOperationTest COLLECTION");
887+
888+
889+QTEST_MAIN(CancelOperationTest)
890+
891+#include "cancel-operation-test.moc"
892
893=== modified file 'tests/unittest/collections-test.cpp'
894--- tests/unittest/collections-test.cpp 2014-03-21 18:04:50 +0000
895+++ tests/unittest/collections-test.cpp 2014-06-10 18:21:21 +0000
896@@ -44,7 +44,7 @@
897 private Q_SLOTS:
898 void init()
899 {
900- EDSBaseTest::init(0);
901+ EDSBaseTest::init();
902 m_engineWrite = QOrganizerEDSEngine::createEDSEngine(QMap<QString, QString>());
903 m_engineRead = QOrganizerEDSEngine::createEDSEngine(QMap<QString, QString>());
904 }
905@@ -52,9 +52,10 @@
906 void cleanup()
907 {
908 delete m_engineRead;
909+ delete m_engineWrite;
910 m_engineRead = 0;
911- EDSBaseTest::cleanup(m_engineWrite);
912 m_engineWrite = 0;
913+ EDSBaseTest::cleanup();
914 }
915
916 void testCreateCollection()
917@@ -91,22 +92,35 @@
918 QOrganizerCollection collection;
919 QtOrganizer::QOrganizerManager::Error error;
920 collection.setMetaData(QOrganizerCollection::KeyName, defaultCollectionName);
921- collection.setMetaData(QOrganizerCollection::KeyColor, "red");
922+ collection.setMetaData(QOrganizerCollection::KeyColor, QStringLiteral("red"));
923+ collection.setExtendedMetaData(QStringLiteral("collection-selected"), false);
924
925 QVERIFY(m_engineWrite->saveCollection(&collection, &error));
926 QCOMPARE(error, QOrganizerManager::NoError);
927 QVERIFY(!collection.id().isNull());
928
929+ // Check if the collection was stored correct
930+ QOrganizerCollection newCollection = m_engineRead->collection(collection.id(), &error);
931+ QCOMPARE(newCollection.metaData(QOrganizerCollection::KeyName).toString(), defaultCollectionName);
932+ QCOMPARE(newCollection.metaData(QOrganizerCollection::KeyColor).toString(), QStringLiteral("red"));
933+ QCOMPARE(newCollection.extendedMetaData(QStringLiteral("collection-selected")).toBool(), false);
934+
935+
936 // update the collection
937 QSignalSpy updateCollection(m_engineWrite, SIGNAL(collectionsChanged(QList<QOrganizerCollectionId>)));
938 collection.setMetaData(QOrganizerCollection::KeyColor, "blue");
939 collection.setExtendedMetaData("collection-selected", true);
940 QVERIFY(m_engineWrite->saveCollection(&collection, &error));
941 QCOMPARE(error, QOrganizerManager::NoError);
942- QTRY_COMPARE(updateCollection.count(), 1);
943-
944- // Check if the collection was stored correct
945- QOrganizerCollection newCollection = m_engineRead->collection(collection.id(), &error);
946+
947+ QTRY_VERIFY(updateCollection.count() > 0);
948+ QList<QVariant> args = updateCollection.takeFirst();
949+ QCOMPARE(args.count(), 1);
950+ QCOMPARE(args[0].value<QList<QOrganizerCollectionId> >().at(0).toString(), collection.id().toString());
951+
952+
953+ // Check if the collection was updated correct
954+ newCollection = m_engineRead->collection(collection.id(), &error);
955 QCOMPARE(error, QOrganizerManager::NoError);
956 QCOMPARE(newCollection.metaData(QOrganizerCollection::KeyName).toString(), defaultCollectionName);
957 QCOMPARE(newCollection.metaData(QOrganizerCollection::KeyColor).toString(), QStringLiteral("blue"));
958
959=== modified file 'tests/unittest/eds-base-test.cpp'
960--- tests/unittest/eds-base-test.cpp 2013-12-11 13:16:50 +0000
961+++ tests/unittest/eds-base-test.cpp 2014-06-10 18:21:21 +0000
962@@ -29,71 +29,45 @@
963
964 EDSBaseTest::EDSBaseTest()
965 {
966- GError *error = 0;
967- m_sourceRegistry = e_source_registry_new_sync(0, &error);
968- if (error) {
969- qWarning() << "Fail to create sourge registry:" << error->message;
970- g_error_free(error);
971- Q_ASSERT(false);
972- }
973+ qRegisterMetaType<QList<QOrganizerCollectionId> >();
974+ qRegisterMetaType<QList<QOrganizerItemId> >();
975+ QCoreApplication::addLibraryPath(QORGANIZER_DEV_PATH);
976 }
977
978 EDSBaseTest::~EDSBaseTest()
979 {
980- g_object_unref(m_sourceRegistry);
981-}
982-
983-void EDSBaseTest::init(QOrganizerEDSEngine *engine)
984-{
985- cleanup(engine);
986- // wait to flush DBUS calls
987- QTest::qWait(1000);
988-}
989-
990-void EDSBaseTest::cleanup(QOrganizerEDSEngine *engine)
991-{
992- // remove all new items, remove item by item because they can have diff collections
993- Q_FOREACH(const QOrganizerItemId &id, m_newItems) {
994- QtOrganizer::QOrganizerManager::Error error;
995- QMap<int, QtOrganizer::QOrganizerManager::Error> errorMap;
996-
997- engine->removeItems(QList<QOrganizerItemId>() << id,
998- &errorMap,
999- &error);
1000- }
1001- m_newItems.clear();
1002+}
1003+
1004+void EDSBaseTest::init()
1005+{
1006+}
1007+
1008+
1009+void EDSBaseTest::cleanup()
1010+{
1011+ static QStringList defaultSources;
1012+
1013+ if (defaultSources.isEmpty()) {
1014+ defaultSources << "qtorganizer:eds::birthdays"
1015+ << "qtorganizer:eds::system-calendar"
1016+ << "qtorganizer:eds::system-memo-list"
1017+ << "qtorganizer:eds::system-task-list";
1018+ }
1019+ QOrganizerEDSEngine *engine = QOrganizerEDSEngine::createEDSEngine(QMap<QString, QString>());
1020+ Q_FOREACH(const QOrganizerCollection &col, engine->collections(0)) {
1021+ if (defaultSources.contains(col.id().toString())) {
1022+ continue;
1023+ }
1024+ QSignalSpy removeCollection(engine, SIGNAL(collectionsRemoved(QList<QOrganizerCollectionId>)));
1025+ QVERIFY(engine->removeCollection(col.id(), 0));
1026+ QTRY_COMPARE(removeCollection.count(), 1);
1027+
1028+ QList<QVariant> args = removeCollection.takeFirst();
1029+ QCOMPARE(args.count(), 1);
1030+ QCOMPARE(args[0].value<QList<QOrganizerCollectionId> >().at(0).toString(), col.id().toString());
1031+ }
1032+
1033 delete engine;
1034-
1035- // remove all collections
1036- GError *error;
1037- gboolean status;
1038- GList *sources = e_source_registry_list_sources(m_sourceRegistry, 0);
1039-
1040- for(GList *i = sources; i != 0; i = i->next) {
1041- ESource *source = E_SOURCE(i->data);
1042- error = 0;
1043- status = true;
1044- if (e_source_get_remote_deletable(source)) {
1045- status = e_source_remote_delete_sync(source, 0, &error);
1046- QTest::qWait(100);
1047- } else if (e_source_get_removable(source)) {
1048- status = e_source_remove_sync(source, 0, &error);
1049- QTest::qWait(100);
1050- // check if source was removed
1051- const gchar *uid = e_source_get_uid(source);
1052- Q_ASSERT(e_source_registry_ref_source(m_sourceRegistry, uid) == 0);
1053- }
1054- if (error) {
1055- qWarning() << "Fail to remove source:" << error->message;
1056- g_error_free(error);
1057- Q_ASSERT(false);
1058- }
1059-
1060- Q_ASSERT(status);
1061- }
1062-
1063- g_list_free_full(sources, g_object_unref);
1064- e_source_registry_debug_dump(m_sourceRegistry, 0);
1065 }
1066
1067 void EDSBaseTest::appendToRemove(const QtOrganizer::QOrganizerItemId &id)
1068
1069=== modified file 'tests/unittest/eds-base-test.h'
1070--- tests/unittest/eds-base-test.h 2013-12-05 23:30:09 +0000
1071+++ tests/unittest/eds-base-test.h 2014-06-10 18:21:21 +0000
1072@@ -32,13 +32,12 @@
1073 ~EDSBaseTest();
1074
1075 protected:
1076- void init(QOrganizerEDSEngine *engine);
1077- void cleanup(QOrganizerEDSEngine *engine);
1078+ void init();
1079+ void cleanup();
1080
1081 void appendToRemove(const QtOrganizer::QOrganizerItemId &id);
1082
1083 private:
1084- ESourceRegistry *m_sourceRegistry;
1085 QList<QtOrganizer::QOrganizerItemId> m_newItems;
1086 };
1087
1088
1089=== modified file 'tests/unittest/event-test.cpp'
1090--- tests/unittest/event-test.cpp 2014-04-17 21:05:38 +0000
1091+++ tests/unittest/event-test.cpp 2014-06-10 18:21:21 +0000
1092@@ -48,7 +48,7 @@
1093 private Q_SLOTS:
1094 void init()
1095 {
1096- EDSBaseTest::init(0);
1097+ EDSBaseTest::init();
1098
1099 signalIndex = 0;
1100 m_itemRemovedTime = QDateTime();
1101@@ -67,7 +67,7 @@
1102
1103 void cleanup()
1104 {
1105- EDSBaseTest::cleanup(m_engine);
1106+ EDSBaseTest::cleanup();
1107 }
1108
1109 //helper
1110
1111=== modified file 'tests/unittest/fetchitem-test.cpp'
1112--- tests/unittest/fetchitem-test.cpp 2014-01-29 18:10:44 +0000
1113+++ tests/unittest/fetchitem-test.cpp 2014-06-10 18:21:21 +0000
1114@@ -42,7 +42,7 @@
1115 private Q_SLOTS:
1116 void initTestCase()
1117 {
1118- EDSBaseTest::init(0);
1119+ EDSBaseTest::init();
1120 m_engine = QOrganizerEDSEngine::createEDSEngine(QMap<QString, QString>());
1121
1122 // create test collection
1123@@ -87,9 +87,10 @@
1124 {
1125 m_collection = QOrganizerCollection();
1126 m_events.clear();
1127-
1128- EDSBaseTest::cleanup(m_engine);
1129+ delete m_engine;
1130 m_engine = 0;
1131+
1132+ EDSBaseTest::cleanup();
1133 }
1134
1135 void testFetchById()
1136
1137=== modified file 'tests/unittest/recurrence-test.cpp'
1138--- tests/unittest/recurrence-test.cpp 2014-04-15 19:42:59 +0000
1139+++ tests/unittest/recurrence-test.cpp 2014-06-10 18:21:21 +0000
1140@@ -64,6 +64,9 @@
1141 QList<QtOrganizer::QOrganizerItemDetail::DetailType>(),
1142 &errorMap,
1143 &error);
1144+ if (!saveResult) {
1145+ qWarning() << "Fail to save items";
1146+ }
1147
1148 Q_ASSERT(saveResult);
1149 Q_ASSERT(error == QtOrganizer::QOrganizerManager::NoError);
1150@@ -77,7 +80,7 @@
1151 private Q_SLOTS:
1152 void init()
1153 {
1154- EDSBaseTest::init(0);
1155+ EDSBaseTest::init();
1156
1157 m_engine = QOrganizerEDSEngine::createEDSEngine(QMap<QString, QString>());
1158
1159@@ -92,7 +95,9 @@
1160
1161 void cleanup()
1162 {
1163- EDSBaseTest::cleanup(m_engine);
1164+ delete m_engine;
1165+ m_engine = 0;
1166+ EDSBaseTest::cleanup();
1167 }
1168
1169 void testCreateWeeklyEvent()
1170
1171=== added file 'tests/unittest/run-eds-test.sh'
1172--- tests/unittest/run-eds-test.sh 1970-01-01 00:00:00 +0000
1173+++ tests/unittest/run-eds-test.sh 2014-06-10 18:21:21 +0000
1174@@ -0,0 +1,16 @@
1175+#!/bin/sh
1176+
1177+#ARG1 - DBUS RUNNERN PATH
1178+#ARG2 - TEST EXECUTABLE FULL PATH
1179+#ARG3 - TEST NAME
1180+#ARG4 - EVOLUTION_CALENDAR_FACTORY FULL PATH
1181+#ARG5 - EVOLUTION_CALENDAR_FACTORY SERVICE NAME
1182+#ARG6 - EVOLUTION_SOURCE_REGISTRY FULL PATH
1183+
1184+rm -rf $XDG_DATA_HOME
1185+$1 --keep-env \
1186+--task $2 --task-name $3 --wait-until-complete --wait-for=org.gnome.evolution.dataserver.Calendar4 \
1187+--task $4 --task-name "evolution" -r --wait-for=$5 \
1188+--task $6 --task-name "source-registry" --wait-for=org.gtk.vfs.Daemon -r \
1189+--task $7 --task-name "gvfsd" -r
1190+return $?

Subscribers

People subscribed via source and target branches