Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Side by Side Diff: base/file_reader_unittest.cc

Issue 624713003: Keep only base/extractor.[cc|h]. (Closed) Base URL: https://chromium.googlesource.com/external/omaha.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/file_reader.cc ('k') | base/file_store.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2003-2009 Google Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 // ========================================================================
15
16 // TODO(omaha): improve unit test. For example, test we are handling correctly
17 // different types of line termination.
18
19 #include <vector>
20 #include "base/scoped_ptr.h"
21 #include "omaha/base/file_reader.h"
22 #include "omaha/testing/unit_test.h"
23
24 namespace omaha {
25
26 class ReadingFilesTest : public testing::Test {
27 protected:
28 ReadingFilesTest() {
29 temp_file_[0] = '\0';
30 }
31
32 virtual void SetUp() {
33 // create a temporary file
34 TCHAR temp_path[MAX_PATH] = {0};
35 EXPECT_LT(::GetTempPath(arraysize(temp_path), temp_path),
36 arraysize(temp_path));
37 EXPECT_NE(::GetTempFileName(temp_path, _T("ut_"), 0, temp_file_), 0);
38 }
39
40 virtual void TearDown() {
41 // remove the temporary file
42 if (::lstrlen(temp_file_) > 0) {
43 ASSERT_SUCCEEDED(File::Remove(temp_file_));
44 }
45 }
46
47 void Compare(const std::vector<char*>& lines1,
48 const std::vector<char*>& lines2,
49 byte** orig_lines, int* lengths, int* copies) {
50 // verify that all three things match
51 // * The lines read using the File class,
52 // * The lines read using the FileReader class,
53 // * The original data used to write the files
54 EXPECT_EQ(lines1.size(), lines2.size());
55
56 for (uint32 line_number = 0; line_number < lines1.size(); line_number++) {
57 int index = 0;
58 int data_length = lengths[line_number];
59 int data_copies = copies[line_number];
60 for (int copy = 0; copy < data_copies; copy++) {
61 for (int index_data = 0; index_data < data_length; index_data++) {
62 EXPECT_EQ(lines1[line_number][index], lines2[line_number][index]);
63 EXPECT_EQ(lines1[line_number][index],
64 orig_lines[line_number][index_data]);
65 index++;
66 }
67 }
68 EXPECT_EQ(lines1[line_number][index], lines2[line_number][index]);
69 EXPECT_EQ(lines1[line_number][index], '\0');
70 }
71 }
72
73 void DeleteContainedArrays(std::vector<char*>* lines) {
74 for (uint32 line_number = 0; line_number < lines->size(); line_number++) {
75 delete[] (*lines)[line_number];
76 (*lines)[line_number] = NULL;
77 }
78 }
79
80 HRESULT WriteCStringW(File* file, CStringW* str) {
81 return file->Write(reinterpret_cast<const byte*>(str->GetBuffer()),
82 str->GetLength() * sizeof(WCHAR),
83 NULL);
84 }
85
86 void TestReadFileStringUnicode(int buffer_size) {
87 CStringW line1 = L"hello there, here's some data";
88 CStringW line2 = L"i've got more\tdata over here.";
89 CStringW eol1 = L"\r";
90 CStringW eol2 = L"\r\n";
91 CStringW eol3 = L"\n";
92
93 std::vector<CString> expected_lines;
94 expected_lines.push_back(CString(line1));
95 expected_lines.push_back(CString(line2));
96 expected_lines.push_back(CString(line1));
97 expected_lines.push_back(CString(line1));
98 expected_lines.push_back(CString(line2));
99
100 File file_write;
101 EXPECT_SUCCEEDED(file_write.Open(temp_file_, true, false));
102
103 // Write the unicode marker to the beginning of the file.
104 byte buf[2] = {0xff, 0xfe};
105 EXPECT_SUCCEEDED(file_write.Write(buf, sizeof(buf), NULL));
106
107 EXPECT_SUCCEEDED(WriteCStringW(&file_write, &line1));
108 EXPECT_SUCCEEDED(WriteCStringW(&file_write, &eol1));
109 EXPECT_SUCCEEDED(WriteCStringW(&file_write, &line2));
110 EXPECT_SUCCEEDED(WriteCStringW(&file_write, &eol1));
111 EXPECT_SUCCEEDED(WriteCStringW(&file_write, &line1));
112 EXPECT_SUCCEEDED(WriteCStringW(&file_write, &eol3));
113 EXPECT_SUCCEEDED(WriteCStringW(&file_write, &line1));
114 EXPECT_SUCCEEDED(WriteCStringW(&file_write, &eol2));
115 EXPECT_SUCCEEDED(WriteCStringW(&file_write, &line2));
116 file_write.Close();
117
118 FileReader reader;
119 EXPECT_SUCCEEDED(reader.Init(temp_file_, buffer_size));
120
121 std::vector<CString> read_lines;
122 CString current_string;
123 while (SUCCEEDED(reader.ReadLineString(&current_string))) {
124 read_lines.push_back(current_string);
125 }
126
127 ASSERT_EQ(expected_lines.size(), read_lines.size());
128
129 if (expected_lines.size() == read_lines.size()) {
130 for (size_t i = 0; i < expected_lines.size(); ++i) {
131 CString expected_str = expected_lines[i];
132 CString read_str = read_lines[i];
133 ASSERT_STREQ(expected_str, read_str);
134 }
135 }
136 }
137
138 TCHAR temp_file_[MAX_PATH];
139
140 DISALLOW_EVIL_CONSTRUCTORS(ReadingFilesTest);
141 };
142
143
144 TEST_F(ReadingFilesTest, ReadFile1) {
145 // write the data to the file
146 File file_write;
147 EXPECT_SUCCEEDED(file_write.Open(temp_file_, true, false));
148 byte data1[] = {'a', 'b', 'c', 'z', '!', '&', '\t'};
149 int data1_copies = 1;
150 EXPECT_SUCCEEDED(file_write.WriteN(data1, arraysize(data1), data1_copies,
151 NULL));
152 byte return_data = '\n';
153 EXPECT_SUCCEEDED(file_write.WriteN(&return_data, 1, 1, NULL));
154
155 byte data2[] = {'d', 'a', 'v', 'e', ' ', ' ', '\t', '\\'};
156 int data2_copies = 2;
157 EXPECT_SUCCEEDED(file_write.WriteN(data2, arraysize(data2), data2_copies,
158 NULL));
159 file_write.Close();
160
161 // read in the file line by line using the File class
162 std::vector<char*> lines1;
163 File file_read1;
164 ASSERT_SUCCEEDED(file_read1.Open(temp_file_, false, false));
165 while (true) {
166 uint32 bytes_read;
167 scoped_array<char> line(new char[256]);
168 if (FAILED(file_read1.ReadLineAnsi(256, line.get(), &bytes_read))) {
169 break;
170 }
171 lines1.push_back(line.release());
172 }
173
174 file_read1.Close();
175
176 // read in the file line by line using the FileReader class
177 std::vector<char*> lines2;
178 FileReader file_read2;
179 size_t buffer_size = 512;
180 ASSERT_SUCCEEDED(file_read2.Init(temp_file_, buffer_size));
181 while (true) {
182 scoped_array<char> line(new char[256]);
183 if (FAILED(file_read2.ReadLineAnsi(256, line.get()))) {
184 break;
185 }
186 lines2.push_back(line.release());
187 }
188
189 // Verify that everything matches
190 byte* (orig_lines[]) = {data1, data2};
191 int copies[] = {data1_copies, data2_copies};
192 int lengths[] = {arraysize(data1), arraysize(data2)};
193 Compare(lines1, lines2, orig_lines, lengths, copies);
194
195 // Free the allocated memory
196 DeleteContainedArrays(&lines1);
197 DeleteContainedArrays(&lines1);
198 }
199
200 // Two readers should be able to read from the same file.
201 TEST_F(ReadingFilesTest, ReadFileShare) {
202 File file;
203 EXPECT_SUCCEEDED(file.Open(temp_file_, true, false));
204 file.Close();
205
206 const size_t kBufferSize = 0x100;
207
208 FileReader reader1;
209 EXPECT_SUCCEEDED(reader1.Init(temp_file_, kBufferSize));
210
211 FileReader reader2;
212 EXPECT_SUCCEEDED(reader2.Init(temp_file_, kBufferSize));
213 }
214
215 HRESULT WriteCStringA(File* file, CStringA* str) {
216 return file->Write(reinterpret_cast<const byte*>(str->GetBuffer()),
217 str->GetLength(),
218 NULL);
219 }
220
221 TEST_F(ReadingFilesTest, ReadFileStringAnsi) {
222 CStringA line1 = "hello there, here's some data";
223 CStringA line2 = "i've got more\tdata over here.";
224 CStringA eol1 = "\r";
225 CStringA eol2 = "\r\n";
226 CStringA eol3 = "\n";
227
228 std::vector<CString> expected_lines;
229 expected_lines.push_back(CString(line1));
230 expected_lines.push_back(CString(line2));
231 expected_lines.push_back(CString(line1));
232 expected_lines.push_back(CString(line1));
233 expected_lines.push_back(CString(line2));
234
235 File file_write;
236 EXPECT_SUCCEEDED(file_write.Open(temp_file_, true, false));
237 EXPECT_SUCCEEDED(WriteCStringA(&file_write, &line1));
238 EXPECT_SUCCEEDED(WriteCStringA(&file_write, &eol1));
239 EXPECT_SUCCEEDED(WriteCStringA(&file_write, &line2));
240 EXPECT_SUCCEEDED(WriteCStringA(&file_write, &eol1));
241 EXPECT_SUCCEEDED(WriteCStringA(&file_write, &line1));
242 EXPECT_SUCCEEDED(WriteCStringA(&file_write, &eol3));
243 EXPECT_SUCCEEDED(WriteCStringA(&file_write, &line1));
244 EXPECT_SUCCEEDED(WriteCStringA(&file_write, &eol2));
245 EXPECT_SUCCEEDED(WriteCStringA(&file_write, &line2));
246 file_write.Close();
247
248 FileReader reader;
249 EXPECT_SUCCEEDED(reader.Init(temp_file_, 20));
250
251 std::vector<CString> read_lines;
252 CString current_string;
253 while (SUCCEEDED(reader.ReadLineString(&current_string))) {
254 read_lines.push_back(current_string);
255 }
256
257 ASSERT_EQ(expected_lines.size(), read_lines.size());
258
259 if (expected_lines.size() == read_lines.size()) {
260 for (size_t i = 0; i < expected_lines.size(); ++i) {
261 CString expected_str = expected_lines[i];
262 CString read_str = read_lines[i];
263 ASSERT_STREQ(expected_str, read_str);
264 }
265 }
266 }
267
268 TEST_F(ReadingFilesTest, ReadFileStringUnicodeSmallBuffer) {
269 TestReadFileStringUnicode(20);
270 }
271
272 TEST_F(ReadingFilesTest, ReadFileStringUnicodeHugeBuffer) {
273 TestReadFileStringUnicode(4096);
274 }
275
276 TEST_F(ReadingFilesTest, ReadFileStringUnicodeSmallOddBufferBuffer) {
277 TestReadFileStringUnicode(19);
278 }
279
280 TEST_F(ReadingFilesTest, ReadFileStringUnicodeTinyOddBuffer) {
281 TestReadFileStringUnicode(3);
282 }
283
284 TEST_F(ReadingFilesTest, ReadFileStringUnicodeTinyEvenBuffer) {
285 TestReadFileStringUnicode(2);
286 }
287
288 TEST_F(ReadingFilesTest, ReadFileStringUnicodeOneByteBuffer) {
289 File file_write;
290 EXPECT_SUCCEEDED(file_write.Open(temp_file_, true, false));
291
292 // Write the unicode marker to the beginning of the file.
293 byte buf[2] = {0xff, 0xfe};
294 EXPECT_SUCCEEDED(file_write.Write(buf, sizeof(buf), NULL));
295
296 file_write.Close();
297
298 FileReader reader;
299 EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
300 reader.Init(temp_file_, 1));
301 }
302
303 } // namespace omaha
304
OLDNEW
« no previous file with comments | « base/file_reader.cc ('k') | base/file_store.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698