[igt-dev] [PATCH i-g-t 3/3] lib/tests: Add tests for magic control blocks nesting

Petri Latvala petri.latvala at intel.com
Tue May 5 06:41:02 UTC 2020


On Mon, May 04, 2020 at 02:26:23PM +0300, Arkadiusz Hiler wrote:
> Cc: Petri Latvala <petri.latvala at intel.com>
> Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler at intel.com>


Reviewed-by: Petri Latvala <petri.latvala at intel.com>

Is igt_fork usage covered elsewhere?



> ---
>  lib/tests/igt_nesting.c      | 261 +++++++++++++++++++++++++++++++++++
>  lib/tests/igt_tests_common.h |   5 +
>  lib/tests/meson.build        |   1 +
>  3 files changed, 267 insertions(+)
>  create mode 100644 lib/tests/igt_nesting.c
> 
> diff --git a/lib/tests/igt_nesting.c b/lib/tests/igt_nesting.c
> new file mode 100644
> index 00000000..de674b6b
> --- /dev/null
> +++ b/lib/tests/igt_nesting.c
> @@ -0,0 +1,261 @@
> +/*
> + * Copyright © 2020 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + */
> +
> +#include "igt_core.h"
> +#include "igt_tests_common.h"
> +#include "drmtest.h"
> +
> +char test[] = "test";
> +char *fake_argv[] = { test };
> +int fake_argc = ARRAY_SIZE(fake_argv);
> +
> +static void all_valid_simple_test(void)
> +{
> +	igt_simple_init(fake_argc, fake_argv);
> +
> +	igt_skip("o:");
> +	igt_assert(false);
> +
> +	igt_exit();
> +}
> +
> +static void all_valid(void)
> +{
> +	igt_subtest_init(fake_argc, fake_argv);
> +
> +	igt_fixture {
> +	}
> +
> +	igt_subtest_group {
> +		igt_subtest_group {
> +		}
> +
> +		igt_fixture {
> +		}
> +
> +		igt_subtest("a")
> +		{
> +			igt_skip("o:\n");
> +		}
> +
> +		igt_subtest("b")
> +		{
> +			igt_assert(false);
> +		}
> +
> +		igt_subtest_with_dynamic("c") {
> +			igt_dynamic("d")
> +			{
> +				igt_skip("o:\n");
> +			}
> +
> +			igt_dynamic("e")
> +			{
> +				igt_assert(false);
> +			}
> +		}
> +
> +		igt_subtest_with_dynamic("f") {
> +			igt_skip("o:\n");
> +		}
> +
> +		igt_subtest_with_dynamic("g") {
> +		}
> +	}
> +
> +	igt_exit();
> +}
> +
> +static void invalid_subtest_in_simple_test(void)
> +{
> +	igt_simple_init(fake_argc, fake_argv);
> +
> +	igt_subtest("a") {
> +	}
> +
> +	igt_exit();
> +}
> +
> +static void invalid_subtest_group_in_simple_test(void)
> +{
> +	igt_simple_init(fake_argc, fake_argv);
> +
> +	igt_subtest_group {
> +	}
> +
> +	igt_exit();
> +}
> +
> +static void invalid_subtest_with_dynamic_in_simple_test(void)
> +{
> +	igt_simple_init(fake_argc, fake_argv);
> +
> +	igt_subtest_with_dynamic("a") {
> +	}
> +
> +	igt_exit();
> +}
> +
> +static void invalid_dynamic_in_simple_test(void)
> +{
> +	igt_simple_init(fake_argc, fake_argv);
> +
> +	igt_dynamic("a") {
> +	}
> +
> +	igt_exit();
> +}
> +
> +static void invalid_fixture_in_fixture(void)
> +{
> +	igt_subtest_init(fake_argc, fake_argv);
> +
> +	igt_fixture {
> +		igt_fixture {
> +		}
> +	}
> +
> +	igt_exit();
> +}
> +
> +static void invalid_subtest_in_subtest(void)
> +{
> +	igt_subtest_init(fake_argc, fake_argv);
> +
> +	igt_subtest("a") {
> +		igt_subtest("b") {
> +		}
> +	}
> +
> +	igt_exit();
> +}
> +
> +static void invalid_top_level_dynamic(void)
> +{
> +	igt_subtest_init(fake_argc, fake_argv);
> +
> +	igt_dynamic("a") {
> +	}
> +
> +	igt_exit();
> +}
> +
> +static void invalid_dynamic_in_regular_subtest(void)
> +{
> +	igt_subtest_init(fake_argc, fake_argv);
> +
> +	igt_subtest("a") {
> +		igt_dynamic("b") {
> +		}
> +	}
> +
> +	igt_exit();
> +}
> +
> +static void invalid_fixture_in_subtest(void)
> +{
> +	igt_subtest_init(fake_argc, fake_argv);
> +
> +	igt_subtest("a") {
> +		igt_fixture {
> +		}
> +	}
> +
> +	igt_exit();
> +}
> +
> +static void invalid_top_level_skip(void)
> +{
> +	igt_subtest_init(fake_argc, fake_argv);
> +
> +	igt_skip("o:\n");
> +
> +	igt_exit();
> +}
> +
> +static void invalid_top_level_assert(void)
> +{
> +	igt_subtest_init(fake_argc, fake_argv);
> +
> +	igt_assert(false);
> +
> +	igt_exit();
> +}
> +
> +static void invalid_dynamic_in_dynamic(void)
> +{
> +	igt_subtest_init(fake_argc, fake_argv);
> +
> +	igt_subtest_with_dynamic("a") {
> +		igt_dynamic("b") {
> +			igt_dynamic("c") {
> +			}
> +		}
> +	}
> +
> +	igt_exit();
> +}
> +
> +typedef void (*fork_fun)(void);
> +
> +int main(int argc, char **argv)
> +{
> +	int status;
> +
> +	/* test the invalid nesting scenarios */ {
> +		fork_fun should_sigabort[] = {
> +			invalid_subtest_in_simple_test,
> +			invalid_subtest_group_in_simple_test,
> +			invalid_subtest_with_dynamic_in_simple_test,
> +			invalid_dynamic_in_simple_test,
> +			invalid_fixture_in_fixture,
> +			invalid_subtest_in_subtest,
> +			invalid_top_level_dynamic,
> +			invalid_dynamic_in_regular_subtest,
> +			invalid_fixture_in_subtest,
> +			invalid_top_level_skip,
> +			invalid_top_level_assert,
> +			invalid_dynamic_in_dynamic,
> +		};
> +
> +		for (int i = 0; i < ARRAY_SIZE(should_sigabort); ++i) {
> +			status = do_fork(should_sigabort[i]);
> +			internal_assert_wsignaled(status, SIGABRT);
> +		}
> +	}
> +
> +	/* test the valid nesting scenarios */ {
> +		fork_fun should_not_signal[] = {
> +			all_valid_simple_test,
> +			all_valid,
> +		};
> +
> +		for (int i = 0; i < ARRAY_SIZE(should_not_signal); ++i) {
> +			status = do_fork(should_not_signal[i]);
> +			internal_assert_not_wsignaled(status);
> +		}
> +	}
> +
> +	return 0;
> +}
> diff --git a/lib/tests/igt_tests_common.h b/lib/tests/igt_tests_common.h
> index f285d657..fa8ad920 100644
> --- a/lib/tests/igt_tests_common.h
> +++ b/lib/tests/igt_tests_common.h
> @@ -51,6 +51,11 @@ static inline void internal_assert_wsignaled(int wstatus, int signal)
>  			WTERMSIG(wstatus) == signal);
>  }
>  
> +static inline void internal_assert_not_wsignaled(int wstatus)
> +{
> +	internal_assert(!WIFSIGNALED(wstatus));
> +}
> +
>  static inline int do_fork(void (*test_to_run)(void))
>  {
>  	int pid, status;
> diff --git a/lib/tests/meson.build b/lib/tests/meson.build
> index 22aa19da..47ef303a 100644
> --- a/lib/tests/meson.build
> +++ b/lib/tests/meson.build
> @@ -12,6 +12,7 @@ lib_tests = [
>  	'igt_fork_helper',
>  	'igt_list_only',
>  	'igt_invalid_subtest_name',
> +	'igt_nesting',
>  	'igt_no_exit',
>  	'igt_segfault',
>  	'igt_simulation',
> -- 
> 2.25.2
> 


More information about the igt-dev mailing list