* 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:
commit
c8de6ec63d
|
@ -61,7 +61,7 @@ msys2-64bit:
|
||||||
- .\msys64\usr\bin\bash -lc './configure --target-list=x86_64-softmmu
|
- .\msys64\usr\bin\bash -lc './configure --target-list=x86_64-softmmu
|
||||||
--enable-capstone --without-default-devices'
|
--enable-capstone --without-default-devices'
|
||||||
- .\msys64\usr\bin\bash -lc 'make'
|
- .\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:
|
msys2-32bit:
|
||||||
extends: .shared_msys2_builder
|
extends: .shared_msys2_builder
|
||||||
|
@ -94,4 +94,4 @@ msys2-32bit:
|
||||||
- cd output
|
- cd output
|
||||||
- ..\msys64\usr\bin\bash -lc "../configure --target-list=ppc64-softmmu"
|
- ..\msys64\usr\bin\bash -lc "../configure --target-list=ppc64-softmmu"
|
||||||
- ..\msys64\usr\bin\bash -lc 'make'
|
- ..\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; } ;'
|
||||||
|
|
|
@ -81,6 +81,36 @@ QTest cases can be executed with
|
||||||
|
|
||||||
make check-qtest
|
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
|
QAPI schema tests
|
||||||
~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -44,9 +44,9 @@
|
||||||
#define TEST_IMAGE_SIZE_MB_SMALL 64
|
#define TEST_IMAGE_SIZE_MB_SMALL 64
|
||||||
|
|
||||||
/*** Globals ***/
|
/*** Globals ***/
|
||||||
static char tmp_path[] = "/tmp/qtest.XXXXXX";
|
static char *tmp_path;
|
||||||
static char debug_path[] = "/tmp/qtest-blkdebug.XXXXXX";
|
static char *debug_path;
|
||||||
static char mig_socket[] = "/tmp/qtest-migration.XXXXXX";
|
static char *mig_socket;
|
||||||
static bool ahci_pedantic;
|
static bool ahci_pedantic;
|
||||||
static const char *imgfmt;
|
static const char *imgfmt;
|
||||||
static unsigned test_image_size_mb;
|
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)
|
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;
|
unsigned char *patt;
|
||||||
ssize_t ret;
|
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(fd != -1);
|
||||||
g_assert(buf);
|
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)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
const char *arch;
|
const char *arch, *base;
|
||||||
int ret;
|
int ret;
|
||||||
int fd;
|
int fd;
|
||||||
int c;
|
int c;
|
||||||
|
@ -1871,8 +1871,22 @@ int main(int argc, char **argv)
|
||||||
return 0;
|
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 */
|
/* 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);
|
g_assert(fd >= 0);
|
||||||
if (have_qemu_img()) {
|
if (have_qemu_img()) {
|
||||||
imgfmt = "qcow2";
|
imgfmt = "qcow2";
|
||||||
|
@ -1889,12 +1903,13 @@ int main(int argc, char **argv)
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
/* Create temporary blkdebug instructions */
|
/* 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);
|
g_assert(fd >= 0);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
/* Reserve a hollow file to use as a socket for migration tests */
|
/* 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);
|
g_assert(fd >= 0);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
|
@ -1947,8 +1962,11 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
/* Cleanup */
|
/* Cleanup */
|
||||||
unlink(tmp_path);
|
unlink(tmp_path);
|
||||||
|
g_free(tmp_path);
|
||||||
unlink(debug_path);
|
unlink(debug_path);
|
||||||
|
g_free(debug_path);
|
||||||
unlink(mig_socket);
|
unlink(mig_socket);
|
||||||
|
g_free(mig_socket);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -608,16 +608,15 @@ static void test_write_block_protect_bottom_bit(void)
|
||||||
flash_reset();
|
flash_reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
static char tmp_path[] = "/tmp/qtest.m25p80.XXXXXX";
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
g_autofree char *tmp_path = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
g_test_init(&argc, &argv, NULL);
|
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);
|
g_assert(fd >= 0);
|
||||||
ret = ftruncate(fd, FLASH_SIZE);
|
ret = ftruncate(fd, FLASH_SIZE);
|
||||||
g_assert(ret == 0);
|
g_assert(ret == 0);
|
||||||
|
|
|
@ -1615,6 +1615,12 @@ static void test_acpi_virt_viot(void)
|
||||||
free_test_data(&data);
|
free_test_data(&data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
# define DEV_NULL "/dev/null"
|
||||||
|
#else
|
||||||
|
# define DEV_NULL "nul"
|
||||||
|
#endif
|
||||||
|
|
||||||
static void test_acpi_q35_slic(void)
|
static void test_acpi_q35_slic(void)
|
||||||
{
|
{
|
||||||
test_data data = {
|
test_data data = {
|
||||||
|
@ -1622,9 +1628,9 @@ static void test_acpi_q35_slic(void)
|
||||||
.variant = ".slic",
|
.variant = ".slic",
|
||||||
};
|
};
|
||||||
|
|
||||||
test_acpi_one("-acpitable sig=SLIC,oem_id='CRASH ',oem_table_id='ME',"
|
test_acpi_one("-acpitable sig=SLIC,oem_id=\"CRASH \",oem_table_id=ME,"
|
||||||
"oem_rev=00002210,asl_compiler_id='qemu',"
|
"oem_rev=00002210,asl_compiler_id=qemu,"
|
||||||
"asl_compiler_rev=00000000,data=/dev/null",
|
"asl_compiler_rev=00000000,data=" DEV_NULL,
|
||||||
&data);
|
&data);
|
||||||
free_test_data(&data);
|
free_test_data(&data);
|
||||||
}
|
}
|
||||||
|
|
|
@ -224,15 +224,16 @@ static bool check_guest_output(QTestState *qts, const testdef_t *test, int fd)
|
||||||
static void test_machine(const void *data)
|
static void test_machine(const void *data)
|
||||||
{
|
{
|
||||||
const testdef_t *test = data;
|
const testdef_t *test = data;
|
||||||
char serialtmp[] = "/tmp/qtest-boot-serial-sXXXXXX";
|
g_autofree char *serialtmp = NULL;
|
||||||
char codetmp[] = "/tmp/qtest-boot-serial-cXXXXXX";
|
g_autofree char *codetmp = NULL;
|
||||||
const char *codeparam = "";
|
const char *codeparam = "";
|
||||||
const uint8_t *code = NULL;
|
const uint8_t *code = NULL;
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
int ser_fd;
|
int ser_fd;
|
||||||
|
|
||||||
ser_fd = mkstemp(serialtmp);
|
ser_fd = g_file_open_tmp("qtest-boot-serial-sXXXXXX", &serialtmp, NULL);
|
||||||
g_assert(ser_fd != -1);
|
g_assert(ser_fd != -1);
|
||||||
|
close(ser_fd);
|
||||||
|
|
||||||
if (test->kernel) {
|
if (test->kernel) {
|
||||||
code = test->kernel;
|
code = test->kernel;
|
||||||
|
@ -246,7 +247,7 @@ static void test_machine(const void *data)
|
||||||
ssize_t wlen;
|
ssize_t wlen;
|
||||||
int code_fd;
|
int code_fd;
|
||||||
|
|
||||||
code_fd = mkstemp(codetmp);
|
code_fd = g_file_open_tmp("qtest-boot-serial-cXXXXXX", &codetmp, NULL);
|
||||||
g_assert(code_fd != -1);
|
g_assert(code_fd != -1);
|
||||||
wlen = write(code_fd, code, test->codesize);
|
wlen = write(code_fd, code, test->codesize);
|
||||||
g_assert(wlen == test->codesize);
|
g_assert(wlen == test->codesize);
|
||||||
|
@ -266,6 +267,8 @@ static void test_machine(const void *data)
|
||||||
unlink(codetmp);
|
unlink(codetmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ser_fd = open(serialtmp, O_RDONLY);
|
||||||
|
g_assert(ser_fd != -1);
|
||||||
if (!check_guest_output(qts, test, ser_fd)) {
|
if (!check_guest_output(qts, test, ser_fd)) {
|
||||||
g_error("Failed to find expected string. Please check '%s'",
|
g_error("Failed to find expected string. Please check '%s'",
|
||||||
serialtmp);
|
serialtmp);
|
||||||
|
|
|
@ -93,10 +93,9 @@ static void cxl_2root_port(void)
|
||||||
static void cxl_t3d(void)
|
static void cxl_t3d(void)
|
||||||
{
|
{
|
||||||
g_autoptr(GString) cmdline = g_string_new(NULL);
|
g_autoptr(GString) cmdline = g_string_new(NULL);
|
||||||
char template[] = "/tmp/cxl-test-XXXXXX";
|
g_autofree const char *tmpfs = NULL;
|
||||||
const char *tmpfs;
|
|
||||||
|
|
||||||
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);
|
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)
|
static void cxl_1pxb_2rp_2t3d(void)
|
||||||
{
|
{
|
||||||
g_autoptr(GString) cmdline = g_string_new(NULL);
|
g_autoptr(GString) cmdline = g_string_new(NULL);
|
||||||
char template[] = "/tmp/cxl-test-XXXXXX";
|
g_autofree const char *tmpfs = NULL;
|
||||||
const char *tmpfs;
|
|
||||||
|
|
||||||
tmpfs = g_mkdtemp(template);
|
tmpfs = g_dir_make_tmp("cxl-test-XXXXXX", NULL);
|
||||||
|
|
||||||
g_string_printf(cmdline, QEMU_PXB_CMD QEMU_2RP QEMU_2T3D,
|
g_string_printf(cmdline, QEMU_PXB_CMD QEMU_2RP QEMU_2T3D,
|
||||||
tmpfs, tmpfs, tmpfs, tmpfs);
|
tmpfs, tmpfs, tmpfs, tmpfs);
|
||||||
|
@ -122,10 +120,9 @@ static void cxl_1pxb_2rp_2t3d(void)
|
||||||
static void cxl_2pxb_4rp_4t3d(void)
|
static void cxl_2pxb_4rp_4t3d(void)
|
||||||
{
|
{
|
||||||
g_autoptr(GString) cmdline = g_string_new(NULL);
|
g_autoptr(GString) cmdline = g_string_new(NULL);
|
||||||
char template[] = "/tmp/cxl-test-XXXXXX";
|
g_autofree const char *tmpfs = NULL;
|
||||||
const char *tmpfs;
|
|
||||||
|
|
||||||
tmpfs = g_mkdtemp(template);
|
tmpfs = g_dir_make_tmp("cxl-test-XXXXXX", NULL);
|
||||||
|
|
||||||
g_string_printf(cmdline, QEMU_2PXB_CMD QEMU_4RP QEMU_4T3D,
|
g_string_printf(cmdline, QEMU_2PXB_CMD QEMU_4RP QEMU_4T3D,
|
||||||
tmpfs, tmpfs, tmpfs, tmpfs, tmpfs, tmpfs,
|
tmpfs, tmpfs, tmpfs, tmpfs, tmpfs, tmpfs,
|
||||||
|
|
|
@ -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)
|
static void test_pci_unplug_request(void)
|
||||||
{
|
{
|
||||||
const char *arch = qtest_get_arch();
|
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",
|
QTestState *qtest = qtest_initf("%s -device virtio-mouse-pci,id=dev0",
|
||||||
machine_addition);
|
machine_addition);
|
||||||
|
|
||||||
/*
|
process_device_remove(qtest, "dev0");
|
||||||
* 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");
|
|
||||||
|
|
||||||
qtest_quit(qtest);
|
qtest_quit(qtest);
|
||||||
}
|
}
|
||||||
|
@ -98,14 +103,7 @@ static void test_pci_unplug_json_request(void)
|
||||||
"%s -device \"{'driver': 'virtio-mouse-pci', 'id': 'dev0'}\"",
|
"%s -device \"{'driver': 'virtio-mouse-pci', 'id': 'dev0'}\"",
|
||||||
machine_addition);
|
machine_addition);
|
||||||
|
|
||||||
/*
|
process_device_remove(qtest, "dev0");
|
||||||
* 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");
|
|
||||||
|
|
||||||
qtest_quit(qtest);
|
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");
|
"-device power9_v2.0-spapr-cpu-core,core-id=1,id=dev0");
|
||||||
|
|
||||||
/* similar to test_pci_unplug_request */
|
/* similar to test_pci_unplug_request */
|
||||||
device_del(qtest, "dev0");
|
process_device_remove(qtest, "dev0");
|
||||||
system_reset(qtest);
|
|
||||||
wait_device_deleted_event(qtest, "dev0");
|
|
||||||
|
|
||||||
qtest_quit(qtest);
|
qtest_quit(qtest);
|
||||||
}
|
}
|
||||||
|
@ -144,9 +140,7 @@ static void test_spapr_memory_unplug_request(void)
|
||||||
"-device pc-dimm,id=dev0,memdev=mem0");
|
"-device pc-dimm,id=dev0,memdev=mem0");
|
||||||
|
|
||||||
/* similar to test_pci_unplug_request */
|
/* similar to test_pci_unplug_request */
|
||||||
device_del(qtest, "dev0");
|
process_device_remove(qtest, "dev0");
|
||||||
system_reset(qtest);
|
|
||||||
wait_device_deleted_event(qtest, "dev0");
|
|
||||||
|
|
||||||
qtest_quit(qtest);
|
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");
|
qtest = qtest_initf("-device spapr-pci-host-bridge,index=1,id=dev0");
|
||||||
|
|
||||||
/* similar to test_pci_unplug_request */
|
/* similar to test_pci_unplug_request */
|
||||||
device_del(qtest, "dev0");
|
process_device_remove(qtest, "dev0");
|
||||||
system_reset(qtest);
|
|
||||||
wait_device_deleted_event(qtest, "dev0");
|
|
||||||
|
|
||||||
qtest_quit(qtest);
|
qtest_quit(qtest);
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,7 +68,7 @@ enum {
|
||||||
DSKCHG = 0x80,
|
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_set(data, mask) g_assert_cmphex((data) & (mask), ==, (mask))
|
||||||
#define assert_bit_clear(data, mask) g_assert_cmphex((data) & (mask), ==, 0)
|
#define assert_bit_clear(data, mask) g_assert_cmphex((data) & (mask), ==, 0)
|
||||||
|
@ -608,7 +608,7 @@ int main(int argc, char **argv)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Create a temporary raw image */
|
/* Create a temporary raw image */
|
||||||
fd = mkstemp(test_image);
|
fd = g_file_open_tmp("qtest.XXXXXX", &test_image, NULL);
|
||||||
g_assert(fd >= 0);
|
g_assert(fd >= 0);
|
||||||
ret = ftruncate(fd, TEST_IMAGE_SIZE);
|
ret = ftruncate(fd, TEST_IMAGE_SIZE);
|
||||||
g_assert(ret == 0);
|
g_assert(ret == 0);
|
||||||
|
@ -640,6 +640,7 @@ int main(int argc, char **argv)
|
||||||
/* Cleanup */
|
/* Cleanup */
|
||||||
qtest_end();
|
qtest_end();
|
||||||
unlink(test_image);
|
unlink(test_image);
|
||||||
|
g_free(test_image);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,8 +20,8 @@ typedef struct generic_fuzz_config {
|
||||||
} generic_fuzz_config;
|
} generic_fuzz_config;
|
||||||
|
|
||||||
static inline gchar *generic_fuzzer_virtio_9p_args(void){
|
static inline gchar *generic_fuzzer_virtio_9p_args(void){
|
||||||
char tmpdir[] = "/tmp/qemu-fuzz.XXXXXX";
|
g_autofree char *tmpdir = g_dir_make_tmp("qemu-fuzz.XXXXXX", NULL);
|
||||||
g_assert_nonnull(g_mkdtemp(tmpdir));
|
g_assert_nonnull(tmpdir);
|
||||||
|
|
||||||
return g_strdup_printf("-machine q35 -nodefaults "
|
return g_strdup_printf("-machine q35 -nodefaults "
|
||||||
"-device virtio-9p,fsdev=hshare,mount_tag=hshare "
|
"-device virtio-9p,fsdev=hshare,mount_tag=hshare "
|
||||||
|
|
|
@ -181,10 +181,10 @@ static void drive_destroy(void *path)
|
||||||
static char *drive_create(void)
|
static char *drive_create(void)
|
||||||
{
|
{
|
||||||
int fd, ret;
|
int fd, ret;
|
||||||
char *t_path = g_strdup("/tmp/qtest.XXXXXX");
|
char *t_path;
|
||||||
|
|
||||||
/* Create a temporary raw image */
|
/* Create a temporary raw image */
|
||||||
fd = mkstemp(t_path);
|
fd = g_file_open_tmp("qtest.XXXXXX", &t_path, NULL);
|
||||||
g_assert_cmpint(fd, >=, 0);
|
g_assert_cmpint(fd, >=, 0);
|
||||||
ret = ftruncate(fd, TEST_IMAGE_SIZE);
|
ret = ftruncate(fd, TEST_IMAGE_SIZE);
|
||||||
g_assert_cmpint(ret, ==, 0);
|
g_assert_cmpint(ret, ==, 0);
|
||||||
|
|
|
@ -27,16 +27,16 @@
|
||||||
|
|
||||||
static char *create_test_img(int secs)
|
static char *create_test_img(int secs)
|
||||||
{
|
{
|
||||||
char *template = strdup("/tmp/qtest.XXXXXX");
|
char *template;
|
||||||
int fd, ret;
|
int fd, ret;
|
||||||
|
|
||||||
fd = mkstemp(template);
|
fd = g_file_open_tmp("qtest.XXXXXX", &template, NULL);
|
||||||
g_assert(fd >= 0);
|
g_assert(fd >= 0);
|
||||||
ret = ftruncate(fd, (off_t)secs * 512);
|
ret = ftruncate(fd, (off_t)secs * 512);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
free(template);
|
g_free(template);
|
||||||
template = NULL;
|
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)
|
static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
|
||||||
{
|
{
|
||||||
const char *template = "/tmp/qtest.XXXXXX";
|
g_autofree char *raw_path = NULL;
|
||||||
char *raw_path = strdup(template);
|
char *qcow2_path;
|
||||||
char *qcow2_path = strdup(template);
|
|
||||||
char cmd[100 + 2 * PATH_MAX];
|
char cmd[100 + 2 * PATH_MAX];
|
||||||
uint8_t buf[512] = {};
|
uint8_t buf[512] = {};
|
||||||
int i, ret, fd, offset;
|
int i, ret, fd, offset;
|
||||||
|
@ -468,7 +467,7 @@ static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
|
||||||
offset += 0x10;
|
offset += 0x10;
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = mkstemp(raw_path);
|
fd = g_file_open_tmp("qtest.XXXXXX", &raw_path, NULL);
|
||||||
g_assert(fd >= 0);
|
g_assert(fd >= 0);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
|
@ -478,7 +477,7 @@ static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
|
||||||
g_assert(ret == sizeof(buf));
|
g_assert(ret == sizeof(buf));
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
fd = mkstemp(qcow2_path);
|
fd = g_file_open_tmp("qtest.XXXXXX", &qcow2_path, NULL);
|
||||||
g_assert(fd >= 0);
|
g_assert(fd >= 0);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
|
@ -506,7 +505,6 @@ static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
|
||||||
free(qemu_img_abs_path);
|
free(qemu_img_abs_path);
|
||||||
|
|
||||||
unlink(raw_path);
|
unlink(raw_path);
|
||||||
free(raw_path);
|
|
||||||
|
|
||||||
return qcow2_path;
|
return qcow2_path;
|
||||||
}
|
}
|
||||||
|
@ -714,7 +712,7 @@ static void test_override(TestArgs *args, CHSResult expected[])
|
||||||
|
|
||||||
for (i = 0; i < args->n_drives; i++) {
|
for (i = 0; i < args->n_drives; i++) {
|
||||||
unlink(args->drives[i]);
|
unlink(args->drives[i]);
|
||||||
free(args->drives[i]);
|
g_free(args->drives[i]);
|
||||||
}
|
}
|
||||||
g_free(args->drives);
|
g_free(args->drives);
|
||||||
g_strfreev(args->argv);
|
g_strfreev(args->argv);
|
||||||
|
@ -867,7 +865,7 @@ static void test_override_scsi_hot_unplug(void)
|
||||||
|
|
||||||
for (i = 0; i < args->n_drives; i++) {
|
for (i = 0; i < args->n_drives; i++) {
|
||||||
unlink(args->drives[i]);
|
unlink(args->drives[i]);
|
||||||
free(args->drives[i]);
|
g_free(args->drives[i]);
|
||||||
}
|
}
|
||||||
g_free(args->drives);
|
g_free(args->drives);
|
||||||
g_strfreev(args->argv);
|
g_strfreev(args->argv);
|
||||||
|
@ -927,7 +925,7 @@ static void test_override_virtio_hot_unplug(void)
|
||||||
|
|
||||||
for (i = 0; i < args->n_drives; i++) {
|
for (i = 0; i < args->n_drives; i++) {
|
||||||
unlink(args->drives[i]);
|
unlink(args->drives[i]);
|
||||||
free(args->drives[i]);
|
g_free(args->drives[i]);
|
||||||
}
|
}
|
||||||
g_free(args->drives);
|
g_free(args->drives);
|
||||||
g_strfreev(args->argv);
|
g_strfreev(args->argv);
|
||||||
|
@ -987,7 +985,7 @@ test_add_done:
|
||||||
for (i = 0; i < backend_last; i++) {
|
for (i = 0; i < backend_last; i++) {
|
||||||
if (img_file_name[i]) {
|
if (img_file_name[i]) {
|
||||||
unlink(img_file_name[i]);
|
unlink(img_file_name[i]);
|
||||||
free(img_file_name[i]);
|
g_free(img_file_name[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -278,56 +278,34 @@ static void test_i440fx_pam(gconstpointer opaque)
|
||||||
qtest_end();
|
qtest_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _WIN32
|
|
||||||
|
|
||||||
#define BLOB_SIZE ((size_t)65536)
|
#define BLOB_SIZE ((size_t)65536)
|
||||||
#define ISA_BIOS_MAXSZ ((size_t)(128 * 1024))
|
#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.
|
* allocated string.
|
||||||
* The file is closed before the function returns.
|
* 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)
|
static char *create_blob_file(void)
|
||||||
{
|
{
|
||||||
int ret, fd;
|
int i, fd;
|
||||||
char *pathname;
|
char *pathname;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
g_autofree uint8_t *buf = g_malloc(BLOB_SIZE);
|
||||||
|
|
||||||
ret = -1;
|
|
||||||
fd = g_file_open_tmp("blob_XXXXXX", &pathname, &error);
|
fd = g_file_open_tmp("blob_XXXXXX", &pathname, &error);
|
||||||
if (fd == -1) {
|
g_assert_no_error(error);
|
||||||
fprintf(stderr, "unable to create blob file: %s\n", error->message);
|
close(fd);
|
||||||
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);
|
for (i = 0; i < BLOB_SIZE; i++) {
|
||||||
if (buf == MAP_FAILED) {
|
buf[i] = i;
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
static void test_i440fx_firmware(FirmwareTestFixture *fixture,
|
||||||
|
@ -398,8 +376,6 @@ static void request_pflash(FirmwareTestFixture *fixture,
|
||||||
fixture->is_bios = false;
|
fixture->is_bios = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _WIN32 */
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
TestData data;
|
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/defaults", &data, test_i440fx_defaults);
|
||||||
qtest_add_data_func("i440fx/pam", &data, test_i440fx_pam);
|
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/bios", request_bios);
|
||||||
add_firmware_test("i440fx/firmware/pflash", request_pflash);
|
add_firmware_test("i440fx/firmware/pflash", request_pflash);
|
||||||
#endif
|
|
||||||
|
|
||||||
return g_test_run();
|
return g_test_run();
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,8 +121,8 @@ enum {
|
||||||
static QPCIBus *pcibus = NULL;
|
static QPCIBus *pcibus = NULL;
|
||||||
static QGuestAllocator guest_malloc;
|
static QGuestAllocator guest_malloc;
|
||||||
|
|
||||||
static char tmp_path[] = "/tmp/qtest.XXXXXX";
|
static char *tmp_path;
|
||||||
static char debug_path[] = "/tmp/qtest-blkdebug.XXXXXX";
|
static char *debug_path;
|
||||||
|
|
||||||
static QTestState *ide_test_start(const char *cmdline_fmt, ...)
|
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 */
|
/* Prepopulate the CDROM with an interesting pattern */
|
||||||
generate_pattern(pattern, patt_len, ATAPI_BLOCK_SIZE);
|
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);
|
ret = fwrite(pattern, ATAPI_BLOCK_SIZE, patt_blocks, fh);
|
||||||
g_assert_cmpint(ret, ==, patt_blocks);
|
g_assert_cmpint(ret, ==, patt_blocks);
|
||||||
fclose(fh);
|
fclose(fh);
|
||||||
|
@ -993,7 +993,7 @@ static void test_cdrom_dma(void)
|
||||||
prdt[0].size = cpu_to_le32(len | PRDT_EOT);
|
prdt[0].size = cpu_to_le32(len | PRDT_EOT);
|
||||||
|
|
||||||
generate_pattern(pattern, ATAPI_BLOCK_SIZE * 16, ATAPI_BLOCK_SIZE);
|
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);
|
ret = fwrite(pattern, ATAPI_BLOCK_SIZE, 16, fh);
|
||||||
g_assert_cmpint(ret, ==, 16);
|
g_assert_cmpint(ret, ==, 16);
|
||||||
fclose(fh);
|
fclose(fh);
|
||||||
|
@ -1011,16 +1011,32 @@ static void test_cdrom_dma(void)
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
const char *base;
|
||||||
int fd;
|
int fd;
|
||||||
int ret;
|
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 */
|
/* 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);
|
g_assert(fd >= 0);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
/* Create a temporary raw image */
|
/* 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);
|
g_assert(fd >= 0);
|
||||||
ret = ftruncate(fd, TEST_IMAGE_SIZE);
|
ret = ftruncate(fd, TEST_IMAGE_SIZE);
|
||||||
g_assert(ret == 0);
|
g_assert(ret == 0);
|
||||||
|
@ -1049,7 +1065,9 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
/* Cleanup */
|
/* Cleanup */
|
||||||
unlink(tmp_path);
|
unlink(tmp_path);
|
||||||
|
g_free(tmp_path);
|
||||||
unlink(debug_path);
|
unlink(debug_path);
|
||||||
|
g_free(debug_path);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,11 @@
|
||||||
|
|
||||||
#include "libqtest.h"
|
#include "libqtest.h"
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
QTestState *global_qtest __attribute__((common, weak));
|
QTestState *global_qtest __attribute__((common, weak));
|
||||||
|
#else
|
||||||
|
__declspec(selectany) QTestState *global_qtest;
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qtest_start:
|
* qtest_start:
|
||||||
|
|
|
@ -97,7 +97,7 @@ static int socket_accept(int sock)
|
||||||
(void *)&timeout, sizeof(timeout))) {
|
(void *)&timeout, sizeof(timeout))) {
|
||||||
fprintf(stderr, "%s failed to set SO_RCVTIMEO: %s\n",
|
fprintf(stderr, "%s failed to set SO_RCVTIMEO: %s\n",
|
||||||
__func__, strerror(errno));
|
__func__, strerror(errno));
|
||||||
close(sock);
|
closesocket(sock);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ static int socket_accept(int sock)
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
fprintf(stderr, "%s failed: %s\n", __func__, strerror(errno));
|
fprintf(stderr, "%s failed: %s\n", __func__, strerror(errno));
|
||||||
}
|
}
|
||||||
close(sock);
|
closesocket(sock);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -265,8 +265,10 @@ QTestState *qtest_init_without_qmp_handshake(const char *extra_args)
|
||||||
|
|
||||||
s = g_new(QTestState, 1);
|
s = g_new(QTestState, 1);
|
||||||
|
|
||||||
socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid());
|
socket_path = g_strdup_printf("%s/qtest-%d.sock",
|
||||||
qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", getpid());
|
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
|
/* It's possible that if an earlier test run crashed it might
|
||||||
* have left a stale unix socket lying around. Delete any
|
* 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)
|
QTestState *qtest_init_with_serial(const char *extra_args, int *sock_fd)
|
||||||
{
|
{
|
||||||
int sock_fd_init;
|
int sock_fd_init;
|
||||||
char *sock_path, sock_dir[] = "/tmp/qtest-serial-XXXXXX";
|
g_autofree char *sock_dir = NULL;
|
||||||
|
char *sock_path;
|
||||||
QTestState *qts;
|
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_path = g_strdup_printf("%s/sock", sock_dir);
|
||||||
|
|
||||||
sock_fd_init = init_socket(sock_path);
|
sock_fd_init = init_socket(sock_path);
|
||||||
|
@ -417,8 +421,8 @@ void qtest_quit(QTestState *s)
|
||||||
qtest_remove_abrt_handler(s);
|
qtest_remove_abrt_handler(s);
|
||||||
|
|
||||||
qtest_kill_qemu(s);
|
qtest_kill_qemu(s);
|
||||||
close(s->fd);
|
closesocket(s->fd);
|
||||||
close(s->qmp_fd);
|
closesocket(s->qmp_fd);
|
||||||
g_string_free(s->rx, true);
|
g_string_free(s->rx, true);
|
||||||
|
|
||||||
for (GList *it = s->pending_events; it != NULL; it = it->next) {
|
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;
|
return sock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
void qtest_qmp_vsend_fds(QTestState *s, int *fds, size_t fds_num,
|
void qtest_qmp_vsend_fds(QTestState *s, int *fds, size_t fds_num,
|
||||||
const char *fmt, va_list ap)
|
const char *fmt, va_list ap)
|
||||||
{
|
{
|
||||||
qmp_fd_vsend_fds(s->qmp_fd, fds, fds_num, fmt, 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)
|
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,
|
QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num,
|
||||||
const char *fmt, va_list ap)
|
const char *fmt, va_list ap)
|
||||||
{
|
{
|
||||||
|
@ -607,6 +614,7 @@ QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num,
|
||||||
/* Receive reply */
|
/* Receive reply */
|
||||||
return qtest_qmp_receive(s);
|
return qtest_qmp_receive(s);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap)
|
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);
|
return qtest_qmp_receive(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
QDict *qtest_qmp_fds(QTestState *s, int *fds, size_t fds_num,
|
QDict *qtest_qmp_fds(QTestState *s, int *fds, size_t fds_num,
|
||||||
const char *fmt, ...)
|
const char *fmt, ...)
|
||||||
{
|
{
|
||||||
|
@ -627,6 +636,7 @@ QDict *qtest_qmp_fds(QTestState *s, int *fds, size_t fds_num,
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
QDict *qtest_qmp(QTestState *s, const char *fmt, ...)
|
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);
|
qobject_unref(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd)
|
void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd)
|
||||||
{
|
{
|
||||||
QDict *resp;
|
QDict *resp;
|
||||||
|
@ -1342,6 +1353,7 @@ void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd)
|
||||||
g_assert(!qdict_haskey(resp, "error"));
|
g_assert(!qdict_haskey(resp, "error"));
|
||||||
qobject_unref(resp);
|
qobject_unref(resp);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generic hot-unplugging test via the device_del QMP command.
|
* Generic hot-unplugging test via the device_del QMP command.
|
||||||
|
|
|
@ -94,6 +94,7 @@ void qtest_kill_qemu(QTestState *s);
|
||||||
*/
|
*/
|
||||||
void qtest_quit(QTestState *s);
|
void qtest_quit(QTestState *s);
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
/**
|
/**
|
||||||
* qtest_qmp_fds:
|
* qtest_qmp_fds:
|
||||||
* @s: #QTestState instance to operate on.
|
* @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,
|
QDict *qtest_qmp_fds(QTestState *s, int *fds, size_t fds_num,
|
||||||
const char *fmt, ...)
|
const char *fmt, ...)
|
||||||
G_GNUC_PRINTF(4, 5);
|
G_GNUC_PRINTF(4, 5);
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qtest_qmp:
|
* qtest_qmp:
|
||||||
|
@ -152,6 +154,7 @@ void qtest_qmp_send_raw(QTestState *s, const char *fmt, ...)
|
||||||
*/
|
*/
|
||||||
int qtest_socket_server(const char *socket_path);
|
int qtest_socket_server(const char *socket_path);
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
/**
|
/**
|
||||||
* qtest_vqmp_fds:
|
* qtest_vqmp_fds:
|
||||||
* @s: #QTestState instance to operate on.
|
* @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,
|
QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num,
|
||||||
const char *fmt, va_list ap)
|
const char *fmt, va_list ap)
|
||||||
G_GNUC_PRINTF(4, 0);
|
G_GNUC_PRINTF(4, 0);
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qtest_vqmp:
|
* 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)
|
QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap)
|
||||||
G_GNUC_PRINTF(2, 0);
|
G_GNUC_PRINTF(2, 0);
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
/**
|
/**
|
||||||
* qtest_qmp_vsend_fds:
|
* qtest_qmp_vsend_fds:
|
||||||
* @s: #QTestState instance to operate on.
|
* @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,
|
void qtest_qmp_vsend_fds(QTestState *s, int *fds, size_t fds_num,
|
||||||
const char *fmt, va_list ap)
|
const char *fmt, va_list ap)
|
||||||
G_GNUC_PRINTF(4, 0);
|
G_GNUC_PRINTF(4, 0);
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qtest_qmp_vsend:
|
* 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,
|
void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id,
|
||||||
const char *fmt, ...) G_GNUC_PRINTF(4, 5);
|
const char *fmt, ...) G_GNUC_PRINTF(4, 5);
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
/**
|
/**
|
||||||
* qtest_qmp_add_client:
|
* qtest_qmp_add_client:
|
||||||
* @qts: QTestState instance to operate on
|
* @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.
|
* Call QMP ``getfd`` followed by ``add_client`` with the given @fd.
|
||||||
*/
|
*/
|
||||||
void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd);
|
void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd);
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qtest_qmp_device_del:
|
* qtest_qmp_device_del:
|
||||||
|
|
|
@ -39,9 +39,14 @@ qtests_pci = \
|
||||||
qtests_cxl = \
|
qtests_cxl = \
|
||||||
(config_all_devices.has_key('CONFIG_CXL') ? ['cxl-test'] : [])
|
(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 = \
|
qtests_i386 = \
|
||||||
(slirp.found() ? ['pxe-test', 'test-netfilter'] : []) + \
|
(slirp.found() ? ['pxe-test'] : []) + \
|
||||||
(config_host.has_key('CONFIG_POSIX') ? ['test-filter-mirror'] : []) + \
|
qtests_filter + \
|
||||||
(have_tools ? ['ahci-test'] : []) + \
|
(have_tools ? ['ahci-test'] : []) + \
|
||||||
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
|
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
|
||||||
(config_all_devices.has_key('CONFIG_SGA') ? ['boot-serial-test'] : []) + \
|
(config_all_devices.has_key('CONFIG_SGA') ? ['boot-serial-test'] : []) + \
|
||||||
|
@ -95,8 +100,7 @@ qtests_i386 = \
|
||||||
'vmgenid-test',
|
'vmgenid-test',
|
||||||
'migration-test',
|
'migration-test',
|
||||||
'test-x86-cpuid-compat',
|
'test-x86-cpuid-compat',
|
||||||
'numa-test',
|
'numa-test'
|
||||||
'test-filter-redirector'
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if dbus_display
|
if dbus_display
|
||||||
|
@ -120,30 +124,25 @@ endif
|
||||||
qtests_x86_64 = qtests_i386
|
qtests_x86_64 = qtests_i386
|
||||||
|
|
||||||
qtests_alpha = ['boot-serial-test'] + \
|
qtests_alpha = ['boot-serial-test'] + \
|
||||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
qtests_filter + \
|
||||||
(slirp.found() ? ['test-netfilter'] : []) + \
|
|
||||||
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
|
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
|
||||||
|
|
||||||
qtests_avr = [ 'boot-serial-test' ]
|
qtests_avr = [ 'boot-serial-test' ]
|
||||||
|
|
||||||
qtests_hppa = ['boot-serial-test'] + \
|
qtests_hppa = ['boot-serial-test'] + \
|
||||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
qtests_filter + \
|
||||||
(slirp.found() ? ['test-netfilter'] : []) + \
|
|
||||||
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
|
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
|
||||||
|
|
||||||
qtests_m68k = ['boot-serial-test'] + \
|
qtests_m68k = ['boot-serial-test'] + \
|
||||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
qtests_filter
|
||||||
(slirp.found() ? ['test-netfilter'] : [])
|
|
||||||
|
|
||||||
qtests_microblaze = ['boot-serial-test'] + \
|
qtests_microblaze = ['boot-serial-test'] + \
|
||||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
qtests_filter
|
||||||
(slirp.found() ? ['test-netfilter'] : [])
|
|
||||||
|
|
||||||
qtests_microblazeel = qtests_microblaze
|
qtests_microblazeel = qtests_microblaze
|
||||||
|
|
||||||
qtests_mips = \
|
qtests_mips = \
|
||||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
qtests_filter + \
|
||||||
(slirp.found() ? ['test-netfilter'] : []) + \
|
|
||||||
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
|
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
|
||||||
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
|
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
|
||||||
|
|
||||||
|
@ -152,8 +151,7 @@ qtests_mips64 = qtests_mips
|
||||||
qtests_mips64el = qtests_mips
|
qtests_mips64el = qtests_mips
|
||||||
|
|
||||||
qtests_ppc = \
|
qtests_ppc = \
|
||||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
qtests_filter + \
|
||||||
(slirp.found() ? ['test-netfilter'] : []) + \
|
|
||||||
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
|
(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_M48T59') ? ['m48t59-test'] : []) + \
|
||||||
(config_all_devices.has_key('CONFIG_TCG') ? ['prom-env-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_sh4eb = (config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : [])
|
||||||
|
|
||||||
qtests_sparc = ['prom-env-test', 'm48t59-test', 'boot-serial-test'] + \
|
qtests_sparc = ['prom-env-test', 'm48t59-test', 'boot-serial-test'] + \
|
||||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
qtests_filter
|
||||||
(slirp.found() ? ['test-netfilter'] : [])
|
|
||||||
|
|
||||||
qtests_sparc64 = \
|
qtests_sparc64 = \
|
||||||
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
|
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
|
||||||
(slirp.found() ? ['test-netfilter'] : []) + \
|
qtests_filter + \
|
||||||
['test-filter-mirror', 'test-filter-redirector'] + \
|
|
||||||
['prom-env-test', 'boot-serial-test']
|
['prom-env-test', 'boot-serial-test']
|
||||||
|
|
||||||
qtests_npcm7xx = \
|
qtests_npcm7xx = \
|
||||||
|
|
|
@ -51,7 +51,7 @@ static void uart_rw_to_rxd(QTestState *qts, int sock_fd, const char *in,
|
||||||
{
|
{
|
||||||
int i, in_len = strlen(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++) {
|
for (i = 0; i < in_len; i++) {
|
||||||
g_assert_true(uart_wait_for_event(qts, NRF51_UART_BASE +
|
g_assert_true(uart_wait_for_event(qts, NRF51_UART_BASE +
|
||||||
A_UART_RXDRDY));
|
A_UART_RXDRDY));
|
||||||
|
@ -77,7 +77,7 @@ static void test_nrf51_uart(void)
|
||||||
char s[10];
|
char s[10];
|
||||||
QTestState *qts = qtest_init_with_serial("-M microbit", &sock_fd);
|
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);
|
g_assert_cmphex(qtest_readl(qts, NRF51_UART_BASE + A_UART_RXD), ==, 0x00);
|
||||||
|
|
||||||
qtest_writel(qts, NRF51_UART_BASE + A_UART_ENABLE, 0x04);
|
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);
|
qtest_writel(qts, NRF51_UART_BASE + A_UART_STARTTX, 0x01);
|
||||||
uart_w_to_txd(qts, "d");
|
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');
|
g_assert_cmphex(s[0], ==, 'd');
|
||||||
|
|
||||||
qtest_writel(qts, NRF51_UART_BASE + A_UART_SUSPEND, 0x01);
|
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_TXD, 'h');
|
||||||
qtest_writel(qts, NRF51_UART_BASE + A_UART_STARTTX, 0x01);
|
qtest_writel(qts, NRF51_UART_BASE + A_UART_STARTTX, 0x01);
|
||||||
uart_w_to_txd(qts, "world");
|
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);
|
g_assert_true(memcmp(s, "world", 5) == 0);
|
||||||
|
|
||||||
close(sock_fd);
|
closesocket(sock_fd);
|
||||||
|
|
||||||
qtest_quit(qts);
|
qtest_quit(qts);
|
||||||
}
|
}
|
||||||
|
|
|
@ -647,7 +647,16 @@ static int test_migrate_start(QTestState **from, QTestState **to,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!getenv("QTEST_LOG") && args->hide_stderr) {
|
if (!getenv("QTEST_LOG") && args->hide_stderr) {
|
||||||
|
#ifndef _WIN32
|
||||||
ignore_stderr = "2>/dev/null";
|
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 {
|
} else {
|
||||||
ignore_stderr = "";
|
ignore_stderr = "";
|
||||||
}
|
}
|
||||||
|
@ -1393,6 +1402,7 @@ static void test_precopy_unix_dirty_ring(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_GNUTLS
|
#ifdef CONFIG_GNUTLS
|
||||||
|
#ifndef _WIN32
|
||||||
static void test_precopy_unix_tls_psk(void)
|
static void test_precopy_unix_tls_psk(void)
|
||||||
{
|
{
|
||||||
g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
|
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);
|
test_precopy_common(&args);
|
||||||
}
|
}
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
#ifdef CONFIG_TASN1
|
#ifdef CONFIG_TASN1
|
||||||
static void test_precopy_unix_tls_x509_default_host(void)
|
static void test_precopy_unix_tls_x509_default_host(void)
|
||||||
|
@ -1513,6 +1524,7 @@ static void test_precopy_tcp_plain(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_GNUTLS
|
#ifdef CONFIG_GNUTLS
|
||||||
|
#ifndef _WIN32
|
||||||
static void test_precopy_tcp_tls_psk_match(void)
|
static void test_precopy_tcp_tls_psk_match(void)
|
||||||
{
|
{
|
||||||
MigrateCommon args = {
|
MigrateCommon args = {
|
||||||
|
@ -1523,6 +1535,7 @@ static void test_precopy_tcp_tls_psk_match(void)
|
||||||
|
|
||||||
test_precopy_common(&args);
|
test_precopy_common(&args);
|
||||||
}
|
}
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
static void test_precopy_tcp_tls_psk_mismatch(void)
|
static void test_precopy_tcp_tls_psk_mismatch(void)
|
||||||
{
|
{
|
||||||
|
@ -1920,6 +1933,7 @@ static void test_multifd_tcp_zstd(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_GNUTLS
|
#ifdef CONFIG_GNUTLS
|
||||||
|
#ifndef _WIN32
|
||||||
static void *
|
static void *
|
||||||
test_migrate_multifd_tcp_tls_psk_start_match(QTestState *from,
|
test_migrate_multifd_tcp_tls_psk_start_match(QTestState *from,
|
||||||
QTestState *to)
|
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");
|
test_migrate_precopy_tcp_multifd_start_common(from, to, "none");
|
||||||
return test_migrate_tls_psk_start_match(from, to);
|
return test_migrate_tls_psk_start_match(from, to);
|
||||||
}
|
}
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
test_migrate_multifd_tcp_tls_psk_start_mismatch(QTestState *from,
|
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 */
|
#endif /* CONFIG_TASN1 */
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
static void test_multifd_tcp_tls_psk_match(void)
|
static void test_multifd_tcp_tls_psk_match(void)
|
||||||
{
|
{
|
||||||
MigrateCommon args = {
|
MigrateCommon args = {
|
||||||
|
@ -1987,6 +2003,7 @@ static void test_multifd_tcp_tls_psk_match(void)
|
||||||
};
|
};
|
||||||
test_precopy_common(&args);
|
test_precopy_common(&args);
|
||||||
}
|
}
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
static void test_multifd_tcp_tls_psk_mismatch(void)
|
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/plain", test_precopy_unix_plain);
|
||||||
qtest_add_func("/migration/precopy/unix/xbzrle", test_precopy_unix_xbzrle);
|
qtest_add_func("/migration/precopy/unix/xbzrle", test_precopy_unix_xbzrle);
|
||||||
#ifdef CONFIG_GNUTLS
|
#ifdef CONFIG_GNUTLS
|
||||||
|
#ifndef _WIN32
|
||||||
qtest_add_func("/migration/precopy/unix/tls/psk",
|
qtest_add_func("/migration/precopy/unix/tls/psk",
|
||||||
test_precopy_unix_tls_psk);
|
test_precopy_unix_tls_psk);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (has_uffd) {
|
if (has_uffd) {
|
||||||
/*
|
/*
|
||||||
|
@ -2510,8 +2529,10 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
qtest_add_func("/migration/precopy/tcp/plain", test_precopy_tcp_plain);
|
qtest_add_func("/migration/precopy/tcp/plain", test_precopy_tcp_plain);
|
||||||
#ifdef CONFIG_GNUTLS
|
#ifdef CONFIG_GNUTLS
|
||||||
|
#ifndef _WIN32
|
||||||
qtest_add_func("/migration/precopy/tcp/tls/psk/match",
|
qtest_add_func("/migration/precopy/tcp/tls/psk/match",
|
||||||
test_precopy_tcp_tls_psk_match);
|
test_precopy_tcp_tls_psk_match);
|
||||||
|
#endif
|
||||||
qtest_add_func("/migration/precopy/tcp/tls/psk/mismatch",
|
qtest_add_func("/migration/precopy/tcp/tls/psk/mismatch",
|
||||||
test_precopy_tcp_tls_psk_mismatch);
|
test_precopy_tcp_tls_psk_mismatch);
|
||||||
#ifdef CONFIG_TASN1
|
#ifdef CONFIG_TASN1
|
||||||
|
@ -2555,8 +2576,10 @@ int main(int argc, char **argv)
|
||||||
test_multifd_tcp_zstd);
|
test_multifd_tcp_zstd);
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_GNUTLS
|
#ifdef CONFIG_GNUTLS
|
||||||
|
#ifndef _WIN32
|
||||||
qtest_add_func("/migration/multifd/tcp/tls/psk/match",
|
qtest_add_func("/migration/multifd/tcp/tls/psk/match",
|
||||||
test_multifd_tcp_tls_psk_match);
|
test_multifd_tcp_tls_psk_match);
|
||||||
|
#endif
|
||||||
qtest_add_func("/migration/multifd/tcp/tls/psk/mismatch",
|
qtest_add_func("/migration/multifd/tcp/tls/psk/mismatch",
|
||||||
test_multifd_tcp_tls_psk_mismatch);
|
test_multifd_tcp_tls_psk_mismatch);
|
||||||
#ifdef CONFIG_TASN1
|
#ifdef CONFIG_TASN1
|
||||||
|
|
|
@ -56,7 +56,7 @@ typedef struct {
|
||||||
QTestState *qtest;
|
QTestState *qtest;
|
||||||
} FlashConfig;
|
} FlashConfig;
|
||||||
|
|
||||||
static char image_path[] = "/tmp/qtest.XXXXXX";
|
static char *image_path;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The pflash implementation allows some parameters to be unspecified. We want
|
* 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)
|
static void cleanup(void *opaque)
|
||||||
{
|
{
|
||||||
unlink(image_path);
|
unlink(image_path);
|
||||||
|
g_free(image_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -635,16 +636,14 @@ static const FlashConfig configuration[] = {
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int fd = mkstemp(image_path);
|
GError *err = NULL;
|
||||||
if (fd == -1) {
|
int fd = g_file_open_tmp("qtest.XXXXXX", &image_path, &err);
|
||||||
g_printerr("Failed to create temporary file %s: %s\n", image_path,
|
g_assert_no_error(err);
|
||||||
strerror(errno));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
if (ftruncate(fd, UNIFORM_FLASH_SIZE) < 0) {
|
if (ftruncate(fd, UNIFORM_FLASH_SIZE) < 0) {
|
||||||
int error_code = errno;
|
int error_code = errno;
|
||||||
close(fd);
|
close(fd);
|
||||||
unlink(image_path);
|
cleanup(NULL);
|
||||||
g_printerr("Failed to truncate file %s to %u MB: %s\n", image_path,
|
g_printerr("Failed to truncate file %s to %u MB: %s\n", image_path,
|
||||||
UNIFORM_FLASH_SIZE, strerror(error_code));
|
UNIFORM_FLASH_SIZE, strerror(error_code));
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
|
@ -159,16 +159,19 @@ static void test_qmp_protocol(void)
|
||||||
qtest_quit(qts);
|
qtest_quit(qts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
|
||||||
/* Out-of-band tests */
|
/* Out-of-band tests */
|
||||||
|
|
||||||
char tmpdir[] = "/tmp/qmp-test-XXXXXX";
|
char *tmpdir;
|
||||||
char *fifo_name;
|
char *fifo_name;
|
||||||
|
|
||||||
static void setup_blocking_cmd(void)
|
static void setup_blocking_cmd(void)
|
||||||
{
|
{
|
||||||
if (!g_mkdtemp(tmpdir)) {
|
GError *err = NULL;
|
||||||
g_error("g_mkdtemp: %s", strerror(errno));
|
tmpdir = g_dir_make_tmp("qmp-test-XXXXXX", &err);
|
||||||
}
|
g_assert_no_error(err);
|
||||||
|
|
||||||
fifo_name = g_strdup_printf("%s/fifo", tmpdir);
|
fifo_name = g_strdup_printf("%s/fifo", tmpdir);
|
||||||
if (mkfifo(fifo_name, 0666)) {
|
if (mkfifo(fifo_name, 0666)) {
|
||||||
g_error("mkfifo: %s", strerror(errno));
|
g_error("mkfifo: %s", strerror(errno));
|
||||||
|
@ -179,6 +182,7 @@ static void cleanup_blocking_cmd(void)
|
||||||
{
|
{
|
||||||
unlink(fifo_name);
|
unlink(fifo_name);
|
||||||
rmdir(tmpdir);
|
rmdir(tmpdir);
|
||||||
|
g_free(tmpdir);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void send_cmd_that_blocks(QTestState *s, const char *id)
|
static void send_cmd_that_blocks(QTestState *s, const char *id)
|
||||||
|
@ -277,6 +281,8 @@ static void test_qmp_oob(void)
|
||||||
qtest_quit(qts);
|
qtest_quit(qts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
/* Preconfig tests */
|
/* Preconfig tests */
|
||||||
|
|
||||||
static void test_qmp_preconfig(void)
|
static void test_qmp_preconfig(void)
|
||||||
|
@ -336,7 +342,10 @@ int main(int argc, char *argv[])
|
||||||
g_test_init(&argc, &argv, NULL);
|
g_test_init(&argc, &argv, NULL);
|
||||||
|
|
||||||
qtest_add_func("qmp/protocol", test_qmp_protocol);
|
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);
|
qtest_add_func("qmp/oob", test_qmp_oob);
|
||||||
|
#endif
|
||||||
qtest_add_func("qmp/preconfig", test_qmp_preconfig);
|
qtest_add_func("qmp/preconfig", test_qmp_preconfig);
|
||||||
qtest_add_func("qmp/missing-any-arg", test_qmp_missing_any_arg);
|
qtest_add_func("qmp/missing-any-arg", test_qmp_missing_any_arg);
|
||||||
|
|
||||||
|
|
|
@ -841,7 +841,8 @@ static char *create_listen_socket(int *fd)
|
||||||
char *path;
|
char *path;
|
||||||
|
|
||||||
/* No race because our pid makes the path unique */
|
/* 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);
|
tmp_fd = mkstemp(path);
|
||||||
g_assert_cmpint(tmp_fd, >=, 0);
|
g_assert_cmpint(tmp_fd, >=, 0);
|
||||||
close(tmp_fd);
|
close(tmp_fd);
|
||||||
|
|
|
@ -482,8 +482,8 @@ static TestServer *test_server_new(const gchar *name,
|
||||||
struct vhost_user_ops *ops)
|
struct vhost_user_ops *ops)
|
||||||
{
|
{
|
||||||
TestServer *server = g_new0(TestServer, 1);
|
TestServer *server = g_new0(TestServer, 1);
|
||||||
char template[] = "/tmp/vhost-test-XXXXXX";
|
g_autofree const char *tmpfs = NULL;
|
||||||
const char *tmpfs;
|
GError *err = NULL;
|
||||||
|
|
||||||
server->context = g_main_context_new();
|
server->context = g_main_context_new();
|
||||||
server->loop = g_main_loop_new(server->context, FALSE);
|
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 */
|
/* run the main loop thread so the chardev may operate */
|
||||||
server->thread = g_thread_new(NULL, thread_function, server->loop);
|
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) {
|
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);
|
g_assert(tmpfs);
|
||||||
|
|
||||||
|
|
|
@ -49,10 +49,10 @@ static void drive_destroy(void *path)
|
||||||
static char *drive_create(void)
|
static char *drive_create(void)
|
||||||
{
|
{
|
||||||
int fd, ret;
|
int fd, ret;
|
||||||
char *t_path = g_strdup("/tmp/qtest.XXXXXX");
|
char *t_path;
|
||||||
|
|
||||||
/* Create a temporary raw image */
|
/* Create a temporary raw image */
|
||||||
fd = mkstemp(t_path);
|
fd = g_file_open_tmp("qtest.XXXXXX", &t_path, NULL);
|
||||||
g_assert_cmpint(fd, >=, 0);
|
g_assert_cmpint(fd, >=, 0);
|
||||||
ret = ftruncate(fd, TEST_IMAGE_SIZE);
|
ret = ftruncate(fd, TEST_IMAGE_SIZE);
|
||||||
g_assert_cmpint(ret, ==, 0);
|
g_assert_cmpint(ret, ==, 0);
|
||||||
|
|
|
@ -588,6 +588,7 @@ static void test_hotplug_2_reverse(void)
|
||||||
machine_stop(qts);
|
machine_stop(qts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
static QDict *migrate_status(QTestState *qts)
|
static QDict *migrate_status(QTestState *qts)
|
||||||
{
|
{
|
||||||
QDict *resp, *ret;
|
QDict *resp, *ret;
|
||||||
|
@ -1827,6 +1828,7 @@ static void test_multi_in(gconstpointer opaque)
|
||||||
|
|
||||||
machine_stop(qts);
|
machine_stop(qts);
|
||||||
}
|
}
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
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",
|
qtest_add_func("failover-virtio-net/hotplug/2_reverse",
|
||||||
test_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,
|
qtest_add_data_func("failover-virtio-net/migrate/on/out", tmpfile,
|
||||||
test_migrate_out);
|
test_migrate_out);
|
||||||
qtest_add_data_func("failover-virtio-net/migrate/on/in", tmpfile,
|
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);
|
tmpfile, test_multi_out);
|
||||||
qtest_add_data_func("failover-virtio-net/migrate/multi/in",
|
qtest_add_data_func("failover-virtio-net/migrate/multi/in",
|
||||||
tmpfile, test_multi_in);
|
tmpfile, test_multi_in);
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
ret = g_test_run();
|
ret = g_test_run();
|
||||||
|
|
||||||
|
|
|
@ -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]);
|
rx_stop_cont_test(dev, t_alloc, rx, sv[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void hotplug(void *obj, void *data, QGuestAllocator *t_alloc)
|
static void hotplug(void *obj, void *data, QGuestAllocator *t_alloc)
|
||||||
{
|
{
|
||||||
QVirtioPCIDevice *dev = obj;
|
QVirtioPCIDevice *dev = obj;
|
||||||
|
@ -286,6 +284,8 @@ static void *virtio_net_test_setup(GString *cmd_line, void *arg)
|
||||||
return sv;
|
return sv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
static void large_tx(void *obj, void *data, QGuestAllocator *t_alloc)
|
static void large_tx(void *obj, void *data, QGuestAllocator *t_alloc)
|
||||||
{
|
{
|
||||||
QVirtioNet *dev = obj;
|
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)
|
static void register_virtio_net_test(void)
|
||||||
{
|
{
|
||||||
QOSGraphTestOptions opts = {
|
QOSGraphTestOptions opts = { 0 };
|
||||||
.before = virtio_net_test_setup,
|
|
||||||
};
|
|
||||||
|
|
||||||
qos_add_test("hotplug", "virtio-net-pci", hotplug, &opts);
|
|
||||||
#ifndef _WIN32
|
#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("basic", "virtio-net", send_recv_test, &opts);
|
||||||
qos_add_test("rx_stop_cont", "virtio-net", stop_cont_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);
|
qos_add_test("announce-self", "virtio-net", announce_self, &opts);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* These tests do not need a loopback backend. */
|
/* These tests do not need a loopback backend. */
|
||||||
opts.before = virtio_net_test_setup_nosocket;
|
opts.before = virtio_net_test_setup_nosocket;
|
||||||
|
|
|
@ -268,7 +268,7 @@ static void test_iothread_attach_node(void *obj, void *data,
|
||||||
QVirtioSCSIPCI *scsi_pci = obj;
|
QVirtioSCSIPCI *scsi_pci = obj;
|
||||||
QVirtioSCSI *scsi = &scsi_pci->scsi;
|
QVirtioSCSI *scsi = &scsi_pci->scsi;
|
||||||
QVirtioSCSIQueues *vs;
|
QVirtioSCSIQueues *vs;
|
||||||
char tmp_path[] = "/tmp/qtest.XXXXXX";
|
g_autofree char *tmp_path = NULL;
|
||||||
int fd;
|
int fd;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -282,7 +282,7 @@ static void test_iothread_attach_node(void *obj, void *data,
|
||||||
vs = qvirtio_scsi_init(scsi->vdev);
|
vs = qvirtio_scsi_init(scsi->vdev);
|
||||||
|
|
||||||
/* Create a temporary qcow2 overlay*/
|
/* Create a temporary qcow2 overlay*/
|
||||||
fd = mkstemp(tmp_path);
|
fd = g_file_open_tmp("qtest.XXXXXX", &tmp_path, NULL);
|
||||||
g_assert(fd >= 0);
|
g_assert(fd >= 0);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
|
|
|
@ -76,10 +76,10 @@ static void check_locked_bytes(int fd, uint64_t perm_locks,
|
||||||
static void test_image_locking_basic(void)
|
static void test_image_locking_basic(void)
|
||||||
{
|
{
|
||||||
BlockBackend *blk1, *blk2, *blk3;
|
BlockBackend *blk1, *blk2, *blk3;
|
||||||
char img_path[] = "/tmp/qtest.XXXXXX";
|
g_autofree char *img_path = NULL;
|
||||||
uint64_t perm, shared_perm;
|
uint64_t perm, shared_perm;
|
||||||
|
|
||||||
int fd = mkstemp(img_path);
|
int fd = g_file_open_tmp("qtest.XXXXXX", &img_path, NULL);
|
||||||
assert(fd >= 0);
|
assert(fd >= 0);
|
||||||
|
|
||||||
perm = BLK_PERM_WRITE | BLK_PERM_CONSISTENT_READ;
|
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)
|
static void test_set_perm_abort(void)
|
||||||
{
|
{
|
||||||
BlockBackend *blk1, *blk2;
|
BlockBackend *blk1, *blk2;
|
||||||
char img_path[] = "/tmp/qtest.XXXXXX";
|
g_autofree char *img_path = NULL;
|
||||||
uint64_t perm, shared_perm;
|
uint64_t perm, shared_perm;
|
||||||
int r;
|
int r;
|
||||||
int fd = mkstemp(img_path);
|
int fd = g_file_open_tmp("qtest.XXXXXX", &img_path, NULL);
|
||||||
assert(fd >= 0);
|
assert(fd >= 0);
|
||||||
|
|
||||||
perm = BLK_PERM_WRITE | BLK_PERM_CONSISTENT_READ;
|
perm = BLK_PERM_WRITE | BLK_PERM_CONSISTENT_READ;
|
||||||
|
|
|
@ -60,7 +60,7 @@ fixture_setup(TestFixture *fixture, gconstpointer data, gchar **envp)
|
||||||
|
|
||||||
fixture->loop = g_main_loop_new(NULL, FALSE);
|
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));
|
g_assert_nonnull(g_mkdtemp(fixture->test_dir));
|
||||||
|
|
||||||
path = g_build_filename(fixture->test_dir, "sock", NULL);
|
path = g_build_filename(fixture->test_dir, "sock", NULL);
|
||||||
|
|
|
@ -631,7 +631,6 @@ static void *notifier_thread(void *arg)
|
||||||
static void
|
static void
|
||||||
vubr_host_notifier_setup(VubrDev *dev)
|
vubr_host_notifier_setup(VubrDev *dev)
|
||||||
{
|
{
|
||||||
char template[] = "/tmp/vubr-XXXXXX";
|
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
size_t length;
|
size_t length;
|
||||||
void *addr;
|
void *addr;
|
||||||
|
@ -639,7 +638,7 @@ vubr_host_notifier_setup(VubrDev *dev)
|
||||||
|
|
||||||
length = qemu_real_host_page_size() * VHOST_USER_BRIDGE_MAX_QUEUES;
|
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) {
|
if (fd < 0) {
|
||||||
vubr_die("mkstemp()");
|
vubr_die("mkstemp()");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue