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

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: Add build config header. Created 5 years, 11 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..62842c1fca99cc8c1a2e1d7986786f691f7425b0
--- /dev/null
+++ b/components/password_manager/core/browser/export/csv_writer_unittest.cc
@@ -0,0 +1,199 @@
+// 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 "build/build_config.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#if defined(OS_WIN)
+#define CSV_EOL_SEQUENCE "\r\n"
+#else
+#define CSV_EOL_SEQUENCE "\n"
+#endif
+
+namespace password_manager {
+
+class CSVWriterTest : public testing::Test {
+ public:
+ CSVWriterTest() {}
+
+ void SetUp() override {
+ column_names_.push_back("foo");
+ column_names_.push_back("bar");
+ }
+
+ protected:
+ std::vector<std::string> column_names_;
+ std::vector<std::map<std::string, std::string>> records_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(CSVWriterTest);
+};
+
+TEST_F(CSVWriterTest, EmptyData) {
+ const char kExpectedResult[] = CSV_EOL_SEQUENCE;
+
+ std::string result;
+ WriteCSV(std::vector<std::string>(), records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, OutputArgumentIsOverwritten) {
+ const char kExpectedResult[] = CSV_EOL_SEQUENCE;
+
+ std::string result = "this text should get erased";
+ WriteCSV(std::vector<std::string>(), records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, SingleColumn) {
+ const char kExpectedResult[] =
+ "foo" CSV_EOL_SEQUENCE
+ "alpha" CSV_EOL_SEQUENCE
+ "beta" CSV_EOL_SEQUENCE;
+
+ column_names_.pop_back();
+ records_.resize(2);
+ records_[0]["foo"] = "alpha";
+ records_[1]["foo"] = "beta";
+
+ std::string result;
+ WriteCSV(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, HeaderOnly) {
+ const char kExpectedResult[] = "foo,bar" CSV_EOL_SEQUENCE;
+
+ std::string result;
+ WriteCSV(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, HeaderAndSimpleRecords) {
+ const char kExpectedResult[] =
+ "foo,bar,baz" CSV_EOL_SEQUENCE
+ "alpha,beta,gamma" CSV_EOL_SEQUENCE
+ "delta,epsilon,zeta" CSV_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";
+
+ std::string result;
+ WriteCSV(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, ExtraSpacesArePreserved) {
+ const char kExpectedResult[] =
+ "foo,bar" CSV_EOL_SEQUENCE
+ " alpha beta , " CSV_EOL_SEQUENCE;
+
+ records_.resize(1);
+ records_[0]["foo"] = " alpha beta ";
+ records_[0]["bar"] = " ";
+
+ std::string result;
+ WriteCSV(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, CharactersOutsideASCIIPrintableArePreservedVerbatim) {
+ const char kExpectedResult[] =
+ "foo,bar" CSV_EOL_SEQUENCE
+ "\x07\t\x0B\x1F,$\xc2\xa2\xe2\x98\x83\xf0\xa4\xad\xa2" CSV_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
+ // (U+0024), cent sign (U+00A2), snowman (U+2603), Han character U+24B62.
+ records_[0]["bar"] = "$\xc2\xa2\xe2\x98\x83\xf0\xa4\xad\xa2";
+
+ std::string result;
+ WriteCSV(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, ValueWithSeparatorsIsEnclosedInDoubleQuotes) {
+ const char kExpectedResult[] =
+ "foo,bar" CSV_EOL_SEQUENCE
+ "\"A\rB\",\"B\nC\"" CSV_EOL_SEQUENCE
+ "\"C\r\nD\",\"D\n\"" CSV_EOL_SEQUENCE
+ "\",\",\",,\"" CSV_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;
+ WriteCSV(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, DoubleQuotesInValueAreEscaped) {
+ const char kExpectedResult[] =
+ "foo,bar" CSV_EOL_SEQUENCE
+ "\"\"\"\",\"A\"\"B\"\"\"\"C\"" CSV_EOL_SEQUENCE;
+
+ records_.resize(1);
+ records_[0]["foo"] = "\"";
+ records_[0]["bar"] = "A\"B\"\"C";
+
+ std::string result;
+ WriteCSV(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, EmptyFields) {
+ const char kExpectedResult[] =
+ "foo,bar" CSV_EOL_SEQUENCE
+ ",alpha" CSV_EOL_SEQUENCE
+ "beta," CSV_EOL_SEQUENCE
+ "," CSV_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;
+ WriteCSV(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+TEST_F(CSVWriterTest, MissingValuesAreTreatedAsEmptyValues) {
+ const char kExpectedResult[] =
+ "foo,bar" CSV_EOL_SEQUENCE
+ ",alpha" CSV_EOL_SEQUENCE
+ "beta," CSV_EOL_SEQUENCE
+ "," CSV_EOL_SEQUENCE;
+
+ records_.resize(3);
+ records_[0]["bar"] = "alpha";
+ records_[1]["foo"] = "beta";
+
+ std::string result;
+ WriteCSV(column_names_, records_, &result);
+ EXPECT_EQ(kExpectedResult, result);
+}
+
+} // namespace password_manager
+
+#undef CSV_EOL_SEQUENCE

Powered by Google App Engine
This is Rietveld 408576698