Don't use .travis.yml in tests.

This commit is contained in:
Victor Zverovich 2014-05-06 12:03:12 -07:00
parent 45c50a9f1a
commit 72ad3781a4

View File

@ -290,8 +290,24 @@ TEST(ErrorCodeTest, Ctor) {
EXPECT_EQ(42, ErrorCode(42).get()); EXPECT_EQ(42, ErrorCode(42).get());
} }
BufferedFile OpenFile(const char *name, FILE **fp = 0) { const char FILE_CONTENT[] = "Don't panic!";
BufferedFile f = File(".travis.yml", File::RDONLY).fdopen("r");
// Opens a file for reading.
File OpenFile() {
File read_end, write_end;
File::pipe(read_end, write_end);
write_end.write(FILE_CONTENT, sizeof(FILE_CONTENT) - 1);
write_end.close();
return read_end;
}
// Opens a buffered file for reading.
BufferedFile OpenBufferedFile(FILE **fp = 0) {
File read_end, write_end;
File::pipe(read_end, write_end);
write_end.write(FILE_CONTENT, sizeof(FILE_CONTENT) - 1);
write_end.close();
BufferedFile f = read_end.fdopen("r");
if (fp) if (fp)
*fp = f.get(); *fp = f.get();
return f; return f;
@ -303,7 +319,7 @@ TEST(BufferedFileTest, DefaultCtor) {
} }
TEST(BufferedFileTest, MoveCtor) { TEST(BufferedFileTest, MoveCtor) {
BufferedFile bf = OpenFile(".travis.yml"); BufferedFile bf = OpenBufferedFile();
FILE *fp = bf.get(); FILE *fp = bf.get();
EXPECT_TRUE(fp != 0); EXPECT_TRUE(fp != 0);
BufferedFile bf2(std::move(bf)); BufferedFile bf2(std::move(bf));
@ -312,7 +328,7 @@ TEST(BufferedFileTest, MoveCtor) {
} }
TEST(BufferedFileTest, MoveAssignment) { TEST(BufferedFileTest, MoveAssignment) {
BufferedFile bf = OpenFile(".travis.yml"); BufferedFile bf = OpenBufferedFile();
FILE *fp = bf.get(); FILE *fp = bf.get();
EXPECT_TRUE(fp != 0); EXPECT_TRUE(fp != 0);
BufferedFile bf2; BufferedFile bf2;
@ -322,8 +338,8 @@ TEST(BufferedFileTest, MoveAssignment) {
} }
TEST(BufferedFileTest, MoveAssignmentClosesFile) { TEST(BufferedFileTest, MoveAssignmentClosesFile) {
BufferedFile bf = OpenFile(".travis.yml"); BufferedFile bf = OpenBufferedFile();
BufferedFile bf2 = OpenFile("CMakeLists.txt"); BufferedFile bf2 = OpenBufferedFile();
int old_fd = bf2.fileno(); int old_fd = bf2.fileno();
bf2 = std::move(bf); bf2 = std::move(bf);
EXPECT_TRUE(IsClosed(old_fd)); EXPECT_TRUE(IsClosed(old_fd));
@ -331,35 +347,35 @@ TEST(BufferedFileTest, MoveAssignmentClosesFile) {
TEST(BufferedFileTest, MoveFromTemporaryInCtor) { TEST(BufferedFileTest, MoveFromTemporaryInCtor) {
FILE *fp = 0; FILE *fp = 0;
BufferedFile f(OpenFile(".travis.yml", &fp)); BufferedFile f(OpenBufferedFile(&fp));
EXPECT_EQ(fp, f.get()); EXPECT_EQ(fp, f.get());
} }
TEST(BufferedFileTest, MoveFromTemporaryInAssignment) { TEST(BufferedFileTest, MoveFromTemporaryInAssignment) {
FILE *fp = 0; FILE *fp = 0;
BufferedFile f; BufferedFile f;
f = OpenFile(".travis.yml", &fp); f = OpenBufferedFile(&fp);
EXPECT_EQ(fp, f.get()); EXPECT_EQ(fp, f.get());
} }
TEST(BufferedFileTest, MoveFromTemporaryInAssignmentClosesFile) { TEST(BufferedFileTest, MoveFromTemporaryInAssignmentClosesFile) {
BufferedFile f = OpenFile(".travis.yml"); BufferedFile f = OpenBufferedFile();
int old_fd = f.fileno(); int old_fd = f.fileno();
f = OpenFile(".travis.yml"); f = OpenBufferedFile();
EXPECT_TRUE(IsClosed(old_fd)); EXPECT_TRUE(IsClosed(old_fd));
} }
TEST(BufferedFileTest, CloseFileInDtor) { TEST(BufferedFileTest, CloseFileInDtor) {
int fd = 0; int fd = 0;
{ {
BufferedFile f = OpenFile(".travis.yml"); BufferedFile f = OpenBufferedFile();
fd = f.fileno(); fd = f.fileno();
} }
EXPECT_TRUE(IsClosed(fd)); EXPECT_TRUE(IsClosed(fd));
} }
TEST(BufferedFileTest, CloseErrorInDtor) { TEST(BufferedFileTest, CloseErrorInDtor) {
BufferedFile *f = new BufferedFile(OpenFile(".travis.yml")); BufferedFile *f = new BufferedFile(OpenBufferedFile());
EXPECT_WRITE(stderr, { EXPECT_WRITE(stderr, {
// The close function must be called inside EXPECT_WRITE, otherwise // The close function must be called inside EXPECT_WRITE, otherwise
// the system may recycle closed file descriptor when redirecting the // the system may recycle closed file descriptor when redirecting the
@ -371,7 +387,7 @@ TEST(BufferedFileTest, CloseErrorInDtor) {
} }
TEST(BufferedFileTest, Close) { TEST(BufferedFileTest, Close) {
BufferedFile f = OpenFile(".travis.yml"); BufferedFile f = OpenBufferedFile();
int fd = f.fileno(); int fd = f.fileno();
f.close(); f.close();
EXPECT_TRUE(f.get() == 0); EXPECT_TRUE(f.get() == 0);
@ -379,7 +395,7 @@ TEST(BufferedFileTest, Close) {
} }
TEST(BufferedFileTest, CloseError) { TEST(BufferedFileTest, CloseError) {
BufferedFile f = OpenFile(".travis.yml"); BufferedFile f = OpenBufferedFile();
FMT_POSIX(close(f.fileno())); FMT_POSIX(close(f.fileno()));
EXPECT_SYSTEM_ERROR_NOASSERT(f.close(), EBADF, "cannot close file"); EXPECT_SYSTEM_ERROR_NOASSERT(f.close(), EBADF, "cannot close file");
EXPECT_TRUE(f.get() == 0); EXPECT_TRUE(f.get() == 0);
@ -388,10 +404,10 @@ TEST(BufferedFileTest, CloseError) {
TEST(BufferedFileTest, Fileno) { TEST(BufferedFileTest, Fileno) {
BufferedFile f; BufferedFile f;
EXPECT_DEATH(f.fileno(), ""); EXPECT_DEATH(f.fileno(), "");
f = OpenFile(".travis.yml"); f = OpenBufferedFile();
EXPECT_TRUE(f.fileno() != -1); EXPECT_TRUE(f.fileno() != -1);
File copy = File::dup(f.fileno()); File copy = File::dup(f.fileno());
EXPECT_READ(copy, "language: cpp"); EXPECT_READ(copy, FILE_CONTENT);
} }
TEST(FileTest, DefaultCtor) { TEST(FileTest, DefaultCtor) {
@ -399,18 +415,21 @@ TEST(FileTest, DefaultCtor) {
EXPECT_EQ(-1, f.descriptor()); EXPECT_EQ(-1, f.descriptor());
} }
TEST(FileTest, OpenFileInCtor) { TEST(FileTest, OpenBufferedFileInCtor) {
File f(".travis.yml", File::RDONLY); FILE *pf = fopen("test-file", "w");
fprintf(pf, FILE_CONTENT);
fclose(pf);
File f("test-file", File::RDONLY);
ASSERT_TRUE(IsOpen(f.descriptor())); ASSERT_TRUE(IsOpen(f.descriptor()));
} }
TEST(FileTest, OpenFileError) { TEST(FileTest, OpenBufferedFileError) {
EXPECT_SYSTEM_ERROR(File("nonexistent", File::RDONLY), EXPECT_SYSTEM_ERROR(File("nonexistent", File::RDONLY),
ENOENT, "cannot open file nonexistent"); ENOENT, "cannot open file nonexistent");
} }
TEST(FileTest, MoveCtor) { TEST(FileTest, MoveCtor) {
File f(".travis.yml", File::RDONLY); File f = OpenFile();
int fd = f.descriptor(); int fd = f.descriptor();
EXPECT_NE(-1, fd); EXPECT_NE(-1, fd);
File f2(std::move(f)); File f2(std::move(f));
@ -419,7 +438,7 @@ TEST(FileTest, MoveCtor) {
} }
TEST(FileTest, MoveAssignment) { TEST(FileTest, MoveAssignment) {
File f(".travis.yml", File::RDONLY); File f = OpenFile();
int fd = f.descriptor(); int fd = f.descriptor();
EXPECT_NE(-1, fd); EXPECT_NE(-1, fd);
File f2; File f2;
@ -429,51 +448,51 @@ TEST(FileTest, MoveAssignment) {
} }
TEST(FileTest, MoveAssignmentClosesFile) { TEST(FileTest, MoveAssignmentClosesFile) {
File f(".travis.yml", File::RDONLY); File f = OpenFile();
File f2("CMakeLists.txt", File::RDONLY); File f2 = OpenFile();
int old_fd = f2.descriptor(); int old_fd = f2.descriptor();
f2 = std::move(f); f2 = std::move(f);
EXPECT_TRUE(IsClosed(old_fd)); EXPECT_TRUE(IsClosed(old_fd));
} }
File OpenFile(int &fd) { File OpenBufferedFile(int &fd) {
File f(".travis.yml", File::RDONLY); File f = OpenFile();
fd = f.descriptor(); fd = f.descriptor();
return std::move(f); return std::move(f);
} }
TEST(FileTest, MoveFromTemporaryInCtor) { TEST(FileTest, MoveFromTemporaryInCtor) {
int fd = 0xdeadbeef; int fd = 0xdeadbeef;
File f(OpenFile(fd)); File f(OpenBufferedFile(fd));
EXPECT_EQ(fd, f.descriptor()); EXPECT_EQ(fd, f.descriptor());
} }
TEST(FileTest, MoveFromTemporaryInAssignment) { TEST(FileTest, MoveFromTemporaryInAssignment) {
int fd = 0xdeadbeef; int fd = 0xdeadbeef;
File f; File f;
f = OpenFile(fd); f = OpenBufferedFile(fd);
EXPECT_EQ(fd, f.descriptor()); EXPECT_EQ(fd, f.descriptor());
} }
TEST(FileTest, MoveFromTemporaryInAssignmentClosesFile) { TEST(FileTest, MoveFromTemporaryInAssignmentClosesFile) {
int fd = 0xdeadbeef; int fd = 0xdeadbeef;
File f(".travis.yml", File::RDONLY); File f = OpenFile();
int old_fd = f.descriptor(); int old_fd = f.descriptor();
f = OpenFile(fd); f = OpenBufferedFile(fd);
EXPECT_TRUE(IsClosed(old_fd)); EXPECT_TRUE(IsClosed(old_fd));
} }
TEST(FileTest, CloseFileInDtor) { TEST(FileTest, CloseFileInDtor) {
int fd = 0; int fd = 0;
{ {
File f(".travis.yml", File::RDONLY); File f = OpenFile();
fd = f.descriptor(); fd = f.descriptor();
} }
EXPECT_TRUE(IsClosed(fd)); EXPECT_TRUE(IsClosed(fd));
} }
TEST(FileTest, CloseErrorInDtor) { TEST(FileTest, CloseErrorInDtor) {
File *f = new File(".travis.yml", File::RDONLY); File *f = new File(OpenFile());
EXPECT_WRITE(stderr, { EXPECT_WRITE(stderr, {
// The close function must be called inside EXPECT_WRITE, otherwise // The close function must be called inside EXPECT_WRITE, otherwise
// the system may recycle closed file descriptor when redirecting the // the system may recycle closed file descriptor when redirecting the
@ -485,7 +504,7 @@ TEST(FileTest, CloseErrorInDtor) {
} }
TEST(FileTest, Close) { TEST(FileTest, Close) {
File f(".travis.yml", File::RDONLY); File f = OpenFile();
int fd = f.descriptor(); int fd = f.descriptor();
f.close(); f.close();
EXPECT_EQ(-1, f.descriptor()); EXPECT_EQ(-1, f.descriptor());
@ -493,15 +512,15 @@ TEST(FileTest, Close) {
} }
TEST(FileTest, CloseError) { TEST(FileTest, CloseError) {
File f(".travis.yml", File::RDONLY); File f = OpenFile();
FMT_POSIX(close(f.descriptor())); FMT_POSIX(close(f.descriptor()));
EXPECT_SYSTEM_ERROR_NOASSERT(f.close(), EBADF, "cannot close file"); EXPECT_SYSTEM_ERROR_NOASSERT(f.close(), EBADF, "cannot close file");
EXPECT_EQ(-1, f.descriptor()); EXPECT_EQ(-1, f.descriptor());
} }
TEST(FileTest, Read) { TEST(FileTest, Read) {
File f(".travis.yml", File::RDONLY); File f = OpenFile();
EXPECT_READ(f, "language: cpp"); EXPECT_READ(f, FILE_CONTENT);
} }
TEST(FileTest, ReadError) { TEST(FileTest, ReadError) {
@ -528,11 +547,10 @@ TEST(FileTest, WriteError) {
} }
TEST(FileTest, Dup) { TEST(FileTest, Dup) {
File f(".travis.yml", File::RDONLY); File f = OpenFile();
File copy = File::dup(f.descriptor()); File copy = File::dup(f.descriptor());
EXPECT_NE(f.descriptor(), copy.descriptor()); EXPECT_NE(f.descriptor(), copy.descriptor());
const char EXPECTED[] = "language: cpp"; EXPECT_EQ(FILE_CONTENT, Read(copy, sizeof(FILE_CONTENT) - 1));
EXPECT_EQ(EXPECTED, Read(copy, sizeof(EXPECTED) - 1));
} }
TEST(FileTest, DupError) { TEST(FileTest, DupError) {
@ -541,31 +559,31 @@ TEST(FileTest, DupError) {
} }
TEST(FileTest, Dup2) { TEST(FileTest, Dup2) {
File f(".travis.yml", File::RDONLY); File f = OpenFile();
File dup("CMakeLists.txt", File::RDONLY); File copy = OpenFile();
f.dup2(dup.descriptor()); f.dup2(copy.descriptor());
EXPECT_NE(f.descriptor(), dup.descriptor()); EXPECT_NE(f.descriptor(), copy.descriptor());
EXPECT_READ(dup, "language: cpp"); EXPECT_READ(copy, FILE_CONTENT);
} }
TEST(FileTest, Dup2Error) { TEST(FileTest, Dup2Error) {
File f(".travis.yml", File::RDONLY); File f = OpenFile();
EXPECT_SYSTEM_ERROR_NOASSERT(f.dup2(-1), EBADF, EXPECT_SYSTEM_ERROR_NOASSERT(f.dup2(-1), EBADF,
fmt::Format("cannot duplicate file descriptor {} to -1") << f.descriptor()); fmt::Format("cannot duplicate file descriptor {} to -1") << f.descriptor());
} }
TEST(FileTest, Dup2NoExcept) { TEST(FileTest, Dup2NoExcept) {
File f(".travis.yml", File::RDONLY); File f = OpenFile();
File dup("CMakeLists.txt", File::RDONLY); File copy = OpenFile();
ErrorCode ec; ErrorCode ec;
f.dup2(dup.descriptor(), ec); f.dup2(copy.descriptor(), ec);
EXPECT_EQ(0, ec.get()); EXPECT_EQ(0, ec.get());
EXPECT_NE(f.descriptor(), dup.descriptor()); EXPECT_NE(f.descriptor(), copy.descriptor());
EXPECT_READ(dup, "language: cpp"); EXPECT_READ(copy, FILE_CONTENT);
} }
TEST(FileTest, Dup2NoExceptError) { TEST(FileTest, Dup2NoExceptError) {
File f(".travis.yml", File::RDONLY); File f = OpenFile();
ErrorCode ec; ErrorCode ec;
SUPPRESS_ASSERT(f.dup2(-1, ec)); SUPPRESS_ASSERT(f.dup2(-1, ec));
EXPECT_EQ(EBADF, ec.get()); EXPECT_EQ(EBADF, ec.get());
@ -613,7 +631,7 @@ TEST(OutputRedirectTest, FlushErrorInCtor) {
} }
TEST(OutputRedirectTest, DupErrorInCtor) { TEST(OutputRedirectTest, DupErrorInCtor) {
BufferedFile f = OpenFile(".travis.yml"); BufferedFile f = OpenBufferedFile();
int fd = f.fileno(); int fd = f.fileno();
File copy = File::dup(fd); File copy = File::dup(fd);
FMT_POSIX(close(fd)); FMT_POSIX(close(fd));