43 SECTION(
"Without rules.")
45 REQUIRE_NOTHROW(
Chain(
"test_chain"));
47 SECTION(
"With rules.")
49 std::vector<std::unique_ptr<Rule>> rules;
50 rules.push_back(std::make_unique<Accept>(
If().type(
"PING")));
51 rules.push_back(std::make_unique<Reject>());
52 REQUIRE_NOTHROW(
Chain(
"test_chain", std::move(rules)));
54 SECTION(
"Ensures the chain name does not contain whitespace.")
57 REQUIRE_THROWS_AS(
Chain(
"test chain"), std::invalid_argument);
59 Chain(
"test chain"),
"Chain names cannot contain whitespace.");
61 REQUIRE_THROWS_AS(
Chain(
"test\tchain"), std::invalid_argument);
63 Chain(
"test\tchain"),
"Chain names cannot contain whitespace.");
65 REQUIRE_THROWS_AS(
Chain(
"test\nchain"), std::invalid_argument);
67 Chain(
"test\nchain"),
"Chain names cannot contain whitespace.");
74 SECTION(
"When there are no rules.")
76 REQUIRE(
Chain(
"test_chain") ==
Chain(
"test_chain"));
77 REQUIRE_FALSE(
Chain(
"test_chain") !=
Chain(
"test_chain"));
78 REQUIRE_FALSE(
Chain(
"test_chain1") ==
Chain(
"test_chain2"));
79 REQUIRE(
Chain(
"test_chain1") !=
Chain(
"test_chain2"));
81 SECTION(
"When the number of rules are not the same.")
83 std::vector<std::unique_ptr<Rule>> rules1;
84 rules1.push_back(std::make_unique<Accept>(
If().to(
"192.168")));
85 rules1.push_back(std::make_unique<Reject>());
86 Chain chain1(
"test_chain", std::move(rules1));
87 std::vector<std::unique_ptr<Rule>> rules2;
88 rules2.push_back(std::make_unique<Accept>(
If().to(
"192.168")));
89 Chain chain2(
"test_chain", std::move(rules2));
90 REQUIRE_FALSE(chain1 == chain2);
91 REQUIRE(chain1 != chain2);
93 SECTION(
"When the rules are the same.")
95 std::vector<std::unique_ptr<Rule>> rules1;
96 rules1.push_back(std::make_unique<Accept>(
If().to(
"192.168")));
97 rules1.push_back(std::make_unique<Reject>());
98 Chain chain1(
"test_chain", std::move(rules1));
99 std::vector<std::unique_ptr<Rule>> rules2;
100 rules2.push_back(std::make_unique<Accept>(
If().to(
"192.168")));
101 rules2.push_back(std::make_unique<Reject>());
102 Chain chain2(
"test_chain", std::move(rules2));
103 REQUIRE(chain1 == chain2);
104 REQUIRE_FALSE(chain1 != chain2);
106 SECTION(
"When the rules are not the same.")
108 std::vector<std::unique_ptr<Rule>> rules1;
109 rules1.push_back(std::make_unique<Accept>(
If().to(
"192.168")));
110 rules1.push_back(std::make_unique<Reject>());
111 Chain chain1(
"test_chain", std::move(rules1));
112 std::vector<std::unique_ptr<Rule>> rules2;
113 rules2.push_back(std::make_unique<Accept>(
If().from(
"172.16")));
114 rules2.push_back(std::make_unique<Reject>());
115 Chain chain2(
"test_chain", std::move(rules2));
116 REQUIRE_FALSE(chain1 == chain2);
117 REQUIRE(chain1 != chain2);
122 TEST_CASE(
"Chain's 'append' method appends a new rule to the filter chain.",
125 std::vector<std::unique_ptr<Rule>> rules;
126 rules.push_back(std::make_unique<Accept>(
If().to(
"192.168")));
127 rules.push_back(std::make_unique<Reject>());
128 Chain chain1(
"test_chain", std::move(rules));
129 Chain chain2(
"test_chain");
130 chain2.
append(std::make_unique<Accept>(
If().to(
"192.168")));
131 chain2.
append(std::make_unique<Reject>());
132 REQUIRE(chain1 == chain2);
136 TEST_CASE(
"Chain's 'name' method returns the name of the chain.",
"[Chain]")
138 REQUIRE(
Chain(
"crazy_chain_name").
name() ==
"crazy_chain_name");
144 Chain original(
"test_chain");
145 original.
append(std::make_unique<Accept>(
If().to(
"192.168")));
146 original.
append(std::make_unique<Reject>());
147 Chain for_comparison(
"test_chain");
148 for_comparison.
append(std::make_unique<Accept>(
If().to(
"192.168")));
149 for_comparison.
append(std::make_unique<Reject>());
150 Chain copy(original);
151 REQUIRE(copy == for_comparison);
157 Chain original(
"test_chain");
158 original.
append(std::make_unique<Accept>(
If().to(
"192.168")));
159 original.
append(std::make_unique<Reject>());
160 Chain for_comparison(
"test_chain");
161 for_comparison.
append(std::make_unique<Accept>(
If().to(
"192.168")));
162 for_comparison.
append(std::make_unique<Reject>());
163 Chain moved(std::move(original));
164 REQUIRE(moved == for_comparison);
171 chain_a.append(std::make_unique<Accept>(
If().to(
"192.168")));
172 chain_a.append(std::make_unique<Reject>());
186 TEST_CASE(
"Chain's are assignable (by move semantics).",
"[Chain]")
189 chain_a.append(std::make_unique<Accept>(
If().to(
"192.168")));
190 chain_a.append(std::make_unique<Reject>());
204 TEST_CASE(
"Chain's 'action' method determines what to do with a packet with " 205 " respect to a destination address.",
"[Rule]")
210 SECTION(
"When the chain is well formed.")
212 auto chain = std::make_shared<Chain>(
"main_chain");
213 auto subchain = std::make_shared<Chain>(
"sub_chain");
214 chain->append(std::make_unique<Accept>(
If().to(
"192.168")));
215 chain->append(std::make_unique<Accept>(
If().type(
"HEARTBEAT")));
216 chain->append(std::make_unique<Call>(subchain,
If().to(
"172.0/8")));
217 chain->append(std::make_unique<Reject>(
If().to(
"10.10")));
218 subchain->append(std::make_unique<Accept>(
If().type(
"SET_MODE")));
219 subchain->append(std::make_unique<Accept>(
If().to(
"172.16")));
230 chain->action(set_mode,
MAVAddress(
"172.0")) ==
242 SECTION(
"And throws an error when chain recursion is detected.")
244 auto chain = std::make_shared<Chain>(
"main_chain");
245 auto subchain = std::make_shared<Chain>(
"sub_chain");
246 chain->append(std::make_unique<Call>(subchain));
247 subchain->append(std::make_unique<Call>(chain));
251 chain->action(
ping,
MAVAddress(
"192.168")),
"Recursion detected.");
258 auto chain = std::make_shared<Chain>(
"default");
259 auto ap_in = std::make_shared<Chain>(
"ap-in");
260 auto ap_out = std::make_shared<Chain>(
"ap-out");
262 std::make_unique<Reject>(
If().type(
"HEARTBEAT").from(
"10.10")));
264 std::make_unique<Accept>(-3,
If().type(
"GPS_STATUS").to(
"172.0/8")));
266 std::make_unique<Accept>(
267 If().type(
"GLOBAL_POSITION_INT").to(
"172.0/8")));
269 std::make_unique<GoTo>(ap_in, 3,
If().from(
"192.168")));
270 chain->append(std::make_unique<Call>(ap_out,
If().to(
"192.168")));
271 chain->append(std::make_unique<Reject>());
275 " reject if HEARTBEAT from 10.10;\n" 276 " accept with priority -3 if GPS_STATUS to 172.0/8;\n" 277 " accept if GLOBAL_POSITION_INT to 172.0/8;\n" 278 " goto ap-in with priority 3 if from 192.168;\n" 279 " call ap-out if to 192.168;\n" 286 TEST_CASE(
"Run dynamic destructors (Chain).",
"[Chain]")
288 Chain *chain =
nullptr;
289 REQUIRE_NOTHROW(chain =
new Chain(
"chain"));
290 REQUIRE_NOTHROW(
delete chain);
static Action make_reject()
std::string str(const T &object)
Chain chain_a_compare("test_chain_a")
std::string name(unsigned long id)
static Action make_accept(std::optional< int > priority={})
TEST_CASE("Chain's are constructable.", "[Chain]")
static Action make_continue()
Chain chain_b_compare("test_chain_b")
void append(std::unique_ptr< Rule > rule)
Chain chain_b("test_chain_b")