Files
behavior-tree/core/tests/journal_failure_test.cpp
T

31 lines
1.3 KiB
C++
Raw Normal View History

#include "robot_bt/core.hpp"
#include <cassert>
#include <cstdlib>
#include <filesystem>
#include <iostream>
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<GoalEvent> 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";
}