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

Unified Diff: components/password_manager/core/browser/export/csv_writer_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 side-by-side diff with in-line comments
Download patch
Index: components/password_manager/core/browser/export/csv_writer_unittest.cc
diff --git a/components/password_manager/core/browser/export/csv_writer_unittest.cc b/components/password_manager/core/browser/export/csv_writer_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..af4de71aa1a1d0c836bcbc296dba820cb0663e93
--- /dev/null
+++ b/components/password_manager/core/browser/export/csv_writer_unittest.cc
@@ -0,0 +1,189 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/password_manager/core/browser/export/csv_writer.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+#if defined(OS_WIN)
+#define EOL_SEQUENCE "\r\n"
+#else
+#define EOL_SEQUENCE "\n"
+#endif
+
+namespace password_manager {
+
+class CSVWriterTest : public testing::Test {
+ public:
+ CSVWriterTest() {}
+
+ virtual void SetUp() OVERRIDE {
+ column_names_.push_back("foo");
+ column_names_.push_back("bar");
+ }
+
+ protected:
+ std::vector<std::string> column_names_;
+ std::vector<CSVWriter::ColumnNameToValueMap> records_;
+
+ DISALLOW_COPY_AND_ASSIGN(CSVWriterTest);
+};
+
+TEST_F(CSVWriterTest, EmptyData) {
+ const char kExpectedResult[] = EOL_SEQUENCE;
+
+ std::string result;
+ CSVWriter::Write(std::vector<std::string>(), records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, SingleColumn) {
+ const char kExpectedResult[] =
+ "foo" EOL_SEQUENCE
+ "alpha" EOL_SEQUENCE
+ "beta" EOL_SEQUENCE;
+
+ column_names_.pop_back();
+ records_.resize(2);
+ records_[0]["foo"] = "alpha";
+ records_[1]["foo"] = "beta";
+
+ std::string result;
+ CSVWriter::Write(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, HeaderOnly) {
+ const char kExpectedResult[] = "foo,bar" EOL_SEQUENCE;
+
+ std::string result;
+ CSVWriter::Write(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, HeaderAndSimpleRecords) {
+ const char kExpectedResult[] =
+ "foo,bar,baz" EOL_SEQUENCE
+ "alpha,beta,gamma" EOL_SEQUENCE
+ "delta,epsilon,zeta" EOL_SEQUENCE;
+
+ column_names_.push_back("baz");
+
+ records_.resize(2);
+ records_[0]["foo"] = "alpha";
+ records_[0]["bar"] = "beta";
+ records_[0]["baz"] = "gamma";
+ records_[1]["foo"] = "delta";
+ records_[1]["bar"] = "epsilon";
+ records_[1]["baz"] = "zeta";
+
+ // We also initialize the output argument here to be non-empty so as to verify
+ // that it gets overwritten.
+ std::string result = "this text should get erased";
+ CSVWriter::Write(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, ExtraSpacesArePreserved) {
+ const char kExpectedResult[] =
+ "foo,bar" EOL_SEQUENCE
+ " alpha beta , " EOL_SEQUENCE;
+
+ records_.resize(1);
+ records_[0]["foo"] = " alpha beta ";
+ records_[0]["bar"] = " ";
+
+ std::string result;
+ CSVWriter::Write(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, CharactersOutsideASCIIPrintableArePreservedAsIs) {
+ const char kExpectedResult[] =
+ "foo,bar" EOL_SEQUENCE
+ "\x07\t\x0B\x1F,\u0024\u00A2\u20AC\U00024B62" EOL_SEQUENCE;
+
+ records_.resize(1);
+ // Characters below 0x20: bell, horizontal tab, vertical tab, unit separator.
+ records_[0]["foo"] = "\x07\t\x0B\x1F";
+ // Unicode code points having 1..4 byte UTF-8 representation: dollar sign,
+ // cent sign, euro sign, CJK unified ideograph for [ce`i] in Han script.
+ records_[0]["bar"] = "\u0024\u00A2\u20AC\U00024B62";
+
+ std::string result;
+ CSVWriter::Write(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, ValueWithSeparatorsIsEnclosedInDoubleQuotes) {
+ const char kExpectedResult[] =
+ "foo,bar" EOL_SEQUENCE
+ "\"A\rB\",\"B\nC\"" EOL_SEQUENCE
+ "\"C\r\nD\",\"D\n\"" EOL_SEQUENCE
+ "\",\",\",,\"" EOL_SEQUENCE;
+
+ records_.resize(3);
+ records_[0]["foo"] = "A\rB";
+ records_[0]["bar"] = "B\nC";
+ records_[1]["foo"] = "C\r\nD";
+ records_[1]["bar"] = "D\n";
+ records_[2]["foo"] = ",";
+ records_[2]["bar"] = ",,";
+
+ std::string result;
+ CSVWriter::Write(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, DoubleQuotesInValueAreEscaped) {
+ const char kExpectedResult[] =
+ "foo,bar" EOL_SEQUENCE
+ "\"\"\"\",\"A\"\"B\"\"\"\"C\"" EOL_SEQUENCE;
+
+ records_.resize(1);
+ records_[0]["foo"] = "\"";
+ records_[0]["bar"] = "A\"B\"\"C";
+
+ std::string result;
+ CSVWriter::Write(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, EmptyFields) {
+ const char kExpectedResult[] =
+ "foo,bar" EOL_SEQUENCE
+ ",alpha" EOL_SEQUENCE
+ "beta," EOL_SEQUENCE
+ "," EOL_SEQUENCE;
+
+ records_.resize(3);
+ records_[0]["foo"] = "";
+ records_[0]["bar"] = "alpha";
+ records_[1]["foo"] = "beta";
+ records_[1]["bar"] = "";
+ records_[2]["foo"] = "";
+ records_[2]["bar"] = "";
+
+ std::string result;
+ CSVWriter::Write(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, MissingValuesAreTreatedAsEmptyValues) {
+ const char kExpectedResult[] =
+ "foo,bar" EOL_SEQUENCE
+ ",alpha" EOL_SEQUENCE
+ "beta," EOL_SEQUENCE
+ "," EOL_SEQUENCE;
+
+ records_.resize(3);
+ records_[0]["bar"] = "alpha";
+ records_[1]["foo"] = "beta";
+
+ std::string result;
+ CSVWriter::Write(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+} // namespace password_manager

Powered by Google App Engine
This is Rietveld 408576698