#include "opendbc/can/common.h" #undef INFO #include "catch2/catch.hpp" #include "tools/cabana/dbcmanager.h" #include "tools/replay/logreader.h" // demo route, first segment const std::string TEST_RLOG_URL = "https://commadata2.blob.core.windows.net/commadata2/4cf7a6ad03080c90/2021-09-29--13-46-36/0/rlog.bz2"; TEST_CASE("DBCManager::generateDBC") { DBCManager dbc_origin(nullptr); dbc_origin.open("toyota_new_mc_pt_generated"); DBCManager dbc_from_generated(nullptr); dbc_from_generated.open("", dbc_origin.generateDBC()); auto &msgs = dbc_origin.messages(); auto &new_msgs = dbc_from_generated.messages(); REQUIRE(msgs.size() == new_msgs.size()); for (auto &[address, m] : msgs) { auto new_m = new_msgs.at(address); REQUIRE(m.name == new_m.name); REQUIRE(m.size == new_m.size); REQUIRE(m.sigs.size() == new_m.sigs.size()); for (auto &[name, sig] : m.sigs) REQUIRE(sig == new_m.sigs[name]); } } TEST_CASE("Parse can messages") { DBCManager dbc(nullptr); dbc.open("toyota_new_mc_pt_generated"); CANParser can_parser(0, "toyota_new_mc_pt_generated", {}, {}); LogReader log; REQUIRE(log.load(TEST_RLOG_URL, nullptr, {}, true)); REQUIRE(log.events.size() > 0); for (auto e : log.events) { if (e->which == cereal::Event::Which::CAN) { std::map, std::vector> values_1; for (const auto &c : e->event.getCan()) { const auto msg = dbc.msg(c.getAddress()); if (c.getSrc() == 0 && msg) { for (auto &[name, sig] : msg->sigs) { double val = get_raw_value((uint8_t *)c.getDat().begin(), c.getDat().size(), sig); values_1[{c.getAddress(), name.toStdString()}].push_back(val); } } } can_parser.UpdateCans(e->mono_time, e->event.getCan()); auto values_2 = can_parser.query_latest(); for (auto &[key, v1] : values_1) { bool found = false; for (auto &v2 : values_2) { if (v2.address == key.first && v2.name == key.second) { REQUIRE(v2.all_values.size() == v1.size()); REQUIRE(v2.all_values == v1); found = true; break; } } REQUIRE(found); } } } }