aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Hajnoczi <stefanha@redhat.com>2022-09-28 17:04:11 -0400
committerStefan Hajnoczi <stefanha@redhat.com>2022-09-28 17:04:11 -0400
commitc8de6ec63d766ca1998c5af468483ce912fdc0c2 (patch)
treea52db66c3f796445b2923ac2d752d497baebab6b
parent36cd0aeac3337af06875e08683380389df48ccd0 (diff)
parent0b49bc1b713d6e3896179f9700c8c35e511075f6 (diff)
Merge tag 'pull-request-2022-09-28' of https://gitlab.com/thuth/qemu into staging
* Fixes for qtests and unit tests to be more portable to non-POSIX platforms # -----BEGIN PGP SIGNATURE----- # # iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmMz9MQRHHRodXRoQHJl # ZGhhdC5jb20ACgkQLtnXdP5wLbVUKRAAnubo/wtHqjxg/yVO68odX2LFI2koligA # LcEAnhGkVJ/Pe/+Qo9yVbcOY6k6xfGQU3VIipqvLEwPAdSF0E43EJxlImBNm8/Zq # MggjNoepXRhdFGULONSmSNm7HJykLH/CHdmBjPLrbpkTCwWG1gg64xP9fI+b8mGf # vST0ADuYloLDA9J45UbC33AD+9dQsy2GeOs8X99O6ysKF3htEqMD3vBdqKiJSwgT # 2c7UqySGECn6kMHl7iAdipRNUghSgzpUe8LcH4jP7Y1XnoB3zwC/+VrOVwFESI6y # LVFsC8u7cEKKSYunoowfQTgHvYbCuSdrDqljy17NE5qRMziKMTnhXaQNR5wtBKNt # HZxvc082P/QDFdBYYY3MIjB27r/I6x0t6Xl4IVwLz7bK0xfHFF8Ba2Lr57/2RTc/ # SMPDxGrMicTPnPDU/Cw5VROMmw0OC/tVpJMGo1VjVnNESo581RAMApyzkWiUyfZj # ktKd+4ihmqrBXcZHVjKbIufa6eKNuktlkfv72dnJY4XoUlDHlbDYaVuknybZmxWK # 9/CDVDG72s5Cqm+M47Q56IagVVZwIGrUP0u3j3h/v0rnHZehY8Qzr3SLEfeqmUb6 # nP7MP+ItZFZtMITdvXb3OtyeVuM0ZSw8kt+/evpvC9zB6FjgYl/e5FppsO0HxB/O # PeeV43Bk270= # =n+FM # -----END PGP SIGNATURE----- # gpg: Signature made Wed 28 Sep 2022 03:16:20 EDT # gpg: using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5 # gpg: issuer "thuth@redhat.com" # gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full] # gpg: aka "Thomas Huth <thuth@redhat.com>" [full] # gpg: aka "Thomas Huth <huth@tuxfamily.org>" [full] # gpg: aka "Thomas Huth <th.huth@posteo.de>" [unknown] # Primary key fingerprint: 27B8 8847 EEE0 2501 18F3 EAB9 2ED9 D774 FE70 2DB5 * tag 'pull-request-2022-09-28' of https://gitlab.com/thuth/qemu: (37 commits) docs/devel: testing: Document writing portable test cases tests/qtest: boot-serial-test: Close the serial file before starting QEMU tests/qtest: vhost-user-test: Avoid using hardcoded /tmp tests/qtest: qmp-test: Avoid using hardcoded /tmp tests/qtest: pflash-cfi02-test: Avoid using hardcoded /tmp tests/qtest: hd-geo-test: Avoid using hardcoded /tmp tests/x86: Move common code to function in device-plug-test .gitlab-ci.d/windows.yml: Display meson test logs tests/qtest: migration-test: Skip running some TLS cases for win32 tests/qtest: libqtest: Replace the call to close a socket with closesocket() tests/qtest: microbit-test: Fix socket access for win32 tests/qtest: virtio-net-failover: Disable migration tests for win32 tests/qtest: ide-test: Open file in binary mode tests/qtest: migration-test: Disable IO redirection for win32 tests/qtest: bios-tables-test: Adapt the case for win32 tests/qtest: {ahci, ide}-test: Use relative path for temporary files for win32 tests/qtest: libqtest: Exclude the *_fds APIs for win32 tests/qtest: libqtest: Adapt global_qtest declaration for win32 tests/qtest: qmp-test: Skip running test_qmp_oob for win32 tests/qtest: Build test-filter-{mirror, redirector} cases for posix only ... Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
-rw-r--r--.gitlab-ci.d/windows.yml4
-rw-r--r--docs/devel/testing.rst30
-rw-r--r--tests/qtest/ahci-test.c36
-rw-r--r--tests/qtest/aspeed_smc-test.c5
-rw-r--r--tests/qtest/bios-tables-test.c12
-rw-r--r--tests/qtest/boot-serial-test.c11
-rw-r--r--tests/qtest/cxl-test.c15
-rw-r--r--tests/qtest/device-plug-test.c42
-rw-r--r--tests/qtest/fdc-test.c5
-rw-r--r--tests/qtest/fuzz/generic_fuzz_configs.h4
-rw-r--r--tests/qtest/fuzz/virtio_blk_fuzz.c4
-rw-r--r--tests/qtest/hd-geo-test.c24
-rw-r--r--tests/qtest/i440fx-test.c54
-rw-r--r--tests/qtest/ide-test.c30
-rw-r--r--tests/qtest/libqtest-single.h4
-rw-r--r--tests/qtest/libqtest.c30
-rw-r--r--tests/qtest/libqtest.h8
-rw-r--r--tests/qtest/meson.build36
-rw-r--r--tests/qtest/microbit-test.c10
-rw-r--r--tests/qtest/migration-test.c23
-rw-r--r--tests/qtest/pflash-cfi02-test.c15
-rw-r--r--tests/qtest/qmp-test.c17
-rw-r--r--tests/qtest/vhost-user-blk-test.c3
-rw-r--r--tests/qtest/vhost-user-test.c10
-rw-r--r--tests/qtest/virtio-blk-test.c4
-rw-r--r--tests/qtest/virtio-net-failover.c9
-rw-r--r--tests/qtest/virtio-net-test.c13
-rw-r--r--tests/qtest/virtio-scsi-test.c4
-rw-r--r--tests/unit/test-image-locking.c8
-rw-r--r--tests/unit/test-qga.c2
-rw-r--r--tests/vhost-user-bridge.c3
31 files changed, 285 insertions, 190 deletions
diff --git a/.gitlab-ci.d/windows.yml b/.gitlab-ci.d/windows.yml
index 86a4339c48..ba59844d12 100644
--- a/.gitlab-ci.d/windows.yml
+++ b/.gitlab-ci.d/windows.yml
@@ -61,7 +61,7 @@ msys2-64bit:
- .\msys64\usr\bin\bash -lc './configure --target-list=x86_64-softmmu
--enable-capstone --without-default-devices'
- .\msys64\usr\bin\bash -lc 'make'
- - .\msys64\usr\bin\bash -lc 'make check'
+ - .\msys64\usr\bin\bash -lc 'make check || { cat build/meson-logs/testlog.txt; exit 1; } ;'
msys2-32bit:
extends: .shared_msys2_builder
@@ -94,4 +94,4 @@ msys2-32bit:
- cd output
- ..\msys64\usr\bin\bash -lc "../configure --target-list=ppc64-softmmu"
- ..\msys64\usr\bin\bash -lc 'make'
- - ..\msys64\usr\bin\bash -lc 'make check'
+ - ..\msys64\usr\bin\bash -lc 'make check || { cat meson-logs/testlog.txt; exit 1; } ;'
diff --git a/docs/devel/testing.rst b/docs/devel/testing.rst
index aea5b42356..fbb98faabe 100644
--- a/docs/devel/testing.rst
+++ b/docs/devel/testing.rst
@@ -81,6 +81,36 @@ QTest cases can be executed with
make check-qtest
+Writing portable test cases
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Both unit tests and qtests can run on POSIX hosts as well as Windows hosts.
+Care must be taken when writing portable test cases that can be built and run
+successfully on various hosts. The following list shows some best practices:
+
+* Use portable APIs from glib whenever necessary, e.g.: g_setenv(),
+ g_mkdtemp(), g_mkdir().
+* Avoid using hardcoded /tmp for temporary file directory.
+ Use g_get_tmp_dir() instead.
+* Bear in mind that Windows has different special string representation for
+ stdin/stdout/stderr and null devices. For example if your test case uses
+ "/dev/fd/2" and "/dev/null" on Linux, remember to use "2" and "nul" on
+ Windows instead. Also IO redirection does not work on Windows, so avoid
+ using "2>nul" whenever necessary.
+* If your test cases uses the blkdebug feature, use relative path to pass
+ the config and image file paths in the command line as Windows absolute
+ path contains the delimiter ":" which will confuse the blkdebug parser.
+* Use double quotes in your extra QEMU commmand line in your test cases
+ instead of single quotes, as Windows does not drop single quotes when
+ passing the command line to QEMU.
+* Windows opens a file in text mode by default, while a POSIX compliant
+ implementation treats text files and binary files the same. So if your
+ test cases opens a file to write some data and later wants to compare the
+ written data with the original one, be sure to pass the letter 'b' as
+ part of the mode string to fopen(), or O_BINARY flag for the open() call.
+* If a certain test case can only run on POSIX or Linux hosts, use a proper
+ #ifdef in the codes. If the whole test suite cannot run on Windows, disable
+ the build in the meson.build file.
+
QAPI schema tests
~~~~~~~~~~~~~~~~~
diff --git a/tests/qtest/ahci-test.c b/tests/qtest/ahci-test.c
index f1e510b0ac..66652fed04 100644
--- a/tests/qtest/ahci-test.c
+++ b/tests/qtest/ahci-test.c
@@ -44,9 +44,9 @@
#define TEST_IMAGE_SIZE_MB_SMALL 64
/*** Globals ***/
-static char tmp_path[] = "/tmp/qtest.XXXXXX";
-static char debug_path[] = "/tmp/qtest-blkdebug.XXXXXX";
-static char mig_socket[] = "/tmp/qtest-migration.XXXXXX";
+static char *tmp_path;
+static char *debug_path;
+static char *mig_socket;
static bool ahci_pedantic;
static const char *imgfmt;
static unsigned test_image_size_mb;
@@ -1437,10 +1437,10 @@ static void test_ncq_simple(void)
static int prepare_iso(size_t size, unsigned char **buf, char **name)
{
- char cdrom_path[] = "/tmp/qtest.iso.XXXXXX";
+ g_autofree char *cdrom_path = NULL;
unsigned char *patt;
ssize_t ret;
- int fd = mkstemp(cdrom_path);
+ int fd = g_file_open_tmp("qtest.iso.XXXXXX", &cdrom_path, NULL);
g_assert(fd != -1);
g_assert(buf);
@@ -1833,7 +1833,7 @@ static void create_ahci_io_test(enum IOMode type, enum AddrMode addr,
int main(int argc, char **argv)
{
- const char *arch;
+ const char *arch, *base;
int ret;
int fd;
int c;
@@ -1871,8 +1871,22 @@ int main(int argc, char **argv)
return 0;
}
+ /*
+ * "base" stores the starting point where we create temporary files.
+ *
+ * On Windows, this is set to the relative path of current working
+ * directory, because the absolute path causes the blkdebug filename
+ * parser fail to parse "blkdebug:path/to/config:path/to/image".
+ */
+#ifndef _WIN32
+ base = g_get_tmp_dir();
+#else
+ base = ".";
+#endif
+
/* Create a temporary image */
- fd = mkstemp(tmp_path);
+ tmp_path = g_strdup_printf("%s/qtest.XXXXXX", base);
+ fd = g_mkstemp(tmp_path);
g_assert(fd >= 0);
if (have_qemu_img()) {
imgfmt = "qcow2";
@@ -1889,12 +1903,13 @@ int main(int argc, char **argv)
close(fd);
/* Create temporary blkdebug instructions */
- fd = mkstemp(debug_path);
+ debug_path = g_strdup_printf("%s/qtest-blkdebug.XXXXXX", base);
+ fd = g_mkstemp(debug_path);
g_assert(fd >= 0);
close(fd);
/* Reserve a hollow file to use as a socket for migration tests */
- fd = mkstemp(mig_socket);
+ fd = g_file_open_tmp("qtest-migration.XXXXXX", &mig_socket, NULL);
g_assert(fd >= 0);
close(fd);
@@ -1947,8 +1962,11 @@ int main(int argc, char **argv)
/* Cleanup */
unlink(tmp_path);
+ g_free(tmp_path);
unlink(debug_path);
+ g_free(debug_path);
unlink(mig_socket);
+ g_free(mig_socket);
return ret;
}
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
index 05ce941566..c713a3700b 100644
--- a/tests/qtest/aspeed_smc-test.c
+++ b/tests/qtest/aspeed_smc-test.c
@@ -608,16 +608,15 @@ static void test_write_block_protect_bottom_bit(void)
flash_reset();
}
-static char tmp_path[] = "/tmp/qtest.m25p80.XXXXXX";
-
int main(int argc, char **argv)
{
+ g_autofree char *tmp_path = NULL;
int ret;
int fd;
g_test_init(&argc, &argv, NULL);
- fd = mkstemp(tmp_path);
+ fd = g_file_open_tmp("qtest.m25p80.XXXXXX", &tmp_path, NULL);
g_assert(fd >= 0);
ret = ftruncate(fd, FLASH_SIZE);
g_assert(ret == 0);
diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
index 46a46fe0aa..2ebeb530b2 100644
--- a/tests/qtest/bios-tables-test.c
+++ b/tests/qtest/bios-tables-test.c
@@ -1615,6 +1615,12 @@ static void test_acpi_virt_viot(void)
free_test_data(&data);
}
+#ifndef _WIN32
+# define DEV_NULL "/dev/null"
+#else
+# define DEV_NULL "nul"
+#endif
+
static void test_acpi_q35_slic(void)
{
test_data data = {
@@ -1622,9 +1628,9 @@ static void test_acpi_q35_slic(void)
.variant = ".slic",
};
- test_acpi_one("-acpitable sig=SLIC,oem_id='CRASH ',oem_table_id='ME',"
- "oem_rev=00002210,asl_compiler_id='qemu',"
- "asl_compiler_rev=00000000,data=/dev/null",
+ test_acpi_one("-acpitable sig=SLIC,oem_id=\"CRASH \",oem_table_id=ME,"
+ "oem_rev=00002210,asl_compiler_id=qemu,"
+ "asl_compiler_rev=00000000,data=" DEV_NULL,
&data);
free_test_data(&data);
}
diff --git a/tests/qtest/boot-serial-test.c b/tests/qtest/boot-serial-test.c
index 2f99d71cab..b216519b62 100644
--- a/tests/qtest/boot-serial-test.c
+++ b/tests/qtest/boot-serial-test.c
@@ -224,15 +224,16 @@ static bool check_guest_output(QTestState *qts, const testdef_t *test, int fd)
static void test_machine(const void *data)
{
const testdef_t *test = data;
- char serialtmp[] = "/tmp/qtest-boot-serial-sXXXXXX";
- char codetmp[] = "/tmp/qtest-boot-serial-cXXXXXX";
+ g_autofree char *serialtmp = NULL;
+ g_autofree char *codetmp = NULL;
const char *codeparam = "";
const uint8_t *code = NULL;
QTestState *qts;
int ser_fd;
- ser_fd = mkstemp(serialtmp);
+ ser_fd = g_file_open_tmp("qtest-boot-serial-sXXXXXX", &serialtmp, NULL);
g_assert(ser_fd != -1);
+ close(ser_fd);
if (test->kernel) {
code = test->kernel;
@@ -246,7 +247,7 @@ static void test_machine(const void *data)
ssize_t wlen;
int code_fd;
- code_fd = mkstemp(codetmp);
+ code_fd = g_file_open_tmp("qtest-boot-serial-cXXXXXX", &codetmp, NULL);
g_assert(code_fd != -1);
wlen = write(code_fd, code, test->codesize);
g_assert(wlen == test->codesize);
@@ -266,6 +267,8 @@ static void test_machine(const void *data)
unlink(codetmp);
}
+ ser_fd = open(serialtmp, O_RDONLY);
+ g_assert(ser_fd != -1);
if (!check_guest_output(qts, test, ser_fd)) {
g_error("Failed to find expected string. Please check '%s'",
serialtmp);
diff --git a/tests/qtest/cxl-test.c b/tests/qtest/cxl-test.c
index 2e14da7dee..cbe0fb549b 100644
--- a/tests/qtest/cxl-test.c
+++ b/tests/qtest/cxl-test.c
@@ -93,10 +93,9 @@ static void cxl_2root_port(void)
static void cxl_t3d(void)
{
g_autoptr(GString) cmdline = g_string_new(NULL);
- char template[] = "/tmp/cxl-test-XXXXXX";
- const char *tmpfs;
+ g_autofree const char *tmpfs = NULL;
- tmpfs = g_mkdtemp(template);
+ tmpfs = g_dir_make_tmp("cxl-test-XXXXXX", NULL);
g_string_printf(cmdline, QEMU_PXB_CMD QEMU_RP QEMU_T3D, tmpfs, tmpfs);
@@ -107,10 +106,9 @@ static void cxl_t3d(void)
static void cxl_1pxb_2rp_2t3d(void)
{
g_autoptr(GString) cmdline = g_string_new(NULL);
- char template[] = "/tmp/cxl-test-XXXXXX";
- const char *tmpfs;
+ g_autofree const char *tmpfs = NULL;
- tmpfs = g_mkdtemp(template);
+ tmpfs = g_dir_make_tmp("cxl-test-XXXXXX", NULL);
g_string_printf(cmdline, QEMU_PXB_CMD QEMU_2RP QEMU_2T3D,
tmpfs, tmpfs, tmpfs, tmpfs);
@@ -122,10 +120,9 @@ static void cxl_1pxb_2rp_2t3d(void)
static void cxl_2pxb_4rp_4t3d(void)
{
g_autoptr(GString) cmdline = g_string_new(NULL);
- char template[] = "/tmp/cxl-test-XXXXXX";
- const char *tmpfs;
+ g_autofree const char *tmpfs = NULL;
- tmpfs = g_mkdtemp(template);
+ tmpfs = g_dir_make_tmp("cxl-test-XXXXXX", NULL);
g_string_printf(cmdline, QEMU_2PXB_CMD QEMU_4RP QEMU_4T3D,
tmpfs, tmpfs, tmpfs, tmpfs, tmpfs, tmpfs,
diff --git a/tests/qtest/device-plug-test.c b/tests/qtest/device-plug-test.c
index a1fb99c8ff..e595b45b66 100644
--- a/tests/qtest/device-plug-test.c
+++ b/tests/qtest/device-plug-test.c
@@ -61,6 +61,18 @@ static void wait_device_deleted_event(QTestState *qtest, const char *id)
}
}
+static void process_device_remove(QTestState *qtest, const char *id)
+{
+ /*
+ * Request device removal. As the guest is not running, the request won't
+ * be processed. However during system reset, the removal will be
+ * handled, removing the device.
+ */
+ device_del(qtest, id);
+ system_reset(qtest);
+ wait_device_deleted_event(qtest, id);
+}
+
static void test_pci_unplug_request(void)
{
const char *arch = qtest_get_arch();
@@ -73,14 +85,7 @@ static void test_pci_unplug_request(void)
QTestState *qtest = qtest_initf("%s -device virtio-mouse-pci,id=dev0",
machine_addition);
- /*
- * Request device removal. As the guest is not running, the request won't
- * be processed. However during system reset, the removal will be
- * handled, removing the device.
- */
- device_del(qtest, "dev0");
- system_reset(qtest);
- wait_device_deleted_event(qtest, "dev0");
+ process_device_remove(qtest, "dev0");
qtest_quit(qtest);
}
@@ -98,14 +103,7 @@ static void test_pci_unplug_json_request(void)
"%s -device \"{'driver': 'virtio-mouse-pci', 'id': 'dev0'}\"",
machine_addition);
- /*
- * Request device removal. As the guest is not running, the request won't
- * be processed. However during system reset, the removal will be
- * handled, removing the device.
- */
- device_del(qtest, "dev0");
- system_reset(qtest);
- wait_device_deleted_event(qtest, "dev0");
+ process_device_remove(qtest, "dev0");
qtest_quit(qtest);
}
@@ -128,9 +126,7 @@ static void test_spapr_cpu_unplug_request(void)
"-device power9_v2.0-spapr-cpu-core,core-id=1,id=dev0");
/* similar to test_pci_unplug_request */
- device_del(qtest, "dev0");
- system_reset(qtest);
- wait_device_deleted_event(qtest, "dev0");
+ process_device_remove(qtest, "dev0");
qtest_quit(qtest);
}
@@ -144,9 +140,7 @@ static void test_spapr_memory_unplug_request(void)
"-device pc-dimm,id=dev0,memdev=mem0");
/* similar to test_pci_unplug_request */
- device_del(qtest, "dev0");
- system_reset(qtest);
- wait_device_deleted_event(qtest, "dev0");
+ process_device_remove(qtest, "dev0");
qtest_quit(qtest);
}
@@ -158,9 +152,7 @@ static void test_spapr_phb_unplug_request(void)
qtest = qtest_initf("-device spapr-pci-host-bridge,index=1,id=dev0");
/* similar to test_pci_unplug_request */
- device_del(qtest, "dev0");
- system_reset(qtest);
- wait_device_deleted_event(qtest, "dev0");
+ process_device_remove(qtest, "dev0");
qtest_quit(qtest);
}
diff --git a/tests/qtest/fdc-test.c b/tests/qtest/fdc-test.c
index 52ade90a7d..1f9b99ad6d 100644
--- a/tests/qtest/fdc-test.c
+++ b/tests/qtest/fdc-test.c
@@ -68,7 +68,7 @@ enum {
DSKCHG = 0x80,
};
-static char test_image[] = "/tmp/qtest.XXXXXX";
+static char *test_image;
#define assert_bit_set(data, mask) g_assert_cmphex((data) & (mask), ==, (mask))
#define assert_bit_clear(data, mask) g_assert_cmphex((data) & (mask), ==, 0)
@@ -608,7 +608,7 @@ int main(int argc, char **argv)
int ret;
/* Create a temporary raw image */
- fd = mkstemp(test_image);
+ fd = g_file_open_tmp("qtest.XXXXXX", &test_image, NULL);
g_assert(fd >= 0);
ret = ftruncate(fd, TEST_IMAGE_SIZE);
g_assert(ret == 0);
@@ -640,6 +640,7 @@ int main(int argc, char **argv)
/* Cleanup */
qtest_end();
unlink(test_image);
+ g_free(test_image);
return ret;
}
diff --git a/tests/qtest/fuzz/generic_fuzz_configs.h b/tests/qtest/fuzz/generic_fuzz_configs.h
index 0775e6702b..a825b78c14 100644
--- a/tests/qtest/fuzz/generic_fuzz_configs.h
+++ b/tests/qtest/fuzz/generic_fuzz_configs.h
@@ -20,8 +20,8 @@ typedef struct generic_fuzz_config {
} generic_fuzz_config;
static inline gchar *generic_fuzzer_virtio_9p_args(void){
- char tmpdir[] = "/tmp/qemu-fuzz.XXXXXX";
- g_assert_nonnull(g_mkdtemp(tmpdir));
+ g_autofree char *tmpdir = g_dir_make_tmp("qemu-fuzz.XXXXXX", NULL);
+ g_assert_nonnull(tmpdir);
return g_strdup_printf("-machine q35 -nodefaults "
"-device virtio-9p,fsdev=hshare,mount_tag=hshare "
diff --git a/tests/qtest/fuzz/virtio_blk_fuzz.c b/tests/qtest/fuzz/virtio_blk_fuzz.c
index 236d078cc8..a9fb9ecf6c 100644
--- a/tests/qtest/fuzz/virtio_blk_fuzz.c
+++ b/tests/qtest/fuzz/virtio_blk_fuzz.c
@@ -181,10 +181,10 @@ static void drive_destroy(void *path)
static char *drive_create(void)
{
int fd, ret;
- char *t_path = g_strdup("/tmp/qtest.XXXXXX");
+ char *t_path;
/* Create a temporary raw image */
- fd = mkstemp(t_path);
+ fd = g_file_open_tmp("qtest.XXXXXX", &t_path, NULL);
g_assert_cmpint(fd, >=, 0);
ret = ftruncate(fd, TEST_IMAGE_SIZE);
g_assert_cmpint(ret, ==, 0);
diff --git a/tests/qtest/hd-geo-test.c b/tests/qtest/hd-geo-test.c
index 413cf964c0..ba772f4d7a 100644
--- a/tests/qtest/hd-geo-test.c
+++ b/tests/qtest/hd-geo-test.c
@@ -27,16 +27,16 @@
static char *create_test_img(int secs)
{
- char *template = strdup("/tmp/qtest.XXXXXX");
+ char *template;
int fd, ret;
- fd = mkstemp(template);
+ fd = g_file_open_tmp("qtest.XXXXXX", &template, NULL);
g_assert(fd >= 0);
ret = ftruncate(fd, (off_t)secs * 512);
close(fd);
if (ret) {
- free(template);
+ g_free(template);
template = NULL;
}
@@ -422,9 +422,8 @@ static MBRpartitions empty_mbr = { {false, 0, 0, 0, 0, 0, 0, 0, 0},
static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
{
- const char *template = "/tmp/qtest.XXXXXX";
- char *raw_path = strdup(template);
- char *qcow2_path = strdup(template);
+ g_autofree char *raw_path = NULL;
+ char *qcow2_path;
char cmd[100 + 2 * PATH_MAX];
uint8_t buf[512] = {};
int i, ret, fd, offset;
@@ -468,7 +467,7 @@ static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
offset += 0x10;
}
- fd = mkstemp(raw_path);
+ fd = g_file_open_tmp("qtest.XXXXXX", &raw_path, NULL);
g_assert(fd >= 0);
close(fd);
@@ -478,7 +477,7 @@ static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
g_assert(ret == sizeof(buf));
close(fd);
- fd = mkstemp(qcow2_path);
+ fd = g_file_open_tmp("qtest.XXXXXX", &qcow2_path, NULL);
g_assert(fd >= 0);
close(fd);
@@ -506,7 +505,6 @@ static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
free(qemu_img_abs_path);
unlink(raw_path);
- free(raw_path);
return qcow2_path;
}
@@ -714,7 +712,7 @@ static void test_override(TestArgs *args, CHSResult expected[])
for (i = 0; i < args->n_drives; i++) {
unlink(args->drives[i]);
- free(args->drives[i]);
+ g_free(args->drives[i]);
}
g_free(args->drives);
g_strfreev(args->argv);
@@ -867,7 +865,7 @@ static void test_override_scsi_hot_unplug(void)
for (i = 0; i < args->n_drives; i++) {
unlink(args->drives[i]);
- free(args->drives[i]);
+ g_free(args->drives[i]);
}
g_free(args->drives);
g_strfreev(args->argv);
@@ -927,7 +925,7 @@ static void test_override_virtio_hot_unplug(void)
for (i = 0; i < args->n_drives; i++) {
unlink(args->drives[i]);
- free(args->drives[i]);
+ g_free(args->drives[i]);
}
g_free(args->drives);
g_strfreev(args->argv);
@@ -987,7 +985,7 @@ test_add_done:
for (i = 0; i < backend_last; i++) {
if (img_file_name[i]) {
unlink(img_file_name[i]);
- free(img_file_name[i]);
+ g_free(img_file_name[i]);
}
}
diff --git a/tests/qtest/i440fx-test.c b/tests/qtest/i440fx-test.c
index 3890f1237c..795fd85343 100644
--- a/tests/qtest/i440fx-test.c
+++ b/tests/qtest/i440fx-test.c
@@ -278,56 +278,34 @@ static void test_i440fx_pam(gconstpointer opaque)
qtest_end();
}
-#ifndef _WIN32
-
#define BLOB_SIZE ((size_t)65536)
#define ISA_BIOS_MAXSZ ((size_t)(128 * 1024))
-/* Create a blob file, and return its absolute pathname as a dynamically
+/*
+ * Create a blob file, and return its absolute pathname as a dynamically
* allocated string.
* The file is closed before the function returns.
- * In case of error, NULL is returned. The function prints the error message.
+ * In case of error, the function aborts and prints the error message.
*/
static char *create_blob_file(void)
{
- int ret, fd;
+ int i, fd;
char *pathname;
GError *error = NULL;
+ g_autofree uint8_t *buf = g_malloc(BLOB_SIZE);
- ret = -1;
fd = g_file_open_tmp("blob_XXXXXX", &pathname, &error);
- if (fd == -1) {
- fprintf(stderr, "unable to create blob file: %s\n", error->message);
- g_error_free(error);
- } else {
- if (ftruncate(fd, BLOB_SIZE) == -1) {
- fprintf(stderr, "ftruncate(\"%s\", %zu): %s\n", pathname,
- BLOB_SIZE, strerror(errno));
- } else {
- void *buf;
-
- buf = mmap(NULL, BLOB_SIZE, PROT_WRITE, MAP_SHARED, fd, 0);
- if (buf == MAP_FAILED) {
- fprintf(stderr, "mmap(\"%s\", %zu): %s\n", pathname, BLOB_SIZE,
- strerror(errno));
- } else {
- size_t i;
-
- for (i = 0; i < BLOB_SIZE; ++i) {
- ((uint8_t *)buf)[i] = i;
- }
- munmap(buf, BLOB_SIZE);
- ret = 0;
- }
- }
- close(fd);
- if (ret == -1) {
- unlink(pathname);
- g_free(pathname);
- }
+ g_assert_no_error(error);
+ close(fd);
+
+ for (i = 0; i < BLOB_SIZE; i++) {
+ buf[i] = i;
}
- return ret == -1 ? NULL : pathname;
+ g_file_set_contents(pathname, (char *)buf, BLOB_SIZE, &error);
+ g_assert_no_error(error);
+
+ return pathname;
}
static void test_i440fx_firmware(FirmwareTestFixture *fixture,
@@ -398,8 +376,6 @@ static void request_pflash(FirmwareTestFixture *fixture,
fixture->is_bios = false;
}
-#endif /* _WIN32 */
-
int main(int argc, char **argv)
{
TestData data;
@@ -410,10 +386,8 @@ int main(int argc, char **argv)
qtest_add_data_func("i440fx/defaults", &data, test_i440fx_defaults);
qtest_add_data_func("i440fx/pam", &data, test_i440fx_pam);
-#ifndef _WIN32
add_firmware_test("i440fx/firmware/bios", request_bios);
add_firmware_test("i440fx/firmware/pflash", request_pflash);
-#endif
return g_test_run();
}
diff --git a/tests/qtest/ide-test.c b/tests/qtest/ide-test.c
index 5bcb75a7e5..4ea89c26c9 100644
--- a/tests/qtest/ide-test.c
+++ b/tests/qtest/ide-test.c
@@ -121,8 +121,8 @@ enum {
static QPCIBus *pcibus = NULL;
static QGuestAllocator guest_malloc;
-static char tmp_path[] = "/tmp/qtest.XXXXXX";
-static char debug_path[] = "/tmp/qtest-blkdebug.XXXXXX";
+static char *tmp_path;
+static char *debug_path;
static QTestState *ide_test_start(const char *cmdline_fmt, ...)
{
@@ -892,7 +892,7 @@ static void cdrom_pio_impl(int nblocks)
/* Prepopulate the CDROM with an interesting pattern */
generate_pattern(pattern, patt_len, ATAPI_BLOCK_SIZE);
- fh = fopen(tmp_path, "w+");
+ fh = fopen(tmp_path, "wb+");
ret = fwrite(pattern, ATAPI_BLOCK_SIZE, patt_blocks, fh);
g_assert_cmpint(ret, ==, patt_blocks);
fclose(fh);
@@ -993,7 +993,7 @@ static void test_cdrom_dma(void)
prdt[0].size = cpu_to_le32(len | PRDT_EOT);
generate_pattern(pattern, ATAPI_BLOCK_SIZE * 16, ATAPI_BLOCK_SIZE);
- fh = fopen(tmp_path, "w+");
+ fh = fopen(tmp_path, "wb+");
ret = fwrite(pattern, ATAPI_BLOCK_SIZE, 16, fh);
g_assert_cmpint(ret, ==, 16);
fclose(fh);
@@ -1011,16 +1011,32 @@ static void test_cdrom_dma(void)
int main(int argc, char **argv)
{
+ const char *base;
int fd;
int ret;
+ /*
+ * "base" stores the starting point where we create temporary files.
+ *
+ * On Windows, this is set to the relative path of current working
+ * directory, because the absolute path causes the blkdebug filename
+ * parser fail to parse "blkdebug:path/to/config:path/to/image".
+ */
+#ifndef _WIN32
+ base = g_get_tmp_dir();
+#else
+ base = ".";
+#endif
+
/* Create temporary blkdebug instructions */
- fd = mkstemp(debug_path);
+ debug_path = g_strdup_printf("%s/qtest-blkdebug.XXXXXX", base);
+ fd = g_mkstemp(debug_path);
g_assert(fd >= 0);
close(fd);
/* Create a temporary raw image */
- fd = mkstemp(tmp_path);
+ tmp_path = g_strdup_printf("%s/qtest.XXXXXX", base);
+ fd = g_mkstemp(tmp_path);
g_assert(fd >= 0);
ret = ftruncate(fd, TEST_IMAGE_SIZE);
g_assert(ret == 0);
@@ -1049,7 +1065,9 @@ int main(int argc, char **argv)
/* Cleanup */
unlink(tmp_path);
+ g_free(tmp_path);
unlink(debug_path);
+ g_free(debug_path);
return ret;
}
diff --git a/tests/qtest/libqtest-single.h b/tests/qtest/libqtest-single.h
index 4e7d0ae1dc..851724cbcb 100644
--- a/tests/qtest/libqtest-single.h
+++ b/tests/qtest/libqtest-single.h
@@ -13,7 +13,11 @@
#include "libqtest.h"
+#ifndef _WIN32
QTestState *global_qtest __attribute__((common, weak));
+#else
+__declspec(selectany) QTestState *global_qtest;
+#endif
/**
* qtest_start:
diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
index 7c9fc07de4..4f4b2d6477 100644
--- a/tests/qtest/libqtest.c
+++ b/tests/qtest/libqtest.c
@@ -97,7 +97,7 @@ static int socket_accept(int sock)
(void *)&timeout, sizeof(timeout))) {
fprintf(stderr, "%s failed to set SO_RCVTIMEO: %s\n",
__func__, strerror(errno));
- close(sock);
+ closesocket(sock);
return -1;
}
@@ -108,7 +108,7 @@ static int socket_accept(int sock)
if (ret == -1) {
fprintf(stderr, "%s failed: %s\n", __func__, strerror(errno));
}
- close(sock);
+ closesocket(sock);
return ret;
}
@@ -265,8 +265,10 @@ QTestState *qtest_init_without_qmp_handshake(const char *extra_args)
s = g_new(QTestState, 1);
- socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid());
- qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", getpid());
+ socket_path = g_strdup_printf("%s/qtest-%d.sock",
+ g_get_tmp_dir(), getpid());
+ qmp_socket_path = g_strdup_printf("%s/qtest-%d.qmp",
+ g_get_tmp_dir(), getpid());
/* It's possible that if an earlier test run crashed it might
* have left a stale unix socket lying around. Delete any
@@ -390,10 +392,12 @@ QTestState *qtest_initf(const char *fmt, ...)
QTestState *qtest_init_with_serial(const char *extra_args, int *sock_fd)
{
int sock_fd_init;
- char *sock_path, sock_dir[] = "/tmp/qtest-serial-XXXXXX";
+ g_autofree char *sock_dir = NULL;
+ char *sock_path;
QTestState *qts;
- g_assert_true(g_mkdtemp(sock_dir) != NULL);
+ sock_dir = g_dir_make_tmp("qtest-serial-XXXXXX", NULL);
+ g_assert_true(sock_dir != NULL);
sock_path = g_strdup_printf("%s/sock", sock_dir);
sock_fd_init = init_socket(sock_path);
@@ -417,8 +421,8 @@ void qtest_quit(QTestState *s)
qtest_remove_abrt_handler(s);
qtest_kill_qemu(s);
- close(s->fd);
- close(s->qmp_fd);
+ closesocket(s->fd);
+ closesocket(s->qmp_fd);
g_string_free(s->rx, true);
for (GList *it = s->pending_events; it != NULL; it = it->next) {
@@ -588,17 +592,20 @@ int qtest_socket_server(const char *socket_path)
return sock;
}
+#ifndef _WIN32
void qtest_qmp_vsend_fds(QTestState *s, int *fds, size_t fds_num,
const char *fmt, va_list ap)
{
qmp_fd_vsend_fds(s->qmp_fd, fds, fds_num, fmt, ap);
}
+#endif
void qtest_qmp_vsend(QTestState *s, const char *fmt, va_list ap)
{
- qmp_fd_vsend_fds(s->qmp_fd, NULL, 0, fmt, ap);
+ qmp_fd_vsend(s->qmp_fd, fmt, ap);
}
+#ifndef _WIN32
QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num,
const char *fmt, va_list ap)
{
@@ -607,6 +614,7 @@ QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num,
/* Receive reply */
return qtest_qmp_receive(s);
}
+#endif
QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap)
{
@@ -616,6 +624,7 @@ QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap)
return qtest_qmp_receive(s);
}
+#ifndef _WIN32
QDict *qtest_qmp_fds(QTestState *s, int *fds, size_t fds_num,
const char *fmt, ...)
{
@@ -627,6 +636,7 @@ QDict *qtest_qmp_fds(QTestState *s, int *fds, size_t fds_num,
va_end(ap);
return response;
}
+#endif
QDict *qtest_qmp(QTestState *s, const char *fmt, ...)
{
@@ -1323,6 +1333,7 @@ void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id,
qobject_unref(args);
}
+#ifndef _WIN32
void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd)
{
QDict *resp;
@@ -1342,6 +1353,7 @@ void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd)
g_assert(!qdict_haskey(resp, "error"));
qobject_unref(resp);
}
+#endif
/*
* Generic hot-unplugging test via the device_del QMP command.
diff --git a/tests/qtest/libqtest.h b/tests/qtest/libqtest.h
index 94b187837d..3abc75964d 100644
--- a/tests/qtest/libqtest.h
+++ b/tests/qtest/libqtest.h
@@ -94,6 +94,7 @@ void qtest_kill_qemu(QTestState *s);
*/
void qtest_quit(QTestState *s);
+#ifndef _WIN32
/**
* qtest_qmp_fds:
* @s: #QTestState instance to operate on.
@@ -108,6 +109,7 @@ void qtest_quit(QTestState *s);
QDict *qtest_qmp_fds(QTestState *s, int *fds, size_t fds_num,
const char *fmt, ...)
G_GNUC_PRINTF(4, 5);
+#endif /* _WIN32 */
/**
* qtest_qmp:
@@ -152,6 +154,7 @@ void qtest_qmp_send_raw(QTestState *s, const char *fmt, ...)
*/
int qtest_socket_server(const char *socket_path);
+#ifndef _WIN32
/**
* qtest_vqmp_fds:
* @s: #QTestState instance to operate on.
@@ -167,6 +170,7 @@ int qtest_socket_server(const char *socket_path);
QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num,
const char *fmt, va_list ap)
G_GNUC_PRINTF(4, 0);
+#endif /* _WIN32 */
/**
* qtest_vqmp:
@@ -181,6 +185,7 @@ QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num,
QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap)
G_GNUC_PRINTF(2, 0);
+#ifndef _WIN32
/**
* qtest_qmp_vsend_fds:
* @s: #QTestState instance to operate on.
@@ -196,6 +201,7 @@ QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap)
void qtest_qmp_vsend_fds(QTestState *s, int *fds, size_t fds_num,
const char *fmt, va_list ap)
G_GNUC_PRINTF(4, 0);
+#endif /* _WIN32 */
/**
* qtest_qmp_vsend:
@@ -743,6 +749,7 @@ void qtest_qmp_device_add_qdict(QTestState *qts, const char *drv,
void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id,
const char *fmt, ...) G_GNUC_PRINTF(4, 5);
+#ifndef _WIN32
/**
* qtest_qmp_add_client:
* @qts: QTestState instance to operate on
@@ -752,6 +759,7 @@ void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id,
* Call QMP ``getfd`` followed by ``add_client`` with the given @fd.
*/
void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd);
+#endif /* _WIN32 */
/**
* qtest_qmp_device_del:
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index e910cb32ca..455f1bbb7e 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -39,9 +39,14 @@ qtests_pci = \
qtests_cxl = \
(config_all_devices.has_key('CONFIG_CXL') ? ['cxl-test'] : [])
+qtests_filter = \
+ (slirp.found() ? ['test-netfilter'] : []) + \
+ (config_host.has_key('CONFIG_POSIX') ? ['test-filter-mirror'] : []) + \
+ (config_host.has_key('CONFIG_POSIX') ? ['test-filter-redirector'] : [])
+
qtests_i386 = \
- (slirp.found() ? ['pxe-test', 'test-netfilter'] : []) + \
- (config_host.has_key('CONFIG_POSIX') ? ['test-filter-mirror'] : []) + \
+ (slirp.found() ? ['pxe-test'] : []) + \
+ qtests_filter + \
(have_tools ? ['ahci-test'] : []) + \
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
(config_all_devices.has_key('CONFIG_SGA') ? ['boot-serial-test'] : []) + \
@@ -95,8 +100,7 @@ qtests_i386 = \
'vmgenid-test',
'migration-test',
'test-x86-cpuid-compat',
- 'numa-test',
- 'test-filter-redirector'
+ 'numa-test'
]
if dbus_display
@@ -120,30 +124,25 @@ endif
qtests_x86_64 = qtests_i386
qtests_alpha = ['boot-serial-test'] + \
- ['test-filter-mirror', 'test-filter-redirector'] + \
- (slirp.found() ? ['test-netfilter'] : []) + \
+ qtests_filter + \
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
qtests_avr = [ 'boot-serial-test' ]
qtests_hppa = ['boot-serial-test'] + \
- ['test-filter-mirror', 'test-filter-redirector'] + \
- (slirp.found() ? ['test-netfilter'] : []) + \
+ qtests_filter + \
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
qtests_m68k = ['boot-serial-test'] + \
- ['test-filter-mirror', 'test-filter-redirector'] + \
- (slirp.found() ? ['test-netfilter'] : [])
+ qtests_filter
qtests_microblaze = ['boot-serial-test'] + \
- ['test-filter-mirror', 'test-filter-redirector'] + \
- (slirp.found() ? ['test-netfilter'] : [])
+ qtests_filter
qtests_microblazeel = qtests_microblaze
qtests_mips = \
- ['test-filter-mirror', 'test-filter-redirector'] + \
- (slirp.found() ? ['test-netfilter'] : []) + \
+ qtests_filter + \
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
@@ -152,8 +151,7 @@ qtests_mips64 = qtests_mips
qtests_mips64el = qtests_mips
qtests_ppc = \
- ['test-filter-mirror', 'test-filter-redirector'] + \
- (slirp.found() ? ['test-netfilter'] : []) + \
+ qtests_filter + \
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
(config_all_devices.has_key('CONFIG_M48T59') ? ['m48t59-test'] : []) + \
(config_all_devices.has_key('CONFIG_TCG') ? ['prom-env-test'] : []) + \
@@ -174,13 +172,11 @@ qtests_sh4 = (config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-te
qtests_sh4eb = (config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : [])
qtests_sparc = ['prom-env-test', 'm48t59-test', 'boot-serial-test'] + \
- ['test-filter-mirror', 'test-filter-redirector'] + \
- (slirp.found() ? ['test-netfilter'] : [])
+ qtests_filter
qtests_sparc64 = \
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
- (slirp.found() ? ['test-netfilter'] : []) + \
- ['test-filter-mirror', 'test-filter-redirector'] + \
+ qtests_filter + \
['prom-env-test', 'boot-serial-test']
qtests_npcm7xx = \
diff --git a/tests/qtest/microbit-test.c b/tests/qtest/microbit-test.c
index b71daae9a9..4bc267020b 100644
--- a/tests/qtest/microbit-test.c
+++ b/tests/qtest/microbit-test.c
@@ -51,7 +51,7 @@ static void uart_rw_to_rxd(QTestState *qts, int sock_fd, const char *in,
{
int i, in_len = strlen(in);
- g_assert_true(write(sock_fd, in, in_len) == in_len);
+ g_assert_true(send(sock_fd, in, in_len, 0) == in_len);
for (i = 0; i < in_len; i++) {
g_assert_true(uart_wait_for_event(qts, NRF51_UART_BASE +
A_UART_RXDRDY));
@@ -77,7 +77,7 @@ static void test_nrf51_uart(void)
char s[10];
QTestState *qts = qtest_init_with_serial("-M microbit", &sock_fd);
- g_assert_true(write(sock_fd, "c", 1) == 1);
+ g_assert_true(send(sock_fd, "c", 1, 0) == 1);
g_assert_cmphex(qtest_readl(qts, NRF51_UART_BASE + A_UART_RXD), ==, 0x00);
qtest_writel(qts, NRF51_UART_BASE + A_UART_ENABLE, 0x04);
@@ -97,17 +97,17 @@ static void test_nrf51_uart(void)
qtest_writel(qts, NRF51_UART_BASE + A_UART_STARTTX, 0x01);
uart_w_to_txd(qts, "d");
- g_assert_true(read(sock_fd, s, 10) == 1);
+ g_assert_true(recv(sock_fd, s, 10, 0) == 1);
g_assert_cmphex(s[0], ==, 'd');
qtest_writel(qts, NRF51_UART_BASE + A_UART_SUSPEND, 0x01);
qtest_writel(qts, NRF51_UART_BASE + A_UART_TXD, 'h');
qtest_writel(qts, NRF51_UART_BASE + A_UART_STARTTX, 0x01);
uart_w_to_txd(qts, "world");
- g_assert_true(read(sock_fd, s, 10) == 5);
+ g_assert_true(recv(sock_fd, s, 10, 0) == 5);
g_assert_true(memcmp(s, "world", 5) == 0);
- close(sock_fd);
+ closesocket(sock_fd);
qtest_quit(qts);
}
diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
index 4728d528bb..0d153d6b5e 100644
--- a/tests/qtest/migration-test.c
+++ b/tests/qtest/migration-test.c
@@ -647,7 +647,16 @@ static int test_migrate_start(QTestState **from, QTestState **to,
}
if (!getenv("QTEST_LOG") && args->hide_stderr) {
+#ifndef _WIN32
ignore_stderr = "2>/dev/null";
+#else
+ /*
+ * On Windows the QEMU executable is created via CreateProcess() and
+ * IO redirection does not work, so don't bother adding IO redirection
+ * to the command line.
+ */
+ ignore_stderr = "";
+#endif
} else {
ignore_stderr = "";
}
@@ -1393,6 +1402,7 @@ static void test_precopy_unix_dirty_ring(void)
}
#ifdef CONFIG_GNUTLS
+#ifndef _WIN32
static void test_precopy_unix_tls_psk(void)
{
g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
@@ -1405,6 +1415,7 @@ static void test_precopy_unix_tls_psk(void)
test_precopy_common(&args);
}
+#endif /* _WIN32 */
#ifdef CONFIG_TASN1
static void test_precopy_unix_tls_x509_default_host(void)
@@ -1513,6 +1524,7 @@ static void test_precopy_tcp_plain(void)
}
#ifdef CONFIG_GNUTLS
+#ifndef _WIN32
static void test_precopy_tcp_tls_psk_match(void)
{
MigrateCommon args = {
@@ -1523,6 +1535,7 @@ static void test_precopy_tcp_tls_psk_match(void)
test_precopy_common(&args);
}
+#endif /* _WIN32 */
static void test_precopy_tcp_tls_psk_mismatch(void)
{
@@ -1920,6 +1933,7 @@ static void test_multifd_tcp_zstd(void)
#endif
#ifdef CONFIG_GNUTLS
+#ifndef _WIN32
static void *
test_migrate_multifd_tcp_tls_psk_start_match(QTestState *from,
QTestState *to)
@@ -1927,6 +1941,7 @@ test_migrate_multifd_tcp_tls_psk_start_match(QTestState *from,
test_migrate_precopy_tcp_multifd_start_common(from, to, "none");
return test_migrate_tls_psk_start_match(from, to);
}
+#endif /* _WIN32 */
static void *
test_migrate_multifd_tcp_tls_psk_start_mismatch(QTestState *from,
@@ -1978,6 +1993,7 @@ test_migrate_multifd_tls_x509_start_reject_anon_client(QTestState *from,
}
#endif /* CONFIG_TASN1 */
+#ifndef _WIN32
static void test_multifd_tcp_tls_psk_match(void)
{
MigrateCommon args = {
@@ -1987,6 +2003,7 @@ static void test_multifd_tcp_tls_psk_match(void)
};
test_precopy_common(&args);
}
+#endif /* _WIN32 */
static void test_multifd_tcp_tls_psk_mismatch(void)
{
@@ -2483,8 +2500,10 @@ int main(int argc, char **argv)
qtest_add_func("/migration/precopy/unix/plain", test_precopy_unix_plain);
qtest_add_func("/migration/precopy/unix/xbzrle", test_precopy_unix_xbzrle);
#ifdef CONFIG_GNUTLS
+#ifndef _WIN32
qtest_add_func("/migration/precopy/unix/tls/psk",
test_precopy_unix_tls_psk);
+#endif
if (has_uffd) {
/*
@@ -2510,8 +2529,10 @@ int main(int argc, char **argv)
qtest_add_func("/migration/precopy/tcp/plain", test_precopy_tcp_plain);
#ifdef CONFIG_GNUTLS
+#ifndef _WIN32
qtest_add_func("/migration/precopy/tcp/tls/psk/match",
test_precopy_tcp_tls_psk_match);
+#endif
qtest_add_func("/migration/precopy/tcp/tls/psk/mismatch",
test_precopy_tcp_tls_psk_mismatch);
#ifdef CONFIG_TASN1
@@ -2555,8 +2576,10 @@ int main(int argc, char **argv)
test_multifd_tcp_zstd);
#endif
#ifdef CONFIG_GNUTLS
+#ifndef _WIN32
qtest_add_func("/migration/multifd/tcp/tls/psk/match",
test_multifd_tcp_tls_psk_match);
+#endif
qtest_add_func("/migration/multifd/tcp/tls/psk/mismatch",
test_multifd_tcp_tls_psk_mismatch);
#ifdef CONFIG_TASN1
diff --git a/tests/qtest/pflash-cfi02-test.c b/tests/qtest/pflash-cfi02-test.c
index 7fce614b64..0b52c2ca5c 100644
--- a/tests/qtest/pflash-cfi02-test.c
+++ b/tests/qtest/pflash-cfi02-test.c
@@ -56,7 +56,7 @@ typedef struct {
QTestState *qtest;
} FlashConfig;
-static char image_path[] = "/tmp/qtest.XXXXXX";
+static char *image_path;
/*
* The pflash implementation allows some parameters to be unspecified. We want
@@ -608,6 +608,7 @@ static void test_cfi_in_autoselect(const void *opaque)
static void cleanup(void *opaque)
{
unlink(image_path);
+ g_free(image_path);
}
/*
@@ -635,16 +636,14 @@ static const FlashConfig configuration[] = {
int main(int argc, char **argv)
{
- int fd = mkstemp(image_path);
- if (fd == -1) {
- g_printerr("Failed to create temporary file %s: %s\n", image_path,
- strerror(errno));
- exit(EXIT_FAILURE);
- }
+ GError *err = NULL;
+ int fd = g_file_open_tmp("qtest.XXXXXX", &image_path, &err);
+ g_assert_no_error(err);
+
if (ftruncate(fd, UNIFORM_FLASH_SIZE) < 0) {
int error_code = errno;
close(fd);
- unlink(image_path);
+ cleanup(NULL);
g_printerr("Failed to truncate file %s to %u MB: %s\n", image_path,
UNIFORM_FLASH_SIZE, strerror(error_code));
exit(EXIT_FAILURE);
diff --git a/tests/qtest/qmp-test.c b/tests/qtest/qmp-test.c
index bf7304c7dc..22957fa49c 100644
--- a/tests/qtest/qmp-test.c
+++ b/tests/qtest/qmp-test.c
@@ -159,16 +159,19 @@ static void test_qmp_protocol(void)
qtest_quit(qts);
}
+#ifndef _WIN32
+
/* Out-of-band tests */
-char tmpdir[] = "/tmp/qmp-test-XXXXXX";
+char *tmpdir;
char *fifo_name;
static void setup_blocking_cmd(void)
{
- if (!g_mkdtemp(tmpdir)) {
- g_error("g_mkdtemp: %s", strerror(errno));
- }
+ GError *err = NULL;
+ tmpdir = g_dir_make_tmp("qmp-test-XXXXXX", &err);
+ g_assert_no_error(err);
+
fifo_name = g_strdup_printf("%s/fifo", tmpdir);
if (mkfifo(fifo_name, 0666)) {
g_error("mkfifo: %s", strerror(errno));
@@ -179,6 +182,7 @@ static void cleanup_blocking_cmd(void)
{
unlink(fifo_name);
rmdir(tmpdir);
+ g_free(tmpdir);
}
static void send_cmd_that_blocks(QTestState *s, const char *id)
@@ -277,6 +281,8 @@ static void test_qmp_oob(void)
qtest_quit(qts);
}
+#endif /* _WIN32 */
+
/* Preconfig tests */
static void test_qmp_preconfig(void)
@@ -336,7 +342,10 @@ int main(int argc, char *argv[])
g_test_init(&argc, &argv, NULL);
qtest_add_func("qmp/protocol", test_qmp_protocol);
+#ifndef _WIN32
+ /* This case calls mkfifo() which does not exist on win32 */
qtest_add_func("qmp/oob", test_qmp_oob);
+#endif
qtest_add_func("qmp/preconfig", test_qmp_preconfig);
qtest_add_func("qmp/missing-any-arg", test_qmp_missing_any_arg);
diff --git a/tests/qtest/vhost-user-blk-test.c b/tests/qtest/vhost-user-blk-test.c
index a81c2a2715..07a4c2d500 100644
--- a/tests/qtest/vhost-user-blk-test.c
+++ b/tests/qtest/vhost-user-blk-test.c
@@ -841,7 +841,8 @@ static char *create_listen_socket(int *fd)
char *path;
/* No race because our pid makes the path unique */
- path = g_strdup_printf("/tmp/qtest-%d-sock.XXXXXX", getpid());
+ path = g_strdup_printf("%s/qtest-%d-sock.XXXXXX",
+ g_get_tmp_dir(), getpid());
tmp_fd = mkstemp(path);
g_assert_cmpint(tmp_fd, >=, 0);
close(tmp_fd);
diff --git a/tests/qtest/vhost-user-test.c b/tests/qtest/vhost-user-test.c
index d7d6cfc9bd..84498941a6 100644
--- a/tests/qtest/vhost-user-test.c
+++ b/tests/qtest/vhost-user-test.c
@@ -482,8 +482,8 @@ static TestServer *test_server_new(const gchar *name,
struct vhost_user_ops *ops)
{
TestServer *server = g_new0(TestServer, 1);
- char template[] = "/tmp/vhost-test-XXXXXX";
- const char *tmpfs;
+ g_autofree const char *tmpfs = NULL;
+ GError *err = NULL;
server->context = g_main_context_new();
server->loop = g_main_loop_new(server->context, FALSE);
@@ -491,9 +491,11 @@ static TestServer *test_server_new(const gchar *name,
/* run the main loop thread so the chardev may operate */
server->thread = g_thread_new(NULL, thread_function, server->loop);
- tmpfs = g_mkdtemp(template);
+ tmpfs = g_dir_make_tmp("vhost-test-XXXXXX", &err);
if (!tmpfs) {
- g_test_message("g_mkdtemp on path (%s): %s", template, strerror(errno));
+ g_test_message("g_dir_make_tmp on path (%s): %s", tmpfs,
+ err->message);
+ g_error_free(err);
}
g_assert(tmpfs);
diff --git a/tests/qtest/virtio-blk-test.c b/tests/qtest/virtio-blk-test.c
index dc5eed31c8..19c01f808b 100644
--- a/tests/qtest/virtio-blk-test.c
+++ b/tests/qtest/virtio-blk-test.c
@@ -49,10 +49,10 @@ static void drive_destroy(void *path)
static char *drive_create(void)
{
int fd, ret;
- char *t_path = g_strdup("/tmp/qtest.XXXXXX");
+ char *t_path;
/* Create a temporary raw image */
- fd = mkstemp(t_path);
+ fd = g_file_open_tmp("qtest.XXXXXX", &t_path, NULL);
g_assert_cmpint(fd, >=, 0);
ret = ftruncate(fd, TEST_IMAGE_SIZE);
g_assert_cmpint(ret, ==, 0);
diff --git a/tests/qtest/virtio-net-failover.c b/tests/qtest/virtio-net-failover.c
index 443ee56de9..4a809590bf 100644
--- a/tests/qtest/virtio-net-failover.c
+++ b/tests/qtest/virtio-net-failover.c
@@ -588,6 +588,7 @@ static void test_hotplug_2_reverse(void)
machine_stop(qts);
}
+#ifndef _WIN32
static QDict *migrate_status(QTestState *qts)
{
QDict *resp, *ret;
@@ -1827,6 +1828,7 @@ static void test_multi_in(gconstpointer opaque)
machine_stop(qts);
}
+#endif /* _WIN32 */
int main(int argc, char **argv)
{
@@ -1857,7 +1859,11 @@ int main(int argc, char **argv)
qtest_add_func("failover-virtio-net/hotplug/2_reverse",
test_hotplug_2_reverse);
- /* migration tests */
+#ifndef _WIN32
+ /*
+ * These migration tests cases use the exec migration protocol,
+ * which is unsupported on Windows.
+ */
qtest_add_data_func("failover-virtio-net/migrate/on/out", tmpfile,
test_migrate_out);
qtest_add_data_func("failover-virtio-net/migrate/on/in", tmpfile,
@@ -1886,6 +1892,7 @@ int main(int argc, char **argv)
tmpfile, test_multi_out);
qtest_add_data_func("failover-virtio-net/migrate/multi/in",
tmpfile, test_multi_in);
+#endif /* _WIN32 */
ret = g_test_run();
diff --git a/tests/qtest/virtio-net-test.c b/tests/qtest/virtio-net-test.c
index 6ded252901..dff43f0f60 100644
--- a/tests/qtest/virtio-net-test.c
+++ b/tests/qtest/virtio-net-test.c
@@ -165,8 +165,6 @@ static void stop_cont_test(void *obj, void *data, QGuestAllocator *t_alloc)
rx_stop_cont_test(dev, t_alloc, rx, sv[0]);
}
-#endif
-
static void hotplug(void *obj, void *data, QGuestAllocator *t_alloc)
{
QVirtioPCIDevice *dev = obj;
@@ -286,6 +284,8 @@ static void *virtio_net_test_setup(GString *cmd_line, void *arg)
return sv;
}
+#endif /* _WIN32 */
+
static void large_tx(void *obj, void *data, QGuestAllocator *t_alloc)
{
QVirtioNet *dev = obj;
@@ -319,16 +319,15 @@ static void *virtio_net_test_setup_nosocket(GString *cmd_line, void *arg)
static void register_virtio_net_test(void)
{
- QOSGraphTestOptions opts = {
- .before = virtio_net_test_setup,
- };
+ QOSGraphTestOptions opts = { 0 };
- qos_add_test("hotplug", "virtio-net-pci", hotplug, &opts);
#ifndef _WIN32
+ opts.before = virtio_net_test_setup;
+ qos_add_test("hotplug", "virtio-net-pci", hotplug, &opts);
qos_add_test("basic", "virtio-net", send_recv_test, &opts);
qos_add_test("rx_stop_cont", "virtio-net", stop_cont_test, &opts);
-#endif
qos_add_test("announce-self", "virtio-net", announce_self, &opts);
+#endif
/* These tests do not need a loopback backend. */
opts.before = virtio_net_test_setup_nosocket;
diff --git a/tests/qtest/virtio-scsi-test.c b/tests/qtest/virtio-scsi-test.c
index 8ceb12aacd..ceaa7f2415 100644
--- a/tests/qtest/virtio-scsi-test.c
+++ b/tests/qtest/virtio-scsi-test.c
@@ -268,7 +268,7 @@ static void test_iothread_attach_node(void *obj, void *data,
QVirtioSCSIPCI *scsi_pci = obj;
QVirtioSCSI *scsi = &scsi_pci->scsi;
QVirtioSCSIQueues *vs;
- char tmp_path[] = "/tmp/qtest.XXXXXX";
+ g_autofree char *tmp_path = NULL;
int fd;
int ret;
@@ -282,7 +282,7 @@ static void test_iothread_attach_node(void *obj, void *data,
vs = qvirtio_scsi_init(scsi->vdev);
/* Create a temporary qcow2 overlay*/
- fd = mkstemp(tmp_path);
+ fd = g_file_open_tmp("qtest.XXXXXX", &tmp_path, NULL);
g_assert(fd >= 0);
close(fd);
diff --git a/tests/unit/test-image-locking.c b/tests/unit/test-image-locking.c
index ba057bd66c..a47299c247 100644
--- a/tests/unit/test-image-locking.c
+++ b/tests/unit/test-image-locking.c
@@ -76,10 +76,10 @@ static void check_locked_bytes(int fd, uint64_t perm_locks,
static void test_image_locking_basic(void)
{
BlockBackend *blk1, *blk2, *blk3;
- char img_path[] = "/tmp/qtest.XXXXXX";
+ g_autofree char *img_path = NULL;
uint64_t perm, shared_perm;
- int fd = mkstemp(img_path);
+ int fd = g_file_open_tmp("qtest.XXXXXX", &img_path, NULL);
assert(fd >= 0);
perm = BLK_PERM_WRITE | BLK_PERM_CONSISTENT_READ;
@@ -117,10 +117,10 @@ static void test_image_locking_basic(void)
static void test_set_perm_abort(void)
{
BlockBackend *blk1, *blk2;
- char img_path[] = "/tmp/qtest.XXXXXX";
+ g_autofree char *img_path = NULL;
uint64_t perm, shared_perm;
int r;
- int fd = mkstemp(img_path);
+ int fd = g_file_open_tmp("qtest.XXXXXX", &img_path, NULL);
assert(fd >= 0);
perm = BLK_PERM_WRITE | BLK_PERM_CONSISTENT_READ;
diff --git a/tests/unit/test-qga.c b/tests/unit/test-qga.c
index b6ea7c7304..b4e0a14573 100644
--- a/tests/unit/test-qga.c
+++ b/tests/unit/test-qga.c
@@ -60,7 +60,7 @@ fixture_setup(TestFixture *fixture, gconstpointer data, gchar **envp)
fixture->loop = g_main_loop_new(NULL, FALSE);
- fixture->test_dir = g_strdup("/tmp/qgatest.XXXXXX");
+ fixture->test_dir = g_strdup_printf("%s/qgatest.XXXXXX", g_get_tmp_dir());
g_assert_nonnull(g_mkdtemp(fixture->test_dir));
path = g_build_filename(fixture->test_dir, "sock", NULL);
diff --git a/tests/vhost-user-bridge.c b/tests/vhost-user-bridge.c
index 9b1dab2f28..fecdf915e7 100644
--- a/tests/vhost-user-bridge.c
+++ b/tests/vhost-user-bridge.c
@@ -631,7 +631,6 @@ static void *notifier_thread(void *arg)
static void
vubr_host_notifier_setup(VubrDev *dev)
{
- char template[] = "/tmp/vubr-XXXXXX";
pthread_t thread;
size_t length;
void *addr;
@@ -639,7 +638,7 @@ vubr_host_notifier_setup(VubrDev *dev)
length = qemu_real_host_page_size() * VHOST_USER_BRIDGE_MAX_QUEUES;
- fd = mkstemp(template);
+ fd = g_file_open_tmp("vubr-XXXXXX", NULL, NULL);
if (fd < 0) {
vubr_die("mkstemp()");
}