[PATCH 2/3] tpm: Convert sandbox-focussed tests to C

Ilias Apalodimas ilias.apalodimas at linaro.org
Mon Oct 30 12:41:09 CET 2023


Hi Simon,

Thanks for fixing this.

On Sun, 29 Oct 2023 at 06:28, Simon Glass <sjg at chromium.org> wrote:
>
> Some of the Python tests are a pain because they don't reset the TPM
> state before each test. Driver model tests do this, so convert the
> tests to C.
>
> This means that these tests won't run on real hardware, but we have
> tests which do TPM init, so there is still enough coverage.
>
> Rename and update the Python tpm_init test to use 'tpm autostart',
> since this deals with starting up ready for the tests below.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
>  test/dm/tpm.c              | 77 +++++++++++++++++++++++++++++++++++++-
>  test/py/tests/test_tpm2.py | 57 +---------------------------
>  2 files changed, 77 insertions(+), 57 deletions(-)
>
> diff --git a/test/dm/tpm.c b/test/dm/tpm.c
> index cde933ab2848..f8264af13789 100644
> --- a/test/dm/tpm.c
> +++ b/test/dm/tpm.c
> @@ -50,14 +50,87 @@ static int test_tpm_init(struct unit_test_state *uts, enum tpm_version version)
>         return 0;
>  }
>
> -static int dm_test_tpm(struct unit_test_state *uts)
> +static int dm_test_tpm_init(struct unit_test_state *uts)
>  {
>         ut_assertok(test_tpm_init(uts, TPM_V1));
>         ut_assertok(test_tpm_init(uts, TPM_V2));
>
>         return 0;
>  }
> -DM_TEST(dm_test_tpm, UT_TESTF_SCAN_FDT);
> +DM_TEST(dm_test_tpm_init, UT_TESTF_SCAN_FDT);
> +
> +/* Test TPM startup */
> +static int test_tpm_startup(struct unit_test_state *uts,
> +                           enum tpm_version version)
> +{
> +       struct udevice *dev;
> +
> +       /* check probe success */
> +       ut_assertok(get_tpm_version(version, &dev));
> +
> +       ut_assertok(tpm_init(dev));
> +       ut_assertok(tpm_startup(dev, TPM_ST_CLEAR));
> +
> +       return 0;
> +}
> +
> +static int dm_test_tpm_startup(struct unit_test_state *uts)
> +{
> +       ut_assertok(test_tpm_startup(uts, TPM_V1));
> +       ut_assertok(test_tpm_startup(uts, TPM_V2));
> +
> +       return 0;
> +}
> +DM_TEST(dm_test_tpm_startup, UT_TESTF_SCAN_FDT);
> +
> +/* Test TPM self-test full */
> +static int test_tpm_self_test_full(struct unit_test_state *uts,
> +                                  enum tpm_version version)
> +{
> +       struct udevice *dev;
> +
> +       /* check probe success */
> +       ut_assertok(get_tpm_version(version, &dev));
> +
> +       ut_assertok(tpm_init(dev));
> +       ut_assertok(tpm_startup(dev, TPM_ST_CLEAR));
> +
> +       return 0;
> +}
> +
> +static int dm_test_tpm_self_test_full(struct unit_test_state *uts)
> +{
> +       ut_assertok(test_tpm_self_test_full(uts, TPM_V1));
> +       ut_assertok(test_tpm_self_test_full(uts, TPM_V2));
> +
> +       return 0;
> +}
> +DM_TEST(dm_test_tpm_self_test_full, UT_TESTF_SCAN_FDT);
> +
> +/* Test TPM self-test continue */
> +static int test_tpm_self_test_cont(struct unit_test_state *uts,
> +                                  enum tpm_version version)
> +{
> +       struct udevice *dev;
> +
> +       /* check probe success */
> +       ut_assertok(get_tpm_version(version, &dev));
> +
> +       ut_assertok(tpm_init(dev));
> +       ut_assertok(tpm_startup(dev, TPM_ST_CLEAR));
> +       ut_assertok(tpm_continue_self_test(dev));
> +
> +       return 0;
> +}
> +
> +static int dm_test_tpm_self_test_cont(struct unit_test_state *uts)
> +{
> +       ut_assertok(test_tpm_self_test_cont(uts, TPM_V1));
> +       ut_assertok(test_tpm_self_test_cont(uts, TPM_V2));
> +
> +       return 0;
> +}
> +DM_TEST(dm_test_tpm_self_test_cont, UT_TESTF_SCAN_FDT);
>
>  /* Test report_state */
>  static int dm_test_tpm_report_state(struct unit_test_state *uts)
> diff --git a/test/py/tests/test_tpm2.py b/test/py/tests/test_tpm2.py
> index c2579fa02c58..522ed41de633 100644
> --- a/test/py/tests/test_tpm2.py
> +++ b/test/py/tests/test_tpm2.py
> @@ -56,25 +56,12 @@ def is_sandbox(cons):
>      return sys_arch == 'sandbox'
>
>  @pytest.mark.buildconfigspec('cmd_tpm_v2')
> -def test_tpm2_init(u_boot_console):
> +def test_tpm2_autostart(u_boot_console):
>      """Init the software stack to use TPMv2 commands."""
>      skip_test = u_boot_console.config.env.get('env__tpm_device_test_skip', False)
>      if skip_test:
>          pytest.skip('skip TPM device test')
> -    u_boot_console.run_command('tpm2 init')
> -    output = u_boot_console.run_command('echo $?')
> -    assert output.endswith('0')
> -
> - at pytest.mark.buildconfigspec('cmd_tpm_v2')
> -def test_tpm2_startup(u_boot_console):
> -    """Execute a TPM2_Startup command.
> -
> -    Initiate the TPM internal state machine.
> -    """
> -    skip_test = u_boot_console.config.env.get('env__tpm_device_test_skip', False)
> -    if skip_test:
> -        pytest.skip('skip TPM device test')
> -    u_boot_console.run_command('tpm2 startup TPM2_SU_CLEAR')
> +    u_boot_console.run_command('tpm2 autostart')
>      output = u_boot_console.run_command('echo $?')
>      assert output.endswith('0')
>
> @@ -92,46 +79,6 @@ def tpm2_sandbox_init(u_boot_console):
>      if skip_test:
>          pytest.skip('skip TPM device test')
>
> - at pytest.mark.buildconfigspec('cmd_tpm_v2')
> -def test_tpm2_sandbox_self_test_full(u_boot_console):
> -    """Execute a TPM2_SelfTest (full) command.
> -
> -    Ask the TPM to perform all self tests to also enable full capabilities.
> -    """
> -    if is_sandbox(u_boot_console):
> -        u_boot_console.restart_uboot()
> -        u_boot_console.run_command('tpm2 init')
> -        output = u_boot_console.run_command('echo $?')
> -        assert output.endswith('0')
> -
> -        u_boot_console.run_command('tpm2 startup TPM2_SU_CLEAR')
> -        output = u_boot_console.run_command('echo $?')
> -        assert output.endswith('0')
> -
> -    skip_test = u_boot_console.config.env.get('env__tpm_device_test_skip', False)
> -    if skip_test:
> -        pytest.skip('skip TPM device test')
> -    u_boot_console.run_command('tpm2 self_test full')
> -    output = u_boot_console.run_command('echo $?')
> -    assert output.endswith('0')
> -
> - at pytest.mark.buildconfigspec('cmd_tpm_v2')
> -def test_tpm2_continue_self_test(u_boot_console):
> -    """Execute a TPM2_SelfTest (continued) command.
> -
> -    Ask the TPM to finish its self tests (alternative to the full test) in order
> -    to enter a fully operational state.
> -    """
> -
> -    skip_test = u_boot_console.config.env.get('env__tpm_device_test_skip', False)
> -    if skip_test:
> -        pytest.skip('skip TPM device test')
> -    if is_sandbox(u_boot_console):
> -        tpm2_sandbox_init(u_boot_console)
> -    u_boot_console.run_command('tpm2 self_test continue')
> -    output = u_boot_console.run_command('echo $?')
> -    assert output.endswith('0')
> -

Can we please preserve this one only?

>  @pytest.mark.buildconfigspec('cmd_tpm_v2')
>  def test_tpm2_clear(u_boot_console):
>      """Execute a TPM2_Clear command.
> --
> 2.42.0.820.g83a721a137-goog
>

Thanks
/Ilias


More information about the U-Boot mailing list