Skip to content
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 40 additions & 37 deletions libc/test/src/__support/File/file_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,43 +113,46 @@ StringFile *new_string_file(char *buffer, size_t buflen, int bufmode,
LIBC_NAMESPACE::File::mode_flags(mode));
}

TEST(LlvmLibcFileTest, WriteOnly) {
const char data[] = "hello, file";
constexpr size_t FILE_BUFFER_SIZE = sizeof(data) * 3 / 2;
char file_buffer[FILE_BUFFER_SIZE];
StringFile *f =
new_string_file(file_buffer, FILE_BUFFER_SIZE, _IOFBF, false, "w");

ASSERT_EQ(sizeof(data), f->write(data, sizeof(data)).value);
EXPECT_EQ(f->get_pos(), size_t(0)); // Data is buffered in the file stream
ASSERT_EQ(f->flush(), 0);
EXPECT_EQ(f->get_pos(), sizeof(data)); // Data should now be available
EXPECT_STREQ(f->get_str(), data);

f->reset();
ASSERT_EQ(f->get_pos(), size_t(0));
ASSERT_EQ(sizeof(data), f->write(data, sizeof(data)).value);
EXPECT_EQ(f->get_pos(), size_t(0)); // Data is buffered in the file stream
// The second write should trigger a buffer flush.
ASSERT_EQ(sizeof(data), f->write(data, sizeof(data)).value);
EXPECT_GE(f->get_pos(), size_t(0));
ASSERT_EQ(f->flush(), 0);
EXPECT_EQ(f->get_pos(), 2 * sizeof(data));
MemoryView src1("hello, file\0hello, file", sizeof(data) * 2),
dst1(f->get_str(), sizeof(data) * 2);
EXPECT_MEM_EQ(src1, dst1);

char read_data[sizeof(data)];
{
// This is not a readable file.
auto result = f->read(read_data, sizeof(data));
EXPECT_EQ(result.value, size_t(0));
EXPECT_TRUE(f->error());
EXPECT_TRUE(result.has_error());
}

ASSERT_EQ(f->close(), 0);
}
// TODO: Investigate the precommit bots' failures of this test and re-enable it.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use

#if 0
...
#endif

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Google Test supports disabling tests by prefixing their name with DISABLED_. This is better than commenting out the code or using #if 0, as disabled tests are still compiled (and thus won't rot). We should consider implementing the same feature in libc's test framework.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We'd probably want that to be target dependent as well, there's a handful of places where I need to disable a test only on NVPTX for example.

// https://github.com/llvm/llvm-project/issues/128185.
//
// TEST(LlvmLibcFileTest, WriteOnly) {
// const char data[] = "hello, file";
// constexpr size_t FILE_BUFFER_SIZE = sizeof(data) * 3 / 2;
// char file_buffer[FILE_BUFFER_SIZE];
// StringFile *f =
// new_string_file(file_buffer, FILE_BUFFER_SIZE, _IOFBF, false, "w");

// ASSERT_EQ(sizeof(data), f->write(data, sizeof(data)).value);
// EXPECT_EQ(f->get_pos(), size_t(0)); // Data is buffered in the file stream
// ASSERT_EQ(f->flush(), 0);
// EXPECT_EQ(f->get_pos(), sizeof(data)); // Data should now be available
// EXPECT_STREQ(f->get_str(), data);

// f->reset();
// ASSERT_EQ(f->get_pos(), size_t(0));
// ASSERT_EQ(sizeof(data), f->write(data, sizeof(data)).value);
// EXPECT_EQ(f->get_pos(), size_t(0)); // Data is buffered in the file stream
// // The second write should trigger a buffer flush.
// ASSERT_EQ(sizeof(data), f->write(data, sizeof(data)).value);
// EXPECT_GE(f->get_pos(), size_t(0));
// ASSERT_EQ(f->flush(), 0);
// EXPECT_EQ(f->get_pos(), 2 * sizeof(data));
// MemoryView src1("hello, file\0hello, file", sizeof(data) * 2),
// dst1(f->get_str(), sizeof(data) * 2);
// EXPECT_MEM_EQ(src1, dst1);

// char read_data[sizeof(data)];
// {
// // This is not a readable file.
// auto result = f->read(read_data, sizeof(data));
// EXPECT_EQ(result.value, size_t(0));
// EXPECT_TRUE(f->error());
// EXPECT_TRUE(result.has_error());
// }

// ASSERT_EQ(f->close(), 0);
// }

TEST(LlvmLibcFileTest, WriteLineBuffered) {
const char data[] = "hello\n file";
Expand Down
Loading