[libcamera-devel] [PATCH v2 4/4] test: MediaDevice: Add link exercise test

Jacopo Mondi jacopo at jmondi.org
Tue Jan 8 18:04:07 CET 2019


Add test function to exercise the link handling abilities of the media
device.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
v1->v2:
- Make the link handling test work only on vimc as operating on a known
  graph makes it possible to identify unexpected results.

 test/media_device/media_device_test.cpp | 147 +++++++++++++++++++++++-
 1 file changed, 143 insertions(+), 4 deletions(-)

diff --git a/test/media_device/media_device_test.cpp b/test/media_device/media_device_test.cpp
index c482b2e..2b2f5cd 100644
--- a/test/media_device/media_device_test.cpp
+++ b/test/media_device/media_device_test.cpp
@@ -42,8 +42,145 @@ private:
 	void printMediaGraph(const MediaDevice &media, ostream &os);
 	void printLinkFlags(const MediaLink *link, ostream &os);
 	void printNode(const MediaPad *pad, ostream &os);
+
+	int exerciseLinks(MediaDevice &media);
 };

+/*
+ * Exercise the link handling interface.
+ *
+ * Try to get existing and non-existing links, and try to enable
+ * disable links.
+ *
+ * WARNING: this test only runs on VIMC, as a known media graph allows
+ * the test to exercise known links and verify the result of operations
+ * known to fail or succeed. If the 'vimc' driver is not loaded, the test is
+ * skipped.
+ */
+int MediaDeviceTest::exerciseLinks(MediaDevice &media)
+{
+	if (media.driver() != "vimc")
+		return TestSkip;
+
+	/* First of all reset all links in the media graph. */
+	int ret = media.resetLinks();
+	if (ret)
+		return ret;
+
+	/*
+	 * Test if link can be consistently retrieved through the different
+	 * methods the media device offers.
+	 */
+	MediaLink *link = media.link("Debayer A", 1, "Scaler", 0);
+	if (!link) {
+		cerr << "Unable to find link \"Debayer A\"[1] -> \"Scaler\"[0]"
+		     << endl << "This link exists in VIMC media graph" << endl;
+		return TestFail;
+	}
+
+	MediaEntity *source = media.getEntityByName("Debayer A");
+	if (!source) {
+		cerr << "Unable to find entity \"Debayer A\"" << endl;
+		return TestFail;
+	}
+
+	MediaEntity *sink = media.getEntityByName("Scaler");
+	if (!sink) {
+		cerr << "Unable to find entity \"Scaler\"" << endl;
+		return TestFail;
+	}
+
+	MediaLink *link2 = media.link(source, 1, sink, 0);
+	if (!link2) {
+		cerr << "Unable to find link \"Debayer A\"[1] -> \"Scaler\"[0]"
+		     << endl << "This link exists in VIMC media graph" << endl;
+		return TestFail;
+	}
+
+	if (link != link2) {
+		cerr << "The returned link does not match what was expected"
+		     << endl;
+		return TestFail;
+	}
+
+	link2 = media.link(source->getPadByIndex(1), sink->getPadByIndex(0));
+	if (!link2) {
+		cerr << "Unable to find link \"Debayer A\"[1] -> \"Scaler\"[0]"
+		     << endl << "This link exists in VIMC media graph" << endl;
+		return TestFail;
+	}
+
+	if (link != link2) {
+		cerr << "The returned link does not match what was expected"
+		     << endl;
+		return TestFail;
+	}
+
+	/* After reset the link shall not be enabled. */
+	if (link->flags() & MEDIA_LNK_FL_ENABLED) {
+		cerr << "Link \"Debayer A\"[1] -> \"Scaler\"[0]"
+		     << " should not be enabled after a media device reset"
+		     << endl;
+		return TestFail;
+	}
+
+	/* Enable the link and test if enabling was successful. */
+	ret = link->setEnable(true);
+	if (ret)
+		return TestFail;
+
+	if (!(link->flags() & MEDIA_LNK_FL_ENABLED)) {
+		cerr << "Link \"Debayer A\"[1] -> \"Scaler\"[0]"
+		     << " should now be enabled" << endl;
+		return TestFail;
+	}
+
+	/* Disable the link and test if disabling was successful. */
+	ret = link->setEnable(false);
+	if (ret)
+		return TestFail;
+
+	if (link->flags() & MEDIA_LNK_FL_ENABLED) {
+		cerr << "Link \"Debayer A\"[1] -> \"Scaler\"[0]"
+		     << " should now be disabled" << endl;
+		return TestFail;
+	}
+
+	/* Try to get a non existing link. */
+	link = media.link("Sensor A", 1, "Scaler", 0);
+	if (link) {
+		cerr << "Link \"Sensor A\"[1] -> \"Scaler\"[0]"
+		     << " does not exist but something was returned"
+		     << endl;
+		return TestFail;
+	}
+
+	/* Now get an immutable link and try to disable it. */
+	link = media.link("Sensor A", 0, "Raw Capture 0", 0);
+	if (!link) {
+		cerr << "Unable to find link \"Sensor A\"[0] -> "
+		     << "\"Raw Capture 0\"[0]"
+		     << endl << "This link exists in VIMC media graph" << endl;
+		return TestFail;
+	}
+
+	if (!(link->flags() & MEDIA_LNK_FL_IMMUTABLE)) {
+		cerr << "Link \"Sensor A\"[0] -> \"Raw Capture 0\"[0]"
+		     << " should have been 'IMMUTABLE'" << endl;
+		return TestFail;
+	}
+
+	/* Disabling an immutable link shall fail. */
+	ret = link->setEnable(false);
+	if (!ret) {
+		cerr << "Link \"Sensor A\"[0] -> \"Raw Capture 0\"[0]"
+		     << " is 'IMMUTABLE', it shouldn't be disabled" << endl;
+		return TestFail;
+	}
+
+	return 0;
+}
+
 void MediaDeviceTest::printNode(const MediaPad *pad, ostream &os)
 {
 	const MediaEntity *entity = pad->entity();
@@ -136,11 +273,14 @@ int MediaDeviceTest::testMediaDevice(const string devnode)

 	/* Run tests in sequence. */
 	printMediaGraph(dev, cerr);
+
+	ret = exerciseLinks(dev);
+
 	/* TODO: add more tests here. */

 	dev.close();

-	return 0;
+	return ret;
 }

 /* Run tests on all media devices. */
@@ -149,7 +289,7 @@ int MediaDeviceTest::run()
 {
 	const string devnode("/dev/media");
 	unsigned int i;
-	int ret = 77; /* skip test exit code */
+	int ret = TestSkip;

 	/*
 	 * Run the test sequence on all media device found in the
@@ -163,9 +303,8 @@ int MediaDeviceTest::run()
 			continue;

 		ret = testMediaDevice(mediadev);
-		if (ret)
+		if (ret && ret != TestSkip)
 			return ret;
-
 	}

 	return ret;
--
2.20.1



More information about the libcamera-devel mailing list