update_client: refactor the parsing and serializing of XML.

This is a mechanical change.

It introduces ProtocolParser and ProtocolSerializer abstract classes
to allow different protocols in the future. Only the XML implementation
of these classes is provided in this changelist.

Bug: 848505
Change-Id: I4bda0f92f5b676f0f0eaca7dc841c8dca9c282ad
Reviewed-on: https://chromium-review.googlesource.com/c/1278476
Commit-Queue: Sorin Jianu <[email protected]>
Reviewed-by: Joshua Pawlicki <[email protected]>
Cr-Commit-Position: refs/heads/master@{#599366}
diff --git a/components/update_client/update_client_unittest.cc b/components/update_client/update_client_unittest.cc
index 8f1da0f0..43ec49e 100644
--- a/components/update_client/update_client_unittest.cc
+++ b/components/update_client/update_client_unittest.cc
@@ -111,14 +111,14 @@
 
   const std::vector<PingData>& ping_data() const;
 
-  const std::vector<std::string>& events() const;
+  const std::vector<base::Value>& events() const;
 
  protected:
   ~MockPingManagerImpl() override;
 
  private:
   std::vector<PingData> ping_data_;
-  std::vector<std::string> events_;
+  std::vector<base::Value> events_;
   DISALLOW_COPY_AND_ASSIGN(MockPingManagerImpl);
 };
 
@@ -141,8 +141,7 @@
   ping_data.diff_update_failed = component.diff_update_failed();
   ping_data_.push_back(ping_data);
 
-  const auto& events = component.events();
-  events_.insert(events_.end(), events.begin(), events.end());
+  events_ = component.GetEvents();
 
   std::move(callback).Run(0, "");
 }
@@ -152,7 +151,7 @@
   return ping_data_;
 }
 
-const std::vector<std::string>& MockPingManagerImpl::events() const {
+const std::vector<base::Value>& MockPingManagerImpl::events() const {
   return events_;
 }
 
@@ -3465,12 +3464,12 @@
           R"( status="error-foobarApp"/>)"
           R"(</response>)";
 
-      ProtocolParser parser;
-      EXPECT_TRUE(parser.Parse(update_response));
+      const auto parser = ProtocolParser::Create();
+      EXPECT_TRUE(parser->Parse(update_response));
 
       base::ThreadTaskRunnerHandle::Get()->PostTask(
           FROM_HERE,
-          base::BindOnce(std::move(update_check_callback), parser.results(),
+          base::BindOnce(std::move(update_check_callback), parser->results(),
                          ErrorCategory::kNone, 0, 0));
     }
   };
@@ -3706,23 +3705,40 @@
 
    protected:
     ~MockPingManager() override {
-      const auto& events = MockPingManagerImpl::events();
-      EXPECT_EQ(3u, events.size());
-      EXPECT_STREQ(
-          "<event eventtype=\"14\" eventresult=\"1\" downloader=\"unknown\" "
-          "url=\"http://localhost/download/"
-          "runaction_test_win.crx3\" downloaded=\"1843\" "
-          "total=\"1843\" download_time_ms=\"1000\" previousversion=\"0.0\" "
-          "nextversion=\"1.0\"/>",
-          events[0].c_str());
-      EXPECT_STREQ(
-          "<event eventtype=\"42\" eventresult=\"1\" "
-          "errorcode=\"1877345072\"/>",
-          events[1].c_str());
-      EXPECT_STREQ(
-          "<event eventtype=\"3\" eventresult=\"1\" previousversion=\"0.0\" "
-          "nextversion=\"1.0\"/>",
-          events[2].c_str());
+      EXPECT_EQ(3u, events().size());
+
+      /*
+      "<event eventtype="14" eventresult="1" downloader="unknown" "
+      "url="http://localhost/download/runaction_test_win.crx3"
+      "downloaded="1843" "
+      "total="1843" download_time_ms="1000" previousversion="0.0" "
+      "nextversion="1.0"/>"
+      */
+      const auto& event0 = events()[0];
+      EXPECT_EQ(14, event0.FindKey("eventtype")->GetInt());
+      EXPECT_EQ(1, event0.FindKey("eventresult")->GetInt());
+      EXPECT_EQ("unknown", event0.FindKey("downloader")->GetString());
+      EXPECT_EQ("http://localhost/download/runaction_test_win.crx3",
+                event0.FindKey("url")->GetString());
+      EXPECT_EQ("1843", event0.FindKey("downloaded")->GetString());
+      EXPECT_EQ("1843", event0.FindKey("total")->GetString());
+      EXPECT_EQ("1000", event0.FindKey("download_time_ms")->GetString());
+      EXPECT_EQ("0.0", event0.FindKey("previousversion")->GetString());
+      EXPECT_EQ("1.0", event0.FindKey("nextversion")->GetString());
+
+      // "<event eventtype="42" eventresult="1" errorcode="1877345072"/>"
+      const auto& event1 = events()[1];
+      EXPECT_EQ(42, event1.FindKey("eventtype")->GetInt());
+      EXPECT_EQ(1, event1.FindKey("eventresult")->GetInt());
+      EXPECT_EQ(1877345072, event1.FindKey("errorcode")->GetInt());
+
+      // "<event eventtype=\"3\" eventresult=\"1\" previousversion=\"0.0\" "
+      // "nextversion=\"1.0\"/>",
+      const auto& event2 = events()[2];
+      EXPECT_EQ(3, event2.FindKey("eventtype")->GetInt());
+      EXPECT_EQ(1, event1.FindKey("eventresult")->GetInt());
+      EXPECT_EQ("0.0", event0.FindKey("previousversion")->GetString());
+      EXPECT_EQ("1.0", event0.FindKey("nextversion")->GetString());
     }
   };
 
@@ -3826,12 +3842,13 @@
 
    protected:
     ~MockPingManager() override {
-      const auto& events = MockPingManagerImpl::events();
-      EXPECT_EQ(1u, events.size());
-      EXPECT_STREQ(
-          "<event eventtype=\"42\" eventresult=\"1\" "
-          "errorcode=\"1877345072\"/>",
-          events[0].c_str());
+      EXPECT_EQ(1u, events().size());
+
+      // "<event eventtype="42" eventresult="1" errorcode="1877345072"/>"
+      const auto& event = events()[0];
+      EXPECT_EQ(42, event.FindKey("eventtype")->GetInt());
+      EXPECT_EQ(1, event.FindKey("eventresult")->GetInt());
+      EXPECT_EQ(1877345072, event.FindKey("errorcode")->GetInt());
     }
   };