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 "libqtest.h" 18 #include "boot-sector.h" 19 #include "libqos/libqos-spapr.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 vsmt=8," PSERIES_DEFAULT_CAPABILITIES }, 50 { "pseries", "virtio-net-pci", 51 "-machine vsmt=8," PSERIES_DEFAULT_CAPABILITIES }, 52 { NULL }, 53 }; 54 55 static testdef_t ppc64_tests_slow[] = { 56 { "pseries", "e1000", 57 "-machine vsmt=8," PSERIES_DEFAULT_CAPABILITIES }, 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 if (!qtest_has_device(test->model)) { 112 continue; 113 } 114 115 testname = g_strdup_printf("pxe/ipv4/%s/%s", 116 test->machine, test->model); 117 qtest_add_data_func(testname, test, test_pxe_ipv4); 118 g_free(testname); 119 120 if (ipv6) { 121 testname = g_strdup_printf("pxe/ipv6/%s/%s", 122 test->machine, test->model); 123 qtest_add_data_func(testname, test, test_pxe_ipv6); 124 g_free(testname); 125 } 126 } 127 } 128 129 int main(int argc, char *argv[]) 130 { 131 int ret; 132 const char *arch = qtest_get_arch(); 133 134 g_test_init(&argc, &argv, NULL); 135 136 if (!qtest_has_accel("tcg") && !qtest_has_accel("kvm")) { 137 g_test_skip("No KVM or TCG accelerator available"); 138 return 0; 139 } 140 141 ret = boot_sector_init(disk); 142 if(ret) 143 return ret; 144 145 146 if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { 147 test_batch(x86_tests, false); 148 if (g_test_slow()) { 149 test_batch(x86_tests_slow, false); 150 } 151 } else if (strcmp(arch, "ppc64") == 0) { 152 test_batch(ppc64_tests, g_test_slow()); 153 if (g_test_slow()) { 154 test_batch(ppc64_tests_slow, true); 155 } 156 } else if (g_str_equal(arch, "s390x")) { 157 test_batch(s390x_tests, g_test_slow()); 158 } 159 ret = g_test_run(); 160 boot_sector_cleanup(disk); 161 return ret; 162 } 163