Commit 344410fe authored by Michal Vaner's avatar Michal Vaner
Browse files

Tests for isc::util::io

git-svn-id: svn://bind10.isc.org/svn/bind10/branches/vorner-sockcreator@3187 e5f2f494-b856-4b98-b285-d166d9295462
parent e88330e1
......@@ -510,6 +510,7 @@ AC_CONFIG_FILES([Makefile
src/lib/xfr/Makefile
src/lib/util/Makefile
src/lib/util/io/Makefile
src/lib/util/io/tests/Makefile
src/lib/util/unittests/Makefile
])
AC_OUTPUT([src/bin/cfgmgr/b10-cfgmgr.py
......
SUBDIRS = io unittests
SUBDIRS = io unittests io/tests
# The io/tests is hack, because otherwise we can not order these directories
# properly. Unittests use io and io/tests use unittest.
CLEANFILES = *.gcno *.gcda
AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib
AM_CXXFLAGS = $(B10_CXXFLAGS)
if USE_STATIC_LINK
AM_LDFLAGS = -static
endif
TESTS =
if HAVE_GTEST
TESTS += run_unittests
run_unittests_SOURCES = run_unittests.cc
run_unittests_SOURCES += fd_tests.cc
run_unittests_SOURCES += fd_share_tests.cc
run_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES)
run_unittests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS)
run_unittests_LDADD = $(GTEST_LDADD)
run_unittests_LDADD += $(top_builddir)/src/lib/util/io/libutil_io.la
run_unittests_LDADD += \
$(top_builddir)/src/lib/util/unittests/libutil_unittests.la
endif
noinst_PROGRAMS = $(TESTS)
// Copyright (C) 2010 CZ NIC
//
// 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 "../fd.h"
#include "../fd_share.h"
#include <util/unittests/fork.h>
#include <gtest/gtest.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <cstdio>
using namespace isc::util::io;
using namespace isc::util::unittests;
namespace {
// We test that we can transfer a pipe over other pipe
TEST(FDShare, transfer) {
// Get a pipe and fork
int pipes[2];
ASSERT_NE(-1, socketpair(AF_UNIX, SOCK_STREAM, 0, pipes));
pid_t sender(fork());
ASSERT_NE(-1, sender);
if(sender) { // We are in parent
// Close the other side of pipe, we want only writible one
EXPECT_NE(-1, close(pipes[0]));
// Get a process to check data
int fd(0);
pid_t checker(check_output(&fd, "data", 4));
ASSERT_NE(-1, checker);
// Now, send the file descriptor, close it and close the pipe
EXPECT_NE(-1, send_fd(pipes[1], fd));
EXPECT_NE(-1, close(pipes[1]));
EXPECT_NE(-1, close(fd));
// Check both subprocesses ended well
EXPECT_TRUE(process_ok(sender));
EXPECT_TRUE(process_ok(checker));
} else { // We are in child. We do not use ASSERT here
// Close the write end, we only read
if(close(pipes[1])) {
exit(1);
}
// Get the file descriptor
int fd(recv_fd(pipes[0]));
if(fd == -1) {
exit(1);
}
// This pipe is not needed
if(close(pipes[0])) {
exit(1);
}
// Send "data" trough the received fd, close it and be done
if(!write_data(fd, "data", 4) || close(fd) == -1) {
exit(1);
}
exit(0);
}
}
}
// Copyright (C) 2010 CZ NIC
//
// 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 "../fd.h"
#include <util/unittests/fork.h>
#include <gtest/gtest.h>
using namespace isc::util::io;
using namespace isc::util::unittests;
namespace {
// Make sure the test is large enough and does not fit into one
// read or write request
const size_t TEST_DATA_SIZE = 8 * 1024 * 1024;
class FDTest : public ::testing::Test {
public:
unsigned char *data, *buffer;
FDTest() :
// We do not care what is inside, we just need it to be the same
data(new unsigned char[TEST_DATA_SIZE]),
buffer(NULL)
{ }
~ FDTest() {
delete[] data;
delete[] buffer;
}
};
// Test we read what was sent
TEST_F(FDTest, read) {
int read_pipe(0);
buffer = new unsigned char[TEST_DATA_SIZE];
pid_t feeder(provide_input(&read_pipe, data, TEST_DATA_SIZE));
ASSERT_GE(feeder, 0);
ssize_t received(read_data(read_pipe, buffer, TEST_DATA_SIZE));
EXPECT_TRUE(process_ok(feeder));
EXPECT_EQ(TEST_DATA_SIZE, received);
EXPECT_EQ(0, memcmp(data, buffer, received));
}
// Test we write the correct thing
TEST_F(FDTest, write) {
int write_pipe(0);
pid_t checker(check_output(&write_pipe, data, TEST_DATA_SIZE));
ASSERT_GE(checker, 0);
EXPECT_TRUE(write_data(write_pipe, data, TEST_DATA_SIZE));
EXPECT_EQ(0, close(write_pipe));
EXPECT_TRUE(process_ok(checker));
}
}
// Copyright (C) 2010 CZ NIC
//
// 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 <gtest/gtest.h>
int
main(int argc, char *argv[]) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment