1 // Copyright © 2024 Collabora, Ltd.
2 // SPDX-License-Identifier: MIT
3
4 #include <gtest/gtest.h>
5 #include "memstream.h"
6
7 class MemStreamTest : public ::testing::Test {
8 protected:
9 struct u_memstream mem;
10 char *buffer;
11 size_t size;
12
MemStreamTest()13 MemStreamTest() : buffer(nullptr), size(0) {
14 u_memstream_open(&mem, &buffer, &size);
15 }
16
~MemStreamTest()17 ~MemStreamTest() {
18 u_memstream_close(&mem);
19 free(buffer);
20 }
21
resetStream()22 void resetStream() {
23 u_memstream_close(&mem);
24 free(buffer);
25 buffer = nullptr;
26 size = 0;
27 u_memstream_open(&mem, &buffer, &size);
28 }
29 };
30
TEST_F(MemStreamTest,OpenStream)31 TEST_F(MemStreamTest, OpenStream) {
32 EXPECT_NE(mem.f, nullptr);
33 EXPECT_EQ(size, 0);
34 }
35
TEST_F(MemStreamTest,WriteAndFlush)36 TEST_F(MemStreamTest, WriteAndFlush) {
37 const char *data = "Hello, world!";
38 size_t data_len = strlen(data);
39
40 EXPECT_EQ(fwrite(data, 1, data_len, mem.f), data_len);
41 EXPECT_EQ(u_memstream_flush(&mem), 0);
42
43 EXPECT_STREQ(buffer, data);
44 EXPECT_EQ(size, data_len);
45 }
46
TEST_F(MemStreamTest,ResetStream)47 TEST_F(MemStreamTest, ResetStream) {
48 const char *data = "Hello, world!";
49 size_t data_len = strlen(data);
50
51 EXPECT_EQ(fwrite(data, 1, data_len, mem.f), data_len);
52 EXPECT_EQ(u_memstream_flush(&mem), 0);
53
54 EXPECT_STREQ(buffer, data);
55 EXPECT_EQ(size, data_len);
56
57 resetStream();
58
59 EXPECT_EQ(size, 0);
60 }
61
TEST_F(MemStreamTest,WriteAfterReset)62 TEST_F(MemStreamTest, WriteAfterReset) {
63 const char *data1 = "Hello, world!";
64 const char *data2 = "New data";
65 size_t data1_len = strlen(data1);
66 size_t data2_len = strlen(data2);
67
68 EXPECT_EQ(fwrite(data1, 1, data1_len, mem.f), data1_len);
69 EXPECT_EQ(u_memstream_flush(&mem), 0);
70
71 EXPECT_STREQ(buffer, data1);
72 EXPECT_EQ(size, data1_len);
73
74 resetStream();
75
76 EXPECT_EQ(size, 0);
77
78 EXPECT_EQ(fwrite(data2, 1, data2_len, mem.f), data2_len);
79 EXPECT_EQ(u_memstream_flush(&mem), 0);
80
81 EXPECT_STREQ(buffer, data2);
82 EXPECT_EQ(size, data2_len);
83 }
84
TEST_F(MemStreamTest,MultipleFlushes)85 TEST_F(MemStreamTest, MultipleFlushes) {
86 const char *data = "Hello, world!";
87 size_t data_len = strlen(data);
88
89 EXPECT_EQ(fwrite(data, 1, data_len, mem.f), data_len);
90 EXPECT_EQ(u_memstream_flush(&mem), 0);
91
92 EXPECT_STREQ(buffer, data);
93 EXPECT_EQ(size, data_len);
94
95 EXPECT_EQ(u_memstream_flush(&mem), 0);
96
97 EXPECT_STREQ(buffer, data);
98 EXPECT_EQ(size, data_len);
99 }
100