[libcamera-devel] [PATCH v3 7/8] test: v4l2_device: Add format handling test

Kieran Bingham kieran.bingham at ideasonboard.com
Thu Feb 28 11:15:16 CET 2019


Hi Jacopo, Laurent,

On 28/02/2019 08:54, Jacopo Mondi wrote:
> Hi Laurent,
> 
> On Wed, Feb 27, 2019 at 08:44:02PM +0200, Laurent Pinchart wrote:
>> Hi Jacopo,
>>
>> On Tue, Feb 26, 2019 at 05:26:40PM +0100, Jacopo Mondi wrote:
>>> Add test for V4L2Device set and get format methods.
>>>
>>> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
>>> ---
>>>  test/v4l2_device/meson.build      |  1 +
>>>  test/v4l2_device/test_formats.cpp | 65 +++++++++++++++++++++++++++++++
>>>  2 files changed, 66 insertions(+)
>>>  create mode 100644 test/v4l2_device/test_formats.cpp
>>>
>>> diff --git a/test/v4l2_device/meson.build b/test/v4l2_device/meson.build
>>> index 9f7a7545ac9b..e5e50faac282 100644
>>> --- a/test/v4l2_device/meson.build
>>> +++ b/test/v4l2_device/meson.build
>>> @@ -6,6 +6,7 @@ v4l2_device_tests = [
>>>    [ 'stream_on_off',      'stream_on_off.cpp' ],
>>>    [ 'capture_async',      'capture_async.cpp' ],
>>>    [ 'buffer_sharing',     'buffer_sharing.cpp' ],
>>> +  [ 'test_formats',	  'test_formats.cpp' ],
>>
>> V4L2Device tests are soretd by order of increasing complexity, I think
>> think this one should be last in the list.


Yes, the intention was that the tests are increasing in complexity, and
the simplest test gets run first.

Also - the tests should somewhat follow the order of the expected API
usage... so hence open/request_buffers is before stream_on_off.


The tests execute in the order that they are listed in the array.

meson test --suite v4l2_device
1/6 libcamera:v4l2_device / double_open     SKIP     0.00 s
2/6 libcamera:v4l2_device / request_buffers  SKIP     0.00 s
3/6 libcamera:v4l2_device / stream_on_off   SKIP     0.00 s
4/6 libcamera:v4l2_device / capture_async   SKIP     0.00 s
5/6 libcamera:v4l2_device / buffer_sharing  SKIP     0.00 s
6/6 libcamera:v4l2_device / test_formats    SKIP     0.00 s

(Yes, they all skip on my x86 host because I'm still on v4.18 which
doesn't have a media controlled vivid)


> May I say this is not the most intuitive ordering method?
> last in the complexity list == first in the array?

I think laurent made a typo, and should have said:

> I don't think this one should be last in the list.


I would consider this 'test_formats' to be after double open, and before
stream_on_off.

Actually, as setting the formats is an API that you would use before
getting buffers, I would say it goes before request_buffers too.

So that would put in at position 2?

I might also suggest dropping the "test_" prefix from the file name too
... but it's not important. The other tests are not for example called
"test_buffer_sharing".

--
Kieran


> 
>>>  ]
>>>
>>>  foreach t : v4l2_device_tests
>>> diff --git a/test/v4l2_device/test_formats.cpp b/test/v4l2_device/test_formats.cpp
>>> new file mode 100644
>>> index 000000000000..dcb05a3904f7
>>> --- /dev/null
>>> +++ b/test/v4l2_device/test_formats.cpp
>>> @@ -0,0 +1,65 @@
>>> +/* SPDX-License-Identifier: GPL-2.0-or-later */
>>> +/*
>>> + * Copyright (C) 2019, Google Inc.
>>> + *
>>> + * libcamera V4L2 device format handling test
>>> + */
>>> +
>>> +#include <climits>
>>> +#include <iostream>
>>> +
>>> +#include "v4l2_device.h"
>>> +
>>> +#include "v4l2_device_test.h"
>>> +
>>> +using namespace std;
>>> +using namespace libcamera;
>>> +
>>> +class Format : public V4L2DeviceTest
>>> +{
>>> +protected:
>>> +	int run();
>>
>> override
>>
>>> +};
>>> +
>>> +int Format::run()
>>> +{
>>> +	V4L2DeviceFormat format = {};
>>> +
>>> +	int ret = capture_->getFormat(&format);
>>> +	if (ret) {
>>> +		cerr << "Failed to get format" << endl;
>>> +		return TestFail;
>>> +	}
>>> +
>>> +	format.width = UINT_MAX;
>>> +	format.height = UINT_MAX;
>>> +	ret = capture_->setFormat(&format);
>>> +	if (ret) {
>>> +		cerr << "Failed to set format: image resolution is wrong, but "
>>> +		     << "setFormat() should not fail." << endl;
>>> +		return TestFail;
>>> +	}
>>> +
>>> +	if (format.width == UINT_MAX || format.height == UINT_MAX) {
>>> +		cerr << "Failed to update image format" << endl;
>>> +		return TestFail;
>>> +	}
>>> +
>>> +	format.width = 0;
>>> +	format.height = 0;
>>> +	ret = capture_->setFormat(&format);
>>> +	if (ret) {
>>> +		cerr << "Failed to set format: image resolution is wrong, but "
>>> +		     << "setFormat() should not fail." << endl;
>>> +		return TestFail;
>>> +	}
>>> +
>>> +	if (format.width == 0 || format.height == 0) {
>>> +		cerr << "Failed to update image format" << endl;
>>> +		return TestFail;
>>> +	}
>>> +
>>> +	return TestPass;
>>
>> With Kieran's comment addressed,
>>
>> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>>
>> (I however wonder if we need both the 0 and UINT_MAX tests. Testing that
>> the setFormat() function correctly updates the passed format is useful
>> to test our implementation, but testing both 0 and UINT_MAX feels like
>> testing the kernel instead, which is a bit out of scope)
> 
> Ah, I re-wrote this stupid tests a million times, as everytime I did
> something a bit more complex I was actually testing the kernel driver
> instead of the library. This seemed to me as a compromise between
> going for testing the driver and a test with no actual value, but I
> can drop one of the cases.
> Thanks
>    j
> 
>>
>>> +}
>>> +
>>> +TEST_REGISTER(Format);
>>
>> --
>> Regards,
>>
>> Laurent Pinchart
>>
>> _______________________________________________
>> libcamera-devel mailing list
>> libcamera-devel at lists.libcamera.org
>> https://lists.libcamera.org/listinfo/libcamera-devel

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list