/*
 * SMP parsing unit-tests
 *
 * Copyright (c) 2021 Huawei Technologies Co., Ltd
 *
 * Authors:
 *  Yanan Wang <wangyanan55@huawei.com>
 *
 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
 * See the COPYING.LIB file in the top-level directory.
 */

#include "qemu/osdep.h"
#include "qom/object.h"
#include "qemu/module.h"
#include "qapi/error.h"

#include "hw/core/boards.h"

#define T true
#define F false

#define MIN_CPUS 1    /* set the min CPUs supported by the machine as 1 */
#define MAX_CPUS 4096 /* set the max CPUs supported by the machine as 4096 */

#define SMP_MACHINE_NAME "TEST-SMP"

/*
 * Used to define the generic 3-level CPU topology hierarchy
 *  -sockets/cores/threads
 */
#define SMP_CONFIG_GENERIC(ha, a, hb, b, hc, c, hd, d, he, e) \
        {                                                     \
            .has_cpus    = ha, .cpus    = a,                  \
            .has_sockets = hb, .sockets = b,                  \
            .has_cores   = hc, .cores   = c,                  \
            .has_threads = hd, .threads = d,                  \
            .has_maxcpus = he, .maxcpus = e,                  \
        }

#define CPU_TOPOLOGY_GENERIC(a, b, c, d, e)                   \
        {                                                     \
            .cpus     = a,                                    \
            .sockets  = b,                                    \
            .cores    = c,                                    \
            .threads  = d,                                    \
            .max_cpus = e,                                    \
        }

/*
 * Currently a 5-level topology hierarchy is supported on PC machines
 *  -sockets/dies/modules/cores/threads
 */
#define SMP_CONFIG_WITH_MODS_DIES(ha, a, hb, b, hc, c, hd, d, \
                                  he, e, hf, f, hg, g)        \
        {                                                     \
            .has_cpus    = ha, .cpus    = a,                  \
            .has_sockets = hb, .sockets = b,                  \
            .has_dies    = hc, .dies    = c,                  \
            .has_modules = hd, .modules = d,                  \
            .has_cores   = he, .cores   = e,                  \
            .has_threads = hf, .threads = f,                  \
            .has_maxcpus = hg, .maxcpus = g,                  \
        }

/*
 * Currently a 4-level topology hierarchy is supported on ARM virt machines
 *  -sockets/clusters/cores/threads
 */
#define SMP_CONFIG_WITH_CLUSTERS(ha, a, hb, b, hc, c, hd, d, he, e, hf, f) \
        {                                                     \
            .has_cpus     = ha, .cpus     = a,                \
            .has_sockets  = hb, .sockets  = b,                \
            .has_clusters = hc, .clusters = c,                \
            .has_cores    = hd, .cores    = d,                \
            .has_threads  = he, .threads  = e,                \
            .has_maxcpus  = hf, .maxcpus  = f,                \
        }

/*
 * Currently a 5-level topology hierarchy is supported on s390 ccw machines
 *  -drawers/books/sockets/cores/threads
 */
#define SMP_CONFIG_WITH_BOOKS_DRAWERS(ha, a, hb, b, hc, c, hd, \
                                      d, he, e, hf, f, hg, g)  \
        {                                                      \
            .has_cpus     = ha, .cpus     = a,                 \
            .has_drawers  = hb, .drawers  = b,                 \
            .has_books    = hc, .books    = c,                 \
            .has_sockets  = hd, .sockets  = d,                 \
            .has_cores    = he, .cores    = e,                 \
            .has_threads  = hf, .threads  = f,                 \
            .has_maxcpus  = hg, .maxcpus  = g,                 \
        }

/*
 * Currently QEMU supports up to a 8-level topology hierarchy, which is the
 * QEMU's unified abstract representation of CPU topology.
 *  -drawers/books/sockets/dies/clusters/modules/cores/threads
 */
#define SMP_CONFIG_WITH_FULL_TOPO(a, b, c, d, e, f, g, h, i, j) \
        {                                                       \
            .has_cpus     = true, .cpus     = a,                \
            .has_drawers  = true, .drawers  = b,                \
            .has_books    = true, .books    = c,                \
            .has_sockets  = true, .sockets  = d,                \
            .has_dies     = true, .dies     = e,                \
            .has_clusters = true, .clusters = f,                \
            .has_modules  = true, .modules  = g,                \
            .has_cores    = true, .cores    = h,                \
            .has_threads  = true, .threads  = i,                \
            .has_maxcpus  = true, .maxcpus  = j,                \
        }

/**
 * @config - the given SMP configuration
 * @expect_prefer_sockets - the expected parsing result for the
 * valid configuration, when sockets are preferred over cores
 * @expect_prefer_cores - the expected parsing result for the
 * valid configuration, when cores are preferred over sockets
 * @expect_error - the expected error report when the given
 * configuration is invalid
 */
typedef struct SMPTestData {
    SMPConfiguration config;
    CpuTopology expect_prefer_sockets;
    CpuTopology expect_prefer_cores;
    const char *expect_error;
} SMPTestData;

/*
 * List all the possible valid sub-collections of the generic 5
 * topology parameters (i.e. cpus/maxcpus/sockets/cores/threads),
 * then test the automatic calculation algorithm of the missing
 * values in the parser.
 */
static const struct SMPTestData data_generic_valid[] = {
    {
        /* config: no configuration provided
         * expect: cpus=1,sockets=1,cores=1,threads=1,maxcpus=1 */
        .config = SMP_CONFIG_GENERIC(F, 0, F, 0, F, 0, F, 0, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(1, 1, 1, 1, 1),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(1, 1, 1, 1, 1),
    }, {
        /* config: -smp 8
         * prefer_sockets: cpus=8,sockets=8,cores=1,threads=1,maxcpus=8
         * prefer_cores: cpus=8,sockets=1,cores=8,threads=1,maxcpus=8 */
        .config = SMP_CONFIG_GENERIC(T, 8, F, 0, F, 0, F, 0, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 8, 1, 1, 8),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 1, 8, 1, 8),
    }, {
        /* config: -smp sockets=2
         * expect: cpus=2,sockets=2,cores=1,threads=1,maxcpus=2 */
        .config = SMP_CONFIG_GENERIC(F, 0, T, 2, F, 0, F, 0, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(2, 2, 1, 1, 2),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(2, 2, 1, 1, 2),
    }, {
        /* config: -smp cores=4
         * expect: cpus=4,sockets=1,cores=4,threads=1,maxcpus=4 */
        .config = SMP_CONFIG_GENERIC(F, 0, F, 0, T, 4, F, 0, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(4, 1, 4, 1, 4),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(4, 1, 4, 1, 4),
    }, {
        /* config: -smp threads=2
         * expect: cpus=2,sockets=1,cores=1,threads=2,maxcpus=2 */
        .config = SMP_CONFIG_GENERIC(F, 0, F, 0, F, 0, T, 2, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(2, 1, 1, 2, 2),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(2, 1, 1, 2, 2),
    }, {
        /* config: -smp maxcpus=16
         * prefer_sockets: cpus=16,sockets=16,cores=1,threads=1,maxcpus=16
         * prefer_cores: cpus=16,sockets=1,cores=16,threads=1,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(F, 0, F, 0, F, 0, F, 0, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 16, 1, 1, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 1, 16, 1, 16),
    }, {
        /* config: -smp 8,sockets=2
         * expect: cpus=8,sockets=2,cores=4,threads=1,maxcpus=8 */
        .config = SMP_CONFIG_GENERIC(T, 8, T, 2, F, 0, F, 0, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
    }, {
        /* config: -smp 8,cores=4
         * expect: cpus=8,sockets=2,cores=4,threads=1,maxcpus=8 */
        .config = SMP_CONFIG_GENERIC(T, 8, F, 0, T, 4, F, 0, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
    }, {
        /* config: -smp 8,threads=2
         * prefer_sockets: cpus=8,sockets=4,cores=1,threads=2,maxcpus=8
         * prefer_cores: cpus=8,sockets=1,cores=4,threads=2,maxcpus=8 */
        .config = SMP_CONFIG_GENERIC(T, 8, F, 0, F, 0, T, 2, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 4, 1, 2, 8),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 1, 4, 2, 8),
    }, {
        /* config: -smp 8,maxcpus=16
         * prefer_sockets: cpus=8,sockets=16,cores=1,threads=1,maxcpus=16
         * prefer_cores: cpus=8,sockets=1,cores=16,threads=1,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(T, 8, F, 0, F, 0, F, 0, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 16, 1, 1, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 1, 16, 1, 16),
    }, {
        /* config: -smp sockets=2,cores=4
         * expect: cpus=8,sockets=2,cores=4,threads=1,maxcpus=8 */
        .config = SMP_CONFIG_GENERIC(F, 0, T, 2, T, 4, F, 0, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
    }, {
        /* config: -smp sockets=2,threads=2
         * expect: cpus=4,sockets=2,cores=1,threads=2,maxcpus=4 */
        .config = SMP_CONFIG_GENERIC(F, 0, T, 2, F, 0, T, 2, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(4, 2, 1, 2, 4),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(4, 2, 1, 2, 4),
    }, {
        /* config: -smp sockets=2,maxcpus=16
         * expect: cpus=16,sockets=2,cores=8,threads=1,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(F, 0, T, 2, F, 0, F, 0, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 2, 8, 1, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 2, 8, 1, 16),
    }, {
        /* config: -smp cores=4,threads=2
         * expect: cpus=8,sockets=1,cores=4,threads=2,maxcpus=8 */
        .config = SMP_CONFIG_GENERIC(F, 0, F, 0, T, 4, T, 2, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 1, 4, 2, 8),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 1, 4, 2, 8),
    }, {
        /* config: -smp cores=4,maxcpus=16
         * expect: cpus=16,sockets=4,cores=4,threads=1,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(F, 0, F, 0, T, 4, F, 0, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 4, 4, 1, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 4, 4, 1, 16),
    }, {
        /* config: -smp threads=2,maxcpus=16
         * prefer_sockets: cpus=16,sockets=8,cores=1,threads=2,maxcpus=16
         * prefer_cores: cpus=16,sockets=1,cores=8,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(F, 0, F, 0, F, 0, T, 2, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 8, 1, 2, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 1, 8, 2, 16),
    }, {
        /* config: -smp 8,sockets=2,cores=4
         * expect: cpus=8,sockets=2,cores=4,threads=1,maxcpus=8 */
        .config = SMP_CONFIG_GENERIC(T, 8, T, 2, T, 4, F, 0, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
    }, {
        /* config: -smp 8,sockets=2,threads=2
         * expect: cpus=8,sockets=2,cores=2,threads=2,maxcpus=8 */
        .config = SMP_CONFIG_GENERIC(T, 8, T, 2, F, 0, T, 2, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 2, 2, 8),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 2, 2, 8),
    }, {
        /* config: -smp 8,sockets=2,maxcpus=16
         * expect: cpus=8,sockets=2,cores=8,threads=1,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(T, 8, T, 2, F, 0, F, 0, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 8, 1, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 8, 1, 16),
    }, {
        /* config: -smp 8,cores=4,threads=2
         * expect: cpus=8,sockets=1,cores=4,threads=2,maxcpus=8 */
        .config = SMP_CONFIG_GENERIC(T, 8, F, 0, T, 4, T, 2, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 1, 4, 2, 8),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 1, 4, 2, 8),
    }, {
        /* config: -smp 8,cores=4,maxcpus=16
         * expect: cpus=8,sockets=4,cores=4,threads=1,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(T, 8, F, 0, T, 4, F, 0, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 4, 4, 1, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 4, 4, 1, 16),
    }, {
        /* config: -smp 8,threads=2,maxcpus=16
         * prefer_sockets: cpus=8,sockets=8,cores=1,threads=2,maxcpus=16
         * prefer_cores: cpus=8,sockets=1,cores=8,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(T, 8, F, 0, F, 0, T, 2, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 8, 1, 2, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 1, 8, 2, 16),
    }, {
        /* config: -smp sockets=2,cores=4,threads=2
         * expect: cpus=16,sockets=2,cores=4,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(F, 0, T, 2, T, 4, T, 2, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
    }, {
        /* config: -smp sockets=2,cores=4,maxcpus=16
         * expect: cpus=16,sockets=2,cores=4,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(F, 0, T, 2, T, 4, F, 0, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
    }, {
        /* config: -smp sockets=2,threads=2,maxcpus=16
         * expect: cpus=16,sockets=2,cores=4,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(F, 0, T, 2, F, 0, T, 2, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
    }, {
        /* config: -smp cores=4,threads=2,maxcpus=16
         * expect: cpus=16,sockets=2,cores=4,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(F, 0, F, 0, T, 4, T, 2, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
    }, {
        /* config: -smp 8,sockets=2,cores=4,threads=1
         * expect: cpus=8,sockets=2,cores=4,threads=1,maxcpus=8 */
        .config = SMP_CONFIG_GENERIC(T, 8, T, 2, T, 4, T, 1, F, 0),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
    }, {
        /* config: -smp 8,sockets=2,cores=4,maxcpus=16
         * expect: cpus=8,sockets=2,cores=4,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(T, 8, T, 2, T, 4, F, 0, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
    }, {
        /* config: -smp 8,sockets=2,threads=2,maxcpus=16
         * expect: cpus=8,sockets=2,cores=4,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(T, 8, T, 2, F, 0, T, 2, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
    }, {
        /* config: -smp 8,cores=4,threads=2,maxcpus=16
         * expect: cpus=8,sockets=2,cores=4,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(T, 8, F, 0, T, 4, T, 2, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
    }, {
        /* config: -smp sockets=2,cores=4,threads=2,maxcpus=16
         * expect: cpus=16,sockets=2,cores=4,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(F, 0, T, 2, T, 4, T, 2, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
    }, {
        /* config: -smp 8,sockets=2,cores=4,threads=2,maxcpus=16
         * expect: cpus=8,sockets=2,cores=4,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(T, 8, T, 2, T, 4, T, 2, T, 16),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
    }, {
        /*
         * Unsupported parameters are always allowed to be set to '1'
         * config:
         *   -smp 8,drawers=1,books=1,sockets=2,dies=1,clusters=1,modules=1,\
         *        cores=2,threads=2,maxcpus=8
         * expect: cpus=8,sockets=2,cores=2,threads=2,maxcpus=8 */
        .config = SMP_CONFIG_WITH_FULL_TOPO(8, 1, 1, 2, 1, 1, 1, 2, 2, 8),
        .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 2, 2, 8),
        .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 2, 2, 8),
    },
};

static const struct SMPTestData data_generic_invalid[] = {
    {
        /* config: -smp 2,modules=2 */
        .config = SMP_CONFIG_WITH_MODS_DIES(T, 2, F, 0, F, 0, T, 2,
                                            F, 0, F, 0, F, 0),
        .expect_error = "modules > 1 not supported by this machine's CPU topology",
    }, {
        /* config: -smp 2,dies=2 */
        .config = SMP_CONFIG_WITH_MODS_DIES(T, 2, F, 0, T, 2, F, 0,
                                            F, 0, F, 0, F, 0),
        .expect_error = "dies > 1 not supported by this machine's CPU topology",
    }, {
        /* config: -smp 2,clusters=2 */
        .config = SMP_CONFIG_WITH_CLUSTERS(T, 2, F, 0, T, 2, F, 0, F, 0, F, 0),
        .expect_error = "clusters > 1 not supported by this machine's CPU topology",
    }, {
        /* config: -smp 2,books=2 */
        .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 2, F, 0, T, 2, F,
                                                0, F, 0, F, 0, F, 0),
        .expect_error = "books > 1 not supported by this machine's CPU topology",
    }, {
        /* config: -smp 2,drawers=2 */
        .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 2, T, 2, F, 0, F,
                                                0, F, 0, F, 0, F, 0),
        .expect_error = "drawers > 1 not supported by this machine's CPU topology",
    }, {
        /* config: -smp 8,sockets=2,cores=4,threads=2,maxcpus=8 */
        .config = SMP_CONFIG_GENERIC(T, 8, T, 2, T, 4, T, 2, T, 8),
        .expect_error = "Invalid CPU topology: "
                        "product of the hierarchy must match maxcpus: "
                        "sockets (2) * cores (4) * threads (2) "
                        "!= maxcpus (8)",
    }, {
        /* config: -smp 18,sockets=2,cores=4,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_GENERIC(T, 18, T, 2, T, 4, T, 2, T, 16),
        .expect_error = "Invalid CPU topology: "
                        "maxcpus must be equal to or greater than smp: "
                        "sockets (2) * cores (4) * threads (2) "
                        "== maxcpus (16) < smp_cpus (18)",
    }, {
        /*
         * config: -smp 1
         * The test machine should tweak the supported min CPUs to
         * 2 (MIN_CPUS + 1) for testing.
         */
        .config = SMP_CONFIG_GENERIC(T, MIN_CPUS, F, 0, F, 0, F, 0, F, 0),
        .expect_error = "Invalid SMP CPUs 1. The min CPUs supported "
                        "by machine '" SMP_MACHINE_NAME "' is 2",
    }, {
        /*
         * config: -smp 4096
         * The test machine should tweak the supported max CPUs to
         * 4095 (MAX_CPUS - 1) for testing.
         */
        .config = SMP_CONFIG_GENERIC(T, 4096, F, 0, F, 0, F, 0, F, 0),
        .expect_error = "Invalid SMP CPUs 4096. The max CPUs supported "
                        "by machine '" SMP_MACHINE_NAME "' is 4095",
    },
};

static const struct SMPTestData data_with_modules_invalid[] = {
    {
        /* config: -smp 16,sockets=2,modules=2,cores=4,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_WITH_MODS_DIES(T, 16, T, 2, F, 0, T, 2,
                                            T, 4, T, 2, T, 16),
        .expect_error = "Invalid CPU topology: "
                        "product of the hierarchy must match maxcpus: "
                        "sockets (2) * modules (2) * cores (4) * threads (2) "
                        "!= maxcpus (16)",
    }, {
        /* config: -smp 34,sockets=2,modules=2,cores=4,threads=2,maxcpus=32 */
        .config = SMP_CONFIG_WITH_MODS_DIES(T, 34, T, 2, F, 0, T, 2,
                                            T, 4, T, 2, T, 32),
        .expect_error = "Invalid CPU topology: "
                        "maxcpus must be equal to or greater than smp: "
                        "sockets (2) * modules (2) * cores (4) * threads (2) "
                        "== maxcpus (32) < smp_cpus (34)",
    },
};

static const struct SMPTestData data_with_dies_invalid[] = {
    {
        /* config: -smp 16,sockets=2,dies=2,cores=4,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_WITH_MODS_DIES(T, 16, T, 2, T, 2, F, 0,
                                            T, 4, T, 2, T, 16),
        .expect_error = "Invalid CPU topology: "
                        "product of the hierarchy must match maxcpus: "
                        "sockets (2) * dies (2) * cores (4) * threads (2) "
                        "!= maxcpus (16)",
    }, {
        /* config: -smp 34,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
        .config = SMP_CONFIG_WITH_MODS_DIES(T, 34, T, 2, T, 2, F, 0,
                                            T, 4, T, 2, T, 32),
        .expect_error = "Invalid CPU topology: "
                        "maxcpus must be equal to or greater than smp: "
                        "sockets (2) * dies (2) * cores (4) * threads (2) "
                        "== maxcpus (32) < smp_cpus (34)",
    },
};

static const struct SMPTestData data_with_modules_dies_invalid[] = {
    {
        /*
         * config: -smp 200,sockets=3,dies=5,modules=2,cores=4,\
         * threads=2,maxcpus=200
         */
        .config = SMP_CONFIG_WITH_MODS_DIES(T, 200, T, 3, T, 5, T,
                                            2, T, 4, T, 2, T, 200),
        .expect_error = "Invalid CPU topology: "
                        "product of the hierarchy must match maxcpus: "
                        "sockets (3) * dies (5) * modules (2) * "
                        "cores (4) * threads (2) != maxcpus (200)",
    }, {
        /*
         * config: -smp 242,sockets=3,dies=5,modules=2,cores=4,\
         * threads=2,maxcpus=240
         */
        .config = SMP_CONFIG_WITH_MODS_DIES(T, 242, T, 3, T, 5, T,
                                            2, T, 4, T, 2, T, 240),
        .expect_error = "Invalid CPU topology: "
                        "maxcpus must be equal to or greater than smp: "
                        "sockets (3) * dies (5) * modules (2) * "
                        "cores (4) * threads (2) "
                        "== maxcpus (240) < smp_cpus (242)",
    },
};

static const struct SMPTestData data_with_clusters_invalid[] = {
    {
        /* config: -smp 16,sockets=2,clusters=2,cores=4,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_WITH_CLUSTERS(T, 16, T, 2, T, 2, T, 4, T, 2, T, 16),
        .expect_error = "Invalid CPU topology: "
                        "product of the hierarchy must match maxcpus: "
                        "sockets (2) * clusters (2) * cores (4) * threads (2) "
                        "!= maxcpus (16)",
    }, {
        /* config: -smp 34,sockets=2,clusters=2,cores=4,threads=2,maxcpus=32 */
        .config = SMP_CONFIG_WITH_CLUSTERS(T, 34, T, 2, T, 2, T, 4, T, 2, T, 32),
        .expect_error = "Invalid CPU topology: "
                        "maxcpus must be equal to or greater than smp: "
                        "sockets (2) * clusters (2) * cores (4) * threads (2) "
                        "== maxcpus (32) < smp_cpus (34)",
    },
};

static const struct SMPTestData data_with_books_invalid[] = {
    {
        /* config: -smp 16,books=2,sockets=2,cores=4,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 16, F, 0, T, 2, T,
                                                2, T, 4, T, 2, T, 16),
        .expect_error = "Invalid CPU topology: "
                        "product of the hierarchy must match maxcpus: "
                        "books (2) * sockets (2) * cores (4) * threads (2) "
                        "!= maxcpus (16)",
    }, {
        /* config: -smp 34,books=2,sockets=2,cores=4,threads=2,maxcpus=32 */
        .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 34, F, 0, T, 2, T,
                                                2, T, 4, T, 2, T, 32),
        .expect_error = "Invalid CPU topology: "
                        "maxcpus must be equal to or greater than smp: "
                        "books (2) * sockets (2) * cores (4) * threads (2) "
                        "== maxcpus (32) < smp_cpus (34)",
    },
};

static const struct SMPTestData data_with_drawers_invalid[] = {
    {
        /* config: -smp 16,drawers=2,sockets=2,cores=4,threads=2,maxcpus=16 */
        .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 16, T, 2, F, 0, T,
                                                2, T, 4, T, 2, T, 16),
        .expect_error = "Invalid CPU topology: "
                        "product of the hierarchy must match maxcpus: "
                        "drawers (2) * sockets (2) * cores (4) * threads (2) "
                        "!= maxcpus (16)",
    }, {
        /* config: -smp 34,drawers=2,sockets=2,cores=4,threads=2,maxcpus=32 */
        .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 34, T, 2, F, 0, T,
                                                2, T, 4, T, 2, T, 32),
        .expect_error = "Invalid CPU topology: "
                        "maxcpus must be equal to or greater than smp: "
                        "drawers (2) * sockets (2) * cores (4) * threads (2) "
                        "== maxcpus (32) < smp_cpus (34)",
    },
};

static const struct SMPTestData data_with_drawers_books_invalid[] = {
    {
        /*
         * config: -smp 200,drawers=3,books=5,sockets=2,cores=4,\
         *              threads=2,maxcpus=200
         */
        .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 200, T, 3, T, 5, T,
                                                2, T, 4, T, 2, T, 200),
        .expect_error = "Invalid CPU topology: "
                        "product of the hierarchy must match maxcpus: "
                        "drawers (3) * books (5) * sockets (2) * "
                        "cores (4) * threads (2) != maxcpus (200)",
    }, {
        /*
         * config: -smp 242,drawers=3,books=5,sockets=2,cores=4,\
         *              threads=2,maxcpus=240
         */
        .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 242, T, 3, T, 5, T,
                                                2, T, 4, T, 2, T, 240),
        .expect_error = "Invalid CPU topology: "
                        "maxcpus must be equal to or greater than smp: "
                        "drawers (3) * books (5) * sockets (2) * "
                        "cores (4) * threads (2) "
                        "== maxcpus (240) < smp_cpus (242)",
    },
};

static const struct SMPTestData data_full_topo_invalid[] = {
    {
        /*
         * config: -smp 200,drawers=3,books=5,sockets=2,dies=4,\
         *              clusters=2,modules=3,cores=7,threads=2,\
         *              maxcpus=200
         */
        .config = SMP_CONFIG_WITH_FULL_TOPO(200, 3, 5, 2, 4, 2, 3, 7, 2, 200),
        .expect_error = "Invalid CPU topology: "
                        "product of the hierarchy must match maxcpus: "
                        "drawers (3) * books (5) * sockets (2) * dies (4) * "
                        "clusters (2) * modules (3) * cores (7) * threads (2) "
                        "!= maxcpus (200)",
    }, {
        /*
         * config: -smp 2881,drawers=3,books=5,sockets=2,dies=4,\
         *              clusters=2,modules=3,cores=2,threads=2,
         *              maxcpus=2880
         */
        .config = SMP_CONFIG_WITH_FULL_TOPO(2881, 3, 5, 2, 4,
                                            2, 3, 2, 2, 2880),
        .expect_error = "Invalid CPU topology: "
                        "maxcpus must be equal to or greater than smp: "
                        "drawers (3) * books (5) * sockets (2) * "
                        "dies (4) * clusters (2) * modules (3) * "
                        "cores (2) * threads (2) == maxcpus (2880) "
                        "< smp_cpus (2881)",
    }, {
        /*
         * config: -smp 1,drawers=3,books=5,sockets=2,dies=4,\
         *              clusters=2,modules=3,cores=3,threads=3,\
         *              maxcpus=6480
         */
        .config = SMP_CONFIG_WITH_FULL_TOPO(1, 3, 5, 2, 4, 2, 3, 3, 3, 6480),
        .expect_error = "Invalid SMP CPUs 6480. The max CPUs supported "
                        "by machine '" SMP_MACHINE_NAME "' is 4096",
    },
};

static const struct SMPTestData data_zero_topo_invalid[] = {
    {
        /*
         * Test "cpus=0".
         * config: -smp 0,drawers=1,books=1,sockets=1,dies=1,\
         *              clusters=1,modules=1,cores=1,threads=1,\
         *              maxcpus=1
         */
        .config = SMP_CONFIG_WITH_FULL_TOPO(0, 1, 1, 1, 1, 1, 1, 1, 1, 1),
        .expect_error = "Invalid CPU topology: CPU topology parameters must "
                        "be greater than zero",
    }, {
        /*
         * Test "drawers=0".
         * config: -smp 1,drawers=0,books=1,sockets=1,dies=1,\
         *              clusters=1,modules=1,cores=1,threads=1,\
         *              maxcpus=1
         */
        .config = SMP_CONFIG_WITH_FULL_TOPO(1, 0, 1, 1, 1, 1, 1, 1, 1, 1),
        .expect_error = "Invalid CPU topology: CPU topology parameters must "
                        "be greater than zero",
    }, {
        /*
         * Test "books=0".
         * config: -smp 1,drawers=1,books=0,sockets=1,dies=1,\
         *              clusters=1,modules=1,cores=1,threads=1,\
         *              maxcpus=1
         */
        .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 0, 1, 1, 1, 1, 1, 1, 1),
        .expect_error = "Invalid CPU topology: CPU topology parameters must "
                        "be greater than zero",
    }, {
        /*
         * Test "sockets=0".
         * config: -smp 1,drawers=1,books=1,sockets=0,dies=1,\
         *              clusters=1,modules=1,cores=1,threads=1,
         *              maxcpus=1
         */
        .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 1, 0, 1, 1, 1, 1, 1, 1),
        .expect_error = "Invalid CPU topology: CPU topology parameters must "
                        "be greater than zero",
    }, {
        /*
         * Test "dies=0".
         * config: -smp 1,drawers=1,books=1,sockets=1,dies=0,\
         *              clusters=1,modules=1,cores=1,threads=1,\
         *              maxcpus=1
         */
        .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 1, 1, 0, 1, 1, 1, 1, 1),
        .expect_error = "Invalid CPU topology: CPU topology parameters must "
                        "be greater than zero",
    }, {
        /*
         * Test "clusters=0".
         * config: -smp 1,drawers=1,books=1,sockets=1,dies=1,\
         *              clusters=0,modules=1,cores=1,threads=1,\
         *              maxcpus=1
         */
        .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 1, 1, 1, 0, 1, 1, 1, 1),
        .expect_error = "Invalid CPU topology: CPU topology parameters must "
                        "be greater than zero",
    }, {
        /*
         * Test "modules=0".
         * config: -smp 1,drawers=1,books=1,sockets=1,dies=1,\
         *              clusters=1,modules=0,cores=1,threads=1,\
         *              maxcpus=1
         */
        .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 1, 1, 1, 1, 0, 1, 1, 1),
        .expect_error = "Invalid CPU topology: CPU topology parameters must "
                        "be greater than zero",
    }, {
        /*
         * Test "cores=0".
         * config: -smp 1,drawers=1,books=1,sockets=1,dies=1,\
         *              clusters=1,modules=1,cores=0,threads=1,
         *              maxcpus=1
         */
        .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 1, 1, 1, 1, 1, 0, 1, 1),
        .expect_error = "Invalid CPU topology: CPU topology parameters must "
                        "be greater than zero",
    }, {
        /*
         * Test "threads=0".
         * config: -smp 1,drawers=1,books=1,sockets=1,dies=1,\
         *              clusters=1,modules=1,cores=1,threads=0,\
         *              maxcpus=1
         */
        .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 1, 1, 1, 1, 1, 1, 0, 1),
        .expect_error = "Invalid CPU topology: CPU topology parameters must "
                        "be greater than zero",
    }, {
        /*
         * Test "maxcpus=0".
         * config: -smp 1,drawers=1,books=1,sockets=1,dies=1,\
         *              clusters=1,modules=1,cores=1,threads=1,\
         *              maxcpus=0
         */
        .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 1, 1, 1, 1, 1, 1, 1, 0),
        .expect_error = "Invalid CPU topology: CPU topology parameters must "
                        "be greater than zero",
    },
};

static char *smp_config_to_string(const SMPConfiguration *config)
{
    return g_strdup_printf(
        "(SMPConfiguration) {\n"
        "    .has_cpus     = %5s, cpus     = %" PRId64 ",\n"
        "    .has_drawers  = %5s, drawers  = %" PRId64 ",\n"
        "    .has_books    = %5s, books    = %" PRId64 ",\n"
        "    .has_sockets  = %5s, sockets  = %" PRId64 ",\n"
        "    .has_dies     = %5s, dies     = %" PRId64 ",\n"
        "    .has_clusters = %5s, clusters = %" PRId64 ",\n"
        "    .has_modules  = %5s, modules  = %" PRId64 ",\n"
        "    .has_cores    = %5s, cores    = %" PRId64 ",\n"
        "    .has_threads  = %5s, threads  = %" PRId64 ",\n"
        "    .has_maxcpus  = %5s, maxcpus  = %" PRId64 ",\n"
        "}",
        config->has_cpus ? "true" : "false", config->cpus,
        config->has_drawers ? "true" : "false", config->drawers,
        config->has_books ? "true" : "false", config->books,
        config->has_sockets ? "true" : "false", config->sockets,
        config->has_dies ? "true" : "false", config->dies,
        config->has_clusters ? "true" : "false", config->clusters,
        config->has_modules ? "true" : "false", config->modules,
        config->has_cores ? "true" : "false", config->cores,
        config->has_threads ? "true" : "false", config->threads,
        config->has_maxcpus ? "true" : "false", config->maxcpus);
}

/* Use the different calculation than machine_topo_get_threads_per_socket(). */
static unsigned int cpu_topology_get_threads_per_socket(const CpuTopology *topo)
{
    /* Check the divisor to avoid invalid topology examples causing SIGFPE. */
    if (!topo->drawers || !topo->books || !topo->sockets) {
        return 0;
    } else {
        return topo->max_cpus / topo->drawers / topo->books / topo->sockets;
    }
}

/* Use the different calculation than machine_topo_get_cores_per_socket(). */
static unsigned int cpu_topology_get_cores_per_socket(const CpuTopology *topo)
{
    /* Check the divisor to avoid invalid topology examples causing SIGFPE. */
    if (!topo->threads) {
        return 0;
    } else {
        return cpu_topology_get_threads_per_socket(topo) / topo->threads;
    }
}

static char *cpu_topology_to_string(const CpuTopology *topo,
                                    unsigned int threads_per_socket,
                                    unsigned int cores_per_socket,
                                    bool has_clusters)
{
    return g_strdup_printf(
        "(CpuTopology) {\n"
        "    .cpus               = %u,\n"
        "    .drawers            = %u,\n"
        "    .books              = %u,\n"
        "    .sockets            = %u,\n"
        "    .dies               = %u,\n"
        "    .clusters           = %u,\n"
        "    .modules            = %u,\n"
        "    .cores              = %u,\n"
        "    .threads            = %u,\n"
        "    .max_cpus           = %u,\n"
        "    .threads_per_socket = %u,\n"
        "    .cores_per_socket   = %u,\n"
        "    .has_clusters       = %s,\n"
        "}",
        topo->cpus, topo->drawers, topo->books,
        topo->sockets, topo->dies, topo->clusters,
        topo->modules, topo->cores, topo->threads,
        topo->max_cpus, threads_per_socket, cores_per_socket,
        has_clusters ? "true" : "false");
}

static void check_parse(MachineState *ms, const SMPConfiguration *config,
                        const CpuTopology *expect_topo, const char *expect_err,
                        bool is_valid)
{
    MachineClass *mc = MACHINE_GET_CLASS(ms);
    g_autofree char *config_str = smp_config_to_string(config);
    g_autofree char *expect_topo_str = NULL, *output_topo_str = NULL;
    unsigned int expect_threads_per_socket, expect_cores_per_socket;
    unsigned int ms_threads_per_socket, ms_cores_per_socket;
    Error *err = NULL;

    expect_threads_per_socket =
                        cpu_topology_get_threads_per_socket(expect_topo);
    expect_cores_per_socket =
                        cpu_topology_get_cores_per_socket(expect_topo);
    expect_topo_str = cpu_topology_to_string(expect_topo,
                                             expect_threads_per_socket,
                                             expect_cores_per_socket,
                                             config->has_clusters);

    /* call the generic parser */
    machine_parse_smp_config(ms, config, &err);

    ms_threads_per_socket = machine_topo_get_threads_per_socket(ms);
    ms_cores_per_socket = machine_topo_get_cores_per_socket(ms);
    output_topo_str = cpu_topology_to_string(&ms->smp,
                                             ms_threads_per_socket,
                                             ms_cores_per_socket,
                                             mc->smp_props.has_clusters);

    /* when the configuration is supposed to be valid */
    if (is_valid) {
        if ((err == NULL) &&
            (ms->smp.cpus == expect_topo->cpus) &&
            (ms->smp.drawers == expect_topo->drawers) &&
            (ms->smp.books == expect_topo->books) &&
            (ms->smp.sockets == expect_topo->sockets) &&
            (ms->smp.dies == expect_topo->dies) &&
            (ms->smp.clusters == expect_topo->clusters) &&
            (ms->smp.modules == expect_topo->modules) &&
            (ms->smp.cores == expect_topo->cores) &&
            (ms->smp.threads == expect_topo->threads) &&
            (ms->smp.max_cpus == expect_topo->max_cpus) &&
            (ms_threads_per_socket == expect_threads_per_socket) &&
            (ms_cores_per_socket == expect_cores_per_socket) &&
            (mc->smp_props.has_clusters == config->has_clusters)) {
            return;
        }

        if (err != NULL) {
            g_printerr("Test smp_parse failed!\n"
                       "Input configuration: %s\n"
                       "Should be valid: yes\n"
                       "Expected topology: %s\n\n"
                       "Result is valid: no\n"
                       "Output error report: %s\n",
                       config_str, expect_topo_str, error_get_pretty(err));
            goto end;
        }

        g_printerr("Test smp_parse failed!\n"
                   "Input configuration: %s\n"
                   "Should be valid: yes\n"
                   "Expected topology: %s\n\n"
                   "Result is valid: yes\n"
                   "Output topology: %s\n",
                   config_str, expect_topo_str, output_topo_str);
        goto end;
    }

    /* when the configuration is supposed to be invalid */
    if (err != NULL) {
        if (expect_err == NULL ||
            g_str_equal(expect_err, error_get_pretty(err))) {
            error_free(err);
            return;
        }

        g_printerr("Test smp_parse failed!\n"
                   "Input configuration: %s\n"
                   "Should be valid: no\n"
                   "Expected error report: %s\n\n"
                   "Result is valid: no\n"
                   "Output error report: %s\n",
                   config_str, expect_err, error_get_pretty(err));
        goto end;
    }

    g_printerr("Test smp_parse failed!\n"
               "Input configuration: %s\n"
               "Should be valid: no\n"
               "Expected error report: %s\n\n"
               "Result is valid: yes\n"
               "Output topology: %s\n",
               config_str, expect_err, output_topo_str);

end:
    error_free(err);
    abort();
}

static void smp_parse_test(MachineState *ms, SMPTestData *data, bool is_valid)
{
    MachineClass *mc = MACHINE_GET_CLASS(ms);

    mc->smp_props.prefer_sockets = true;
    check_parse(ms, &data->config, &data->expect_prefer_sockets,
                data->expect_error, is_valid);

    mc->smp_props.prefer_sockets = false;
    check_parse(ms, &data->config, &data->expect_prefer_cores,
                data->expect_error, is_valid);
}

/* The parsed results of the unsupported parameters should be 1 */
static void unsupported_params_init(const MachineClass *mc, SMPTestData *data)
{
    if (!mc->smp_props.modules_supported) {
        data->expect_prefer_sockets.modules = 1;
        data->expect_prefer_cores.modules = 1;
    }

    if (!mc->smp_props.dies_supported) {
        data->expect_prefer_sockets.dies = 1;
        data->expect_prefer_cores.dies = 1;
    }

    if (!mc->smp_props.clusters_supported) {
        data->expect_prefer_sockets.clusters = 1;
        data->expect_prefer_cores.clusters = 1;
    }

    if (!mc->smp_props.books_supported) {
        data->expect_prefer_sockets.books = 1;
        data->expect_prefer_cores.books = 1;
    }

    if (!mc->smp_props.drawers_supported) {
        data->expect_prefer_sockets.drawers = 1;
        data->expect_prefer_cores.drawers = 1;
    }
}

static void machine_base_class_init(ObjectClass *oc, const void *data)
{
    MachineClass *mc = MACHINE_CLASS(oc);

    mc->min_cpus = MIN_CPUS;
    mc->max_cpus = MAX_CPUS;

    mc->name = g_strdup(SMP_MACHINE_NAME);
}

static void machine_generic_invalid_class_init(ObjectClass *oc,
                                               const void *data)
{
    MachineClass *mc = MACHINE_CLASS(oc);

    /* Force invalid min CPUs and max CPUs */
    mc->min_cpus = MIN_CPUS + 1;
    mc->max_cpus = MAX_CPUS - 1;
}

static void machine_with_modules_class_init(ObjectClass *oc, const void *data)
{
    MachineClass *mc = MACHINE_CLASS(oc);

    mc->smp_props.modules_supported = true;
}

static void machine_with_dies_class_init(ObjectClass *oc, const void *data)
{
    MachineClass *mc = MACHINE_CLASS(oc);

    mc->smp_props.dies_supported = true;
}

static void machine_with_modules_dies_class_init(ObjectClass *oc,
                                                 const void *data)
{
    MachineClass *mc = MACHINE_CLASS(oc);

    mc->smp_props.modules_supported = true;
    mc->smp_props.dies_supported = true;
}

static void machine_with_clusters_class_init(ObjectClass *oc, const void *data)
{
    MachineClass *mc = MACHINE_CLASS(oc);

    mc->smp_props.clusters_supported = true;
}

static void machine_with_books_class_init(ObjectClass *oc, const void *data)
{
    MachineClass *mc = MACHINE_CLASS(oc);

    mc->smp_props.books_supported = true;
}

static void machine_with_drawers_class_init(ObjectClass *oc, const void *data)
{
    MachineClass *mc = MACHINE_CLASS(oc);

    mc->smp_props.drawers_supported = true;
}

static void machine_with_drawers_books_class_init(ObjectClass *oc,
                                                  const void *data)
{
    MachineClass *mc = MACHINE_CLASS(oc);

    mc->smp_props.drawers_supported = true;
    mc->smp_props.books_supported = true;
}

static void machine_full_topo_class_init(ObjectClass *oc, const void *data)
{
    MachineClass *mc = MACHINE_CLASS(oc);

    mc->smp_props.drawers_supported = true;
    mc->smp_props.books_supported = true;
    mc->smp_props.dies_supported = true;
    mc->smp_props.clusters_supported = true;
    mc->smp_props.modules_supported = true;
}

static void test_generic_valid(const void *opaque)
{
    const char *machine_type = opaque;
    Object *obj = object_new(machine_type);
    MachineState *ms = MACHINE(obj);
    MachineClass *mc = MACHINE_GET_CLASS(obj);
    SMPTestData data = {};
    int i;

    for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
        data = data_generic_valid[i];
        unsupported_params_init(mc, &data);

        smp_parse_test(ms, &data, true);
    }

    object_unref(obj);
}

static void test_generic_invalid(const void *opaque)
{
    const char *machine_type = opaque;
    Object *obj = object_new(machine_type);
    MachineState *ms = MACHINE(obj);
    MachineClass *mc = MACHINE_GET_CLASS(obj);
    SMPTestData data = {};
    int i;

    for (i = 0; i < ARRAY_SIZE(data_generic_invalid); i++) {
        data = data_generic_invalid[i];
        unsupported_params_init(mc, &data);

        smp_parse_test(ms, &data, false);
    }

    object_unref(obj);
}

static void test_with_modules(const void *opaque)
{
    const char *machine_type = opaque;
    Object *obj = object_new(machine_type);
    MachineState *ms = MACHINE(obj);
    MachineClass *mc = MACHINE_GET_CLASS(obj);
    SMPTestData data = {};
    unsigned int num_modules = 2;
    int i;

    for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
        data = data_generic_valid[i];
        unsupported_params_init(mc, &data);

        /* when modules parameter is omitted, it will be set as 1 */
        data.expect_prefer_sockets.modules = 1;
        data.expect_prefer_cores.modules = 1;

        smp_parse_test(ms, &data, true);

        /* when modules parameter is specified */
        data.config.has_modules = true;
        data.config.modules = num_modules;
        if (data.config.has_cpus) {
            data.config.cpus *= num_modules;
        }
        if (data.config.has_maxcpus) {
            data.config.maxcpus *= num_modules;
        }

        data.expect_prefer_sockets.modules = num_modules;
        data.expect_prefer_sockets.cpus *= num_modules;
        data.expect_prefer_sockets.max_cpus *= num_modules;
        data.expect_prefer_cores.modules = num_modules;
        data.expect_prefer_cores.cpus *= num_modules;
        data.expect_prefer_cores.max_cpus *= num_modules;

        smp_parse_test(ms, &data, true);
    }

    for (i = 0; i < ARRAY_SIZE(data_with_modules_invalid); i++) {
        data = data_with_modules_invalid[i];
        unsupported_params_init(mc, &data);

        smp_parse_test(ms, &data, false);
    }

    object_unref(obj);
}

static void test_with_dies(const void *opaque)
{
    const char *machine_type = opaque;
    Object *obj = object_new(machine_type);
    MachineState *ms = MACHINE(obj);
    MachineClass *mc = MACHINE_GET_CLASS(obj);
    SMPTestData data = {};
    unsigned int num_dies = 2;
    int i;

    for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
        data = data_generic_valid[i];
        unsupported_params_init(mc, &data);

        /* when dies parameter is omitted, it will be set as 1 */
        data.expect_prefer_sockets.dies = 1;
        data.expect_prefer_cores.dies = 1;

        smp_parse_test(ms, &data, true);

        /* when dies parameter is specified */
        data.config.has_dies = true;
        data.config.dies = num_dies;
        if (data.config.has_cpus) {
            data.config.cpus *= num_dies;
        }
        if (data.config.has_maxcpus) {
            data.config.maxcpus *= num_dies;
        }

        data.expect_prefer_sockets.dies = num_dies;
        data.expect_prefer_sockets.cpus *= num_dies;
        data.expect_prefer_sockets.max_cpus *= num_dies;
        data.expect_prefer_cores.dies = num_dies;
        data.expect_prefer_cores.cpus *= num_dies;
        data.expect_prefer_cores.max_cpus *= num_dies;

        smp_parse_test(ms, &data, true);
    }

    for (i = 0; i < ARRAY_SIZE(data_with_dies_invalid); i++) {
        data = data_with_dies_invalid[i];
        unsupported_params_init(mc, &data);

        smp_parse_test(ms, &data, false);
    }

    object_unref(obj);
}

static void test_with_modules_dies(const void *opaque)
{
    const char *machine_type = opaque;
    Object *obj = object_new(machine_type);
    MachineState *ms = MACHINE(obj);
    MachineClass *mc = MACHINE_GET_CLASS(obj);
    SMPTestData data = {};
    unsigned int num_modules = 5, num_dies = 3;
    int i;

    for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
        data = data_generic_valid[i];
        unsupported_params_init(mc, &data);

        /*
         * when modules and dies parameters are omitted, they will
         * be both set as 1.
         */
        data.expect_prefer_sockets.modules = 1;
        data.expect_prefer_sockets.dies = 1;
        data.expect_prefer_cores.modules = 1;
        data.expect_prefer_cores.dies = 1;

        smp_parse_test(ms, &data, true);

        /* when modules and dies parameters are both specified */
        data.config.has_modules = true;
        data.config.modules = num_modules;
        data.config.has_dies = true;
        data.config.dies = num_dies;

        if (data.config.has_cpus) {
            data.config.cpus *= num_modules * num_dies;
        }
        if (data.config.has_maxcpus) {
            data.config.maxcpus *= num_modules * num_dies;
        }

        data.expect_prefer_sockets.modules = num_modules;
        data.expect_prefer_sockets.dies = num_dies;
        data.expect_prefer_sockets.cpus *= num_modules * num_dies;
        data.expect_prefer_sockets.max_cpus *= num_modules * num_dies;

        data.expect_prefer_cores.modules = num_modules;
        data.expect_prefer_cores.dies = num_dies;
        data.expect_prefer_cores.cpus *= num_modules * num_dies;
        data.expect_prefer_cores.max_cpus *= num_modules * num_dies;

        smp_parse_test(ms, &data, true);
    }

    for (i = 0; i < ARRAY_SIZE(data_with_modules_dies_invalid); i++) {
        data = data_with_modules_dies_invalid[i];
        unsupported_params_init(mc, &data);

        smp_parse_test(ms, &data, false);
    }

    object_unref(obj);
}

static void test_with_clusters(const void *opaque)
{
    const char *machine_type = opaque;
    Object *obj = object_new(machine_type);
    MachineState *ms = MACHINE(obj);
    MachineClass *mc = MACHINE_GET_CLASS(obj);
    SMPTestData data = {};
    unsigned int num_clusters = 2;
    int i;

    for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
        data = data_generic_valid[i];
        unsupported_params_init(mc, &data);

        /* when clusters parameter is omitted, it will be set as 1 */
        data.expect_prefer_sockets.clusters = 1;
        data.expect_prefer_cores.clusters = 1;

        smp_parse_test(ms, &data, true);

        /* when clusters parameter is specified */
        data.config.has_clusters = true;
        data.config.clusters = num_clusters;
        if (data.config.has_cpus) {
            data.config.cpus *= num_clusters;
        }
        if (data.config.has_maxcpus) {
            data.config.maxcpus *= num_clusters;
        }

        data.expect_prefer_sockets.clusters = num_clusters;
        data.expect_prefer_sockets.cpus *= num_clusters;
        data.expect_prefer_sockets.max_cpus *= num_clusters;
        data.expect_prefer_cores.clusters = num_clusters;
        data.expect_prefer_cores.cpus *= num_clusters;
        data.expect_prefer_cores.max_cpus *= num_clusters;

        smp_parse_test(ms, &data, true);
    }

    for (i = 0; i < ARRAY_SIZE(data_with_clusters_invalid); i++) {
        data = data_with_clusters_invalid[i];
        unsupported_params_init(mc, &data);

        smp_parse_test(ms, &data, false);
    }

    object_unref(obj);
}

static void test_with_books(const void *opaque)
{
    const char *machine_type = opaque;
    Object *obj = object_new(machine_type);
    MachineState *ms = MACHINE(obj);
    MachineClass *mc = MACHINE_GET_CLASS(obj);
    SMPTestData data = {};
    unsigned int num_books = 2;
    int i;

    for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
        data = data_generic_valid[i];
        unsupported_params_init(mc, &data);

        /* when books parameter is omitted, it will be set as 1 */
        data.expect_prefer_sockets.books = 1;
        data.expect_prefer_cores.books = 1;

        smp_parse_test(ms, &data, true);

        /* when books parameter is specified */
        data.config.has_books = true;
        data.config.books = num_books;
        if (data.config.has_cpus) {
            data.config.cpus *= num_books;
        }
        if (data.config.has_maxcpus) {
            data.config.maxcpus *= num_books;
        }

        data.expect_prefer_sockets.books = num_books;
        data.expect_prefer_sockets.cpus *= num_books;
        data.expect_prefer_sockets.max_cpus *= num_books;
        data.expect_prefer_cores.books = num_books;
        data.expect_prefer_cores.cpus *= num_books;
        data.expect_prefer_cores.max_cpus *= num_books;

        smp_parse_test(ms, &data, true);
    }

    for (i = 0; i < ARRAY_SIZE(data_with_books_invalid); i++) {
        data = data_with_books_invalid[i];
        unsupported_params_init(mc, &data);

        smp_parse_test(ms, &data, false);
    }

    object_unref(obj);
}

static void test_with_drawers(const void *opaque)
{
    const char *machine_type = opaque;
    Object *obj = object_new(machine_type);
    MachineState *ms = MACHINE(obj);
    MachineClass *mc = MACHINE_GET_CLASS(obj);
    SMPTestData data = {};
    unsigned int num_drawers = 2;
    int i;

    for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
        data = data_generic_valid[i];
        unsupported_params_init(mc, &data);

        /* when drawers parameter is omitted, it will be set as 1 */
        data.expect_prefer_sockets.drawers = 1;
        data.expect_prefer_cores.drawers = 1;

        smp_parse_test(ms, &data, true);

        /* when drawers parameter is specified */
        data.config.has_drawers = true;
        data.config.drawers = num_drawers;
        if (data.config.has_cpus) {
            data.config.cpus *= num_drawers;
        }
        if (data.config.has_maxcpus) {
            data.config.maxcpus *= num_drawers;
        }

        data.expect_prefer_sockets.drawers = num_drawers;
        data.expect_prefer_sockets.cpus *= num_drawers;
        data.expect_prefer_sockets.max_cpus *= num_drawers;
        data.expect_prefer_cores.drawers = num_drawers;
        data.expect_prefer_cores.cpus *= num_drawers;
        data.expect_prefer_cores.max_cpus *= num_drawers;

        smp_parse_test(ms, &data, true);
    }

    for (i = 0; i < ARRAY_SIZE(data_with_drawers_invalid); i++) {
        data = data_with_drawers_invalid[i];
        unsupported_params_init(mc, &data);

        smp_parse_test(ms, &data, false);
    }

    object_unref(obj);
}

static void test_with_drawers_books(const void *opaque)
{
    const char *machine_type = opaque;
    Object *obj = object_new(machine_type);
    MachineState *ms = MACHINE(obj);
    MachineClass *mc = MACHINE_GET_CLASS(obj);
    SMPTestData data = {};
    unsigned int num_drawers = 5, num_books = 3;
    int i;

    for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
        data = data_generic_valid[i];
        unsupported_params_init(mc, &data);

        /*
         * when drawers and books parameters are omitted, they will
         * be both set as 1.
         */
        data.expect_prefer_sockets.drawers = 1;
        data.expect_prefer_sockets.books = 1;
        data.expect_prefer_cores.drawers = 1;
        data.expect_prefer_cores.books = 1;

        smp_parse_test(ms, &data, true);

        /* when drawers and books parameters are both specified */
        data.config.has_drawers = true;
        data.config.drawers = num_drawers;
        data.config.has_books = true;
        data.config.books = num_books;

        if (data.config.has_cpus) {
            data.config.cpus *= num_drawers * num_books;
        }
        if (data.config.has_maxcpus) {
            data.config.maxcpus *= num_drawers * num_books;
        }

        data.expect_prefer_sockets.drawers = num_drawers;
        data.expect_prefer_sockets.books = num_books;
        data.expect_prefer_sockets.cpus *= num_drawers * num_books;
        data.expect_prefer_sockets.max_cpus *= num_drawers * num_books;

        data.expect_prefer_cores.drawers = num_drawers;
        data.expect_prefer_cores.books = num_books;
        data.expect_prefer_cores.cpus *= num_drawers * num_books;
        data.expect_prefer_cores.max_cpus *= num_drawers * num_books;

        smp_parse_test(ms, &data, true);
    }

    for (i = 0; i < ARRAY_SIZE(data_with_drawers_books_invalid); i++) {
        data = data_with_drawers_books_invalid[i];
        unsupported_params_init(mc, &data);

        smp_parse_test(ms, &data, false);
    }

    object_unref(obj);
}

static void test_full_topo(const void *opaque)
{
    const char *machine_type = opaque;
    Object *obj = object_new(machine_type);
    MachineState *ms = MACHINE(obj);
    MachineClass *mc = MACHINE_GET_CLASS(obj);
    SMPTestData data = {};
    unsigned int drawers, books, dies, clusters, modules, multiplier;
    int i;

    drawers = 5;
    books = 3;
    dies = 2;
    clusters = 3;
    modules = 2;

    multiplier = drawers * books * dies * clusters * modules;
    for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
        data = data_generic_valid[i];
        unsupported_params_init(mc, &data);

        /*
         * when drawers, books, dies, clusters and modules parameters are
         * omitted, they will be set as 1.
         */
        data.expect_prefer_sockets.drawers = 1;
        data.expect_prefer_sockets.books = 1;
        data.expect_prefer_sockets.dies = 1;
        data.expect_prefer_sockets.clusters = 1;
        data.expect_prefer_sockets.modules = 1;
        data.expect_prefer_cores.drawers = 1;
        data.expect_prefer_cores.books = 1;
        data.expect_prefer_cores.dies = 1;
        data.expect_prefer_cores.clusters = 1;
        data.expect_prefer_cores.modules = 1;

        smp_parse_test(ms, &data, true);

        /*
         * when drawers, books, dies, clusters and modules parameters
         * are specified.
         */
        data.config.has_drawers = true;
        data.config.drawers = drawers;
        data.config.has_books = true;
        data.config.books = books;
        data.config.has_dies = true;
        data.config.dies = dies;
        data.config.has_clusters = true;
        data.config.clusters = clusters;
        data.config.has_modules = true;
        data.config.modules = modules;

        if (data.config.has_cpus) {
            data.config.cpus *= multiplier;
        }
        if (data.config.has_maxcpus) {
            data.config.maxcpus *= multiplier;
        }

        data.expect_prefer_sockets.drawers = drawers;
        data.expect_prefer_sockets.books = books;
        data.expect_prefer_sockets.dies = dies;
        data.expect_prefer_sockets.clusters = clusters;
        data.expect_prefer_sockets.modules = modules;
        data.expect_prefer_sockets.cpus *= multiplier;
        data.expect_prefer_sockets.max_cpus *= multiplier;

        data.expect_prefer_cores.drawers = drawers;
        data.expect_prefer_cores.books = books;
        data.expect_prefer_cores.dies = dies;
        data.expect_prefer_cores.clusters = clusters;
        data.expect_prefer_cores.modules = modules;
        data.expect_prefer_cores.cpus *= multiplier;
        data.expect_prefer_cores.max_cpus *= multiplier;

        smp_parse_test(ms, &data, true);
    }

    for (i = 0; i < ARRAY_SIZE(data_full_topo_invalid); i++) {
        data = data_full_topo_invalid[i];
        unsupported_params_init(mc, &data);

        smp_parse_test(ms, &data, false);
    }

    for (i = 0; i < ARRAY_SIZE(data_zero_topo_invalid); i++) {
        data = data_zero_topo_invalid[i];
        unsupported_params_init(mc, &data);

        smp_parse_test(ms, &data, false);
    }

    object_unref(obj);
}

/* Type info of the tested machine */
static const TypeInfo smp_machine_types[] = {
    {
        .name           = TYPE_MACHINE,
        .parent         = TYPE_OBJECT,
        .abstract       = true,
        .class_init     = machine_base_class_init,
        .class_size     = sizeof(MachineClass),
        .instance_size  = sizeof(MachineState),
    }, {
        .name           = MACHINE_TYPE_NAME("smp-generic-valid"),
        .parent         = TYPE_MACHINE,
    }, {
        .name           = MACHINE_TYPE_NAME("smp-generic-invalid"),
        .parent         = TYPE_MACHINE,
        .class_init     = machine_generic_invalid_class_init,
    }, {
        .name           = MACHINE_TYPE_NAME("smp-with-modules"),
        .parent         = TYPE_MACHINE,
        .class_init     = machine_with_modules_class_init,
    }, {
        .name           = MACHINE_TYPE_NAME("smp-with-dies"),
        .parent         = TYPE_MACHINE,
        .class_init     = machine_with_dies_class_init,
    }, {
        .name           = MACHINE_TYPE_NAME("smp-with-modules-dies"),
        .parent         = TYPE_MACHINE,
        .class_init     = machine_with_modules_dies_class_init,
    }, {
        .name           = MACHINE_TYPE_NAME("smp-with-clusters"),
        .parent         = TYPE_MACHINE,
        .class_init     = machine_with_clusters_class_init,
    }, {
        .name           = MACHINE_TYPE_NAME("smp-with-books"),
        .parent         = TYPE_MACHINE,
        .class_init     = machine_with_books_class_init,
    }, {
        .name           = MACHINE_TYPE_NAME("smp-with-drawers"),
        .parent         = TYPE_MACHINE,
        .class_init     = machine_with_drawers_class_init,
    }, {
        .name           = MACHINE_TYPE_NAME("smp-with-drawers-books"),
        .parent         = TYPE_MACHINE,
        .class_init     = machine_with_drawers_books_class_init,
    }, {
        .name           = MACHINE_TYPE_NAME("smp-full-topo"),
        .parent         = TYPE_MACHINE,
        .class_init     = machine_full_topo_class_init,
    }
};

DEFINE_TYPES(smp_machine_types)

int main(int argc, char *argv[])
{
    module_call_init(MODULE_INIT_QOM);

    g_test_init(&argc, &argv, NULL);

    g_test_add_data_func("/test-smp-parse/generic/valid",
                         MACHINE_TYPE_NAME("smp-generic-valid"),
                         test_generic_valid);
    g_test_add_data_func("/test-smp-parse/generic/invalid",
                         MACHINE_TYPE_NAME("smp-generic-invalid"),
                         test_generic_invalid);
    g_test_add_data_func("/test-smp-parse/with_modules",
                         MACHINE_TYPE_NAME("smp-with-modules"),
                         test_with_modules);
    g_test_add_data_func("/test-smp-parse/with_dies",
                         MACHINE_TYPE_NAME("smp-with-dies"),
                         test_with_dies);
    g_test_add_data_func("/test-smp-parse/with_modules_dies",
                         MACHINE_TYPE_NAME("smp-with-modules-dies"),
                         test_with_modules_dies);
    g_test_add_data_func("/test-smp-parse/with_clusters",
                         MACHINE_TYPE_NAME("smp-with-clusters"),
                         test_with_clusters);
    g_test_add_data_func("/test-smp-parse/with_books",
                         MACHINE_TYPE_NAME("smp-with-books"),
                         test_with_books);
    g_test_add_data_func("/test-smp-parse/with_drawers",
                         MACHINE_TYPE_NAME("smp-with-drawers"),
                         test_with_drawers);
    g_test_add_data_func("/test-smp-parse/with_drawers_books",
                         MACHINE_TYPE_NAME("smp-with-drawers-books"),
                         test_with_drawers_books);
    g_test_add_data_func("/test-smp-parse/full",
                         MACHINE_TYPE_NAME("smp-full-topo"),
                         test_full_topo);

    g_test_run();

    return 0;
}
