omaha_request_action_unittest.cc revision 95508da905b279a6b91aadfc7c4c72f57a5fa610
1a4a8a8ccc2d9e0285728ed247b43f09433e63323Darin Petkov// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
26a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov// Use of this source code is governed by a BSD-style license that can be
36a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov// found in the LICENSE file.
46a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
56a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include <string>
66a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include <vector>
70dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
86a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include <glib.h>
90dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
100dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov#include "base/string_util.h"
111cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov#include "base/time.h"
120dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov#include "gtest/gtest.h"
136a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/action_pipe.h"
146a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/mock_http_fetcher.h"
156a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/omaha_hash_calculator.h"
166a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/omaha_request_action.h"
17a4a8a8ccc2d9e0285728ed247b43f09433e63323Darin Petkov#include "update_engine/omaha_request_params.h"
181cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov#include "update_engine/prefs_mock.h"
196a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/test_utils.h"
206a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
211cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing base::Time;
221cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing base::TimeDelta;
236a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovusing std::string;
246a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovusing std::vector;
251cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::_;
261cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::AllOf;
271cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::Ge;
281cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::Le;
299c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkovusing testing::NiceMock;
301cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::Return;
311cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::SetArgumentPointee;
326a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
336a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovnamespace chromeos_update_engine {
346a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
356a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass OmahaRequestActionTest : public ::testing::Test { };
366a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
376a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovnamespace {
381cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovconst OmahaRequestParams kDefaultTestParams(
391cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    OmahaRequestParams::kOsPlatform,
401cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    OmahaRequestParams::kOsVersion,
411cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "service_pack",
421cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "x86-generic",
431cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    OmahaRequestParams::kAppId,
441cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "0.1.0.0",
451cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "en-US",
461cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "unittest",
47fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov    "OEM MODEL 09235 7471",
481cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    false,  // delta okay
491cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "http://url");
501cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
516a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovstring GetNoUpdateResponse(const string& app_id) {
526a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  return string(
536a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
546a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
556a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "appid=\"") + app_id + "\" status=\"ok\"><ping "
566a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></gupdate>";
576a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
586a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
596a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovstring GetUpdateResponse(const string& app_id,
606a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                         const string& display_version,
616a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                         const string& more_info_url,
626a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                         const string& prompt,
636a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                         const string& codebase,
646a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                         const string& hash,
656a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                         const string& needsadmin,
666c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                         const string& size,
676c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                         const string& deadline) {
686a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  return string("<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
696a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                "xmlns=\"http://www.google.com/update2/response\" "
706a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                "protocol=\"2.0\"><app "
716a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                "appid=\"") + app_id + "\" status=\"ok\"><ping "
726a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "status=\"ok\"/><updatecheck DisplayVersion=\"" + display_version + "\" "
736a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
743270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes      "IsDelta=\"true\" "
75d22cb29c911375cda5d8eb783e78a46680404ca8Darin Petkov      "codebase=\"" + codebase + "\" hash=\"not-applicable\" "
76d22cb29c911375cda5d8eb783e78a46680404ca8Darin Petkov      "sha256=\"" + hash + "\" needsadmin=\"" + needsadmin + "\" "
776c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov      "size=\"" + size + "\" deadline=\"" + deadline +
786c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov      "\" status=\"ok\"/></app></gupdate>";
796a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
806a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
816a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
826a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
836a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaRequestActionTestProcessorDelegate()
846a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      : loop_(NULL),
85c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov        expected_code_(kActionCodeSuccess) {}
866a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  virtual ~OmahaRequestActionTestProcessorDelegate() {
876a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
88c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov  virtual void ProcessingDone(const ActionProcessor* processor,
89c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov                              ActionExitCode code) {
906a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    ASSERT_TRUE(loop_);
916a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    g_main_loop_quit(loop_);
926a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
936a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
946a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  virtual void ActionCompleted(ActionProcessor* processor,
956a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                               AbstractAction* action,
96c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov                               ActionExitCode code) {
976a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    // make sure actions always succeed
986a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    if (action->Type() == OmahaRequestAction::StaticType())
99c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov      EXPECT_EQ(expected_code_, code);
1006a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    else
101c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov      EXPECT_EQ(kActionCodeSuccess, code);
1026a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
1036a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  GMainLoop *loop_;
104c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov  ActionExitCode expected_code_;
1056a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
1066a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1076a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovgboolean StartProcessorInRunLoop(gpointer data) {
1086a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
1096a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor->StartProcessing();
1106a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  return FALSE;
1116a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
1126a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}  // namespace {}
1136a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1146a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass OutputObjectCollectorAction;
1156a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1166a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovtemplate<>
1176a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass ActionTraits<OutputObjectCollectorAction> {
1186a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
1196a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Does not take an object for input
1206a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  typedef OmahaResponse InputObjectType;
1216a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // On success, puts the output path on output
1226a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  typedef NoneType OutputObjectType;
1236a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
1246a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1256a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
1266a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
1276a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OutputObjectCollectorAction() : has_input_object_(false) {}
1286a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  void PerformAction() {
1296a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    // copy input object
1306a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    has_input_object_ = HasInputObject();
1316a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    if (has_input_object_)
1326a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      omaha_response_ = GetInputObject();
133c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov    processor_->ActionComplete(this, kActionCodeSuccess);
1346a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
1356a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Should never be called
1366a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  void TerminateProcessing() {
1376a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    CHECK(false);
1386a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
1396a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Debugging/logging
1406a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  static std::string StaticType() {
1416a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    return "OutputObjectCollectorAction";
1426a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
1436a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  std::string Type() const { return StaticType(); }
1446a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  bool has_input_object_;
1456a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse omaha_response_;
1466a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
1476a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1481cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov// Returns true iff an output response was obtained from the
149edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
150edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov// used. out_response may be NULL. If |fail_http_response_code| is
151edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov// non-negative, the transfer will fail with that code. out_post_data may be
152edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov// null; if non-null, the post-data received by the mock HttpFetcher is
153edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov// returned.
1541cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovbool TestUpdateCheck(PrefsInterface* prefs,
1551cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                     const OmahaRequestParams& params,
1560dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                     const string& http_response,
157edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                     int fail_http_response_code,
158c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov                     ActionExitCode expected_code,
1590dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                     OmahaResponse* out_response,
1600dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                     vector<char>* out_post_data) {
1610dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
1620dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
1634516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                 http_response.size(),
1644516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                 NULL);
165edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  if (fail_http_response_code >= 0) {
166edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov    fetcher->FailTransfer(fail_http_response_code);
167edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  }
1689c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> local_prefs;
1691cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  OmahaRequestAction action(prefs ? prefs : &local_prefs,
1701cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                            params,
1711cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                            NULL,
1721cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                            fetcher);
1736a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaRequestActionTestProcessorDelegate delegate;
1746a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  delegate.loop_ = loop;
175c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov  delegate.expected_code_ = expected_code;
176a4a8a8ccc2d9e0285728ed247b43f09433e63323Darin Petkov
1776a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor processor;
1786a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.set_delegate(&delegate);
1796a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&action);
1806a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1816a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OutputObjectCollectorAction collector_action;
1826a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  BondActions(&action, &collector_action);
1836a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&collector_action);
1846a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1856a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_timeout_add(0, &StartProcessorInRunLoop, &processor);
1866a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_run(loop);
1876a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_unref(loop);
1886a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  if (collector_action.has_input_object_ && out_response)
1896a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    *out_response = collector_action.omaha_response_;
1906a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  if (out_post_data)
1916a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    *out_post_data = fetcher->post_data();
1926a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  return collector_action.has_input_object_;
1936a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
1946a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1950dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov// Tests Event requests -- they should always succeed. |out_post_data|
1960dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov// may be null; if non-null, the post-data received by the mock
1970dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov// HttpFetcher is returned.
1980dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkovvoid TestEvent(const OmahaRequestParams& params,
1990dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov               OmahaEvent* event,
2000dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov               const string& http_response,
2010dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov               vector<char>* out_post_data) {
2020dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
2030dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
2044516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                 http_response.size(),
2054516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                 NULL);
2069c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
2071cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  OmahaRequestAction action(&prefs, params, event, fetcher);
2080dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  OmahaRequestActionTestProcessorDelegate delegate;
2090dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  delegate.loop_ = loop;
2100dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ActionProcessor processor;
2110dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  processor.set_delegate(&delegate);
2120dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  processor.EnqueueAction(&action);
2130dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
2140dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  g_timeout_add(0, &StartProcessorInRunLoop, &processor);
2150dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  g_main_loop_run(loop);
2160dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  g_main_loop_unref(loop);
2170dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  if (out_post_data)
2180dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov    *out_post_data = fetcher->post_data();
2190dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
2200dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
2216a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, NoUpdateTest) {
2226a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
2236a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
2241cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
2251cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
2260dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
227edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
228c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov                      kActionCodeSuccess,
2290dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
2300dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      NULL));
2316a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
2326a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
2336a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2346a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, ValidUpdateTest) {
2356a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
2366a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
2371cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
2381cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
2390dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      GetUpdateResponse(OmahaRequestParams::kAppId,
2400dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "1.2.3.4",  // version
2410dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "http://more/info",
2420dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "true",  // prompt
2430dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "http://code/base",  // dl url
2440dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "HASH1234=",  // checksum
2450dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "false",  // needs admin
2466c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "123",  // size
2476c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "20101020"),  // deadline
248edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
249c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov                      kActionCodeSuccess,
2500dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
2510dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      NULL));
2526a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_TRUE(response.update_exists);
2536a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("1.2.3.4", response.display_version);
2546a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("http://code/base", response.codebase);
2556a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("http://more/info", response.more_info_url);
2563270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes  EXPECT_TRUE(response.is_delta);
2576a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("HASH1234=", response.hash);
2586a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ(123, response.size);
2596a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.needs_admin);
2606a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_TRUE(response.prompt);
2616c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov  EXPECT_EQ("20101020", response.deadline);
2626a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
2636a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2646a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, NoOutputPipeTest) {
2656a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
2666a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2676a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
2686a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2699c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
2701cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  OmahaRequestAction action(&prefs, kDefaultTestParams, NULL,
2710dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                            new MockHttpFetcher(http_response.data(),
2724516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                http_response.size(),
2734516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                NULL));
2746a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaRequestActionTestProcessorDelegate delegate;
2756a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  delegate.loop_ = loop;
2766a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor processor;
2776a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.set_delegate(&delegate);
2786a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&action);
2796a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2806a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_timeout_add(0, &StartProcessorInRunLoop, &processor);
2816a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_run(loop);
2826a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_unref(loop);
2836a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(processor.IsRunning());
2846a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
2856a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2866a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, InvalidXmlTest) {
2876a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
2886a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_FALSE(
2891cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
2901cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
2910dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      "invalid xml>",
292edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
293edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      kActionCodeOmahaRequestXMLParseError,
294edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      &response,
295edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      NULL));
296edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  EXPECT_FALSE(response.update_exists);
297edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov}
298edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov
299edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin PetkovTEST(OmahaRequestActionTest, EmptyResponseTest) {
300edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  OmahaResponse response;
301edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  ASSERT_FALSE(
302edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      TestUpdateCheck(NULL,  // prefs
303edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      kDefaultTestParams,
304edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      "",
305edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
306edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      kActionCodeOmahaRequestEmptyResponseError,
3070dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
3080dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      NULL));
3096a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
3106a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
3116a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
3126a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, MissingStatusTest) {
3136a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
3140dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ASSERT_FALSE(TestUpdateCheck(
3151cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      NULL,  // prefs
3161cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      kDefaultTestParams,
3176a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
3186a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
3196a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "appid=\"foo\" status=\"ok\"><ping "
3206a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "status=\"ok\"/><updatecheck/></app></gupdate>",
321edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      -1,
322edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      kActionCodeOmahaRequestNoUpdateCheckStatus,
3236a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      &response,
3246a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      NULL));
3256a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
3266a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
3276a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
3286a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, InvalidStatusTest) {
3296a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
3300dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ASSERT_FALSE(TestUpdateCheck(
3311cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      NULL,  // prefs
3321cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      kDefaultTestParams,
3336a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
3346a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
3356a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "appid=\"foo\" status=\"ok\"><ping "
3366a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "status=\"ok\"/><updatecheck status=\"foo\"/></app></gupdate>",
337edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      -1,
338edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      kActionCodeOmahaRequestBadUpdateCheckStatus,
3396a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      &response,
3406a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      NULL));
3416a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
3426a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
3436a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
3446a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, MissingNodesetTest) {
3456a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
3460dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ASSERT_FALSE(TestUpdateCheck(
3471cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      NULL,  // prefs
3481cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      kDefaultTestParams,
3496a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
3506a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
3516a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "appid=\"foo\" status=\"ok\"><ping "
3526a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "status=\"ok\"/></app></gupdate>",
353edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      -1,
354edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      kActionCodeOmahaRequestNoUpdateCheckNode,
3556a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      &response,
3566a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      NULL));
3576a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
3586a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
3596a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
3606a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, MissingFieldTest) {
3616a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
3621cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(TestUpdateCheck(NULL,  // prefs
3631cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                              kDefaultTestParams,
3640dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                              string("<?xml version=\"1.0\" "
3650dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                     "encoding=\"UTF-8\"?><gupdate "
3660dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                     "xmlns=\"http://www.google.com/"
3670dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                     "update2/response\" "
3680dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                     "protocol=\"2.0\"><app appid=\"") +
3690dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                              OmahaRequestParams::kAppId
3700dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                              + "\" status=\"ok\"><ping "
3710dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                              "status=\"ok\"/><updatecheck "
3720dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                              "DisplayVersion=\"1.2.3.4\" "
3730dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                              "Prompt=\"false\" "
374d22cb29c911375cda5d8eb783e78a46680404ca8Darin Petkov                              "codebase=\"http://code/base\" hash=\"foo\" "
375d22cb29c911375cda5d8eb783e78a46680404ca8Darin Petkov                              "sha256=\"HASH1234=\" needsadmin=\"true\" "
3760dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                              "size=\"123\" "
3770dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                              "status=\"ok\"/></app></gupdate>",
378edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                              -1,
379c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov                              kActionCodeSuccess,
3800dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                              &response,
3810dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                              NULL));
3826a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_TRUE(response.update_exists);
3836a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("1.2.3.4", response.display_version);
3846a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("http://code/base", response.codebase);
3856a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("", response.more_info_url);
3863270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes  EXPECT_FALSE(response.is_delta);
3876a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("HASH1234=", response.hash);
3886a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ(123, response.size);
3896a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_TRUE(response.needs_admin);
3906a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.prompt);
3916c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov  EXPECT_TRUE(response.deadline.empty());
3926a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
3936a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
3946a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovnamespace {
3956a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
3966a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
3976a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  void ProcessingStopped(const ActionProcessor* processor) {
3986a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    ASSERT_TRUE(loop_);
3996a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    g_main_loop_quit(loop_);
4006a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
4016a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  GMainLoop *loop_;
4026a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
4036a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
4046a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovgboolean TerminateTransferTestStarter(gpointer data) {
4056a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
4066a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor->StartProcessing();
4076a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  CHECK(processor->IsRunning());
4086a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor->StopProcessing();
4096a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  return FALSE;
4106a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
4116a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}  // namespace {}
4126a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
4136a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, TerminateTransferTest) {
4146a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  string http_response("doesn't matter");
4156a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
4166a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
4179c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
4181cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  OmahaRequestAction action(&prefs, kDefaultTestParams, NULL,
4190dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                            new MockHttpFetcher(http_response.data(),
4204516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                http_response.size(),
4214516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                NULL));
4226a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  TerminateEarlyTestProcessorDelegate delegate;
4236a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  delegate.loop_ = loop;
4246a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor processor;
4256a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.set_delegate(&delegate);
4266a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&action);
4276a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
4286a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_timeout_add(0, &TerminateTransferTestStarter, &processor);
4296a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_run(loop);
4306a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_unref(loop);
4316a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
4326a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
4336a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, XmlEncodeTest) {
4346a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("ab", XmlEncode("ab"));
4356a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
4366a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
4376a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
4386a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
4396a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
4406a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  vector<char> post_data;
4416a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
4426a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Make sure XML Encode is being called on the params
44384c763cffce6778711792944387fadb760c55c8dDarin Petkov  OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
4446a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            OmahaRequestParams::kOsVersion,
4456a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            "testtheservice_pack>",
4461cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                            "x86 generic<id",
4476a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            OmahaRequestParams::kAppId,
4486a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            "0.1.0.0",
4496a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            "en-US",
4501cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                            "unittest_track&lt;",
451fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov                            "<OEM MODEL>",
4523f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                            false,  // delta okay
4536a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            "http://url");
4546a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
4556a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_FALSE(
4561cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
4571cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      params,
4580dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      "invalid xml>",
459edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
460edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      kActionCodeOmahaRequestXMLParseError,
4610dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
4620dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &post_data));
4636a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // convert post_data to string
4646a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  string post_str(&post_data[0], post_data.size());
4656a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
4666a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
4671cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
4681cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
4691cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
4701cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
471fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov  EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
472fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov  EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
4736a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
4746a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
4756a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, XmlDecodeTest) {
4766a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
4776a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
4781cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
4791cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
4800dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      GetUpdateResponse(OmahaRequestParams::kAppId,
4810dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "1.2.3.4",  // version
4820dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "testthe&lt;url",  // more info
4830dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "true",  // prompt
4840dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "testthe&amp;codebase",  // dl url
4850dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "HASH1234=", // checksum
4860dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "false",  // needs admin
4876c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "123",  // size
4886c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "&lt;20110101"),  // deadline
489edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
490c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov                      kActionCodeSuccess,
4910dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
4920dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      NULL));
4936a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
4946a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ(response.more_info_url, "testthe<url");
4950dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  EXPECT_EQ(response.codebase, "testthe&codebase");
4966c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov  EXPECT_EQ(response.deadline, "<20110101");
4976a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
4986a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
4996a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, ParseIntTest) {
5006a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
5016a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
5021cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
5031cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
5040dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      GetUpdateResponse(OmahaRequestParams::kAppId,
5050dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "1.2.3.4",  // version
5060dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "theurl",  // more info
5070dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "true",  // prompt
5080dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "thecodebase",  // dl url
5090dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "HASH1234=", // checksum
5100dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "false",  // needs admin
5110dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        // overflows int32:
5126c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "123123123123123",  // size
5136c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "deadline"),
514edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
515c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov                      kActionCodeSuccess,
5160dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
5170dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      NULL));
5186a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
5196a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ(response.size, 123123123123123ll);
5206a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
5216a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
5220dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin PetkovTEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
5230dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  vector<char> post_data;
52495508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  NiceMock<PrefsMock> prefs;
52595508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
52695508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
52795508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
52895508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  ASSERT_FALSE(TestUpdateCheck(&prefs,
5291cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                               kDefaultTestParams,
5300dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                               "invalid xml>",
531edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                               -1,
532edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                               kActionCodeOmahaRequestXMLParseError,
5331cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                               NULL,  // response
5340dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                               &post_data));
5350dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  // convert post_data to string
5360dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  string post_str(&post_data[0], post_data.size());
5371cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_NE(post_str.find("        <o:ping a=\"-1\" r=\"-1\"></o:ping>\n"
5380dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                          "        <o:updatecheck></o:updatecheck>\n"),
5390dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov            string::npos);
540fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov  EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
541fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov            string::npos);
5420dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  EXPECT_EQ(post_str.find("o:event"), string::npos);
5430dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
5440dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
54595508da905b279a6b91aadfc7c4c72f57a5fa610Darin PetkovTEST(OmahaRequestActionTest, FormatUpdateCheckPrevVersionOutputTest) {
54695508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  vector<char> post_data;
54795508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  NiceMock<PrefsMock> prefs;
54895508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
54995508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(string("1.2.3.4")), Return(true)));
55095508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, ""))
55195508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov      .WillOnce(Return(true));
55295508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  ASSERT_FALSE(TestUpdateCheck(&prefs,
55395508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov                               kDefaultTestParams,
55495508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov                               "invalid xml>",
55595508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov                               -1,
55695508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov                               kActionCodeOmahaRequestXMLParseError,
55795508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov                               NULL,  // response
55895508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov                               &post_data));
55995508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  // convert post_data to string
56095508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  string post_str(&post_data[0], post_data.size());
56195508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  EXPECT_NE(post_str.find("        <o:ping a=\"-1\" r=\"-1\"></o:ping>\n"
56295508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov                          "        <o:updatecheck></o:updatecheck>\n"),
56395508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov            string::npos);
56495508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
56595508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov            string::npos);
56695508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  string prev_version_event = StringPrintf(
56795508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov      "        <o:event eventtype=\"%d\" eventresult=\"%d\" "
56895508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov      "previousversion=\"1.2.3.4\"></o:event>\n",
56995508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov      OmahaEvent::kTypeUpdateComplete,
57095508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov      OmahaEvent::kResultSuccessReboot);
57195508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  EXPECT_NE(post_str.find(prev_version_event), string::npos);
57295508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov}
57395508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov
574e17f86bae4299882232d3e6858ada68692e80501Darin PetkovTEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
575e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  vector<char> post_data;
5761cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  TestEvent(kDefaultTestParams,
577e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
578e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            "invalid xml>",
579e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            &post_data);
580e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  // convert post_data to string
581e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  string post_str(&post_data[0], post_data.size());
582e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  string expected_event = StringPrintf(
583e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      "        <o:event eventtype=\"%d\" eventresult=\"%d\"></o:event>\n",
584e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kTypeUpdateDownloadStarted,
585e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kResultSuccess);
586e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_NE(post_str.find(expected_event), string::npos);
5871cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_EQ(post_str.find("o:ping"), string::npos);
588e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(post_str.find("o:updatecheck"), string::npos);
589e17f86bae4299882232d3e6858ada68692e80501Darin Petkov}
590e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
591e17f86bae4299882232d3e6858ada68692e80501Darin PetkovTEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
592e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  vector<char> post_data;
5931cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  TestEvent(kDefaultTestParams,
594e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
595e17f86bae4299882232d3e6858ada68692e80501Darin Petkov                           OmahaEvent::kResultError,
596e17f86bae4299882232d3e6858ada68692e80501Darin Petkov                           kActionCodeError),
597e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            "invalid xml>",
598e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            &post_data);
599e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  // convert post_data to string
600e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  string post_str(&post_data[0], post_data.size());
601e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  string expected_event = StringPrintf(
602e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      "        <o:event eventtype=\"%d\" eventresult=\"%d\" "
603e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      "errorcode=\"%d\"></o:event>\n",
604e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kTypeDownloadComplete,
605e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kResultError,
606e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      kActionCodeError);
607e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_NE(post_str.find(expected_event), string::npos);
608e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(post_str.find("o:updatecheck"), string::npos);
609e17f86bae4299882232d3e6858ada68692e80501Darin Petkov}
610e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
6110dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin PetkovTEST(OmahaRequestActionTest, FormatEventOutputTest) {
6120dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  vector<char> post_data;
6131cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  TestEvent(kDefaultTestParams,
6140dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov            new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
6150dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                           OmahaEvent::kResultError,
616e17f86bae4299882232d3e6858ada68692e80501Darin Petkov                           kActionCodeError),
6170dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov            "invalid xml>",
6180dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov            &post_data);
6190dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  // convert post_data to string
6200dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  string post_str(&post_data[0], post_data.size());
6210dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  string expected_event = StringPrintf(
6220dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov      "        <o:event eventtype=\"%d\" eventresult=\"%d\" "
6230dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov      "errorcode=\"%d\"></o:event>\n",
6240dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov      OmahaEvent::kTypeDownloadComplete,
6250dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov      OmahaEvent::kResultError,
626e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      kActionCodeError);
6270dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  EXPECT_NE(post_str.find(expected_event), string::npos);
6280dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  EXPECT_EQ(post_str.find("o:updatecheck"), string::npos);
6290dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
6300dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
6310dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin PetkovTEST(OmahaRequestActionTest, IsEventTest) {
6320dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  string http_response("doesn't matter");
6339c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
6340dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  OmahaRequestAction update_check_action(
6351cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      &prefs,
6361cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      kDefaultTestParams,
6370dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov      NULL,
6380dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov      new MockHttpFetcher(http_response.data(),
6394516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                          http_response.size(),
6404516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                          NULL));
6410dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  EXPECT_FALSE(update_check_action.IsEvent());
6420dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
6430dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  OmahaRequestAction event_action(
6441cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      &prefs,
6451cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      kDefaultTestParams,
646e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
6470dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov      new MockHttpFetcher(http_response.data(),
6484516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                          http_response.size(),
6494516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                          NULL));
6500dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  EXPECT_TRUE(event_action.IsEvent());
6510dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
6520dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
6533f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los ReyesTEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
6543f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes  for (int i = 0; i < 2; i++) {
6553f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    bool delta_okay = i == 1;
6563f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    const char* delta_okay_str = delta_okay ? "true" : "false";
6573f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    vector<char> post_data;
65884c763cffce6778711792944387fadb760c55c8dDarin Petkov    OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
6593f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              OmahaRequestParams::kOsVersion,
6603f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "service_pack",
6613f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "x86-generic",
6623f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              OmahaRequestParams::kAppId,
6633f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "0.1.0.0",
6643f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "en-US",
6653f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "unittest_track",
666fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov                              "OEM MODEL REV 1234",
6673f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              delta_okay,
6683f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "http://url");
6691cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    ASSERT_FALSE(TestUpdateCheck(NULL,  // prefs
6701cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                                 params,
6713f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                                 "invalid xml>",
672edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                                 -1,
673edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                                 kActionCodeOmahaRequestXMLParseError,
6743f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                                 NULL,
6753f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                                 &post_data));
6763f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    // convert post_data to string
6773f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    string post_str(&post_data[0], post_data.size());
6783f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    EXPECT_NE(post_str.find(StringPrintf(" delta_okay=\"%s\"", delta_okay_str)),
6793f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes              string::npos)
6803f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes        << "i = " << i;
6813f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes  }
6823f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes}
6833f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes
684e17f86bae4299882232d3e6858ada68692e80501Darin PetkovTEST(OmahaRequestActionTest, OmahaEventTest) {
685e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  OmahaEvent default_event;
686e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
687e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
688e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(kActionCodeError, default_event.error_code);
689e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
690e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
691e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
692e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
693e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(kActionCodeSuccess, success_event.error_code);
694e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
695e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
696e17f86bae4299882232d3e6858ada68692e80501Darin Petkov                         OmahaEvent::kResultError,
697e17f86bae4299882232d3e6858ada68692e80501Darin Petkov                         kActionCodeError);
698e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
699e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
700e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(kActionCodeError, error_event.error_code);
701e17f86bae4299882232d3e6858ada68692e80501Darin Petkov}
702e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
7031cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, PingTest) {
7049c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
7051cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  // Add a few hours to the day difference to test no rounding, etc.
7061cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t five_days_ago =
7071cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
7081cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t six_days_ago =
7091cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
7101cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
7111cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
7121cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
7131cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
7141cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  vector<char> post_data;
7151cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
7161cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
7171cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
7181cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
719edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
7201cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kActionCodeSuccess,
7211cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
7221cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
7231cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  string post_str(&post_data[0], post_data.size());
7241cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_NE(post_str.find("<o:ping a=\"6\" r=\"5\"></o:ping>"), string::npos);
7251cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
7261cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
7271cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, ActivePingTest) {
7289c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
7291cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t three_days_ago =
7301cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
7311cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t now = Time::Now().ToInternalValue();
7321cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
7331cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
7341cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
7351cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
7361cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  vector<char> post_data;
7371cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
7381cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
7391cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
7401cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
741edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
7421cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kActionCodeSuccess,
7431cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
7441cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
7451cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  string post_str(&post_data[0], post_data.size());
7461cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_NE(post_str.find("<o:ping a=\"3\"></o:ping>"), string::npos);
7471cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
7481cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
7491cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, RollCallPingTest) {
7509c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
7511cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t four_days_ago =
7521cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
7531cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t now = Time::Now().ToInternalValue();
7541cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
7551cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
7561cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
7571cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
7581cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  vector<char> post_data;
7591cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
7601cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
7611cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
7621cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
763edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
7641cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kActionCodeSuccess,
7651cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
7661cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
7671cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  string post_str(&post_data[0], post_data.size());
7681cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_NE(post_str.find("<o:ping r=\"4\"></o:ping>\n"), string::npos);
7691cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
7701cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
7711cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, NoPingTest) {
7729c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
7731cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t one_hour_ago =
7741cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
7751cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
7761cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
7771cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
7781cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
7791cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
7801cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
7811cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  vector<char> post_data;
7821cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
7831cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
7841cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
7851cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
786edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
7871cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kActionCodeSuccess,
7881cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
7891cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
7901cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  string post_str(&post_data[0], post_data.size());
7911cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_EQ(post_str.find("o:ping"), string::npos);
7921cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
7931cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
7941cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, BackInTimePingTest) {
7959c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
7961cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t future =
7971cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
7981cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
7991cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
8001cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
8011cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
8021cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
8031cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
8041cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
8051cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
8061cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  vector<char> post_data;
8071cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
8081cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
8091cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
8101cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
8111cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "xmlns=\"http://www.google.com/update2/response\" "
8121cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "protocol=\"2.0\"><daystart elapsed_seconds=\"100\"/>"
8131cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
8141cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<updatecheck status=\"noupdate\"/></app></gupdate>",
815edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
8161cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kActionCodeSuccess,
8171cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
8181cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
8191cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  string post_str(&post_data[0], post_data.size());
8201cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_EQ(post_str.find("o:ping"), string::npos);
8211cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
8221cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
8231cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
8241cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  // This test checks that the action updates the last ping day to now
82584c763cffce6778711792944387fadb760c55c8dDarin Petkov  // minus 200 seconds with a slack of 5 seconds. Therefore, the test
8261cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  // may fail if it runs for longer than 5 seconds. It shouldn't run
8271cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  // that long though.
8281cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t midnight =
8291cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
8301cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t midnight_slack =
8311cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
8329c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
8331cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
8341cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                              AllOf(Ge(midnight), Le(midnight_slack))))
8351cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
8361cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
8371cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                              AllOf(Ge(midnight), Le(midnight_slack))))
8381cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
8391cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
8401cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
8411cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
8421cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
8431cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "xmlns=\"http://www.google.com/update2/response\" "
8441cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "protocol=\"2.0\"><daystart elapsed_seconds=\"200\"/>"
8451cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
8461cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<updatecheck status=\"noupdate\"/></app></gupdate>",
847edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
8481cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kActionCodeSuccess,
8491cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
8501cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL));
8511cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
8521cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
8531cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
8549c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
8551cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
8561cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
8571cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
8581cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
8591cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
8601cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
8611cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "xmlns=\"http://www.google.com/update2/response\" "
8621cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "protocol=\"2.0\"><daystart blah=\"200\"/>"
8631cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
8641cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<updatecheck status=\"noupdate\"/></app></gupdate>",
865edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
8661cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kActionCodeSuccess,
8671cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
8681cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL));
8691cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
8701cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
8711cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
8729c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
8731cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
8741cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
8751cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
8761cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
8771cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
8781cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
8791cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "xmlns=\"http://www.google.com/update2/response\" "
8801cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "protocol=\"2.0\"><daystart elapsed_seconds=\"x\"/>"
8811cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
8821cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<updatecheck status=\"noupdate\"/></app></gupdate>",
883edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
8841cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kActionCodeSuccess,
8851cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
8861cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL));
8871cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
8881cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
88984c763cffce6778711792944387fadb760c55c8dDarin PetkovTEST(OmahaRequestActionTest, NoUniqueIDTest) {
89084c763cffce6778711792944387fadb760c55c8dDarin Petkov  vector<char> post_data;
89184c763cffce6778711792944387fadb760c55c8dDarin Petkov  ASSERT_FALSE(TestUpdateCheck(NULL,  // prefs
89284c763cffce6778711792944387fadb760c55c8dDarin Petkov                               kDefaultTestParams,
89384c763cffce6778711792944387fadb760c55c8dDarin Petkov                               "invalid xml>",
894edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                               -1,
895edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                               kActionCodeOmahaRequestXMLParseError,
89684c763cffce6778711792944387fadb760c55c8dDarin Petkov                               NULL,  // response
89784c763cffce6778711792944387fadb760c55c8dDarin Petkov                               &post_data));
89884c763cffce6778711792944387fadb760c55c8dDarin Petkov  // convert post_data to string
89984c763cffce6778711792944387fadb760c55c8dDarin Petkov  string post_str(&post_data[0], post_data.size());
90084c763cffce6778711792944387fadb760c55c8dDarin Petkov  EXPECT_EQ(post_str.find("machineid="), string::npos);
90184c763cffce6778711792944387fadb760c55c8dDarin Petkov  EXPECT_EQ(post_str.find("userid="), string::npos);
90284c763cffce6778711792944387fadb760c55c8dDarin Petkov}
90384c763cffce6778711792944387fadb760c55c8dDarin Petkov
904edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin PetkovTEST(OmahaRequestActionTest, NetworkFailureTest) {
905edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  OmahaResponse response;
906edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  ASSERT_FALSE(
907edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      TestUpdateCheck(NULL,  // prefs
908edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      kDefaultTestParams,
909edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      "",
910edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      501,
911edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      static_cast<ActionExitCode>(
912edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                          kActionCodeOmahaRequestHTTPResponseBase + 501),
913edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      &response,
914edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      NULL));
915edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  EXPECT_FALSE(response.update_exists);
916edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov}
917edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov
918edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin PetkovTEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
919edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  OmahaResponse response;
920edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  ASSERT_FALSE(
921edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      TestUpdateCheck(NULL,  // prefs
922edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      kDefaultTestParams,
923edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      "",
924edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      1500,
925edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      static_cast<ActionExitCode>(
926edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                          kActionCodeOmahaRequestHTTPResponseBase + 999),
927edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      &response,
928edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      NULL));
929edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  EXPECT_FALSE(response.update_exists);
930edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov}
931edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov
9326a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}  // namespace chromeos_update_engine
933