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