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: 100.0% 30 / 0 / 30
Functions: 100.0% 4 / 0 / 4
Branches: 70.6% 89 / 0 / 126

util/HostMatch.h
Line Branch Exec Source
1 #pragma once
2 #include <QRegularExpression>
3 #include <QUrl>
4
5 namespace HostMatch {
6 1223 inline QString canonicalName(const QString &name) {
7
1/1
✓ Branch 2 → 3 taken 1223 times.
1223 QString value = name.trimmed();
8
4/4
✓ Branch 5 → 6 taken 1223 times.
✓ Branch 6 → 7 taken 2 times.
✓ Branch 6 → 8 taken 1221 times.
✓ Branch 7 → 8 taken 2 times.
1223 if (value.endsWith(QLatin1Char('.'))) value.chop(1);
9
3/3
✓ Branch 9 → 10 taken 1223 times.
✓ Branch 10 → 11 taken 1223 times.
✓ Branch 11 → 12 taken 1223 times.
1223 const QString ace = QString::fromLatin1(QUrl::toAce(value)).toLower();
10 36 static const QRegularExpression valid(QStringLiteral(
11
4/7
✓ Branch 14 → 15 taken 18 times.
✓ Branch 14 → 27 taken 1205 times.
✓ Branch 16 → 17 taken 18 times.
✗ Branch 16 → 27 not taken.
✓ Branch 21 → 22 taken 18 times.
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 60 not taken.
1302 "^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$"));
12
6/10
✓ Branch 28 → 29 taken 1223 times.
✗ Branch 28 → 34 not taken.
✓ Branch 30 → 31 taken 1223 times.
✓ Branch 31 → 32 taken 1223 times.
✓ Branch 32 → 33 taken 1128 times.
✓ Branch 32 → 34 taken 95 times.
✓ Branch 36 → 37 taken 1223 times.
✗ Branch 36 → 38 not taken.
✗ Branch 61 → 62 not taken.
✗ Branch 61 → 63 not taken.
4892 return ace.size() <= 253 && valid.match(ace).hasMatch() ? ace : QString();
13 1223 }
14
15 404 inline bool isHostOrSubdomain(const QString &host, const QString &domain) {
16
2/2
✓ Branch 2 → 3 taken 404 times.
✓ Branch 3 → 4 taken 404 times.
404 const QString candidate = canonicalName(host), expected = canonicalName(domain);
17
5/6
✓ Branch 5 → 6 taken 404 times.
✗ Branch 5 → 8 not taken.
✓ Branch 7 → 8 taken 1 time.
✓ Branch 7 → 9 taken 403 times.
✓ Branch 10 → 11 taken 1 time.
✓ Branch 10 → 12 taken 403 times.
404 if (candidate.isEmpty() || expected.isEmpty()) return false;
18
2/2
✓ Branch 13 → 14 taken 23 times.
✓ Branch 13 → 15 taken 380 times.
403 if (candidate == expected) return true;
19
4/7
✓ Branch 15 → 16 taken 10 times.
✓ Branch 15 → 28 taken 370 times.
✓ Branch 17 → 18 taken 10 times.
✗ Branch 17 → 28 not taken.
✓ Branch 22 → 23 taken 10 times.
✗ Branch 56 → 57 not taken.
✗ Branch 56 → 58 not taken.
390 static const QRegularExpression numeric(QStringLiteral("^[0-9.]+$"));
20
11/16
✓ Branch 29 → 30 taken 380 times.
✓ Branch 30 → 31 taken 380 times.
✓ Branch 31 → 32 taken 379 times.
✓ Branch 31 → 38 taken 1 time.
✓ Branch 34 → 35 taken 379 times.
✓ Branch 35 → 36 taken 379 times.
✓ Branch 36 → 37 taken 15 times.
✓ Branch 36 → 38 taken 364 times.
✓ Branch 40 → 41 taken 379 times.
✓ Branch 40 → 42 taken 1 time.
✓ Branch 42 → 43 taken 380 times.
✗ Branch 42 → 44 not taken.
✗ Branch 59 → 60 not taken.
✗ Branch 59 → 61 not taken.
✗ Branch 65 → 66 not taken.
✗ Branch 65 → 67 not taken.
380 return !numeric.match(expected).hasMatch() && candidate.endsWith(QLatin1Char('.') + expected);
21 404 }
22
23 641 inline bool isSafeMeetingUrl(const QUrl &url) {
24
11/16
✓ Branch 5 → 6 taken 61 times.
✓ Branch 7 → 8 taken 56 times.
✓ Branch 7 → 21 taken 5 times.
✓ Branch 9 → 10 taken 56 times.
✓ Branch 11 → 12 taken 53 times.
✓ Branch 11 → 21 taken 3 times.
✓ Branch 16 → 17 taken 53 times.
✗ Branch 16 → 21 not taken.
✓ Branch 31 → 32 taken 61 times.
✓ Branch 31 → 33 taken 580 times.
✓ Branch 33 → 34 taken 588 times.
✓ Branch 33 → 35 taken 53 times.
✗ Branch 74 → 75 not taken.
✗ Branch 74 → 76 not taken.
✗ Branch 79 → 80 not taken.
✗ Branch 79 → 81 not taken.
811 if (!url.isValid() || url.scheme() != QLatin1String("https") || !url.userInfo().isEmpty() ||
25
15/22
✓ Branch 2 → 3 taken 641 times.
✓ Branch 3 → 4 taken 61 times.
✓ Branch 3 → 21 taken 580 times.
✓ Branch 13 → 14 taken 53 times.
✓ Branch 14 → 15 taken 53 times.
✓ Branch 18 → 19 taken 53 times.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 53 times.
✓ Branch 23 → 24 taken 53 times.
✓ Branch 23 → 25 taken 588 times.
✓ Branch 25 → 26 taken 53 times.
✓ Branch 25 → 27 taken 588 times.
✓ Branch 27 → 28 taken 53 times.
✓ Branch 27 → 29 taken 588 times.
✓ Branch 29 → 30 taken 56 times.
✓ Branch 29 → 31 taken 585 times.
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 62 not taken.
✗ Branch 65 → 66 not taken.
✗ Branch 65 → 67 not taken.
✗ Branch 69 → 70 not taken.
✗ Branch 69 → 71 not taken.
1343 canonicalName(url.host()).isEmpty() || url.toEncoded().size() > 4096) return false;
26
2/2
✓ Branch 36 → 37 taken 53 times.
✓ Branch 37 → 38 taken 53 times.
53 const auto decoded = QUrl::fromPercentEncoding(url.toEncoded());
27
2/2
✓ Branch 54 → 41 taken 1850 times.
✓ Branch 54 → 55 taken 53 times.
1903 for (const QChar ch : decoded)
28
4/8
✓ Branch 42 → 43 taken 1850 times.
✗ Branch 42 → 49 not taken.
✓ Branch 44 → 45 taken 1850 times.
✗ Branch 44 → 49 not taken.
✗ Branch 48 → 49 not taken.
✓ Branch 48 → 50 taken 1850 times.
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 53 taken 1850 times.
1850 if (ch.unicode() < 0x20 || ch.unicode() == 0x7f || ch == QLatin1Char('\\')) return false;
29 53 return true;
30 53 }
31 489 inline bool isKnownMeetingUrl(const QUrl &url) {
32
2/2
✓ Branch 3 → 4 taken 441 times.
✓ Branch 3 → 5 taken 48 times.
489 if (!isSafeMeetingUrl(url)) return false;
33 static const QStringList domains{"meet.google.com", "teams.microsoft.com", "teams.live.com",
34
5/10
✓ Branch 5 → 6 taken 7 times.
✓ Branch 5 → 24 taken 41 times.
✓ Branch 7 → 8 taken 7 times.
✗ Branch 7 → 24 not taken.
✓ Branch 21 → 22 taken 63 times.
✓ Branch 21 → 23 taken 7 times.
✗ Branch 40 → 41 not taken.
✗ Branch 40 → 42 not taken.
✗ Branch 49 → 50 not taken.
✗ Branch 49 → 51 not taken.
118 "zoom.us", "webex.com", "whereby.com", "meet.jit.si", "gotomeeting.com", "chime.aws"};
35
2/2
✓ Branch 35 → 26 taken 287 times.
✓ Branch 35 → 36 taken 23 times.
310 for (const QString &domain : domains)
36
4/4
✓ Branch 28 → 29 taken 287 times.
✓ Branch 29 → 30 taken 287 times.
✓ Branch 31 → 32 taken 25 times.
✓ Branch 31 → 33 taken 262 times.
287 if (isHostOrSubdomain(url.host(), domain)) return true;
37 23 return false;
38 7 }
39 } // namespace HostMatch
40