test: add generic unlink wrapper
reduce library uses unlink, but the unit tests need to
override it in a specific way.
But linking unit tests with LTO requires the wrapper
definitions be in objects/libraries listed *after*
the object/library that refers to it. So we need to
make the unlink wrapper somewhat generic. We do this
by exporting a string and callback function that the
user can set to enable a user-defined function to be
called when unlink() is called with a specific file
name.
Also revert 3ef6d06
as part of this patch, since we
no longer require the workaround that it implemented.
Fixes issue #1357.
Signed-off-by: Jim Harris <james.r.harris@intel.com>
Change-Id: I1ee4c424ad31fe7d91d7b524ed47aedd279e5b5c
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1948
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
parent
c4868f30d3
commit
cfb65ba611
@ -36,7 +36,7 @@ fi
|
|||||||
timing_enter build_release
|
timing_enter build_release
|
||||||
|
|
||||||
if [ $(uname -s) = Linux ]; then
|
if [ $(uname -s) = Linux ]; then
|
||||||
./configure $(get_config_params) --disable-debug --enable-lto --disable-unit-tests
|
./configure $(get_config_params) --disable-debug --enable-lto
|
||||||
else
|
else
|
||||||
# LTO needs a special compiler to work on BSD.
|
# LTO needs a special compiler to work on BSD.
|
||||||
./configure $(get_config_params) --disable-debug
|
./configure $(get_config_params) --disable-debug
|
||||||
|
5
configure
vendored
5
configure
vendored
@ -499,11 +499,6 @@ if [[ "${CONFIG[ISAL]}" = "n" ]] && [[ "${CONFIG[REDUCE]}" = "y" ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "${CONFIG[LTO]}" = "y" ]] && [[ "${CONFIG[UNIT_TESTS]}" = "y" ]]; then
|
|
||||||
echo "ERROR Conflicting options: --enable-lto is not compatible with --enable-unit-tests."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "${CONFIG[ENV]}" ]; then
|
if [ -z "${CONFIG[ENV]}" ]; then
|
||||||
CONFIG[ENV]=$rootdir/lib/env_dpdk
|
CONFIG[ENV]=$rootdir/lib/env_dpdk
|
||||||
echo "Using default SPDK env in ${CONFIG[ENV]}"
|
echo "Using default SPDK env in ${CONFIG[ENV]}"
|
||||||
|
@ -122,4 +122,14 @@ DECLARE_WRAPPER(sendmsg, ssize_t, (int sockfd, const struct msghdr *msg, int fla
|
|||||||
|
|
||||||
DECLARE_WRAPPER(writev, ssize_t, (int fd, const struct iovec *iov, int iovcnt));
|
DECLARE_WRAPPER(writev, ssize_t, (int fd, const struct iovec *iov, int iovcnt));
|
||||||
|
|
||||||
|
/* unlink is done a bit differently. */
|
||||||
|
extern char *g_unlink_path;
|
||||||
|
extern void (*g_unlink_callback)(void);
|
||||||
|
/* If g_unlink_path is NULL, __wrap_unlink will return ENOENT.
|
||||||
|
* If the __wrap_unlink() parameter does not match g_unlink_path, it will return ENOENT.
|
||||||
|
* If g_unlink_path does match, and g_unlink_callback has been set, g_unlink_callback will
|
||||||
|
* be called before returning 0.
|
||||||
|
*/
|
||||||
|
int __wrap_unlink(const char *path);
|
||||||
|
|
||||||
#endif /* SPDK_INTERNAL_MOCK_H */
|
#endif /* SPDK_INTERNAL_MOCK_H */
|
||||||
|
@ -48,3 +48,24 @@ DEFINE_WRAPPER(sendmsg, ssize_t, (int sockfd, const struct msghdr *msg, int flag
|
|||||||
flags))
|
flags))
|
||||||
|
|
||||||
DEFINE_WRAPPER(writev, ssize_t, (int fd, const struct iovec *iov, int iovcnt), (fd, iov, iovcnt))
|
DEFINE_WRAPPER(writev, ssize_t, (int fd, const struct iovec *iov, int iovcnt), (fd, iov, iovcnt))
|
||||||
|
|
||||||
|
char *g_unlink_path;
|
||||||
|
void (*g_unlink_callback)(void);
|
||||||
|
|
||||||
|
int
|
||||||
|
__attribute__((used))
|
||||||
|
__wrap_unlink(const char *path)
|
||||||
|
{
|
||||||
|
if (g_unlink_path == NULL) {
|
||||||
|
return ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(g_unlink_path, path) != 0) {
|
||||||
|
return ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_unlink_callback) {
|
||||||
|
g_unlink_callback();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -176,17 +176,10 @@ persistent_pm_buf_destroy(void)
|
|||||||
g_persistent_pm_buf_len = 0;
|
g_persistent_pm_buf_len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __wrap_unlink(const char *path);
|
static void
|
||||||
|
unlink_cb(void)
|
||||||
int
|
|
||||||
__wrap_unlink(const char *path)
|
|
||||||
{
|
{
|
||||||
if (strcmp(g_path, path) != 0) {
|
|
||||||
return ENOENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
persistent_pm_buf_destroy();
|
persistent_pm_buf_destroy();
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1296,6 +1289,9 @@ main(int argc, char **argv)
|
|||||||
CU_ADD_TEST(suite, overlapped);
|
CU_ADD_TEST(suite, overlapped);
|
||||||
CU_ADD_TEST(suite, compress_algorithm);
|
CU_ADD_TEST(suite, compress_algorithm);
|
||||||
|
|
||||||
|
g_unlink_path = g_path;
|
||||||
|
g_unlink_callback = unlink_cb;
|
||||||
|
|
||||||
CU_basic_set_mode(CU_BRM_VERBOSE);
|
CU_basic_set_mode(CU_BRM_VERBOSE);
|
||||||
CU_basic_run_tests();
|
CU_basic_run_tests();
|
||||||
num_failures = CU_get_number_of_failures();
|
num_failures = CU_get_number_of_failures();
|
||||||
|
Loading…
Reference in New Issue
Block a user