7#ifndef BACKENDS_P4TOOLS_MODULES_TESTGEN_LIB_TEST_SPEC_H_
8#define BACKENDS_P4TOOLS_MODULES_TESTGEN_LIB_TEST_SPEC_H_
15#include "backends/p4tools/common/lib/model.h"
16#include "backends/p4tools/common/lib/trace_event.h"
18#include "lib/cstring.h"
19#include "lib/ordered_map.h"
21#include "backends/p4tools/modules/testgen/lib/test_object.h"
23namespace P4::P4Tools::P4Testgen {
34class Packet :
public TestObject {
40 const IR::Expression *payload;
43 const IR::Expression *payloadIgnoreMask;
46 Packet(
int port,
const IR::Expression *payload,
const IR::Expression *payloadIgnoreMask);
48 [[nodiscard]]
const Packet *
evaluate(
const Model &model,
bool doComplete)
const override;
53 [[nodiscard]]
int getPort()
const;
65 DECLARE_TYPEINFO(Packet, TestObject);
72class ActionArg :
public TestObject {
75 const IR::Parameter *param;
78 const IR::Expression *value;
81 ActionArg(
const IR::Parameter *param,
const IR::Expression *value);
83 [[nodiscard]]
const ActionArg *
evaluate(
const Model &model,
bool doComplete)
const override;
87 [[nodiscard]]
const IR::Parameter *getActionParam()
const;
97 DECLARE_TYPEINFO(ActionArg, TestObject);
100class ActionCall :
public TestObject {
106 const IR::P4Action *action;
109 const std::vector<ActionArg> args;
112 ActionCall(
cstring identifier,
const IR::P4Action *action, std::vector<ActionArg> args);
114 ActionCall(
const IR::P4Action *action, std::vector<ActionArg> args);
116 [[nodiscard]]
const ActionCall *
evaluate(
const Model &model,
bool doComplete)
const override;
125 [[nodiscard]]
const IR::P4Action *
getAction()
const;
128 [[nodiscard]]
const std::vector<ActionArg> *
getArgs()
const;
130 DECLARE_TYPEINFO(ActionCall, TestObject);
133class TableMatch :
public TestObject {
136 const IR::KeyElement *key;
139 explicit TableMatch(
const IR::KeyElement *key);
142 [[nodiscard]]
const IR::KeyElement *
getKey()
const;
144 DECLARE_TYPEINFO(TableMatch, TestObject);
149class Ternary :
public TableMatch {
152 const IR::Expression *value;
155 const IR::Expression *mask;
158 explicit Ternary(
const IR::KeyElement *key,
const IR::Expression *value,
159 const IR::Expression *mask);
161 [[nodiscard]]
const Ternary *
evaluate(
const Model &model,
bool doComplete)
const override;
175 DECLARE_TYPEINFO(Ternary, TableMatch);
178class LPM :
public TableMatch {
181 const IR::Expression *value;
184 const IR::Expression *prefixLength;
187 explicit LPM(
const IR::KeyElement *key,
const IR::Expression *value,
188 const IR::Expression *prefixLength);
190 [[nodiscard]]
const LPM *
evaluate(
const Model &model,
bool doComplete)
const override;
204 DECLARE_TYPEINFO(LPM, TableMatch);
207class Exact :
public TableMatch {
210 const IR::Expression *value;
213 explicit Exact(
const IR::KeyElement *key,
const IR::Expression *value);
215 [[nodiscard]]
const Exact *
evaluate(
const Model &model,
bool doComplete)
const override;
223 DECLARE_TYPEINFO(Exact, TableMatch);
226class TableRule :
public TestObject {
229 const TableMatchMap matches;
239 TableRule(TableMatchMap matches,
int priority,
ActionCall action,
int ttl);
241 [[nodiscard]]
const TableRule *
evaluate(
const Model &model,
bool doComplete)
const override;
246 [[nodiscard]]
const TableMatchMap *
getMatches()
const;
255 [[nodiscard]]
int getTTL()
const;
257 DECLARE_TYPEINFO(TableRule, TestObject);
260class TableConfig :
public TestObject {
263 const IR::P4Table *table;
266 const std::vector<TableRule> rules;
269 TestObjectMap tableProperties;
272 explicit TableConfig(
const IR::P4Table *table, std::vector<TableRule> rules);
274 explicit TableConfig(
const IR::P4Table *table, std::vector<TableRule> rules,
275 TestObjectMap tableProperties);
277 [[nodiscard]]
const IR::P4Table *getTable()
const;
281 [[nodiscard]]
const TableConfig *
evaluate(
const Model &model,
bool doComplete)
const override;
284 [[nodiscard]]
const std::vector<TableRule> *
getRules()
const;
291 [[nodiscard]]
const TestObject *
getProperty(
cstring propertyName,
bool checked)
const;
296 DECLARE_TYPEINFO(TableConfig, TestObject);
306 const Packet ingressPacket;
310 const std::optional<Packet> egressPacket;
313 const std::vector<std::reference_wrapper<const TraceEvent>> traces;
317 std::map<cstring, TestObjectMap> testObjects;
320 TestSpec(
Packet ingressPacket, std::optional<Packet> egressPacket,
321 std::vector<std::reference_wrapper<const TraceEvent>> traces);
339 const auto *testObject =
getTestObject(category, objectLabel, checked);
340 return testObject->checkedTo<T>();
350 [[nodiscard]]
const std::map<cstring, const TableConfig> *
getTables()
const;
356 [[nodiscard]]
const std::vector<std::reference_wrapper<const TraceEvent>> *
getTraces()
const;
360 static constexpr int LOW_PRIORITY = 1;
361 static constexpr int HIGH_PRIORITY = 100;
362 static constexpr int TTL = 0;
Definition ordered_map.h:32