[libcamera-devel,v3,1/1] rkisp1: add pipeline test for rkisp1

Message ID 20200108083003.16428-2-show.liu@linaro.org
State Accepted
Headers show
Series
  • rkisp1 pipeline test tool
Related show

Commit Message

Show Liu Jan. 8, 2020, 8:30 a.m. UTC
Signed-off-by: Show Liu <show.liu@linaro.org>
---
 test/pipeline/meson.build                     |   1 +
 test/pipeline/rkisp1/meson.build              |  12 ++
 test/pipeline/rkisp1/rkisp1_pipeline_test.cpp | 114 ++++++++++++++++++
 3 files changed, 127 insertions(+)
 create mode 100644 test/pipeline/rkisp1/meson.build
 create mode 100644 test/pipeline/rkisp1/rkisp1_pipeline_test.cpp

Comments

Kieran Bingham Jan. 9, 2020, 11:40 a.m. UTC | #1
Hi Show,

On 08/01/2020 08:30, Show Liu wrote:

The commit log has been lost from the previous version.
I will add the following (slightly modified) back in when applying:

Add an initial simple test tool for the rkisp1 pipeline based upon the
IPU3 pipeline test.

Otherwise, I believe this looks good

Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>


Some time in the future I hope we can have a generic PipelineHandler
validation which can re-use a lot of code - but for now I think this is
fine, and will get things started.

When we know what code is duplicated, we can refactor accordingly.

> Signed-off-by: Show Liu <show.liu@linaro.org>
> ---
>  test/pipeline/meson.build                     |   1 +
>  test/pipeline/rkisp1/meson.build              |  12 ++
>  test/pipeline/rkisp1/rkisp1_pipeline_test.cpp | 114 ++++++++++++++++++
>  3 files changed, 127 insertions(+)
>  create mode 100644 test/pipeline/rkisp1/meson.build
>  create mode 100644 test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
> 
> diff --git a/test/pipeline/meson.build b/test/pipeline/meson.build
> index f434c79..157f789 100644
> --- a/test/pipeline/meson.build
> +++ b/test/pipeline/meson.build
> @@ -1 +1,2 @@
>  subdir('ipu3')
> +subdir('rkisp1')
> diff --git a/test/pipeline/rkisp1/meson.build b/test/pipeline/rkisp1/meson.build
> new file mode 100644
> index 0000000..d3f9749
> --- /dev/null
> +++ b/test/pipeline/rkisp1/meson.build
> @@ -0,0 +1,12 @@
> +rkisp1_test = [
> +    ['rkisp1_pipeline_test',            'rkisp1_pipeline_test.cpp'],
> +]
> +
> +foreach t : rkisp1_test
> +    exe = executable(t[0], t[1],
> +                     dependencies : libcamera_dep,
> +                     link_with : test_libraries,
> +                     include_directories : test_includes_internal)
> +
> +    test(t[0], exe, suite : 'rkisp1', is_parallel : false)
> +endforeach
> diff --git a/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
> new file mode 100644
> index 0000000..91a4772
> --- /dev/null
> +++ b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
> @@ -0,0 +1,114 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +/*
> + * Copyright (C) 2020, Linaro
> + *
> + * Based on test/pipeline/ipu3/ipu3_pipeline_test.cpp
> + *
> + * rkisp1_pipeline_test.cpp - Rockchip RK3399 rkisp1 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 RK3399 pipeline handler gets matched and cameras
> + * are enumerated correctly.
> + *
> + * The test is supposed to be run on rockchip platform.
> + *
> + * The test lists all cameras registered in the system, if any camera is
> + * available at all.
> + */
> +class RKISP1PipelineTest : public Test
> +{
> +protected:
> +	int init();
> +	int run();
> +	void cleanup();
> +
> +private:
> +	CameraManager *cameraManager_;
> +	unsigned int sensors_;
> +};
> +
> +int RKISP1PipelineTest::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 dm("rkisp1");
> +
> +	std::shared_ptr<MediaDevice> rkisp1 = enumerator->search(dm);
> +	if (!rkisp1) {
> +		cerr << "Failed to find rkisp1: test skip" << endl;
> +		return TestSkip;
> +	}
> +
> +	int ret = rkisp1->populate();
> +	if (ret) {
> +		cerr << "Failed to populate media device "
> +			<< rkisp1->deviceNode() << endl;
> +		return TestFail;
> +	}
> +
> +	sensors_ = 0;
> +	const vector<MediaEntity *> &entities = rkisp1->entities();
> +	for (MediaEntity *entity : entities) {
> +		if (entity->function() == MEDIA_ENT_F_CAM_SENSOR)
> +			sensors_++;
> +	}
> +
> +	cameraManager_ = new CameraManager();
> +	ret = cameraManager_->start();
> +	if (ret) {
> +		cerr << "Failed to start the CameraManager" << endl;
> +		return TestFail;
> +	}
> +
> +	return 0;
> +}
> +
> +int RKISP1PipelineTest::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 RKISP1PipelineTest::cleanup()
> +{
> +	cameraManager_->stop();
> +	delete cameraManager_;
> +}
> +
> +TEST_REGISTER(RKISP1PipelineTest)
>
Show Liu Jan. 10, 2020, 1:12 a.m. UTC | #2
Hi Kieran,



On Thu, Jan 9, 2020 at 7:40 PM Kieran Bingham <
kieran.bingham@ideasonboard.com> wrote:

> Hi Show,
>
> On 08/01/2020 08:30, Show Liu wrote:
>
> The commit log has been lost from the previous version.
> I will add the following (slightly modified) back in when applying:
>
> Add an initial simple test tool for the rkisp1 pipeline based upon the
> IPU3 pipeline test.
>
OK. Thanks.

>
> Otherwise, I believe this looks good
>
> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
>
>
> Some time in the future I hope we can have a generic PipelineHandler
> validation which can re-use a lot of code

Agree.  I am also thinking about it since Laurent mentioned previously.


> - but for now I think this is
> fine, and will get things started.
>

> When we know what code is duplicated, we can refactor accordingly.
>
> > Signed-off-by: Show Liu <show.liu@linaro.org>
> > ---
> >  test/pipeline/meson.build                     |   1 +
> >  test/pipeline/rkisp1/meson.build              |  12 ++
> >  test/pipeline/rkisp1/rkisp1_pipeline_test.cpp | 114 ++++++++++++++++++
> >  3 files changed, 127 insertions(+)
> >  create mode 100644 test/pipeline/rkisp1/meson.build
> >  create mode 100644 test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
> >
> > diff --git a/test/pipeline/meson.build b/test/pipeline/meson.build
> > index f434c79..157f789 100644
> > --- a/test/pipeline/meson.build
> > +++ b/test/pipeline/meson.build
> > @@ -1 +1,2 @@
> >  subdir('ipu3')
> > +subdir('rkisp1')
> > diff --git a/test/pipeline/rkisp1/meson.build
> b/test/pipeline/rkisp1/meson.build
> > new file mode 100644
> > index 0000000..d3f9749
> > --- /dev/null
> > +++ b/test/pipeline/rkisp1/meson.build
> > @@ -0,0 +1,12 @@
> > +rkisp1_test = [
> > +    ['rkisp1_pipeline_test',            'rkisp1_pipeline_test.cpp'],
> > +]
> > +
> > +foreach t : rkisp1_test
> > +    exe = executable(t[0], t[1],
> > +                     dependencies : libcamera_dep,
> > +                     link_with : test_libraries,
> > +                     include_directories : test_includes_internal)
> > +
> > +    test(t[0], exe, suite : 'rkisp1', is_parallel : false)
> > +endforeach
> > diff --git a/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
> b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
> > new file mode 100644
> > index 0000000..91a4772
> > --- /dev/null
> > +++ b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
> > @@ -0,0 +1,114 @@
> > +/* SPDX-License-Identifier: GPL-2.0-or-later */
> > +/*
> > + * Copyright (C) 2020, Linaro
> > + *
> > + * Based on test/pipeline/ipu3/ipu3_pipeline_test.cpp
> > + *
> > + * rkisp1_pipeline_test.cpp - Rockchip RK3399 rkisp1 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 RK3399 pipeline handler gets matched and cameras
> > + * are enumerated correctly.
> > + *
> > + * The test is supposed to be run on rockchip platform.
> > + *
> > + * The test lists all cameras registered in the system, if any camera is
> > + * available at all.
> > + */
> > +class RKISP1PipelineTest : public Test
> > +{
> > +protected:
> > +     int init();
> > +     int run();
> > +     void cleanup();
> > +
> > +private:
> > +     CameraManager *cameraManager_;
> > +     unsigned int sensors_;
> > +};
> > +
> > +int RKISP1PipelineTest::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 dm("rkisp1");
> > +
> > +     std::shared_ptr<MediaDevice> rkisp1 = enumerator->search(dm);
> > +     if (!rkisp1) {
> > +             cerr << "Failed to find rkisp1: test skip" << endl;
> > +             return TestSkip;
> > +     }
> > +
> > +     int ret = rkisp1->populate();
> > +     if (ret) {
> > +             cerr << "Failed to populate media device "
> > +                     << rkisp1->deviceNode() << endl;
> > +             return TestFail;
> > +     }
> > +
> > +     sensors_ = 0;
> > +     const vector<MediaEntity *> &entities = rkisp1->entities();
> > +     for (MediaEntity *entity : entities) {
> > +             if (entity->function() == MEDIA_ENT_F_CAM_SENSOR)
> > +                     sensors_++;
> > +     }
> > +
> > +     cameraManager_ = new CameraManager();
> > +     ret = cameraManager_->start();
> > +     if (ret) {
> > +             cerr << "Failed to start the CameraManager" << endl;
> > +             return TestFail;
> > +     }
> > +
> > +     return 0;
> > +}
> > +
> > +int RKISP1PipelineTest::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 RKISP1PipelineTest::cleanup()
> > +{
> > +     cameraManager_->stop();
> > +     delete cameraManager_;
> > +}
> > +
> > +TEST_REGISTER(RKISP1PipelineTest)
> >
>
> --
> Regards
> --
> Kieran
>
Kieran Bingham Jan. 13, 2020, 11:02 p.m. UTC | #3
Hi Show,

Thank you,

This is now pushed to master.
--
Regards

Kieran



On 10/01/2020 01:12, Show Liu wrote:
> Hi Kieran,
> 
> 
> 
> On Thu, Jan 9, 2020 at 7:40 PM Kieran Bingham
> <kieran.bingham@ideasonboard.com
> <mailto:kieran.bingham@ideasonboard.com>> wrote:
> 
>     Hi Show,
> 
>     On 08/01/2020 08:30, Show Liu wrote:
> 
>     The commit log has been lost from the previous version.
>     I will add the following (slightly modified) back in when applying:
> 
>     Add an initial simple test tool for the rkisp1 pipeline based upon the
>     IPU3 pipeline test.
> 
> OK. Thanks. 
> 
> 
>     Otherwise, I believe this looks good
> 
>     Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com
>     <mailto:kieran.bingham@ideasonboard.com>>
> 
> 
>     Some time in the future I hope we can have a generic PipelineHandler
>     validation which can re-use a lot of code
> 
> Agree.  I am also thinking about it since Laurent mentioned previously.
>  
> 
>     - but for now I think this is
>     fine, and will get things started.
> 
> 
>     When we know what code is duplicated, we can refactor accordingly.
> 
>     > Signed-off-by: Show Liu <show.liu@linaro.org
>     <mailto:show.liu@linaro.org>>
>     > ---
>     >  test/pipeline/meson.build                     |   1 +
>     >  test/pipeline/rkisp1/meson.build              |  12 ++
>     >  test/pipeline/rkisp1/rkisp1_pipeline_test.cpp | 114
>     ++++++++++++++++++
>     >  3 files changed, 127 insertions(+)
>     >  create mode 100644 test/pipeline/rkisp1/meson.build
>     >  create mode 100644 test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
>     >
>     > diff --git a/test/pipeline/meson.build b/test/pipeline/meson.build
>     > index f434c79..157f789 100644
>     > --- a/test/pipeline/meson.build
>     > +++ b/test/pipeline/meson.build
>     > @@ -1 +1,2 @@
>     >  subdir('ipu3')
>     > +subdir('rkisp1')
>     > diff --git a/test/pipeline/rkisp1/meson.build
>     b/test/pipeline/rkisp1/meson.build
>     > new file mode 100644
>     > index 0000000..d3f9749
>     > --- /dev/null
>     > +++ b/test/pipeline/rkisp1/meson.build
>     > @@ -0,0 +1,12 @@
>     > +rkisp1_test = [
>     > +    ['rkisp1_pipeline_test',            'rkisp1_pipeline_test.cpp'],
>     > +]
>     > +
>     > +foreach t : rkisp1_test
>     > +    exe = executable(t[0], t[1],
>     > +                     dependencies : libcamera_dep,
>     > +                     link_with : test_libraries,
>     > +                     include_directories : test_includes_internal)
>     > +
>     > +    test(t[0], exe, suite : 'rkisp1', is_parallel : false)
>     > +endforeach
>     > diff --git a/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
>     b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
>     > new file mode 100644
>     > index 0000000..91a4772
>     > --- /dev/null
>     > +++ b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
>     > @@ -0,0 +1,114 @@
>     > +/* SPDX-License-Identifier: GPL-2.0-or-later */
>     > +/*
>     > + * Copyright (C) 2020, Linaro
>     > + *
>     > + * Based on test/pipeline/ipu3/ipu3_pipeline_test.cpp
>     > + *
>     > + * rkisp1_pipeline_test.cpp - Rockchip RK3399 rkisp1 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 RK3399 pipeline handler gets matched and cameras
>     > + * are enumerated correctly.
>     > + *
>     > + * The test is supposed to be run on rockchip platform.
>     > + *
>     > + * The test lists all cameras registered in the system, if any
>     camera is
>     > + * available at all.
>     > + */
>     > +class RKISP1PipelineTest : public Test
>     > +{
>     > +protected:
>     > +     int init();
>     > +     int run();
>     > +     void cleanup();
>     > +
>     > +private:
>     > +     CameraManager *cameraManager_;
>     > +     unsigned int sensors_;
>     > +};
>     > +
>     > +int RKISP1PipelineTest::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 dm("rkisp1");
>     > +
>     > +     std::shared_ptr<MediaDevice> rkisp1 = enumerator->search(dm);
>     > +     if (!rkisp1) {
>     > +             cerr << "Failed to find rkisp1: test skip" << endl;
>     > +             return TestSkip;
>     > +     }
>     > +
>     > +     int ret = rkisp1->populate();
>     > +     if (ret) {
>     > +             cerr << "Failed to populate media device "
>     > +                     << rkisp1->deviceNode() << endl;
>     > +             return TestFail;
>     > +     }
>     > +
>     > +     sensors_ = 0;
>     > +     const vector<MediaEntity *> &entities = rkisp1->entities();
>     > +     for (MediaEntity *entity : entities) {
>     > +             if (entity->function() == MEDIA_ENT_F_CAM_SENSOR)
>     > +                     sensors_++;
>     > +     }
>     > +
>     > +     cameraManager_ = new CameraManager();
>     > +     ret = cameraManager_->start();
>     > +     if (ret) {
>     > +             cerr << "Failed to start the CameraManager" << endl;
>     > +             return TestFail;
>     > +     }
>     > +
>     > +     return 0;
>     > +}
>     > +
>     > +int RKISP1PipelineTest::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 RKISP1PipelineTest::cleanup()
>     > +{
>     > +     cameraManager_->stop();
>     > +     delete cameraManager_;
>     > +}
>     > +
>     > +TEST_REGISTER(RKISP1PipelineTest)
Show Liu Jan. 14, 2020, 8:37 a.m. UTC | #4
Hi Kieran,

Glad to know.
Thanks. :-)

Best Regards,
Show Liu


On Tue, Jan 14, 2020 at 7:02 AM Kieran Bingham <
kieran.bingham@ideasonboard.com> wrote:

> Hi Show,
>
> Thank you,
>
> This is now pushed to master.
> --
> Regards
>
> Kieran
>
>
>
> On 10/01/2020 01:12, Show Liu wrote:
> > Hi Kieran,
> >
> >
> >
> > On Thu, Jan 9, 2020 at 7:40 PM Kieran Bingham
> > <kieran.bingham@ideasonboard.com
> > <mailto:kieran.bingham@ideasonboard.com>> wrote:
> >
> >     Hi Show,
> >
> >     On 08/01/2020 08:30, Show Liu wrote:
> >
> >     The commit log has been lost from the previous version.
> >     I will add the following (slightly modified) back in when applying:
> >
> >     Add an initial simple test tool for the rkisp1 pipeline based upon
> the
> >     IPU3 pipeline test.
> >
> > OK. Thanks.
> >
> >
> >     Otherwise, I believe this looks good
> >
> >     Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com
> >     <mailto:kieran.bingham@ideasonboard.com>>
> >
> >
> >     Some time in the future I hope we can have a generic PipelineHandler
> >     validation which can re-use a lot of code
> >
> > Agree.  I am also thinking about it since Laurent mentioned previously.
> >
> >
> >     - but for now I think this is
> >     fine, and will get things started.
> >
> >
> >     When we know what code is duplicated, we can refactor accordingly.
> >
> >     > Signed-off-by: Show Liu <show.liu@linaro.org
> >     <mailto:show.liu@linaro.org>>
> >     > ---
> >     >  test/pipeline/meson.build                     |   1 +
> >     >  test/pipeline/rkisp1/meson.build              |  12 ++
> >     >  test/pipeline/rkisp1/rkisp1_pipeline_test.cpp | 114
> >     ++++++++++++++++++
> >     >  3 files changed, 127 insertions(+)
> >     >  create mode 100644 test/pipeline/rkisp1/meson.build
> >     >  create mode 100644 test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
> >     >
> >     > diff --git a/test/pipeline/meson.build b/test/pipeline/meson.build
> >     > index f434c79..157f789 100644
> >     > --- a/test/pipeline/meson.build
> >     > +++ b/test/pipeline/meson.build
> >     > @@ -1 +1,2 @@
> >     >  subdir('ipu3')
> >     > +subdir('rkisp1')
> >     > diff --git a/test/pipeline/rkisp1/meson.build
> >     b/test/pipeline/rkisp1/meson.build
> >     > new file mode 100644
> >     > index 0000000..d3f9749
> >     > --- /dev/null
> >     > +++ b/test/pipeline/rkisp1/meson.build
> >     > @@ -0,0 +1,12 @@
> >     > +rkisp1_test = [
> >     > +    ['rkisp1_pipeline_test',
> 'rkisp1_pipeline_test.cpp'],
> >     > +]
> >     > +
> >     > +foreach t : rkisp1_test
> >     > +    exe = executable(t[0], t[1],
> >     > +                     dependencies : libcamera_dep,
> >     > +                     link_with : test_libraries,
> >     > +                     include_directories : test_includes_internal)
> >     > +
> >     > +    test(t[0], exe, suite : 'rkisp1', is_parallel : false)
> >     > +endforeach
> >     > diff --git a/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
> >     b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
> >     > new file mode 100644
> >     > index 0000000..91a4772
> >     > --- /dev/null
> >     > +++ b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
> >     > @@ -0,0 +1,114 @@
> >     > +/* SPDX-License-Identifier: GPL-2.0-or-later */
> >     > +/*
> >     > + * Copyright (C) 2020, Linaro
> >     > + *
> >     > + * Based on test/pipeline/ipu3/ipu3_pipeline_test.cpp
> >     > + *
> >     > + * rkisp1_pipeline_test.cpp - Rockchip RK3399 rkisp1 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 RK3399 pipeline handler gets matched and
> cameras
> >     > + * are enumerated correctly.
> >     > + *
> >     > + * The test is supposed to be run on rockchip platform.
> >     > + *
> >     > + * The test lists all cameras registered in the system, if any
> >     camera is
> >     > + * available at all.
> >     > + */
> >     > +class RKISP1PipelineTest : public Test
> >     > +{
> >     > +protected:
> >     > +     int init();
> >     > +     int run();
> >     > +     void cleanup();
> >     > +
> >     > +private:
> >     > +     CameraManager *cameraManager_;
> >     > +     unsigned int sensors_;
> >     > +};
> >     > +
> >     > +int RKISP1PipelineTest::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 dm("rkisp1");
> >     > +
> >     > +     std::shared_ptr<MediaDevice> rkisp1 = enumerator->search(dm);
> >     > +     if (!rkisp1) {
> >     > +             cerr << "Failed to find rkisp1: test skip" << endl;
> >     > +             return TestSkip;
> >     > +     }
> >     > +
> >     > +     int ret = rkisp1->populate();
> >     > +     if (ret) {
> >     > +             cerr << "Failed to populate media device "
> >     > +                     << rkisp1->deviceNode() << endl;
> >     > +             return TestFail;
> >     > +     }
> >     > +
> >     > +     sensors_ = 0;
> >     > +     const vector<MediaEntity *> &entities = rkisp1->entities();
> >     > +     for (MediaEntity *entity : entities) {
> >     > +             if (entity->function() == MEDIA_ENT_F_CAM_SENSOR)
> >     > +                     sensors_++;
> >     > +     }
> >     > +
> >     > +     cameraManager_ = new CameraManager();
> >     > +     ret = cameraManager_->start();
> >     > +     if (ret) {
> >     > +             cerr << "Failed to start the CameraManager" << endl;
> >     > +             return TestFail;
> >     > +     }
> >     > +
> >     > +     return 0;
> >     > +}
> >     > +
> >     > +int RKISP1PipelineTest::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 RKISP1PipelineTest::cleanup()
> >     > +{
> >     > +     cameraManager_->stop();
> >     > +     delete cameraManager_;
> >     > +}
> >     > +
> >     > +TEST_REGISTER(RKISP1PipelineTest)
>
> --
> Regards
> --
> Kieran
>

Patch

diff --git a/test/pipeline/meson.build b/test/pipeline/meson.build
index f434c79..157f789 100644
--- a/test/pipeline/meson.build
+++ b/test/pipeline/meson.build
@@ -1 +1,2 @@ 
 subdir('ipu3')
+subdir('rkisp1')
diff --git a/test/pipeline/rkisp1/meson.build b/test/pipeline/rkisp1/meson.build
new file mode 100644
index 0000000..d3f9749
--- /dev/null
+++ b/test/pipeline/rkisp1/meson.build
@@ -0,0 +1,12 @@ 
+rkisp1_test = [
+    ['rkisp1_pipeline_test',            'rkisp1_pipeline_test.cpp'],
+]
+
+foreach t : rkisp1_test
+    exe = executable(t[0], t[1],
+                     dependencies : libcamera_dep,
+                     link_with : test_libraries,
+                     include_directories : test_includes_internal)
+
+    test(t[0], exe, suite : 'rkisp1', is_parallel : false)
+endforeach
diff --git a/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
new file mode 100644
index 0000000..91a4772
--- /dev/null
+++ b/test/pipeline/rkisp1/rkisp1_pipeline_test.cpp
@@ -0,0 +1,114 @@ 
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2020, Linaro
+ *
+ * Based on test/pipeline/ipu3/ipu3_pipeline_test.cpp
+ *
+ * rkisp1_pipeline_test.cpp - Rockchip RK3399 rkisp1 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 RK3399 pipeline handler gets matched and cameras
+ * are enumerated correctly.
+ *
+ * The test is supposed to be run on rockchip platform.
+ *
+ * The test lists all cameras registered in the system, if any camera is
+ * available at all.
+ */
+class RKISP1PipelineTest : public Test
+{
+protected:
+	int init();
+	int run();
+	void cleanup();
+
+private:
+	CameraManager *cameraManager_;
+	unsigned int sensors_;
+};
+
+int RKISP1PipelineTest::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 dm("rkisp1");
+
+	std::shared_ptr<MediaDevice> rkisp1 = enumerator->search(dm);
+	if (!rkisp1) {
+		cerr << "Failed to find rkisp1: test skip" << endl;
+		return TestSkip;
+	}
+
+	int ret = rkisp1->populate();
+	if (ret) {
+		cerr << "Failed to populate media device "
+			<< rkisp1->deviceNode() << endl;
+		return TestFail;
+	}
+
+	sensors_ = 0;
+	const vector<MediaEntity *> &entities = rkisp1->entities();
+	for (MediaEntity *entity : entities) {
+		if (entity->function() == MEDIA_ENT_F_CAM_SENSOR)
+			sensors_++;
+	}
+
+	cameraManager_ = new CameraManager();
+	ret = cameraManager_->start();
+	if (ret) {
+		cerr << "Failed to start the CameraManager" << endl;
+		return TestFail;
+	}
+
+	return 0;
+}
+
+int RKISP1PipelineTest::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 RKISP1PipelineTest::cleanup()
+{
+	cameraManager_->stop();
+	delete cameraManager_;
+}
+
+TEST_REGISTER(RKISP1PipelineTest)