@@ -29,25 +29,26 @@ TEST_CASE("IO-Classic") // Catch2 does not support parametrized tests yet.
2929
3030 char buf[255 ]{};
3131 fr = {};
32- REQUIRE (1 == socketcanPop (sb, &fr, sizeof (buf), buf, 1000 ));
32+ REQUIRE (1 == socketcanPop (sb, &fr, sizeof (buf), buf, 1000 , nullptr ));
3333 REQUIRE (fr.timestamp_usec > 0 );
3434 REQUIRE (fr.extended_can_id == 0x1234U );
3535 REQUIRE (fr.payload_size == 6 );
3636 REQUIRE (0 == std::memcmp (fr.payload , " Hello" , 6 ));
3737 auto old_ts = fr.timestamp_usec ;
3838
3939 fr = {};
40- REQUIRE (1 == socketcanPop (sa, &fr, sizeof (buf), buf, 1000 ));
40+ REQUIRE (0 == socketcanPop (sa, &fr, sizeof (buf), buf, 1000 , nullptr )); // Loopback frame.
41+ REQUIRE (1 == socketcanPop (sa, &fr, sizeof (buf), buf, 1000 , nullptr )); // Received actual frame.
4142 REQUIRE (fr.timestamp_usec > 0 );
4243 REQUIRE (fr.timestamp_usec >= old_ts);
4344 REQUIRE (fr.extended_can_id == 0x4321U );
4445 REQUIRE (fr.payload_size == 7 );
4546 REQUIRE (0 == std::memcmp (fr.payload , " World!" , 7 ));
4647
47- REQUIRE (0 == socketcanPop (sa, &fr, sizeof (buf), buf, 0 ));
48- REQUIRE (0 == socketcanPop (sa, &fr, sizeof (buf), buf, 1000 ));
49- REQUIRE (-EINVAL == socketcanPop (sa, &fr, 0 , nullptr , 1000 ));
50- REQUIRE (-EINVAL == socketcanPop (sa, nullptr , sizeof (buf), buf, 1000 ));
48+ REQUIRE (0 == socketcanPop (sa, &fr, sizeof (buf), buf, 0 , nullptr ));
49+ REQUIRE (0 == socketcanPop (sa, &fr, sizeof (buf), buf, 1000 , nullptr ));
50+ REQUIRE (-EINVAL == socketcanPop (sa, &fr, 0 , nullptr , 1000 , nullptr ));
51+ REQUIRE (-EINVAL == socketcanPop (sa, nullptr , sizeof (buf), buf, 1000 , nullptr ));
5152
5253 REQUIRE (-EINVAL == socketcanPush (sa, nullptr , 1'000'000 ));
5354
@@ -85,28 +86,71 @@ TEST_CASE("IO-FD")
8586
8687 char buf[255 ]{};
8788 fr = {};
88- REQUIRE (1 == socketcanPop (sb, &fr, sizeof (buf), buf, 1000 ));
89+ REQUIRE (1 == socketcanPop (sb, &fr, sizeof (buf), buf, 1000 , nullptr ));
8990 REQUIRE (fr.timestamp_usec > 0 );
9091 REQUIRE (fr.extended_can_id == 0x1234U );
9192 REQUIRE (fr.payload_size == 13 );
9293 REQUIRE (0 == std::memcmp (fr.payload , " Hello world!" , 13 ));
9394 auto old_ts = fr.timestamp_usec ;
9495
9596 fr = {};
96- REQUIRE (1 == socketcanPop (sa, &fr, sizeof (buf), buf, 1000 ));
97+ REQUIRE (0 == socketcanPop (sa, &fr, sizeof (buf), buf, 1000 , nullptr )); // Loopback frame.
98+ REQUIRE (1 == socketcanPop (sa, &fr, sizeof (buf), buf, 1000 , nullptr )); // Received actual frame.
9799 REQUIRE (fr.timestamp_usec > 0 );
98100 REQUIRE (fr.timestamp_usec >= old_ts);
99101 REQUIRE (fr.extended_can_id == 0x4321U );
100102 REQUIRE (fr.payload_size == 10 );
101103 REQUIRE (0 == std::memcmp (fr.payload , " 0123456789" , 10 ));
102104
103- REQUIRE (0 == socketcanPop (sa, &fr, sizeof (buf), buf, 0 ));
104- REQUIRE (0 == socketcanPop (sa, &fr, sizeof (buf), buf, 1000 ));
105- REQUIRE (-EINVAL == socketcanPop (sa, &fr, 0 , nullptr , 1000 ));
106- REQUIRE (-EINVAL == socketcanPop (sa, nullptr , sizeof (buf), buf, 1000 ));
105+ REQUIRE (0 == socketcanPop (sa, &fr, sizeof (buf), buf, 0 , nullptr ));
106+ REQUIRE (0 == socketcanPop (sa, &fr, sizeof (buf), buf, 1000 , nullptr ));
107+ REQUIRE (-EINVAL == socketcanPop (sa, &fr, 0 , nullptr , 1000 , nullptr ));
108+ REQUIRE (-EINVAL == socketcanPop (sa, nullptr , sizeof (buf), buf, 1000 , nullptr ));
107109
108110 REQUIRE (-EINVAL == socketcanPush (sa, nullptr , 1'000'000 ));
109111
110112 ::close (sa);
111113 ::close (sb);
112114}
115+
116+ TEST_CASE (" IO-FD-Loopback" )
117+ {
118+ const char * const iface_name = " vcan0" ;
119+
120+ const auto sa = socketcanOpen (iface_name, true );
121+ const auto sb = socketcanOpen (iface_name, true );
122+ REQUIRE (sa >= 0 );
123+ REQUIRE (sb >= 0 );
124+
125+ CanardFrame fr{};
126+ fr.extended_can_id = 0x1234U ;
127+ fr.payload_size = 13 ;
128+ fr.payload = " Hello World!" ;
129+ REQUIRE (1 == socketcanPush (sa, &fr, 1'000'000 )); // Send frame on sa.
130+
131+ bool loopback = true ;
132+ char buf[255 ]{};
133+ fr = {};
134+ REQUIRE (1 == socketcanPop (sb, &fr, sizeof (buf), buf, 1000 , &loopback)); // Receive actual frame on sb.
135+ REQUIRE (loopback == false );
136+ REQUIRE (fr.timestamp_usec > 0 );
137+ REQUIRE (fr.extended_can_id == 0x1234U );
138+ REQUIRE (fr.payload_size == 13 );
139+ REQUIRE (0 == std::memcmp (fr.payload , " Hello World!" , 13 ));
140+ auto old_ts = fr.timestamp_usec ;
141+
142+ fr = {};
143+ REQUIRE (1 == socketcanPop (sa, &fr, sizeof (buf), buf, 1000 , &loopback)); // Receive loopback frame on sa.
144+ REQUIRE (loopback == true );
145+ REQUIRE (fr.timestamp_usec > 0 );
146+ REQUIRE (fr.timestamp_usec >= old_ts);
147+ REQUIRE (fr.extended_can_id == 0x1234U );
148+ REQUIRE (fr.payload_size == 13 );
149+ REQUIRE (0 == std::memcmp (fr.payload , " Hello World!" , 13 ));
150+
151+ REQUIRE (0 == socketcanPop (sa, &fr, sizeof (buf), buf, 0 , nullptr )); // No more frames.
152+ REQUIRE (0 == socketcanPop (sa, &fr, sizeof (buf), buf, 1000 , nullptr )); // No more frames.
153+
154+ ::close (sa);
155+ ::close (sb);
156+ }
0 commit comments