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"
13#include "lib/ordered_map.h"
15#include "backends/p4tools/modules/testgen/lib/test_object.h"
17namespace P4::P4Tools::P4Testgen {
28class Packet :
public TestObject {
34 const IR::Expression *payload;
37 const IR::Expression *payloadIgnoreMask;
40 Packet(
int port,
const IR::Expression *payload,
const IR::Expression *payloadIgnoreMask);
42 [[nodiscard]]
const Packet *
evaluate(
const Model &model,
bool doComplete)
const override;
47 [[nodiscard]]
int getPort()
const;
59 DECLARE_TYPEINFO(Packet, TestObject);
66class ActionArg :
public TestObject {
69 const IR::Parameter *param;
72 const IR::Expression *value;
75 ActionArg(
const IR::Parameter *param,
const IR::Expression *value);
77 [[nodiscard]]
const ActionArg *
evaluate(
const Model &model,
bool doComplete)
const override;
81 [[nodiscard]]
const IR::Parameter *getActionParam()
const;
91 DECLARE_TYPEINFO(ActionArg, TestObject);
94class ActionCall :
public TestObject {
100 const IR::P4Action *action;
103 const std::vector<ActionArg> args;
106 ActionCall(
cstring identifier,
const IR::P4Action *action, std::vector<ActionArg> args);
108 ActionCall(
const IR::P4Action *action, std::vector<ActionArg> args);
110 [[nodiscard]]
const ActionCall *
evaluate(
const Model &model,
bool doComplete)
const override;
119 [[nodiscard]]
const IR::P4Action *
getAction()
const;
122 [[nodiscard]]
const std::vector<ActionArg> *
getArgs()
const;
124 DECLARE_TYPEINFO(ActionCall, TestObject);
127class TableMatch :
public TestObject {
130 const IR::KeyElement *key;
133 explicit TableMatch(
const IR::KeyElement *key);
136 [[nodiscard]]
const IR::KeyElement *
getKey()
const;
138 DECLARE_TYPEINFO(TableMatch, TestObject);
143class Ternary :
public TableMatch {
146 const IR::Expression *value;
149 const IR::Expression *mask;
152 explicit Ternary(
const IR::KeyElement *key,
const IR::Expression *value,
153 const IR::Expression *mask);
155 [[nodiscard]]
const Ternary *
evaluate(
const Model &model,
bool doComplete)
const override;
169 DECLARE_TYPEINFO(Ternary, TableMatch);
172class LPM :
public TableMatch {
175 const IR::Expression *value;
178 const IR::Expression *prefixLength;
181 explicit LPM(
const IR::KeyElement *key,
const IR::Expression *value,
182 const IR::Expression *prefixLength);
184 [[nodiscard]]
const LPM *
evaluate(
const Model &model,
bool doComplete)
const override;
198 DECLARE_TYPEINFO(LPM, TableMatch);
201class Exact :
public TableMatch {
204 const IR::Expression *value;
207 explicit Exact(
const IR::KeyElement *key,
const IR::Expression *value);
209 [[nodiscard]]
const Exact *
evaluate(
const Model &model,
bool doComplete)
const override;
217 DECLARE_TYPEINFO(Exact, TableMatch);
220class TableRule :
public TestObject {
223 const TableMatchMap matches;
233 TableRule(TableMatchMap matches,
int priority,
ActionCall action,
int ttl);
235 [[nodiscard]]
const TableRule *
evaluate(
const Model &model,
bool doComplete)
const override;
240 [[nodiscard]]
const TableMatchMap *
getMatches()
const;
249 [[nodiscard]]
int getTTL()
const;
251 DECLARE_TYPEINFO(TableRule, TestObject);
254class TableConfig :
public TestObject {
257 const IR::P4Table *table;
260 const std::vector<TableRule> rules;
263 TestObjectMap tableProperties;
266 explicit TableConfig(
const IR::P4Table *table, std::vector<TableRule> rules);
268 explicit TableConfig(
const IR::P4Table *table, std::vector<TableRule> rules,
269 TestObjectMap tableProperties);
271 [[nodiscard]]
const IR::P4Table *getTable()
const;
275 [[nodiscard]]
const TableConfig *
evaluate(
const Model &model,
bool doComplete)
const override;
278 [[nodiscard]]
const std::vector<TableRule> *
getRules()
const;
285 [[nodiscard]]
const TestObject *
getProperty(
cstring propertyName,
bool checked)
const;
290 DECLARE_TYPEINFO(TableConfig, TestObject);
300 const Packet ingressPacket;
304 const std::optional<Packet> egressPacket;
307 const std::vector<std::reference_wrapper<const TraceEvent>> traces;
311 std::map<cstring, TestObjectMap> testObjects;
314 TestSpec(
Packet ingressPacket, std::optional<Packet> egressPacket,
315 std::vector<std::reference_wrapper<const TraceEvent>> traces);
333 const auto *testObject =
getTestObject(category, objectLabel, checked);
334 return testObject->checkedTo<T>();
344 [[nodiscard]]
const std::map<cstring, const TableConfig> *
getTables()
const;
350 [[nodiscard]]
const std::vector<std::reference_wrapper<const TraceEvent>> *
getTraces()
const;
354 static constexpr int LOW_PRIORITY = 1;
355 static constexpr int HIGH_PRIORITY = 100;
356 static constexpr int TTL = 0;
Definition ordered_map.h:32