* 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-----

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>
This commit is contained in:
Stefan Hajnoczi 2022-09-28 17:04:11 -04:00
commit c8de6ec63d
31 changed files with 284 additions and 189 deletions

View File

@ -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; } ;'

View File

@ -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
~~~~~~~~~~~~~~~~~

View File

@ -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;
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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);

View File

@ -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,

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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 "

View File

@ -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);

View File

@ -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]);
}
}

View File

@ -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;
g_assert_no_error(error);
close(fd);
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);
}
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();
}

View File

@ -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;
}

View File

@ -13,7 +13,11 @@
#include "libqtest.h"
#ifndef _WIN32
QTestState *global_qtest __attribute__((common, weak));
#else
__declspec(selectany) QTestState *global_qtest;
#endif
/**
* qtest_start:

View File

@ -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.

View File

@ -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:

View File

@ -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 = \

View File

@ -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);
}

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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();

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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()");
}