mavtables  0.2.1
MAVLink router and firewall.
test_QueuedPacket.cpp
Go to the documentation of this file.
1 // MAVLink router and firewall.
2 // Copyright (C) 2018 Michael R. Shannon <mrshannon.aerospace@gmail.com>
3 //
4 // This program is free software; you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation; either version 2 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
16 
17 
18 #include <limits>
19 #include <utility>
20 
21 #include <catch.hpp>
22 
23 #include "PacketVersion2.hpp"
24 #include "QueuedPacket.hpp"
25 #include "utility.hpp"
26 
27 #include "common_Packet.hpp"
28 
29 
30 TEST_CASE("QueuedPacket's can be constructed.", "[QueuedPacket]")
31 {
32  auto packet = std::make_shared<packet_v2::Packet>(to_vector(PingV2()));
33  REQUIRE_NOTHROW(QueuedPacket(packet, 3, 10));
34  REQUIRE_THROWS_AS(QueuedPacket(nullptr, 3, 10), std::invalid_argument);
35  REQUIRE_THROWS_WITH(
36  QueuedPacket(nullptr, 3, 10), "Given packet pointer is null.");
37 }
38 
39 
40 TEST_CASE("QueuedPacket' are comparable.", "[QueuedPacket]")
41 {
42  auto packet = std::make_shared<packet_v2::Packet>(to_vector(PingV2()));
43  SECTION("with ==")
44  {
45  REQUIRE(QueuedPacket(packet, 3, 10) == QueuedPacket(packet, 3, 10));
46  REQUIRE_FALSE(
47  QueuedPacket(packet, 3, 10) == QueuedPacket(packet, 0, 10));
48  REQUIRE_FALSE(
49  QueuedPacket(packet, 3, 10) == QueuedPacket(packet, 3, 100));
50  }
51  SECTION("with !=")
52  {
53  REQUIRE(QueuedPacket(packet, 3, 10) != QueuedPacket(packet, 0, 10));
54  REQUIRE(QueuedPacket(packet, 3, 10) != QueuedPacket(packet, 3, 100));
55  REQUIRE_FALSE(
56  QueuedPacket(packet, 3, 10) != QueuedPacket(packet, 3, 10));
57  }
58  SECTION("with <")
59  {
60  // Priority takes precidence.
61  REQUIRE(
62  QueuedPacket(packet, 0, 10) < QueuedPacket(packet, 3, 100));
63  REQUIRE_FALSE(
64  QueuedPacket(packet, 3, 100) < QueuedPacket(packet, 0, 10));
65  // Ticket number.
66  REQUIRE(
67  QueuedPacket(packet, 3, 100) < QueuedPacket(packet, 3, 10));
68  REQUIRE_FALSE(
69  QueuedPacket(packet, 3, 10) < QueuedPacket(packet, 3, 100));
70  // Ticket number, with rollover.
71  REQUIRE(
72  QueuedPacket(packet, 3, 0) <
74  packet, 3,
75  std::numeric_limits<unsigned long long>::max() / 2 + 1));
76  REQUIRE_FALSE(
77  QueuedPacket(packet, 3, 0) <
79  packet, 3,
80  std::numeric_limits<unsigned long long>::max() / 2));
81  // Not equal.
82  REQUIRE_FALSE(
83  QueuedPacket(packet, 3, 10) < QueuedPacket(packet, 3, 10));
84  }
85  SECTION("with >")
86  {
87  // Priority takes precidence.
88  REQUIRE(
89  QueuedPacket(packet, 3, 10) > QueuedPacket(packet, 0, 100));
90  REQUIRE_FALSE(
91  QueuedPacket(packet, 0, 100) > QueuedPacket(packet, 3, 10));
92  // Ticket number.
93  REQUIRE(
94  QueuedPacket(packet, 3, 10) > QueuedPacket(packet, 3, 100));
95  REQUIRE_FALSE(
96  QueuedPacket(packet, 3, 100) > QueuedPacket(packet, 3, 10));
97  // Ticket number, with rollover.
98  REQUIRE(
100  packet, 3,
101  std::numeric_limits<unsigned long long>::max() / 2 + 1) >
102  QueuedPacket(packet, 3, 0));
103  REQUIRE_FALSE(
104  QueuedPacket(
105  packet, 3,
106  std::numeric_limits<unsigned long long>::max() / 2) >
107  QueuedPacket(packet, 3, 0));
108  // Not equal.
109  REQUIRE_FALSE(
110  QueuedPacket(packet, 3, 10) > QueuedPacket(packet, 3, 10));
111  }
112  SECTION("with <=")
113  {
114  // Equality.
115  REQUIRE(QueuedPacket(packet, 3, 10) <= QueuedPacket(packet, 3, 10));
116  // Priority takes precidence.
117  REQUIRE(
118  QueuedPacket(packet, 0, 10) <= QueuedPacket(packet, 3, 100));
119  REQUIRE_FALSE(
120  QueuedPacket(packet, 3, 100) <= QueuedPacket(packet, 0, 10));
121  // Ticket number.
122  REQUIRE(
123  QueuedPacket(packet, 3, 100) <= QueuedPacket(packet, 3, 10));
124  REQUIRE_FALSE(
125  QueuedPacket(packet, 3, 10) <= QueuedPacket(packet, 3, 100));
126  // Ticket number, with rollover.
127  REQUIRE(
128  QueuedPacket(packet, 3, 0) <=
129  QueuedPacket(
130  packet, 3,
131  std::numeric_limits<unsigned long long>::max() / 2 + 1));
132  REQUIRE_FALSE(
133  QueuedPacket(packet, 3, 0) <=
134  QueuedPacket(
135  packet, 3,
136  std::numeric_limits<unsigned long long>::max() / 2));
137  }
138  SECTION("with >=")
139  {
140  // Equality.
141  REQUIRE(QueuedPacket(packet, 3, 10) >= QueuedPacket(packet, 3, 10));
142  // Priority takes precidence.
143  REQUIRE(
144  QueuedPacket(packet, 3, 10) >= QueuedPacket(packet, 0, 100));
145  REQUIRE_FALSE(
146  QueuedPacket(packet, 0, 100) >= QueuedPacket(packet, 3, 10));
147  // Ticket number.
148  REQUIRE(
149  QueuedPacket(packet, 3, 10) >= QueuedPacket(packet, 3, 100));
150  REQUIRE_FALSE(
151  QueuedPacket(packet, 3, 100) >= QueuedPacket(packet, 3, 10));
152  // Ticket number, with rollover.
153  REQUIRE(
154  QueuedPacket(
155  packet, 3,
156  std::numeric_limits<unsigned long long>::max() / 2 + 1) >=
157  QueuedPacket(packet, 3, 0));
158  REQUIRE_FALSE(
159  QueuedPacket(
160  packet, 3,
161  std::numeric_limits<unsigned long long>::max() / 2) >=
162  QueuedPacket(packet, 3, 0));
163  }
164 }
165 
166 
167 TEST_CASE("QueuedPacket's are copyable.", "[QueuedPacket]")
168 {
169  auto packet = std::make_shared<packet_v2::Packet>(to_vector(PingV2()));
170  auto original = QueuedPacket(packet, 3, 10);
171  auto copy(original);
172  REQUIRE(copy == QueuedPacket(packet, 3, 10));
173 }
174 
175 
176 TEST_CASE("QueuedPacket's are movable.", "[QueuedPacket]")
177 {
178  auto packet = std::make_shared<packet_v2::Packet>(to_vector(PingV2()));
179  auto original = QueuedPacket(packet, 3, 10);
180  auto moved(std::move(original));
181  REQUIRE(moved == QueuedPacket(packet, 3, 10));
182 }
183 
184 
185 TEST_CASE("QueuedPacket's are assignable.", "[QueuedPacket]")
186 {
187  auto packet = std::make_shared<packet_v2::Packet>(to_vector(PingV2()));
188  auto a = QueuedPacket(packet, 3, 10);
189  auto b = QueuedPacket(packet, 10, 3);
190  REQUIRE(a == QueuedPacket(packet, 3, 10));
191  a = b;
192  REQUIRE(a == QueuedPacket(packet, 10, 3));
193 }
194 
195 
196 TEST_CASE("QueuedPacket's are assignable (by move semantics).",
197  "[QueuedPacket]")
198 {
199  auto packet = std::make_shared<packet_v2::Packet>(to_vector(PingV2()));
200  auto a = QueuedPacket(packet, 3, 10);
201  auto b = QueuedPacket(packet, 10, 3);
202  REQUIRE(a == QueuedPacket(packet, 3, 10));
203  a = std::move(b);
204  REQUIRE(a == QueuedPacket(packet, 10, 3));
205 }
206 
207 
208 TEST_CASE("QueuedPacket's 'packet' method returns the contained MAVLink packet",
209  "[QueuedPacket]")
210 {
211  auto packet = std::make_shared<packet_v2::Packet>(to_vector(PingV2()));
212  REQUIRE(*QueuedPacket(packet, 3, 10).packet() == *packet);
213 }
214 
215 
216 TEST_CASE("QueuedPacket's are printable.", "[QueuedPacket]")
217 {
218  auto packet = std::make_shared<packet_v2::Packet>(to_vector(PingV2()));
219  REQUIRE(
220  str(QueuedPacket(packet, -10, 1)) ==
221  "PING (#4) from 192.168 to 127.1 (v2.0) with priority -10");
222  REQUIRE(
223  str(QueuedPacket(packet, 0, 1)) ==
224  "PING (#4) from 192.168 to 127.1 (v2.0) with priority 0");
225  REQUIRE(
226  str(QueuedPacket(packet, 3, 10)) ==
227  "PING (#4) from 192.168 to 127.1 (v2.0) with priority 3");
228  REQUIRE(
229  str(QueuedPacket(packet, 10, 3)) ==
230  "PING (#4) from 192.168 to 127.1 (v2.0) with priority 10");
231 }
std::string str(const T &object)
Definition: utility.hpp:128
TEST_CASE("QueuedPacket's can be constructed.", "[QueuedPacket]")