virhostdevtest.c 17.8 KB
Newer Older
1 2
/*
 * Copyright (C) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
3
 * Copyright (C) 2014-2016 Red Hat, Inc.
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library.  If not, see
 * <http://www.gnu.org/licenses/>.
 *
 * Author: Chunyan Liu <cyliu@suse.com>
 */

#include <config.h>

#include "testutils.h"

#ifdef __linux__

# include <stdlib.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <sys/ioctl.h>
# include <fcntl.h>
# include "virlog.h"
# include "virhostdev.h"

# define VIR_FROM_THIS VIR_FROM_NONE

38 39
VIR_LOG_INIT("tests.hostdevtest");

40 41 42 43 44 45 46 47 48
# define CHECK_LIST_COUNT(list, cnt) \
    do { \
        size_t actualCount; \
        if ((actualCount = virPCIDeviceListCount(list)) != cnt) { \
            virReportError(VIR_ERR_INTERNAL_ERROR, \
                           "Unexpected count of items in " #list ": %zu, " \
                           "expecting %zu", actualCount, (size_t) cnt); \
            goto cleanup; \
        } \
49
    } while (0)
50 51 52 53 54 55 56 57 58

# define TEST_STATE_DIR abs_builddir "/hostdevmgr"
static const char *drv_name = "test_driver";
static const char *dom_name = "test_domain";
static const unsigned char *uuid =
            (unsigned char *)("f92360b0-2541-8791-fb32-d1f838811541");
static int nhostdevs = 3;
static virDomainHostdevDefPtr hostdevs[] = {NULL, NULL, NULL};
static virPCIDevicePtr dev[] = {NULL, NULL, NULL};
59
static virHostdevManagerPtr mgr;
60 61 62 63 64 65 66 67 68 69 70

static void
myCleanup(void)
{
    size_t i;
    for (i = 0; i < nhostdevs; i++) {
         virPCIDeviceFree(dev[i]);
         virDomainHostdevDefFree(hostdevs[i]);
    }

    if (mgr) {
71
        if (!getenv("LIBVIRT_SKIP_CLEANUP"))
72 73
            virFileDeleteTree(mgr->stateDir);

74 75
        virObjectUnref(mgr->activePCIHostdevs);
        virObjectUnref(mgr->activeUSBHostdevs);
76 77
        virObjectUnref(mgr->inactivePCIHostdevs);
        virObjectUnref(mgr->activeSCSIHostdevs);
78 79 80 81 82 83 84 85 86 87 88 89
        VIR_FREE(mgr->stateDir);
        VIR_FREE(mgr);
    }
}

static int
myInit(void)
{
    size_t i;

    for (i = 0; i < nhostdevs; i++) {
        virDomainHostdevSubsys subsys;
J
John Ferlan 已提交
90
        hostdevs[i] = virDomainHostdevDefNew();
91 92 93 94 95 96 97 98 99 100 101 102 103
        if (!hostdevs[i])
            goto cleanup;
        hostdevs[i]->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
        subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI;
        subsys.u.pci.addr.domain = 0;
        subsys.u.pci.addr.bus = 0;
        subsys.u.pci.addr.slot = i + 1;
        subsys.u.pci.addr.function = 0;
        subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM;
        hostdevs[i]->source.subsys = subsys;
    }

    for (i = 0; i < nhostdevs; i++) {
104
        if (!(dev[i] = virPCIDeviceNew(0, 0, i + 1, 0)))
105
            goto cleanup;
106 107

        virPCIDeviceSetStubDriver(dev[i], VIR_PCI_STUB_DRIVER_KVM);
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
    }

    if (VIR_ALLOC(mgr) < 0)
        goto cleanup;
    if ((mgr->activePCIHostdevs = virPCIDeviceListNew()) == NULL)
        goto cleanup;
    if ((mgr->activeUSBHostdevs = virUSBDeviceListNew()) == NULL)
        goto cleanup;
    if ((mgr->inactivePCIHostdevs = virPCIDeviceListNew()) == NULL)
        goto cleanup;
    if ((mgr->activeSCSIHostdevs = virSCSIDeviceListNew()) == NULL)
        goto cleanup;
    if (VIR_STRDUP(mgr->stateDir, TEST_STATE_DIR) < 0)
        goto cleanup;
    if (virFileMakePath(mgr->stateDir) < 0)
        goto cleanup;

    return 0;

127
 cleanup:
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
    myCleanup();
    return -1;
}

# if HAVE_LINUX_KVM_H
#  include <linux/kvm.h>
static bool
virHostdevHostSupportsPassthroughKVM(void)
{
    int kvmfd = -1;
    bool ret = false;

    if ((kvmfd = open("/dev/kvm", O_RDONLY)) < 0)
        goto cleanup;

#  ifdef KVM_CAP_IOMMU
    if ((ioctl(kvmfd, KVM_CHECK_EXTENSION, KVM_CAP_IOMMU)) <= 0)
        goto cleanup;

    ret = true;
#  endif

150
 cleanup:
151 152 153 154 155 156 157 158 159 160 161 162 163
    VIR_FORCE_CLOSE(kvmfd);

    return ret;
}
# else
static bool
virHostdevHostSupportsPassthroughKVM(void)
{
    return false;
}
# endif

static int
164
testVirHostdevPreparePCIHostdevs_unmanaged(void)
165 166
{
    int ret = -1;
167
    size_t active_count, inactive_count, i;
168 169 170 171

    for (i = 0; i < nhostdevs; i++)
         hostdevs[i]->managed = false;

172 173
    active_count = virPCIDeviceListCount(mgr->activePCIHostdevs);
    inactive_count = virPCIDeviceListCount(mgr->inactivePCIHostdevs);
174 175

    /* Test normal functionality */
J
Jiri Denemark 已提交
176
    VIR_DEBUG("Test 0 hostdevs");
177 178 179
    if (virHostdevPreparePCIDevices(mgr, drv_name, dom_name, uuid,
                                    NULL, 0, 0) < 0)
        goto cleanup;
180
    CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count);
181
    CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
182 183

    /* Test unmanaged hostdevs */
J
Jiri Denemark 已提交
184
    VIR_DEBUG("Test >=1 unmanaged hostdevs");
185 186 187
    if (virHostdevPreparePCIDevices(mgr, drv_name, dom_name, uuid,
                                    hostdevs, nhostdevs, 0) < 0)
        goto cleanup;
188 189
    CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count + nhostdevs);
    CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count - nhostdevs);
190 191

    /* Test conflict */
192 193
    active_count = virPCIDeviceListCount(mgr->activePCIHostdevs);
    inactive_count = virPCIDeviceListCount(mgr->inactivePCIHostdevs);
J
Jiri Denemark 已提交
194
    VIR_DEBUG("Test: prepare same hostdevs for same driver/domain again");
195 196 197
    if (!virHostdevPreparePCIDevices(mgr, drv_name, dom_name, uuid,
                                     &hostdevs[0], 1, 0))
        goto cleanup;
198 199
    CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count);
    CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
200

J
Jiri Denemark 已提交
201
    VIR_DEBUG("Test: prepare same hostdevs for same driver, diff domain again");
202 203 204
    if (!virHostdevPreparePCIDevices(mgr, drv_name, "test_domain1", uuid,
                                     &hostdevs[1], 1, 0))
        goto cleanup;
205 206
    CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count);
    CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
207

J
Jiri Denemark 已提交
208
    VIR_DEBUG("Test: prepare same hostdevs for diff driver/domain again");
209 210 211
    if (!virHostdevPreparePCIDevices(mgr, "test_driver1", dom_name, uuid,
                                     &hostdevs[2], 1, 0))
        goto cleanup;
212 213
    CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count);
    CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
214 215 216

    ret = 0;

217
 cleanup:
218 219 220 221 222
    return ret;

}

static int
223
testVirHostdevReAttachPCIHostdevs_unmanaged(void)
224 225
{
    int ret = -1;
226
    size_t active_count, inactive_count, i;
227 228 229

    for (i = 0; i < nhostdevs; i++) {
        if (hostdevs[i]->managed != false) {
J
Jiri Denemark 已提交
230
            VIR_DEBUG("invalid test");
231 232 233 234
            return -1;
        }
    }

235 236
    active_count = virPCIDeviceListCount(mgr->activePCIHostdevs);
    inactive_count = virPCIDeviceListCount(mgr->inactivePCIHostdevs);
237

J
Jiri Denemark 已提交
238
    VIR_DEBUG("Test 0 hostdevs");
239
    virHostdevReAttachPCIDevices(mgr, drv_name, dom_name, NULL, 0, NULL);
240
    CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count);
241
    CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
242

J
Jiri Denemark 已提交
243
    VIR_DEBUG("Test >=1 unmanaged hostdevs");
244 245
    virHostdevReAttachPCIDevices(mgr, drv_name, dom_name,
                                  hostdevs, nhostdevs, NULL);
246 247
    CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count - nhostdevs);
    CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count + nhostdevs);
248 249 250

    ret = 0;

251
 cleanup:
252 253 254 255 256
    return ret;

}

static int
257
testVirHostdevPreparePCIHostdevs_managed(bool mixed)
258 259
{
    int ret = -1;
260
    size_t active_count, inactive_count, i;
261 262 263 264

    for (i = 0; i < nhostdevs; i++)
        hostdevs[i]->managed = true;

265
    active_count = virPCIDeviceListCount(mgr->activePCIHostdevs);
266
    inactive_count = virPCIDeviceListCount(mgr->inactivePCIHostdevs);
267 268

    /* Test normal functionality */
J
Jiri Denemark 已提交
269
    VIR_DEBUG("Test >=1 hostdevs");
270 271 272
    if (virHostdevPreparePCIDevices(mgr, drv_name, dom_name, uuid,
                                     hostdevs, nhostdevs, 0) < 0)
        goto cleanup;
273
    CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count + nhostdevs);
274 275 276 277 278 279 280
    /* If testing a mixed roundtrip, devices are already in the inactive list
     * before we start and are removed from it as soon as we attach them to
     * the guest */
    if (mixed)
        CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count - nhostdevs);
    else
        CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
281 282

    /* Test conflict */
283
    active_count = virPCIDeviceListCount(mgr->activePCIHostdevs);
284
    inactive_count = virPCIDeviceListCount(mgr->inactivePCIHostdevs);
J
Jiri Denemark 已提交
285
    VIR_DEBUG("Test: prepare same hostdevs for same driver/domain again");
286 287 288
    if (!virHostdevPreparePCIDevices(mgr, drv_name, dom_name, uuid,
                                      &hostdevs[0], 1, 0))
        goto cleanup;
289
    CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count);
290
    CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
291

J
Jiri Denemark 已提交
292
    VIR_DEBUG("Test: prepare same hostdevs for same driver, diff domain again");
293 294 295
    if (!virHostdevPreparePCIDevices(mgr, drv_name, "test_domain1", uuid,
                                      &hostdevs[1], 1, 0))
        goto cleanup;
296
    CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count);
297
    CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
298

J
Jiri Denemark 已提交
299
    VIR_DEBUG("Test: prepare same hostdevs for diff driver/domain again");
300 301 302
    if (!virHostdevPreparePCIDevices(mgr, "test_driver1", dom_name, uuid,
                                      &hostdevs[2], 1, 0))
        goto cleanup;
303
    CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count);
304
    CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
305 306 307

    ret = 0;

308
 cleanup:
309 310 311 312 313
    return ret;

}

static int
314
testVirHostdevReAttachPCIHostdevs_managed(bool mixed)
315 316
{
    int ret = -1;
317
    size_t active_count, inactive_count, i;
318 319 320

    for (i = 0; i < nhostdevs; i++) {
        if (hostdevs[i]->managed != true) {
J
Jiri Denemark 已提交
321
            VIR_DEBUG("invalid test");
322 323 324 325
            return -1;
        }
    }

326
    active_count = virPCIDeviceListCount(mgr->activePCIHostdevs);
327
    inactive_count = virPCIDeviceListCount(mgr->inactivePCIHostdevs);
328

J
Jiri Denemark 已提交
329
    VIR_DEBUG("Test 0 hostdevs");
330
    virHostdevReAttachPCIDevices(mgr, drv_name, dom_name, NULL, 0, NULL);
331
    CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count);
332
    CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
333

J
Jiri Denemark 已提交
334
    VIR_DEBUG("Test >=1 hostdevs");
335 336
    virHostdevReAttachPCIDevices(mgr, drv_name, dom_name,
                                  hostdevs, nhostdevs, NULL);
337
    CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count - nhostdevs);
338 339 340 341 342 343
    /* If testing a mixed roundtrip, devices are added back to the inactive
     * list as soon as we detach from the guest */
    if (mixed)
        CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count + nhostdevs);
    else
        CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
344 345 346

    ret = 0;

347
 cleanup:
348 349 350 351 352
    return ret;

}

static int
353
testVirHostdevDetachPCINodeDevice(void)
354 355
{
    int ret = -1;
356
    size_t active_count, inactive_count, i;
357 358

    for (i = 0; i < nhostdevs; i++) {
359
        active_count = virPCIDeviceListCount(mgr->activePCIHostdevs);
360
        inactive_count = virPCIDeviceListCount(mgr->inactivePCIHostdevs);
361 362
        if (virHostdevPCINodeDeviceDetach(mgr, dev[i]) < 0)
            goto cleanup;
363
        CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count);
364
        CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count + 1);
365 366 367 368
    }

    ret = 0;

369
 cleanup:
370 371
    return ret;
}
372

373
static int
374
testVirHostdevResetPCINodeDevice(void)
375 376
{
    int ret = -1;
377
    size_t active_count, inactive_count, i;
378 379

    for (i = 0; i < nhostdevs; i++) {
380 381
        active_count = virPCIDeviceListCount(mgr->activePCIHostdevs);
        inactive_count = virPCIDeviceListCount(mgr->inactivePCIHostdevs);
382 383
        if (virHostdevPCINodeDeviceReset(mgr, dev[i]) < 0)
            goto cleanup;
384 385
        CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count);
        CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
386 387 388 389
    }

    ret = 0;

390
 cleanup:
391 392 393 394 395
    return ret;

}

static int
396
testVirHostdevReAttachPCINodeDevice(void)
397 398
{
    int ret = -1;
399
    size_t active_count, inactive_count, i;
400 401

    for (i = 0; i < nhostdevs; i++) {
402
        active_count = virPCIDeviceListCount(mgr->activePCIHostdevs);
403
        inactive_count = virPCIDeviceListCount(mgr->inactivePCIHostdevs);
404 405
        if (virHostdevPCINodeDeviceReAttach(mgr, dev[i]) < 0)
            goto cleanup;
406
        CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count);
407
        CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count - 1);
408 409 410 411
    }

    ret = 0;

412
 cleanup:
413 414 415 416 417
    return ret;

}

static int
418
testVirHostdevUpdateActivePCIHostdevs(void)
419 420
{
    int ret = -1;
421
    size_t active_count, inactive_count;
422

423
    active_count = virPCIDeviceListCount(mgr->activePCIHostdevs);
424
    inactive_count = virPCIDeviceListCount(mgr->inactivePCIHostdevs);
425

J
Jiri Denemark 已提交
426
    VIR_DEBUG("Test 0 hostdevs");
427 428 429
    if (virHostdevUpdateActivePCIDevices(mgr, NULL, 0,
                                         drv_name, dom_name) < 0)
        goto cleanup;
430
    CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count);
431
    CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
432

J
Jiri Denemark 已提交
433
    VIR_DEBUG("Test >=1 hostdevs");
434 435 436
    if (virHostdevUpdateActivePCIDevices(mgr, hostdevs, nhostdevs,
                                         drv_name, dom_name) < 0)
        goto cleanup;
437
    CHECK_LIST_COUNT(mgr->activePCIHostdevs, active_count + nhostdevs);
438
    CHECK_LIST_COUNT(mgr->inactivePCIHostdevs, inactive_count);
439 440 441

    ret = 0;

442
 cleanup:
443 444 445
    return ret;
}

446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470
/**
 * testVirHostdevRoundtripNoGuest:
 * @opaque: unused
 *
 * Perform a roundtrip without ever assigning devices to the guest.
 *
 *   1. Detach devices from the host
 *   2. Reattach devices to the host
 */
static int
testVirHostdevRoundtripNoGuest(const void *opaque ATTRIBUTE_UNUSED)
{
    int ret = -1;

    if (testVirHostdevDetachPCINodeDevice() < 0)
        goto out;
    if (testVirHostdevReAttachPCINodeDevice() < 0)
        goto out;

    ret = 0;

 out:
    return ret;
}

471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518
/**
 * testVirHostdevRoundtripUnmanaged:
 * @opaque: unused
 *
 * Perform a roundtrip with unmanaged devices.
 *
 *   1. Detach devices from the host
 *   2. Attach devices to the guest as unmanaged
 *   3. Detach devices from the guest as unmanaged
 *   4. Reattach devices to the host
 */
static int
testVirHostdevRoundtripUnmanaged(const void *opaque ATTRIBUTE_UNUSED)
{
    int ret = -1;

    if (testVirHostdevDetachPCINodeDevice() < 0)
        goto out;
    if (virHostdevHostSupportsPassthroughKVM()) {
        if (testVirHostdevPreparePCIHostdevs_unmanaged() < 0)
            goto out;
        if (testVirHostdevReAttachPCIHostdevs_unmanaged() < 0)
            goto out;
    }
    if (testVirHostdevReAttachPCINodeDevice() < 0)
        goto out;

    ret = 0;

 out:
    return ret;
}

/**
 * testVirHostdevRoundtripManaged:
 * @opaque: unused
 *
 * Perform a roundtrip with managed devices.
 *
 *   1. Attach devices to the guest as managed
 *   2. Detach devices from the guest as managed
 */
static int
testVirHostdevRoundtripManaged(const void *opaque ATTRIBUTE_UNUSED)
{
    int ret = -1;

    if (virHostdevHostSupportsPassthroughKVM()) {
519
        if (testVirHostdevPreparePCIHostdevs_managed(false) < 0)
520
            goto out;
521
        if (testVirHostdevReAttachPCIHostdevs_managed(false) < 0)
522 523 524 525 526 527 528 529 530
            goto out;
    }

    ret = 0;

 out:
    return ret;
}

531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564
/**
 * testVirHostdevRoundtripMixed:
 * @opaque: unused
 *
 * Perform a roundtrip with managed devices but manually detach the devices
 * from the host first.
 *
 *   1. Detach devices from the host
 *   2. Attach devices to the guest as managed
 *   3. Detach devices from the guest as managed
 *   4. Reattach devices to the host
 */
static int
testVirHostdevRoundtripMixed(const void *opaque ATTRIBUTE_UNUSED)
{
    int ret = -1;

    if (testVirHostdevDetachPCINodeDevice() < 0)
        goto out;
    if (virHostdevHostSupportsPassthroughKVM()) {
        if (testVirHostdevPreparePCIHostdevs_managed(true) < 0)
            goto out;
        if (testVirHostdevReAttachPCIHostdevs_managed(true) < 0)
            goto out;
    }
    if (testVirHostdevReAttachPCINodeDevice() < 0)
        goto out;

    ret = 0;

 out:
    return ret;
}

565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589
/**
 * testVirHostdevOther:
 * @opaque: unused
 *
 * Perform other operations on devices.
 *
 *   1. Reset devices
 *   2. Update list of active devices
 */
static int
testVirHostdevOther(const void *opaque ATTRIBUTE_UNUSED)
{
    int ret = -1;

    if (testVirHostdevResetPCINodeDevice() < 0)
        goto out;
    if (testVirHostdevUpdateActivePCIHostdevs() < 0)
        goto out;

    ret = 0;

 out:
    return ret;
}

590
# define FAKEROOTDIRTEMPLATE abs_builddir "/fakerootdir-XXXXXX"
591 592 593 594 595

static int
mymain(void)
{
    int ret = 0;
596
    char *fakerootdir;
597

598
    if (VIR_STRDUP_QUIET(fakerootdir, FAKEROOTDIRTEMPLATE) < 0) {
599 600 601 602
        fprintf(stderr, "Out of memory\n");
        abort();
    }

603 604
    if (!mkdtemp(fakerootdir)) {
        fprintf(stderr, "Cannot create fakerootdir");
605 606 607
        abort();
    }

608
    setenv("LIBVIRT_FAKE_ROOT_DIR", fakerootdir, 1);
609

610 611 612 613 614
# define DO_TEST(fnc) \
    do { \
        VIR_DEBUG("Testing: %s", #fnc); \
        if (virTestRun(#fnc, fnc, NULL) < 0) \
            ret = -1; \
615 616 617 618 619
    } while (0)

    if (myInit() < 0)
        fprintf(stderr, "Init data structures failed.");

620
    DO_TEST(testVirHostdevRoundtripNoGuest);
621 622
    DO_TEST(testVirHostdevRoundtripUnmanaged);
    DO_TEST(testVirHostdevRoundtripManaged);
623
    DO_TEST(testVirHostdevRoundtripMixed);
624
    DO_TEST(testVirHostdevOther);
625 626 627 628

    myCleanup();

    if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)
629
        virFileDeleteTree(fakerootdir);
630

631
    VIR_FREE(fakerootdir);
632

633
    return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
634 635
}

636
VIR_TEST_MAIN_PRELOAD(mymain, abs_builddir "/.libs/virpcimock.so")
637 638 639 640 641 642 643
#else
int
main(void)
{
    return EXIT_AM_SKIP;
}
#endif