P4C
The P4 Compiler
Loading...
Searching...
No Matches
lib/test_spec.h
1#ifndef BACKENDS_P4TOOLS_MODULES_TESTGEN_LIB_TEST_SPEC_H_
2#define BACKENDS_P4TOOLS_MODULES_TESTGEN_LIB_TEST_SPEC_H_
3
4#include <functional>
5#include <map>
6#include <optional>
7#include <vector>
8
9#include "backends/p4tools/common/lib/model.h"
10#include "backends/p4tools/common/lib/trace_event.h"
11#include "ir/ir.h"
12#include "lib/cstring.h"
13#include "lib/ordered_map.h"
14
15#include "backends/p4tools/modules/testgen/lib/test_object.h"
16
17namespace P4::P4Tools::P4Testgen {
18
23
24/* =========================================================================================
25 * Packet
26 * ========================================================================================= */
27
28class Packet : public TestObject {
29 private:
31 int port;
32
34 const IR::Expression *payload;
35
37 const IR::Expression *payloadIgnoreMask;
38
39 public:
40 Packet(int port, const IR::Expression *payload, const IR::Expression *payloadIgnoreMask);
41
42 [[nodiscard]] const Packet *evaluate(const Model &model, bool doComplete) const override;
43
44 [[nodiscard]] cstring getObjectName() const override;
45
47 [[nodiscard]] int getPort() const;
48
51 [[nodiscard]] const IR::Constant *getEvaluatedPayload() const;
52
57 [[nodiscard]] const IR::Constant *getEvaluatedPayloadMask() const;
58
59 DECLARE_TYPEINFO(Packet, TestObject);
60};
61
62/* =========================================================================================
63 * Table Test Objects
64 * ========================================================================================= */
65
66class ActionArg : public TestObject {
67 private:
69 const IR::Parameter *param;
70
72 const IR::Expression *value;
73
74 public:
75 ActionArg(const IR::Parameter *param, const IR::Expression *value);
76
77 [[nodiscard]] const ActionArg *evaluate(const Model &model, bool doComplete) const override;
78
79 [[nodiscard]] cstring getObjectName() const override;
80
81 [[nodiscard]] const IR::Parameter *getActionParam() const;
82
84 [[nodiscard]] cstring getActionParamName() const;
85
89 [[nodiscard]] const IR::Constant *getEvaluatedValue() const;
90
91 DECLARE_TYPEINFO(ActionArg, TestObject);
92};
93
94class ActionCall : public TestObject {
95 private:
97 cstring identifier;
98
100 const IR::P4Action *action;
101
103 const std::vector<ActionArg> args;
104
105 public:
106 ActionCall(cstring identifier, const IR::P4Action *action, std::vector<ActionArg> args);
107
108 ActionCall(const IR::P4Action *action, std::vector<ActionArg> args);
109
110 [[nodiscard]] const ActionCall *evaluate(const Model &model, bool doComplete) const override;
111
112 [[nodiscard]] cstring getObjectName() const override;
113
116 [[nodiscard]] cstring getActionName() const;
117
119 [[nodiscard]] const IR::P4Action *getAction() const;
120
122 [[nodiscard]] const std::vector<ActionArg> *getArgs() const;
123
124 DECLARE_TYPEINFO(ActionCall, TestObject);
125};
126
127class TableMatch : public TestObject {
128 private:
130 const IR::KeyElement *key;
131
132 public:
133 explicit TableMatch(const IR::KeyElement *key);
134
136 [[nodiscard]] const IR::KeyElement *getKey() const;
137
138 DECLARE_TYPEINFO(TableMatch, TestObject);
139};
140
141using TableMatchMap = ordered_map<cstring, const TableMatch *>;
142
143class Ternary : public TableMatch {
144 private:
146 const IR::Expression *value;
147
149 const IR::Expression *mask;
150
151 public:
152 explicit Ternary(const IR::KeyElement *key, const IR::Expression *value,
153 const IR::Expression *mask);
154
155 [[nodiscard]] const Ternary *evaluate(const Model &model, bool doComplete) const override;
156
157 [[nodiscard]] cstring getObjectName() const override;
158
162 [[nodiscard]] const IR::Constant *getEvaluatedValue() const;
163
167 [[nodiscard]] const IR::Constant *getEvaluatedMask() const;
168
169 DECLARE_TYPEINFO(Ternary, TableMatch);
170};
171
172class LPM : public TableMatch {
173 private:
175 const IR::Expression *value;
176
178 const IR::Expression *prefixLength;
179
180 public:
181 explicit LPM(const IR::KeyElement *key, const IR::Expression *value,
182 const IR::Expression *prefixLength);
183
184 [[nodiscard]] const LPM *evaluate(const Model &model, bool doComplete) const override;
185
186 [[nodiscard]] cstring getObjectName() const override;
187
191 [[nodiscard]] const IR::Constant *getEvaluatedValue() const;
192
196 [[nodiscard]] const IR::Constant *getEvaluatedPrefixLength() const;
197
198 DECLARE_TYPEINFO(LPM, TableMatch);
199};
200
201class Exact : public TableMatch {
202 private:
204 const IR::Expression *value;
205
206 public:
207 explicit Exact(const IR::KeyElement *key, const IR::Expression *value);
208
209 [[nodiscard]] const Exact *evaluate(const Model &model, bool doComplete) const override;
210
211 [[nodiscard]] cstring getObjectName() const override;
212
215 [[nodiscard]] const IR::Constant *getEvaluatedValue() const;
216
217 DECLARE_TYPEINFO(Exact, TableMatch);
218};
219
220class TableRule : public TestObject {
221 private:
223 const TableMatchMap matches;
224
226 int priority;
228 const ActionCall action;
230 int ttl;
231
232 public:
233 TableRule(TableMatchMap matches, int priority, ActionCall action, int ttl);
234
235 [[nodiscard]] const TableRule *evaluate(const Model &model, bool doComplete) const override;
236
237 [[nodiscard]] cstring getObjectName() const override;
238
240 [[nodiscard]] const TableMatchMap *getMatches() const;
241
243 [[nodiscard]] int getPriority() const;
244
246 [[nodiscard]] const ActionCall *getActionCall() const;
247
249 [[nodiscard]] int getTTL() const;
250
251 DECLARE_TYPEINFO(TableRule, TestObject);
252};
253
254class TableConfig : public TestObject {
255 private:
257 const IR::P4Table *table;
258
260 const std::vector<TableRule> rules;
261
263 TestObjectMap tableProperties;
264
265 public:
266 explicit TableConfig(const IR::P4Table *table, std::vector<TableRule> rules);
267
268 explicit TableConfig(const IR::P4Table *table, std::vector<TableRule> rules,
269 TestObjectMap tableProperties);
270
271 [[nodiscard]] const IR::P4Table *getTable() const;
272
273 [[nodiscard]] cstring getObjectName() const override;
274
275 [[nodiscard]] const TableConfig *evaluate(const Model &model, bool doComplete) const override;
276
278 [[nodiscard]] const std::vector<TableRule> *getRules() const;
279
281 [[nodiscard]] const TestObjectMap *getProperties() const;
282
285 [[nodiscard]] const TestObject *getProperty(cstring propertyName, bool checked) const;
286
288 void addTableProperty(cstring propertyName, const TestObject *property);
289
290 DECLARE_TYPEINFO(TableConfig, TestObject);
291};
292
293/* =========================================================================================
294 * Test Specification
295 * ========================================================================================= */
296
297class TestSpec {
298 private:
300 const Packet ingressPacket;
301
304 const std::optional<Packet> egressPacket;
305
307 const std::vector<std::reference_wrapper<const TraceEvent>> traces;
308
311 std::map<cstring, TestObjectMap> testObjects;
312
313 public:
314 TestSpec(Packet ingressPacket, std::optional<Packet> egressPacket,
315 std::vector<std::reference_wrapper<const TraceEvent>> traces);
316
320 void addTestObject(cstring category, cstring objectLabel, const TestObject *object);
321
324 [[nodiscard]] const TestObject *getTestObject(cstring category, cstring objectLabel,
325 bool checked) const;
326
331 template <class T>
332 [[nodiscard]] auto *getTestObject(cstring category, cstring objectLabel, bool checked) const {
333 const auto *testObject = getTestObject(category, objectLabel, checked);
334 return testObject->checkedTo<T>();
335 }
336
338 [[nodiscard]] TestObjectMap getTestObjectCategory(cstring category) const;
339
341 [[nodiscard]] const Packet *getIngressPacket() const;
342
344 [[nodiscard]] const std::map<cstring, const TableConfig> *getTables() const;
345
347 [[nodiscard]] std::optional<const Packet *> getEgressPacket() const;
348
350 [[nodiscard]] const std::vector<std::reference_wrapper<const TraceEvent>> *getTraces() const;
351
353 static constexpr int NO_PRIORITY = -1;
354 static constexpr int LOW_PRIORITY = 1;
355 static constexpr int HIGH_PRIORITY = 100;
356 static constexpr int TTL = 0;
357};
358
359} // namespace P4::P4Tools::P4Testgen
360
361#endif /* BACKENDS_P4TOOLS_MODULES_TESTGEN_LIB_TEST_SPEC_H_ */
Definition backends/p4tools/common/lib/model.h:18
cstring getObjectName() const override
Definition lib/test_spec.cpp:79
const IR::Constant * getEvaluatedValue() const
Definition lib/test_spec.cpp:67
cstring getActionParamName() const
Definition lib/test_spec.cpp:65
const ActionArg * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:81
Definition lib/test_spec.h:94
cstring getActionName() const
Definition lib/test_spec.cpp:92
cstring getObjectName() const override
Definition lib/test_spec.cpp:105
const ActionCall * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:96
const IR::P4Action * getAction() const
Definition lib/test_spec.cpp:94
const std::vector< ActionArg > * getArgs() const
Definition lib/test_spec.cpp:107
cstring getObjectName() const override
Definition lib/test_spec.cpp:187
const Exact * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:182
const IR::Constant * getEvaluatedValue() const
Definition lib/test_spec.cpp:173
const IR::Constant * getEvaluatedPrefixLength() const
Definition lib/test_spec.cpp:154
const LPM * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:163
const IR::Constant * getEvaluatedValue() const
Definition lib/test_spec.cpp:145
cstring getObjectName() const override
Definition lib/test_spec.cpp:169
Definition lib/test_spec.h:28
int getPort() const
Definition lib/test_spec.cpp:30
const Packet * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:50
cstring getObjectName() const override
Definition lib/test_spec.cpp:28
const IR::Constant * getEvaluatedPayloadMask() const
Definition lib/test_spec.cpp:32
const IR::Constant * getEvaluatedPayload() const
Definition lib/test_spec.cpp:41
const std::vector< TableRule > * getRules() const
Definition lib/test_spec.cpp:226
const TableConfig * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:245
const TestObject * getProperty(cstring propertyName, bool checked) const
Definition lib/test_spec.cpp:230
cstring getObjectName() const override
Definition lib/test_spec.cpp:217
void addTableProperty(cstring propertyName, const TestObject *property)
Add a table property to the table.
Definition lib/test_spec.cpp:241
const TestObjectMap * getProperties() const
Definition lib/test_spec.cpp:228
const IR::KeyElement * getKey() const
Definition lib/test_spec.cpp:111
const TableRule * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:202
int getTTL() const
Definition lib/test_spec.cpp:198
cstring getObjectName() const override
Definition lib/test_spec.cpp:200
int getPriority() const
Definition lib/test_spec.cpp:194
const ActionCall * getActionCall() const
Definition lib/test_spec.cpp:196
const TableMatchMap * getMatches() const
Definition lib/test_spec.cpp:192
const IR::Constant * getEvaluatedValue() const
Definition lib/test_spec.cpp:116
const Ternary * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:134
const IR::Constant * getEvaluatedMask() const
Definition lib/test_spec.cpp:125
cstring getObjectName() const override
Definition lib/test_spec.cpp:140
Definition test_object.h:15
std::optional< const Packet * > getEgressPacket() const
Definition lib/test_spec.cpp:272
const std::vector< std::reference_wrapper< const TraceEvent > > * getTraces() const
Definition lib/test_spec.cpp:281
const std::map< cstring, const TableConfig > * getTables() const
const Packet * getIngressPacket() const
Definition lib/test_spec.cpp:279
auto * getTestObject(cstring category, cstring objectLabel, bool checked) const
Definition lib/test_spec.h:332
void addTestObject(cstring category, cstring objectLabel, const TestObject *object)
Definition lib/test_spec.cpp:285
TestObjectMap getTestObjectCategory(cstring category) const
Definition lib/test_spec.cpp:303
static constexpr int NO_PRIORITY
Priority definitions for LPM and ternary entries.
Definition lib/test_spec.h:353
const TestObject * getTestObject(cstring category, cstring objectLabel, bool checked) const
Definition lib/test_spec.cpp:289
Definition cstring.h:85
Definition ordered_map.h:32