virtio-blk-test.c 1.7 KB
Newer Older
A
Andreas Färber 已提交
1 2 3 4
/*
 * QTest testcase for VirtIO Block Device
 *
 * Copyright (c) 2014 SUSE LINUX Products GmbH
5
 * Copyright (c) 2014 Marc Marí
A
Andreas Färber 已提交
6 7 8 9 10 11 12
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 * See the COPYING file in the top-level directory.
 */

#include <glib.h>
#include <string.h>
13 14 15
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
A
Andreas Färber 已提交
16
#include "libqtest.h"
17 18 19
#include "libqos/virtio.h"
#include "libqos/virtio-pci.h"
#include "libqos/pci-pc.h"
A
Andreas Färber 已提交
20

21 22 23 24 25
#define TEST_IMAGE_SIZE (64 * 1024 * 1024)
#define PCI_SLOT    0x04
#define PCI_FN      0x00

static QPCIBus *test_start(void)
A
Andreas Färber 已提交
26
{
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
    char cmdline[100];
    char tmp_path[] = "/tmp/qtest.XXXXXX";
    int fd, ret;

    /* Create a temporary raw image */
    fd = mkstemp(tmp_path);
    g_assert_cmpint(fd, >=, 0);
    ret = ftruncate(fd, TEST_IMAGE_SIZE);
    g_assert_cmpint(ret, ==, 0);
    close(fd);

    snprintf(cmdline, 100, "-drive if=none,id=drive0,file=%s "
                            "-device virtio-blk-pci,drive=drive0,addr=%x.%x",
                            tmp_path, PCI_SLOT, PCI_FN);
    qtest_start(cmdline);
    unlink(tmp_path);

    return qpci_init_pc();
}

static void test_end(void)
{
    qtest_end();
}

static void pci_basic(void)
{
    QVirtioPCIDevice *dev;
    QPCIBus *bus;

    bus = test_start();

    dev = qvirtio_pci_device_find(bus, QVIRTIO_BLK_DEVICE_ID);
    g_assert(dev != NULL);
    g_assert_cmphex(dev->vdev.device_type, ==, QVIRTIO_BLK_DEVICE_ID);
    g_assert_cmphex(dev->pdev->devfn, ==, ((PCI_SLOT << 3) | PCI_FN));

    g_free(dev);
    test_end();
A
Andreas Färber 已提交
66 67 68 69 70 71 72 73
}

int main(int argc, char **argv)
{
    int ret;

    g_test_init(&argc, &argv, NULL);

74
    g_test_add_func("/virtio/blk/pci/basic", pci_basic);
A
Andreas Färber 已提交
75

76
    ret = g_test_run();
A
Andreas Färber 已提交
77 78 79

    return ret;
}