diff --git a/test/list-cameras.cpp b/test/list-cameras.cpp
index e2026c9..c9dc199 100644
--- a/test/list-cameras.cpp
+++ b/test/list-cameras.cpp
@@ -7,6 +7,7 @@
 
 #include <iostream>
 
+#include <libcamera/camera.h>
 #include <libcamera/camera_manager.h>
 
 #include "test.h"
@@ -14,27 +15,55 @@
 using namespace std;
 using namespace libcamera;
 
+/*
+ * List all cameras registered in the system, using the CameraManager.
+ *
+ * In order for the test to run successfully, a pipeline handler supporting
+ * the current test platform should be available in the library.
+ * Libcamera provides a platform-agnostic pipeline handler for the 'vimc'
+ * virtual media device, which can be used for testing purposes.
+ *
+ * The test tries to list all cameras registered in the system, if no
+ * camera is found the test is skipped. If the test gets skipped on a
+ * platform where a pipeline handler is known to be available, an error
+ * in camera enumeration might get unnoticed.
+ */
 class ListTest : public Test
 {
 protected:
 	int init()
 	{
 		cm = CameraManager::instance();
-		cm->start();
+
+		int ret = cm->start();
+		if (ret) {
+			cerr << "Failed to start the CameraManager" << endl;
+			return TestFail;
+		}
 
 		return 0;
 	}
 
 	int run()
 	{
-		unsigned int count = 0;
+		vector<string> cameraList = cm->list();
+		if (cameraList.empty()) {
+			cerr << "No cameras registered in the system: test skip" << endl
+			     << "This might be expected if no pipeline handler supports the testing platform" << endl;
+			return TestSkip;
+		}
+
+		for (auto name : cameraList) {
+			Camera *cam = cm->get(name);
+			if (!cam) {
+				cerr << "Failed to get camera '" << name << "' by name" << endl;
+				return TestFail;
+			}
 
-		for (auto name : cm->list()) {
-			cout << "- " << name << endl;
-			count++;
+			cout << "Found camera '" << cam->name() << "'" << endl;
 		}
 
-		return count ? 0 : -ENODEV;
+		return TestPass;
 	}
 
 	void cleanup()
