MailJDTourDownloadDocsQualityTestsCoverage

Which source lines and branches the tests execute. Lines 91.5 %, branches 75.0 % (minimum 85 % and 72 %). main @ 399ffe3d · 21 October 2026 · pipeline 7238.

GCC Code Coverage Report


Directory: src/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 99.1% 326 / 0 / 329
Functions: 100.0% 55 / 0 / 55
Branches: 83.0% 415 / 0 / 500

performance/PimPerformanceTracker.cpp
Line Branch Exec Source
1 #include "performance/PimPerformanceTracker.h"
2
3 #include <QApplication>
4 #include <QEvent>
5 #include <QWidget>
6
7 #include <algorithm>
8
9 namespace MailJD::Performance {
10
11 namespace {
12 constexpr auto CalendarLocalMetric = "calendar.command_to_painted.v1";
13 constexpr auto CalendarSyncMetric = "calendar.sync_to_refreshed.v1";
14 constexpr auto TaskMetric = "tasks.input_to_painted.v1";
15 constexpr auto PimAuthoritativeMetric = "pim.input_to_authoritative.v1";
16 constexpr auto ContactMetric = "contacts.input_to_painted.v1";
17
18 60 bool scenarioContainsOperation(const QString &scenario,
19 const QString &operation) {
20
2/2
✓ Branch 8 → 9 taken 60 times.
✓ Branch 10 → 11 taken 60 times.
180 return scenario.contains(QStringLiteral(".") + operation +
21
1/1
✓ Branch 9 → 10 taken 60 times.
240 QStringLiteral("."));
22 }
23 } // namespace
24
25 844 PimPerformanceTracker &PimPerformanceTracker::instance() {
26
4/7
✓ Branch 2 → 3 taken 12 times.
✓ Branch 2 → 8 taken 832 times.
✓ Branch 4 → 5 taken 12 times.
✗ Branch 4 → 8 not taken.
✓ Branch 5 → 6 taken 12 times.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 12 not taken.
844 static PimPerformanceTracker tracker;
27 844 return tracker;
28 }
29
30 12 PimPerformanceTracker::PimPerformanceTracker(QObject *parent)
31
2/2
✓ Branch 9 → 10 taken 12 times.
✓ Branch 10 → 11 taken 12 times.
12 : QObject(parent) {}
32
33 20 void PimPerformanceTracker::ensureEventFilterInstalled() {
34
5/6
✓ Branch 2 → 3 taken 1 time.
✓ Branch 2 → 6 taken 19 times.
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 6 not taken.
✓ Branch 7 → 8 taken 1 time.
✓ Branch 7 → 11 taken 19 times.
20 if (!m_eventFilterInstalled && qApp) {
35 1 qApp->installEventFilter(this);
36 1 m_eventFilterInstalled = true;
37 }
38 20 }
39
40 42 bool PimPerformanceTracker::isCalendarLocalActive() const {
41
2/2
✓ Branch 2 → 3 taken 42 times.
✓ Branch 3 → 4 taken 42 times.
42 const QString scenario = PerformanceTrace::instance().selectedScenario();
42
1/1
✓ Branch 5 → 6 taken 42 times.
42 return PerformanceTrace::instance().isEnabled() &&
43
7/12
✓ Branch 4 → 5 taken 42 times.
✓ Branch 6 → 7 taken 41 times.
✓ Branch 6 → 18 taken 1 time.
✓ Branch 10 → 11 taken 41 times.
✓ Branch 11 → 12 taken 41 times.
✗ Branch 11 → 18 not taken.
✓ Branch 25 → 26 taken 41 times.
✓ Branch 25 → 27 taken 1 time.
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 40 not taken.
✗ Branch 42 → 43 not taken.
✗ Branch 42 → 44 not taken.
208 scenario.startsWith(QStringLiteral("CALENDAR.")) &&
44
8/13
✓ Branch 15 → 16 taken 41 times.
✓ Branch 16 → 17 taken 41 times.
✗ Branch 16 → 18 not taken.
✓ Branch 19 → 20 taken 41 times.
✓ Branch 19 → 21 taken 1 time.
✓ Branch 21 → 22 taken 41 times.
✓ Branch 21 → 23 taken 1 time.
✓ Branch 23 → 24 taken 41 times.
✓ Branch 23 → 25 taken 1 time.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 32 not taken.
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 36 not taken.
125 !scenarioContainsOperation(scenario, QStringLiteral("sync"));
45 42 }
46
47 7 bool PimPerformanceTracker::isCalendarSyncActive() const {
48
2/2
✓ Branch 2 → 3 taken 7 times.
✓ Branch 3 → 4 taken 7 times.
7 const QString scenario = PerformanceTrace::instance().selectedScenario();
49
4/4
✓ Branch 4 → 5 taken 7 times.
✓ Branch 5 → 6 taken 7 times.
✓ Branch 6 → 7 taken 5 times.
✓ Branch 6 → 28 taken 2 times.
12 return PerformanceTrace::instance().isEnabled() &&
50
5/9
✓ Branch 10 → 11 taken 5 times.
✓ Branch 11 → 12 taken 3 times.
✓ Branch 11 → 17 taken 2 times.
✓ Branch 43 → 44 taken 5 times.
✓ Branch 43 → 45 taken 2 times.
✗ Branch 72 → 73 not taken.
✗ Branch 72 → 74 not taken.
✗ Branch 76 → 77 not taken.
✗ Branch 76 → 78 not taken.
12 ((scenario.startsWith(QStringLiteral("CALENDAR.")) &&
51
6/11
✓ Branch 15 → 16 taken 3 times.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 27 taken 3 times.
✓ Branch 39 → 40 taken 3 times.
✓ Branch 39 → 41 taken 4 times.
✓ Branch 41 → 42 taken 5 times.
✓ Branch 41 → 43 taken 2 times.
✗ Branch 64 → 65 not taken.
✗ Branch 64 → 66 not taken.
✗ Branch 68 → 69 not taken.
✗ Branch 68 → 70 not taken.
10 scenarioContainsOperation(scenario, QStringLiteral("sync"))) ||
52
6/11
✓ Branch 20 → 21 taken 2 times.
✓ Branch 21 → 22 taken 2 times.
✗ Branch 21 → 28 not taken.
✓ Branch 35 → 36 taken 2 times.
✓ Branch 35 → 37 taken 5 times.
✓ Branch 37 → 38 taken 3 times.
✓ Branch 37 → 39 taken 4 times.
✗ Branch 56 → 57 not taken.
✗ Branch 56 → 58 not taken.
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 62 not taken.
9 (scenario.startsWith(QStringLiteral("CONTACT_TASK.")) &&
53
2/3
✓ Branch 25 → 26 taken 2 times.
✓ Branch 26 → 27 taken 2 times.
✗ Branch 26 → 28 not taken.
2 scenarioContainsOperation(scenario,
54
6/10
✓ Branch 29 → 30 taken 2 times.
✓ Branch 29 → 31 taken 5 times.
✓ Branch 31 → 32 taken 2 times.
✓ Branch 31 → 33 taken 5 times.
✓ Branch 33 → 34 taken 2 times.
✓ Branch 33 → 35 taken 5 times.
✗ Branch 48 → 49 not taken.
✗ Branch 48 → 50 not taken.
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 54 not taken.
16 QStringLiteral("caldav_refresh"))));
55 7 }
56
57 25 bool PimPerformanceTracker::isTaskActive() const {
58
2/2
✓ Branch 2 → 3 taken 25 times.
✓ Branch 3 → 4 taken 25 times.
25 const QString scenario = PerformanceTrace::instance().selectedScenario();
59
1/1
✓ Branch 7 → 8 taken 25 times.
25 const QString operation = scenario.section(QLatin1Char('.'), 1, 1);
60
1/1
✓ Branch 9 → 10 taken 25 times.
25 return PerformanceTrace::instance().isEnabled() &&
61
4/9
✓ Branch 14 → 15 taken 23 times.
✓ Branch 15 → 16 taken 23 times.
✗ Branch 15 → 32 not taken.
✓ Branch 47 → 48 taken 23 times.
✓ Branch 47 → 49 taken 2 times.
✗ Branch 80 → 81 not taken.
✗ Branch 80 → 82 not taken.
✗ Branch 84 → 85 not taken.
✗ Branch 84 → 86 not taken.
48 scenario.startsWith(QStringLiteral("CONTACT_TASK.")) &&
62
7/11
✓ Branch 19 → 20 taken 23 times.
✓ Branch 20 → 21 taken 18 times.
✓ Branch 20 → 26 taken 5 times.
✓ Branch 43 → 44 taken 23 times.
✓ Branch 43 → 45 taken 2 times.
✓ Branch 45 → 46 taken 23 times.
✓ Branch 45 → 47 taken 2 times.
✗ Branch 72 → 73 not taken.
✗ Branch 72 → 74 not taken.
✗ Branch 76 → 77 not taken.
✗ Branch 76 → 78 not taken.
48 (operation.startsWith(QStringLiteral("tasks_")) ||
63
10/14
✓ Branch 8 → 9 taken 25 times.
✓ Branch 10 → 11 taken 23 times.
✓ Branch 10 → 32 taken 2 times.
✓ Branch 24 → 25 taken 18 times.
✓ Branch 25 → 26 taken 17 times.
✓ Branch 25 → 32 taken 1 time.
✓ Branch 39 → 40 taken 18 times.
✓ Branch 39 → 41 taken 7 times.
✓ Branch 41 → 42 taken 23 times.
✓ Branch 41 → 43 taken 2 times.
✗ Branch 64 → 65 not taken.
✗ Branch 64 → 66 not taken.
✗ Branch 68 → 69 not taken.
✗ Branch 68 → 70 not taken.
115 operation.startsWith(QStringLiteral("task_"))) &&
64
8/13
✓ Branch 29 → 30 taken 22 times.
✓ Branch 30 → 31 taken 22 times.
✗ Branch 30 → 32 not taken.
✓ Branch 33 → 34 taken 22 times.
✓ Branch 33 → 35 taken 3 times.
✓ Branch 35 → 36 taken 22 times.
✓ Branch 35 → 37 taken 3 times.
✓ Branch 37 → 38 taken 18 times.
✓ Branch 37 → 39 taken 7 times.
✗ Branch 56 → 57 not taken.
✗ Branch 56 → 58 not taken.
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 62 not taken.
72 scenario.endsWith(QStringLiteral(".tasks"));
65 25 }
66
67 10 void PimPerformanceTracker::watchTaskViewport(QWidget *viewport) {
68 10 m_taskViewport = viewport;
69
6/6
✓ Branch 4 → 5 taken 2 times.
✓ Branch 4 → 7 taken 8 times.
✓ Branch 6 → 7 taken 1 time.
✓ Branch 6 → 8 taken 1 time.
✓ Branch 9 → 10 taken 9 times.
✓ Branch 9 → 11 taken 1 time.
10 if (isTaskActive() || isCalendarSyncActive())
70 9 ensureEventFilterInstalled();
71 10 }
72
73 42 void PimPerformanceTracker::beginCalendarCommand() {
74
6/6
✓ Branch 3 → 4 taken 41 times.
✓ Branch 3 → 6 taken 1 time.
✓ Branch 5 → 6 taken 20 times.
✓ Branch 5 → 7 taken 21 times.
✓ Branch 8 → 9 taken 21 times.
✓ Branch 8 → 10 taken 21 times.
42 if (!isCalendarLocalActive() || m_calendarLocal.isValid())
75 21 return;
76
2/2
✓ Branch 10 → 11 taken 21 times.
✓ Branch 11 → 12 taken 21 times.
21 m_scenario = PerformanceTrace::instance().selectedScenario();
77 21 m_calendarViewMode = -1;
78
1/1
✓ Branch 14 → 15 taken 21 times.
21 m_calendarRangeStart = {};
79
1/1
✓ Branch 15 → 16 taken 21 times.
21 m_calendarRangeEnd = {};
80 21 m_calendarOccurrences = -1;
81 21 m_calendarPaintPending = false;
82
1/1
✓ Branch 16 → 17 taken 21 times.
42 m_calendarLocal = PerformanceTrace::instance().startMetric(
83
2/2
✓ Branch 18 → 19 taken 21 times.
✓ Branch 19 → 20 taken 21 times.
42 m_scenario, QString::fromLatin1(CalendarLocalMetric));
84 }
85
86 2 void PimPerformanceTracker::calendarLazyConstructStarted() {
87
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_calendarLocal.isValid())
88
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_calendarLocal.startPhase(QStringLiteral("lazy_construct"));
89 2 }
90
91 2 void PimPerformanceTracker::calendarLazyConstructFinished() {
92
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_calendarLocal.isValid())
93
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_calendarLocal.endPhase(QStringLiteral("lazy_construct"));
94 2 }
95
96 2 void PimPerformanceTracker::calendarDatabaseStarted() {
97
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_calendarLocal.isValid())
98
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_calendarLocal.startPhase(QStringLiteral("database_query"));
99 2 }
100
101 2 void PimPerformanceTracker::calendarDatabaseFinished(int storedCount) {
102
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_calendarLocal.isValid())
103
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_calendarLocal.endPhase(QStringLiteral("database_query"), storedCount);
104 2 }
105
106 2 void PimPerformanceTracker::calendarRecurrenceStarted() {
107
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_calendarLocal.isValid())
108
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_calendarLocal.startPhase(QStringLiteral("recurrence_expand"));
109 2 }
110
111 2 void PimPerformanceTracker::calendarRecurrenceFinished(int occurrenceCount) {
112
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_calendarLocal.isValid())
113
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_calendarLocal.endPhase(QStringLiteral("recurrence_expand"),
114 occurrenceCount);
115 2 }
116
117 2 void PimPerformanceTracker::calendarFilterStarted() {
118
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_calendarLocal.isValid())
119
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_calendarLocal.startPhase(QStringLiteral("filter"));
120 2 }
121
122 2 void PimPerformanceTracker::calendarFilterFinished(int visibleCount) {
123
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_calendarLocal.isValid())
124
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_calendarLocal.endPhase(QStringLiteral("filter"), visibleCount);
125 2 }
126
127 2 void PimPerformanceTracker::calendarLayoutStarted() {
128
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_calendarLocal.isValid())
129
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_calendarLocal.startPhase(QStringLiteral("layout"));
130 2 }
131
132 2 void PimPerformanceTracker::calendarLayoutFinished() {
133
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_calendarLocal.isValid())
134
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_calendarLocal.endPhase(QStringLiteral("layout"));
135 2 }
136
137 22 void PimPerformanceTracker::calendarContentCommitted(int viewMode,
138 const QDate &rangeStart,
139 const QDate &rangeEnd,
140 int occurrenceCount) {
141
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 21 times.
22 if (!m_calendarLocal.isValid())
142 1 return;
143 21 m_calendarViewMode = viewMode;
144 21 m_calendarRangeStart = rangeStart;
145 21 m_calendarRangeEnd = rangeEnd;
146 21 m_calendarOccurrences = occurrenceCount;
147 21 m_calendarPaintPending = true;
148 }
149
150 22 void PimPerformanceTracker::calendarPaintStarted() {
151
5/6
✓ Branch 3 → 4 taken 21 times.
✓ Branch 3 → 6 taken 1 time.
✓ Branch 4 → 5 taken 21 times.
✗ Branch 4 → 6 not taken.
✓ Branch 7 → 8 taken 21 times.
✓ Branch 7 → 15 taken 1 time.
22 if (m_calendarLocal.isValid() && m_calendarPaintPending)
152
1/1
✓ Branch 11 → 12 taken 21 times.
42 m_calendarLocal.startPhase(QStringLiteral("paint"));
153 22 }
154
155 21 bool PimPerformanceTracker::calendarSignatureMatches(
156 int viewMode, const QDate &rangeStart, const QDate &rangeEnd,
157 int occurrenceCount) const {
158 static const QStringList presentations = {
159 1 QStringLiteral("month"), QStringLiteral("week"), QStringLiteral("day"),
160
5/10
✓ Branch 2 → 3 taken 1 time.
✓ Branch 2 → 28 taken 20 times.
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 28 not taken.
✓ Branch 21 → 22 taken 4 times.
✓ Branch 21 → 23 taken 1 time.
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 60 not taken.
✗ Branch 79 → 80 not taken.
✗ Branch 79 → 81 not taken.
27 QStringLiteral("year")};
161 const bool presentationMatches =
162
4/4
✓ Branch 28 → 29 taken 17 times.
✓ Branch 28 → 39 taken 4 times.
✓ Branch 30 → 31 taken 13 times.
✓ Branch 30 → 39 taken 4 times.
34 viewMode >= 0 && viewMode < presentations.size() &&
163
9/16
✓ Branch 35 → 36 taken 13 times.
✓ Branch 36 → 37 taken 13 times.
✓ Branch 37 → 38 taken 13 times.
✗ Branch 37 → 39 not taken.
✓ Branch 40 → 41 taken 13 times.
✓ Branch 40 → 42 taken 8 times.
✓ Branch 42 → 43 taken 13 times.
✓ Branch 42 → 44 taken 8 times.
✓ Branch 44 → 45 taken 13 times.
✓ Branch 44 → 46 taken 8 times.
✗ Branch 82 → 83 not taken.
✗ Branch 82 → 84 not taken.
✗ Branch 86 → 87 not taken.
✗ Branch 86 → 88 not taken.
✗ Branch 90 → 91 not taken.
✗ Branch 90 → 92 not taken.
47 m_scenario.endsWith(QStringLiteral(".") + presentations.at(viewMode));
164
3/4
✓ Branch 47 → 48 taken 13 times.
✗ Branch 47 → 54 not taken.
✓ Branch 49 → 50 taken 9 times.
✓ Branch 49 → 54 taken 4 times.
26 return presentationMatches && viewMode == m_calendarViewMode &&
165
4/4
✓ Branch 46 → 47 taken 13 times.
✓ Branch 46 → 54 taken 8 times.
✓ Branch 51 → 52 taken 5 times.
✓ Branch 51 → 54 taken 4 times.
52 rangeStart == m_calendarRangeStart && rangeEnd == m_calendarRangeEnd &&
166
1/2
✓ Branch 52 → 53 taken 5 times.
✗ Branch 52 → 54 not taken.
26 occurrenceCount == m_calendarOccurrences;
167 5 }
168
169 23 void PimPerformanceTracker::calendarPainted(int viewMode,
170 const QDate &rangeStart,
171 const QDate &rangeEnd,
172 int occurrenceCount) {
173
5/6
✓ Branch 3 → 4 taken 21 times.
✓ Branch 3 → 6 taken 2 times.
✓ Branch 4 → 5 taken 21 times.
✗ Branch 4 → 6 not taken.
✓ Branch 7 → 8 taken 21 times.
✓ Branch 7 → 19 taken 2 times.
23 if (m_calendarLocal.isValid() && m_calendarPaintPending) {
174
1/1
✓ Branch 11 → 12 taken 21 times.
42 m_calendarLocal.endPhase(QStringLiteral("paint"));
175
2/2
✓ Branch 15 → 16 taken 5 times.
✓ Branch 15 → 17 taken 16 times.
21 finishCalendarLocal(calendarSignatureMatches(viewMode, rangeStart, rangeEnd,
176 occurrenceCount)
177 ? Outcome::Success
178 : Outcome::Failed);
179 }
180
6/8
✓ Branch 20 → 21 taken 1 time.
✓ Branch 20 → 24 taken 22 times.
✓ Branch 21 → 22 taken 1 time.
✗ Branch 21 → 24 not taken.
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 24 not taken.
✓ Branch 25 → 26 taken 1 time.
✓ Branch 25 → 33 taken 22 times.
23 if (m_sync.isValid() && m_syncRefreshRequested && m_syncNetworkComplete) {
181
1/1
✓ Branch 29 → 30 taken 1 time.
2 m_sync.endPhase(QStringLiteral("refresh"), occurrenceCount);
182 1 m_syncPaintComplete = true;
183 1 maybeFinishSync();
184 }
185 23 }
186
187 21 void PimPerformanceTracker::finishCalendarLocal(Outcome outcome) {
188
1/2
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 21 times.
21 if (!m_calendarLocal.isValid())
189 ✗ return;
190
1/1
✓ Branch 6 → 7 taken 21 times.
21 m_calendarLocal.finish(outcome, std::max(0, m_calendarOccurrences));
191 21 m_calendarLocal = {};
192 21 m_calendarPaintPending = false;
193 }
194
195 5 void PimPerformanceTracker::beginCalendarSync() {
196
8/8
✓ Branch 2 → 3 taken 5 times.
✓ Branch 3 → 4 taken 4 times.
✓ Branch 3 → 6 taken 1 time.
✓ Branch 4 → 5 taken 4 times.
✓ Branch 5 → 6 taken 1 time.
✓ Branch 5 → 7 taken 3 times.
✓ Branch 8 → 9 taken 2 times.
✓ Branch 8 → 10 taken 3 times.
5 if (!isCalendarSyncActive() || m_sync.isValid())
197 2 return;
198
1/1
✓ Branch 10 → 11 taken 3 times.
3 ensureEventFilterInstalled();
199
2/2
✓ Branch 11 → 12 taken 3 times.
✓ Branch 12 → 13 taken 3 times.
3 m_scenario = PerformanceTrace::instance().selectedScenario();
200
1/1
✓ Branch 18 → 19 taken 3 times.
9 const QString metric = m_scenario.startsWith(QStringLiteral("CALENDAR."))
201
2/2
✓ Branch 19 → 20 taken 2 times.
✓ Branch 19 → 22 taken 1 time.
3 ? QString::fromLatin1(CalendarSyncMetric)
202
2/2
✓ Branch 21 → 24 taken 2 times.
✓ Branch 23 → 24 taken 1 time.
3 : QString::fromLatin1(PimAuthoritativeMetric);
203
2/2
✓ Branch 26 → 27 taken 3 times.
✓ Branch 27 → 28 taken 3 times.
3 m_sync = PerformanceTrace::instance().startMetric(m_scenario, metric);
204
1/1
✓ Branch 30 → 31 taken 3 times.
3 m_syncStartedNs = PerformanceTrace::monotonicNowNs();
205
3/3
✓ Branch 34 → 35 taken 3 times.
✓ Branch 37 → 38 taken 1 time.
✓ Branch 37 → 51 taken 2 times.
6 if (m_scenario.startsWith(QStringLiteral("CONTACT_TASK."))) {
206
1/1
✓ Branch 38 → 39 taken 1 time.
1 PerformanceTrace::instance().markProcessEvent(
207
1/1
✓ Branch 45 → 46 taken 1 time.
1 m_scenario,
208
2/2
✓ Branch 43 → 44 taken 1 time.
✓ Branch 44 → 45 taken 1 time.
2 QString::fromLatin1(ContactMetric) + QStringLiteral(".inapplicable"));
209 }
210 3 m_syncClients = 0;
211 3 m_taskRows = -1;
212 3 m_davRequests = 0;
213 3 m_davBytes = 0;
214 3 m_syncNetworkComplete = false;
215 3 m_syncRefreshRequested = false;
216 3 m_syncPaintComplete = false;
217 3 m_syncTaskPaintPending = false;
218 3 }
219
220 5 void PimPerformanceTracker::syncClientQueued() {
221
2/2
✓ Branch 3 → 4 taken 4 times.
✓ Branch 3 → 5 taken 1 time.
5 if (m_sync.isValid())
222 4 ++m_syncClients;
223 5 }
224
225 6 void PimPerformanceTracker::syncClientFinished() {
226
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 5 times.
6 if (!m_sync.isValid())
227 1 return;
228 5 m_syncClients = std::max(0, m_syncClients - 1);
229
2/2
✓ Branch 6 → 7 taken 4 times.
✓ Branch 6 → 8 taken 1 time.
5 if (m_syncClients == 0)
230 4 m_syncNetworkComplete = true;
231 5 maybeFinishSync();
232 }
233
234 412 void PimPerformanceTracker::davWaitStarted() {
235
2/2
✓ Branch 3 → 4 taken 409 times.
✓ Branch 3 → 5 taken 3 times.
412 if (!m_sync.isValid())
236 409 return;
237
2/2
✓ Branch 5 → 6 taken 2 times.
✓ Branch 5 → 13 taken 1 time.
3 if (m_davRequests++ == 0) {
238 2 m_davBytes = 0;
239
1/1
✓ Branch 9 → 10 taken 2 times.
4 m_sync.startPhase(QStringLiteral("dav_wait"));
240 }
241 }
242
243 409 void PimPerformanceTracker::davWaitFinished(qint64 byteCount) {
244
6/6
✓ Branch 3 → 4 taken 4 times.
✓ Branch 3 → 5 taken 405 times.
✓ Branch 4 → 5 taken 1 time.
✓ Branch 4 → 6 taken 3 times.
✓ Branch 7 → 8 taken 406 times.
✓ Branch 7 → 9 taken 3 times.
409 if (!m_sync.isValid() || m_davRequests <= 0)
245 406 return;
246
2/2
✓ Branch 9 → 10 taken 2 times.
✓ Branch 9 → 11 taken 1 time.
3 if (byteCount > 0)
247 2 m_davBytes += byteCount;
248
2/2
✓ Branch 11 → 12 taken 2 times.
✓ Branch 11 → 19 taken 1 time.
3 if (--m_davRequests == 0)
249
1/1
✓ Branch 15 → 16 taken 2 times.
4 m_sync.endPhase(QStringLiteral("dav_wait"), -1, m_davBytes);
250 }
251
252 338 void PimPerformanceTracker::parseStarted() {
253
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 337 times.
338 if (m_sync.isValid())
254
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_sync.startPhase(QStringLiteral("parse"));
255 338 }
256
257 338 void PimPerformanceTracker::parseFinished(int itemCount, qint64 byteCount) {
258
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 337 times.
338 if (m_sync.isValid())
259
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_sync.endPhase(QStringLiteral("parse"), itemCount, byteCount);
260 338 }
261
262 2 void PimPerformanceTracker::transactionStarted() {
263
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_sync.isValid())
264
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_sync.startPhase(QStringLiteral("transaction"));
265 2 }
266
267 2 void PimPerformanceTracker::transactionFinished(int itemCount) {
268
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_sync.isValid())
269
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_sync.endPhase(QStringLiteral("transaction"), itemCount);
270 2 }
271
272 2 void PimPerformanceTracker::reconcileStarted() {
273
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_sync.isValid())
274
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_sync.startPhase(QStringLiteral("reconcile"));
275 2 }
276
277 2 void PimPerformanceTracker::reconcileFinished() {
278
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_sync.isValid())
279
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_sync.endPhase(QStringLiteral("reconcile"));
280 2 }
281
282 5 void PimPerformanceTracker::refreshRequested() {
283
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 4 times.
5 if (!m_sync.isValid())
284 1 return;
285
2/2
✓ Branch 5 → 6 taken 3 times.
✓ Branch 5 → 13 taken 1 time.
4 if (!m_syncRefreshRequested)
286
1/1
✓ Branch 9 → 10 taken 3 times.
6 m_sync.startPhase(QStringLiteral("refresh"));
287 4 m_syncRefreshRequested = true;
288 }
289
290 2 void PimPerformanceTracker::syncFailed() { finishSync(Outcome::Failed); }
291
292 7 void PimPerformanceTracker::maybeFinishSync() {
293
7/8
✓ Branch 3 → 4 taken 7 times.
✗ Branch 3 → 7 not taken.
✓ Branch 4 → 5 taken 6 times.
✓ Branch 4 → 7 taken 1 time.
✓ Branch 5 → 6 taken 2 times.
✓ Branch 5 → 7 taken 4 times.
✓ Branch 8 → 9 taken 2 times.
✓ Branch 8 → 10 taken 5 times.
7 if (m_sync.isValid() && m_syncNetworkComplete && m_syncPaintComplete)
294 2 finishSync(Outcome::Success);
295 7 }
296
297 4 void PimPerformanceTracker::finishSync(Outcome outcome) {
298
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 3 times.
4 if (!m_sync.isValid())
299 1 return;
300 const qint64 durationNs =
301
1/1
✓ Branch 5 → 6 taken 3 times.
3 std::max<qint64>(0, PerformanceTrace::monotonicNowNs() - m_syncStartedNs);
302
1/1
✓ Branch 8 → 9 taken 3 times.
3 m_sync.finish(outcome, std::max(0, m_taskRows));
303
2/2
✓ Branch 9 → 10 taken 2 times.
✓ Branch 9 → 16 taken 1 time.
5 if (outcome == Outcome::Success &&
304
9/13
✓ Branch 13 → 14 taken 2 times.
✓ Branch 14 → 15 taken 1 time.
✓ Branch 14 → 16 taken 1 time.
✓ Branch 17 → 18 taken 2 times.
✓ Branch 17 → 19 taken 1 time.
✓ Branch 19 → 20 taken 2 times.
✓ Branch 19 → 21 taken 1 time.
✓ Branch 21 → 22 taken 1 time.
✓ Branch 21 → 29 taken 2 times.
✗ Branch 36 → 37 not taken.
✗ Branch 36 → 38 not taken.
✗ Branch 40 → 41 not taken.
✗ Branch 40 → 42 not taken.
7 m_scenario.startsWith(QStringLiteral("CONTACT_TASK."))) {
305 1 PerformanceTrace::instance().markProcessEvent(
306
2/2
✓ Branch 25 → 26 taken 1 time.
✓ Branch 26 → 27 taken 1 time.
1 m_scenario, QString::fromLatin1(TaskMetric), -1, durationNs,
307 2 std::max(0, m_taskRows));
308 }
309 3 m_sync = {};
310 3 m_syncStartedNs = 0;
311 }
312
313 15 void PimPerformanceTracker::beginTaskCommand(const QStringList &operations) {
314
8/8
✓ Branch 2 → 3 taken 15 times.
✓ Branch 3 → 4 taken 14 times.
✓ Branch 3 → 6 taken 1 time.
✓ Branch 4 → 5 taken 14 times.
✓ Branch 5 → 6 taken 6 times.
✓ Branch 5 → 7 taken 8 times.
✓ Branch 8 → 9 taken 7 times.
✓ Branch 8 → 10 taken 8 times.
15 if (!isTaskActive() || m_task.isValid())
315 7 return;
316
2/2
✓ Branch 10 → 11 taken 8 times.
✓ Branch 11 → 12 taken 8 times.
8 const QString selected = PerformanceTrace::instance().selectedScenario();
317 const bool matches =
318
1/1
✓ Branch 14 → 15 taken 8 times.
8 std::any_of(operations.cbegin(), operations.cend(),
319 14 [&selected](const QString &operation) {
320 14 return scenarioContainsOperation(selected, operation);
321 });
322
1/2
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 8 times.
8 if (!matches)
323 ✗ return;
324
1/1
✓ Branch 17 → 18 taken 8 times.
8 ensureEventFilterInstalled();
325 8 m_scenario = selected;
326 8 m_taskRows = -1;
327 8 m_taskPaintPending = false;
328
1/1
✓ Branch 19 → 20 taken 8 times.
16 m_task = PerformanceTrace::instance().startMetric(
329
2/2
✓ Branch 21 → 22 taken 8 times.
✓ Branch 22 → 23 taken 8 times.
16 m_scenario, QString::fromLatin1(TaskMetric));
330
1/1
✓ Branch 29 → 30 taken 8 times.
8 const QString operation = m_scenario.section(QLatin1Char('.'), 1, 1);
331
3/4
✓ Branch 39 → 40 taken 6 times.
✓ Branch 39 → 55 taken 1 time.
✓ Branch 75 → 76 taken 8 times.
✗ Branch 75 → 77 not taken.
23 const bool authoritative = operation == QStringLiteral("task_complete") ||
332
5/6
✓ Branch 44 → 45 taken 5 times.
✓ Branch 44 → 55 taken 1 time.
✓ Branch 71 → 72 taken 7 times.
✓ Branch 71 → 73 taken 1 time.
✓ Branch 73 → 74 taken 8 times.
✗ Branch 73 → 75 not taken.
21 operation == QStringLiteral("task_reopen") ||
333
6/6
✓ Branch 49 → 50 taken 3 times.
✓ Branch 49 → 55 taken 2 times.
✓ Branch 67 → 68 taken 6 times.
✓ Branch 67 → 69 taken 2 times.
✓ Branch 69 → 70 taken 7 times.
✓ Branch 69 → 71 taken 1 time.
19 operation == QStringLiteral("task_create") ||
334
8/8
✓ Branch 34 → 35 taken 7 times.
✓ Branch 34 → 55 taken 1 time.
✓ Branch 54 → 55 taken 1 time.
✓ Branch 54 → 56 taken 2 times.
✓ Branch 63 → 64 taken 5 times.
✓ Branch 63 → 65 taken 3 times.
✓ Branch 65 → 66 taken 6 times.
✓ Branch 65 → 67 taken 2 times.
36 operation == QStringLiteral("task_edit") ||
335
6/6
✓ Branch 57 → 58 taken 3 times.
✓ Branch 57 → 59 taken 5 times.
✓ Branch 59 → 60 taken 3 times.
✓ Branch 59 → 61 taken 5 times.
✓ Branch 61 → 62 taken 5 times.
✓ Branch 61 → 63 taken 3 times.
11 operation == QStringLiteral("task_delete");
336
2/2
✓ Branch 77 → 78 taken 6 times.
✓ Branch 77 → 86 taken 2 times.
8 if (authoritative) {
337
1/1
✓ Branch 78 → 79 taken 6 times.
12 m_taskAuthoritative = PerformanceTrace::instance().startMetric(
338
2/2
✓ Branch 80 → 81 taken 6 times.
✓ Branch 81 → 82 taken 6 times.
12 m_scenario, QString::fromLatin1(PimAuthoritativeMetric));
339 } else {
340
1/1
✓ Branch 86 → 87 taken 2 times.
2 PerformanceTrace::instance().markProcessEvent(
341
2/2
✓ Branch 91 → 92 taken 2 times.
✓ Branch 93 → 94 taken 2 times.
4 m_scenario, QString::fromLatin1(PimAuthoritativeMetric) +
342
1/1
✓ Branch 92 → 93 taken 2 times.
6 QStringLiteral(".inapplicable"));
343 }
344
1/1
✓ Branch 99 → 100 taken 8 times.
8 PerformanceTrace::instance().markProcessEvent(
345
1/1
✓ Branch 106 → 107 taken 8 times.
8 m_scenario,
346
2/2
✓ Branch 104 → 105 taken 8 times.
✓ Branch 105 → 106 taken 8 times.
16 QString::fromLatin1(ContactMetric) + QStringLiteral(".inapplicable"));
347 8 }
348
349 2 void PimPerformanceTracker::taskLazyConstructStarted() {
350
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_task.isValid())
351
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_task.startPhase(QStringLiteral("lazy_construct"));
352 2 }
353
354 2 void PimPerformanceTracker::taskLazyConstructFinished() {
355
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_task.isValid())
356
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_task.endPhase(QStringLiteral("lazy_construct"));
357 2 }
358
359 2 void PimPerformanceTracker::taskDatabaseStarted() {
360
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_task.isValid())
361
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_task.startPhase(QStringLiteral("database_query"));
362 2 }
363
364 2 void PimPerformanceTracker::taskDatabaseFinished(int taskCount) {
365
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_task.isValid())
366
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_task.endPhase(QStringLiteral("database_query"), taskCount);
367 2 }
368
369 2 void PimPerformanceTracker::taskFilterStarted() {
370
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_task.isValid())
371
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_task.startPhase(QStringLiteral("filter"));
372 2 }
373
374 2 void PimPerformanceTracker::taskFilterFinished(int taskCount) {
375
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_task.isValid())
376
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_task.endPhase(QStringLiteral("filter"), taskCount);
377 2 }
378
379 2 void PimPerformanceTracker::taskLayoutStarted() {
380
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_task.isValid())
381
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_task.startPhase(QStringLiteral("layout"));
382 2 }
383
384 2 void PimPerformanceTracker::taskLayoutFinished(int rowCount) {
385
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 11 taken 1 time.
2 if (m_task.isValid())
386
1/1
✓ Branch 7 → 8 taken 1 time.
2 m_task.endPhase(QStringLiteral("layout"), rowCount);
387 2 }
388
389 10 void PimPerformanceTracker::taskContentCommitted(int rowCount) {
390
6/6
✓ Branch 3 → 4 taken 2 times.
✓ Branch 3 → 7 taken 8 times.
✓ Branch 5 → 6 taken 1 time.
✓ Branch 5 → 7 taken 1 time.
✓ Branch 8 → 9 taken 1 time.
✓ Branch 8 → 10 taken 9 times.
10 if (!m_task.isValid() && !m_sync.isValid())
391 1 return;
392 9 m_taskRows = rowCount;
393
2/2
✓ Branch 11 → 12 taken 8 times.
✓ Branch 11 → 19 taken 1 time.
9 if (m_task.isValid()) {
394
1/1
✓ Branch 15 → 16 taken 8 times.
16 m_task.startPhase(QStringLiteral("paint"));
395 8 m_taskPaintPending = true;
396 }
397
5/6
✓ Branch 20 → 21 taken 1 time.
✓ Branch 20 → 23 taken 8 times.
✓ Branch 21 → 22 taken 1 time.
✗ Branch 21 → 23 not taken.
✓ Branch 24 → 25 taken 1 time.
✓ Branch 24 → 26 taken 8 times.
9 if (m_sync.isValid() && m_syncRefreshRequested)
398 1 m_syncTaskPaintPending = true;
399
1/2
✓ Branch 27 → 28 taken 9 times.
✗ Branch 27 → 30 not taken.
9 if (m_taskViewport)
400 9 m_taskViewport->update();
401 }
402
403 4 void PimPerformanceTracker::taskAuthoritativeCommitted(int itemCount) {
404
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 3 times.
4 if (!m_taskAuthoritative.isValid())
405 1 return;
406 3 m_taskAuthoritative.finish(Outcome::Success, itemCount);
407 3 m_taskAuthoritative = {};
408 }
409
410 4 void PimPerformanceTracker::taskAuthoritativeFailed() {
411
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 3 times.
4 if (!m_taskAuthoritative.isValid())
412 1 return;
413 3 m_taskAuthoritative.finish(Outcome::Failed);
414 3 m_taskAuthoritative = {};
415 }
416
417 2 void PimPerformanceTracker::cancelTask() { finishTask(Outcome::Cancelled); }
418
419 9 void PimPerformanceTracker::finishTask(Outcome outcome) {
420
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 8 times.
9 if (!m_task.isValid())
421 1 return;
422
1/1
✓ Branch 6 → 7 taken 8 times.
8 m_task.finish(outcome, std::max(0, m_taskRows));
423
1/2
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 12 taken 8 times.
8 if (m_taskAuthoritative.isValid())
424 ✗ m_taskAuthoritative.finish(outcome, std::max(0, m_taskRows));
425 8 m_task = {};
426 8 m_taskAuthoritative = {};
427 8 m_taskPaintPending = false;
428 }
429
430 31 bool PimPerformanceTracker::eventFilter(QObject *watched, QEvent *event) {
431
6/6
✓ Branch 3 → 4 taken 23 times.
✓ Branch 3 → 9 taken 8 times.
✓ Branch 5 → 6 taken 8 times.
✓ Branch 5 → 9 taken 15 times.
✓ Branch 10 → 11 taken 8 times.
✓ Branch 10 → 34 taken 23 times.
39 if (watched == m_taskViewport && event->type() == QEvent::Paint &&
432
3/4
✓ Branch 6 → 7 taken 1 time.
✓ Branch 6 → 8 taken 7 times.
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 9 not taken.
8 (m_taskPaintPending || m_syncTaskPaintPending)) {
433
2/2
✓ Branch 12 → 13 taken 7 times.
✓ Branch 12 → 20 taken 1 time.
8 if (m_task.isValid()) {
434
1/1
✓ Branch 16 → 17 taken 7 times.
14 m_task.endPhase(QStringLiteral("paint"));
435 7 finishTask(Outcome::Success);
436 }
437
6/8
✓ Branch 21 → 22 taken 1 time.
✓ Branch 21 → 25 taken 7 times.
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 25 not taken.
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 25 not taken.
✓ Branch 26 → 27 taken 1 time.
✓ Branch 26 → 34 taken 7 times.
8 if (m_sync.isValid() && m_syncRefreshRequested && m_syncNetworkComplete) {
438
1/1
✓ Branch 30 → 31 taken 1 time.
2 m_sync.endPhase(QStringLiteral("refresh"), m_taskRows);
439 1 m_syncPaintComplete = true;
440 1 m_syncTaskPaintPending = false;
441 1 maybeFinishSync();
442 }
443 }
444 31 return QObject::eventFilter(watched, event);
445 }
446
447 } // namespace MailJD::Performance
448