summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/meson.build1
-rw-r--r--test/pipeline/ipu3/ipu3_pipeline_test.cpp130
-rw-r--r--test/pipeline/ipu3/meson.build11
-rw-r--r--test/pipeline/meson.build1
4 files changed, 143 insertions, 0 deletions
diff --git a/test/meson.build b/test/meson.build
index fb6b115e..8cdcae2c 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -1,6 +1,7 @@
subdir('libtest')
subdir('media_device')
+subdir('pipeline')
subdir('v4l2_device')
public_tests = [
diff --git a/test/pipeline/ipu3/ipu3_pipeline_test.cpp b/test/pipeline/ipu3/ipu3_pipeline_test.cpp
new file mode 100644
index 00000000..5dbf0206
--- /dev/null
+++ b/test/pipeline/ipu3/ipu3_pipeline_test.cpp
@@ -0,0 +1,130 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * ipu3_pipeline_test.cpp - Intel IPU3 pipeline test
+ */
+
+#include <iostream>
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <libcamera/camera.h>
+#include <libcamera/camera_manager.h>
+
+#include "device_enumerator.h"
+#include "media_device.h"
+#include "media_object.h"
+#include "test.h"
+
+using namespace std;
+using namespace libcamera;
+
+/*
+ * Verify that the Intel IPU3 pipeline handler gets matched and cameras
+ * are enumerated correctly.
+ *
+ * The test is supposed to be run on an IPU3 platform, otherwise it gets
+ * skipped.
+ *
+ * The test lists all cameras registered in the system, if any camera is
+ * available at all.
+ */
+class IPU3PipelineTest : public Test
+{
+protected:
+ int init();
+ int run();
+ void cleanup();
+
+private:
+ CameraManager *cameraManager_;
+ unsigned int sensors_;
+};
+
+int IPU3PipelineTest::init()
+{
+ unique_ptr<DeviceEnumerator> enumerator = DeviceEnumerator::create();
+ if (!enumerator) {
+ cerr << "Failed to create device enumerator" << endl;
+ return TestFail;
+ }
+
+ if (enumerator->enumerate()) {
+ cerr << "Failed to enumerate media devices" << endl;
+ return TestFail;
+ }
+
+ DeviceMatch imgu_dm("ipu3-imgu");
+ DeviceMatch cio2_dm("ipu3-cio2");
+
+ if (!enumerator->search(imgu_dm)) {
+ cerr << "Failed to find IPU3 IMGU: test skip" << endl;
+ return TestSkip;
+ }
+
+ MediaDevice *cio2 = enumerator->search(cio2_dm);
+ if (!cio2) {
+ cerr << "Failed to find IPU3 CIO2: test skip" << endl;
+ return TestSkip;
+ }
+
+ if (cio2->open()) {
+ cerr << "Failed to open media device " << cio2->devnode() << endl;
+ return TestFail;
+ }
+
+ /*
+ * Camera sensor are connected to the CIO2 unit.
+ * Count how many sensors are connected in the system
+ * and later verify this matches the number of registered
+ * cameras.
+ */
+ int ret = cio2->populate();
+ if (ret) {
+ cerr << "Failed to populate media device " << cio2->devnode() << endl;
+ return TestFail;
+ }
+
+ sensors_ = 0;
+ const vector<MediaEntity *> &entities = cio2->entities();
+ for (MediaEntity *entity : entities) {
+ if (entity->function() == MEDIA_ENT_F_CAM_SENSOR)
+ sensors_++;
+ }
+
+ enumerator.reset(nullptr);
+
+ cameraManager_ = CameraManager::instance();
+ ret = cameraManager_->start();
+ if (ret) {
+ cerr << "Failed to start the CameraManager" << endl;
+ return TestFail;
+ }
+
+ return 0;
+}
+
+int IPU3PipelineTest::run()
+{
+ auto cameras = cameraManager_->cameras();
+ for (const std::shared_ptr<Camera> &cam : cameras)
+ cout << "Found camera '" << cam->name() << "'" << endl;
+
+ if (cameras.size() != sensors_) {
+ cerr << cameras.size() << " cameras registered, but " << sensors_
+ << " were expected" << endl;
+ return TestFail;
+ }
+
+ return TestPass;
+}
+
+void IPU3PipelineTest::cleanup()
+{
+ cameraManager_->stop();
+}
+
+TEST_REGISTER(IPU3PipelineTest)
diff --git a/test/pipeline/ipu3/meson.build b/test/pipeline/ipu3/meson.build
new file mode 100644
index 00000000..caba5c74
--- /dev/null
+++ b/test/pipeline/ipu3/meson.build
@@ -0,0 +1,11 @@
+ipu3_test = [
+ ['ipu3_pipeline_test', 'ipu3_pipeline_test.cpp'],
+]
+
+foreach t : ipu3_test
+ exe = executable(t[0], t[1],
+ link_with : test_libraries,
+ include_directories : test_includes_internal)
+
+ test(t[0], exe, suite: 'ipu3', is_parallel: false)
+endforeach
diff --git a/test/pipeline/meson.build b/test/pipeline/meson.build
new file mode 100644
index 00000000..f434c79c
--- /dev/null
+++ b/test/pipeline/meson.build
@@ -0,0 +1 @@
+subdir('ipu3')