bool success = false;
};
+class DlogTTS : public PredicateWaitInterface
+{
+public:
+ DlogTTS(BatchExecutor *executor, std::chrono::milliseconds timeout, std::string pattern)
+ : PredicateWaitInterface(executor, timeout)
+ {
+ {
+ auto h = self->dlogInfo.lock();
+ h->searchLine = std::move(pattern);
+ h->mode = BatchExecutor::DLogInfo::Mode::search;
+ }
+ }
+
+private:
+ bool predicate() override
+ {
+ auto h = self->dlogInfo.lock();
+ auto res = h.waitForCondition(timeout, [&]() {
+ return h->mode == BatchExecutor::DLogInfo::Mode::found;
+ });
+
+ h->mode = BatchExecutor::DLogInfo::Mode::ignore;
+ if (!res)
+ throw EvaluationFailure{} << "wait for dlog ('" << pattern << "'): operation timeouted";
+
+ return res;
+ }
+
+ std::string pattern;
+};
+
class WaitTTS : public PredicateWaitInterface
{
public:
WaitTTS(BatchExecutor *executor, std::chrono::milliseconds timeout, std::string pattern)
: PredicateWaitInterface(executor, timeout)
{
+ this->pattern = pattern;
{
auto h = self->ttsInfo.lock();
if (!pattern.empty())
h->searchLine = std::move(pattern);
h->mode = BatchExecutor::TTSInfo::Mode::search;
}
- this->pattern = std::move(pattern);
}
private:
return h->mode == BatchExecutor::TTSInfo::Mode::found;
});
- if (!res) {
- h->mode = BatchExecutor::TTSInfo::Mode::ignore;
- throw EvaluationFailure{} << "wait for dlog ('" << pattern << "'): operation timeouted";
- }
h->mode = BatchExecutor::TTSInfo::Mode::ignore;
+ if (!res)
+ throw EvaluationFailure{} << "wait for tts ('" << pattern << "'): operation timeouted";
return res;
}
void BatchExecutor::insertWaits()
{
+ auto dlogTTS = [&](std::string pattern, double timeout) -> EvaluationValue {
+ auto impl = std::make_shared<DlogTTS>(this, std::chrono::milliseconds{ static_cast<size_t>(timeout * 1000) }, std::move(pattern));
+ return EvaluationValue{ impl };
+ };
+ variables["dlog"] = EvaluationValueFunction{ std::move(dlogTTS), { { "pattern" }, { "timeout", 5.0 } } };
+
auto waitTTS = [&](std::string pattern, double timeout) -> EvaluationValue {
auto impl = std::make_shared<WaitTTS>(this, std::chrono::milliseconds{ static_cast<size_t>(timeout * 1000) }, std::move(pattern));
return EvaluationValue{ impl };
}
}
});
+ auto dlogHandler = dlog.registerCallback([&exec](const std::string & txt) {
+ auto h = exec->dlogInfo.lock();
+ if (h->mode == BatchExecutor::DLogInfo::Mode::search) {
+ if (txt.find(h->searchLine) != std::string::npos) {
+ h->mode = BatchExecutor::DLogInfo::Mode::found;
+ }
+ }
+ });
exec->outputStream() << "evaluation started\n";
try {
result->evaluate();
struct TTSInfo {
Optional<std::string> searchLine;
enum class Mode { ignore, search, found };
- Mode mode;
+ Mode mode = Mode::ignore;
+ };
+ struct DLogInfo {
+ std::string searchLine;
+ enum class Mode { ignore, search, found };
+ Mode mode = Mode::ignore;
};
// NOTE: constructor of TestExecutor must be called on main thread
Monitor<TTSInfo> ttsInfo;
Monitor<ContextInfo> contextInfo;
+ Monitor<DLogInfo> dlogInfo;
std::unordered_map<std::string, EvaluationValue> variables;
protected: