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: 86.1% 68 / 0 / 79
Functions: 100.0% 13 / 0 / 13
Branches: 73.5% 72 / 0 / 98

service/MailSearchReadService.cpp
Line Branch Exec Source
1 #include "MailSearchReadService.h"
2 #include "data/ContactMailLinkQuery.h"
3 #include <QCoreApplication>
4 #include <QStandardPaths>
5
6 34 MailSearchReadService::MailSearchReadService(QObject *parent, Executor executor, SummaryExecutor summaryExecutor)
7
3/3
✓ Branch 4 → 5 taken 10 times.
✓ Branch 4 → 7 taken 24 times.
✓ Branch 8 → 9 taken 34 times.
34 : QObject(parent), m_pages(this, executor ? std::move(executor) : readCache, MaxPending),
8
3/3
✓ Branch 11 → 12 taken 1 time.
✓ Branch 11 → 14 taken 33 times.
✓ Branch 15 → 16 taken 34 times.
68 m_summaries(this, summaryExecutor ? std::move(summaryExecutor) : summarizeCache, MaxPending) {
9
1/1
✓ Branch 18 → 19 taken 34 times.
35 connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, [this] { stop(); });
10 34 }
11 55 MailSearchReadService::~MailSearchReadService() { stop(); }
12 878 MailSearchReadService *MailSearchReadService::shared() {
13
3/4
✓ Branch 2 → 3 taken 21 times.
✓ Branch 2 → 7 taken 857 times.
✓ Branch 4 → 5 taken 21 times.
✗ Branch 4 → 7 not taken.
878 static QPointer<MailSearchReadService> instance;
14
5/8
✓ Branch 8 → 9 taken 21 times.
✓ Branch 8 → 20 taken 857 times.
✓ Branch 13 → 14 taken 21 times.
✓ Branch 14 → 15 taken 21 times.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 21 times.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 30 not taken.
878 if (!instance) instance = new MailSearchReadService(QCoreApplication::instance());
15 878 return instance;
16 }
17 321 MailSearchPage MailSearchReadService::readCache(const MailSearchRequest &request,
18 const std::atomic_bool &cancelled) {
19 321 MailSearchPage result;
20
2/2
✓ Branch 3 → 4 taken 4 times.
✓ Branch 3 → 6 taken 317 times.
321 if (cancelled.load()) { result.outcome = MailSearchPage::Outcome::Cancelled; return result; }
21
1/1
✓ Branch 6 → 7 taken 317 times.
317 MailCache reader;
22
4/4
✓ Branch 7 → 8 taken 317 times.
✓ Branch 8 → 9 taken 1 time.
✓ Branch 8 → 14 taken 316 times.
✓ Branch 9 → 10 taken 1 time.
317 if (!reader.openReadOnly(request.databasePath)) { result.error = reader.lastError(); return result; }
23 632 return reader.search().searchPage(request.query, resolvedFilter(request), request.accountId,
24
2/2
✓ Branch 15 → 16 taken 316 times.
✓ Branch 16 → 17 taken 316 times.
316 request.limit, request.offset, cancelled);
25 321 }
26 260 MailSearchSummary MailSearchReadService::summarizeCache(const MailSearchRequest &request,
27 const std::atomic_bool &cancelled) {
28 260 MailSearchSummary result;
29
1/2
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 6 taken 260 times.
260 if (cancelled.load()) { result.outcome = MailSearchSummary::Outcome::Cancelled; return result; }
30
1/1
✓ Branch 6 → 7 taken 260 times.
260 MailCache reader;
31
2/4
✓ Branch 7 → 8 taken 260 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 14 taken 260 times.
✗ Branch 9 → 10 not taken.
260 if (!reader.openReadOnly(request.databasePath)) { result.error = reader.lastError(); return result; }
32 520 return reader.search().searchSummary(request.query, resolvedFilter(request), request.accountId, request.detail, cancelled,
33
2/2
✓ Branch 15 → 16 taken 260 times.
✓ Branch 16 → 17 taken 260 times.
260 MailSearchSummary::TimeLimitMs, request.allowedFolders);
34 260 }
35 // Sprint 103 D-21: about:<name> becomes the linked Message-IDs, on the worker.
36 576 MailCache::SearchFilter MailSearchReadService::resolvedFilter(const MailSearchRequest &request) {
37 576 MailCache::SearchFilter filter = request.filter;
38
5/6
✓ Branch 4 → 5 taken 6 times.
✓ Branch 4 → 7 taken 570 times.
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 6 times.
✓ Branch 9 → 10 taken 570 times.
✓ Branch 9 → 11 taken 6 times.
576 if (filter.aboutFilter.isEmpty() || !filter.aboutMessageIds.isEmpty()) return filter;
39 6 const QString path = !request.contactsDatabasePath.isEmpty()
40 12 ? request.contactsDatabasePath
41
4/16
✓ Branch 12 → 13 taken 6 times.
✗ Branch 12 → 14 not taken.
✗ Branch 17 → 18 not taken.
✗ Branch 18 → 19 not taken.
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 21 taken 6 times.
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 6 times.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 6 times.
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 37 not taken.
✗ Branch 39 → 40 not taken.
✗ Branch 39 → 41 not taken.
6 : QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + QStringLiteral("/mailjd/contacts.db");
42
1/1
✓ Branch 25 → 26 taken 6 times.
12 filter.aboutMessageIds = ContactMailLinkQuery::messageIdsAbout(path, filter.aboutFilter,
43 6 MailCache::SearchFilter::MaxAboutMessageIds);
44 6 return filter;
45 6 }
46 35 void MailSearchReadService::stop() {
47 35 m_pages.stop();
48 35 m_summaries.stop();
49 35 }
50 664 bool MailSearchReadService::admissible(const MailSearchRequest &request, bool page) {
51
3/4
✓ Branch 5 → 6 taken 593 times.
✓ Branch 5 → 9 taken 70 times.
✓ Branch 8 → 9 taken 593 times.
✗ Branch 8 → 11 not taken.
1327 if (request.databasePath.size() > 4096 || (request.accountId && request.accountId->size() > 4096)
52
6/6
✓ Branch 3 → 4 taken 663 times.
✓ Branch 3 → 11 taken 1 time.
✓ Branch 10 → 11 taken 3 times.
✓ Branch 10 → 12 taken 660 times.
✓ Branch 13 → 14 taken 4 times.
✓ Branch 13 → 15 taken 660 times.
1327 || !request.filter.fitsReadLimits(request.query)) return false;
53
8/8
✓ Branch 15 → 16 taken 383 times.
✓ Branch 15 → 19 taken 277 times.
✓ Branch 16 → 17 taken 382 times.
✓ Branch 16 → 20 taken 1 time.
✓ Branch 17 → 18 taken 381 times.
✓ Branch 17 → 20 taken 1 time.
✓ Branch 18 → 19 taken 380 times.
✓ Branch 18 → 20 taken 1 time.
660 return !page || (request.limit > 0 && request.limit <= MailSearchPage::MaxRows && request.offset >= 0);
54 }
55 3247 void MailSearchReadService::cancel(QObject *owner) { m_pages.cancel(owner); }
56 740 void MailSearchReadService::cancelSummary(QObject *owner) { m_summaries.cancel(owner); }
57 388 void MailSearchReadService::read(QObject *owner, MailSearchRequest query, Callback callback) {
58 388 m_pages.cancel(owner);
59
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 387 times.
388 if (!owner) return;
60
2/2
✓ Branch 6 → 7 taken 7 times.
✓ Branch 6 → 19 taken 380 times.
387 if (!admissible(query, true)) {
61 7 MailSearchPage result;
62 7 result.outcome = MailSearchPage::Outcome::Limited;
63 7 result.error = QStringLiteral("Search request exceeds admission limits");
64
1/1
✓ Branch 15 → 16 taken 7 times.
7 callback(std::move(result));
65 7 return;
66 7 }
67
4/4
✓ Branch 19 → 20 taken 380 times.
✓ Branch 22 → 23 taken 380 times.
✓ Branch 25 → 26 taken 2 times.
✓ Branch 25 → 38 taken 378 times.
380 if (!m_pages.enqueue(owner, std::move(query), callback)) {
68 2 MailSearchPage result;
69 2 result.outcome = MailSearchPage::Outcome::Busy;
70 2 result.error = QStringLiteral("Search reader queue is full");
71
1/1
✓ Branch 34 → 35 taken 2 times.
2 callback(std::move(result));
72 2 }
73 }
74 277 void MailSearchReadService::summarize(QObject *owner, MailSearchRequest query, SummaryCallback callback) {
75 277 m_summaries.cancel(owner);
76
1/2
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 277 times.
277 if (!owner) return;
77
1/2
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 19 taken 277 times.
277 if (!admissible(query, false)) {
78 ✗ MailSearchSummary result;
79 ✗ result.outcome = MailSearchSummary::Outcome::Limited;
80 ✗ result.error = QStringLiteral("Search request exceeds admission limits");
81 ✗ callback(std::move(result));
82 ✗ return;
83 ✗ }
84
3/4
✓ Branch 19 → 20 taken 277 times.
✓ Branch 22 → 23 taken 277 times.
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 38 taken 277 times.
277 if (!m_summaries.enqueue(owner, std::move(query), callback)) {
85 ✗ MailSearchSummary result;
86 ✗ result.outcome = MailSearchSummary::Outcome::Busy;
87 ✗ result.error = QStringLiteral("Search reader queue is full");
88 ✗ callback(std::move(result));
89 ✗ }
90 }
91