Message ID | 20230721182316.560649-5-arthurgrillo@riseup.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Increase code coverage on drm_format_helper.c | expand |
On 7/21/23 15:23, 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> > --- > .../gpu/drm/tests/drm_format_helper_test.c | 143 ++++++++++++++++++ > 1 file changed, 143 insertions(+) > > diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c > index 2e1c5463f063..de4677868647 100644 > --- a/drivers/gpu/drm/tests/drm_format_helper_test.c > +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c > @@ -3,6 +3,7 @@ > #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> > @@ -11,6 +12,7 @@ > #include <drm/drm_mode.h> > #include <drm/drm_print.h> > #include <drm/drm_rect.h> > +#include <drm/drm_kunit_helpers.h> > > #include "../drm_crtc_internal.h" > > @@ -1047,6 +1049,146 @@ 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]; > +}; > + > +struct fb_build_fourcc_list_case fb_build_fourcc_list_cases[] = { > + { > + .name = "no native formats", > + .native_fourccs = { }, > + .expected = { DRM_FORMAT_XRGB8888 }, > + }, > + { > + .name = "XRGB8888 as native format", > + .native_fourccs = { DRM_FORMAT_XRGB8888 }, > + .expected = { DRM_FORMAT_XRGB8888 }, > + }, > + { > + .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, > + }, > + }, > + { > + .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, > + }, > + }, > + { > + .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, > + }, > + }, > +}; > + > +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); > + > + drm_kunit_helper_free_device(test, dev); I believe that this function is no longer needed after Maxime's patches. > + KUNIT_EXPECT_EQ(test, nfourccs_out, get_nfourccs(params->expected)); Instead of using this get_fourccs() functions, wouldn't it be better to hardcode the number of expected fourccs in the cases? Best Regards, - Maíra > + 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), > @@ -1061,6 +1203,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), > {} > }; >
Em 21/07/2023 15:23, Arthur Grillo escreveu: > 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> > --- > .../gpu/drm/tests/drm_format_helper_test.c | 143 ++++++++++++++++++ > 1 file changed, 143 insertions(+) > > diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c > index 2e1c5463f063..de4677868647 100644 > --- a/drivers/gpu/drm/tests/drm_format_helper_test.c > +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c > @@ -3,6 +3,7 @@ > #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> > @@ -11,6 +12,7 @@ > #include <drm/drm_mode.h> > #include <drm/drm_print.h> > #include <drm/drm_rect.h> > +#include <drm/drm_kunit_helpers.h> Keep the includes sorted please > > #include "../drm_crtc_internal.h" > > @@ -1047,6 +1049,146 @@ 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]; > +}; > + > +struct fb_build_fourcc_list_case fb_build_fourcc_list_cases[] = { > + { > + .name = "no native formats", > + .native_fourccs = { }, > + .expected = { DRM_FORMAT_XRGB8888 }, > + }, > + { > + .name = "XRGB8888 as native format", > + .native_fourccs = { DRM_FORMAT_XRGB8888 }, > + .expected = { DRM_FORMAT_XRGB8888 }, > + }, > + { > + .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, > + }, > + }, > + { > + .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, > + }, > + }, > + { > + .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, > + }, > + }, > +}; > + > +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; > +} I agree with Maira here, maybe a .fourccs_size struct member would be better > + > +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); > + > + drm_kunit_helper_free_device(test, dev); > + KUNIT_EXPECT_EQ(test, nfourccs_out, get_nfourccs(params->expected)); > + 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), > @@ -1061,6 +1203,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 2e1c5463f063..de4677868647 100644 --- a/drivers/gpu/drm/tests/drm_format_helper_test.c +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c @@ -3,6 +3,7 @@ #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> @@ -11,6 +12,7 @@ #include <drm/drm_mode.h> #include <drm/drm_print.h> #include <drm/drm_rect.h> +#include <drm/drm_kunit_helpers.h> #include "../drm_crtc_internal.h" @@ -1047,6 +1049,146 @@ 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]; +}; + +struct fb_build_fourcc_list_case fb_build_fourcc_list_cases[] = { + { + .name = "no native formats", + .native_fourccs = { }, + .expected = { DRM_FORMAT_XRGB8888 }, + }, + { + .name = "XRGB8888 as native format", + .native_fourccs = { DRM_FORMAT_XRGB8888 }, + .expected = { DRM_FORMAT_XRGB8888 }, + }, + { + .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, + }, + }, + { + .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, + }, + }, + { + .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, + }, + }, +}; + +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); + + drm_kunit_helper_free_device(test, dev); + KUNIT_EXPECT_EQ(test, nfourccs_out, get_nfourccs(params->expected)); + 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), @@ -1061,6 +1203,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> --- .../gpu/drm/tests/drm_format_helper_test.c | 143 ++++++++++++++++++ 1 file changed, 143 insertions(+)