#include "robot_bt/core.hpp" #include #include #include #include using namespace robot_bt; struct FaultDriver final : GoalDriver { unsigned sent{0}, canceled{0}; bool ready(Skill) const override { return true; } void send(const GoalRequest&) override { ++sent; } void cancel(const std::string&) override { ++canceled; } std::vector drain_events() override { return {}; } }; int main() { char name[]="/tmp/bt_journal_failure_XXXXXX"; const char* directory=::mkdtemp(name); assert(directory); std::string path=std::string(directory)+"/goals"; FaultDriver driver; ActiveGoalRegistry registry(driver,path); GoalRequest q;q.robot_id="robot";q.trace={"task","pick","run",1,1,1,1}; const auto id=registry.start(q,SteadyTime{});assert(id&&driver.sent==1); // Simulate an unavailable journal after the motion request has been sent. std::filesystem::remove(path);std::filesystem::create_directory(path); try { registry.request_cancel(*id,SteadyTime{}); } catch(const std::exception&) {} assert(driver.canceled==1 && "journal failure must never suppress a stop request"); assert(registry.robot_locked("robot")); q.trace.attempt=2;assert(!registry.start(q,SteadyTime{})); std::filesystem::remove_all(directory); std::cout<<"journal fault preserves cancel and quarantine\n"; }