Message ID | 20230811-gsoc-drm-format-test-v2-v2-4-763b17890644@riseup.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Increase code coverage on drm_format_helper.c | expand |
On 8/11/23 15:17, Arthur Grillo wrote: > Insert parameterized test for the drm_fb_build_fourcc_list() to ensure > correctness and prevent future regressions. > > Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net> > --- > drivers/gpu/drm/tests/drm_format_helper_test.c | 148 +++++++++++++++++++++++++ > 1 file changed, 148 insertions(+) > > diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c > index 7f24da0b1e00..2b55d9f025f9 100644 > --- a/drivers/gpu/drm/tests/drm_format_helper_test.c > +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c > @@ -3,11 +3,13 @@ > #include <kunit/test.h> > > #include <drm/drm_device.h> > +#include <drm/drm_drv.h> > #include <drm/drm_file.h> > #include <drm/drm_format_helper.h> > #include <drm/drm_fourcc.h> > #include <drm/drm_framebuffer.h> > #include <drm/drm_gem_framebuffer_helper.h> > +#include <drm/drm_kunit_helpers.h> > #include <drm/drm_mode.h> > #include <drm/drm_print.h> > #include <drm/drm_rect.h> > @@ -1041,6 +1043,151 @@ static void drm_test_fb_clip_offset(struct kunit *test) > KUNIT_EXPECT_EQ(test, offset, params->expected_offset); > } > > +struct fb_build_fourcc_list_case { > + const char *name; > + u32 native_fourccs[TEST_BUF_SIZE]; > + u32 expected[TEST_BUF_SIZE]; > + size_t fourccs_size; > +}; > + > +static struct fb_build_fourcc_list_case fb_build_fourcc_list_cases[] = { > + { > + .name = "no native formats", > + .native_fourccs = { }, > + .expected = { DRM_FORMAT_XRGB8888 }, > + .fourccs_size = 1, > + }, > + { > + .name = "XRGB8888 as native format", > + .native_fourccs = { DRM_FORMAT_XRGB8888 }, > + .expected = { DRM_FORMAT_XRGB8888 }, > + .fourccs_size = 1, > + }, > + { > + .name = "remove duplicates", > + .native_fourccs = { > + DRM_FORMAT_XRGB8888, > + DRM_FORMAT_XRGB8888, > + DRM_FORMAT_RGB888, > + DRM_FORMAT_RGB888, > + DRM_FORMAT_RGB888, > + DRM_FORMAT_XRGB8888, > + DRM_FORMAT_RGB888, > + DRM_FORMAT_RGB565, > + DRM_FORMAT_RGB888, > + DRM_FORMAT_XRGB8888, > + DRM_FORMAT_RGB565, > + DRM_FORMAT_RGB565, > + DRM_FORMAT_XRGB8888, > + }, > + .expected = { > + DRM_FORMAT_XRGB8888, > + DRM_FORMAT_RGB888, > + DRM_FORMAT_RGB565, > + }, > + .fourccs_size = 3, > + }, > + { > + .name = "convert alpha formats", > + .native_fourccs = { > + DRM_FORMAT_ARGB1555, > + DRM_FORMAT_ABGR1555, > + DRM_FORMAT_RGBA5551, > + DRM_FORMAT_BGRA5551, > + DRM_FORMAT_ARGB8888, > + DRM_FORMAT_ABGR8888, > + DRM_FORMAT_RGBA8888, > + DRM_FORMAT_BGRA8888, > + DRM_FORMAT_ARGB2101010, > + DRM_FORMAT_ABGR2101010, > + DRM_FORMAT_RGBA1010102, > + DRM_FORMAT_BGRA1010102, > + }, > + .expected = { > + DRM_FORMAT_XRGB1555, > + DRM_FORMAT_XBGR1555, > + DRM_FORMAT_RGBX5551, > + DRM_FORMAT_BGRX5551, > + DRM_FORMAT_XRGB8888, > + DRM_FORMAT_XBGR8888, > + DRM_FORMAT_RGBX8888, > + DRM_FORMAT_BGRX8888, > + DRM_FORMAT_XRGB2101010, > + DRM_FORMAT_XBGR2101010, > + DRM_FORMAT_RGBX1010102, > + DRM_FORMAT_BGRX1010102, > + }, > + .fourccs_size = 12, > + }, > + { > + .name = "random formats", > + .native_fourccs = { > + DRM_FORMAT_Y212, > + DRM_FORMAT_ARGB1555, > + DRM_FORMAT_ABGR16161616F, > + DRM_FORMAT_C8, > + DRM_FORMAT_BGR888, > + DRM_FORMAT_XRGB1555, > + DRM_FORMAT_RGBA5551, > + DRM_FORMAT_BGR565_A8, > + DRM_FORMAT_R10, > + DRM_FORMAT_XYUV8888, > + }, > + .expected = { > + DRM_FORMAT_Y212, > + DRM_FORMAT_XRGB1555, > + DRM_FORMAT_ABGR16161616F, > + DRM_FORMAT_C8, > + DRM_FORMAT_BGR888, > + DRM_FORMAT_RGBX5551, > + DRM_FORMAT_BGR565_A8, > + DRM_FORMAT_R10, > + DRM_FORMAT_XYUV8888, > + DRM_FORMAT_XRGB8888, > + }, > + .fourccs_size = 10, > + }, > +}; > + > +static void fb_build_fourcc_list_case_desc(struct fb_build_fourcc_list_case *t, char *desc) > +{ > + strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE); > +} > + > +KUNIT_ARRAY_PARAM(fb_build_fourcc_list, fb_build_fourcc_list_cases, fb_build_fourcc_list_case_desc); > + > +static size_t get_nfourccs(const u32 *fourccs) > +{ > + size_t i; > + > + for (i = 0; i < TEST_BUF_SIZE && fourccs[i]; ++i) > + ; > + > + return i; > +} > + > +static void drm_test_fb_build_fourcc_list(struct kunit *test) > +{ > + const struct fb_build_fourcc_list_case *params = test->param_value; > + u32 fourccs_out[TEST_BUF_SIZE]; > + size_t nfourccs_out; > + struct drm_device *drm; > + struct device *dev; > + > + dev = drm_kunit_helper_alloc_device(test); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev); > + > + drm = __drm_kunit_helper_alloc_drm_device(test, dev, sizeof(*drm), 0, DRIVER_MODESET); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, drm); > + > + nfourccs_out = drm_fb_build_fourcc_list(drm, params->native_fourccs, > + get_nfourccs(params->native_fourccs), Can we hard-code the number of native fourccs? Best Regards, - Maíra > + fourccs_out, TEST_BUF_SIZE); > + > + KUNIT_EXPECT_EQ(test, nfourccs_out, params->fourccs_size); > + KUNIT_EXPECT_MEMEQ(test, fourccs_out, params->expected, TEST_BUF_SIZE); > +} > + > static struct kunit_case drm_format_helper_test_cases[] = { > KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_gray8, convert_xrgb8888_gen_params), > KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_rgb332, convert_xrgb8888_gen_params), > @@ -1055,6 +1202,7 @@ static struct kunit_case drm_format_helper_test_cases[] = { > KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_mono, convert_xrgb8888_gen_params), > KUNIT_CASE_PARAM(drm_test_fb_swab, convert_xrgb8888_gen_params), > KUNIT_CASE_PARAM(drm_test_fb_clip_offset, clip_offset_gen_params), > + KUNIT_CASE_PARAM(drm_test_fb_build_fourcc_list, fb_build_fourcc_list_gen_params), > {} > }; > >
diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c index 7f24da0b1e00..2b55d9f025f9 100644 --- a/drivers/gpu/drm/tests/drm_format_helper_test.c +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c @@ -3,11 +3,13 @@ #include <kunit/test.h> #include <drm/drm_device.h> +#include <drm/drm_drv.h> #include <drm/drm_file.h> #include <drm/drm_format_helper.h> #include <drm/drm_fourcc.h> #include <drm/drm_framebuffer.h> #include <drm/drm_gem_framebuffer_helper.h> +#include <drm/drm_kunit_helpers.h> #include <drm/drm_mode.h> #include <drm/drm_print.h> #include <drm/drm_rect.h> @@ -1041,6 +1043,151 @@ static void drm_test_fb_clip_offset(struct kunit *test) KUNIT_EXPECT_EQ(test, offset, params->expected_offset); } +struct fb_build_fourcc_list_case { + const char *name; + u32 native_fourccs[TEST_BUF_SIZE]; + u32 expected[TEST_BUF_SIZE]; + size_t fourccs_size; +}; + +static struct fb_build_fourcc_list_case fb_build_fourcc_list_cases[] = { + { + .name = "no native formats", + .native_fourccs = { }, + .expected = { DRM_FORMAT_XRGB8888 }, + .fourccs_size = 1, + }, + { + .name = "XRGB8888 as native format", + .native_fourccs = { DRM_FORMAT_XRGB8888 }, + .expected = { DRM_FORMAT_XRGB8888 }, + .fourccs_size = 1, + }, + { + .name = "remove duplicates", + .native_fourccs = { + DRM_FORMAT_XRGB8888, + DRM_FORMAT_XRGB8888, + DRM_FORMAT_RGB888, + DRM_FORMAT_RGB888, + DRM_FORMAT_RGB888, + DRM_FORMAT_XRGB8888, + DRM_FORMAT_RGB888, + DRM_FORMAT_RGB565, + DRM_FORMAT_RGB888, + DRM_FORMAT_XRGB8888, + DRM_FORMAT_RGB565, + DRM_FORMAT_RGB565, + DRM_FORMAT_XRGB8888, + }, + .expected = { + DRM_FORMAT_XRGB8888, + DRM_FORMAT_RGB888, + DRM_FORMAT_RGB565, + }, + .fourccs_size = 3, + }, + { + .name = "convert alpha formats", + .native_fourccs = { + DRM_FORMAT_ARGB1555, + DRM_FORMAT_ABGR1555, + DRM_FORMAT_RGBA5551, + DRM_FORMAT_BGRA5551, + DRM_FORMAT_ARGB8888, + DRM_FORMAT_ABGR8888, + DRM_FORMAT_RGBA8888, + DRM_FORMAT_BGRA8888, + DRM_FORMAT_ARGB2101010, + DRM_FORMAT_ABGR2101010, + DRM_FORMAT_RGBA1010102, + DRM_FORMAT_BGRA1010102, + }, + .expected = { + DRM_FORMAT_XRGB1555, + DRM_FORMAT_XBGR1555, + DRM_FORMAT_RGBX5551, + DRM_FORMAT_BGRX5551, + DRM_FORMAT_XRGB8888, + DRM_FORMAT_XBGR8888, + DRM_FORMAT_RGBX8888, + DRM_FORMAT_BGRX8888, + DRM_FORMAT_XRGB2101010, + DRM_FORMAT_XBGR2101010, + DRM_FORMAT_RGBX1010102, + DRM_FORMAT_BGRX1010102, + }, + .fourccs_size = 12, + }, + { + .name = "random formats", + .native_fourccs = { + DRM_FORMAT_Y212, + DRM_FORMAT_ARGB1555, + DRM_FORMAT_ABGR16161616F, + DRM_FORMAT_C8, + DRM_FORMAT_BGR888, + DRM_FORMAT_XRGB1555, + DRM_FORMAT_RGBA5551, + DRM_FORMAT_BGR565_A8, + DRM_FORMAT_R10, + DRM_FORMAT_XYUV8888, + }, + .expected = { + DRM_FORMAT_Y212, + DRM_FORMAT_XRGB1555, + DRM_FORMAT_ABGR16161616F, + DRM_FORMAT_C8, + DRM_FORMAT_BGR888, + DRM_FORMAT_RGBX5551, + DRM_FORMAT_BGR565_A8, + DRM_FORMAT_R10, + DRM_FORMAT_XYUV8888, + DRM_FORMAT_XRGB8888, + }, + .fourccs_size = 10, + }, +}; + +static void fb_build_fourcc_list_case_desc(struct fb_build_fourcc_list_case *t, char *desc) +{ + strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE); +} + +KUNIT_ARRAY_PARAM(fb_build_fourcc_list, fb_build_fourcc_list_cases, fb_build_fourcc_list_case_desc); + +static size_t get_nfourccs(const u32 *fourccs) +{ + size_t i; + + for (i = 0; i < TEST_BUF_SIZE && fourccs[i]; ++i) + ; + + return i; +} + +static void drm_test_fb_build_fourcc_list(struct kunit *test) +{ + const struct fb_build_fourcc_list_case *params = test->param_value; + u32 fourccs_out[TEST_BUF_SIZE]; + size_t nfourccs_out; + struct drm_device *drm; + struct device *dev; + + dev = drm_kunit_helper_alloc_device(test); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev); + + drm = __drm_kunit_helper_alloc_drm_device(test, dev, sizeof(*drm), 0, DRIVER_MODESET); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, drm); + + nfourccs_out = drm_fb_build_fourcc_list(drm, params->native_fourccs, + get_nfourccs(params->native_fourccs), + fourccs_out, TEST_BUF_SIZE); + + KUNIT_EXPECT_EQ(test, nfourccs_out, params->fourccs_size); + KUNIT_EXPECT_MEMEQ(test, fourccs_out, params->expected, TEST_BUF_SIZE); +} + static struct kunit_case drm_format_helper_test_cases[] = { KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_gray8, convert_xrgb8888_gen_params), KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_rgb332, convert_xrgb8888_gen_params), @@ -1055,6 +1202,7 @@ static struct kunit_case drm_format_helper_test_cases[] = { KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_mono, convert_xrgb8888_gen_params), KUNIT_CASE_PARAM(drm_test_fb_swab, convert_xrgb8888_gen_params), KUNIT_CASE_PARAM(drm_test_fb_clip_offset, clip_offset_gen_params), + KUNIT_CASE_PARAM(drm_test_fb_build_fourcc_list, fb_build_fourcc_list_gen_params), {} };
Insert parameterized test for the drm_fb_build_fourcc_list() to ensure correctness and prevent future regressions. Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net> --- drivers/gpu/drm/tests/drm_format_helper_test.c | 148 +++++++++++++++++++++++++ 1 file changed, 148 insertions(+)