// Copyright © 2024 Collabora, Ltd. // SPDX-License-Identifier: MIT #include #include "memstream.h" class MemStreamTest : public ::testing::Test { protected: struct u_memstream mem; char *buffer; size_t size; MemStreamTest() : buffer(nullptr), size(0) { u_memstream_open(&mem, &buffer, &size); } ~MemStreamTest() { u_memstream_close(&mem); free(buffer); } void resetStream() { u_memstream_close(&mem); free(buffer); buffer = nullptr; size = 0; u_memstream_open(&mem, &buffer, &size); } }; TEST_F(MemStreamTest, OpenStream) { EXPECT_NE(mem.f, nullptr); EXPECT_EQ(size, 0); } TEST_F(MemStreamTest, WriteAndFlush) { const char *data = "Hello, world!"; size_t data_len = strlen(data); EXPECT_EQ(fwrite(data, 1, data_len, mem.f), data_len); EXPECT_EQ(u_memstream_flush(&mem), 0); EXPECT_STREQ(buffer, data); EXPECT_EQ(size, data_len); } TEST_F(MemStreamTest, ResetStream) { const char *data = "Hello, world!"; size_t data_len = strlen(data); EXPECT_EQ(fwrite(data, 1, data_len, mem.f), data_len); EXPECT_EQ(u_memstream_flush(&mem), 0); EXPECT_STREQ(buffer, data); EXPECT_EQ(size, data_len); resetStream(); EXPECT_EQ(size, 0); } TEST_F(MemStreamTest, WriteAfterReset) { const char *data1 = "Hello, world!"; const char *data2 = "New data"; size_t data1_len = strlen(data1); size_t data2_len = strlen(data2); EXPECT_EQ(fwrite(data1, 1, data1_len, mem.f), data1_len); EXPECT_EQ(u_memstream_flush(&mem), 0); EXPECT_STREQ(buffer, data1); EXPECT_EQ(size, data1_len); resetStream(); EXPECT_EQ(size, 0); EXPECT_EQ(fwrite(data2, 1, data2_len, mem.f), data2_len); EXPECT_EQ(u_memstream_flush(&mem), 0); EXPECT_STREQ(buffer, data2); EXPECT_EQ(size, data2_len); } TEST_F(MemStreamTest, MultipleFlushes) { const char *data = "Hello, world!"; size_t data_len = strlen(data); EXPECT_EQ(fwrite(data, 1, data_len, mem.f), data_len); EXPECT_EQ(u_memstream_flush(&mem), 0); EXPECT_STREQ(buffer, data); EXPECT_EQ(size, data_len); EXPECT_EQ(u_memstream_flush(&mem), 0); EXPECT_STREQ(buffer, data); EXPECT_EQ(size, data_len); }