Commit cc6a772b authored by Victor Zverovich's avatar Victor Zverovich

Simplify tests.

parent a297e272
...@@ -32,7 +32,17 @@ ...@@ -32,7 +32,17 @@
#include <gtest/gtest-spi.h> #include <gtest/gtest-spi.h>
namespace { namespace {
std::string FormatSystemErrorMessage(int error_code, fmt::StringRef message) {
fmt::Writer out;
fmt::internal::FormatSystemErrorMessage(out, error_code, message);
return str(out);
}
#define EXPECT_SYSTEM_ERROR(statement, error_code, message) \
EXPECT_THROW_MSG(statement, fmt::SystemError, \
FormatSystemErrorMessage(error_code, message))
// Tests that assertion macros evaluate their arguments exactly once. // Tests that assertion macros evaluate their arguments exactly once.
class SingleEvaluationTest : public ::testing::Test { class SingleEvaluationTest : public ::testing::Test {
protected: protected:
...@@ -154,11 +164,9 @@ TEST(FileDescriptorTest, OpenFileInCtor) { ...@@ -154,11 +164,9 @@ TEST(FileDescriptorTest, OpenFileInCtor) {
} }
TEST(FileDescriptorTest, OpenFileError) { TEST(FileDescriptorTest, OpenFileError) {
fmt::Writer message; EXPECT_SYSTEM_ERROR(
fmt::internal::FormatSystemErrorMessage( FileDescriptor("nonexistent", FileDescriptor::RDONLY), ENOENT,
message, ENOENT, "cannot open file nonexistent"); "cannot open file nonexistent");
EXPECT_THROW_MSG(FileDescriptor("nonexistent", FileDescriptor::RDONLY),
fmt::SystemError, str(message));
} }
TEST(FileDescriptorTest, MoveCtor) { TEST(FileDescriptorTest, MoveCtor) {
...@@ -181,8 +189,8 @@ TEST(FileDescriptorTest, MoveAssignment) { ...@@ -181,8 +189,8 @@ TEST(FileDescriptorTest, MoveAssignment) {
} }
bool IsClosed(int fd) { bool IsClosed(int fd) {
char buffer[1]; char buffer;
ssize_t result = read(fd, buffer, sizeof(buffer)); ssize_t result = read(fd, &buffer, 1);
return result == -1 && errno == EBADF; return result == -1 && errno == EBADF;
} }
...@@ -238,23 +246,31 @@ TEST(FileDescriptorTest, CloseFileInDtor) { ...@@ -238,23 +246,31 @@ TEST(FileDescriptorTest, CloseFileInDtor) {
TEST(FileDescriptorTest, CloseError) { TEST(FileDescriptorTest, CloseError) {
FileDescriptor *fd = FileDescriptor *fd =
new FileDescriptor(".travis.yml", FileDescriptor::RDONLY); new FileDescriptor(".travis.yml", FileDescriptor::RDONLY);
fmt::Writer message; EXPECT_STDERR(close(fd->get()); delete fd,
fmt::internal::FormatSystemErrorMessage(message, EBADF, "cannot close file"); FormatSystemErrorMessage(EBADF, "cannot close file") + "\n");
EXPECT_STDERR(close(fd->get()); delete fd, str(message) + "\n");
} }
std::string ReadLine(FileDescriptor &fd) { std::string ReadLine(FileDescriptor &fd) {
enum { BUFFER_SIZE = 100 }; enum { BUFFER_SIZE = 100 };
char buffer[BUFFER_SIZE]; char buffer[BUFFER_SIZE];
ssize_t result = read(fd.get(), buffer, BUFFER_SIZE); std::streamsize result = fd.read(buffer, BUFFER_SIZE);
if (result == -1) buffer[std::min<std::streamsize>(BUFFER_SIZE - 1, result)] = '\0';
fmt::ThrowSystemError(errno, "cannot read file");
buffer[std::min<ssize_t>(BUFFER_SIZE - 1, result)] = '\0';
if (char *end = strchr(buffer, '\n')) if (char *end = strchr(buffer, '\n'))
*end = '\0'; *end = '\0';
return buffer; return buffer;
} }
TEST(FileDescriptorTest, Read) {
FileDescriptor fd(".travis.yml", FileDescriptor::RDONLY);
EXPECT_EQ("language: cpp", ReadLine(fd));
}
TEST(FileDescriptorTest, ReadError) {
FileDescriptor fd;
char buf;
EXPECT_SYSTEM_ERROR(fd.read(&buf, 1), EBADF, "cannot read from file");
}
TEST(FileDescriptorTest, Dup) { TEST(FileDescriptorTest, Dup) {
FileDescriptor fd(".travis.yml", FileDescriptor::RDONLY); FileDescriptor fd(".travis.yml", FileDescriptor::RDONLY);
FileDescriptor dup = FileDescriptor::dup(fd.get()); FileDescriptor dup = FileDescriptor::dup(fd.get());
...@@ -263,10 +279,8 @@ TEST(FileDescriptorTest, Dup) { ...@@ -263,10 +279,8 @@ TEST(FileDescriptorTest, Dup) {
} }
TEST(FileDescriptorTest, DupError) { TEST(FileDescriptorTest, DupError) {
fmt::Writer message; EXPECT_SYSTEM_ERROR(FileDescriptor::dup(-1),
fmt::internal::FormatSystemErrorMessage( EBADF, "cannot duplicate file descriptor -1");
message, EBADF, "cannot duplicate file descriptor -1");
EXPECT_THROW_MSG(FileDescriptor::dup(-1), fmt::SystemError, str(message));
} }
TEST(FileDescriptorTest, Dup2) { TEST(FileDescriptorTest, Dup2) {
...@@ -279,10 +293,9 @@ TEST(FileDescriptorTest, Dup2) { ...@@ -279,10 +293,9 @@ TEST(FileDescriptorTest, Dup2) {
TEST(FileDescriptorTest, Dup2Error) { TEST(FileDescriptorTest, Dup2Error) {
FileDescriptor fd(".travis.yml", FileDescriptor::RDONLY); FileDescriptor fd(".travis.yml", FileDescriptor::RDONLY);
fmt::Writer message; EXPECT_SYSTEM_ERROR(fd.dup2(-1), EBADF,
fmt::internal::FormatSystemErrorMessage(message, EBADF,
fmt::Format("cannot duplicate file descriptor {} to -1") << fd.get()); fmt::Format("cannot duplicate file descriptor {} to -1") << fd.get());
EXPECT_THROW_MSG(fd.dup2(-1), fmt::SystemError, str(message));
} }
TEST(FileDescriptorTest, Dup2NoExcept) { TEST(FileDescriptorTest, Dup2NoExcept) {
...@@ -302,8 +315,18 @@ TEST(FileDescriptorTest, Dup2NoExceptError) { ...@@ -302,8 +315,18 @@ TEST(FileDescriptorTest, Dup2NoExceptError) {
EXPECT_EQ(EBADF, ec.get()); EXPECT_EQ(EBADF, ec.get());
} }
TEST(FileDescriptorTest, Pipe) {
FileDescriptor read_fd, write_fd;
FileDescriptor::pipe(read_fd, write_fd);
EXPECT_NE(-1, read_fd.get());
EXPECT_NE(-1, write_fd.get());
// TODO: try writing to write_fd and reading from read_fd
}
// TODO: test pipe // TODO: test pipe
// TODO: test FileDescriptor::read
// TODO: compile both with C++11 & C++98 mode // TODO: compile both with C++11 & C++98 mode
#endif #endif
......
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