1#include "test.h"
2
3#include <base/system.h>
4
5#include <gtest/gtest.h>
6
7static void TestFileRead(const char *pWritten)
8{
9 const int WrittenLength = str_length(str: pWritten);
10
11 char aBuf[64] = {0};
12 CTestInfo Info;
13
14 IOHANDLE File = io_open(filename: Info.m_aFilename, flags: IOFLAG_WRITE);
15 ASSERT_TRUE(File);
16 EXPECT_EQ(io_write(File, pWritten, WrittenLength), WrittenLength);
17 EXPECT_FALSE(io_close(File));
18
19 File = io_open(filename: Info.m_aFilename, flags: IOFLAG_READ);
20 ASSERT_TRUE(File);
21 EXPECT_EQ(io_read(File, aBuf, sizeof(aBuf)), WrittenLength);
22 EXPECT_EQ(mem_comp(aBuf, pWritten, WrittenLength), 0);
23 EXPECT_FALSE(io_close(File));
24 EXPECT_FALSE(fs_remove(Info.m_aFilename));
25}
26
27TEST(Io, Read1)
28{
29 TestFileRead(pWritten: "");
30}
31TEST(Io, Read2)
32{
33 TestFileRead(pWritten: "abc");
34}
35TEST(Io, Read3)
36{
37 TestFileRead(pWritten: "\xef\xbb\xbf");
38}
39TEST(Io, Read4)
40{
41 TestFileRead(pWritten: "\xef\xbb\xbfxyz");
42}
43
44static void TestFileLength(const char *pWritten)
45{
46 const int WrittenLength = str_length(str: pWritten);
47
48 CTestInfo Info;
49
50 IOHANDLE File = io_open(filename: Info.m_aFilename, flags: IOFLAG_WRITE);
51 ASSERT_TRUE(File);
52 EXPECT_EQ(io_write(File, pWritten, WrittenLength), WrittenLength);
53 EXPECT_FALSE(io_close(File));
54
55 File = io_open(filename: Info.m_aFilename, flags: IOFLAG_READ);
56 ASSERT_TRUE(File);
57 EXPECT_EQ(io_length(File), WrittenLength);
58 EXPECT_FALSE(io_close(File));
59 EXPECT_FALSE(fs_remove(Info.m_aFilename));
60}
61
62TEST(Io, Length1)
63{
64 TestFileLength(pWritten: "");
65}
66TEST(Io, Length2)
67{
68 TestFileLength(pWritten: "abc");
69}
70TEST(Io, Length3)
71{
72 TestFileLength(pWritten: "\xef\xbb\xbf");
73}
74TEST(Io, Length4)
75{
76 TestFileLength(pWritten: "\xef\xbb\xbfxyz");
77}
78
79TEST(Io, SeekTellSkip)
80{
81 const char *pWritten1 = "01234567890123456789";
82 const int WrittenLength1 = str_length(str: pWritten1);
83 const char *pWritten2 = "abc";
84 const int WrittenLength2 = str_length(str: pWritten2);
85 const char *pWritten3 = "def";
86 const int WrittenLength3 = str_length(str: pWritten3);
87 const char *pWritten4 = "ghi";
88 const int WrittenLength4 = str_length(str: pWritten4);
89 const char *pWritten5 = "jkl";
90 const int WrittenLength5 = str_length(str: pWritten5);
91 const char *pExpectedResult = "01def5ghi9abc3456789jkl";
92 const int ExpectedLength = str_length(str: pExpectedResult);
93
94 char aBuf[64] = {0};
95 CTestInfo Info;
96
97 IOHANDLE File = io_open(filename: Info.m_aFilename, flags: IOFLAG_WRITE);
98 ASSERT_TRUE(File);
99 EXPECT_EQ(io_write(File, pWritten1, WrittenLength1), WrittenLength1);
100 EXPECT_FALSE(io_seek(File, -10, IOSEEK_CUR));
101 EXPECT_EQ(io_write(File, pWritten2, WrittenLength2), WrittenLength2);
102 EXPECT_FALSE(io_seek(File, 2, IOSEEK_START));
103 EXPECT_EQ(io_write(File, pWritten3, WrittenLength3), WrittenLength3);
104 EXPECT_FALSE(io_skip(File, 1));
105 EXPECT_EQ(io_write(File, pWritten4, WrittenLength4), WrittenLength4);
106 EXPECT_FALSE(io_seek(File, 0, IOSEEK_END));
107 EXPECT_EQ(io_write(File, pWritten5, WrittenLength5), WrittenLength5);
108 EXPECT_FALSE(io_close(File));
109
110 File = io_open(filename: Info.m_aFilename, flags: IOFLAG_READ);
111 ASSERT_TRUE(File);
112 EXPECT_EQ(io_read(File, aBuf, sizeof(aBuf)), ExpectedLength);
113 EXPECT_EQ(mem_comp(aBuf, pExpectedResult, ExpectedLength), 0);
114 EXPECT_FALSE(io_seek(File, -13, IOSEEK_CUR));
115 EXPECT_EQ(io_read(File, aBuf, WrittenLength2), WrittenLength2);
116 EXPECT_EQ(mem_comp(aBuf, pWritten2, WrittenLength2), 0);
117 EXPECT_FALSE(io_seek(File, 2, IOSEEK_START));
118 EXPECT_EQ(io_read(File, aBuf, WrittenLength3), WrittenLength3);
119 EXPECT_EQ(mem_comp(aBuf, pWritten3, WrittenLength3), 0);
120 EXPECT_FALSE(io_skip(File, 1));
121 EXPECT_EQ(io_read(File, aBuf, WrittenLength4), WrittenLength4);
122 EXPECT_EQ(mem_comp(aBuf, pWritten4, WrittenLength4), 0);
123 EXPECT_FALSE(io_seek(File, -3, IOSEEK_END));
124 EXPECT_EQ(io_read(File, aBuf, WrittenLength5), WrittenLength5);
125 EXPECT_EQ(mem_comp(aBuf, pWritten5, WrittenLength5), 0);
126 EXPECT_FALSE(io_close(File));
127 EXPECT_FALSE(fs_remove(Info.m_aFilename));
128}
129
130TEST(Io, CurrentExe)
131{
132 IOHANDLE CurrentExe = io_current_exe();
133 ASSERT_TRUE(CurrentExe);
134 EXPECT_GE(io_length(CurrentExe), 1024);
135 io_close(io: CurrentExe);
136}
137
138TEST(Io, SyncWorks)
139{
140 CTestInfo Info;
141 IOHANDLE File = io_open(filename: Info.m_aFilename, flags: IOFLAG_WRITE);
142 ASSERT_TRUE(File);
143 EXPECT_EQ(io_write(File, "abc\n", 4), 4);
144 EXPECT_FALSE(io_sync(File));
145 EXPECT_FALSE(io_close(File));
146 EXPECT_FALSE(fs_remove(Info.m_aFilename));
147}
148
149TEST(Io, WriteTruncatesFile)
150{
151 CTestInfo Info;
152
153 IOHANDLE File = io_open(filename: Info.m_aFilename, flags: IOFLAG_WRITE);
154 ASSERT_TRUE(File);
155 EXPECT_EQ(io_write(File, "0123456789", 10), 10);
156 EXPECT_FALSE(io_close(File));
157
158 File = io_open(filename: Info.m_aFilename, flags: IOFLAG_WRITE);
159 EXPECT_EQ(io_write(File, "ABCDE", 5), 5);
160 EXPECT_FALSE(io_close(File));
161
162 char aBuf[16];
163 File = io_open(filename: Info.m_aFilename, flags: IOFLAG_READ);
164 ASSERT_TRUE(File);
165 EXPECT_EQ(io_read(File, aBuf, sizeof(aBuf)), 5);
166 EXPECT_TRUE(mem_comp(aBuf, "ABCDE", 5) == 0);
167 EXPECT_FALSE(io_close(File));
168
169 EXPECT_FALSE(fs_remove(Info.m_aFilename));
170}
171
172TEST(Io, OpenFileShared)
173{
174 CTestInfo Info;
175
176 IOHANDLE FileWrite1 = io_open(filename: Info.m_aFilename, flags: IOFLAG_WRITE);
177 ASSERT_TRUE(FileWrite1);
178
179 IOHANDLE FileRead1 = io_open(filename: Info.m_aFilename, flags: IOFLAG_READ);
180 ASSERT_TRUE(FileRead1);
181
182 IOHANDLE FileWrite2 = io_open(filename: Info.m_aFilename, flags: IOFLAG_WRITE);
183 ASSERT_TRUE(FileWrite2);
184
185 IOHANDLE FileRead2 = io_open(filename: Info.m_aFilename, flags: IOFLAG_READ);
186 ASSERT_TRUE(FileRead2);
187
188 EXPECT_FALSE(io_close(FileWrite1));
189 EXPECT_FALSE(io_close(FileRead1));
190 EXPECT_FALSE(io_close(FileWrite2));
191 EXPECT_FALSE(io_close(FileRead2));
192
193 EXPECT_FALSE(fs_remove(Info.m_aFilename));
194}
195