Merge lp:~charlesk/indicator-datetime/15.04-lp-1473068-sanitize-inputs-to-GTimeZoneNew into lp:indicator-datetime/15.04
- 15.04-lp-1473068-sanitize-inputs-to-GTimeZoneNew
- Merge into trunk.15.04
Status: | Merged |
---|---|
Approved by: | Antti Kaijanmäki |
Approved revision: | 425 |
Merged at revision: | 418 |
Proposed branch: | lp:~charlesk/indicator-datetime/15.04-lp-1473068-sanitize-inputs-to-GTimeZoneNew |
Merge into: | lp:indicator-datetime/15.04 |
Diff against target: |
719 lines (+397/-102) 8 files modified
debian/changelog (+23/-27) src/engine-eds.cpp (+68/-28) tests/CMakeLists.txt (+7/-16) tests/run-eds-ics-test.sh (+30/-31) tests/test-eds-ics-tzids-2.cpp (+88/-0) tests/test-eds-ics-tzids-2.ics (+38/-0) tests/test-eds-ics-tzids.cpp (+87/-0) tests/test-eds-ics-tzids.ics (+56/-0) |
To merge this branch: | bzr merge lp:~charlesk/indicator-datetime/15.04-lp-1473068-sanitize-inputs-to-GTimeZoneNew |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Charles Kerr (community) | Approve | ||
PS Jenkins bot (community) | continuous-integration | Approve | |
Antti Kaijanmäki (community) | Approve | ||
dobey (community) | Approve | ||
Review via email: mp+264338@code.launchpad.net |
Commit message
Get icaltimezone structures from EDS rather than assuming the tzid will always be GTimeZone friendly.
Description of the change
When we get a tzid from EDS, have EDS convert it into an icaltimezone struct itself, then use =that= to create our own GTimeZones. This way we have a better chance of getting a tzid that GTimeZone will be happy with.
PS Jenkins bot (ps-jenkins) wrote : | # |
- 421. By Charles Kerr
-
avoid the round trip to EDS if we can figure out the tzid from libical first
- 422. By Charles Kerr
-
add dobey's test case that has 'TZID:Pacific Time (US & Canada)'
- 423. By Charles Kerr
-
oops, disabling the other tests was only supposed to be to speed up local tests & wasn't supposed to be pushed
- 424. By Charles Kerr
-
add dobey's tests
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:423
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 425. By Charles Kerr
-
add a g_warning() if we can't suss out the tzid
dobey (dobey) : | # |
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:424
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:423
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
- 426. By Charles Kerr
-
sync with trunk
Charles Kerr (charlesk) wrote : | # |
approving trunk sync to make build happy
Preview Diff
1 | === modified file 'debian/changelog' | |||
2 | --- debian/changelog 2015-06-18 19:25:41 +0000 | |||
3 | +++ debian/changelog 2015-07-10 17:29:43 +0000 | |||
4 | @@ -1,3 +1,26 @@ | |||
5 | 1 | indicator-datetime (13.10.0+15.10.20150624-0ubuntu1) wily; urgency=medium | ||
6 | 2 | |||
7 | 3 | [ Charles Kerr ] | ||
8 | 4 | * Speedups/cleanups to the EDS regression tests | ||
9 | 5 | |||
10 | 6 | -- CI Train Bot <ci-train-bot@canonical.com> Wed, 24 Jun 2015 12:51:27 +0000 | ||
11 | 7 | |||
12 | 8 | indicator-datetime (13.10.0+15.10.20150622-0ubuntu1) wily; urgency=medium | ||
13 | 9 | |||
14 | 10 | [ Charles Kerr ] | ||
15 | 11 | * Fix bugs relating to timezones and triggers from clock-app alarms. | ||
16 | 12 | (LP: #1456281, #1465806) | ||
17 | 13 | |||
18 | 14 | -- CI Train Bot <ci-train-bot@canonical.com> Mon, 22 Jun 2015 18:03:38 +0000 | ||
19 | 15 | |||
20 | 16 | indicator-datetime (13.10.0+15.10.20150515-0ubuntu1) wily; urgency=medium | ||
21 | 17 | |||
22 | 18 | [ Charles Kerr ] | ||
23 | 19 | * Honor the 'other vibrations' setting to enable/disable vibrations | ||
24 | 20 | when alarm notifications are shown. | ||
25 | 21 | |||
26 | 22 | -- CI Train Bot <ci-train-bot@canonical.com> Fri, 15 May 2015 16:41:41 +0000 | ||
27 | 23 | |||
28 | 1 | indicator-datetime (13.10.0+15.04.20150618-0ubuntu1) vivid; urgency=medium | 24 | indicator-datetime (13.10.0+15.04.20150618-0ubuntu1) vivid; urgency=medium |
29 | 2 | 25 | ||
30 | 3 | [ Charles Kerr ] | 26 | [ Charles Kerr ] |
31 | @@ -5,33 +28,6 @@ | |||
32 | 5 | 28 | ||
33 | 6 | -- CI Train Bot <ci-train-bot@canonical.com> Thu, 18 Jun 2015 19:25:41 +0000 | 29 | -- CI Train Bot <ci-train-bot@canonical.com> Thu, 18 Jun 2015 19:25:41 +0000 |
34 | 7 | 30 | ||
35 | 8 | indicator-datetime (13.10.0+15.04.20150521-0ubuntu1) vivid; urgency=medium | ||
36 | 9 | |||
37 | 10 | [ Charles Kerr ] | ||
38 | 11 | * Fix regression that caused nonrepeating alarms to go off at the | ||
39 | 12 | wrong time. (LP: #1456281) | ||
40 | 13 | |||
41 | 14 | -- CI Train Bot <ci-train-bot@canonical.com> Thu, 21 May 2015 15:24:31 +0000 | ||
42 | 15 | |||
43 | 16 | indicator-datetime (13.10.0+15.04.20150515-0ubuntu1) vivid; urgency=medium | ||
44 | 17 | |||
45 | 18 | [ Charles Kerr ] | ||
46 | 19 | * Honor the 'other vibrations' setting to enable/disable vibrations | ||
47 | 20 | when alarm notifications are shown. | ||
48 | 21 | |||
49 | 22 | -- CI Train Bot <ci-train-bot@canonical.com> Fri, 15 May 2015 19:33:54 +0000 | ||
50 | 23 | |||
51 | 24 | indicator-datetime (13.10.0+15.04.20150508.2-0ubuntu1) vivid; urgency=medium | ||
52 | 25 | |||
53 | 26 | [ CI Train Bot ] | ||
54 | 27 | * New rebuild forced. | ||
55 | 28 | |||
56 | 29 | [ Charles Kerr ] | ||
57 | 30 | * If the "X-CANONICAL-ACTIVATION-URL" x-prop is defined in the VTODO | ||
58 | 31 | or VEVENT, use it for url delegation. (LP: #1426519) | ||
59 | 32 | |||
60 | 33 | -- CI Train Bot <ci-train-bot@canonical.com> Fri, 08 May 2015 20:01:09 +0000 | ||
61 | 34 | |||
62 | 35 | indicator-datetime (13.10.0+15.04.20150406-0ubuntu1) vivid; urgency=medium | 31 | indicator-datetime (13.10.0+15.04.20150406-0ubuntu1) vivid; urgency=medium |
63 | 36 | 32 | ||
64 | 37 | [ Charles Kerr ] | 33 | [ Charles Kerr ] |
65 | 38 | 34 | ||
66 | === modified file 'src/engine-eds.cpp' | |||
67 | --- src/engine-eds.cpp 2015-06-18 04:53:52 +0000 | |||
68 | +++ src/engine-eds.cpp 2015-07-10 17:29:43 +0000 | |||
69 | @@ -47,16 +47,21 @@ | |||
70 | 47 | { | 47 | { |
71 | 48 | public: | 48 | public: |
72 | 49 | 49 | ||
75 | 50 | Impl(): | 50 | Impl() |
74 | 51 | m_cancellable(g_cancellable_new()) | ||
76 | 52 | { | 51 | { |
78 | 53 | e_source_registry_new(m_cancellable, on_source_registry_ready, this); | 52 | auto cancellable_deleter = [](GCancellable * c) { |
79 | 53 | g_cancellable_cancel(c); | ||
80 | 54 | g_clear_object(&c); | ||
81 | 55 | }; | ||
82 | 56 | |||
83 | 57 | m_cancellable = std::shared_ptr<GCancellable>(g_cancellable_new(), cancellable_deleter); | ||
84 | 58 | |||
85 | 59 | e_source_registry_new(m_cancellable.get(), on_source_registry_ready, this); | ||
86 | 54 | } | 60 | } |
87 | 55 | 61 | ||
88 | 56 | ~Impl() | 62 | ~Impl() |
89 | 57 | { | 63 | { |
92 | 58 | g_cancellable_cancel(m_cancellable); | 64 | m_cancellable.reset(); |
91 | 59 | g_clear_object(&m_cancellable); | ||
93 | 60 | 65 | ||
94 | 61 | while(!m_sources.empty()) | 66 | while(!m_sources.empty()) |
95 | 62 | remove_source(*m_sources.begin()); | 67 | remove_source(*m_sources.begin()); |
96 | @@ -131,9 +136,9 @@ | |||
97 | 131 | e_cal_client_get_object_list_as_comps( | 136 | e_cal_client_get_object_list_as_comps( |
98 | 132 | client, | 137 | client, |
99 | 133 | sexp, | 138 | sexp, |
101 | 134 | m_cancellable, | 139 | m_cancellable.get(), |
102 | 135 | on_alarm_component_list_ready, | 140 | on_alarm_component_list_ready, |
104 | 136 | new ClientSubtask(main_task, client, color)); | 141 | new ClientSubtask(main_task, client, m_cancellable, color)); |
105 | 137 | g_clear_pointer(&sexp, g_free); | 142 | g_clear_pointer(&sexp, g_free); |
106 | 138 | 143 | ||
107 | 139 | // ask EDS about events that occur in this window... | 144 | // ask EDS about events that occur in this window... |
108 | @@ -142,9 +147,9 @@ | |||
109 | 142 | e_cal_client_get_object_list_as_comps( | 147 | e_cal_client_get_object_list_as_comps( |
110 | 143 | client, | 148 | client, |
111 | 144 | sexp, | 149 | sexp, |
113 | 145 | m_cancellable, | 150 | m_cancellable.get(), |
114 | 146 | on_event_component_list_ready, | 151 | on_event_component_list_ready, |
116 | 147 | new ClientSubtask(main_task, client, color)); | 152 | new ClientSubtask(main_task, client, m_cancellable, color)); |
117 | 148 | g_clear_pointer(&sexp, g_free); | 153 | g_clear_pointer(&sexp, g_free); |
118 | 149 | 154 | ||
119 | 150 | g_clear_pointer(&sexp_fmt, g_free); | 155 | g_clear_pointer(&sexp_fmt, g_free); |
120 | @@ -160,7 +165,7 @@ | |||
121 | 160 | e_cal_client_get_object(kv.second, | 165 | e_cal_client_get_object(kv.second, |
122 | 161 | appointment.uid.c_str(), | 166 | appointment.uid.c_str(), |
123 | 162 | nullptr, | 167 | nullptr, |
125 | 163 | m_cancellable, | 168 | m_cancellable.get(), |
126 | 164 | on_object_ready_for_disable, | 169 | on_object_ready_for_disable, |
127 | 165 | this); | 170 | this); |
128 | 166 | } | 171 | } |
129 | @@ -271,7 +276,7 @@ | |||
130 | 271 | g_debug("%s connecting a client to source %s", G_STRFUNC, source_uid); | 276 | g_debug("%s connecting a client to source %s", G_STRFUNC, source_uid); |
131 | 272 | e_cal_client_connect(source, | 277 | e_cal_client_connect(source, |
132 | 273 | source_type, | 278 | source_type, |
134 | 274 | self->m_cancellable, | 279 | self->m_cancellable.get(), |
135 | 275 | on_client_connected, | 280 | on_client_connected, |
136 | 276 | gself); | 281 | gself); |
137 | 277 | } | 282 | } |
138 | @@ -306,7 +311,7 @@ | |||
139 | 306 | // now create a view for it so that we can listen for changes | 311 | // now create a view for it so that we can listen for changes |
140 | 307 | e_cal_client_get_view (ecc, | 312 | e_cal_client_get_view (ecc, |
141 | 308 | "#t", // match all | 313 | "#t", // match all |
143 | 309 | self->m_cancellable, | 314 | self->m_cancellable.get(), |
144 | 310 | on_client_view_ready, | 315 | on_client_view_ready, |
145 | 311 | self); | 316 | self); |
146 | 312 | 317 | ||
147 | @@ -429,7 +434,7 @@ | |||
148 | 429 | e_cal_client_get_object_list_as_comps( | 434 | e_cal_client_get_object_list_as_comps( |
149 | 430 | client, | 435 | client, |
150 | 431 | sexp, | 436 | sexp, |
152 | 432 | m_cancellable, | 437 | m_cancellable.get(), |
153 | 433 | ensure_client_alarms_have_triggers_async_cb, | 438 | ensure_client_alarms_have_triggers_async_cb, |
154 | 434 | this); | 439 | this); |
155 | 435 | 440 | ||
156 | @@ -510,7 +515,7 @@ | |||
157 | 510 | e_cal_client_modify_objects(client, | 515 | e_cal_client_modify_objects(client, |
158 | 511 | modify_slist, | 516 | modify_slist, |
159 | 512 | E_CAL_OBJ_MOD_ALL, | 517 | E_CAL_OBJ_MOD_ALL, |
161 | 513 | m_cancellable, | 518 | m_cancellable.get(), |
162 | 514 | ensure_canonical_alarms_have_triggers_async_cb, | 519 | ensure_canonical_alarms_have_triggers_async_cb, |
163 | 515 | this); | 520 | this); |
164 | 516 | 521 | ||
165 | @@ -580,13 +585,16 @@ | |||
166 | 580 | { | 585 | { |
167 | 581 | std::shared_ptr<Task> task; | 586 | std::shared_ptr<Task> task; |
168 | 582 | ECalClient* client; | 587 | ECalClient* client; |
169 | 588 | std::shared_ptr<GCancellable> cancellable; | ||
170 | 583 | std::string color; | 589 | std::string color; |
171 | 584 | 590 | ||
172 | 585 | ClientSubtask(const std::shared_ptr<Task>& task_in, | 591 | ClientSubtask(const std::shared_ptr<Task>& task_in, |
173 | 586 | ECalClient* client_in, | 592 | ECalClient* client_in, |
174 | 593 | const std::shared_ptr<GCancellable>& cancellable_in, | ||
175 | 587 | const char* color_in): | 594 | const char* color_in): |
176 | 588 | task(task_in), | 595 | task(task_in), |
178 | 589 | client(client_in) | 596 | client(client_in), |
179 | 597 | cancellable(cancellable_in) | ||
180 | 590 | { | 598 | { |
181 | 591 | if (color_in) | 599 | if (color_in) |
182 | 592 | color = color_in; | 600 | color = color_in; |
183 | @@ -720,15 +728,44 @@ | |||
184 | 720 | } | 728 | } |
185 | 721 | 729 | ||
186 | 722 | static DateTime | 730 | static DateTime |
189 | 723 | datetime_from_component_date_time(const ECalComponentDateTime & in, | 731 | datetime_from_component_date_time(ECalClient * client, |
190 | 724 | GTimeZone * default_timezone) | 732 | std::shared_ptr<GCancellable> & cancellable, |
191 | 733 | const ECalComponentDateTime & in, | ||
192 | 734 | GTimeZone * default_timezone) | ||
193 | 725 | { | 735 | { |
194 | 726 | DateTime out; | 736 | DateTime out; |
195 | 727 | |||
196 | 728 | g_return_val_if_fail(in.value != nullptr, out); | 737 | g_return_val_if_fail(in.value != nullptr, out); |
197 | 729 | 738 | ||
200 | 730 | auto gtz = in.tzid == nullptr ? g_time_zone_ref(default_timezone) | 739 | GTimeZone * gtz {}; |
201 | 731 | : g_time_zone_new(in.tzid); | 740 | if (in.tzid != nullptr) |
202 | 741 | { | ||
203 | 742 | auto itz = icaltimezone_get_builtin_timezone_from_tzid(in.tzid); // usually works | ||
204 | 743 | |||
205 | 744 | if (itz == nullptr) // fallback | ||
206 | 745 | itz = icaltimezone_get_builtin_timezone(in.tzid); | ||
207 | 746 | |||
208 | 747 | if (itz == nullptr) // ok we have a strange tzid... ask EDS to look it up in VTIMEZONES | ||
209 | 748 | e_cal_client_get_timezone_sync(client, in.tzid, &itz, cancellable.get(), nullptr); | ||
210 | 749 | |||
211 | 750 | const char * tzid; | ||
212 | 751 | if (itz != nullptr) | ||
213 | 752 | { | ||
214 | 753 | tzid = icaltimezone_get_location(itz); | ||
215 | 754 | } | ||
216 | 755 | else | ||
217 | 756 | { | ||
218 | 757 | g_warning("Unrecognized TZID: '%s'", in.tzid); | ||
219 | 758 | tzid = nullptr; | ||
220 | 759 | } | ||
221 | 760 | |||
222 | 761 | gtz = g_time_zone_new(tzid); | ||
223 | 762 | g_debug("%s eccdt.tzid -> offset is %d", G_STRLOC, in.tzid, (int)g_time_zone_get_offset(gtz,0)); | ||
224 | 763 | } | ||
225 | 764 | else | ||
226 | 765 | { | ||
227 | 766 | gtz = g_time_zone_ref(default_timezone); | ||
228 | 767 | } | ||
229 | 768 | |||
230 | 732 | out = DateTime(gtz, | 769 | out = DateTime(gtz, |
231 | 733 | in.value->year, | 770 | in.value->year, |
232 | 734 | in.value->month, | 771 | in.value->month, |
233 | @@ -773,7 +810,10 @@ | |||
234 | 773 | } | 810 | } |
235 | 774 | 811 | ||
236 | 775 | static Appointment | 812 | static Appointment |
238 | 776 | get_appointment(ECalComponent * component, GTimeZone * gtz) | 813 | get_appointment(ECalClient * client, |
239 | 814 | std::shared_ptr<GCancellable> & cancellable, | ||
240 | 815 | ECalComponent * component, | ||
241 | 816 | GTimeZone * gtz) | ||
242 | 777 | { | 817 | { |
243 | 778 | Appointment baseline; | 818 | Appointment baseline; |
244 | 779 | 819 | ||
245 | @@ -792,13 +832,13 @@ | |||
246 | 792 | // get appointment.begin | 832 | // get appointment.begin |
247 | 793 | ECalComponentDateTime eccdt_tmp {}; | 833 | ECalComponentDateTime eccdt_tmp {}; |
248 | 794 | e_cal_component_get_dtstart(component, &eccdt_tmp); | 834 | e_cal_component_get_dtstart(component, &eccdt_tmp); |
250 | 795 | baseline.begin = datetime_from_component_date_time(eccdt_tmp, gtz); | 835 | baseline.begin = datetime_from_component_date_time(client, cancellable, eccdt_tmp, gtz); |
251 | 796 | e_cal_component_free_datetime(&eccdt_tmp); | 836 | e_cal_component_free_datetime(&eccdt_tmp); |
252 | 797 | 837 | ||
253 | 798 | // get appointment.end | 838 | // get appointment.end |
254 | 799 | e_cal_component_get_dtend(component, &eccdt_tmp); | 839 | e_cal_component_get_dtend(component, &eccdt_tmp); |
255 | 800 | baseline.end = eccdt_tmp.value != nullptr | 840 | baseline.end = eccdt_tmp.value != nullptr |
257 | 801 | ? datetime_from_component_date_time(eccdt_tmp, gtz) | 841 | ? datetime_from_component_date_time(client, cancellable, eccdt_tmp, gtz) |
258 | 802 | : baseline.begin; | 842 | : baseline.begin; |
259 | 803 | e_cal_component_free_datetime(&eccdt_tmp); | 843 | e_cal_component_free_datetime(&eccdt_tmp); |
260 | 804 | 844 | ||
261 | @@ -839,7 +879,7 @@ | |||
262 | 839 | ClientSubtask * subtask, | 879 | ClientSubtask * subtask, |
263 | 840 | GTimeZone * gtz) | 880 | GTimeZone * gtz) |
264 | 841 | { | 881 | { |
266 | 842 | // events with alarms are covered by add_alarm_to_subtask(), | 882 | // events with alarms are covered by add_alarms_to_subtask(), |
267 | 843 | // so skip them here | 883 | // so skip them here |
268 | 844 | auto auids = e_cal_component_get_alarm_uids(component); | 884 | auto auids = e_cal_component_get_alarm_uids(component); |
269 | 845 | const bool has_alarms = auids != nullptr; | 885 | const bool has_alarms = auids != nullptr; |
270 | @@ -850,7 +890,7 @@ | |||
271 | 850 | // add it. simple, eh? | 890 | // add it. simple, eh? |
272 | 851 | if (is_component_interesting(component)) | 891 | if (is_component_interesting(component)) |
273 | 852 | { | 892 | { |
275 | 853 | Appointment appointment = get_appointment(component, gtz); | 893 | Appointment appointment = get_appointment(subtask->client, subtask->cancellable, component, gtz); |
276 | 854 | appointment.color = subtask->color; | 894 | appointment.color = subtask->color; |
277 | 855 | subtask->task->appointments.push_back(appointment); | 895 | subtask->task->appointments.push_back(appointment); |
278 | 856 | } | 896 | } |
279 | @@ -866,7 +906,7 @@ | |||
280 | 866 | if (!is_component_interesting(component)) | 906 | if (!is_component_interesting(component)) |
281 | 867 | return; | 907 | return; |
282 | 868 | 908 | ||
284 | 869 | Appointment baseline = get_appointment(component, gtz); | 909 | Appointment baseline = get_appointment(subtask->client, subtask->cancellable, component, gtz); |
285 | 870 | baseline.color = subtask->color; | 910 | baseline.color = subtask->color; |
286 | 871 | 911 | ||
287 | 872 | /** | 912 | /** |
288 | @@ -958,7 +998,7 @@ | |||
289 | 958 | e_cal_client_modify_object(E_CAL_CLIENT(client), | 998 | e_cal_client_modify_object(E_CAL_CLIENT(client), |
290 | 959 | e_cal_component_get_icalcomponent(ecc), | 999 | e_cal_component_get_icalcomponent(ecc), |
291 | 960 | E_CAL_OBJ_MOD_THIS, | 1000 | E_CAL_OBJ_MOD_THIS, |
293 | 961 | static_cast<Impl*>(gself)->m_cancellable, | 1001 | static_cast<Impl*>(gself)->m_cancellable.get(), |
294 | 962 | on_disable_done, | 1002 | on_disable_done, |
295 | 963 | nullptr); | 1003 | nullptr); |
296 | 964 | 1004 | ||
297 | @@ -990,7 +1030,7 @@ | |||
298 | 990 | std::set<ESource*> m_sources; | 1030 | std::set<ESource*> m_sources; |
299 | 991 | std::map<ESource*,ECalClient*> m_clients; | 1031 | std::map<ESource*,ECalClient*> m_clients; |
300 | 992 | std::map<ESource*,ECalClientView*> m_views; | 1032 | std::map<ESource*,ECalClientView*> m_views; |
302 | 993 | GCancellable* m_cancellable {}; | 1033 | std::shared_ptr<GCancellable> m_cancellable; |
303 | 994 | ESourceRegistry* m_source_registry {}; | 1034 | ESourceRegistry* m_source_registry {}; |
304 | 995 | guint m_rebuild_tag {}; | 1035 | guint m_rebuild_tag {}; |
305 | 996 | time_t m_rebuild_deadline {}; | 1036 | time_t m_rebuild_deadline {}; |
306 | 997 | 1037 | ||
307 | === modified file 'tests/CMakeLists.txt' | |||
308 | --- tests/CMakeLists.txt 2015-06-18 04:52:52 +0000 | |||
309 | +++ tests/CMakeLists.txt 2015-07-10 17:29:43 +0000 | |||
310 | @@ -70,13 +70,6 @@ | |||
311 | 70 | ## | 70 | ## |
312 | 71 | 71 | ||
313 | 72 | find_program(DBUS_RUNNER dbus-test-runner) | 72 | find_program(DBUS_RUNNER dbus-test-runner) |
314 | 73 | find_program(EVOLUTION_CALENDAR_FACTORY evolution-calendar-factory PATHS /usr/lib/evolution/) | ||
315 | 74 | find_program(EVOLUTION_SOURCE_REGISTRY evolution-source-registry PATHS /usr/lib/evolution/) | ||
316 | 75 | find_program(GVFSD gvfsd PATHS /usr/lib/gvfs/) | ||
317 | 76 | OPTION(EVOLUTION_SOURCE_SERVICE_NAME "DBus name for source registry") | ||
318 | 77 | if(NOT EVOLUTION_SOURCE_SERVICE_NAME) | ||
319 | 78 | set(EVOLUTION_SOURCE_SERVICE_NAME "org.gnome.evolution.dataserver.Sources3") | ||
320 | 79 | endif() | ||
321 | 80 | 73 | ||
322 | 81 | function(add_eds_ics_test_by_name name) | 74 | function(add_eds_ics_test_by_name name) |
323 | 82 | set (TEST_NAME ${name}) | 75 | set (TEST_NAME ${name}) |
324 | @@ -84,21 +77,19 @@ | |||
325 | 84 | target_link_libraries (${TEST_NAME} indicatordatetimeservice gtest ${DBUSTEST_LIBRARIES} ${SERVICE_DEPS_LIBRARIES} ${GTEST_LIBS}) | 77 | target_link_libraries (${TEST_NAME} indicatordatetimeservice gtest ${DBUSTEST_LIBRARIES} ${SERVICE_DEPS_LIBRARIES} ${GTEST_LIBS}) |
326 | 85 | add_test (${TEST_NAME} | 78 | add_test (${TEST_NAME} |
327 | 86 | ${CMAKE_CURRENT_SOURCE_DIR}/run-eds-ics-test.sh | 79 | ${CMAKE_CURRENT_SOURCE_DIR}/run-eds-ics-test.sh |
337 | 87 | ${DBUS_RUNNER} # arg1: dbus-test-runner exec | 80 | ${DBUS_RUNNER} # arg1: dbus-test-runner exec |
338 | 88 | ${CMAKE_CURRENT_BINARY_DIR}/${TEST_NAME} # arg2: test executable path | 81 | ${CMAKE_CURRENT_BINARY_DIR}/${TEST_NAME} # arg2: test executable path |
339 | 89 | ${TEST_NAME} # arg3: test name | 82 | ${TEST_NAME} # arg3: test name |
340 | 90 | ${EVOLUTION_CALENDAR_FACTORY} # arg4: evolution-calendar-factory exec | 83 | ${CMAKE_CURRENT_SOURCE_DIR}/test-eds-ics-config-files # arg4: base directory for config file template |
341 | 91 | ${EVOLUTION_SOURCE_SERVICE_NAME} # arg5: dbus name for source registry | 84 | ${CMAKE_CURRENT_SOURCE_DIR}/${TEST_NAME}.ics) # arg5: the ical file for this test |
333 | 92 | ${EVOLUTION_SOURCE_REGISTRY} # arg6: evolution-source-registry exec | ||
334 | 93 | ${GVFSD} # arg7: gvfsd exec | ||
335 | 94 | ${CMAKE_CURRENT_SOURCE_DIR}/test-eds-ics-config-files # arg8: base directory for config file template | ||
336 | 95 | ${CMAKE_CURRENT_SOURCE_DIR}/${TEST_NAME}.ics) # arg9: the ical file for this test | ||
342 | 96 | endfunction() | 85 | endfunction() |
343 | 97 | add_eds_ics_test_by_name(test-eds-ics-all-day-events) | 86 | add_eds_ics_test_by_name(test-eds-ics-all-day-events) |
344 | 98 | add_eds_ics_test_by_name(test-eds-ics-repeating-events) | 87 | add_eds_ics_test_by_name(test-eds-ics-repeating-events) |
345 | 99 | add_eds_ics_test_by_name(test-eds-ics-nonrepeating-events) | 88 | add_eds_ics_test_by_name(test-eds-ics-nonrepeating-events) |
346 | 100 | add_eds_ics_test_by_name(test-eds-ics-repeating-valarms) | 89 | add_eds_ics_test_by_name(test-eds-ics-repeating-valarms) |
347 | 101 | add_eds_ics_test_by_name(test-eds-ics-missing-trigger) | 90 | add_eds_ics_test_by_name(test-eds-ics-missing-trigger) |
348 | 91 | add_eds_ics_test_by_name(test-eds-ics-tzids) | ||
349 | 92 | add_eds_ics_test_by_name(test-eds-ics-tzids-2) | ||
350 | 102 | 93 | ||
351 | 103 | 94 | ||
352 | 104 | # disabling the timezone unit tests because they require | 95 | # disabling the timezone unit tests because they require |
353 | 105 | 96 | ||
354 | === modified file 'tests/run-eds-ics-test.sh' | |||
355 | --- tests/run-eds-ics-test.sh 2015-05-21 11:09:52 +0000 | |||
356 | +++ tests/run-eds-ics-test.sh 2015-07-10 17:29:43 +0000 | |||
357 | @@ -1,19 +1,22 @@ | |||
358 | 1 | #!/bin/sh | 1 | #!/bin/sh |
359 | 2 | 2 | ||
374 | 3 | echo ARG0=$0 # this script | 3 | SELF=$0 # this script |
375 | 4 | echo ARG1=$1 # full executable path of dbus-test-runner | 4 | TEST_RUNNER=$1 # full executable path of dbus-test-runner |
376 | 5 | echo ARG2=$2 # full executable path of test app | 5 | TEST_EXEC=$2 # full executable path of test app |
377 | 6 | echo ARG3=$3 # test name | 6 | TEST_NAME=$3 # test name |
378 | 7 | echo ARG4=$4 # full executable path of evolution-calendar-factory | 7 | CONFIG_DIR=$4 # config files |
379 | 8 | echo ARG5=$5 # bus service name of calendar factory | 8 | ICS_FILE=$5 # ical file holding test data |
380 | 9 | echo ARG6=$6 # full exectuable path of evolution-source-registry | 9 | |
381 | 10 | echo ARG7=$7 # full executable path of gvfs | 10 | echo "this script: ${SELF}" |
382 | 11 | echo ARG8=$8 # config files | 11 | echo "test-runner: ${TEST_RUNNER}" |
383 | 12 | echo ARG8=$9 # ics file | 12 | echo "test-exec: ${TEST_EXEC}" |
384 | 13 | 13 | echo "test-name: ${TEST_NAME}" | |
385 | 14 | # set up the tmpdir and tell the shell to purge it when we exit | 14 | echo "config-dir: ${CONFIG_DIR}" |
386 | 15 | export TEST_TMP_DIR=$(mktemp -p "${TMPDIR:-/tmp}" -d $3-XXXXXXXXXX) || exit 1 | 15 | echo "ics-file: ${ICS_FILE}" |
387 | 16 | echo "running test '$3' in ${TEST_TMP_DIR}" | 16 | |
388 | 17 | # set up the tmpdir | ||
389 | 18 | export TEST_TMP_DIR=$(mktemp -p "${TMPDIR:-/tmp}" -d ${TEST_NAME}-XXXXXXXXXX) || exit 1 | ||
390 | 19 | echo "running test '${TEST_NAME}' in ${TEST_TMP_DIR}" | ||
391 | 17 | 20 | ||
392 | 18 | # set up the environment variables | 21 | # set up the environment variables |
393 | 19 | export QT_QPA_PLATFORM=minimal | 22 | export QT_QPA_PLATFORM=minimal |
394 | @@ -40,23 +43,19 @@ | |||
395 | 40 | rm -rf ${XDG_DATA_HOME} | 43 | rm -rf ${XDG_DATA_HOME} |
396 | 41 | 44 | ||
397 | 42 | # if there are canned config files for this test, move them into place now | 45 | # if there are canned config files for this test, move them into place now |
415 | 43 | if [ -d $8 ]; then | 46 | if [ -d ${CONFIG_DIR} ]; then |
416 | 44 | echo "copying files from $8 to $HOME" | 47 | echo "copying files from ${CONFIG_DIR} to $HOME" |
417 | 45 | cp --verbose --archive $8/. $HOME | 48 | cp --verbose --archive ${CONFIG_DIR}/. $HOME |
418 | 46 | fi | 49 | fi |
419 | 47 | 50 | ||
420 | 48 | # if there's a specific ics file to test, copy it on top of the canned confilg files | 51 | # if there's a specific ics file to test, copy it on top of the canned config files |
421 | 49 | if [ -e $9 ]; then | 52 | if [ -e ${ICS_FILE} ]; then |
422 | 50 | echo "copying $9 into $HOME" | 53 | echo "copying ${ICS_FILE} into $HOME" |
423 | 51 | cp --verbose --archive $9 ${XDG_DATA_HOME}/evolution/tasks/system/tasks.ics | 54 | cp --verbose --archive ${ICS_FILE} ${XDG_DATA_HOME}/evolution/tasks/system/tasks.ics |
424 | 52 | fi | 55 | fi |
425 | 53 | 56 | ||
426 | 54 | # run dbus-test-runner | 57 | # run the test |
427 | 55 | $1 --keep-env --max-wait=90 \ | 58 | ${TEST_RUNNER} --keep-env --max-wait=90 --task ${TEST_EXEC} --task-name ${TEST_NAME} --wait-until-complete |
411 | 56 | --task $2 --task-name $3 --wait-until-complete --wait-for=org.gnome.evolution.dataserver.Calendar4 \ | ||
412 | 57 | --task $4 --task-name "evolution" --wait-until-complete -r | ||
413 | 58 | #--task $6 --task-name "source-registry" --wait-for=org.gtk.vfs.Daemon -r \ | ||
414 | 59 | #--task $7 --task-name "gvfsd" -r | ||
428 | 60 | rv=$? | 59 | rv=$? |
429 | 61 | 60 | ||
430 | 62 | # if the test passed, blow away the tmpdir | 61 | # if the test passed, blow away the tmpdir |
431 | 63 | 62 | ||
432 | === added file 'tests/test-eds-ics-tzids-2.cpp' | |||
433 | --- tests/test-eds-ics-tzids-2.cpp 1970-01-01 00:00:00 +0000 | |||
434 | +++ tests/test-eds-ics-tzids-2.cpp 2015-07-10 17:29:43 +0000 | |||
435 | @@ -0,0 +1,88 @@ | |||
436 | 1 | /* | ||
437 | 2 | * Copyright 2015 Canonical Ltd. | ||
438 | 3 | * | ||
439 | 4 | * This program is free software: you can redistribute it and/or modify it | ||
440 | 5 | * under the terms of the GNU General Public License version 3, as published | ||
441 | 6 | * by the Free Software Foundation. | ||
442 | 7 | * | ||
443 | 8 | * This program is distributed in the hope that it will be useful, but | ||
444 | 9 | * WITHOUT ANY WARRANTY; without even the implied warranties of | ||
445 | 10 | * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR | ||
446 | 11 | * PURPOSE. See the GNU General Public License for more details. | ||
447 | 12 | * | ||
448 | 13 | * You should have received a copy of the GNU General Public License along | ||
449 | 14 | * with this program. If not, see <http://www.gnu.org/licenses/>. | ||
450 | 15 | * | ||
451 | 16 | * Authors: | ||
452 | 17 | * Charles Kerr <charles.kerr@canonical.com> | ||
453 | 18 | */ | ||
454 | 19 | |||
455 | 20 | #include <algorithm> | ||
456 | 21 | |||
457 | 22 | #include <datetime/alarm-queue-simple.h> | ||
458 | 23 | #include <datetime/clock-mock.h> | ||
459 | 24 | #include <datetime/engine-eds.h> | ||
460 | 25 | #include <datetime/planner-range.h> | ||
461 | 26 | |||
462 | 27 | #include <gtest/gtest.h> | ||
463 | 28 | |||
464 | 29 | #include "glib-fixture.h" | ||
465 | 30 | #include "print-to.h" | ||
466 | 31 | #include "timezone-mock.h" | ||
467 | 32 | #include "wakeup-timer-mock.h" | ||
468 | 33 | |||
469 | 34 | using namespace unity::indicator::datetime; | ||
470 | 35 | using VAlarmFixture = GlibFixture; | ||
471 | 36 | |||
472 | 37 | /*** | ||
473 | 38 | **** | ||
474 | 39 | ***/ | ||
475 | 40 | |||
476 | 41 | TEST_F(VAlarmFixture, MultipleAppointments) | ||
477 | 42 | { | ||
478 | 43 | // start the EDS engine | ||
479 | 44 | auto engine = std::make_shared<EdsEngine>(); | ||
480 | 45 | |||
481 | 46 | // we need a consistent timezone for the planner and our local DateTimes | ||
482 | 47 | constexpr char const * zone_str {"America/Los_Angeles"}; | ||
483 | 48 | auto tz = std::make_shared<MockTimezone>(zone_str); | ||
484 | 49 | auto gtz = g_time_zone_new(zone_str); | ||
485 | 50 | |||
486 | 51 | // make a planner that looks at the first half of 2015 in EDS | ||
487 | 52 | auto planner = std::make_shared<SimpleRangePlanner>(engine, tz); | ||
488 | 53 | const DateTime range_begin {gtz, 2006,1, 1, 0, 0, 0.0}; | ||
489 | 54 | const DateTime range_end {gtz, 2015,12,31,23,59,59.5}; | ||
490 | 55 | planner->range().set(std::make_pair(range_begin, range_end)); | ||
491 | 56 | |||
492 | 57 | // give EDS a moment to load | ||
493 | 58 | if (planner->appointments().get().empty()) { | ||
494 | 59 | g_message("waiting a moment for EDS to load..."); | ||
495 | 60 | auto on_appointments_changed = [this](const std::vector<Appointment>& appointments){ | ||
496 | 61 | g_message("ah, they loaded"); | ||
497 | 62 | if (!appointments.empty()) | ||
498 | 63 | g_main_loop_quit(loop); | ||
499 | 64 | }; | ||
500 | 65 | core::ScopedConnection conn(planner->appointments().changed().connect(on_appointments_changed)); | ||
501 | 66 | constexpr int max_wait_sec = 10; | ||
502 | 67 | wait_msec(max_wait_sec * G_TIME_SPAN_MILLISECOND); | ||
503 | 68 | } | ||
504 | 69 | |||
505 | 70 | // what we expect to get... | ||
506 | 71 | std::array<Appointment,1> expected_appts; | ||
507 | 72 | auto appt = &expected_appts[0]; | ||
508 | 73 | appt->uid = "109264742"; | ||
509 | 74 | appt->color = "#becedd"; | ||
510 | 75 | appt->summary = "National Incubator Initiative for Clean Energy (NIICE) FOA: Pre-Concept Paper Informational Webinar"; | ||
511 | 76 | appt->begin = DateTime{gtz,2014,1,21,11,0,0}; | ||
512 | 77 | appt->end = DateTime{gtz,2014,1,21,13,0,0}; | ||
513 | 78 | appt->alarms = std::vector<Alarm>{ Alarm({"Reminder", "", DateTime(gtz,2014,1,21,10,45,0)}) }; | ||
514 | 79 | |||
515 | 80 | // compare it to what we actually loaded... | ||
516 | 81 | const auto appts = planner->appointments().get(); | ||
517 | 82 | EXPECT_EQ(expected_appts.size(), appts.size()); | ||
518 | 83 | for (size_t i=0, n=std::min(appts.size(),expected_appts.size()); i<n; i++) | ||
519 | 84 | EXPECT_EQ(expected_appts[i], appts[i]); | ||
520 | 85 | |||
521 | 86 | // cleanup | ||
522 | 87 | g_time_zone_unref(gtz); | ||
523 | 88 | } | ||
524 | 0 | 89 | ||
525 | === added file 'tests/test-eds-ics-tzids-2.ics' | |||
526 | --- tests/test-eds-ics-tzids-2.ics 1970-01-01 00:00:00 +0000 | |||
527 | +++ tests/test-eds-ics-tzids-2.ics 2015-07-10 17:29:43 +0000 | |||
528 | @@ -0,0 +1,38 @@ | |||
529 | 1 | BEGIN:VCALENDAR | ||
530 | 2 | CALSCALE:GREGORIAN | ||
531 | 3 | PRODID:-//Ximian//NONSGML Evolution Calendar//EN | ||
532 | 4 | VERSION:2.0 | ||
533 | 5 | X-EVOLUTION-DATA-REVISION:2015-07-09T19:41:50.123217Z(3) | ||
534 | 6 | BEGIN:VTIMEZONE | ||
535 | 7 | TZID:Pacific Time (US & Canada) | ||
536 | 8 | BEGIN:STANDARD | ||
537 | 9 | DTSTART:20061105T020000 | ||
538 | 10 | RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11 | ||
539 | 11 | TZOFFSETFROM:-0700 | ||
540 | 12 | TZOFFSETTO:-0800 | ||
541 | 13 | END:STANDARD | ||
542 | 14 | BEGIN:DAYLIGHT | ||
543 | 15 | DTSTART:20070311T020000 | ||
544 | 16 | RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3 | ||
545 | 17 | TZOFFSETFROM:-0800 | ||
546 | 18 | TZOFFSETTO:-0700 | ||
547 | 19 | TZNAME:Daylight Savings Time | ||
548 | 20 | END:DAYLIGHT | ||
549 | 21 | END:VTIMEZONE | ||
550 | 22 | BEGIN:VEVENT | ||
551 | 23 | DTSTART;TZID=Pacific Time (US & Canada):20140121T110000 | ||
552 | 24 | DTEND;TZID=Pacific Time (US & Canada):20140121T130000 | ||
553 | 25 | UID:109264742 | ||
554 | 26 | DTSTAMP:20140120T000718Z | ||
555 | 27 | DESCRIPTION: Event description | ||
556 | 28 | SUMMARY;ENCODING=QUOTED-PRINTABLE:National Incubator Initiative for Clean | ||
557 | 29 | Energy (NIICE) FOA: Pre-Concept Paper Informational Webinar | ||
558 | 30 | CREATED:20140120T000741Z | ||
559 | 31 | LAST-MODIFIED:20140120T000741Z | ||
560 | 32 | BEGIN:VALARM | ||
561 | 33 | TRIGGER;VALUE=DURATION:-PT15M | ||
562 | 34 | ACTION:DISPLAY | ||
563 | 35 | DESCRIPTION:Reminder | ||
564 | 36 | END:VALARM | ||
565 | 37 | END:VEVENT | ||
566 | 38 | END:VCALENDAR | ||
567 | 0 | 39 | ||
568 | === added file 'tests/test-eds-ics-tzids.cpp' | |||
569 | --- tests/test-eds-ics-tzids.cpp 1970-01-01 00:00:00 +0000 | |||
570 | +++ tests/test-eds-ics-tzids.cpp 2015-07-10 17:29:43 +0000 | |||
571 | @@ -0,0 +1,87 @@ | |||
572 | 1 | /* | ||
573 | 2 | * Copyright 2015 Canonical Ltd. | ||
574 | 3 | * | ||
575 | 4 | * This program is free software: you can redistribute it and/or modify it | ||
576 | 5 | * under the terms of the GNU General Public License version 3, as published | ||
577 | 6 | * by the Free Software Foundation. | ||
578 | 7 | * | ||
579 | 8 | * This program is distributed in the hope that it will be useful, but | ||
580 | 9 | * WITHOUT ANY WARRANTY; without even the implied warranties of | ||
581 | 10 | * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR | ||
582 | 11 | * PURPOSE. See the GNU General Public License for more details. | ||
583 | 12 | * | ||
584 | 13 | * You should have received a copy of the GNU General Public License along | ||
585 | 14 | * with this program. If not, see <http://www.gnu.org/licenses/>. | ||
586 | 15 | * | ||
587 | 16 | * Authors: | ||
588 | 17 | * Charles Kerr <charles.kerr@canonical.com> | ||
589 | 18 | */ | ||
590 | 19 | |||
591 | 20 | #include <algorithm> | ||
592 | 21 | |||
593 | 22 | #include <datetime/alarm-queue-simple.h> | ||
594 | 23 | #include <datetime/clock-mock.h> | ||
595 | 24 | #include <datetime/engine-eds.h> | ||
596 | 25 | #include <datetime/planner-range.h> | ||
597 | 26 | |||
598 | 27 | #include <gtest/gtest.h> | ||
599 | 28 | |||
600 | 29 | #include "glib-fixture.h" | ||
601 | 30 | #include "print-to.h" | ||
602 | 31 | #include "timezone-mock.h" | ||
603 | 32 | #include "wakeup-timer-mock.h" | ||
604 | 33 | |||
605 | 34 | using namespace unity::indicator::datetime; | ||
606 | 35 | using VAlarmFixture = GlibFixture; | ||
607 | 36 | |||
608 | 37 | /*** | ||
609 | 38 | **** | ||
610 | 39 | ***/ | ||
611 | 40 | |||
612 | 41 | TEST_F(VAlarmFixture, MultipleAppointments) | ||
613 | 42 | { | ||
614 | 43 | // start the EDS engine | ||
615 | 44 | auto engine = std::make_shared<EdsEngine>(); | ||
616 | 45 | |||
617 | 46 | // we need a consistent timezone for the planner and our local DateTimes | ||
618 | 47 | constexpr char const * zone_str {"Europe/Berlin"}; | ||
619 | 48 | auto tz = std::make_shared<MockTimezone>(zone_str); | ||
620 | 49 | auto gtz = g_time_zone_new(zone_str); | ||
621 | 50 | |||
622 | 51 | // make a planner that looks at the first half of 2015 in EDS | ||
623 | 52 | auto planner = std::make_shared<SimpleRangePlanner>(engine, tz); | ||
624 | 53 | const DateTime range_begin {gtz, 2015,7, 1, 0, 0, 0.0}; | ||
625 | 54 | const DateTime range_end {gtz, 2015,7,31,23,59,59.5}; | ||
626 | 55 | planner->range().set(std::make_pair(range_begin, range_end)); | ||
627 | 56 | |||
628 | 57 | // give EDS a moment to load | ||
629 | 58 | if (planner->appointments().get().empty()) { | ||
630 | 59 | g_message("waiting a moment for EDS to load..."); | ||
631 | 60 | auto on_appointments_changed = [this](const std::vector<Appointment>& appointments){ | ||
632 | 61 | g_message("ah, they loaded"); | ||
633 | 62 | if (!appointments.empty()) | ||
634 | 63 | g_main_loop_quit(loop); | ||
635 | 64 | }; | ||
636 | 65 | core::ScopedConnection conn(planner->appointments().changed().connect(on_appointments_changed)); | ||
637 | 66 | constexpr int max_wait_sec = 10; | ||
638 | 67 | wait_msec(max_wait_sec * G_TIME_SPAN_MILLISECOND); | ||
639 | 68 | } | ||
640 | 69 | |||
641 | 70 | // what we expect to get... | ||
642 | 71 | std::array<Appointment,1> expected_appts; | ||
643 | 72 | auto appt = &expected_appts[0]; | ||
644 | 73 | appt->uid = "8ggc30kh89qql8vjumgtug7l14@google.com"; | ||
645 | 74 | appt->color = "#becedd"; | ||
646 | 75 | appt->summary = "Hello"; | ||
647 | 76 | appt->begin = DateTime{gtz,2015,7,1,20,0,0}; | ||
648 | 77 | appt->end = DateTime{gtz,2015,7,1,22,0,0}; | ||
649 | 78 | |||
650 | 79 | // compare it to what we actually loaded... | ||
651 | 80 | const auto appts = planner->appointments().get(); | ||
652 | 81 | EXPECT_EQ(expected_appts.size(), appts.size()); | ||
653 | 82 | for (size_t i=0, n=std::min(appts.size(),expected_appts.size()); i<n; i++) | ||
654 | 83 | EXPECT_EQ(expected_appts[i], appts[i]); | ||
655 | 84 | |||
656 | 85 | // cleanup | ||
657 | 86 | g_time_zone_unref(gtz); | ||
658 | 87 | } | ||
659 | 0 | 88 | ||
660 | === added file 'tests/test-eds-ics-tzids.ics' | |||
661 | --- tests/test-eds-ics-tzids.ics 1970-01-01 00:00:00 +0000 | |||
662 | +++ tests/test-eds-ics-tzids.ics 2015-07-10 17:29:43 +0000 | |||
663 | @@ -0,0 +1,56 @@ | |||
664 | 1 | BEGIN:VCALENDAR | ||
665 | 2 | CALSCALE:GREGORIAN | ||
666 | 3 | PRODID:-//Ximian//NONSGML Evolution Calendar//EN | ||
667 | 4 | VERSION:2.0 | ||
668 | 5 | X-EVOLUTION-DATA-REVISION:2015-07-09T17:27:58.908570Z(0) | ||
669 | 6 | BEGIN:VTIMEZONE | ||
670 | 7 | TZID:/freeassociation.sourceforge.net/Tzfile/America/Sao_Paulo | ||
671 | 8 | X-LIC-LOCATION:America/Sao_Paulo | ||
672 | 9 | BEGIN:STANDARD | ||
673 | 10 | TZNAME:BRT | ||
674 | 11 | DTSTART:19700222T000000 | ||
675 | 12 | RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=2 | ||
676 | 13 | TZOFFSETFROM:-0200 | ||
677 | 14 | TZOFFSETTO:-0300 | ||
678 | 15 | END:STANDARD | ||
679 | 16 | BEGIN:DAYLIGHT | ||
680 | 17 | TZNAME:BRST | ||
681 | 18 | DTSTART:19701018T000000 | ||
682 | 19 | RRULE:FREQ=YEARLY;BYDAY=3SU;BYMONTH=10 | ||
683 | 20 | TZOFFSETFROM:-0300 | ||
684 | 21 | TZOFFSETTO:-0200 | ||
685 | 22 | END:DAYLIGHT | ||
686 | 23 | END:VTIMEZONE | ||
687 | 24 | BEGIN:VTIMEZONE | ||
688 | 25 | TZID:/freeassociation.sourceforge.net/Tzfile/Europe/Berlin | ||
689 | 26 | X-LIC-LOCATION:Europe/Berlin | ||
690 | 27 | BEGIN:STANDARD | ||
691 | 28 | TZNAME:CET | ||
692 | 29 | DTSTART:19701025T030000 | ||
693 | 30 | RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 | ||
694 | 31 | TZOFFSETFROM:+0200 | ||
695 | 32 | TZOFFSETTO:+0100 | ||
696 | 33 | END:STANDARD | ||
697 | 34 | BEGIN:DAYLIGHT | ||
698 | 35 | TZNAME:CEST | ||
699 | 36 | DTSTART:19700329T020000 | ||
700 | 37 | RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 | ||
701 | 38 | TZOFFSETFROM:+0100 | ||
702 | 39 | TZOFFSETTO:+0200 | ||
703 | 40 | END:DAYLIGHT | ||
704 | 41 | END:VTIMEZONE | ||
705 | 42 | BEGIN:VEVENT | ||
706 | 43 | STATUS:CONFIRMED | ||
707 | 44 | DTSTAMP:20150708T095820Z | ||
708 | 45 | CREATED:20150708T095820Z | ||
709 | 46 | UID:8ggc30kh89qql8vjumgtug7l14@google.com | ||
710 | 47 | SEQUENCE:0 | ||
711 | 48 | TRANSP:OPAQUE | ||
712 | 49 | SUMMARY:Hello | ||
713 | 50 | DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Berlin: | ||
714 | 51 | 20150701T200000 | ||
715 | 52 | DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Berlin: | ||
716 | 53 | 20150701T220000 | ||
717 | 54 | LAST-MODIFIED:20150708T095820Z | ||
718 | 55 | END:VEVENT | ||
719 | 56 | END:VCALENDAR |
PASSED: Continuous integration, rev:420 jenkins. qa.ubuntu. com/job/ indicator- datetime- 15.04-ci/ 4/ jenkins. qa.ubuntu. com/job/ indicator- datetime- 15.04-vivid- amd64-ci/ 4 jenkins. qa.ubuntu. com/job/ indicator- datetime- 15.04-vivid- armhf-ci/ 4 jenkins. qa.ubuntu. com/job/ indicator- datetime- 15.04-vivid- armhf-ci/ 4/artifact/ work/output/ *zip*/output. zip
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/indicator- datetime- 15.04-ci/ 4/rebuild
http://