1#ifndef BACKENDS_P4TOOLS_MODULES_TESTGEN_LIB_TEST_SPEC_H_
2#define BACKENDS_P4TOOLS_MODULES_TESTGEN_LIB_TEST_SPEC_H_
9#include "backends/p4tools/common/lib/model.h"
10#include "backends/p4tools/common/lib/trace_event.h"
12#include "lib/cstring.h"
14#include "backends/p4tools/modules/testgen/lib/test_object.h"
16namespace P4::P4Tools::P4Testgen {
27class Packet :
public TestObject {
33 const IR::Expression *payload;
36 const IR::Expression *payloadIgnoreMask;
39 Packet(
int port,
const IR::Expression *payload,
const IR::Expression *payloadIgnoreMask);
41 [[nodiscard]]
const Packet *
evaluate(
const Model &model,
bool doComplete)
const override;
46 [[nodiscard]]
int getPort()
const;
58 DECLARE_TYPEINFO(Packet, TestObject);
65class ActionArg :
public TestObject {
68 const IR::Parameter *param;
71 const IR::Expression *value;
74 ActionArg(
const IR::Parameter *param,
const IR::Expression *value);
76 [[nodiscard]]
const ActionArg *
evaluate(
const Model &model,
bool doComplete)
const override;
80 [[nodiscard]]
const IR::Parameter *getActionParam()
const;
90 DECLARE_TYPEINFO(ActionArg, TestObject);
93class ActionCall :
public TestObject {
99 const IR::P4Action *action;
102 const std::vector<ActionArg> args;
105 ActionCall(
cstring identifier,
const IR::P4Action *action, std::vector<ActionArg> args);
107 ActionCall(
const IR::P4Action *action, std::vector<ActionArg> args);
109 [[nodiscard]]
const ActionCall *
evaluate(
const Model &model,
bool doComplete)
const override;
118 [[nodiscard]]
const IR::P4Action *
getAction()
const;
121 [[nodiscard]]
const std::vector<ActionArg> *
getArgs()
const;
123 DECLARE_TYPEINFO(ActionCall, TestObject);
126class TableMatch :
public TestObject {
129 const IR::KeyElement *key;
132 explicit TableMatch(
const IR::KeyElement *key);
135 [[nodiscard]]
const IR::KeyElement *
getKey()
const;
137 DECLARE_TYPEINFO(TableMatch, TestObject);
140using TableMatchMap = std::map<cstring, const TableMatch *>;
142class Ternary :
public TableMatch {
145 const IR::Expression *value;
148 const IR::Expression *mask;
151 explicit Ternary(
const IR::KeyElement *key,
const IR::Expression *value,
152 const IR::Expression *mask);
154 [[nodiscard]]
const Ternary *
evaluate(
const Model &model,
bool doComplete)
const override;
168 DECLARE_TYPEINFO(Ternary, TableMatch);
171class LPM :
public TableMatch {
174 const IR::Expression *value;
177 const IR::Expression *prefixLength;
180 explicit LPM(
const IR::KeyElement *key,
const IR::Expression *value,
181 const IR::Expression *prefixLength);
183 [[nodiscard]]
const LPM *
evaluate(
const Model &model,
bool doComplete)
const override;
197 DECLARE_TYPEINFO(LPM, TableMatch);
200class Exact :
public TableMatch {
203 const IR::Expression *value;
206 explicit Exact(
const IR::KeyElement *key,
const IR::Expression *value);
208 [[nodiscard]]
const Exact *
evaluate(
const Model &model,
bool doComplete)
const override;
216 DECLARE_TYPEINFO(Exact, TableMatch);
219class TableRule :
public TestObject {
222 const TableMatchMap matches;
232 TableRule(TableMatchMap matches,
int priority,
ActionCall action,
int ttl);
234 [[nodiscard]]
const TableRule *
evaluate(
const Model &model,
bool doComplete)
const override;
239 [[nodiscard]]
const TableMatchMap *
getMatches()
const;
248 [[nodiscard]]
int getTTL()
const;
250 DECLARE_TYPEINFO(TableRule, TestObject);
253class TableConfig :
public TestObject {
256 const IR::P4Table *table;
259 const std::vector<TableRule> rules;
262 TestObjectMap tableProperties;
265 explicit TableConfig(
const IR::P4Table *table, std::vector<TableRule> rules);
267 explicit TableConfig(
const IR::P4Table *table, std::vector<TableRule> rules,
268 TestObjectMap tableProperties);
270 [[nodiscard]]
const IR::P4Table *getTable()
const;
274 [[nodiscard]]
const TableConfig *
evaluate(
const Model &model,
bool doComplete)
const override;
277 [[nodiscard]]
const std::vector<TableRule> *
getRules()
const;
284 [[nodiscard]]
const TestObject *
getProperty(
cstring propertyName,
bool checked)
const;
289 DECLARE_TYPEINFO(TableConfig, TestObject);
299 const Packet ingressPacket;
303 const std::optional<Packet> egressPacket;
306 const std::vector<std::reference_wrapper<const TraceEvent>> traces;
310 std::map<cstring, TestObjectMap> testObjects;
313 TestSpec(
Packet ingressPacket, std::optional<Packet> egressPacket,
314 std::vector<std::reference_wrapper<const TraceEvent>> traces);
332 const auto *testObject =
getTestObject(category, objectLabel, checked);
333 return testObject->checkedTo<T>();
343 [[nodiscard]]
const std::map<cstring, const TableConfig> *
getTables()
const;
349 [[nodiscard]]
const std::vector<std::reference_wrapper<const TraceEvent>> *
getTraces()
const;
353 static constexpr int LOW_PRIORITY = 1;
354 static constexpr int HIGH_PRIORITY = 100;
355 static constexpr int TTL = 0;