32 lines
2.8 KiB
C++
32 lines
2.8 KiB
C++
#include "workflow_fixture.hpp"
|
|||
|
|
struct EvidenceDriver:Simulator {
|
||
|
|
std::string sabotage;
|
||
|
|
void send(const GoalRequest& q)override {
|
||
|
|
if(!sabotage.empty()){std::filesystem::remove(sabotage);std::filesystem::create_directory(sabotage);}
|
||
|
|
record_wire_request(q.goal_id,"bt_skill_interfaces/action/ExecuteManipulation_Goal","000102ff");
|
||
|
|
sent.push_back(q);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
int main(){
|
||
|
|
const auto path=Fixture::test_root()+"/evidence.journal"; EvidenceDriver driver; std::string id;
|
||
|
|
GoalRequest q;q.robot_id="robot";q.trace={"task","pick","run",1,1,1,1};q.skill=Skill::PICK;
|
||
|
|
{ActiveGoalRegistry registry(driver,path);id=*registry.start(q,SteadyTime{});
|
||
|
|
assert(registry.find(id)->request.wire_request_snapshot=="000102ff");
|
||
|
|
GoalEvent e;e.goal_id=id;e.trace=q.trace;e.kind=EventKind::ACCEPTED;driver.events.push_back(e);registry.pump(SteadyTime{});
|
||
|
|
e.kind=EventKind::FEEDBACK;e.sequence=2;e.feedback_snapshot="{\"phase\":3,\"message\":\"executing\\nchunk\",\"progress\":0.25}";driver.events.push_back(e);registry.pump(SteadyTime{});
|
||
|
|
e.sequence=1;e.feedback_snapshot="old feedback";driver.events.push_back(e);registry.pump(SteadyTime{});
|
||
|
|
assert(registry.find(id)->feedback_snapshot.find("executing")!=std::string::npos);
|
||
|
|
registry.request_cancel(id,SteadyTime{});e.sequence=3;e.feedback_snapshot="STOPPING";driver.events.push_back(e);registry.pump(SteadyTime{});assert(registry.find(id)->feedback_snapshot=="STOPPING");assert(registry.robot_locked("robot"));
|
||
|
|
e.kind=EventKind::RESULT;e.native_status=NativeStatus::ABORTED;e.result.code=ResultCode::FAILED;e.result.stop=StopState::CONFIRMED;e.result.error_code="VLA_INFERENCE_TIMEOUT";e.result.execution_record_ref="records/run/pick.json";e.result.wire_result_type="bt_skill_interfaces/action/ExecuteManipulation_Result";e.result.wire_result_snapshot="000abbff";driver.events.push_back(e);registry.pump(SteadyTime{});
|
||
|
|
}
|
||
|
|
{ActiveGoalRegistry registry(driver,path);auto r=registry.find(id);assert(r);
|
||
|
|
assert(r->request.wire_request_type=="bt_skill_interfaces/action/ExecuteManipulation_Goal");
|
||
|
|
assert(r->request.wire_request_snapshot=="000102ff");assert(r->feedback_snapshot=="STOPPING");
|
||
|
|
assert(r->result->wire_result_type=="bt_skill_interfaces/action/ExecuteManipulation_Result");assert(r->result->wire_result_snapshot=="000abbff");assert(r->result->error_code=="VLA_INFERENCE_TIMEOUT");assert(r->result->execution_record_ref=="records/run/pick.json");
|
||
|
|
}
|
||
|
|
const auto bad=Fixture::test_root()+"/wire-write-failure.journal";EvidenceDriver broken;broken.sabotage=bad;
|
||
|
|
{ActiveGoalRegistry registry(broken,bad);try{registry.start(q,SteadyTime{});}catch(const std::exception&){}assert(broken.sent.empty());assert(registry.robot_locked("robot"));}
|
||
|
|
std::filesystem::remove(bad);
|
||
|
|
std::cout<<"wire request, ordered feedback and structured result survive restart; snapshot storage failure prevents transport\n";
|
||
|
|
}
|