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

Side by Side Diff: components/password_manager/core/browser/import/csv_reader_unittest.cc

Issue 447763002: Implement CSVReader and CSVWriter to be used for password import and export. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/password_manager/core/browser/import/csv_reader.h"
6
7 #include "testing/gmock/include/gmock/gmock.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9
10 namespace password_manager {
11
12 TEST(CSVReaderTest, EmptyCSV) {
13 std::vector<std::string> column_names;
14 std::vector<CSVReader::ColumnNameToValueMap> records;
15 EXPECT_TRUE(CSVReader::Read(std::string(), &column_names, &records));
16 EXPECT_EQ(0u, column_names.size());
17 EXPECT_EQ(0u, records.size());
18 }
19
20 TEST(CSVReaderTest, SingleColumn) {
21 const char kTestCSVInput[] =
22 "foo\n"
23 "alpha\n"
24 "beta\n";
25
26 std::vector<std::string> column_names;
27 std::vector<CSVReader::ColumnNameToValueMap> records;
28 EXPECT_TRUE(CSVReader::Read(kTestCSVInput, &column_names, &records));
29
30 EXPECT_THAT(column_names, testing::ElementsAre("foo"));
31 ASSERT_EQ(2u, records.size());
32 EXPECT_THAT(records[0], testing::ElementsAre(
33 std::make_pair("foo", "alpha")));
34 EXPECT_THAT(records[1], testing::ElementsAre(
35 std::make_pair("foo", "beta")));
36 }
37
38 TEST(CSVReaderTest, HeaderOnly) {
39 const char kTestCSVInput[] =
40 "foo,bar\n";
41
42 std::vector<std::string> column_names;
43 std::vector<CSVReader::ColumnNameToValueMap> records;
44 ASSERT_TRUE(CSVReader::Read(kTestCSVInput, &column_names, &records));
45
46 EXPECT_THAT(column_names, testing::ElementsAre("foo", "bar"));
47 EXPECT_EQ(0u, records.size());
48 }
49
50 TEST(CSVReaderTest, HeaderAndSimpleRecords) {
51 const char kTestCSVInput[] =
52 "foo,bar,baz\n"
53 "alpha,beta,gamma\n"
54 "delta,epsilon,zeta\n";
55
56 // We also initialize output arguments here to be non-empty so as to verify
57 // that they get overwritten.
58 std::vector<std::string> column_names(3);
59 std::vector<CSVReader::ColumnNameToValueMap> records(4);
60 ASSERT_TRUE(CSVReader::Read(kTestCSVInput, &column_names, &records));
61
62 EXPECT_THAT(column_names, testing::ElementsAre("foo", "bar", "baz"));
63 ASSERT_EQ(2u, records.size());
64 EXPECT_THAT(records[0], testing::ElementsAre(
65 std::make_pair("bar", "beta"),
66 std::make_pair("baz", "gamma"),
67 std::make_pair("foo", "alpha")));
68 EXPECT_THAT(records[1], testing::ElementsAre(
69 std::make_pair("bar", "epsilon"),
70 std::make_pair("baz", "zeta"),
71 std::make_pair("foo", "delta")));
72 }
73
74 TEST(CSVReaderTest, ExtraSpacesArePreserved) {
75 const char kTestCSVInput[] =
76 "left,right\n"
77 " alpha beta , \n";
78
79 std::vector<std::string> column_names;
80 std::vector<CSVReader::ColumnNameToValueMap> records;
81 ASSERT_TRUE(CSVReader::Read(kTestCSVInput, &column_names, &records));
82
83 EXPECT_THAT(column_names, testing::ElementsAre("left", "right"));
84 ASSERT_EQ(1u, records.size());
85 EXPECT_THAT(records[0], testing::ElementsAre(
86 std::make_pair("left", " alpha beta "),
87 std::make_pair("right", " ")));
88 }
89
90 TEST(CSVReaderTest, CharactersOutsideASCIIPrintableArePreservedAsIs) {
91 const char kTestCSVInput[] =
92 "left,right\n"
93 "\x07\t\x0B\x1F,\u0024\u00A2\u20AC\U00024B62\n";
94
95 std::vector<std::string> column_names;
96 std::vector<CSVReader::ColumnNameToValueMap> records;
97 ASSERT_TRUE(CSVReader::Read(kTestCSVInput, &column_names, &records));
98
99 EXPECT_THAT(column_names, testing::ElementsAre("left", "right"));
100 ASSERT_EQ(1u, records.size());
101 EXPECT_THAT(records[0], testing::ElementsAre(
102 // Characters below 0x20: bell, horizontal + vertical tab, unit separator.
103 std::make_pair("left", "\x07\t\x0B\x1F"),
104 // Unicode code points having 1..4 byte UTF-8 representation: dollar sign,
105 // cent sign, euro sign, CJK unified ideograph for [ce`i] in Han script.
106 std::make_pair("right", "\u0024\u00A2\u20AC\U00024B62")));
107 }
108
109 TEST(CSVReaderTest, EnclosingDoubleQuotesAreTrimmed) {
110 const char kTestCSVInput[] =
111 "\"left\",\"right\"\n"
112 "\"alpha\",\"beta\"\n";
113
114 std::vector<std::string> column_names;
115 std::vector<CSVReader::ColumnNameToValueMap> records;
116 ASSERT_TRUE(CSVReader::Read(kTestCSVInput, &column_names, &records));
117
118 EXPECT_THAT(column_names, testing::ElementsAre("left", "right"));
119 ASSERT_EQ(1u, records.size());
120 EXPECT_THAT(records[0], testing::ElementsAre(
121 std::make_pair("left", "alpha"),
122 std::make_pair("right", "beta")));
123 }
124
125 TEST(CSVReaderTest, SeparatorsInsideDoubleQuotesAreTreatedVerbatim) {
126 const char kTestCSVInput[] =
127 "left,right\n"
128 "\"A\rB\",\"B\nC\"\n"
129 "\"C\r\nD\",\"D\n\"\n"
130 "\",\",\",,\"\n";
131
132 std::vector<std::string> column_names;
133 std::vector<CSVReader::ColumnNameToValueMap> records;
134 ASSERT_TRUE(CSVReader::Read(kTestCSVInput, &column_names, &records));
135
136 EXPECT_THAT(column_names, testing::ElementsAre("left", "right"));
137 ASSERT_EQ(3u, records.size());
138 EXPECT_THAT(records[0], testing::ElementsAre(
139 std::make_pair("left", "A\rB"),
140 std::make_pair("right", "B\nC")));
141 EXPECT_THAT(records[1], testing::ElementsAre(
142 std::make_pair("left", "C\nD"),
143 std::make_pair("right", "D\n")));
144 EXPECT_THAT(records[2], testing::ElementsAre(
145 std::make_pair("left", ","),
146 std::make_pair("right", ",,")));
147 }
148
149 TEST(CSVReaderTest, EscapedDoubleQuotes) {
150 const char kTestCSVInput[] =
151 "left,right\n"
152 "\"\",\"\"\"\"\"\"\n"
153 "\"\"\"\",\"A\"\"B\"\"\"\"C\"\n";
154
155 std::vector<std::string> column_names;
156 std::vector<CSVReader::ColumnNameToValueMap> records;
157 ASSERT_TRUE(CSVReader::Read(kTestCSVInput, &column_names, &records));
158
159 EXPECT_THAT(column_names, testing::ElementsAre("left", "right"));
160 ASSERT_EQ(2u, records.size());
161 EXPECT_THAT(records[0], testing::ElementsAre(
162 std::make_pair("left", ""),
163 std::make_pair("right", "\"\"")));
164 EXPECT_THAT(records[1], testing::ElementsAre(
165 std::make_pair("left", "\""),
166 std::make_pair("right", "A\"B\"\"C")));
167 }
168
169 TEST(CSVReaderTest, InconsistentFieldsCountIsTreatedGracefully) {
170 const char kTestCSVInput[] =
171 "left,right\n"
172 "A\n"
173 "B,C,D\n";
174
175 std::vector<std::string> column_names;
176 std::vector<CSVReader::ColumnNameToValueMap> records;
177 ASSERT_TRUE(CSVReader::Read(kTestCSVInput, &column_names, &records));
178
179 EXPECT_THAT(column_names, testing::ElementsAre("left", "right"));
180 ASSERT_EQ(2u, records.size());
181 EXPECT_THAT(records[0], testing::ElementsAre(
182 std::make_pair("left", "A"),
183 std::make_pair("right", "")));
184 EXPECT_THAT(records[1], testing::ElementsAre(
185 std::make_pair("left", "B"),
186 std::make_pair("right", "C")));
187 }
188
189 TEST(CSVReaderTest, SupportMissingNewLineAtEOF) {
190 const char kTestCSVInput[] =
191 "left,right\n"
192 "alpha,beta";
193
194 std::vector<std::string> column_names;
195 std::vector<CSVReader::ColumnNameToValueMap> records;
196 ASSERT_TRUE(CSVReader::Read(kTestCSVInput, &column_names, &records));
197
198 EXPECT_THAT(column_names, testing::ElementsAre("left", "right"));
199 ASSERT_EQ(1u, records.size());
200 EXPECT_THAT(records[0], testing::ElementsAre(
201 std::make_pair("left", "alpha"),
202 std::make_pair("right", "beta")));
203 }
204
205 TEST(CSVReaderTest, EmptyFields) {
206 const char kTestCSVInput[] =
207 "left,middle,right\n"
208 "alpha,beta,\n"
209 ",,gamma\n";
210
211 std::vector<std::string> column_names;
212 std::vector<CSVReader::ColumnNameToValueMap> records;
213 ASSERT_TRUE(CSVReader::Read(kTestCSVInput, &column_names, &records));
214
215 EXPECT_THAT(column_names, testing::ElementsAre("left", "middle", "right"));
216 ASSERT_EQ(2u, records.size());
217 EXPECT_THAT(records[0], testing::ElementsAre(
218 std::make_pair("left", "alpha"),
219 std::make_pair("middle", "beta"),
220 std::make_pair("right", "")));
221 EXPECT_THAT(records[1], testing::ElementsAre(
222 std::make_pair("left", ""),
223 std::make_pair("middle", ""),
224 std::make_pair("right", "gamma")));
225 }
226
227 TEST(CSVReaderTest, CRLFTreatedAsAndConvertedToLF) {
228 const char kTestCSVInput[] =
229 "left,right\r\n"
230 "\"\r\",\"\r\n\"\r\n";
231
232 std::vector<std::string> column_names;
233 std::vector<CSVReader::ColumnNameToValueMap> records;
234 ASSERT_TRUE(CSVReader::Read(kTestCSVInput, &column_names, &records));
235
236 EXPECT_THAT(column_names, testing::ElementsAre("left", "right"));
237 ASSERT_EQ(1u, records.size());
238 EXPECT_THAT(records[0], testing::ElementsAre(
239 std::make_pair("left", "\r"),
240 std::make_pair("right", "\n")));
241 }
242
243 TEST(CSVReaderTest, FailureWhenEOFInsideQuotes) {
244 const char kTestCSVInput[] =
245 "left,right\n"
246 "\"alpha\",\"unmatched\n";
247
248 std::vector<std::string> column_names;
249 std::vector<CSVReader::ColumnNameToValueMap> records;
250 ASSERT_FALSE(CSVReader::Read(kTestCSVInput, &column_names, &records));
251 }
252
253 } // namespace password_manager
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698