| /* |
| * PXE test cases. |
| * |
| * Copyright (c) 2016, 2017 Red Hat Inc. |
| * |
| * Authors: |
| * Michael S. Tsirkin <mst@redhat.com>, |
| * Victor Kaplansky <victork@redhat.com> |
| * Thomas Huth <thuth@redhat.com> |
| * |
| * 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 "qemu/osdep.h" |
| #include <glib/gstdio.h> |
| #include "libqtest.h" |
| #include "boot-sector.h" |
| #include "libqos/libqos-spapr.h" |
| |
| #define NETNAME "net0" |
| |
| static char disk[] = "tests/pxe-test-disk-XXXXXX"; |
| |
| typedef struct testdef { |
| const char *machine; /* Machine type */ |
| const char *model; /* NIC device model */ |
| const char *extra; /* Any additional parameters */ |
| } testdef_t; |
| |
| static testdef_t x86_tests[] = { |
| { "pc", "e1000" }, |
| { "pc", "virtio-net-pci" }, |
| { "q35", "e1000e" }, |
| { "q35", "virtio-net-pci", }, |
| { NULL }, |
| }; |
| |
| static testdef_t x86_tests_slow[] = { |
| { "pc", "ne2k_pci", }, |
| { "pc", "i82550", }, |
| { "pc", "rtl8139" }, |
| { "pc", "vmxnet3" }, |
| { NULL }, |
| }; |
| |
| static testdef_t ppc64_tests[] = { |
| { "pseries", "spapr-vlan", |
| "-machine vsmt=8," PSERIES_DEFAULT_CAPABILITIES }, |
| { "pseries", "virtio-net-pci", |
| "-machine vsmt=8," PSERIES_DEFAULT_CAPABILITIES }, |
| { NULL }, |
| }; |
| |
| static testdef_t ppc64_tests_slow[] = { |
| { "pseries", "e1000", |
| "-machine vsmt=8," PSERIES_DEFAULT_CAPABILITIES }, |
| { NULL }, |
| }; |
| |
| static testdef_t s390x_tests[] = { |
| { "s390-ccw-virtio", "virtio-net-ccw" }, |
| { NULL }, |
| }; |
| |
| static void test_pxe_one(const testdef_t *test, bool ipv6) |
| { |
| QTestState *qts; |
| char *args; |
| const char *extra = test->extra; |
| |
| if (!extra) { |
| extra = ""; |
| } |
| |
| args = g_strdup_printf( |
| "-accel kvm -accel tcg -machine %s -nodefaults -boot order=n " |
| "-netdev user,id=" NETNAME ",tftp=./,bootfile=%s,ipv4=%s,ipv6=%s " |
| "-device %s,bootindex=1,netdev=" NETNAME " %s", |
| test->machine, disk, ipv6 ? "off" : "on", ipv6 ? "on" : "off", |
| test->model, extra); |
| |
| qts = qtest_init(args); |
| boot_sector_test(qts); |
| qtest_quit(qts); |
| g_free(args); |
| } |
| |
| static void test_pxe_ipv4(gconstpointer data) |
| { |
| const testdef_t *test = data; |
| |
| test_pxe_one(test, false); |
| } |
| |
| static void test_pxe_ipv6(gconstpointer data) |
| { |
| const testdef_t *test = data; |
| |
| test_pxe_one(test, true); |
| } |
| |
| static void test_batch(const testdef_t *tests, bool ipv6) |
| { |
| int i; |
| |
| for (i = 0; tests[i].machine; i++) { |
| const testdef_t *test = &tests[i]; |
| char *testname; |
| |
| if (!qtest_has_device(test->model)) { |
| continue; |
| } |
| |
| testname = g_strdup_printf("pxe/ipv4/%s/%s", |
| test->machine, test->model); |
| qtest_add_data_func(testname, test, test_pxe_ipv4); |
| g_free(testname); |
| |
| if (ipv6) { |
| testname = g_strdup_printf("pxe/ipv6/%s/%s", |
| test->machine, test->model); |
| qtest_add_data_func(testname, test, test_pxe_ipv6); |
| g_free(testname); |
| } |
| } |
| } |
| |
| int main(int argc, char *argv[]) |
| { |
| int ret; |
| const char *arch = qtest_get_arch(); |
| |
| g_test_init(&argc, &argv, NULL); |
| |
| if (!qtest_has_accel("tcg") && !qtest_has_accel("kvm")) { |
| g_test_skip("No KVM or TCG accelerator available"); |
| return 0; |
| } |
| |
| ret = boot_sector_init(disk); |
| if(ret) |
| return ret; |
| |
| |
| if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { |
| test_batch(x86_tests, false); |
| if (g_test_slow()) { |
| test_batch(x86_tests_slow, false); |
| } |
| } else if (strcmp(arch, "ppc64") == 0) { |
| test_batch(ppc64_tests, g_test_slow()); |
| if (g_test_slow()) { |
| test_batch(ppc64_tests_slow, true); |
| } |
| } else if (g_str_equal(arch, "s390x")) { |
| test_batch(s390x_tests, g_test_slow()); |
| } |
| ret = g_test_run(); |
| boot_sector_cleanup(disk); |
| return ret; |
| } |