Every fixture opens /dev/pci-endpoint-test.0 and asserts on the result,
so on a machine that has no PCI endpoint test device all 17 cases fail
in fixture setup rather than reporting that the hardware is not there.

Check for the device once before handing over to the harness. Doing it
there rather than in each of the four fixtures keeps it to a single skip,
and leaves the fixtures to fail as before on an open that goes wrong for
any other reason, which is not something to skip over.

The harness parses its own arguments inside test_harness_run(), so only
the plain invocation, the one kselftest makes, turns into a skip, -l and
-h keep working on a machine without the device.

Signed-off-by: Eva Kurchatova <[email protected]>
---
 .../selftests/pci_endpoint/pci_endpoint_test.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/pci_endpoint/pci_endpoint_test.c 
b/tools/testing/selftests/pci_endpoint/pci_endpoint_test.c
index 588d75c97ad1..efec4a84aa15 100644
--- a/tools/testing/selftests/pci_endpoint/pci_endpoint_test.c
+++ b/tools/testing/selftests/pci_endpoint/pci_endpoint_test.c
@@ -286,4 +286,20 @@ TEST_F(pcie_ep_doorbell, DOORBELL_TEST)
                SKIP(return, "Doorbell test is not supported");
        EXPECT_FALSE(ret) TH_LOG("Test failed for Doorbell\n");
 }
-TEST_HARNESS_MAIN
+
+static bool test_device_available(void)
+{
+       return access(test_device, F_OK) == 0;
+}
+
+int main(int argc, char **argv)
+{
+       /*
+        * Only the plain invocation, which is the one kselftest uses, turns
+        * into a skip, so that -l and -h keep working without the hardware.
+        */
+       if (argc == 1 && !test_device_available())
+               ksft_exit_skip("no PCI endpoint test device %s\n", test_device);
+
+       return test_harness_run(argc, argv);
+}
-- 
2.55.0


Reply via email to