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 <[email protected]>
---
 .../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


Reply via email to