1 /* 2 * PXE test cases. 3 * 4 * Copyright (c) 2016, 2017 Red Hat Inc. 5 * 6 * Authors: 7 * Michael S. Tsirkin <mst@redhat.com>, 8 * Victor Kaplansky <victork@redhat.com> 9 * Thomas Huth <thuth@redhat.com> 10 * 11 * This work is licensed under the terms of the GNU GPL, version 2 or later. 12 * See the COPYING file in the top-level directory. 13 */ 14 15 #include "qemu/osdep.h" 16 #include <glib/gstdio.h> 17 #include "qemu-common.h" 18 #include "libqtest.h" 19 #include "boot-sector.h" 20 21 #define NETNAME "net0" 22 23 static char disk[] = "tests/pxe-test-disk-XXXXXX"; 24 25 typedef struct testdef { 26 const char *machine; /* Machine type */ 27 const char *model; /* NIC device model */ 28 const char *extra; /* Any additional parameters */ 29 } testdef_t; 30 31 static testdef_t x86_tests[] = { 32 { "pc", "e1000" }, 33 { "pc", "virtio-net-pci" }, 34 { "q35", "e1000e" }, 35 { "q35", "virtio-net-pci", }, 36 { NULL }, 37 }; 38 39 static testdef_t x86_tests_slow[] = { 40 { "pc", "ne2k_pci", }, 41 { "pc", "i82550", }, 42 { "pc", "rtl8139" }, 43 { "pc", "vmxnet3" }, 44 { NULL }, 45 }; 46 47 static testdef_t ppc64_tests[] = { 48 { "pseries", "spapr-vlan", 49 "-machine cap-cfpc=broken,cap-sbbc=broken,cap-ibs=broken,vsmt=8" }, 50 { "pseries", "virtio-net-pci", 51 "-machine cap-cfpc=broken,cap-sbbc=broken,cap-ibs=broken,vsmt=8" }, 52 { NULL }, 53 }; 54 55 static testdef_t ppc64_tests_slow[] = { 56 { "pseries", "e1000", 57 "-machine cap-cfpc=broken,cap-sbbc=broken,cap-ibs=broken,vsmt=8" }, 58 { NULL }, 59 }; 60 61 static testdef_t s390x_tests[] = { 62 { "s390-ccw-virtio", "virtio-net-ccw" }, 63 { NULL }, 64 }; 65 66 static void test_pxe_one(const testdef_t *test, bool ipv6) 67 { 68 QTestState *qts; 69 char *args; 70 const char *extra = test->extra; 71 72 if (!extra) { 73 extra = ""; 74 } 75 76 args = g_strdup_printf( 77 "-accel kvm -accel tcg -machine %s -nodefaults -boot order=n " 78 "-netdev user,id=" NETNAME ",tftp=./,bootfile=%s,ipv4=%s,ipv6=%s " 79 "-device %s,bootindex=1,netdev=" NETNAME " %s", 80 test->machine, disk, ipv6 ? "off" : "on", ipv6 ? "on" : "off", 81 test->model, extra); 82 83 qts = qtest_init(args); 84 boot_sector_test(qts); 85 qtest_quit(qts); 86 g_free(args); 87 } 88 89 static void test_pxe_ipv4(gconstpointer data) 90 { 91 const testdef_t *test = data; 92 93 test_pxe_one(test, false); 94 } 95 96 static void test_pxe_ipv6(gconstpointer data) 97 { 98 const testdef_t *test = data; 99 100 test_pxe_one(test, true); 101 } 102 103 static void test_batch(const testdef_t *tests, bool ipv6) 104 { 105 int i; 106 107 for (i = 0; tests[i].machine; i++) { 108 const testdef_t *test = &tests[i]; 109 char *testname; 110 111 testname = g_strdup_printf("pxe/ipv4/%s/%s", 112 test->machine, test->model); 113 qtest_add_data_func(testname, test, test_pxe_ipv4); 114 g_free(testname); 115 116 if (ipv6) { 117 testname = g_strdup_printf("pxe/ipv6/%s/%s", 118 test->machine, test->model); 119 qtest_add_data_func(testname, test, test_pxe_ipv6); 120 g_free(testname); 121 } 122 } 123 } 124 125 int main(int argc, char *argv[]) 126 { 127 int ret; 128 const char *arch = qtest_get_arch(); 129 130 ret = boot_sector_init(disk); 131 if(ret) 132 return ret; 133 134 g_test_init(&argc, &argv, NULL); 135 136 if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { 137 test_batch(x86_tests, false); 138 if (g_test_slow()) { 139 test_batch(x86_tests_slow, false); 140 } 141 } else if (strcmp(arch, "ppc64") == 0) { 142 test_batch(ppc64_tests, g_test_slow()); 143 if (g_test_slow()) { 144 test_batch(ppc64_tests_slow, true); 145 } 146 } else if (g_str_equal(arch, "s390x")) { 147 test_batch(s390x_tests, g_test_slow()); 148 } 149 ret = g_test_run(); 150 boot_sector_cleanup(disk); 151 return ret; 152 } 153