//------------------------------------------------------------------------------ // File: test-config.hh // Author: Georgios Bitzes - CERN //------------------------------------------------------------------------------ /************************************************************************ * quarkdb - a redis-like highly available key-value store * * Copyright (C) 2016 CERN/Switzerland * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see .* ************************************************************************/ #ifndef __QUARKDB_TEST_CONFIG_H__ #define __QUARKDB_TEST_CONFIG_H__ #include "raft/RaftTimeouts.hh" #include "Utils.hh" namespace quarkdb { struct TestConfig; // A configuration option which can be given a global default, a local default // through setStatic, but also overriden during runtime through environment // variables. template class ConfigurationOption { public: template ConfigurationOption(Args&&... args) : value{std::forward(args)...} {} T* operator->() { return &value; } operator T() { return value; } T get() { return value; } void setStatic(const T& val) { if(overridenAtRuntime) return; value = val; } private: T value; bool overridenAtRuntime = false; void setRuntime(const T& val) { overridenAtRuntime = true; value = val; } friend struct TestConfig; }; struct TestConfig { // parse environment variables to give the possibility to override defaults TestConfig(); void parseSingle(const std::string &key, const std::string &value); ConfigurationOption raftTimeouts {aggressiveTimeouts}; ConfigurationOption databaseReuse {true}; ConfigurationOption> benchmarkThreads {1, 2, 4, 8}; ConfigurationOption> benchmarkEvents {3000000}; }; extern TestConfig testconfig; } #endif