31 lines
1.3 KiB
C++
31 lines
1.3 KiB
C++
#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";
|
|
}
|