diff options
author | Tor Egge <Tor.Egge@broadpark.no> | 2020-04-05 16:55:17 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@broadpark.no> | 2020-04-14 10:58:01 +0200 |
commit | e3559d31ebde25eecf233a76429594940e367048 (patch) | |
tree | f2c090b7cb816be6131272b2abbab375a2def057 /searchlib | |
parent | cb9a25fd2ab04dbb2024bbbdc2c8036af247ffe2 (diff) |
Add fastos::UNIX_File_RW_Ops class to simplify error injection in
unit tests.
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/tests/util/ioerrorhandler/ioerrorhandler_test.cpp | 64 |
1 files changed, 18 insertions, 46 deletions
diff --git a/searchlib/src/tests/util/ioerrorhandler/ioerrorhandler_test.cpp b/searchlib/src/tests/util/ioerrorhandler/ioerrorhandler_test.cpp index fb1c1a356f6..904eb318dbe 100644 --- a/searchlib/src/tests/util/ioerrorhandler/ioerrorhandler_test.cpp +++ b/searchlib/src/tests/util/ioerrorhandler/ioerrorhandler_test.cpp @@ -11,95 +11,66 @@ #include <iostream> #include <fstream> #include <string> -#include <setjmp.h> -#include <dlfcn.h> #include <unistd.h> +#include <vespa/fastos/file_rw_ops.h> #include <vespa/log/log.h> LOG_SETUP("ioerrorhandler_test"); -extern "C" { - -ssize_t read(int fd, void *buf, size_t count); -ssize_t write(int fd, const void *buf, size_t count); -ssize_t pread(int fd, void *buf, size_t count, off_t offset); -ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset); - -} - -using ReadFunc = ssize_t (*)(int fd, void *buf, size_t count); -using WriteFunc = ssize_t (*)(int fd, const void *buf, size_t count); -using PreadFunc = ssize_t (*)(int fd, void *buf, size_t count, off_t offset); -using PwriteFunc = ssize_t (*)(int fd, const void *buf, size_t count, off_t offset); - using namespace search::test::statefile; using namespace search::test::statestring; -namespace { - -ReadFunc libc_read; -WriteFunc libc_write; -PreadFunc libc_pread; -PwriteFunc libc_pwrite; - -} - int injectErrno; std::atomic<int> injectreadErrnoTrigger; std::atomic<int> injectpreadErrnoTrigger; std::atomic<int> injectwriteErrnoTrigger; std::atomic<int> injectpwriteErrnoTrigger; -ssize_t read(int fd, void *buf, size_t count) +ssize_t error_injecting_read(int fd, void* buf, size_t count) { if (--injectreadErrnoTrigger == 0) { errno = injectErrno; return -1; } - if (!libc_read) { - libc_read = reinterpret_cast<ReadFunc>(dlsym(RTLD_NEXT, "read")); - } - return libc_read(fd, buf, count); + return read(fd, buf, count); } -ssize_t write(int fd, const void *buf, size_t count) +ssize_t error_injecting_write(int fd, const void* buf, size_t count) { if (--injectwriteErrnoTrigger == 0) { errno = injectErrno; return -1; } - if (!libc_write) { - libc_write = reinterpret_cast<WriteFunc>(dlsym(RTLD_NEXT, "write")); - } - return libc_write(fd, buf, count); + return write(fd, buf, count); } -ssize_t pread(int fd, void *buf, size_t count, off_t offset) +ssize_t error_injecting_pread(int fd, void* buf, size_t count, off_t offset) { if (--injectpreadErrnoTrigger == 0) { errno = injectErrno; return -1; } - if (!libc_pread) { - libc_pread = reinterpret_cast<PreadFunc>(dlsym(RTLD_NEXT, "pread")); - } - return libc_pread(fd, buf, count, offset); + return pread(fd, buf, count, offset); } -ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset) +ssize_t error_injecting_pwrite(int fd, const void* buf, size_t count, off_t offset) { if (--injectpwriteErrnoTrigger == 0) { errno = injectErrno; return -1; } - if (!libc_pwrite) { - libc_pwrite = reinterpret_cast<PwriteFunc>(dlsym(RTLD_NEXT, "pwrite")); - } - return libc_pwrite(fd, buf, count, offset); + return pwrite(fd, buf, count, offset); } - +void setup_error_injections() +{ + using Ops = fastos::File_RW_Ops; + Ops::_read = error_injecting_read; + Ops::_write = error_injecting_write; + Ops::_pread = error_injecting_pread; + Ops::_pwrite = error_injecting_pwrite; +} namespace search { @@ -347,6 +318,7 @@ TEST_F("Test that ioerror handler can process pwrite error", Fixture) TEST_MAIN() { + setup_error_injections(); TEST_RUN_ALL(); search::StateFile::erase("state"); unlink("testfile"); |