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: 97.1% 99 / 0 / 102
Functions: 100.0% 5 / 0 / 5
Branches: 87.3% 172 / 0 / 197

data/ContactPlaceIndexer.cpp
Line Branch Exec Source
1 #include "ContactPlaceIndexer.h"
2
3 #include "GeoData.h"
4 #include "PlaceGazetteer.h"
5
6 #include <QCryptographicHash>
7 #include <QDateTime>
8 #include <QLoggingCategory>
9 #include <QSqlError>
10 #include <QSqlQuery>
11 #include <QVariant>
12
13 Q_DECLARE_LOGGING_CATEGORY(lcContactPeople)
14
15 namespace ContactPlaceIndexer {
16
17 namespace {
18
19 struct Pending {
20 qint64 rowId = 0;
21 QString kind, text;
22 ContactAddress address;
23 };
24
25
4/4
✓ Branch 3 → 4 taken 224 times.
✓ Branch 3 → 7 taken 6831 times.
✓ Branch 9 → 10 taken 224 times.
✓ Branch 9 → 11 taken 6831 times.
7279 QString text(const QString &value) { return value.isNull() ? QStringLiteral("") : value; }
26
27 1049 bool cached(QSqlDatabase &db, const QString &key, PlaceGazetteer::Place *place, bool *known, bool *online) {
28
1/1
✓ Branch 2 → 3 taken 1049 times.
1049 QSqlQuery q(db);
29
1/1
✓ Branch 6 → 7 taken 1049 times.
1049 q.prepare(QStringLiteral("SELECT lat, lon, precision, tz, place_name, country, source FROM place_cache"
30 " WHERE address_hash = ?"));
31
1/1
✓ Branch 11 → 12 taken 1049 times.
1049 q.addBindValue(key);
32
7/8
✓ Branch 13 → 14 taken 1049 times.
✓ Branch 14 → 15 taken 1049 times.
✗ Branch 14 → 17 not taken.
✓ Branch 15 → 16 taken 1049 times.
✓ Branch 16 → 17 taken 977 times.
✓ Branch 16 → 18 taken 72 times.
✓ Branch 19 → 20 taken 977 times.
✓ Branch 19 → 21 taken 72 times.
1049 if (!q.exec() || !q.next())
33 977 return false;
34 72 *known = true;
35
2/2
✓ Branch 22 → 23 taken 72 times.
✓ Branch 23 → 24 taken 72 times.
72 *online = q.value(6).toString() == QLatin1String("online"); // S103.1.9
36
3/4
✓ Branch 27 → 28 taken 72 times.
✓ Branch 28 → 29 taken 72 times.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 72 times.
72 if (q.value(0).isNull())
37 ✗ return true; // known as not placeable
38
5/5
✓ Branch 32 → 33 taken 72 times.
✓ Branch 33 → 34 taken 72 times.
✓ Branch 34 → 35 taken 72 times.
✓ Branch 35 → 36 taken 72 times.
✓ Branch 36 → 37 taken 72 times.
72 place->position = GeoPoint::at(q.value(0).toDouble(), q.value(1).toDouble());
39
2/2
✓ Branch 39 → 40 taken 72 times.
✓ Branch 40 → 41 taken 72 times.
72 place->precision = q.value(2).toString();
40
2/2
✓ Branch 44 → 45 taken 72 times.
✓ Branch 45 → 46 taken 72 times.
72 place->timeZone = q.value(3).toString();
41
2/2
✓ Branch 49 → 50 taken 72 times.
✓ Branch 50 → 51 taken 72 times.
72 place->placeName = q.value(4).toString();
42
2/2
✓ Branch 54 → 55 taken 72 times.
✓ Branch 55 → 56 taken 72 times.
72 place->countryIso = q.value(5).toString();
43 72 return true;
44 1049 }
45
46 977 void remember(QSqlDatabase &db, const QString &key, const PlaceGazetteer::Place &place) {
47
1/1
✓ Branch 2 → 3 taken 977 times.
977 QSqlQuery q(db);
48
1/1
✓ Branch 6 → 7 taken 977 times.
977 q.prepare(QStringLiteral("INSERT OR REPLACE INTO place_cache (address_hash, lat, lon, precision, source, tz,"
49 " looked_up, place_name, country) VALUES (?, ?, ?, ?, 'gazetteer', ?, ?, ?, ?)"));
50
1/1
✓ Branch 11 → 12 taken 977 times.
977 q.addBindValue(key);
51
5/5
✓ Branch 15 → 16 taken 945 times.
✓ Branch 15 → 17 taken 32 times.
✓ Branch 17 → 18 taken 32 times.
✓ Branch 18 → 19 taken 32 times.
✓ Branch 19 → 20 taken 977 times.
977 q.addBindValue(place.isValid() ? QVariant(place.position.latitude) : QVariant(QMetaType(QMetaType::Double)));
52
5/5
✓ Branch 23 → 24 taken 945 times.
✓ Branch 23 → 25 taken 32 times.
✓ Branch 25 → 26 taken 32 times.
✓ Branch 26 → 27 taken 32 times.
✓ Branch 27 → 28 taken 977 times.
977 q.addBindValue(place.isValid() ? QVariant(place.position.longitude) : QVariant(QMetaType(QMetaType::Double)));
53
2/2
✓ Branch 30 → 31 taken 977 times.
✓ Branch 32 → 33 taken 977 times.
977 q.addBindValue(text(place.precision));
54
2/2
✓ Branch 36 → 37 taken 977 times.
✓ Branch 38 → 39 taken 977 times.
977 q.addBindValue(text(place.timeZone));
55
3/3
✓ Branch 42 → 43 taken 977 times.
✓ Branch 43 → 44 taken 977 times.
✓ Branch 45 → 46 taken 977 times.
977 q.addBindValue(QDateTime::currentDateTimeUtc().toString(Qt::ISODate));
56
2/2
✓ Branch 50 → 51 taken 977 times.
✓ Branch 52 → 53 taken 977 times.
977 q.addBindValue(text(place.placeName));
57
2/2
✓ Branch 56 → 57 taken 977 times.
✓ Branch 58 → 59 taken 977 times.
977 q.addBindValue(text(place.countryIso));
58
1/1
✓ Branch 61 → 62 taken 977 times.
977 q.exec();
59 977 }
60
61 } // namespace
62
63 1075 QString cacheKey(const QString &kind, const QString &placeText, const QString &street, const QString &postalCode,
64 const QString &locality, const QString &region, const QString &country) {
65 1075 QString key;
66
6/6
✓ Branch 4 → 5 taken 1031 times.
✓ Branch 4 → 8 taken 44 times.
✓ Branch 7 → 8 taken 14 times.
✓ Branch 7 → 9 taken 1017 times.
✓ Branch 10 → 11 taken 58 times.
✓ Branch 10 → 22 taken 1017 times.
1075 if (kind == QLatin1String("met") || kind == QLatin1String("birth")) {
67
2/2
✓ Branch 11 → 12 taken 58 times.
✓ Branch 15 → 16 taken 58 times.
116 key = QStringLiteral("text:") + GeoData::key(placeText);
68 } else {
69 1017 ContactAddress address;
70 1017 address.street = street;
71 1017 address.postalCode = postalCode;
72 1017 address.locality = locality;
73 1017 address.region = region;
74 1017 address.country = country;
75
2/2
✓ Branch 27 → 28 taken 1017 times.
✓ Branch 31 → 32 taken 1017 times.
2034 key = QStringLiteral("adr:") + PlaceGazetteer::addressKey(address);
76 1017 }
77 // Hashed: the cache holds no readable addresses (D-16).
78
4/4
✓ Branch 39 → 40 taken 1075 times.
✓ Branch 41 → 42 taken 1075 times.
✓ Branch 42 → 43 taken 1075 times.
✓ Branch 43 → 44 taken 1075 times.
2150 return QString::fromLatin1(QCryptographicHash::hash(key.toUtf8(), QCryptographicHash::Sha1).toHex());
79 1075 }
80
81 26 Result run(QSqlDatabase &db, const GeoData &data, const QString &defaultCountry, int limit) {
82 26 Result result;
83 26 QList<Pending> pending;
84 {
85
1/1
✓ Branch 2 → 3 taken 26 times.
26 QSqlQuery q(db);
86
1/1
✓ Branch 6 → 7 taken 26 times.
26 q.prepare(QStringLiteral("SELECT rowid, kind, text, street, postal_code, locality, region, country FROM card_places"
87 " WHERE source = '' ORDER BY rowid LIMIT ?"));
88
1/1
✓ Branch 11 → 12 taken 26 times.
26 q.addBindValue(limit);
89
2/3
✓ Branch 13 → 14 taken 26 times.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 31 taken 26 times.
26 if (!q.exec()) {
90 ✗ qCWarning(lcContactPeople) << "Pending places could not be read:" << q.lastError().text();
91 ✗ return result;
92 }
93
3/3
✓ Branch 73 → 74 taken 1075 times.
✓ Branch 74 → 32 taken 1049 times.
✓ Branch 74 → 75 taken 26 times.
1075 while (q.next()) {
94 1049 Pending p;
95
2/2
✓ Branch 32 → 33 taken 1049 times.
✓ Branch 33 → 34 taken 1049 times.
1049 p.rowId = q.value(0).toLongLong();
96
2/2
✓ Branch 35 → 36 taken 1049 times.
✓ Branch 36 → 37 taken 1049 times.
1049 p.kind = q.value(1).toString();
97
2/2
✓ Branch 40 → 41 taken 1049 times.
✓ Branch 41 → 42 taken 1049 times.
1049 p.text = q.value(2).toString();
98
2/2
✓ Branch 45 → 46 taken 1049 times.
✓ Branch 46 → 47 taken 1049 times.
1049 p.address.street = q.value(3).toString();
99
2/2
✓ Branch 50 → 51 taken 1049 times.
✓ Branch 51 → 52 taken 1049 times.
1049 p.address.postalCode = q.value(4).toString();
100
2/2
✓ Branch 55 → 56 taken 1049 times.
✓ Branch 56 → 57 taken 1049 times.
1049 p.address.locality = q.value(5).toString();
101
2/2
✓ Branch 60 → 61 taken 1049 times.
✓ Branch 61 → 62 taken 1049 times.
1049 p.address.region = q.value(6).toString();
102
2/2
✓ Branch 65 → 66 taken 1049 times.
✓ Branch 66 → 67 taken 1049 times.
1049 p.address.country = q.value(7).toString();
103
1/1
✓ Branch 70 → 71 taken 1049 times.
1049 pending.append(p);
104 1049 }
105 26 }
106
1/1
✓ Branch 79 → 81 taken 26 times.
26 db.transaction();
107
4/4
✓ Branch 81 → 82 taken 26 times.
✓ Branch 82 → 83 taken 26 times.
✓ Branch 189 → 84 taken 1049 times.
✓ Branch 189 → 190 taken 26 times.
1075 for (const Pending &p : pending) {
108 1049 const QString key = cacheKey(p.kind, p.text, p.address.street, p.address.postalCode, p.address.locality,
109
1/1
✓ Branch 85 → 86 taken 1049 times.
1049 p.address.region, p.address.country);
110 1049 PlaceGazetteer::Place place;
111 1049 bool known = false;
112 1049 bool online = false;
113
6/7
✓ Branch 86 → 87 taken 1049 times.
✓ Branch 87 → 88 taken 72 times.
✓ Branch 87 → 89 taken 977 times.
✗ Branch 88 → 89 not taken.
✓ Branch 88 → 90 taken 72 times.
✓ Branch 91 → 92 taken 977 times.
✓ Branch 91 → 104 taken 72 times.
1049 if (!cached(db, key, &place, &known, &online) || !known) {
114
2/2
✓ Branch 97 → 98 taken 14 times.
✓ Branch 97 → 100 taken 933 times.
1924 place = p.kind == QLatin1String("met") || p.kind == QLatin1String("birth")
115
3/3
✓ Branch 94 → 95 taken 947 times.
✓ Branch 94 → 98 taken 30 times.
✓ Branch 98 → 99 taken 44 times.
1968 ? PlaceGazetteer::locateText(data, p.text, defaultCountry)
116
1/1
✓ Branch 100 → 101 taken 933 times.
977 : PlaceGazetteer::locate(data, p.address, defaultCountry);
117
1/1
✓ Branch 103 → 104 taken 977 times.
977 remember(db, key, place);
118 }
119
8/10
✓ Branch 104 → 105 taken 977 times.
✓ Branch 104 → 108 taken 72 times.
✗ Branch 108 → 109 not taken.
✓ Branch 108 → 112 taken 72 times.
✓ Branch 115 → 116 taken 72 times.
✓ Branch 115 → 117 taken 977 times.
✗ Branch 117 → 118 not taken.
✓ Branch 117 → 119 taken 1049 times.
✓ Branch 119 → 120 taken 977 times.
✓ Branch 119 → 121 taken 72 times.
2098 const QString source = !known ? QStringLiteral("gazetteer") : online ? QStringLiteral("online") : QStringLiteral("cache");
120
1/1
✓ Branch 121 → 122 taken 1049 times.
1049 QSqlQuery update(db);
121
1/1
✓ Branch 125 → 126 taken 1049 times.
1049 update.prepare(QStringLiteral("UPDATE card_places SET lat = ?, lon = ?, precision = ?, source = ?, tz = ?,"
122 " place_name = ? WHERE rowid = ?"));
123
5/5
✓ Branch 130 → 131 taken 1017 times.
✓ Branch 130 → 132 taken 32 times.
✓ Branch 132 → 133 taken 32 times.
✓ Branch 133 → 134 taken 32 times.
✓ Branch 134 → 135 taken 1049 times.
1049 update.addBindValue(place.isValid() ? QVariant(place.position.latitude) : QVariant(QMetaType(QMetaType::Double)));
124
5/5
✓ Branch 138 → 139 taken 1017 times.
✓ Branch 138 → 140 taken 32 times.
✓ Branch 140 → 141 taken 32 times.
✓ Branch 141 → 142 taken 32 times.
✓ Branch 142 → 143 taken 1049 times.
1049 update.addBindValue(place.isValid() ? QVariant(place.position.longitude) : QVariant(QMetaType(QMetaType::Double)));
125
2/2
✓ Branch 145 → 146 taken 1049 times.
✓ Branch 147 → 148 taken 1049 times.
1049 update.addBindValue(text(place.precision));
126
5/7
✓ Branch 152 → 153 taken 1017 times.
✓ Branch 152 → 154 taken 32 times.
✓ Branch 158 → 159 taken 1049 times.
✓ Branch 161 → 162 taken 32 times.
✓ Branch 161 → 163 taken 1017 times.
✗ Branch 318 → 319 not taken.
✗ Branch 318 → 320 not taken.
1081 update.addBindValue(place.isValid() ? source : QStringLiteral("none"));
127
2/2
✓ Branch 164 → 165 taken 1049 times.
✓ Branch 166 → 167 taken 1049 times.
1049 update.addBindValue(text(place.timeZone));
128
2/2
✓ Branch 170 → 171 taken 1049 times.
✓ Branch 172 → 173 taken 1049 times.
1049 update.addBindValue(text(place.placeName));
129
1/1
✓ Branch 177 → 178 taken 1049 times.
1049 update.addBindValue(p.rowId);
130
1/1
✓ Branch 179 → 180 taken 1049 times.
1049 update.exec();
131 1049 ++result.processed;
132
2/2
✓ Branch 181 → 182 taken 1017 times.
✓ Branch 181 → 183 taken 32 times.
1049 if (place.isValid())
133 1017 ++result.placed;
134 1049 }
135
1/1
✓ Branch 190 → 191 taken 26 times.
26 db.commit();
136
1/1
✓ Branch 191 → 192 taken 26 times.
26 QSqlQuery left(db);
137
7/16
✓ Branch 195 → 196 taken 26 times.
✓ Branch 196 → 197 taken 26 times.
✗ Branch 196 → 200 not taken.
✓ Branch 197 → 198 taken 26 times.
✓ Branch 198 → 199 taken 26 times.
✗ Branch 198 → 200 not taken.
✓ Branch 201 → 202 taken 26 times.
✗ Branch 201 → 203 not taken.
✓ Branch 203 → 204 taken 26 times.
✗ Branch 203 → 205 not taken.
✓ Branch 205 → 206 taken 26 times.
✗ Branch 205 → 210 not taken.
✗ Branch 353 → 354 not taken.
✗ Branch 353 → 355 not taken.
✗ Branch 357 → 358 not taken.
✗ Branch 357 → 359 not taken.
52 if (left.exec(QStringLiteral("SELECT COUNT(*) FROM card_places WHERE source = ''")) && left.next())
138
2/2
✓ Branch 206 → 207 taken 26 times.
✓ Branch 207 → 208 taken 26 times.
26 result.remaining = left.value(0).toInt();
139
9/9
✓ Branch 210 → 211 taken 26 times.
✓ Branch 214 → 215 taken 26 times.
✓ Branch 215 → 216 taken 26 times.
✓ Branch 216 → 217 taken 26 times.
✓ Branch 217 → 218 taken 26 times.
✓ Branch 218 → 219 taken 26 times.
✓ Branch 219 → 220 taken 26 times.
✓ Branch 225 → 212 taken 26 times.
✓ Branch 225 → 226 taken 26 times.
52 qCDebug(lcContactPeople) << "Places slice:" << result.processed << "processed," << result.placed << "placed,"
140
2/2
✓ Branch 220 → 221 taken 26 times.
✓ Branch 221 → 222 taken 26 times.
26 << result.remaining << "left";
141 26 return result;
142 26 }
143
144 } // namespace ContactPlaceIndexer
145