1#ifndef BACKENDS_P4TOOLS_MODULES_TESTGEN_LIB_TEST_FRAMEWORK_H_
2#define BACKENDS_P4TOOLS_MODULES_TESTGEN_LIB_TEST_FRAMEWORK_H_
13#include <inja/inja.hpp>
15#include "backends/p4tools/common/lib/format_int.h"
16#include "backends/p4tools/common/lib/trace_event.h"
17#include "lib/castable.h"
18#include "lib/cstring.h"
20#include "backends/p4tools/modules/testgen/lib/test_backend_configuration.h"
21#include "backends/p4tools/modules/testgen/lib/test_object.h"
22#include "backends/p4tools/modules/testgen/lib/test_spec.h"
24namespace P4Tools::P4Testgen {
31using AbstractTestReferenceOrError = std::optional<AbstractTestReference>;
32using AbstractTestList = std::vector<AbstractTestReference>;
36template <
class ConcreteTest,
37 typename = std::enable_if_t<std::is_base_of_v<AbstractTest, ConcreteTest>>>
38std::vector<const ConcreteTest *> convertAbstractTestsToConcreteTests(
39 const P4Tools::P4Testgen::AbstractTestList &testList) {
40 std::vector<const ConcreteTest *> result;
41 std::transform(testList.begin(), testList.end(), std::back_inserter(result),
48using OptionalFilePath = std::optional<std::filesystem::path>;
55 std::reference_wrapper<const TestBackendConfiguration> testBackendConfiguration;
63 inja::json traceList = inja::json::array();
64 const auto *traces = testSpec->
getTraces();
65 if (traces !=
nullptr) {
66 for (
const auto &trace : *traces) {
69 traceList.push_back(ss.str());
77 template <
class ProfileType,
class SelectorType>
80 const auto *apObject = tblConfig->
getProperty(
"action_profile",
false);
81 if (apObject !=
nullptr) {
82 const auto *actionProfile = apObject->
checkedTo<ProfileType>();
83 tblJson[
"has_ap"] =
true;
87 const auto *asObject = tblConfig->
getProperty(
"action_selector",
false);
88 if (asObject !=
nullptr) {
89 const auto *actionSelector = asObject->
checkedTo<SelectorType>();
90 apAsMap[actionProfile->getProfileDecl()->controlPlaneName()] =
91 actionSelector->getSelectorDecl()->controlPlaneName();
92 tblJson[
"has_as"] =
true;
100 const auto *defaultOverrideObj = tblConfig->
getProperty(
"overriden_default_action",
false);
101 if (defaultOverrideObj !=
nullptr) {
105 auto const *actionArgs = defaultAction->getArgs();
106 inja::json b = inja::json::array();
107 for (
const auto &actArg : *actionArgs) {
109 j[
"param"] = actArg.getActionParamName().c_str();
114 tblJson[
"default_override"] = a;
119 template <
class ProfileType>
121 inja::json &controlPlaneJson,
122 const std::map<cstring, cstring> &apAsMap) {
124 if (!actionProfiles.empty()) {
125 controlPlaneJson[
"action_profiles"] = inja::json::array();
127 for (
auto const &testObject : actionProfiles) {
128 const auto *
const actionProfile = testObject.second->checkedTo<ProfileType>();
129 const auto *actions = actionProfile->getActions();
131 j[
"profile"] = actionProfile->getProfileDecl()->controlPlaneName();
132 j[
"actions"] = inja::json::array();
133 for (
size_t idx = 0; idx < actions->size(); ++idx) {
134 const auto &action = actions->at(idx);
135 auto actionName = action.first;
136 auto actionArgs = action.second;
138 a[
"action_name"] = actionName;
139 a[
"action_idx"] = std::to_string(idx);
140 inja::json b = inja::json::array();
141 for (
const auto &actArg : actionArgs) {
143 c[
"param"] = actArg.getActionParamName().c_str();
144 c[
"value"] =
formatHexExpr(actArg.getEvaluatedValue()).c_str();
148 j[
"actions"].push_back(a);
151 if (apAsMap.find(actionProfile->getProfileDecl()->controlPlaneName()) !=
153 j[
"selector"] = apAsMap.at(actionProfile->getProfileDecl()->controlPlaneName());
155 controlPlaneJson[
"action_profiles"].push_back(j);
174 float currentCoverage) = 0;
182 size_t testIdx,
float currentCoverage);
const T * checkedTo() const
Performs a checked cast. A BUG occurs if the cast fails.
Definition castable.h:52