Commit 08878f6b authored by Stephen Morris's avatar Stephen Morris

[trac542] Add back util/io tests that were lost in last commit

parent fd985589
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) 2011 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 <util/io/fd.h>
#include <util/io/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) 2011 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 <util/io/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) 2011 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 <gtest/gtest.h>
int
main(int argc, char *argv[]) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
......@@ -21,11 +21,12 @@ run_unittests_SOURCES += $(top_builddir)/tests/tools/badpacket/command_options.c
run_unittests_SOURCES += $(top_builddir)/tests/tools/badpacket/option_info.cc
run_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES)
run_unittests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS)
run_unittests_LDFLAGS += $(top_builddir)/src/lib/log/liblog.la
run_unittests_LDFLAGS += $(top_builddir)/src/lib/util/unittests/libutil_unittests.la
run_unittests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) -Wl,--as-needed
run_unittests_LDADD = $(GTEST_LDADD)
run_unittests_LDFLAGS += $(top_builddir)/src/lib/exceptions/libexceptions.la
run_unittests_LDFLAGS += $(top_builddir)/src/lib/util/libutil.la
run_unittests_LDADD += $(top_builddir)/src/lib/util/unittests/libutil_unittests.la
endif
noinst_PROGRAMS = $(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