Simplify tests.
This commit is contained in:
parent
a297e272d1
commit
cc6a772b89
@ -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) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
|||||||
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) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
|||||||
|
|
||||||
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) {
|
|||||||
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
|
||||||
|
Loading…
Reference in New Issue
Block a user