diff options
Diffstat (limited to 'test/pipeline/ipu3')
-rw-r--r-- | test/pipeline/ipu3/ipu3_pipeline_test.cpp | 130 | ||||
-rw-r--r-- | test/pipeline/ipu3/meson.build | 11 |
2 files changed, 141 insertions, 0 deletions
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 |