xref: /openbmc/qemu/tests/qtest/pxe-test.c (revision b23acd3e1fd35a9a8452e793d7a0b0e8cc39714a)
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 "ppc-util.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  
test_pxe_one(const testdef_t * test,bool ipv6)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  
test_pxe_ipv4(gconstpointer data)89  static void test_pxe_ipv4(gconstpointer data)
90  {
91      const testdef_t *test = data;
92  
93      test_pxe_one(test, false);
94  }
95  
test_pxe_ipv6(gconstpointer data)96  static void test_pxe_ipv6(gconstpointer data)
97  {
98      const testdef_t *test = data;
99  
100      test_pxe_one(test, true);
101  }
102  
test_batch(const testdef_t * tests,bool ipv6)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  
main(int argc,char * argv[])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