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: 96.0% 48 / 0 / 50
Functions: 100.0% 2 / 0 / 2
Branches: 90.2% 55 / 0 / 61

service/SmtpReplies.cpp
Line Branch Exec Source
1 #include "SmtpReplies.h"
2
3 namespace SmtpReplies {
4
5 22 EhloCapabilities parseEhlo(const QString &response) {
6 22 EhloCapabilities capabilities;
7
1/1
✓ Branch 4 → 5 taken 22 times.
22 const auto lines = response.split('\n', Qt::SkipEmptyParts);
8
9
2/2
✓ Branch 122 → 7 taken 34 times.
✓ Branch 122 → 123 taken 22 times.
56 for (QString line : lines) {
10
1/1
✓ Branch 9 → 10 taken 34 times.
34 line = line.trimmed();
11
1/2
✓ Branch 13 → 14 taken 34 times.
✗ Branch 13 → 38 not taken.
34 if (line.length() >= 4) {
12 34 bool hasCode = false;
13
2/2
✓ Branch 14 → 15 taken 34 times.
✓ Branch 15 → 16 taken 34 times.
34 line.left(3).toInt(&hasCode);
14
6/7
✓ Branch 17 → 18 taken 33 times.
✓ Branch 17 → 29 taken 1 time.
✓ Branch 20 → 21 taken 33 times.
✓ Branch 22 → 23 taken 16 times.
✓ Branch 22 → 28 taken 17 times.
✓ Branch 27 → 28 taken 16 times.
✗ Branch 27 → 29 not taken.
50 if (hasCode && (line[3] == QLatin1Char('-') ||
15
3/3
✓ Branch 25 → 26 taken 16 times.
✓ Branch 30 → 31 taken 33 times.
✓ Branch 30 → 37 taken 1 time.
50 line[3] == QLatin1Char(' '))) {
16
2/2
✓ Branch 31 → 32 taken 33 times.
✓ Branch 32 → 33 taken 33 times.
33 line = line.mid(4).trimmed();
17 }
18 }
19
20
1/2
✗ Branch 39 → 40 not taken.
✓ Branch 39 → 41 taken 34 times.
34 if (line.isEmpty())
21 ✗ continue;
22
23 34 const int spaceIndex = line.indexOf(QLatin1Char(' '));
24 34 const int equalsIndex = line.indexOf(QLatin1Char('='));
25 34 int delimiterIndex = -1;
26
3/4
✓ Branch 47 → 48 taken 20 times.
✓ Branch 47 → 51 taken 14 times.
✗ Branch 48 → 49 not taken.
✓ Branch 48 → 51 taken 20 times.
34 if (spaceIndex >= 0 && equalsIndex >= 0) {
27 ✗ delimiterIndex = qMin(spaceIndex, equalsIndex);
28 } else {
29 34 delimiterIndex = qMax(spaceIndex, equalsIndex);
30 }
31
32
3/3
✓ Branch 53 → 54 taken 21 times.
✓ Branch 53 → 55 taken 13 times.
✓ Branch 54 → 56 taken 21 times.
68 const QString key = (delimiterIndex >= 0 ? line.left(delimiterIndex) : line)
33
1/1
✓ Branch 56 → 57 taken 34 times.
68 .trimmed()
34
1/1
✓ Branch 57 → 58 taken 34 times.
34 .toUpper();
35 const QString value =
36
3/3
✓ Branch 60 → 61 taken 21 times.
✓ Branch 60 → 62 taken 13 times.
✓ Branch 61 → 63 taken 21 times.
68 (delimiterIndex >= 0 ? line.mid(delimiterIndex + 1) : QString())
37
1/1
✓ Branch 63 → 64 taken 34 times.
68 .trimmed()
38
1/1
✓ Branch 64 → 65 taken 34 times.
68 .toUpper()
39
1/1
✓ Branch 65 → 66 taken 34 times.
34 .simplified();
40
41
2/2
✓ Branch 71 → 72 taken 1 time.
✓ Branch 71 → 73 taken 33 times.
34 if (key == QLatin1String("STARTTLS")) {
42 1 capabilities.supportsStartTls = true;
43 1 continue;
44 }
45
46
2/2
✓ Branch 75 → 76 taken 9 times.
✓ Branch 75 → 88 taken 24 times.
33 if (key == QLatin1String("SIZE")) {
47 9 bool valid = false;
48
2/2
✓ Branch 79 → 80 taken 9 times.
✓ Branch 80 → 81 taken 9 times.
9 const qint64 size = value.section(QLatin1Char(' '), 0, 0).toLongLong(&valid);
49 // A plausible range only (RFC 1870 allows 0 = no fixed maximum).
50
5/6
✓ Branch 82 → 83 taken 6 times.
✓ Branch 82 → 86 taken 3 times.
✓ Branch 83 → 84 taken 4 times.
✓ Branch 83 → 86 taken 2 times.
✓ Branch 84 → 85 taken 4 times.
✗ Branch 84 → 86 not taken.
9 if (valid && size > 0 && size < (qint64(1) << 40)) capabilities.maximumMessageBytes = size;
51 9 continue;
52 9 }
53
2/2
✓ Branch 90 → 91 taken 11 times.
✓ Branch 90 → 106 taken 13 times.
24 if (key == QLatin1String("AUTH")) {
54
1/1
✓ Branch 94 → 95 taken 11 times.
11 const auto mechanisms = value.split(QLatin1Char(' '), Qt::SkipEmptyParts);
55
2/2
✓ Branch 103 → 97 taken 14 times.
✓ Branch 103 → 104 taken 11 times.
25 for (const QString &mechanism : mechanisms) {
56
1/2
✓ Branch 99 → 100 taken 14 times.
✗ Branch 99 → 101 not taken.
14 if (!capabilities.authMechanisms.contains(mechanism))
57
1/1
✓ Branch 100 → 101 taken 14 times.
14 capabilities.authMechanisms.append(mechanism);
58 }
59 11 }
60 54 }
61
62 22 return capabilities;
63 22 }
64
65 7 AuthMechanism selectAuthMechanism(const EhloCapabilities &capabilities) {
66
2/2
✓ Branch 8 → 9 taken 2 times.
✓ Branch 8 → 10 taken 5 times.
14 if (capabilities.authMechanisms.contains(QStringLiteral("LOGIN")))
67 2 return AuthMechanism::Login;
68
2/2
✓ Branch 16 → 17 taken 3 times.
✓ Branch 16 → 18 taken 2 times.
10 if (capabilities.authMechanisms.contains(QStringLiteral("PLAIN")))
69 3 return AuthMechanism::Plain;
70 2 return AuthMechanism::None;
71 }
72
73 } // namespace SmtpReplies
74