From: JINMEI Tatuya Date: Wed, 10 Apr 2013 17:03:16 +0000 (-0700) Subject: [2831] extracted interproc synchronization utility from syncfile test X-Git-Tag: bind10-1.2.0beta1-release~457^2~74 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=54fdd6d60c068faaac34d573acb095378672f47e;p=thirdparty%2Fkea.git [2831] extracted interproc synchronization utility from syncfile test so we can share it with memory-sement-mapped. --- diff --git a/src/lib/util/tests/Makefile.am b/src/lib/util/tests/Makefile.am index ba83dc4bb7..038d2f078f 100644 --- a/src/lib/util/tests/Makefile.am +++ b/src/lib/util/tests/Makefile.am @@ -44,6 +44,7 @@ run_unittests_SOURCES += socketsession_unittest.cc run_unittests_SOURCES += strutil_unittest.cc run_unittests_SOURCES += time_utilities_unittest.cc run_unittests_SOURCES += range_utilities_unittest.cc +run_unittests_SOURCES += interprocess_util.h interprocess_util.cc run_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES) run_unittests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) diff --git a/src/lib/util/tests/interprocess_sync_file_unittest.cc b/src/lib/util/tests/interprocess_sync_file_unittest.cc index 6f23558086..38d9026f37 100644 --- a/src/lib/util/tests/interprocess_sync_file_unittest.cc +++ b/src/lib/util/tests/interprocess_sync_file_unittest.cc @@ -12,48 +12,20 @@ // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR // PERFORMANCE OF THIS SOFTWARE. -#include "util/interprocess_sync_file.h" +#include #include +#include #include #include using namespace std; +using isc::util::test::parentReadState; namespace isc { namespace util { namespace { -unsigned char -parentReadLockedState (int fd) { - unsigned char locked = 0xff; - - fd_set rfds; - FD_ZERO(&rfds); - FD_SET(fd, &rfds); - - // We use select() here to wait for new data on the input end of - // the pipe. We wait for 5 seconds (an arbitrary value) for input - // data, and continue if no data is available. This is done so - // that read() is not blocked due to some issue in the child - // process (and the tests continue running). - - struct timeval tv; - tv.tv_sec = 5; - tv.tv_usec = 0; - - const int nfds = select(fd + 1, &rfds, NULL, NULL, &tv); - EXPECT_EQ(1, nfds); - - if (nfds == 1) { - // Read status - ssize_t bytes_read = read(fd, &locked, sizeof(locked)); - EXPECT_EQ(sizeof(locked), bytes_read); - } - - return (locked); -} - TEST(InterprocessSyncFileTest, TestLock) { InterprocessSyncFile sync("test"); InterprocessSyncLocker locker(sync); @@ -99,7 +71,7 @@ TEST(InterprocessSyncFileTest, TestLock) { // Parent reads from pipe close(fds[1]); - const unsigned char locked = parentReadLockedState(fds[0]); + const unsigned char locked = parentReadState(fds[0]); close(fds[0]); @@ -163,7 +135,7 @@ TEST(InterprocessSyncFileTest, TestMultipleFilesForked) { // Parent reads from pipe close(fds[1]); - const unsigned char locked = parentReadLockedState(fds[0]); + const unsigned char locked = parentReadState(fds[0]); close(fds[0]); diff --git a/src/lib/util/tests/interprocess_util.cc b/src/lib/util/tests/interprocess_util.cc new file mode 100644 index 0000000000..dfb04b7146 --- /dev/null +++ b/src/lib/util/tests/interprocess_util.cc @@ -0,0 +1,48 @@ +// Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +#include + +#include +#include + +namespace isc { +namespace util { +namespace test { + +unsigned char +parentReadState(int fd) { + unsigned char result = 0xff; + + fd_set rfds; + FD_ZERO(&rfds); + FD_SET(fd, &rfds); + + struct timeval tv = {5, 0}; + + const int nfds = select(fd + 1, &rfds, NULL, NULL, &tv); + EXPECT_EQ(1, nfds); + + if (nfds == 1) { + // Read status + const ssize_t bytes_read = read(fd, &result, sizeof(result)); + EXPECT_EQ(sizeof(result), bytes_read); + } + + return (result); +} + +} +} +} diff --git a/src/lib/util/tests/interprocess_util.h b/src/lib/util/tests/interprocess_util.h new file mode 100644 index 0000000000..286f9cf8ef --- /dev/null +++ b/src/lib/util/tests/interprocess_util.h @@ -0,0 +1,31 @@ +// Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC") +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +namespace isc { +namespace util { +namespace test { +/// \brief A helper utility for a simple synchronization with another process. +/// +/// It waits for incoming data on a given file descriptor up to 5 seconds +/// (arbitrary choice), read one byte data, and return it to the caller. +/// On any failure it returns 0xff (255), so the sender process should use +/// a different value to pass. +unsigned char parentReadState(int fd); +} +} +} + +// Local Variables: +// mode: c++ +// End: