bhyvexml2argvtest.c 7.3 KB
Newer Older
R
Roman Bogorodskiy 已提交
1 2 3 4 5 6 7 8
#include <config.h>

#include "testutils.h"

#ifdef WITH_BHYVE

# include "datatypes.h"

9
# include "bhyve/bhyve_capabilities.h"
10
# include "bhyve/bhyve_domain.h"
R
Roman Bogorodskiy 已提交
11 12 13 14 15 16 17
# include "bhyve/bhyve_utils.h"
# include "bhyve/bhyve_command.h"

# define VIR_FROM_THIS VIR_FROM_BHYVE

static bhyveConn driver;

18 19 20 21 22
typedef enum {
    FLAG_EXPECT_FAILURE     = 1 << 0,
    FLAG_EXPECT_PARSE_ERROR = 1 << 1,
} virBhyveXMLToArgvTestFlags;

R
Roman Bogorodskiy 已提交
23
static int testCompareXMLToArgvFiles(const char *xml,
24 25
                                     const char *cmdline,
                                     const char *ldcmdline,
26 27
                                     const char *dmcmdline,
                                     unsigned int flags)
R
Roman Bogorodskiy 已提交
28
{
29
    char *actualargv = NULL, *actualld = NULL, *actualdm = NULL;
R
Roman Bogorodskiy 已提交
30
    virDomainDefPtr vmdef = NULL;
31
    virCommandPtr cmd = NULL, ldcmd = NULL;
R
Roman Bogorodskiy 已提交
32
    virConnectPtr conn;
R
Roman Bogorodskiy 已提交
33 34
    int ret = -1;

R
Roman Bogorodskiy 已提交
35 36
    if (!(conn = virGetConnect()))
        goto out;
R
Roman Bogorodskiy 已提交
37 38

    if (!(vmdef = virDomainDefParseFile(xml, driver.caps, driver.xmlopt,
39
                                        NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE))) {
40
        if (flags & FLAG_EXPECT_PARSE_ERROR) {
41
            ret = 0;
42 43 44 45 46 47 48
        } else if (flags & FLAG_EXPECT_FAILURE) {
            ret = 0;
            VIR_TEST_DEBUG("Got expected error: %s\n",
                    virGetLastErrorMessage());
            virResetLastError();
        }

R
Roman Bogorodskiy 已提交
49
        goto out;
50
    }
R
Roman Bogorodskiy 已提交
51

52
    conn->privateData = &driver;
R
Roman Bogorodskiy 已提交
53

54
    cmd = virBhyveProcessBuildBhyveCmd(conn, vmdef, false);
55 56 57 58 59
    if (vmdef->os.loader)
        ldcmd = virCommandNew("dummy");
    else
        ldcmd = virBhyveProcessBuildLoadCmd(conn, vmdef, "<device.map>",
                                            &actualdm);
60 61 62 63 64 65 66 67

    if ((cmd == NULL) || (ldcmd == NULL)) {
        if (flags & FLAG_EXPECT_FAILURE) {
            ret = 0;
            VIR_TEST_DEBUG("Got expected error: %s\n",
                    virGetLastErrorMessage());
            virResetLastError();
        }
R
Roman Bogorodskiy 已提交
68
        goto out;
69
    }
R
Roman Bogorodskiy 已提交
70 71 72 73

    if (!(actualargv = virCommandToString(cmd)))
        goto out;

74 75 76 77 78 79
    if (actualdm != NULL)
        virTrimSpaces(actualdm, NULL);

    if (!(actualld = virCommandToString(ldcmd)))
        goto out;

80
    if (virTestCompareToFile(actualargv, cmdline) < 0)
R
Roman Bogorodskiy 已提交
81 82
        goto out;

83
    if (virTestCompareToFile(actualld, ldcmdline) < 0)
84 85
        goto out;

C
Cole Robinson 已提交
86
    if (virFileExists(dmcmdline) || actualdm) {
87
        if (virTestCompareToFile(actualdm, dmcmdline) < 0)
C
Cole Robinson 已提交
88
            goto out;
89 90
    }

R
Roman Bogorodskiy 已提交
91 92 93
    ret = 0;

 out:
94 95 96 97 98 99 100 101 102
    if (vmdef &&
        vmdef->ngraphics == 1 &&
        vmdef->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
        if (vmdef->graphics[0]->data.vnc.autoport)
            virPortAllocatorRelease(gports, vmdef->graphics[0]->data.vnc.port);
        else
            virPortAllocatorSetUsed(gports, vmdef->graphics[0]->data.vnc.port, false);
    }

R
Roman Bogorodskiy 已提交
103
    VIR_FREE(actualargv);
104 105
    VIR_FREE(actualld);
    VIR_FREE(actualdm);
R
Roman Bogorodskiy 已提交
106
    virCommandFree(cmd);
107
    virCommandFree(ldcmd);
R
Roman Bogorodskiy 已提交
108
    virDomainDefFree(vmdef);
109
    virObjectUnref(conn);
R
Roman Bogorodskiy 已提交
110 111 112
    return ret;
}

113 114 115 116 117
struct testInfo {
    const char *name;
    unsigned int flags;
};

R
Roman Bogorodskiy 已提交
118 119 120 121
static int
testCompareXMLToArgvHelper(const void *data)
{
    int ret = -1;
122
    const struct testInfo *info = data;
R
Roman Bogorodskiy 已提交
123
    char *xml = NULL;
124
    char *args = NULL, *ldargs = NULL, *dmargs = NULL;
R
Roman Bogorodskiy 已提交
125 126

    if (virAsprintf(&xml, "%s/bhyvexml2argvdata/bhyvexml2argv-%s.xml",
127
                    abs_srcdir, info->name) < 0 ||
R
Roman Bogorodskiy 已提交
128
        virAsprintf(&args, "%s/bhyvexml2argvdata/bhyvexml2argv-%s.args",
129
                    abs_srcdir, info->name) < 0 ||
130
        virAsprintf(&ldargs, "%s/bhyvexml2argvdata/bhyvexml2argv-%s.ldargs",
131
                    abs_srcdir, info->name) < 0 ||
132
        virAsprintf(&dmargs, "%s/bhyvexml2argvdata/bhyvexml2argv-%s.devmap",
133
                    abs_srcdir, info->name) < 0)
R
Roman Bogorodskiy 已提交
134 135
        goto cleanup;

136
    ret = testCompareXMLToArgvFiles(xml, args, ldargs, dmargs, info->flags);
R
Roman Bogorodskiy 已提交
137 138 139 140

 cleanup:
    VIR_FREE(xml);
    VIR_FREE(args);
141 142
    VIR_FREE(ldargs);
    VIR_FREE(dmargs);
R
Roman Bogorodskiy 已提交
143 144 145 146 147 148 149 150
    return ret;
}

static int
mymain(void)
{
    int ret = 0;

151
    if ((driver.caps = virBhyveCapsBuild()) == NULL)
R
Roman Bogorodskiy 已提交
152 153
        return EXIT_FAILURE;

154
    if ((driver.xmlopt = virBhyveDriverCreateXMLConf(&driver)) == NULL)
R
Roman Bogorodskiy 已提交
155 156
        return EXIT_FAILURE;

157 158
    if (!(driver.remotePorts = virPortAllocatorRangeNew("display", 5900, 65535,
                                                        VIR_PORT_ALLOCATOR_SKIP_BIND_CHECK)))
159 160 161
        return EXIT_FAILURE;


162 163 164 165 166 167
# define DO_TEST_FULL(name, flags) \
    do { \
        static struct testInfo info = { \
            name, (flags) \
        }; \
        if (virTestRun("BHYVE XML-2-ARGV " name, \
168
                       testCompareXMLToArgvHelper, &info) < 0) \
169
            ret = -1; \
R
Roman Bogorodskiy 已提交
170 171
    } while (0)

172
# define DO_TEST(name) \
173 174
    DO_TEST_FULL(name, 0)

175
# define DO_TEST_FAILURE(name) \
176 177
    DO_TEST_FULL(name, FLAG_EXPECT_FAILURE)

178
# define DO_TEST_PARSE_ERROR(name) \
179 180
    DO_TEST_FULL(name, FLAG_EXPECT_PARSE_ERROR)

181
    driver.grubcaps = BHYVE_GRUB_CAP_CONSDEV;
182
    driver.bhyvecaps = BHYVE_CAP_RTC_UTC | BHYVE_CAP_AHCI32SLOT | \
R
Roman Bogorodskiy 已提交
183
                       BHYVE_CAP_NET_E1000 | BHYVE_CAP_LPC_BOOTROM | \
184
                       BHYVE_CAP_FBUF | BHYVE_CAP_XHCI;
R
Roman Bogorodskiy 已提交
185 186 187

    DO_TEST("base");
    DO_TEST("acpiapic");
R
Roman Bogorodskiy 已提交
188
    DO_TEST("disk-cdrom");
R
Roman Bogorodskiy 已提交
189 190
    DO_TEST("disk-virtio");
    DO_TEST("macaddr");
191 192
    DO_TEST("serial");
    DO_TEST("console");
193
    DO_TEST("grub-defaults");
194 195
    DO_TEST("grub-bootorder");
    DO_TEST("grub-bootorder2");
196 197 198 199
    DO_TEST("bhyveload-bootorder");
    DO_TEST("bhyveload-bootorder1");
    DO_TEST_FAILURE("bhyveload-bootorder2");
    DO_TEST("bhyveload-bootorder3");
200
    DO_TEST("bhyveload-explicitargs");
201 202
    DO_TEST_FAILURE("bhyveload-bootorder4");
    DO_TEST_PARSE_ERROR("bhyveload-bootorder5");
203 204
    DO_TEST("custom-loader");
    DO_TEST("disk-cdrom-grub");
205
    DO_TEST("serial-grub");
R
Roman Bogorodskiy 已提交
206
    DO_TEST("localtime");
R
Roman Bogorodskiy 已提交
207
    DO_TEST("net-e1000");
208
    DO_TEST("uefi");
R
Roman Bogorodskiy 已提交
209
    DO_TEST("vnc");
210 211 212
    DO_TEST("vnc-vgaconf-on");
    DO_TEST("vnc-vgaconf-off");
    DO_TEST("vnc-vgaconf-io");
213
    DO_TEST("vnc-autoport");
214

215 216 217 218
    /* Address allocation tests */
    DO_TEST("addr-single-sata-disk");
    DO_TEST("addr-multiple-sata-disks");
    DO_TEST("addr-more-than-32-sata-disks");
219 220
    DO_TEST("addr-single-virtio-disk");
    DO_TEST("addr-multiple-virtio-disks");
221 222 223 224 225 226 227

    /* The same without 32 devs per controller support */
    driver.bhyvecaps ^= BHYVE_CAP_AHCI32SLOT;
    DO_TEST("addr-no32devs-single-sata-disk");
    DO_TEST("addr-no32devs-multiple-sata-disks");
    DO_TEST_FAILURE("addr-no32devs-more-than-32-sata-disks");

228 229 230 231 232 233 234 235
    /* USB xhci tablet */
    DO_TEST("input-xhci-tablet");
    DO_TEST_FAILURE("xhci-multiple-controllers");
    DO_TEST_FAILURE("xhci-no-devs");
    DO_TEST_FAILURE("xhci-multiple-devs");
    driver.bhyvecaps ^= BHYVE_CAP_XHCI;
    DO_TEST_FAILURE("input-xhci-tablet");

236 237 238
    driver.grubcaps = 0;

    DO_TEST("serial-grub-nocons");
R
Roman Bogorodskiy 已提交
239

R
Roman Bogorodskiy 已提交
240 241 242 243
    driver.bhyvecaps &= ~BHYVE_CAP_NET_E1000;

    DO_TEST_FAILURE("net-e1000");

244 245 246
    driver.bhyvecaps &= ~BHYVE_CAP_LPC_BOOTROM;
    DO_TEST_FAILURE("uefi");

R
Roman Bogorodskiy 已提交
247 248 249
    driver.bhyvecaps &= ~BHYVE_CAP_FBUF;
    DO_TEST_FAILURE("vnc");

R
Roman Bogorodskiy 已提交
250 251
    virObjectUnref(driver.caps);
    virObjectUnref(driver.xmlopt);
252
    virPortAllocatorRangeFree(driver.remotePorts);
R
Roman Bogorodskiy 已提交
253 254 255 256

    return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}

257
VIR_TEST_MAIN_PRELOAD(mymain, abs_builddir "/.libs/bhyvexml2argvmock.so")
R
Roman Bogorodskiy 已提交
258 259 260 261 262 263 264 265 266

#else

int main(void)
{
    return EXIT_AM_SKIP;
}

#endif /* WITH_BHYVE */