P4C
The P4 Compiler
Loading...
Searching...
No Matches
lib/test_spec.h
1/*
2 * SPDX-FileCopyrightText: 2022 The P4 Language Consortium
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef BACKENDS_P4TOOLS_MODULES_TESTGEN_LIB_TEST_SPEC_H_
8#define BACKENDS_P4TOOLS_MODULES_TESTGEN_LIB_TEST_SPEC_H_
9
10#include <functional>
11#include <map>
12#include <optional>
13#include <vector>
14
15#include "backends/p4tools/common/lib/model.h"
16#include "backends/p4tools/common/lib/trace_event.h"
17#include "ir/ir.h"
18#include "lib/cstring.h"
19#include "lib/ordered_map.h"
20
21#include "backends/p4tools/modules/testgen/lib/test_object.h"
22
23namespace P4::P4Tools::P4Testgen {
24
29
30/* =========================================================================================
31 * Packet
32 * ========================================================================================= */
33
34class Packet : public TestObject {
35 private:
37 int port;
38
40 const IR::Expression *payload;
41
43 const IR::Expression *payloadIgnoreMask;
44
45 public:
46 Packet(int port, const IR::Expression *payload, const IR::Expression *payloadIgnoreMask);
47
48 [[nodiscard]] const Packet *evaluate(const Model &model, bool doComplete) const override;
49
50 [[nodiscard]] cstring getObjectName() const override;
51
53 [[nodiscard]] int getPort() const;
54
57 [[nodiscard]] const IR::Constant *getEvaluatedPayload() const;
58
63 [[nodiscard]] const IR::Constant *getEvaluatedPayloadMask() const;
64
65 DECLARE_TYPEINFO(Packet, TestObject);
66};
67
68/* =========================================================================================
69 * Table Test Objects
70 * ========================================================================================= */
71
72class ActionArg : public TestObject {
73 private:
75 const IR::Parameter *param;
76
78 const IR::Expression *value;
79
80 public:
81 ActionArg(const IR::Parameter *param, const IR::Expression *value);
82
83 [[nodiscard]] const ActionArg *evaluate(const Model &model, bool doComplete) const override;
84
85 [[nodiscard]] cstring getObjectName() const override;
86
87 [[nodiscard]] const IR::Parameter *getActionParam() const;
88
90 [[nodiscard]] cstring getActionParamName() const;
91
95 [[nodiscard]] const IR::Constant *getEvaluatedValue() const;
96
97 DECLARE_TYPEINFO(ActionArg, TestObject);
98};
99
100class ActionCall : public TestObject {
101 private:
103 cstring identifier;
104
106 const IR::P4Action *action;
107
109 const std::vector<ActionArg> args;
110
111 public:
112 ActionCall(cstring identifier, const IR::P4Action *action, std::vector<ActionArg> args);
113
114 ActionCall(const IR::P4Action *action, std::vector<ActionArg> args);
115
116 [[nodiscard]] const ActionCall *evaluate(const Model &model, bool doComplete) const override;
117
118 [[nodiscard]] cstring getObjectName() const override;
119
122 [[nodiscard]] cstring getActionName() const;
123
125 [[nodiscard]] const IR::P4Action *getAction() const;
126
128 [[nodiscard]] const std::vector<ActionArg> *getArgs() const;
129
130 DECLARE_TYPEINFO(ActionCall, TestObject);
131};
132
133class TableMatch : public TestObject {
134 private:
136 const IR::KeyElement *key;
137
138 public:
139 explicit TableMatch(const IR::KeyElement *key);
140
142 [[nodiscard]] const IR::KeyElement *getKey() const;
143
144 DECLARE_TYPEINFO(TableMatch, TestObject);
145};
146
147using TableMatchMap = ordered_map<cstring, const TableMatch *>;
148
149class Ternary : public TableMatch {
150 private:
152 const IR::Expression *value;
153
155 const IR::Expression *mask;
156
157 public:
158 explicit Ternary(const IR::KeyElement *key, const IR::Expression *value,
159 const IR::Expression *mask);
160
161 [[nodiscard]] const Ternary *evaluate(const Model &model, bool doComplete) const override;
162
163 [[nodiscard]] cstring getObjectName() const override;
164
168 [[nodiscard]] const IR::Constant *getEvaluatedValue() const;
169
173 [[nodiscard]] const IR::Constant *getEvaluatedMask() const;
174
175 DECLARE_TYPEINFO(Ternary, TableMatch);
176};
177
178class LPM : public TableMatch {
179 private:
181 const IR::Expression *value;
182
184 const IR::Expression *prefixLength;
185
186 public:
187 explicit LPM(const IR::KeyElement *key, const IR::Expression *value,
188 const IR::Expression *prefixLength);
189
190 [[nodiscard]] const LPM *evaluate(const Model &model, bool doComplete) const override;
191
192 [[nodiscard]] cstring getObjectName() const override;
193
197 [[nodiscard]] const IR::Constant *getEvaluatedValue() const;
198
202 [[nodiscard]] const IR::Constant *getEvaluatedPrefixLength() const;
203
204 DECLARE_TYPEINFO(LPM, TableMatch);
205};
206
207class Exact : public TableMatch {
208 private:
210 const IR::Expression *value;
211
212 public:
213 explicit Exact(const IR::KeyElement *key, const IR::Expression *value);
214
215 [[nodiscard]] const Exact *evaluate(const Model &model, bool doComplete) const override;
216
217 [[nodiscard]] cstring getObjectName() const override;
218
221 [[nodiscard]] const IR::Constant *getEvaluatedValue() const;
222
223 DECLARE_TYPEINFO(Exact, TableMatch);
224};
225
226class TableRule : public TestObject {
227 private:
229 const TableMatchMap matches;
230
232 int priority;
234 const ActionCall action;
236 int ttl;
237
238 public:
239 TableRule(TableMatchMap matches, int priority, ActionCall action, int ttl);
240
241 [[nodiscard]] const TableRule *evaluate(const Model &model, bool doComplete) const override;
242
243 [[nodiscard]] cstring getObjectName() const override;
244
246 [[nodiscard]] const TableMatchMap *getMatches() const;
247
249 [[nodiscard]] int getPriority() const;
250
252 [[nodiscard]] const ActionCall *getActionCall() const;
253
255 [[nodiscard]] int getTTL() const;
256
257 DECLARE_TYPEINFO(TableRule, TestObject);
258};
259
260class TableConfig : public TestObject {
261 private:
263 const IR::P4Table *table;
264
266 const std::vector<TableRule> rules;
267
269 TestObjectMap tableProperties;
270
271 public:
272 explicit TableConfig(const IR::P4Table *table, std::vector<TableRule> rules);
273
274 explicit TableConfig(const IR::P4Table *table, std::vector<TableRule> rules,
275 TestObjectMap tableProperties);
276
277 [[nodiscard]] const IR::P4Table *getTable() const;
278
279 [[nodiscard]] cstring getObjectName() const override;
280
281 [[nodiscard]] const TableConfig *evaluate(const Model &model, bool doComplete) const override;
282
284 [[nodiscard]] const std::vector<TableRule> *getRules() const;
285
287 [[nodiscard]] const TestObjectMap *getProperties() const;
288
291 [[nodiscard]] const TestObject *getProperty(cstring propertyName, bool checked) const;
292
294 void addTableProperty(cstring propertyName, const TestObject *property);
295
296 DECLARE_TYPEINFO(TableConfig, TestObject);
297};
298
299/* =========================================================================================
300 * Test Specification
301 * ========================================================================================= */
302
303class TestSpec {
304 private:
306 const Packet ingressPacket;
307
310 const std::optional<Packet> egressPacket;
311
313 const std::vector<std::reference_wrapper<const TraceEvent>> traces;
314
317 std::map<cstring, TestObjectMap> testObjects;
318
319 public:
320 TestSpec(Packet ingressPacket, std::optional<Packet> egressPacket,
321 std::vector<std::reference_wrapper<const TraceEvent>> traces);
322
326 void addTestObject(cstring category, cstring objectLabel, const TestObject *object);
327
330 [[nodiscard]] const TestObject *getTestObject(cstring category, cstring objectLabel,
331 bool checked) const;
332
337 template <class T>
338 [[nodiscard]] auto *getTestObject(cstring category, cstring objectLabel, bool checked) const {
339 const auto *testObject = getTestObject(category, objectLabel, checked);
340 return testObject->checkedTo<T>();
341 }
342
344 [[nodiscard]] TestObjectMap getTestObjectCategory(cstring category) const;
345
347 [[nodiscard]] const Packet *getIngressPacket() const;
348
350 [[nodiscard]] const std::map<cstring, const TableConfig> *getTables() const;
351
353 [[nodiscard]] std::optional<const Packet *> getEgressPacket() const;
354
356 [[nodiscard]] const std::vector<std::reference_wrapper<const TraceEvent>> *getTraces() const;
357
359 static constexpr int NO_PRIORITY = -1;
360 static constexpr int LOW_PRIORITY = 1;
361 static constexpr int HIGH_PRIORITY = 100;
362 static constexpr int TTL = 0;
363};
364
365} // namespace P4::P4Tools::P4Testgen
366
367#endif /* BACKENDS_P4TOOLS_MODULES_TESTGEN_LIB_TEST_SPEC_H_ */
Definition backends/p4tools/common/lib/model.h:24
cstring getObjectName() const override
Definition lib/test_spec.cpp:83
const IR::Constant * getEvaluatedValue() const
Definition lib/test_spec.cpp:71
cstring getActionParamName() const
Definition lib/test_spec.cpp:69
const ActionArg * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:85
Definition lib/test_spec.h:100
cstring getActionName() const
Definition lib/test_spec.cpp:96
cstring getObjectName() const override
Definition lib/test_spec.cpp:109
const ActionCall * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:100
const IR::P4Action * getAction() const
Definition lib/test_spec.cpp:98
const std::vector< ActionArg > * getArgs() const
Definition lib/test_spec.cpp:111
cstring getObjectName() const override
Definition lib/test_spec.cpp:191
const Exact * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:186
const IR::Constant * getEvaluatedValue() const
Definition lib/test_spec.cpp:177
const IR::Constant * getEvaluatedPrefixLength() const
Definition lib/test_spec.cpp:158
const LPM * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:167
const IR::Constant * getEvaluatedValue() const
Definition lib/test_spec.cpp:149
cstring getObjectName() const override
Definition lib/test_spec.cpp:173
Definition lib/test_spec.h:34
int getPort() const
Definition lib/test_spec.cpp:34
const Packet * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:54
cstring getObjectName() const override
Definition lib/test_spec.cpp:32
const IR::Constant * getEvaluatedPayloadMask() const
Definition lib/test_spec.cpp:36
const IR::Constant * getEvaluatedPayload() const
Definition lib/test_spec.cpp:45
const std::vector< TableRule > * getRules() const
Definition lib/test_spec.cpp:230
const TableConfig * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:249
const TestObject * getProperty(cstring propertyName, bool checked) const
Definition lib/test_spec.cpp:234
cstring getObjectName() const override
Definition lib/test_spec.cpp:221
void addTableProperty(cstring propertyName, const TestObject *property)
Add a table property to the table.
Definition lib/test_spec.cpp:245
const TestObjectMap * getProperties() const
Definition lib/test_spec.cpp:232
const IR::KeyElement * getKey() const
Definition lib/test_spec.cpp:115
const TableRule * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:206
int getTTL() const
Definition lib/test_spec.cpp:202
cstring getObjectName() const override
Definition lib/test_spec.cpp:204
int getPriority() const
Definition lib/test_spec.cpp:198
const ActionCall * getActionCall() const
Definition lib/test_spec.cpp:200
const TableMatchMap * getMatches() const
Definition lib/test_spec.cpp:196
const IR::Constant * getEvaluatedValue() const
Definition lib/test_spec.cpp:120
const Ternary * evaluate(const Model &model, bool doComplete) const override
Definition lib/test_spec.cpp:138
const IR::Constant * getEvaluatedMask() const
Definition lib/test_spec.cpp:129
cstring getObjectName() const override
Definition lib/test_spec.cpp:144
Definition test_object.h:21
std::optional< const Packet * > getEgressPacket() const
Definition lib/test_spec.cpp:276
const std::vector< std::reference_wrapper< const TraceEvent > > * getTraces() const
Definition lib/test_spec.cpp:285
const std::map< cstring, const TableConfig > * getTables() const
const Packet * getIngressPacket() const
Definition lib/test_spec.cpp:283
auto * getTestObject(cstring category, cstring objectLabel, bool checked) const
Definition lib/test_spec.h:338
void addTestObject(cstring category, cstring objectLabel, const TestObject *object)
Definition lib/test_spec.cpp:289
TestObjectMap getTestObjectCategory(cstring category) const
Definition lib/test_spec.cpp:307
static constexpr int NO_PRIORITY
Priority definitions for LPM and ternary entries.
Definition lib/test_spec.h:359
const TestObject * getTestObject(cstring category, cstring objectLabel, bool checked) const
Definition lib/test_spec.cpp:293
Definition cstring.h:85
Definition ordered_map.h:32