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% 2 / 0 / 2
Functions: 100.0% 2 / 0 / 2
Branches: -% 0 / 0 / 0

service/MailSearchReadService.h
Line Branch Exec Source
1 #pragma once
2
3 #include "data/MailCache.h"
4 #include "service/SearchWorkerLane.h"
5 #include <QPointer>
6
7 struct MailSearchRequest {
8 QString databasePath;
9 QString query;
10 MailCache::SearchFilter filter;
11 std::optional<QString> accountId;
12 int limit = 20;
13 int offset = 0;
14 // Sprint 101: summaries only (MailSearchReadService::summarize).
15 MailSearchSummary::Detail detail = MailSearchSummary::Detail::Full;
16 QSet<QString> allowedFolders; // empty = every folder of the account
17 // Sprint 103 D-21: where about:<name> is resolved; empty = the profile's
18 // contacts.db (the path QuickPimBackend uses).
19 QString contactsDatabasePath;
20 };
21
22 // Shared across windows; background search never occupies the display reader.
23 // Each owner has at most one pending request per lane. Cancellation
24 // interrupts SQLite. Sprint 101 S101.1.3: result pages and summaries run on
25 // two lanes with their own worker, so a page never waits for a summary.
26 class MailSearchReadService final : public QObject {
27 public:
28 using Callback = std::function<void(MailSearchPage)>;
29 using Executor = std::function<MailSearchPage(const MailSearchRequest &, const std::atomic_bool &)>;
30 using SummaryCallback = std::function<void(MailSearchSummary)>;
31 using SummaryExecutor = std::function<MailSearchSummary(const MailSearchRequest &, const std::atomic_bool &)>;
32 static constexpr int MaxPending = 8;
33 explicit MailSearchReadService(QObject *parent = nullptr, Executor executor = {},
34 SummaryExecutor summaryExecutor = {});
35 ~MailSearchReadService() override;
36 static MailSearchReadService *shared();
37 static MailSearchPage readCache(const MailSearchRequest &request, const std::atomic_bool &cancelled);
38 static MailSearchSummary summarizeCache(const MailSearchRequest &request, const std::atomic_bool &cancelled);
39 void read(QObject *owner, MailSearchRequest request, Callback callback);
40 void cancel(QObject *owner);
41 void summarize(QObject *owner, MailSearchRequest request, SummaryCallback callback);
42 void cancelSummary(QObject *owner);
43 4 int queueDepth() const { return m_pages.queueDepth(); }
44 37 int activeReads() const { return m_pages.activeReads(); }
45 int summaryQueueDepth() const { return m_summaries.queueDepth(); }
46 int activeSummaries() const { return m_summaries.activeReads(); }
47 private:
48 static bool admissible(const MailSearchRequest &request, bool page);
49 static MailCache::SearchFilter resolvedFilter(const MailSearchRequest &request);
50 void stop();
51 SearchWorkerLane<MailSearchRequest, MailSearchPage> m_pages;
52 SearchWorkerLane<MailSearchRequest, MailSearchSummary> m_summaries;
53 };
54