diff --git a/test/pitytest11/src/PityUnit.hh b/test/pitytest11/src/PityUnit.hh index 9fe6ced..5d39714 100644 --- a/test/pitytest11/src/PityUnit.hh +++ b/test/pitytest11/src/PityUnit.hh @@ -8,6 +8,7 @@ #include "../../../src/std_utils.hh" #include "fs_mutex.hh" #include "PityTransport.hh" +//#include "PityPerspective.hh" #include #include #include @@ -17,12 +18,11 @@ namespace pEp { namespace PityTest11 { - class PityModel; - class PityPerspective; - template + template class PityUnit { public: + using TestFunction = const std::function&, TestContext*)>; enum class ExecutionMode { FUNCTION, @@ -35,12 +35,11 @@ namespace pEp { // Constructors are private PityUnit() = delete; - explicit PityUnit( - PityUnit<>* parent, + explicit PityUnit( + PityUnit* parent, const std::string& name, - const std::function test_func = nullptr, - T* model = nullptr, - P* perspective = nullptr, + TestFunction test_func = nullptr, + TestContext* perspective = nullptr, ExecutionMode exec_mode = ExecutionMode::FUNCTION); // Read-Only @@ -49,12 +48,14 @@ namespace pEp { std::string getPathShort() const; std::string processDir(); // own process dir std::string transportDir(); + PityUnit* rootUnit(); + TestContext* getPerspective() const; + const PityUnit& parentingProcessUnit() const; + // Read-Write - // void setExecutionMode(ExecutionMode mode); static void setGlobalRootDir(const std::string& dir); static std::string getGlobalRootDir(); - // Main funcs void run(); std::string to_string(bool recursive = true, int indent = 0); @@ -68,7 +69,6 @@ namespace pEp { void registerAsTransportEndpoint(); Endpoints& transportEndpoints(); - // logging service void log(const std::string& msg) const; void logH1(const std::string& msg) const; @@ -80,8 +80,6 @@ namespace pEp { Adapter::pEpLog::pEpLogger logger_debug{ "PityUnit", debug_log_enabled }; private: - // CONSTRUCTORS - // METHODS // Execution void _init(); @@ -92,17 +90,17 @@ namespace pEp { void _waitChildProcesses() const; // Modify - void _addChildUnit(PityUnit& unit); + void _addChildUnit(PityUnit& unit); + + // Transport + void _createTransport(); // Query bool _isProcessUnit() const; bool _isRootUnit() const; - PityUnit* _rootUnit(); + std::string _rootUnitDir(); - const PityUnit& _parentingProcessUnit() const; - T* _getModel() const; - P* _getPerspective() const; - void createTransport(); + // Util @@ -110,17 +108,16 @@ namespace pEp { std::string _status_string(const std::string& msg) const; Utils::Color _colForProcUnitNr(int procUnitNr) const; Utils::Color _termColor() const; - void logRaw(const std::string& msg) const; + void _logRaw(const std::string& msg) const; // Fields const std::string _name; - PityUnit* _parent; //nullptr if RootUnit - T* _model; //nullptr if inherited - P* _perspective; //nullptr if inherited - const std::function _test_func; + PityUnit* _parent; //nullptr if RootUnit + TestContext* _perspective; //nullptr if inherited + TestFunction _test_func; ExecutionMode _exec_mode; static std::string _global_root_dir; - std::map _children; // map to guarantee uniqueness of sibling-names + std::map&> _children; // map to guarantee uniqueness of sibling-names int procUnitNr; static int procUnitsCount; // will be increased in everuy constructor std::shared_ptr _transport; //only ever read via transport() diff --git a/test/pitytest11/src/PityUnit.hxx b/test/pitytest11/src/PityUnit.hxx index 2e24ee1..778747d 100644 --- a/test/pitytest11/src/PityUnit.hxx +++ b/test/pitytest11/src/PityUnit.hxx @@ -16,32 +16,30 @@ #include #include -//using namespace pEp::Adapter::pEpLog; namespace pEp { namespace PityTest11 { // static - template - std::string PityUnit::_global_root_dir = "./pitytest_data/"; + template + std::string PityUnit::_global_root_dir = "./pitytest_data/"; // static - template - bool PityUnit::debug_log_enabled = false; + template + bool PityUnit::debug_log_enabled = false; // static - template - int PityUnit::procUnitsCount = 0; + template + int PityUnit::procUnitsCount = 0; // CONSTRUCTOR - template - PityUnit::PityUnit( - PityUnit<>* const parent, + template + PityUnit::PityUnit( + PityUnit* const parent, const std::string& name, - const std::function test_func, - T* model, - P* perspective, + TestFunction test_func, + TestContext* perspective, ExecutionMode exec_mode) : _parent{ parent }, - _model{ model }, _perspective{ perspective }, _name{ _normalizeName(name) }, - _test_func{ test_func }, _exec_mode{ exec_mode } + _perspective{ perspective }, _name{ _normalizeName(name) }, _test_func{ test_func }, + _exec_mode{ exec_mode } { logger_debug.set_instancename(getPath()); if (!_isRootUnit()) { @@ -50,7 +48,7 @@ namespace pEp { procUnitNr = _parent->procUnitNr; //Or update if procUnit if (_isProcessUnit()) { - createTransport(); + _createTransport(); procUnitsCount++; procUnitNr = procUnitsCount; } @@ -59,14 +57,14 @@ namespace pEp { } } - template - std::string PityUnit::getName() const + template + std::string PityUnit::getName() const { return _name; } - template - std::string PityUnit::getPath() const + template + std::string PityUnit::getPath() const { std::string ret; @@ -83,8 +81,8 @@ namespace pEp { // ProcessUnit - ".../" // When Process as dir. parent - "...//name" // When no process as dir. parent - "...//.../name" - template - std::string PityUnit::getPathShort() const + template + std::string PityUnit::getPathShort() const { std::string ret; if (_isRootUnit()) { @@ -93,10 +91,10 @@ namespace pEp { if (_isProcessUnit()) { ret += ".../" + getName(); } else { - if (&(_parentingProcessUnit()) == (_parent)) { - ret = _parentingProcessUnit().getPathShort() + "/" + getName(); + if (&(parentingProcessUnit()) == (_parent)) { + ret = parentingProcessUnit().getPathShort() + "/" + getName(); } else { - ret = _parentingProcessUnit().getPathShort() + "/.../" + getName(); + ret = parentingProcessUnit().getPathShort() + "/.../" + getName(); } } } @@ -105,16 +103,16 @@ namespace pEp { // Every RootUnit has its own dir - template - std::string PityUnit::_rootUnitDir() + template + std::string PityUnit::_rootUnitDir() { - return getGlobalRootDir() + _rootUnit()->getName() + "/"; + return getGlobalRootDir() + rootUnit()->getName() + "/"; } // Every process has its own dir inside its rootUnitDir // All other units inherit processDir from their Root/ProcessUnit - template - std::string PityUnit::processDir() + template + std::string PityUnit::processDir() { if (_isRootUnit()) { return _rootUnitDir(); @@ -129,8 +127,8 @@ namespace pEp { // Every process has its own dir inside its rootUnitDir // All other units inherit transportDir from their Root/ProcessUnit - template - std::string PityUnit::transportDir() + template + std::string PityUnit::transportDir() { if (_isRootUnit()) { throw std::runtime_error("No transport dir"); @@ -143,28 +141,28 @@ namespace pEp { } } - // template - // void PityUnit::setExecutionMode(ExecutionMode mode) + // template + // void PityUnit::setExecutionMode(ExecutionMode mode) // { // _exec_mode = mode; // } // static - template - void PityUnit::setGlobalRootDir(const std::string& dir) + template + void PityUnit::setGlobalRootDir(const std::string& dir) { - PityUnit::_global_root_dir = dir; + PityUnit::_global_root_dir = dir; } // static - template - std::string PityUnit::getGlobalRootDir() + template + std::string PityUnit::getGlobalRootDir() { return PityUnit::_global_root_dir; } - template - void PityUnit::run() + template + void PityUnit::run() { pEpLogClass("called"); _log_mutex = std::make_shared("fds"); @@ -176,10 +174,10 @@ namespace pEp { // Execute in fork and wait here until process ends if (_exec_mode == ExecutionMode::PROCESS_SEQUENTIAL) { // fork - _executeInFork(std::bind(&PityUnit::_run, this), true); + _executeInFork(std::bind(&PityUnit::_run, this), true); // Execute in fork and go on, wait for process execution in the end } else if (_exec_mode == ExecutionMode::PROCESS_PARALLEL) { - _executeInFork(std::bind(&PityUnit::_run, this), false); + _executeInFork(std::bind(&PityUnit::_run, this), false); // Execute as normal funciton } else if (_exec_mode == ExecutionMode::FUNCTION) { _run(); @@ -194,8 +192,8 @@ namespace pEp { } } - template - std::string PityUnit::to_string(bool recursive, int indent) + template + std::string PityUnit::to_string(bool recursive, int indent) { std::string ret; std::stringstream builder; @@ -212,7 +210,7 @@ namespace pEp { if (recursive) { if (!_children.empty()) { indent++; - for (const std::pair&> child : _children) { + for (const std::pair&> child : _children) { ret += child.second.to_string(true, indent); } indent--; @@ -221,8 +219,8 @@ namespace pEp { return ret; } - template - std::string PityUnit::to_string(const ExecutionMode& emode) + template + std::string PityUnit::to_string(const ExecutionMode& emode) { switch (emode) { case ExecutionMode::FUNCTION: @@ -242,36 +240,36 @@ namespace pEp { } } - template - void PityUnit::recreateDirsRecursively() + template + void PityUnit::recreateDirsRecursively() { Utils::dir_recreate(processDir()); if (!_children.empty()) { - for (const std::pair&> child : _children) { + for (const std::pair&> child : _children) { child.second.recreateDirsRecursively(); } } } - template - void PityUnit::registerAsTransportEndpoint() + template + void PityUnit::registerAsTransportEndpoint() { transportEndpoints().insert({ getName(), transportDir() }); } - template - Endpoints& PityUnit::transportEndpoints() + template + Endpoints& PityUnit::transportEndpoints() { if (_isRootUnit()) { return _transport_endpoints; } else { - return _rootUnit()->transportEndpoints(); + return rootUnit()->transportEndpoints(); } } - template - void PityUnit::log(const std::string& msg) const + template + void PityUnit::log(const std::string& msg) const { std::stringstream builder; builder << "["; @@ -281,39 +279,39 @@ namespace pEp { builder << "] - "; builder << msg; - logRaw(builder.str()); + _logRaw(builder.str()); } - template - void PityUnit::logH1(const std::string& msg) const + template + void PityUnit::logH1(const std::string& msg) const { Adapter::pEpLog::logH1(msg, _termColor()); } - template - void PityUnit::logH2(const std::string& msg) const + template + void PityUnit::logH2(const std::string& msg) const { Adapter::pEpLog::logH2(msg, _termColor()); } - template - void PityUnit::logH3(const std::string& msg) const + template + void PityUnit::logH3(const std::string& msg) const { Adapter::pEpLog::logH3(msg, _termColor()); } // PRIVATE --------------------------------------------------------------------------------- - template - void PityUnit::_init() + template + void PityUnit::_init() { logH1("PityTest Starting..."); - logRaw("RootUnit: " + getPathShort()); - logRaw("GlobalRootDir: " + getGlobalRootDir()); - logRaw("\nTestTree"); - logRaw("--------"); - logRaw(to_string()); + _logRaw("RootUnit: " + getPathShort()); + _logRaw("GlobalRootDir: " + getGlobalRootDir()); + _logRaw("\nTestTree"); + _logRaw("--------"); + _logRaw(to_string()); logH3("INIT"); Utils::dir_ensure(getGlobalRootDir()); @@ -322,42 +320,42 @@ namespace pEp { } - template - void PityUnit::_run() + template + void PityUnit::_run() { logH2(_status_string("STARTING")); _runSelf(); _runChildren(); } - template - void PityUnit::_runSelf() + template + void PityUnit::_runSelf() { if (_test_func != nullptr) { try { - _test_func(*this, _getModel(), _getPerspective()); + _test_func(*this, getPerspective()); logH3(_status_string("\033[1m\033[32mSUCCESS" + Utils::to_termcol(_termColor()))); } catch (const std::exception& e) { - logRaw("reason: " + std::string(e.what())); + _logRaw("reason: " + std::string(e.what())); logH3(_status_string("\033[1m\033[31mFAILED" + Utils::to_termcol(_termColor()))); } } else { - logRaw("No function to execute"); + _logRaw("No function to execute"); } } - template - void PityUnit::_runChildren() const + template + void PityUnit::_runChildren() const { if (!_children.empty()) { - for (const std::pair&> child : _children) { + for (const std::pair&> child : _children) { child.second.run(); } } } - template - void PityUnit::_executeInFork(std::function func, bool wait_child) const + template + void PityUnit::_executeInFork(std::function func, bool wait_child) const { pid_t pid; pid = fork(); @@ -372,8 +370,8 @@ namespace pEp { } } - template - void PityUnit::_waitChildProcesses() const + template + void PityUnit::_waitChildProcesses() const { int status; pid_t pid; @@ -384,14 +382,14 @@ namespace pEp { } } - template - void PityUnit::_addChildUnit(PityUnit& unit) + template + void PityUnit::_addChildUnit(PityUnit& unit) { - _children.insert(std::pair&>(unit.getName(), unit)); + _children.insert(std::pair&>(unit.getName(), unit)); } - template - bool PityUnit::_isProcessUnit() const + template + bool PityUnit::_isProcessUnit() const { bool ret = false; if (_exec_mode == ExecutionMode::PROCESS_SEQUENTIAL || @@ -401,8 +399,8 @@ namespace pEp { return ret; } - template - bool PityUnit::_isRootUnit() const + template + bool PityUnit::_isRootUnit() const { if (_parent == nullptr) { return true; @@ -411,12 +409,12 @@ namespace pEp { } } - template - PityUnit* PityUnit::_rootUnit() + template + PityUnit* PityUnit::rootUnit() { - // const PityUnit* ret = nullptr; + // const PityUnit* ret = nullptr; if (!_isRootUnit()) { - return _parent->_rootUnit(); + return _parent->rootUnit(); } else { return this; } @@ -426,61 +424,45 @@ namespace pEp { // return *ret; } - template - const PityUnit& PityUnit::_parentingProcessUnit() const + template + const PityUnit& PityUnit::parentingProcessUnit() const { if (_isRootUnit() || _isProcessUnit()) { return *this; } else { - return _parent->_parentingProcessUnit(); + return _parent->parentingProcessUnit(); } } - // Inherited (if null see parent recursively) - template - T* PityUnit::_getModel() const - { - pEpLogClass("called"); - T* ret = nullptr; - - if (_model != nullptr) { - ret = _model; - } else { - if (!_isRootUnit()) { - ret = _parent->_getModel(); - } - } - return ret; - } // Inherited (if null see parent recursively) - template - P* PityUnit::_getPerspective() const + template + TestContext* PityUnit::getPerspective() const { pEpLogClass("called"); - P* ret = nullptr; + TestContext* ret = nullptr; if (_perspective != nullptr) { ret = _perspective; } else { if (!_isRootUnit()) { - ret = _parent->_getPerspective(); + ret = _parent->getPerspective(); } } return ret; } // Inherited (if null see parent recursively) - template - void PityUnit::createTransport() + template + void PityUnit::_createTransport() { registerAsTransportEndpoint(); _transport = std::make_shared(transportDir(), transportEndpoints()); } // Inherited (if null see parent recursively) - template - PityTransport* PityUnit::transport() const + template + PityTransport* PityUnit::transport() const { pEpLogClass("called"); PityTransport* ret = nullptr; @@ -496,8 +478,8 @@ namespace pEp { } // name is alphanumeric only (everything else will be replaced by an underscore) - template - std::string PityUnit::_normalizeName(std::string name) const + template + std::string PityUnit::_normalizeName(std::string name) const { replace_if( name.begin(), @@ -508,8 +490,8 @@ namespace pEp { return name; } - template - std::string PityUnit::_status_string(const std::string& msg) const + template + std::string PityUnit::_status_string(const std::string& msg) const { std::string ret; ret = "[ " + to_string(_exec_mode) + ":" + std::to_string(getpid()) + " ] [ " + @@ -518,8 +500,8 @@ namespace pEp { } - template - Utils::Color PityUnit::_colForProcUnitNr(int procUnitNr) const + template + Utils::Color PityUnit::_colForProcUnitNr(int procUnitNr) const { int nrColors = 7; switch (procUnitNr % nrColors) { @@ -542,14 +524,14 @@ namespace pEp { } } - template - Utils::Color PityUnit::_termColor() const + template + Utils::Color PityUnit::_termColor() const { return _colForProcUnitNr(procUnitNr); } - template - void PityUnit::logRaw(const std::string& msg) const + template + void PityUnit::_logRaw(const std::string& msg) const { _log_mutex->aquire(); Adapter::pEpLog::log(msg, _termColor());