lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <8b0e7642b63dfe9de85e3fe65f806843b42d3754.1745323279.git.fmaurer@redhat.com>
Date: Tue, 22 Apr 2025 14:02:36 +0200
From: Felix Maurer <fmaurer@...hat.com>
To: socketcan@...tkopp.net,
	mkl@...gutronix.de
Cc: shuah@...nel.org,
	davem@...emloft.net,
	edumazet@...gle.com,
	kuba@...nel.org,
	pabeni@...hat.com,
	horms@...nel.org,
	linux-can@...r.kernel.org,
	netdev@...r.kernel.org,
	linux-kselftest@...r.kernel.org,
	dcaratti@...hat.com,
	fstornio@...hat.com
Subject: [PATCH 3/4] selftests: can: Use fixtures in test_raw_filter

Use fixtures in test_raw_filter instead of generating the test inputs
during execution. This should make tests easier to follow and extend.

Signed-off-by: Felix Maurer <fmaurer@...hat.com>
---
 .../selftests/net/can/test_raw_filter.c       | 311 ++++++++++++------
 1 file changed, 211 insertions(+), 100 deletions(-)

diff --git a/tools/testing/selftests/net/can/test_raw_filter.c b/tools/testing/selftests/net/can/test_raw_filter.c
index 7414b9aef823..7fe11e020a1c 100644
--- a/tools/testing/selftests/net/can/test_raw_filter.c
+++ b/tools/testing/selftests/net/can/test_raw_filter.c
@@ -18,43 +18,13 @@
 #include <linux/can.h>
 #include <linux/can/raw.h>
 
+#define TH_LOG_ENABLED 0
 #include "../../kselftest_harness.h"
 
 #define ID 0x123
-#define TC 18 /* # of testcases */
-
-const int rx_res[TC] = {4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1};
-const int rxbits_res[TC] = {4369, 4369, 4369, 4369, 17, 4352, 17, 4352, 257, 257, 4112, 4112, 1, 256, 16, 4096, 1, 256};
 
 #define VCANIF "vcan0"
 
-canid_t calc_id(int testcase)
-{
-	canid_t id = ID;
-
-	if (testcase & 1)
-		id |= CAN_EFF_FLAG;
-	if (testcase & 2)
-		id |= CAN_RTR_FLAG;
-
-	return id;
-}
-
-canid_t calc_mask(int testcase)
-{
-	canid_t mask = CAN_SFF_MASK;
-
-	if (testcase > 15)
-		return (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG);
-
-	if (testcase & 4)
-		mask |= CAN_EFF_FLAG;
-	if (testcase & 8)
-		mask |= CAN_RTR_FLAG;
-
-	return mask;
-}
-
 int send_can_frames(int sock, int testcase)
 {
 	struct can_frame frame;
@@ -86,21 +56,16 @@ int send_can_frames(int sock, int testcase)
 	return 0;
 }
 
-TEST(can_filter)
+FIXTURE(can_filters) {
+	int sock;
+};
+
+FIXTURE_SETUP(can_filters)
 {
-	fd_set rdfs;
-	struct timeval tv;
-	int s;
 	struct sockaddr_can addr;
-	struct can_filter rfilter;
-	struct can_frame frame;
-	int testcase;
-	int have_rx;
-	int rx;
-	int rxbits, rxbitval;
-	int ret;
-	int recv_own_msgs = 1;
 	struct ifreq ifr;
+	int recv_own_msgs = 1;
+	int s, ret;
 
 	s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
 	ASSERT_LT(0, s)
@@ -121,74 +86,220 @@ TEST(can_filter)
 	ASSERT_EQ(0, ret)
 		TH_LOG("failed bind socket (%d)", errno);
 
-	for (testcase = 0; testcase < TC; testcase++) {
+	self->sock = s;
+}
+
+FIXTURE_TEARDOWN(can_filters)
+{
+	close(self->sock);
+}
 
-		rfilter.can_id   = calc_id(testcase);
-		rfilter.can_mask = calc_mask(testcase);
-		setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER,
-			   &rfilter, sizeof(rfilter));
+FIXTURE_VARIANT(can_filters) {
+	int testcase;
+	canid_t id;
+	canid_t mask;
+	int exp_num_rx;
+	int exp_rxbits;
+};
+
+FIXTURE_VARIANT_ADD(can_filters, base) {
+	.testcase = 1,
+	.id = ID,
+	.mask = CAN_SFF_MASK,
+	.exp_num_rx = 4,
+	.exp_rxbits = 4369,
+};
+FIXTURE_VARIANT_ADD(can_filters, base_eff) {
+	.testcase = 2,
+	.id = ID | CAN_EFF_FLAG,
+	.mask = CAN_SFF_MASK,
+	.exp_num_rx = 4,
+	.exp_rxbits = 4369,
+};
+FIXTURE_VARIANT_ADD(can_filters, base_rtr) {
+	.testcase = 3,
+	.id = ID | CAN_RTR_FLAG,
+	.mask = CAN_SFF_MASK,
+	.exp_num_rx = 4,
+	.exp_rxbits = 4369,
+};
+FIXTURE_VARIANT_ADD(can_filters, base_effrtr) {
+	.testcase = 4,
+	.id = ID | CAN_EFF_FLAG | CAN_RTR_FLAG,
+	.mask = CAN_SFF_MASK,
+	.exp_num_rx = 4,
+	.exp_rxbits = 4369,
+};
+
+FIXTURE_VARIANT_ADD(can_filters, filter_eff) {
+	.testcase = 5,
+	.id = ID,
+	.mask = CAN_SFF_MASK | CAN_EFF_FLAG,
+	.exp_num_rx = 2,
+	.exp_rxbits = 17,
+};
+FIXTURE_VARIANT_ADD(can_filters, filter_eff_eff) {
+	.testcase = 6,
+	.id = ID | CAN_EFF_FLAG,
+	.mask = CAN_SFF_MASK | CAN_EFF_FLAG,
+	.exp_num_rx = 2,
+	.exp_rxbits = 4352,
+};
+FIXTURE_VARIANT_ADD(can_filters, filter_eff_rtr) {
+	.testcase = 7,
+	.id = ID | CAN_RTR_FLAG,
+	.mask = CAN_SFF_MASK | CAN_EFF_FLAG,
+	.exp_num_rx = 2,
+	.exp_rxbits = 17,
+};
+FIXTURE_VARIANT_ADD(can_filters, filter_eff_effrtr) {
+	.testcase = 8,
+	.id = ID | CAN_EFF_FLAG | CAN_RTR_FLAG,
+	.mask = CAN_SFF_MASK | CAN_EFF_FLAG,
+	.exp_num_rx = 2,
+	.exp_rxbits = 4352,
+};
+
+FIXTURE_VARIANT_ADD(can_filters, filter_rtr) {
+	.testcase = 9,
+	.id = ID,
+	.mask = CAN_SFF_MASK | CAN_RTR_FLAG,
+	.exp_num_rx = 2,
+	.exp_rxbits = 257,
+};
+FIXTURE_VARIANT_ADD(can_filters, filter_rtr_eff) {
+	.testcase = 10,
+	.id = ID | CAN_EFF_FLAG,
+	.mask = CAN_SFF_MASK | CAN_RTR_FLAG,
+	.exp_num_rx = 2,
+	.exp_rxbits = 257,
+};
+FIXTURE_VARIANT_ADD(can_filters, filter_rtr_rtr) {
+	.testcase = 11,
+	.id = ID | CAN_RTR_FLAG,
+	.mask = CAN_SFF_MASK | CAN_RTR_FLAG,
+	.exp_num_rx = 2,
+	.exp_rxbits = 4112,
+};
+FIXTURE_VARIANT_ADD(can_filters, filter_rtr_effrtr) {
+	.testcase = 12,
+	.id = ID | CAN_EFF_FLAG | CAN_RTR_FLAG,
+	.mask = CAN_SFF_MASK | CAN_RTR_FLAG,
+	.exp_num_rx = 2,
+	.exp_rxbits = 4112,
+};
+
+FIXTURE_VARIANT_ADD(can_filters, filter_effrtr) {
+	.testcase = 13,
+	.id = ID,
+	.mask = CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG,
+	.exp_num_rx = 1,
+	.exp_rxbits = 1,
+};
+FIXTURE_VARIANT_ADD(can_filters, filter_effrtr_eff) {
+	.testcase = 14,
+	.id = ID | CAN_EFF_FLAG,
+	.mask = CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG,
+	.exp_num_rx = 1,
+	.exp_rxbits = 256,
+};
+FIXTURE_VARIANT_ADD(can_filters, filter_effrtr_rtr) {
+	.testcase = 15,
+	.id = ID | CAN_RTR_FLAG,
+	.mask = CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG,
+	.exp_num_rx = 1,
+	.exp_rxbits = 16,
+};
+FIXTURE_VARIANT_ADD(can_filters, filter_effrtr_effrtr) {
+	.testcase = 16,
+	.id = ID | CAN_EFF_FLAG | CAN_RTR_FLAG,
+	.mask = CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG,
+	.exp_num_rx = 1,
+	.exp_rxbits = 4096,
+};
+
+FIXTURE_VARIANT_ADD(can_filters, eff) {
+	.testcase = 17,
+	.id = ID,
+	.mask = CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG,
+	.exp_num_rx = 1,
+	.exp_rxbits = 1,
+};
+FIXTURE_VARIANT_ADD(can_filters, eff_eff) {
+	.testcase = 18,
+	.id = ID | CAN_EFF_FLAG,
+	.mask = CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG,
+	.exp_num_rx = 1,
+	.exp_rxbits = 256,
+};
+
+TEST_F(can_filters, test_filter)
+{
+	fd_set rdfs;
+	struct timeval tv;
+	struct can_filter rfilter;
+	struct can_frame frame;
+	int have_rx;
+	int rx;
+	int rxbits, rxbitval;
+	int ret;
 
-		TH_LOG("testcase %2d filters : can_id = 0x%08X can_mask = 0x%08X",
-		       testcase, rfilter.can_id, rfilter.can_mask);
+	rfilter.can_id = variant->id;
+	rfilter.can_mask = variant->mask;
+	setsockopt(self->sock, SOL_CAN_RAW, CAN_RAW_FILTER,
+		   &rfilter, sizeof(rfilter));
 
-		TH_LOG("testcase %2d sending patterns...", testcase);
+	TH_LOG("filters: can_id = 0x%08X can_mask = 0x%08X",
+		rfilter.can_id, rfilter.can_mask);
 
-		ret = send_can_frames(s, testcase);
-		ASSERT_EQ(0, ret)
-			TH_LOG("failed to send CAN frames");
+	ret = send_can_frames(self->sock, variant->testcase);
+	ASSERT_EQ(0, ret)
+		TH_LOG("failed to send CAN frames");
 
-		have_rx = 1;
-		rx = 0;
-		rxbits = 0;
+	rx = 0;
+	rxbits = 0;
 
-		while (have_rx) {
+	do {
+		have_rx = 0;
+		FD_ZERO(&rdfs);
+		FD_SET(self->sock, &rdfs);
+		tv.tv_sec = 0;
+		tv.tv_usec = 50000; /* 50ms timeout */
 
-			have_rx = 0;
-			FD_ZERO(&rdfs);
-			FD_SET(s, &rdfs);
-			tv.tv_sec = 0;
-			tv.tv_usec = 50000; /* 50ms timeout */
+		ret = select(self->sock + 1, &rdfs, NULL, NULL, &tv);
+		ASSERT_LE(0, ret)
+			TH_LOG("failed select for frame %d (%d)", rx, errno);
 
-			ret = select(s+1, &rdfs, NULL, NULL, &tv);
+		if (FD_ISSET(self->sock, &rdfs)) {
+			have_rx = 1;
+			ret = read(self->sock, &frame, sizeof(struct can_frame));
 			ASSERT_LE(0, ret)
-				TH_LOG("failed select for frame %d (%d)", rx, errno);
-
-			if (FD_ISSET(s, &rdfs)) {
-				have_rx = 1;
-				ret = read(s, &frame, sizeof(struct can_frame));
-				ASSERT_LE(0, ret)
-					TH_LOG("failed to read frame %d (%d)", rx, errno);
-
-				ASSERT_EQ(ID, frame.can_id & CAN_SFF_MASK)
-					TH_LOG("received wrong can_id");
-				ASSERT_EQ(testcase, frame.data[0])
-					TH_LOG("received wrong test case");
-
-				/* test & calc rxbits */
-				rxbitval = 1 << ((frame.can_id & (CAN_EFF_FLAG|CAN_RTR_FLAG|CAN_ERR_FLAG)) >> 28);
-
-				/* only receive a rxbitval once */
-				ASSERT_NE(rxbitval, rxbits & rxbitval)
-					TH_LOG("received rxbitval %d twice", rxbitval);
-				rxbits |= rxbitval;
-				rx++;
-
-				TH_LOG("testcase %2d rx : can_id = 0x%08X rx = %d rxbits = %d",
-				       testcase, frame.can_id, rx, rxbits);
-			}
+				TH_LOG("failed to read frame %d (%d)", rx, errno);
+
+			ASSERT_EQ(ID, frame.can_id & CAN_SFF_MASK)
+				TH_LOG("received wrong can_id");
+			ASSERT_EQ(variant->testcase, frame.data[0])
+				TH_LOG("received wrong test case");
+
+			/* test & calc rxbits */
+			rxbitval = 1 << ((frame.can_id & (CAN_EFF_FLAG|CAN_RTR_FLAG|CAN_ERR_FLAG)) >> 28);
+
+			/* only receive a rxbitval once */
+			ASSERT_NE(rxbitval, rxbits & rxbitval)
+				TH_LOG("received rxbitval %d twice", rxbitval);
+			rxbits |= rxbitval;
+			rx++;
+
+			TH_LOG("rx: can_id = 0x%08X rx = %d rxbits = %d",
+			       frame.can_id, rx, rxbits);
 		}
-		/* rx timed out -> check the received results */
-		ASSERT_EQ(rx_res[testcase], rx)
-			TH_LOG("wrong number of received frames %d", testcase);
-		ASSERT_EQ(rxbits_res[testcase], rxbits)
-			TH_LOG("wrong rxbits value in testcase %d", testcase);
-
-		TH_LOG("testcase %2d ok", testcase);
-		TH_LOG("---");
-	}
+	} while (have_rx);
 
-	close(s);
-	return;
+	/* rx timed out -> check the received results */
+	ASSERT_EQ(variant->exp_num_rx, rx)
+		TH_LOG("wrong number of received frames");
+	ASSERT_EQ(variant->exp_rxbits, rxbits)
+		TH_LOG("wrong rxbits value");
 }
 
 TEST_HARNESS_MAIN
-- 
2.49.0


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ