[libcamera-devel] [PATCH 2/2] test: gstreamer: Check availability of cameras before running

Umang Jain umang.jain at ideasonboard.com
Thu Jul 21 15:45:31 CEST 2022


Move the logic for checking the availability of cameras from
multi_stream_test to gstreamer test base class. Since
single_stream_class always assumes that a camera is available on the
system (which is not always the case for e.g. RPi in CI/CD environments)
it makes sense to have the availability check in the base class.
If no cameras are available, the behaviour should be to skip instead
of a failure.

We currently have 2 tests for gstreamer differing based on number
of streams supported by the camera. Hence, the camera availability
is checked in conjunction with the number of the streams required by
the derived class.

Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
---
 .../gstreamer/gstreamer_multi_stream_test.cpp | 20 +----------
 test/gstreamer/gstreamer_test.cpp             | 33 ++++++++++++++++++-
 test/gstreamer/gstreamer_test.h               |  4 ++-
 3 files changed, 36 insertions(+), 21 deletions(-)

diff --git a/test/gstreamer/gstreamer_multi_stream_test.cpp b/test/gstreamer/gstreamer_multi_stream_test.cpp
index 112f1dee..b8387c10 100644
--- a/test/gstreamer/gstreamer_multi_stream_test.cpp
+++ b/test/gstreamer/gstreamer_multi_stream_test.cpp
@@ -29,7 +29,7 @@ class GstreamerMultiStreamTest : public GstreamerTest, public Test
 {
 public:
 	GstreamerMultiStreamTest()
-		: GstreamerTest()
+		: GstreamerTest(2)
 	{
 	}
 
@@ -39,24 +39,6 @@ protected:
 		if (status_ != TestPass)
 			return status_;
 
-		/* Check if platform supports multistream capture */
-		libcamera::CameraManager cm;
-		cm.start();
-		bool cameraFound = false;
-		for (auto &camera : cm.cameras()) {
-			if (camera->streams().size() > 1) {
-				cameraName_ = camera->id();
-				cameraFound = true;
-				cm.stop();
-				break;
-			}
-		}
-
-		if (!cameraFound) {
-			cm.stop();
-			return TestSkip;
-		}
-
 		const gchar *streamDescription = "queue ! fakesink";
 		g_autoptr(GError) error = NULL;
 
diff --git a/test/gstreamer/gstreamer_test.cpp b/test/gstreamer/gstreamer_test.cpp
index cfb8afc6..4668aa00 100644
--- a/test/gstreamer/gstreamer_test.cpp
+++ b/test/gstreamer/gstreamer_test.cpp
@@ -5,6 +5,7 @@
  * libcamera Gstreamer element API tests
  */
 
+#include <libcamera/libcamera.h>
 #include <libcamera/base/utils.h>
 
 #include "gstreamer_test.h"
@@ -25,9 +26,10 @@ const char *__asan_default_options()
 }
 }
 
-GstreamerTest::GstreamerTest()
+GstreamerTest::GstreamerTest(unsigned int numStreams)
 	: pipeline_(nullptr), libcameraSrc_(nullptr)
 {
+
 	/*
 	* GStreamer by default spawns a process to run the
 	* gst-plugin-scanner helper. If libcamera is compiled with ASan
@@ -67,9 +69,38 @@ GstreamerTest::GstreamerTest()
 		return;
 	}
 
+	/*
+	 * Atleast one camera should be available with numStreams streams
+	 * otherwise, skip the test entirely.
+	 */
+	if (!satisfyCameraStreams(numStreams)) {
+		status_ = TestSkip;
+		return;
+	}
+
 	status_ = TestPass;
 }
 
+bool GstreamerTest::satisfyCameraStreams(unsigned int numStreams)
+{
+	libcamera::CameraManager cm;
+	bool cameraFound = false;
+
+	cm.start();
+
+	for (auto &camera : cm.cameras()) {
+		if (camera->streams().size() < numStreams)
+			continue;
+
+		cameraFound = true;
+		break;
+	}
+
+	cm.stop();
+
+	return cameraFound;
+}
+
 GstreamerTest::~GstreamerTest()
 {
 	g_clear_object(&pipeline_);
diff --git a/test/gstreamer/gstreamer_test.h b/test/gstreamer/gstreamer_test.h
index 35adab0e..fa41721f 100644
--- a/test/gstreamer/gstreamer_test.h
+++ b/test/gstreamer/gstreamer_test.h
@@ -15,7 +15,7 @@
 class GstreamerTest
 {
 public:
-	GstreamerTest();
+	GstreamerTest(unsigned int numStreams = 1);
 	virtual ~GstreamerTest();
 
 protected:
@@ -27,4 +27,6 @@ protected:
 	GstElement *pipeline_;
 	GstElement *libcameraSrc_;
 	int status_;
+private:
+	bool satisfyCameraStreams(unsigned int numStreams);
 };
-- 
2.31.1



More information about the libcamera-devel mailing list