Hi

On Tue, Aug 3, 2021 at 1:54 AM Stefan Berger <stef...@linux.ibm.com> wrote:

> Use QMP to check whether a given TPM device model is available and if it
> is not the case then do not register the tests that require it.
>
> Signed-off-by: Stefan Berger <stef...@linux.ibm.com>
>

lgtm
Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com>

---
>  tests/qtest/bios-tables-test.c |  8 +++----
>  tests/qtest/tpm-emu.c          | 38 ++++++++++++++++++++++++++++++++++
>  tests/qtest/tpm-emu.h          |  2 ++
>  3 files changed, 43 insertions(+), 5 deletions(-)
>
> diff --git a/tests/qtest/bios-tables-test.c
> b/tests/qtest/bios-tables-test.c
> index 4ccbe56158..89bf55c838 100644
> --- a/tests/qtest/bios-tables-test.c
> +++ b/tests/qtest/bios-tables-test.c
> @@ -1094,7 +1094,6 @@ uint64_t tpm_tis_base_addr;
>  static void test_acpi_tcg_tpm(const char *machine, const char *tpm_if,
>                                uint64_t base, enum TPMVersion tpm_version)
>  {
> -#ifdef CONFIG_TPM
>      gchar *tmp_dir_name =
> g_strdup_printf("qemu-test_acpi_%s_tcg_%s.XXXXXX",
>                                            machine, tpm_if);
>      char *tmp_path = g_dir_make_tmp(tmp_dir_name, NULL);
> @@ -1140,9 +1139,6 @@ static void test_acpi_tcg_tpm(const char *machine,
> const char *tpm_if,
>      g_free(tmp_dir_name);
>      g_free(args);
>      free_test_data(&data);
> -#else
> -    g_test_skip("TPM disabled");
> -#endif
>  }
>
>  static void test_acpi_q35_tcg_tpm_tis(void)
> @@ -1518,7 +1514,9 @@ int main(int argc, char *argv[])
>              return ret;
>          }
>          qtest_add_func("acpi/q35/oem-fields", test_acpi_oem_fields_q35);
> -        qtest_add_func("acpi/q35/tpm-tis", test_acpi_q35_tcg_tpm_tis);
> +        if (tpm_model_is_available("-machine q35", "tpm-tis")) {
> +            qtest_add_func("acpi/q35/tpm2-tis",
> test_acpi_q35_tcg_tpm_tis);
> +        }
>

(I noted the test doesn't use qos)

         qtest_add_func("acpi/piix4", test_acpi_piix4_tcg);
>          qtest_add_func("acpi/oem-fields", test_acpi_oem_fields_pc);
>          qtest_add_func("acpi/piix4/bridge", test_acpi_piix4_tcg_bridge);
> diff --git a/tests/qtest/tpm-emu.c b/tests/qtest/tpm-emu.c
> index 32c704194b..2994d1cf42 100644
> --- a/tests/qtest/tpm-emu.c
> +++ b/tests/qtest/tpm-emu.c
> @@ -16,6 +16,8 @@
>  #include "backends/tpm/tpm_ioctl.h"
>  #include "io/channel-socket.h"
>  #include "qapi/error.h"
> +#include "qapi/qmp/qlist.h"
> +#include "qapi/qmp/qstring.h"
>  #include "tpm-emu.h"
>
>  void tpm_emu_test_wait_cond(TPMTestState *s)
> @@ -192,3 +194,39 @@ void *tpm_emu_ctrl_thread(void *data)
>      object_unref(OBJECT(lioc));
>      return NULL;
>  }
> +
> +bool tpm_model_is_available(const char *args, const char *tpm_if)
> +{
> +    QTestState *qts;
> +    QDict *rsp_tpm;
>
+    bool ret = false;
> +
> +    qts = qtest_init(args);
> +    if (!qts) {
> +        return false;
> +    }
>
+
> +    rsp_tpm = qtest_qmp(qts, "{ 'execute': 'query-tpm'}");
> +    if (!qdict_haskey(rsp_tpm, "error")) {
> +        QDict *rsp_models = qtest_qmp(qts,
> +                                      "{ 'execute': 'query-tpm-models'}");
> +        if (qdict_haskey(rsp_models, "return")) {
> +            QList *models = qdict_get_qlist(rsp_models, "return");
> +            QListEntry *e;
> +
> +            QLIST_FOREACH_ENTRY(models, e) {
> +                QString *s = qobject_to(QString, qlist_entry_obj(e));
> +                const char *ename = qstring_get_str(s);
> +                if (!strcmp(ename, tpm_if)) {
> +                    ret = true;
> +                    break;
> +                }
> +            }
> +        }
> +        qobject_unref(rsp_models);
> +    }
> +    qobject_unref(rsp_tpm);
> +    qtest_quit(qts);
> +
> +    return ret;
> +}
> diff --git a/tests/qtest/tpm-emu.h b/tests/qtest/tpm-emu.h
> index fcb5d7a1d6..c33d99af37 100644
> --- a/tests/qtest/tpm-emu.h
> +++ b/tests/qtest/tpm-emu.h
> @@ -22,6 +22,7 @@
>  #include "qemu/sockets.h"
>  #include "io/channel.h"
>  #include "sysemu/tpm.h"
> +#include "libqos/libqtest.h"
>
>  struct tpm_hdr {
>      uint16_t tag;
> @@ -50,5 +51,6 @@ typedef struct TPMTestState {
>
>  void tpm_emu_test_wait_cond(TPMTestState *s);
>  void *tpm_emu_ctrl_thread(void *data);
> +bool tpm_model_is_available(const char *args, const char *tpm_if);
>
>  #endif /* TESTS_TPM_EMU_H */
> --
> 2.31.1
>
>
>

-- 
Marc-André Lureau

Reply via email to