Cockatrice/cockatrice/src/client/settings/cache_settings.h
BruebachL e01912d3c8
[Tests] Add manual picture loader benchmark against the real card hosts (#7288)
* tests: add manual picture loader benchmark against the real card hosts

(cherry picked from commit 588d71d3b9a8278ab98b847802908f322c1035b7)

* tests: address review on picture loader benchmark

- Sandbox via unique app/org names plus Linux-only XDG redirection, derive
  the warm-cache probe and data path from SettingsCache, and bail out when the
  temporary sandbox cannot be created.
- Run each pass with a fresh worker and shut workers down before reading the
  429 counters, so the redirect cache is persisted and no worker thread can
  outlive the stack-local counters or the installed message handler.
- Make s_activeCounters atomic and always forward log output when the previous
  handler is the built-in (nullptr) one.
- Validate --timeout-min, scale the cached-pass budget with --count, honour the
  first --url as the stress template, and add the missing trailing newlines.
- Zero-initialise SettingsCache members so the benchmark mock cannot
  dereference an indeterminate pointer.

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-09-21 18:30:04 +02:00

171 lines
5.9 KiB
C++

/**
* @file cache_settings.h
* @ingroup Settings
*/
//! \todo Document this file.
#ifndef SETTINGSCACHE_H
#define SETTINGSCACHE_H
#include <QLoggingCategory>
#include <QStringList>
#include <libcockatrice/interfaces/interface_card_database_path_provider.h>
#include <libcockatrice/interfaces/interface_network_settings_provider.h>
#include <libcockatrice/utility/macros.h>
inline Q_LOGGING_CATEGORY(SettingsCacheLog, "settings_cache");
class ReleaseChannel;
#define DEFAULT_LANG_NAME "English"
#define CLIENT_INFO_NOT_SET "notset"
#define DEFAULT_FONT_SIZE 12
class CacheStorageSettings;
class CardCounterSettings;
class CardDatabaseSettings;
class CardOverrideSettings;
class CardsDisplaySettings;
class ChatSettings;
class CommanderBracketSettings;
class DebugSettings;
class DeckEditorSettings;
class DownloadSettings;
class GameFiltersSettings;
class GameSettings;
class InterfaceSettings;
class LayoutsSettings;
class MessageSettings;
class PathsSettings;
class PersonalSettings;
class RecentsSettings;
class ServersSettings;
class ShortcutsSettings;
class SoundSettings;
class TabsSettings;
class UpdatesSettings;
class VisualDeckStorageSettings;
class AppearanceSettings;
class NetworkSettings;
class QSettings;
class SettingsCache : public ICardDatabasePathProvider, public INetworkSettingsProvider
{
Q_OBJECT
signals:
void themeChanged();
private:
QSettings *settings = nullptr;
ShortcutsSettings *shortcutsSettings = nullptr;
CardDatabaseSettings *cardDatabaseSettings = nullptr;
ServersSettings *serversSettings = nullptr;
MessageSettings *messageSettings = nullptr;
GameFiltersSettings *gameFiltersSettings = nullptr;
LayoutsSettings *layoutsSettings = nullptr;
DownloadSettings *downloadSettings = nullptr;
RecentsSettings *recentsSettings = nullptr;
CardOverrideSettings *cardOverrideSettings = nullptr;
DebugSettings *debugSettings = nullptr;
CardCounterSettings *cardCounterSettings = nullptr;
TabsSettings *tabsSettings = nullptr;
SoundSettings *soundSettings = nullptr;
GameSettings *gameSettings = nullptr;
ChatSettings *chatSettings = nullptr;
CacheStorageSettings *cacheStorageSettings = nullptr;
UpdatesSettings *updatesSettings = nullptr;
PersonalSettings *personalSettings = nullptr;
CardsDisplaySettings *cardsDisplaySettings = nullptr;
InterfaceSettings *interfaceSettings = nullptr;
DeckEditorSettings *deckEditorSettings = nullptr;
PathsSettings *pathsSettings = nullptr;
VisualDeckStorageSettings *visualDeckStorageSettings = nullptr;
AppearanceSettings *appearanceSettings = nullptr;
NetworkSettings *networkSettings = nullptr;
CommanderBracketSettings *commanderBracketSettings = nullptr;
QString themeName;
QList<ReleaseChannel *> releaseChannels;
bool isPortableBuild;
[[nodiscard]] QString getSafeConfigPath(QString configEntry, QString defaultPath) const;
[[nodiscard]] QString getSafeConfigFilePath(QString configEntry, QString defaultPath) const;
void loadPaths();
public:
SettingsCache();
QString getDataPath();
QString getSettingsPath();
[[nodiscard]] QString getCachePath() const;
[[nodiscard]] QString getNetworkCachePath() const;
// ICardDatabasePathProvider - delegate to pathsSettings
[[nodiscard]] QString getCustomCardDatabasePath() const override;
[[nodiscard]] QString getCardDatabasePath() const override;
[[nodiscard]] QString getSpoilerCardDatabasePath() const override;
[[nodiscard]] QString getTokenDatabasePath() const override;
// INetworkSettingsProvider - delegate to sub-objects
[[nodiscard]] int getKeepAlive() const override;
[[nodiscard]] int getTimeOut() const override;
[[nodiscard]] bool getNotifyAboutUpdates() const override;
void setKnownMissingFeatures(const QString &_knownMissingFeatures) override;
[[nodiscard]] QString getKnownMissingFeatures() override;
QString getClientID() override;
[[nodiscard]] QString getThemeName() const
{
return themeName;
}
[[nodiscard]] ReleaseChannel *getUpdateReleaseChannel() const;
[[nodiscard]] QList<ReleaseChannel *> getUpdateReleaseChannels() const;
[[nodiscard]] int getUpdateReleaseChannelIndex() const;
[[nodiscard]] QStringList getCountries() const;
[[nodiscard]] ShortcutsSettings &shortcuts() const;
[[nodiscard]] CardDatabaseSettings &cardDatabase() const;
[[nodiscard]] ServersSettings &servers() const;
[[nodiscard]] MessageSettings &messages() const;
[[nodiscard]] GameFiltersSettings &gameFilters() const;
[[nodiscard]] LayoutsSettings &layouts() const;
[[nodiscard]] DownloadSettings &downloads() const;
[[nodiscard]] RecentsSettings &recents() const;
[[nodiscard]] CardOverrideSettings &cardOverrides() const;
[[nodiscard]] DebugSettings &debug() const;
[[nodiscard]] CardCounterSettings &cardCounters() const;
[[nodiscard]] TabsSettings &tabs() const;
[[nodiscard]] SoundSettings &sound() const;
[[nodiscard]] GameSettings &game() const;
[[nodiscard]] ChatSettings &chat() const;
[[nodiscard]] CacheStorageSettings &cacheStorage() const;
[[nodiscard]] UpdatesSettings &updates() const;
[[nodiscard]] PersonalSettings &personal() const;
[[nodiscard]] CardsDisplaySettings &cardsDisplay() const;
[[nodiscard]] InterfaceSettings &userInterface() const;
[[nodiscard]] DeckEditorSettings &deckEditor() const;
[[nodiscard]] PathsSettings &paths() const;
[[nodiscard]] VisualDeckStorageSettings &visualDeckStorage() const;
[[nodiscard]] AppearanceSettings &appearance() const;
[[nodiscard]] NetworkSettings &network() const;
[[nodiscard]] CommanderBracketSettings &commanderBrackets() const
{
return *commanderBracketSettings;
}
[[nodiscard]] bool getIsPortableBuild() const
{
return isPortableBuild;
}
static SettingsCache &instance();
void resetPaths();
public slots:
void setThemeName(const QString &_themeName);
};
#endif