47 TEST_CASE(
"UDPInterface's can be constructed.",
"[UPDInterface]")
49 fakeit::Mock<UDPSocket> mock_socket;
50 fakeit::Mock<ConnectionPool> mock_pool;
51 fakeit::Mock<ConnectionFactory<>> mock_factory;
55 SECTION(
"When all inputs are valid.")
58 UDPInterface(std::move(socket), pool, std::move(factory)));
60 SECTION(
"Ensures the socket pointer is not null.")
64 std::invalid_argument);
68 "Given socket pointer is null.");
70 SECTION(
"Ensures the connection pool pointer is not null.")
73 UDPInterface(std::move(socket),
nullptr, std::move(factory)),
74 std::invalid_argument);
78 UDPInterface(std::move(socket),
nullptr, std::move(factory)),
79 "Given connection pool pointer is null.");
81 SECTION(
"Ensures the connection factory pointer is not null.")
85 std::invalid_argument);
89 "Given connection factory pointer is null.");
94 TEST_CASE(
"UDPInterace's 'receive_packet' method.",
"[UPDInterface]")
98 std::make_shared<packet_v2::Packet>(to_vector(HeartbeatV2()));
99 auto mission_set_current =
100 std::make_shared<packet_v2::Packet>(to_vector(MissionSetCurrentV2()));
101 auto encapsulated_data =
102 std::make_shared<packet_v2::Packet>(to_vector(EncapsulatedDataV2()));
105 fakeit::Mock<ConnectionPool> spy_pool(pool_obj);
106 fakeit::Spy(Method(spy_pool, add));
109 fakeit::Mock<Filter> mock_filter;
112 will_accept_packets([](
const auto & a,
const auto & b)
114 return a.data() < b.data();
116 std::multiset<MAVAddress> will_accept_addresses;
117 fakeit::When(Method(mock_filter, will_accept)).AlwaysDo(
118 [&](
auto & a,
auto & b)
120 will_accept_packets.insert(
121 dynamic_cast<const packet_v2::Packet &>(a));
122 will_accept_addresses.insert(b);
123 return std::pair<bool, int>(
true, 0);
128 IPAddress(std::back_insert_iterator<std::vector<uint8_t>>,
129 const std::chrono::nanoseconds &);
131 fakeit::Mock<UDPSocket> mock_socket(udp_socket);
135 std::move(socket), pool,
137 std::chrono::nanoseconds timeout = 250ms;
138 SECTION(
"No packet received.")
143 mock_socket, receive, receive_type)).AlwaysReturn(
IPAddress(0));
148 OverloadedMethod(mock_socket, receive, receive_type).Matching(
154 fakeit::Verify(Method(mock_filter, will_accept)).Exactly(0);
155 fakeit::Verify(Method(spy_pool, add)).Exactly(0);
157 SECTION(
"Partial packet received.")
160 fakeit::When(OverloadedMethod(mock_socket, receive, receive_type)
161 ).Do([](
auto a,
auto b)
165 auto vec = to_vector(HeartbeatV2());
166 std::copy(vec.begin(), vec.end(), a);
168 }).Do([](
auto a,
auto b)
171 auto vec = to_vector(EncapsulatedDataV2());
172 std::copy(vec.begin(), vec.end() - 1, a);
180 OverloadedMethod(mock_socket, receive, receive_type).Matching(
186 fakeit::Verify(Method(mock_filter, will_accept)).Exactly(0);
187 fakeit::Verify(Method(spy_pool, add)).Exactly(1);
189 SECTION(
"Full packet received.")
192 fakeit::When(OverloadedMethod(mock_socket, receive, receive_type)
193 ).Do([](
auto a,
auto b)
197 auto vec = to_vector(HeartbeatV2());
198 std::copy(vec.begin(), vec.end(), a);
200 }).Do([](
auto a,
auto b)
203 auto vec = to_vector(EncapsulatedDataV2());
204 std::copy(vec.begin(), vec.end(), a);
212 OverloadedMethod(mock_socket, receive, receive_type).Matching(
218 fakeit::Verify(Method(mock_filter, will_accept)).Once();
219 REQUIRE(will_accept_packets.count(*encapsulated_data) == 1);
220 REQUIRE(will_accept_addresses.count(
MAVAddress(
"127.1")) == 1);
221 fakeit::Verify(Method(spy_pool, add)).Exactly(2);
222 auto it = will_accept_packets.find(*encapsulated_data);
223 REQUIRE(it != will_accept_packets.end());
224 REQUIRE(it->connection() !=
nullptr);
226 SECTION(
"Multiple packets received (same IP and MAVLink addresses).")
229 fakeit::When(OverloadedMethod(mock_socket, receive, receive_type)
230 ).Do([](
auto a,
auto b)
234 auto vec = to_vector(HeartbeatV2());
235 std::copy(vec.begin(), vec.end(), a);
237 }).AlwaysDo([](
auto a,
auto b)
240 auto vec = to_vector(EncapsulatedDataV2());
241 std::copy(vec.begin(), vec.end(), a);
250 OverloadedMethod(mock_socket, receive, receive_type).Matching(
256 fakeit::Verify(Method(mock_filter, will_accept)).Exactly(2);
257 REQUIRE(will_accept_packets.count(*encapsulated_data) == 2);
258 REQUIRE(will_accept_addresses.count(
MAVAddress(
"127.1")) == 2);
259 fakeit::Verify(Method(spy_pool, add)).Exactly(2);
260 auto it = will_accept_packets.find(*encapsulated_data);
261 REQUIRE(it != will_accept_packets.end());
262 REQUIRE(it->connection() !=
nullptr);
264 REQUIRE(it != will_accept_packets.end());
265 REQUIRE(it->connection() !=
nullptr);
267 SECTION(
"Multiple packets received (same IP, different MAVLink addresses).")
270 fakeit::When(OverloadedMethod(mock_socket, receive, receive_type)
271 ).Do([](
auto a,
auto b)
275 auto vec = to_vector(HeartbeatV2());
276 std::copy(vec.begin(), vec.end(), a);
278 }).Do([](
auto a,
auto b)
281 auto vec = to_vector(EncapsulatedDataV2());
282 std::copy(vec.begin(), vec.end(), a);
284 }).Do([](
auto a,
auto b)
287 auto vec = to_vector(MissionSetCurrentV2());
288 std::copy(vec.begin(), vec.end(), a);
297 OverloadedMethod(mock_socket, receive, receive_type).Matching(
303 fakeit::Verify(Method(mock_filter, will_accept)).Exactly(2);
304 REQUIRE(will_accept_packets.count(*encapsulated_data) == 1);
305 REQUIRE(will_accept_packets.count(*mission_set_current) == 1);
306 REQUIRE(will_accept_addresses.count(
MAVAddress(
"127.1")) == 2);
307 fakeit::Verify(Method(spy_pool, add)).Exactly(2);
308 auto it = will_accept_packets.find(*encapsulated_data);
309 REQUIRE(it != will_accept_packets.end());
310 REQUIRE(it->connection() !=
nullptr);
311 it = will_accept_packets.find(*mission_set_current);
312 REQUIRE(it != will_accept_packets.end());
313 REQUIRE(it->connection() !=
nullptr);
315 SECTION(
"Multiple packets received (different IP and MAVLink addresses).")
318 fakeit::When(OverloadedMethod(mock_socket, receive, receive_type)
319 ).Do([](
auto a,
auto b)
323 auto vec = to_vector(HeartbeatV2());
324 std::copy(vec.begin(), vec.end(), a);
326 }).Do([](
auto a,
auto b)
329 auto vec = to_vector(EncapsulatedDataV2());
330 std::copy(vec.begin(), vec.end(), a);
332 }).Do([](
auto a,
auto b)
335 auto vec = to_vector(MissionSetCurrentV2());
336 std::copy(vec.begin(), vec.end(), a);
345 OverloadedMethod(mock_socket, receive, receive_type).Matching(
351 fakeit::Verify(Method(mock_filter, will_accept)).Exactly(3);
352 REQUIRE(will_accept_packets.count(*encapsulated_data) == 1);
353 REQUIRE(will_accept_packets.count(*mission_set_current) == 2);
354 REQUIRE(will_accept_addresses.count(
MAVAddress(
"127.1")) == 2);
355 REQUIRE(will_accept_addresses.count(
MAVAddress(
"224.255")) == 1);
356 fakeit::Verify(Method(spy_pool, add)).Exactly(3);
357 auto it = will_accept_packets.find(*encapsulated_data);
358 REQUIRE(it != will_accept_packets.end());
359 REQUIRE(it->connection() !=
nullptr);
360 it = will_accept_packets.find(*mission_set_current);
361 REQUIRE(it != will_accept_packets.end());
362 REQUIRE(it->connection() !=
nullptr);
364 REQUIRE(it != will_accept_packets.end());
365 REQUIRE(it->connection() !=
nullptr);
367 SECTION(
"Partial packets with same IP address should be combined and " 371 fakeit::When(OverloadedMethod(mock_socket, receive, receive_type)
372 ).Do([](
auto a,
auto b)
376 auto vec = to_vector(HeartbeatV2());
377 std::copy(vec.begin(), vec.end(), a);
379 }).Do([](
auto a,
auto b)
382 auto vec = to_vector(EncapsulatedDataV2());
383 std::copy(vec.begin(), vec.end() - 10, a);
385 }).Do([](
auto a,
auto b)
388 auto vec = to_vector(EncapsulatedDataV2());
389 std::copy(vec.end() - 10, vec.end(), a);
398 OverloadedMethod(mock_socket, receive, receive_type).Matching(
404 fakeit::Verify(Method(mock_filter, will_accept)).Once();
405 REQUIRE(will_accept_packets.count(*encapsulated_data) == 1);
406 REQUIRE(will_accept_addresses.count(
MAVAddress(
"127.1")) == 1);
407 fakeit::Verify(Method(spy_pool, add)).Exactly(2);
408 auto it = will_accept_packets.find(*encapsulated_data);
409 REQUIRE(it != will_accept_packets.end());
410 REQUIRE(it->connection() !=
nullptr);
412 SECTION(
"Partial packets with different IP addresses should be dropped.")
415 fakeit::When(OverloadedMethod(mock_socket, receive, receive_type)
416 ).Do([](
auto a,
auto b)
420 auto vec = to_vector(HeartbeatV2());
421 std::copy(vec.begin(), vec.end(), a);
423 }).Do([](
auto a,
auto b)
426 auto vec = to_vector(EncapsulatedDataV2());
427 std::copy(vec.begin(), vec.end() - 10, a);
429 }).Do([](
auto a,
auto b)
432 auto vec = to_vector(EncapsulatedDataV2());
433 std::copy(vec.end() - 10, vec.end(), a);
442 OverloadedMethod(mock_socket, receive, receive_type).Matching(
448 fakeit::Verify(Method(mock_filter, will_accept)).Exactly(0);
449 fakeit::Verify(Method(spy_pool, add)).Once();
454 TEST_CASE(
"UDPInterace's 'send_packet' method.",
"[UPDInterface]")
457 auto ping = std::make_shared<packet_v2::Packet>(to_vector(PingV2()));
459 std::make_shared<packet_v2::Packet>(to_vector(HeartbeatV2()));
460 auto encapsulated_data =
461 std::make_shared<packet_v2::Packet>(to_vector(EncapsulatedDataV2()));
463 fakeit::Mock<Filter> mock_filter;
464 fakeit::When(Method(mock_filter, will_accept)).AlwaysDo(
465 [&](
auto & a,
auto & b)
469 return std::pair<bool, int>(
true, 0);
473 std::multiset<std::vector<uint8_t>> send_bytes;
474 std::multiset<IPAddress> send_addresses;
476 IPAddress(std::back_insert_iterator<std::vector<uint8_t>>,
477 const std::chrono::nanoseconds &);
479 void(std::vector<uint8_t>::const_iterator,
480 std::vector<uint8_t>::const_iterator,
483 fakeit::Mock<UDPSocket> mock_socket(udp_socket);
484 fakeit::When(OverloadedMethod(mock_socket, send, send_type)
485 ).AlwaysDo([&](
auto a,
auto b,
auto c)
487 std::vector<uint8_t> vec;
488 std::copy(a, b, std::back_inserter(vec));
489 send_bytes.insert(vec);
490 send_addresses.insert(c);
495 fakeit::Mock<ConnectionFactory<>> spy_factory(factory_obj);
496 fakeit::Spy(Method(spy_factory, wait_for_packet));
500 std::make_shared<ConnectionPool>(),
502 std::chrono::nanoseconds timeout = 1ms;
503 SECTION(
"No packets, timeout.")
508 fakeit::Verify(Method(spy_factory, wait_for_packet).Using(1ms)).Once();
510 OverloadedMethod(mock_socket, send, send_type)).Exactly(0);
512 SECTION(
"Single connection, single packet.")
515 fakeit::When(OverloadedMethod(mock_socket, receive, receive_type)
516 ).Do([](
auto a,
auto b)
520 auto vec = to_vector(HeartbeatV2());
521 std::copy(vec.begin(), vec.end(), a);
523 }).Do([](
auto a,
auto b)
526 auto vec = to_vector(EncapsulatedDataV2());
527 std::copy(vec.begin(), vec.end(), a);
535 fakeit::Verify(Method(spy_factory, wait_for_packet).Using(1ms)).Once();
536 fakeit::Verify(OverloadedMethod(mock_socket, send, send_type)).Once();
537 REQUIRE(send_bytes.size() == 1);
538 REQUIRE(send_bytes.count(to_vector(EncapsulatedDataV2())) == 1);
539 REQUIRE(send_addresses.count(
IPAddress(
"127.0.0.1:4000")) == 1);
541 SECTION(
"Single connection, multiple packets.")
544 fakeit::When(OverloadedMethod(mock_socket, receive, receive_type)
545 ).Do([](
auto a,
auto b)
549 auto vec = to_vector(HeartbeatV2());
550 std::copy(vec.begin(), vec.end(), a);
552 }).Do([](
auto a,
auto b)
555 auto vec = to_vector(EncapsulatedDataV2());
556 std::copy(vec.begin(), vec.end(), a);
558 }).Do([](
auto a,
auto b)
561 auto vec = to_vector(MissionSetCurrentV2());
562 std::copy(vec.begin(), vec.end(), a);
571 fakeit::Verify(Method(spy_factory, wait_for_packet).Using(1ms)).Once();
572 fakeit::Verify(OverloadedMethod(mock_socket, send, send_type)).Once();
573 REQUIRE(send_bytes.size() == 1);
574 REQUIRE(send_bytes.count(to_vector(EncapsulatedDataV2())) == 1);
575 REQUIRE(send_addresses.count(
IPAddress(
"127.0.0.1:4000")) == 1);
580 Method(spy_factory, wait_for_packet).Using(1ms)).Exactly(2);
582 OverloadedMethod(mock_socket, send, send_type)).Exactly(2);
583 REQUIRE(send_bytes.size() == 2);
584 REQUIRE(send_bytes.count(to_vector(EncapsulatedDataV2())) == 1);
585 REQUIRE(send_bytes.count(to_vector(MissionSetCurrentV2())) == 1);
586 REQUIRE(send_addresses.count(
IPAddress(
"127.0.0.1:4000")) == 2);
588 SECTION(
"Multiple connections, multiple packets.")
591 fakeit::When(OverloadedMethod(mock_socket, receive, receive_type)
592 ).Do([](
auto a,
auto b)
596 auto vec = to_vector(HeartbeatV2());
597 std::copy(vec.begin(), vec.end(), a);
599 }).Do([](
auto a,
auto b)
602 auto vec = to_vector(EncapsulatedDataV2());
603 std::copy(vec.begin(), vec.end(), a);
605 }).Do([](
auto a,
auto b)
608 auto vec = to_vector(MissionSetCurrentV2());
609 std::copy(vec.begin(), vec.end(), a);
618 fakeit::Verify(Method(spy_factory, wait_for_packet).Using(1ms)).Once();
619 fakeit::Verify(Method(spy_factory, wait_for_packet)).Exactly(2);
621 OverloadedMethod(mock_socket, send, send_type)).Exactly(2);
622 REQUIRE(send_bytes.size() == 2);
623 REQUIRE(send_bytes.count(to_vector(EncapsulatedDataV2())) == 1);
624 REQUIRE(send_bytes.count(to_vector(MissionSetCurrentV2())) == 1);
625 REQUIRE(send_addresses.count(
IPAddress(
"127.0.0.1:4000")) == 1);
626 REQUIRE(send_addresses.count(
IPAddress(
"127.0.0.1:4001")) == 1);
631 Method(spy_factory, wait_for_packet).Using(1ms)).Exactly(2);
632 fakeit::Verify(Method(spy_factory, wait_for_packet)).Exactly(3);
634 OverloadedMethod(mock_socket, send, send_type)).Exactly(3);
635 REQUIRE(send_bytes.size() == 3);
636 REQUIRE(send_bytes.count(to_vector(EncapsulatedDataV2())) == 1);
637 REQUIRE(send_bytes.count(to_vector(MissionSetCurrentV2())) == 2);
638 REQUIRE(send_addresses.count(
IPAddress(
"127.0.0.1:4000")) == 2);
639 REQUIRE(send_addresses.count(
IPAddress(
"127.0.0.1:4001")) == 1);
641 SECTION(
"Multiple connections with broadcast packet.")
644 fakeit::When(Method(mock_filter, will_accept)).AlwaysDo(
645 [&](
auto & a,
auto & b)
649 if (a.name() ==
"MISSION_SET_CURRENT")
651 return std::pair<bool, int>(
true, 0);
654 return std::pair<bool, int>(
false, 0);
656 fakeit::When(OverloadedMethod(mock_socket, receive, receive_type)
657 ).Do([](
auto a,
auto b)
661 auto vec = to_vector(HeartbeatV2());
662 std::copy(vec.begin(), vec.end(), a);
664 }).Do([](
auto a,
auto b)
668 auto vec = to_vector(EncapsulatedDataV2());
669 std::copy(vec.begin(), vec.end(), a);
671 }).Do([](
auto a,
auto b)
674 auto vec = to_vector(MissionSetCurrentV2());
675 std::copy(vec.begin(), vec.end(), a);
684 fakeit::Verify(Method(spy_factory, wait_for_packet).Using(1ms)).Once();
685 fakeit::Verify(Method(spy_factory, wait_for_packet)).Exactly(2);
687 OverloadedMethod(mock_socket, send, send_type)).Exactly(2);
688 REQUIRE(send_bytes.size() == 2);
689 REQUIRE(send_bytes.count(to_vector(MissionSetCurrentV2())) == 2);
690 REQUIRE(send_addresses.count(
IPAddress(
"127.0.0.1:4000")) == 1);
691 REQUIRE(send_addresses.count(
IPAddress(
"127.0.0.1:4001")) == 1);
696 Method(spy_factory, wait_for_packet).Using(1ms)).Exactly(2);
697 fakeit::Verify(Method(spy_factory, wait_for_packet)).Exactly(3);
699 OverloadedMethod(mock_socket, send, send_type)).Exactly(2);
701 SECTION(
"Multiple connections with targeted packet.")
704 fakeit::When(Method(mock_filter, will_accept)).AlwaysDo(
705 [&](
auto & a,
auto & b)
709 if (a.name() ==
"PING")
711 return std::pair<bool, int>(
true, 0);
714 return std::pair<bool, int>(
false, 0);
716 fakeit::When(OverloadedMethod(mock_socket, receive, receive_type)
717 ).Do([](
auto a,
auto b)
721 auto vec = to_vector(HeartbeatV2());
722 std::copy(vec.begin(), vec.end(), a);
724 }).Do([](
auto a,
auto b)
728 auto vec = to_vector(EncapsulatedDataV2());
729 std::copy(vec.begin(), vec.end(), a);
731 }).Do([](
auto a,
auto b)
734 auto vec = to_vector(PingV2());
735 std::copy(vec.begin(), vec.end(), a);
744 fakeit::Verify(Method(spy_factory, wait_for_packet).Using(1ms)).Once();
745 fakeit::Verify(Method(spy_factory, wait_for_packet)).Once();
747 OverloadedMethod(mock_socket, send, send_type)).Once();
748 REQUIRE(send_bytes.size() == 1);
749 REQUIRE(send_bytes.count(to_vector(PingV2())) == 1);
750 REQUIRE(send_addresses.count(
IPAddress(
"127.0.0.1:4000")) == 1);
755 Method(spy_factory, wait_for_packet).Using(1ms)).Exactly(2);
756 fakeit::Verify(Method(spy_factory, wait_for_packet)).Exactly(2);
758 OverloadedMethod(mock_socket, send, send_type)).Once();
763 TEST_CASE(
"UDPInterface's are printable.",
"[UDPInterface]")
765 fakeit::Mock<ConnectionPool> mock_pool;
766 fakeit::Mock<ConnectionFactory<>> mock_factory;
769 auto socket = std::make_unique<UDPSocket>();
770 UDPInterface udp(std::move(socket), pool, std::move(factory));
771 REQUIRE(
str(udp) ==
"unknown UDP socket");
781 TEST_CASE(
"OLD TEST: UDPInterface's tests.",
"[UPDInterface]")
784 std::back_insert_iterator<std::vector<uint8_t>>,
785 const std::chrono::nanoseconds &);
787 std::make_shared<packet_v2::Packet>(to_vector(HeartbeatV2()));
788 fakeit::Mock<Filter> mock_filter;
790 fakeit::Mock<UDPSocket> mock_socket(udp_socket);
793 auto pool = std::make_shared<ConnectionPool>();
796 fakeit::When(OverloadedMethod(
797 mock_socket, receive, receive_type)).AlwaysReturn(
800 std::move(socket), pool,
802 std::chrono::nanoseconds timeout = 250ms;
805 OverloadedMethod(mock_socket, receive, receive_type).Matching(
815 TEST_CASE(
"OLD TEST: UDPInterface's 'receive_packet' method receives one or " 816 "more MAVLink packets.",
"[UPDInterface]")
819 std::back_insert_iterator<std::vector<uint8_t>>,
820 const std::chrono::nanoseconds &);
822 std::make_shared<packet_v2::Packet>(to_vector(HeartbeatV2()));
823 fakeit::Mock<Filter> mock_filter;
825 fakeit::Mock<UDPSocket> mock_socket(udp_socket);
826 fakeit::Mock<ConnectionPool> mock_pool;
827 fakeit::Mock<ConnectionFactory<>> mock_factory;
832 SECTION(
"When no packets available for sending.")
834 fakeit::When(OverloadedMethod(mock_socket, receive, receive_type)
835 ).AlwaysDo([](
auto a,
auto b)
838 auto vec = to_vector(HeartbeatV2());
839 std::copy(vec.begin(), vec.end(), a);
842 fakeit::Fake(Method(mock_pool, send));
843 fakeit::Fake(Method(mock_pool, add));
844 fakeit::When(Method(mock_factory,
get)).AlwaysDo([&](
auto a)
846 return std::make_unique<Connection>(a, filter);
848 UDPInterface udp(std::move(socket), pool, std::move(factory));
849 std::chrono::nanoseconds timeout = 250ms;
852 OverloadedMethod(mock_socket, receive, receive_type).Matching(
858 fakeit::Verify(Method(mock_pool, send).Matching(
867 TEST_CASE(
"OLD TEST: UDPInterface's 'send_packet' method sends one or more " 868 " MAVLink packets.",
"[UPDInterface]")
871 fakeit::Mock<UDPSocket> mock_socket(udp_socket);
872 fakeit::Mock<ConnectionPool> mock_pool;
873 fakeit::Mock<ConnectionFactory<>> mock_factory;
877 SECTION(
"When no packets available for sending.")
879 fakeit::When(Method(mock_factory, wait_for_packet)).AlwaysReturn(
false);
880 UDPInterface udp(std::move(socket), pool, std::move(factory));
881 std::chrono::nanoseconds timeout = 250ms;
884 Method(mock_factory, wait_for_packet).Using(250ms)).Once();
std::string str(const T &object)
void receive_packet(const std::chrono::nanoseconds &timeout) final
void send_packet(const std::chrono::nanoseconds &timeout) final
TEST_CASE("UDPInterface's can be constructed.", "[UPDInterface]")
std::shared_ptr< T > mock_shared(fakeit::Mock< T > &mock)
std::unique_ptr< T > mock_unique(fakeit::Mock< T > &mock)