omaha_request_action_unittest.cc revision 33bae491eded4ef4f1eb4f4ef0f01ef0e5463f3a
18155d081dc729d407f8ff9e95b4ef91ae14281ceMike Frysinger// Copyright (c) 2012 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
1075039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/strings/string_util.h>
1175039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/strings/stringprintf.h>
1275039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/time/time.h>
130dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov#include "gtest/gtest.h"
14d29695df35b7192faef4009d42a62c37bdd90a8fJay Srinivasan
156a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/action_pipe.h"
16d29695df35b7192faef4009d42a62c37bdd90a8fJay Srinivasan#include "update_engine/constants.h"
176a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/mock_http_fetcher.h"
186a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/omaha_hash_calculator.h"
196a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/omaha_request_action.h"
20a4a8a8ccc2d9e0285728ed247b43f09433e63323Darin Petkov#include "update_engine/omaha_request_params.h"
21480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan#include "update_engine/prefs.h"
226a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/test_utils.h"
23480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan#include "update_engine/utils.h"
246a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
251cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing base::Time;
261cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing base::TimeDelta;
276a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovusing std::string;
286a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovusing std::vector;
291cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::_;
301cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::AllOf;
3134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasanusing testing::DoAll;
321cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::Ge;
331cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::Le;
349c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkovusing testing::NiceMock;
351cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::Return;
361cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::SetArgumentPointee;
3733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenusing testing::AnyNumber;
386a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
396a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovnamespace chromeos_update_engine {
406a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
41ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasanclass OmahaRequestActionTest : public ::testing::Test {};
426a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
436a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovnamespace {
44480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
45ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanMockSystemState mock_system_state;
46480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanOmahaRequestParams kDefaultTestParams(
47ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan    &mock_system_state,
481cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    OmahaRequestParams::kOsPlatform,
491cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    OmahaRequestParams::kOsVersion,
501cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "service_pack",
511cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "x86-generic",
521cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    OmahaRequestParams::kAppId,
531cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "0.1.0.0",
541cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "en-US",
551cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "unittest",
56fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov    "OEM MODEL 09235 7471",
57c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa    "ChromeOSFirmware.1.0",
58c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa    "0X0A1",
591cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    false,  // delta okay
60bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold    false,  // interactive
610a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan    "http://url",
628f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen    false,  // update_disabled
638f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen    "",     // target_version_prefix
648f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen    false,  // use_p2p_for_downloading
658f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen    false); // use_p2p_for_sharing
661cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
676a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovstring GetNoUpdateResponse(const string& app_id) {
686a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  return string(
6923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
7023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<daystart elapsed_seconds=\"100\"/>"
7123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
7223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
736a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
746a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
75480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanstring GetUpdateResponse2(const string& app_id,
763b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa                          const string& version,
77480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                          const string& more_info_url,
78480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                          const string& prompt,
79480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                          const string& codebase,
8023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                          const string& filename,
81480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                          const string& hash,
82480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                          const string& needsadmin,
83480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                          const string& size,
84480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                          const string& deadline,
858f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                          const string& max_days_to_scatter,
86639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                          const string& elapsed_days,
878f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                          bool disable_p2p_for_downloading,
888f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                          bool disable_p2p_for_sharing) {
8923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  string response =
9023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
9123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "protocol=\"3.0\">"
92639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      "<daystart elapsed_seconds=\"100\"" +
93639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      (elapsed_days.empty() ? "" : (" elapsed_days=\"" + elapsed_days + "\"")) +
94639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      "/>"
9523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"" + app_id + "\" status=\"ok\">"
9623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<ping status=\"ok\"/><updatecheck status=\"ok\">"
9723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<urls><url codebase=\"" + codebase + "\"/></urls>"
983b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa      "<manifest version=\"" + version + "\">"
9923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<packages><package hash=\"not-used\" name=\"" + filename +  "\" "
10023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "size=\"" + size + "\"/></packages>"
10123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<actions><action event=\"postinstall\" "
1023b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa      "ChromeOSVersion=\"" + version + "\" "
1036a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
1043270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes      "IsDelta=\"true\" "
105d671e97c8cc87c71a01ee3e4a889753ea9bec35fJay Srinivasan      "IsDeltaPayload=\"true\" "
106480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
107480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      "sha256=\"" + hash + "\" "
10823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "needsadmin=\"" + needsadmin + "\" " +
109480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
1108f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      (disable_p2p_for_downloading ?
1118f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          "DisableP2PForDownloading=\"true\" " : "") +
1128f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
11323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "/></actions></manifest></updatecheck></app></response>";
11423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  LOG(INFO) << "Response = " << response;
11523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  return response;
116480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
117480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
118480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanstring GetUpdateResponse(const string& app_id,
1193b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa                         const string& version,
120480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                         const string& more_info_url,
121480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                         const string& prompt,
122480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                         const string& codebase,
12323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                         const string& filename,
124480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                         const string& hash,
125480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                         const string& needsadmin,
126480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                         const string& size,
127480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                         const string& deadline) {
128480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  return GetUpdateResponse2(app_id,
1293b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa                            version,
130480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                            more_info_url,
131480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                            prompt,
132480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                            codebase,
13323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                            filename,
134480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                            hash,
135480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                            needsadmin,
136480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                            size,
137480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                            deadline,
1388f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                            "7",
139639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                            "42", // elapsed_days
1408f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                            false,  // disable_p2p_for_downloading
1418f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                            false); // disable_p2p_for sharing
1426a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
1436a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1446a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
1456a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
1466a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaRequestActionTestProcessorDelegate()
1476a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      : loop_(NULL),
148a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen        expected_code_(kErrorCodeSuccess) {}
1496a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  virtual ~OmahaRequestActionTestProcessorDelegate() {
1506a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
151c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov  virtual void ProcessingDone(const ActionProcessor* processor,
152a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                              ErrorCode code) {
1536a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    ASSERT_TRUE(loop_);
1546a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    g_main_loop_quit(loop_);
1556a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
1566a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1576a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  virtual void ActionCompleted(ActionProcessor* processor,
1586a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                               AbstractAction* action,
159a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                               ErrorCode code) {
1606a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    // make sure actions always succeed
1616a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    if (action->Type() == OmahaRequestAction::StaticType())
162c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov      EXPECT_EQ(expected_code_, code);
1636a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    else
164a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen      EXPECT_EQ(kErrorCodeSuccess, code);
1656a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
1666a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  GMainLoop *loop_;
167a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen  ErrorCode expected_code_;
1686a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
1696a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1706a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovgboolean StartProcessorInRunLoop(gpointer data) {
1716a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
1726a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor->StartProcessing();
1736a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  return FALSE;
1746a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
1756a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}  // namespace {}
1766a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1776a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass OutputObjectCollectorAction;
1786a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1796a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovtemplate<>
1806a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass ActionTraits<OutputObjectCollectorAction> {
1816a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
1826a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Does not take an object for input
1836a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  typedef OmahaResponse InputObjectType;
1846a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // On success, puts the output path on output
1856a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  typedef NoneType OutputObjectType;
1866a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
1876a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1886a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
1896a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
1906a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OutputObjectCollectorAction() : has_input_object_(false) {}
1916a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  void PerformAction() {
1926a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    // copy input object
1936a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    has_input_object_ = HasInputObject();
1946a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    if (has_input_object_)
1956a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      omaha_response_ = GetInputObject();
196a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen    processor_->ActionComplete(this, kErrorCodeSuccess);
1976a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
1986a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Should never be called
1996a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  void TerminateProcessing() {
2006a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    CHECK(false);
2016a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
2026a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Debugging/logging
2036a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  static std::string StaticType() {
2046a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    return "OutputObjectCollectorAction";
2056a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
2066a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  std::string Type() const { return StaticType(); }
2076a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  bool has_input_object_;
2086a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse omaha_response_;
2096a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
2106a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2111cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov// Returns true iff an output response was obtained from the
212edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
2138f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen// used. |payload_state| may be NULL, in which case a local mock is used.
2148f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen// |p2p_manager| may be NULL, in which case a local mock is used.
2158f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen// out_response may be NULL. If |fail_http_response_code| is non-negative,
216265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov// the transfer will fail with that code. |ping_only| is passed through to the
217265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
218265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov// post-data received by the mock HttpFetcher is returned.
21933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
22033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The |expected_check_result|, |expected_check_reaction| and
22133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// |expected_error_code| parameters are for checking expectations
22233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
22333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UMA statistics. Use the appropriate ::kUnset value to specify that
22433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// the given metric should not be reported.
2251cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovbool TestUpdateCheck(PrefsInterface* prefs,
2268f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                     PayloadStateInterface *payload_state,
2278f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                     P2PManager *p2p_manager,
2288f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                     OmahaRequestParams& params,
2290dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                     const string& http_response,
230edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                     int fail_http_response_code,
231265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                     bool ping_only,
232a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                     ErrorCode expected_code,
23333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                     metrics::CheckResult expected_check_result,
23433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                     metrics::CheckReaction expected_check_reaction,
23533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                     metrics::DownloadErrorCode expected_download_error_code,
2360dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                     OmahaResponse* out_response,
2370dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                     vector<char>* out_post_data) {
2380dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
2390dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
2404516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                 http_response.size(),
2414516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                 NULL);
242edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  if (fail_http_response_code >= 0) {
243edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov    fetcher->FailTransfer(fail_http_response_code);
244edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  }
2456f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  MockSystemState mock_system_state;
2466f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  if (prefs)
2476f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan    mock_system_state.set_prefs(prefs);
2488f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  if (payload_state)
2498f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen    mock_system_state.set_payload_state(payload_state);
2508f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  if (p2p_manager)
2518f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen    mock_system_state.set_p2p_manager(p2p_manager);
252ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  mock_system_state.set_request_params(&params);
2536f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  OmahaRequestAction action(&mock_system_state,
2541cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                            NULL,
255116fda3221ff3df037ea1feb271883c87644c839Thieu Le                            fetcher,
256265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                            ping_only);
2576a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaRequestActionTestProcessorDelegate delegate;
2586a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  delegate.loop_ = loop;
259c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov  delegate.expected_code_ = expected_code;
260a4a8a8ccc2d9e0285728ed247b43f09433e63323Darin Petkov
2616a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor processor;
2626a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.set_delegate(&delegate);
2636a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&action);
2646a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2656a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OutputObjectCollectorAction collector_action;
2666a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  BondActions(&action, &collector_action);
2676a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&collector_action);
2686a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
26933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _))
27033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      .Times(AnyNumber());
27133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(*mock_system_state.mock_metrics_lib(),
27233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      SendEnumToUMA(metrics::kMetricCheckResult,
27333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen          static_cast<int>(expected_check_result),
27433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen          static_cast<int>(metrics::CheckResult::kNumConstants) - 1))
27533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      .Times(expected_check_result == metrics::CheckResult::kUnset ? 0 : 1);
27633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(*mock_system_state.mock_metrics_lib(),
27733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      SendEnumToUMA(metrics::kMetricCheckReaction,
27833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen          static_cast<int>(expected_check_reaction),
27933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen          static_cast<int>(metrics::CheckReaction::kNumConstants) - 1))
28033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      .Times(expected_check_reaction == metrics::CheckReaction::kUnset ? 0 : 1);
28133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(*mock_system_state.mock_metrics_lib(),
28233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      SendEnumToUMA(metrics::kMetricCheckDownloadErrorCode,
28333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen          static_cast<int>(expected_download_error_code),
28433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen          static_cast<int>(metrics::DownloadErrorCode::kNumConstants) - 1))
28533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      .Times(expected_download_error_code == metrics::DownloadErrorCode::kUnset
28633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen             ? 0 : 1);
28733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
2886a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_timeout_add(0, &StartProcessorInRunLoop, &processor);
2896a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_run(loop);
2906a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_unref(loop);
2916a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  if (collector_action.has_input_object_ && out_response)
2926a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    *out_response = collector_action.omaha_response_;
2936a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  if (out_post_data)
2946a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    *out_post_data = fetcher->post_data();
2956a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  return collector_action.has_input_object_;
2966a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
2976a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2980dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov// Tests Event requests -- they should always succeed. |out_post_data|
2990dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov// may be null; if non-null, the post-data received by the mock
3000dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov// HttpFetcher is returned.
301480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanvoid TestEvent(OmahaRequestParams params,
3020dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov               OmahaEvent* event,
3030dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov               const string& http_response,
3040dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov               vector<char>* out_post_data) {
3050dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
3060dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
3074516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                 http_response.size(),
3084516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                 NULL);
3096f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  MockSystemState mock_system_state;
310ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  mock_system_state.set_request_params(&params);
311ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  OmahaRequestAction action(&mock_system_state, event, fetcher, false);
3120dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  OmahaRequestActionTestProcessorDelegate delegate;
3130dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  delegate.loop_ = loop;
3140dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ActionProcessor processor;
3150dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  processor.set_delegate(&delegate);
3160dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  processor.EnqueueAction(&action);
3170dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
3180dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  g_timeout_add(0, &StartProcessorInRunLoop, &processor);
3190dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  g_main_loop_run(loop);
3200dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  g_main_loop_unref(loop);
3210dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  if (out_post_data)
3220dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov    *out_post_data = fetcher->post_data();
3230dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
3240dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
3256a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, NoUpdateTest) {
3266a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
3276a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
3281cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
3298f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
3308f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
3311cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
3320dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
333edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
334265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
335a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
33633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
33733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
33833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
3390dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
3400dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      NULL));
3416a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
3426a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
3436a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
3446a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, ValidUpdateTest) {
3456a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
3466a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
3471cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
3488f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
3498f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
3501cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
3510dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      GetUpdateResponse(OmahaRequestParams::kAppId,
3520dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "1.2.3.4",  // version
3530dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "http://more/info",
3540dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "true",  // prompt
35523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                        "http://code/base/",  // dl url
35623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                        "file.signed", // file name
3570dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "HASH1234=",  // checksum
3580dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "false",  // needs admin
3596c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "123",  // size
3606c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "20101020"),  // deadline
361edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
362265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
363a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
36433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
36533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
36633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
3670dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
3680dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      NULL));
3696a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_TRUE(response.update_exists);
37034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  EXPECT_TRUE(response.update_exists);
3713b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa  EXPECT_EQ("1.2.3.4", response.version);
3726f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
3736a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("http://more/info", response.more_info_url);
3746a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("HASH1234=", response.hash);
3756a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ(123, response.size);
3766a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_TRUE(response.prompt);
3776c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov  EXPECT_EQ("20101020", response.deadline);
3786a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
3796a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
3800a70874c61118a2b276edc731ad890c6826be2beJay SrinivasanTEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
3810a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  OmahaResponse response;
3820a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
383ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_disabled(true);
3840a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  ASSERT_FALSE(
3850a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan      TestUpdateCheck(NULL,  // prefs
3868f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
3878f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
3880a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      params,
3890a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      GetUpdateResponse(OmahaRequestParams::kAppId,
3900a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                                        "1.2.3.4",  // version
3910a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                                        "http://more/info",
3920a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                                        "true",  // prompt
39323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                        "http://code/base/",  // dl url
39423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                        "file.signed", // file name
3950a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                                        "HASH1234=",  // checksum
3960a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                                        "false",  // needs admin
3970a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                                        "123",  // size
398480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                        ""),  // deadline
3990a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      -1,
4000a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      false,  // ping_only
401a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeOmahaUpdateIgnoredPerPolicy,
40233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
40333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kIgnored,
40433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
4050a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      &response,
4060a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      NULL));
4070a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  EXPECT_FALSE(response.update_exists);
4080a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan}
4090a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan
4100a70874c61118a2b276edc731ad890c6826be2beJay SrinivasanTEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
4110a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  OmahaResponse response;
4120a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
413ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_disabled(true);
4140a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  ASSERT_TRUE(
4150a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan      TestUpdateCheck(NULL,  // prefs
4168f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
4178f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
4180a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      params,
4190a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
4200a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      -1,
4210a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      false,  // ping_only
422a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
42333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
42433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
42533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
4260a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      &response,
4270a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      NULL));
4280a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  EXPECT_FALSE(response.update_exists);
4290a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan}
4300a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan
431480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanTEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
432480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
433480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
434ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
435ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(false);
436ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta::FromDays(2));
437480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
438480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  string prefs_dir;
439a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
440480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                       &prefs_dir));
441480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
442480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
443480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  Prefs prefs;
44475039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
445480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      << "Failed to initialize preferences.";
446480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
447480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_FALSE(
448480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      TestUpdateCheck(&prefs,  // prefs
4498f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
4508f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
451480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      params,
452480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
453480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "1.2.3.4",  // version
454480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "http://more/info",
455480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "true",  // prompt
45623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
45723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "file.signed", // file name
458480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "HASH1234=",  // checksum
459480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "false",  // needs admin
460480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "123",  // size
461480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "",  // deadline
4628f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "7", // max days to scatter
463639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "42", // elapsed_days
4648f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
4658f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false), // disable_p2p_for sharing
466480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
467480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
468a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeOmahaUpdateDeferredPerPolicy,
46933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
47033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kDeferring,
47133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
472480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
473480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      NULL));
474480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_FALSE(response.update_exists);
475968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa
476968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  // Verify if we are interactive check we don't defer.
477968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  params.set_interactive(true);
478968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  ASSERT_TRUE(
479968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa      TestUpdateCheck(&prefs,  // prefs
4808f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
4818f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
482968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      params,
483968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      GetUpdateResponse2(OmahaRequestParams::kAppId,
484968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "1.2.3.4",  // version
485968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://more/info",
486968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "true",  // prompt
487968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://code/base/",  // dl url
488968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "file.signed", // file name
489968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "HASH1234=",  // checksum
490968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "false",  // needs admin
491968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "123",  // size
492968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "",  // deadline
4938f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "7", // max days to scatter
494639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "42", // elapsed_days
4958f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
4968f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false), // disable_p2p_for sharing
497968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      -1,
498968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      false,  // ping_only
499968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      kErrorCodeSuccess,
50033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
50133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
50233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
503968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      &response,
504968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      NULL));
505968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  EXPECT_TRUE(response.update_exists);
506480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
507480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
508480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanTEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
509480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
510480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
511ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(false);
512ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta::FromDays(2));
513480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
514ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(true);
515ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_min_update_checks_needed(1);
516ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_max_update_checks_allowed(8);
517480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
518480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  string prefs_dir;
519a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
520480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                       &prefs_dir));
521480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
522480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
523480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  Prefs prefs;
52475039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
525480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      << "Failed to initialize preferences.";
526480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
527480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(
528480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      TestUpdateCheck(&prefs,  // prefs
5298f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
5308f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
531480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      params,
532480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
533480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "1.2.3.4",  // version
534480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "http://more/info",
535480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "true",  // prompt
53623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
53723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "file.signed", // file name
538480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "HASH1234=",  // checksum
539480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "false",  // needs admin
540480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "123",  // size
541480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "",  // deadline
5428f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "7", // max days to scatter
543639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "42", // elapsed_days
5448f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
5458f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false), // disable_p2p_for sharing
546480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
547480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
548a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
54933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
55033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
55133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
552480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
553480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      NULL));
554480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_TRUE(response.update_exists);
555480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
556480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
557480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanTEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
558480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
559480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
560ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
561ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta::FromDays(2));
562480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
563ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(true);
564ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_min_update_checks_needed(1);
565ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_max_update_checks_allowed(8);
566480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
567480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  string prefs_dir;
568a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
569480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                       &prefs_dir));
570480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
571480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
572480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  Prefs prefs;
57375039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
574480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      << "Failed to initialize preferences.";
575480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
576480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(
577480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      TestUpdateCheck(&prefs,  // prefs
5788f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
5798f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
580480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      params,
581480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
582480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "1.2.3.4",  // version
583480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "http://more/info",
584480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "true",  // prompt
58523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
58623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "file.signed", // file name
587480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "HASH1234=",  // checksum
588480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "false",  // needs admin
589480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "123",  // size
590480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "",  // deadline
5918f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "0", // max days to scatter
592639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "42", // elapsed_days
5938f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
5948f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false), // disable_p2p_for sharing
595480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
596480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
597a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
59833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
59933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
60033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
601480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
602480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      NULL));
603480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_TRUE(response.update_exists);
604480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
605480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
606480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
607480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanTEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
608480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
609480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
610ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
611ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta());
612480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
613ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(true);
614ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_min_update_checks_needed(0);
615ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_max_update_checks_allowed(0);
616480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
617480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  string prefs_dir;
618a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
619480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                       &prefs_dir));
620480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
621480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
622480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  Prefs prefs;
62375039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
624480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      << "Failed to initialize preferences.";
625480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
626480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(TestUpdateCheck(
627480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &prefs,  // prefs
6288f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
6298f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
630480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      params,
631480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
632480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "1.2.3.4",  // version
633480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "http://more/info",
634480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "true",  // prompt
63523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
63623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "file.signed", // file name
637480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "HASH1234=",  // checksum
638480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "false",  // needs admin
639480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "123",  // size
640480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "",  // deadline
6418f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "7", // max days to scatter
642639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "42", // elapsed_days
6438f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
6448f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false), // disable_p2p_for sharing
645480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
646480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
647a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
64833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
64933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
65033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
651480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
652480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      NULL));
653480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
654480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  int64 count;
655480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
656480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(count == 0);
657480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_TRUE(response.update_exists);
658480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
659480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
660480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanTEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
661480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
662480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
663ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
664ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta());
665480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
666ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(true);
667ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_min_update_checks_needed(1);
668ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_max_update_checks_allowed(8);
669480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
670480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  string prefs_dir;
671a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
672480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                       &prefs_dir));
673480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
674480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
675480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  Prefs prefs;
67675039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
677480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      << "Failed to initialize preferences.";
678480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
679480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_FALSE(TestUpdateCheck(
680480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &prefs,  // prefs
6818f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
6828f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
683480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      params,
684480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
685480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "1.2.3.4",  // version
686480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "http://more/info",
687480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "true",  // prompt
68823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
68923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "file.signed", // file name
690480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "HASH1234=",  // checksum
691480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "false",  // needs admin
692480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "123",  // size
693480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "",  // deadline
6948f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "7", // max days to scatter
695639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "42", // elapsed_days
6968f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
6978f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false), // disable_p2p_for sharing
698480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
699480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
700a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeOmahaUpdateDeferredPerPolicy,
70133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
70233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kDeferring,
70333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
704480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
705480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      NULL));
706480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
707480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  int64 count;
708480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
709480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(count > 0);
710480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_FALSE(response.update_exists);
711968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa
712968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  // Verify if we are interactive check we don't defer.
713968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  params.set_interactive(true);
714968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  ASSERT_TRUE(
715968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa      TestUpdateCheck(&prefs,  // prefs
7168f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
7178f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
718968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      params,
719968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      GetUpdateResponse2(OmahaRequestParams::kAppId,
720968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "1.2.3.4",  // version
721968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://more/info",
722968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "true",  // prompt
723968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://code/base/",  // dl url
724968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "file.signed", // file name
725968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "HASH1234=",  // checksum
726968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "false",  // needs admin
727968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "123",  // size
728968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "",  // deadline
7298f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "7", // max days to scatter
730639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "42", // elapsed_days
7318f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
7328f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false), // disable_p2p_for sharing
733968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      -1,
734968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      false,  // ping_only
735968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      kErrorCodeSuccess,
73633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
73733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
73833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
739968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      &response,
740968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      NULL));
741968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  EXPECT_TRUE(response.update_exists);
742480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
743480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
744480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanTEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
745480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
746480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
747ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
748ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta());
749480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
750ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(true);
751ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_min_update_checks_needed(1);
752ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_max_update_checks_allowed(8);
753480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
754480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  string prefs_dir;
755a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
756480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                       &prefs_dir));
757480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
758480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
759480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  Prefs prefs;
76075039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
761480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      << "Failed to initialize preferences.";
762480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
763480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
764480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
765480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_FALSE(TestUpdateCheck(
766480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &prefs,  // prefs
7678f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
7688f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
769480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      params,
770480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
771480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "1.2.3.4",  // version
772480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "http://more/info",
773480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "true",  // prompt
77423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
77523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "file.signed", // file name
776480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "HASH1234=",  // checksum
777480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "false",  // needs admin
778480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "123",  // size
779480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "",  // deadline
7808f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "7", // max days to scatter
781639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "42", // elapsed_days
7828f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
7838f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false), // disable_p2p_for sharing
784480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
785480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
786a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeOmahaUpdateDeferredPerPolicy,
78733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
78833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kDeferring,
78933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
790480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
791480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      NULL));
792480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
793480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  int64 count;
794480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
795480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  // count remains the same, as the decrementing happens in update_attempter
796480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  // which this test doesn't exercise.
797480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(count == 5);
798480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_FALSE(response.update_exists);
799968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa
800968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  // Verify if we are interactive check we don't defer.
801968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  params.set_interactive(true);
802968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  ASSERT_TRUE(
803968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa      TestUpdateCheck(&prefs,  // prefs
8048f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
8058f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
806968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      params,
807968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      GetUpdateResponse2(OmahaRequestParams::kAppId,
808968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "1.2.3.4",  // version
809968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://more/info",
810968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "true",  // prompt
811968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://code/base/",  // dl url
812968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "file.signed", // file name
813968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "HASH1234=",  // checksum
814968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "false",  // needs admin
815968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "123",  // size
816968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "",  // deadline
8178f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "7", // max days to scatter
818639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "42", // elapsed_days
8198f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
8208f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false), // disable_p2p_for sharing
821968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      -1,
822968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      false,  // ping_only
823968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      kErrorCodeSuccess,
82433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
82533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
82633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
827968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      &response,
828968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      NULL));
829968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  EXPECT_TRUE(response.update_exists);
830480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
8310a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan
8326a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, NoOutputPipeTest) {
8336a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
8346a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
8356a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
8366a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
8376f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  MockSystemState mock_system_state;
838480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
839ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  mock_system_state.set_request_params(&params);
840ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  OmahaRequestAction action(&mock_system_state, NULL,
8410dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                            new MockHttpFetcher(http_response.data(),
8424516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                http_response.size(),
843116fda3221ff3df037ea1feb271883c87644c839Thieu Le                                                NULL),
844116fda3221ff3df037ea1feb271883c87644c839Thieu Le                            false);
8456a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaRequestActionTestProcessorDelegate delegate;
8466a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  delegate.loop_ = loop;
8476a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor processor;
8486a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.set_delegate(&delegate);
8496a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&action);
8506a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
8516a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_timeout_add(0, &StartProcessorInRunLoop, &processor);
8526a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_run(loop);
8536a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_unref(loop);
8546a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(processor.IsRunning());
8556a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
8566a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
8576a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, InvalidXmlTest) {
8586a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
8596a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_FALSE(
8601cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
8618f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
8628f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
8631cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
8640dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      "invalid xml>",
865edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
866265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
867a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeOmahaRequestXMLParseError,
86833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kParsingError,
86933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
87033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
871edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      &response,
872edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      NULL));
873edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  EXPECT_FALSE(response.update_exists);
874edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov}
875edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov
876edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin PetkovTEST(OmahaRequestActionTest, EmptyResponseTest) {
877edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  OmahaResponse response;
878edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  ASSERT_FALSE(
879edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      TestUpdateCheck(NULL,  // prefs
8808f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
8818f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
882edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      kDefaultTestParams,
883edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      "",
884edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
885265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
886a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeOmahaRequestEmptyResponseError,
88733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kParsingError,
88833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
88933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
8900dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
8910dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      NULL));
8926a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
8936a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
8946a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
8956a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, MissingStatusTest) {
8966a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
8970dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ASSERT_FALSE(TestUpdateCheck(
8981cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      NULL,  // prefs
8998f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      NULL,  // payload_state
9008f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      NULL,  // p2p_manager
9011cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      kDefaultTestParams,
90223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
90323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<daystart elapsed_seconds=\"100\"/>"
90423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"foo\" status=\"ok\">"
90523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<ping status=\"ok\"/>"
90623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<updatecheck/></app></response>",
907edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      -1,
908265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov      false,  // ping_only
909a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen      kErrorCodeOmahaResponseInvalid,
91033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckResult::kParsingError,
91133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckReaction::kUnset,
91233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::DownloadErrorCode::kUnset,
9136a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      &response,
9146a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      NULL));
9156a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
9166a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
9176a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
9186a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, InvalidStatusTest) {
9196a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
9200dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ASSERT_FALSE(TestUpdateCheck(
9211cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      NULL,  // prefs
9228f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      NULL,  // payload_state
9238f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      NULL,  // p2p_manager
9241cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      kDefaultTestParams,
92523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
92623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<daystart elapsed_seconds=\"100\"/>"
92723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"foo\" status=\"ok\">"
92823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<ping status=\"ok\"/>"
92923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
930edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      -1,
931265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov      false,  // ping_only
932a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen      kErrorCodeOmahaResponseInvalid,
93333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckResult::kParsingError,
93433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckReaction::kUnset,
93533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::DownloadErrorCode::kUnset,
9366a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      &response,
9376a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      NULL));
9386a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
9396a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
9406a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
9416a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, MissingNodesetTest) {
9426a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
9430dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ASSERT_FALSE(TestUpdateCheck(
9441cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      NULL,  // prefs
9458f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      NULL,  // payload_state
9468f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      NULL,  // p2p_manager
9471cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      kDefaultTestParams,
94823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
94923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<daystart elapsed_seconds=\"100\"/>"
95023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"foo\" status=\"ok\">"
95123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<ping status=\"ok\"/>"
95223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "</app></response>",
953edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      -1,
954265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov      false,  // ping_only
955a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen      kErrorCodeOmahaResponseInvalid,
95633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckResult::kParsingError,
95733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckReaction::kUnset,
95833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::DownloadErrorCode::kUnset,
9596a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      &response,
9606a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      NULL));
9616a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
9626a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
9636a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
9646a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, MissingFieldTest) {
96523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  string input_response =
96623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
96723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<daystart elapsed_seconds=\"100\"/>"
96823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"xyz\" status=\"ok\">"
96923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<updatecheck status=\"ok\">"
97023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
9713b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa      "<manifest version=\"10.2.3.4\">"
97223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<packages><package hash=\"not-used\" name=\"f\" "
97323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "size=\"587\"/></packages>"
97423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<actions><action event=\"postinstall\" "
97523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "ChromeOSVersion=\"10.2.3.4\" "
97623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "Prompt=\"false\" "
97723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "IsDelta=\"true\" "
978d671e97c8cc87c71a01ee3e4a889753ea9bec35fJay Srinivasan      "IsDeltaPayload=\"false\" "
97923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "sha256=\"lkq34j5345\" "
98023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "needsadmin=\"true\" "
98123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "/></actions></manifest></updatecheck></app></response>";
98223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  LOG(INFO) << "Input Response = " << input_response;
98323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan
9846a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
9851cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(TestUpdateCheck(NULL,  // prefs
9868f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              NULL,  // payload_state
9878f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              NULL,  // p2p_manager
9881cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                              kDefaultTestParams,
98923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                              input_response,
990edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                              -1,
991265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                              false,  // ping_only
992a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                              kErrorCodeSuccess,
99333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              metrics::CheckResult::kUpdateAvailable,
99433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              metrics::CheckReaction::kUpdating,
99533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              metrics::DownloadErrorCode::kUnset,
9960dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                              &response,
9970dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                              NULL));
9986a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_TRUE(response.update_exists);
9993b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa  EXPECT_EQ("10.2.3.4", response.version);
10006f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
10016a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("", response.more_info_url);
100223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ("lkq34j5345", response.hash);
100323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(587, response.size);
10046a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.prompt);
10056c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov  EXPECT_TRUE(response.deadline.empty());
10066a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
10076a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
10086a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovnamespace {
10096a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
10106a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
10116a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  void ProcessingStopped(const ActionProcessor* processor) {
10126a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    ASSERT_TRUE(loop_);
10136a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    g_main_loop_quit(loop_);
10146a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
10156a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  GMainLoop *loop_;
10166a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
10176a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
10186a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovgboolean TerminateTransferTestStarter(gpointer data) {
10196a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
10206a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor->StartProcessing();
10216a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  CHECK(processor->IsRunning());
10226a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor->StopProcessing();
10236a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  return FALSE;
10246a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
10256a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}  // namespace {}
10266a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
10276a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, TerminateTransferTest) {
10286a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  string http_response("doesn't matter");
10296a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
10306a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
10316f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  MockSystemState mock_system_state;
1032480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
1033ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  mock_system_state.set_request_params(&params);
1034ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  OmahaRequestAction action(&mock_system_state, NULL,
10350dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                            new MockHttpFetcher(http_response.data(),
10364516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                http_response.size(),
1037116fda3221ff3df037ea1feb271883c87644c839Thieu Le                                                NULL),
1038116fda3221ff3df037ea1feb271883c87644c839Thieu Le                            false);
10396a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  TerminateEarlyTestProcessorDelegate delegate;
10406a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  delegate.loop_ = loop;
10416a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor processor;
10426a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.set_delegate(&delegate);
10436a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&action);
10446a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
10456a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_timeout_add(0, &TerminateTransferTestStarter, &processor);
10466a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_run(loop);
10476a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_unref(loop);
10486a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
10496a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
10506a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, XmlEncodeTest) {
10516a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("ab", XmlEncode("ab"));
10526a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
10536a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
10546a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
10556a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
10566a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
10576a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  vector<char> post_data;
10586a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
10596a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Make sure XML Encode is being called on the params
1060ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  MockSystemState mock_system_state;
1061ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  OmahaRequestParams params(&mock_system_state,
1062ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                            OmahaRequestParams::kOsPlatform,
10636a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            OmahaRequestParams::kOsVersion,
10646a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            "testtheservice_pack>",
10651cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                            "x86 generic<id",
10666a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            OmahaRequestParams::kAppId,
10676a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            "0.1.0.0",
10686a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            "en-US",
10691cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                            "unittest_track&lt;",
1070fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov                            "<OEM MODEL>",
1071c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                            "ChromeOSFirmware.1.0",
1072c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                            "EC100",
10733f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                            false,  // delta okay
1074bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                            false,  // interactive
10750a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                            "http://url",
10768f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                            false,  // update_disabled
10778f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                            "",     // target_version_prefix
10788f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                            false,  // use_p2p_for_downloading
10798f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                            false); // use_p2p_for_sharing
10806a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
10816a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_FALSE(
10821cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
10838f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
10848f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
10851cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      params,
10860dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      "invalid xml>",
1087edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1088265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1089a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeOmahaRequestXMLParseError,
109033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kParsingError,
109133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
109233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
10930dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
10940dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &post_data));
10956a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // convert post_data to string
10966a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  string post_str(&post_data[0], post_data.size());
10976a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
10986a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
10991cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
11001cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
11011cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
11021cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
1103fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov  EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
1104fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov  EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
11056a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
11066a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
11076a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, XmlDecodeTest) {
11086a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
11096a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
11101cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
11118f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
11128f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
11131cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
11140dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      GetUpdateResponse(OmahaRequestParams::kAppId,
11150dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "1.2.3.4",  // version
11160dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "testthe&lt;url",  // more info
11170dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "true",  // prompt
111823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                        "testthe&amp;codebase/",  // dl url
111923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                        "file.signed", // file name
11200dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "HASH1234=", // checksum
11210dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "false",  // needs admin
11226c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "123",  // size
11236c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "&lt;20110101"),  // deadline
1124edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1125265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1126a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
112733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
112833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
112933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
11300dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
11310dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      NULL));
11326a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
11336a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ(response.more_info_url, "testthe<url");
11346f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
11356c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov  EXPECT_EQ(response.deadline, "<20110101");
11366a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
11376a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
11386a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, ParseIntTest) {
11396a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
11406a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
11411cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
11428f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
11438f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
11441cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
11450dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      GetUpdateResponse(OmahaRequestParams::kAppId,
11460dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "1.2.3.4",  // version
11470dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "theurl",  // more info
11480dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "true",  // prompt
114923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                        "thecodebase/",  // dl url
115023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                        "file.signed", // file name
11510dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "HASH1234=", // checksum
11520dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "false",  // needs admin
11530dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        // overflows int32:
11546c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "123123123123123",  // size
11556c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "deadline"),
1156edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1157265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1158a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
115933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
116033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
116133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
11620dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
11630dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      NULL));
11646a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
11656a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ(response.size, 123123123123123ll);
11666a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
11676a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
11680dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin PetkovTEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
11690dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  vector<char> post_data;
117095508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  NiceMock<PrefsMock> prefs;
117195508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
117295508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
1173ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
117495508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  ASSERT_FALSE(TestUpdateCheck(&prefs,
11758f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,  // payload_state
11768f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,  // p2p_manager
11771cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                               kDefaultTestParams,
11780dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                               "invalid xml>",
1179edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                               -1,
1180265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                               false,  // ping_only
1181a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                               kErrorCodeOmahaRequestXMLParseError,
118233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckResult::kParsingError,
118333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckReaction::kUnset,
118433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::DownloadErrorCode::kUnset,
11851cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                               NULL,  // response
11860dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                               &post_data));
11870dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  // convert post_data to string
11880dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  string post_str(&post_data[0], post_data.size());
1189116fda3221ff3df037ea1feb271883c87644c839Thieu Le  EXPECT_NE(post_str.find(
119023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "        <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
1191ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "        <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
11920a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan      string::npos);
1193fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov  EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1194fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov            string::npos);
1195c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa  EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1196c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa            string::npos);
1197c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa  EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1198c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa            string::npos);
11990dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
12000dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
12010a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan
1202ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST(OmahaRequestActionTest, FormatUpdateDisabledOutputTest) {
120395508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  vector<char> post_data;
120495508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  NiceMock<PrefsMock> prefs;
120595508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
12060a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan      .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
1207ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
12080a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
1209ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_disabled(true);
121095508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  ASSERT_FALSE(TestUpdateCheck(&prefs,
12118f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,  // payload_state
12128f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,  // p2p_manager
12130a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                               params,
121495508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov                               "invalid xml>",
121595508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov                               -1,
1216265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                               false,  // ping_only
1217a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                               kErrorCodeOmahaRequestXMLParseError,
121833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckResult::kParsingError,
121933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckReaction::kUnset,
122033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::DownloadErrorCode::kUnset,
122195508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov                               NULL,  // response
122295508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov                               &post_data));
122395508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  // convert post_data to string
122495508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  string post_str(&post_data[0], post_data.size());
1225116fda3221ff3df037ea1feb271883c87644c839Thieu Le  EXPECT_NE(post_str.find(
122623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "        <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
1227ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "        <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
12280a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan      string::npos);
122995508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
123095508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov            string::npos);
1231c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa  EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1232c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa            string::npos);
1233c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa  EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1234c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa            string::npos);
123595508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov}
123695508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov
1237e17f86bae4299882232d3e6858ada68692e80501Darin PetkovTEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
1238e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  vector<char> post_data;
12391cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  TestEvent(kDefaultTestParams,
1240e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
1241e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            "invalid xml>",
1242e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            &post_data);
1243e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  // convert post_data to string
1244e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  string post_str(&post_data[0], post_data.size());
124575039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  string expected_event = base::StringPrintf(
124623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "        <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
1247e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kTypeUpdateDownloadStarted,
1248e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kResultSuccess);
1249e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_NE(post_str.find(expected_event), string::npos);
125023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(post_str.find("ping"), string::npos);
125123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(post_str.find("updatecheck"), string::npos);
1252e17f86bae4299882232d3e6858ada68692e80501Darin Petkov}
1253e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
1254e17f86bae4299882232d3e6858ada68692e80501Darin PetkovTEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
1255e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  vector<char> post_data;
12561cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  TestEvent(kDefaultTestParams,
1257e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
1258e17f86bae4299882232d3e6858ada68692e80501Darin Petkov                           OmahaEvent::kResultError,
1259a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                           kErrorCodeError),
1260e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            "invalid xml>",
1261e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            &post_data);
1262e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  // convert post_data to string
1263e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  string post_str(&post_data[0], post_data.size());
126475039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  string expected_event = base::StringPrintf(
126523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "        <event eventtype=\"%d\" eventresult=\"%d\" "
126623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "errorcode=\"%d\"></event>\n",
1267e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kTypeDownloadComplete,
1268e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kResultError,
1269a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen      kErrorCodeError);
12700dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  EXPECT_NE(post_str.find(expected_event), string::npos);
127123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(post_str.find("updatecheck"), string::npos);
12720dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
12730dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
12740dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin PetkovTEST(OmahaRequestActionTest, IsEventTest) {
12750dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  string http_response("doesn't matter");
12766f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  MockSystemState mock_system_state;
1277480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
1278ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  mock_system_state.set_request_params(&params);
12790dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  OmahaRequestAction update_check_action(
12806f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan      &mock_system_state,
12810dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov      NULL,
12820dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov      new MockHttpFetcher(http_response.data(),
12834516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                          http_response.size(),
1284116fda3221ff3df037ea1feb271883c87644c839Thieu Le                          NULL),
1285116fda3221ff3df037ea1feb271883c87644c839Thieu Le      false);
12860dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  EXPECT_FALSE(update_check_action.IsEvent());
12870dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
1288480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  params = kDefaultTestParams;
1289ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  mock_system_state.set_request_params(&params);
12900dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  OmahaRequestAction event_action(
12916f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan      &mock_system_state,
1292e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
12930dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov      new MockHttpFetcher(http_response.data(),
12944516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                          http_response.size(),
1295116fda3221ff3df037ea1feb271883c87644c839Thieu Le                          NULL),
1296116fda3221ff3df037ea1feb271883c87644c839Thieu Le      false);
12970dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  EXPECT_TRUE(event_action.IsEvent());
12980dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
12990dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
13003f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los ReyesTEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
13013f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes  for (int i = 0; i < 2; i++) {
13023f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    bool delta_okay = i == 1;
13033f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    const char* delta_okay_str = delta_okay ? "true" : "false";
13043f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    vector<char> post_data;
1305ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan    MockSystemState mock_system_state;
1306ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan    OmahaRequestParams params(&mock_system_state,
1307ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                              OmahaRequestParams::kOsPlatform,
13083f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              OmahaRequestParams::kOsVersion,
13093f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "service_pack",
13103f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "x86-generic",
13113f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              OmahaRequestParams::kAppId,
13123f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "0.1.0.0",
13133f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "en-US",
13143f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "unittest_track",
1315fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov                              "OEM MODEL REV 1234",
1316c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                              "ChromeOSFirmware.1.0",
1317c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                              "EC100",
13183f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              delta_okay,
1319bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              false,  // interactive
13200a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                              "http://url",
13218f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              false,  // update_disabled
13228f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              "",     // target_version_prefix
13238f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              false,  // use_p2p_for_downloading
13248f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              false); // use_p2p_for_sharing
13251cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    ASSERT_FALSE(TestUpdateCheck(NULL,  // prefs
13268f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                 NULL,  // payload_state
13278f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                 NULL,  // p2p_manager
13281cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                                 params,
13293f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                                 "invalid xml>",
1330edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                                 -1,
1331265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                                 false,  // ping_only
1332a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                                 kErrorCodeOmahaRequestXMLParseError,
133333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::CheckResult::kParsingError,
133433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::CheckReaction::kUnset,
133533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::DownloadErrorCode::kUnset,
13363f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                                 NULL,
13373f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                                 &post_data));
13383f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    // convert post_data to string
133975039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko    string post_str(post_data.data(), post_data.size());
134075039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko    EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
134175039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko                                               delta_okay_str)),
13423f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes              string::npos)
13433f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes        << "i = " << i;
13443f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes  }
13453f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes}
13463f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes
1347bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad ArnoldTEST(OmahaRequestActionTest, FormatInteractiveOutputTest) {
1348bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold  for (int i = 0; i < 2; i++) {
1349bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold    bool interactive = i == 1;
13508a659d80dc1912c664ef16f0bc66acaa01bd8b73Gilad Arnold    const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
1351bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold    vector<char> post_data;
1352ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan    MockSystemState mock_system_state;
1353ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan    OmahaRequestParams params(&mock_system_state,
1354ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                              OmahaRequestParams::kOsPlatform,
1355bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              OmahaRequestParams::kOsVersion,
1356bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "service_pack",
1357bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "x86-generic",
1358bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              OmahaRequestParams::kAppId,
1359bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "0.1.0.0",
1360bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "en-US",
1361bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "unittest_track",
1362bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "OEM MODEL REV 1234",
1363c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                              "ChromeOSFirmware.1.0",
1364c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                              "EC100",
13658f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              true,   // delta_okay
1366bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              interactive,
1367bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "http://url",
13688f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              false,  // update_disabled
13698f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              "",     // target_version_prefix
13708f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              false,  // use_p2p_for_downloading
13718f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              false); // use_p2p_for_sharing
1372bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold    ASSERT_FALSE(TestUpdateCheck(NULL,  // prefs
13738f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                 NULL,  // payload_state
13748f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                 NULL,  // p2p_manager
1375bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                                 params,
1376bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                                 "invalid xml>",
1377bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                                 -1,
1378bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                                 false,  // ping_only
1379a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                                 kErrorCodeOmahaRequestXMLParseError,
138033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::CheckResult::kParsingError,
138133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::CheckReaction::kUnset,
138233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::DownloadErrorCode::kUnset,
1383bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                                 NULL,
1384bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                                 &post_data));
1385bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold    // convert post_data to string
1386bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold    string post_str(&post_data[0], post_data.size());
138775039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko    EXPECT_NE(post_str.find(base::StringPrintf("installsource=\"%s\"",
138875039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko                                               interactive_str)),
1389bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold              string::npos)
1390bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold        << "i = " << i;
1391bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold  }
1392bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold}
1393bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold
1394e17f86bae4299882232d3e6858ada68692e80501Darin PetkovTEST(OmahaRequestActionTest, OmahaEventTest) {
1395e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  OmahaEvent default_event;
1396e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1397e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
1398a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen  EXPECT_EQ(kErrorCodeError, default_event.error_code);
1399e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
1400e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1401e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1402e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
1403a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen  EXPECT_EQ(kErrorCodeSuccess, success_event.error_code);
1404e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
1405e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1406e17f86bae4299882232d3e6858ada68692e80501Darin Petkov                         OmahaEvent::kResultError,
1407a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                         kErrorCodeError);
1408e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1409e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
1410a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen  EXPECT_EQ(kErrorCodeError, error_event.error_code);
1411e17f86bae4299882232d3e6858ada68692e80501Darin Petkov}
1412e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
14131cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, PingTest) {
1414265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov  for (int ping_only = 0; ping_only < 2; ping_only++) {
1415265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    NiceMock<PrefsMock> prefs;
141633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
141733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      .Times(AnyNumber());
141833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
1419265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    // Add a few hours to the day difference to test no rounding, etc.
1420265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    int64_t five_days_ago =
1421265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov        (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1422265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    int64_t six_days_ago =
1423265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov        (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1424639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1425639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen        .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
1426265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1427265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov        .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1428265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1429265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov        .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1430265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    vector<char> post_data;
1431265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    ASSERT_TRUE(
1432265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov        TestUpdateCheck(&prefs,
14338f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                        NULL,  // payload_state
14348f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                        NULL,  // p2p_manager
1435265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                        kDefaultTestParams,
1436265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                        GetNoUpdateResponse(OmahaRequestParams::kAppId),
1437265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                        -1,
1438265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                        ping_only,
1439a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                        kErrorCodeSuccess,
144033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                        metrics::CheckResult::kUnset,
144133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                        metrics::CheckReaction::kUnset,
144233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                        metrics::DownloadErrorCode::kUnset,
1443265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                        NULL,
1444265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                        &post_data));
1445265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    string post_str(&post_data[0], post_data.size());
144623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan    EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
1447265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov              string::npos);
1448265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    if (ping_only) {
144923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      EXPECT_EQ(post_str.find("updatecheck"), string::npos);
1450265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov      EXPECT_EQ(post_str.find("previousversion"), string::npos);
1451265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    } else {
145223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      EXPECT_NE(post_str.find("updatecheck"), string::npos);
1453265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov      EXPECT_NE(post_str.find("previousversion"), string::npos);
1454265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    }
1455265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov  }
14561cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
14571cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
14581cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, ActivePingTest) {
14599c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
146033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
146133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    .Times(AnyNumber());
146233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
14631cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t three_days_ago =
14641cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
14651cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t now = Time::Now().ToInternalValue();
1466639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1467639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
14681cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
14691cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
14701cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
14711cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
14721cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  vector<char> post_data;
14731cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
14741cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
14758f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
14768f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
14771cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
14781cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
1479edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1480265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1481a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
148233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
148333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
148433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
14851cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
14861cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
14871cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  string post_str(&post_data[0], post_data.size());
148823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
1489116fda3221ff3df037ea1feb271883c87644c839Thieu Le            string::npos);
14901cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
14911cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
14921cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, RollCallPingTest) {
14939c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
149433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
149533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    .Times(AnyNumber());
149633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
14971cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t four_days_ago =
14981cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
14991cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t now = Time::Now().ToInternalValue();
1500639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1501639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
15021cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
15031cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
15041cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
15051cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
15061cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  vector<char> post_data;
15071cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
15081cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
15098f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
15108f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
15111cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
15121cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
1513edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1514265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1515a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
151633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
151733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
151833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
15191cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
15201cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
15211cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  string post_str(&post_data[0], post_data.size());
152223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
1523116fda3221ff3df037ea1feb271883c87644c839Thieu Le            string::npos);
15241cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
15251cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
15261cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, NoPingTest) {
15279c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
152833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
152933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    .Times(AnyNumber());
153033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
15311cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t one_hour_ago =
15321cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
1533639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1534639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
15351cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
15361cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
15371cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
15381cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
15391cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
15401cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
15411cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  vector<char> post_data;
15421cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
15431cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
15448f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
15458f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
15461cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
15471cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
1548edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1549265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1550a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
155133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
155233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
155333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
15541cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
15551cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
15561cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  string post_str(&post_data[0], post_data.size());
155723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(post_str.find("ping"), string::npos);
15581cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
15591cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
1560b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu LeTEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1561b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  // This test ensures that we ignore empty ping only requests.
1562b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  NiceMock<PrefsMock> prefs;
1563b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  int64_t now = Time::Now().ToInternalValue();
1564b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1565b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le      .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1566b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1567b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le      .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1568b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1569b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1570b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  vector<char> post_data;
1571b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_TRUE(
1572b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le      TestUpdateCheck(&prefs,
15738f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
15748f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
1575b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le                      kDefaultTestParams,
1576b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
1577b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le                      -1,
1578b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le                      true,  // ping_only
1579a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
158033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUnset,
158133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
158233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
1583b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le                      NULL,
1584b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le                      &post_data));
1585b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_EQ(post_data.size(), 0);
1586b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le}
1587b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le
15881cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, BackInTimePingTest) {
15899c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
159033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
159133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    .Times(AnyNumber());
159233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
15931cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t future =
15941cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
1595639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1596639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
15971cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
15981cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
15991cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
16001cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
16011cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
16021cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
16031cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
16041cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
16051cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  vector<char> post_data;
16061cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
16071cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
16088f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
16098f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
16101cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
161123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
161223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
16131cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
161423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<updatecheck status=\"noupdate\"/></app></response>",
1615edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1616265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1617a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
161833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
161933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
162033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
16211cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
16221cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
16231cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  string post_str(&post_data[0], post_data.size());
162423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(post_str.find("ping"), string::npos);
16251cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
16261cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
16271cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
16281cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  // This test checks that the action updates the last ping day to now
162984c763cffce6778711792944387fadb760c55c8dDarin Petkov  // minus 200 seconds with a slack of 5 seconds. Therefore, the test
16301cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  // may fail if it runs for longer than 5 seconds. It shouldn't run
16311cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  // that long though.
16321cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t midnight =
16331cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
16341cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t midnight_slack =
16351cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
16369c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
163733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
163833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
16391cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
16401cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                              AllOf(Ge(midnight), Le(midnight_slack))))
16411cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
16421cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
16431cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                              AllOf(Ge(midnight), Le(midnight_slack))))
16441cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
16451cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
16461cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
16478f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
16488f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
16491cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
165023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
165123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
16521cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
165323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<updatecheck status=\"noupdate\"/></app></response>",
1654edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1655265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1656a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
165733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
165833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
165933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
16601cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
16611cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL));
16621cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
16631cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
16641cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
16659c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
166633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
166733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
16681cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
16691cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
16701cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
16711cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
16728f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
16738f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
16741cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
167523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
167623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "protocol=\"3.0\"><daystart blah=\"200\"/>"
16771cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
167823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<updatecheck status=\"noupdate\"/></app></response>",
1679edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1680265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1681a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
168233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
168333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
168433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
16851cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
16861cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL));
16871cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
16881cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
16891cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
16909c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
169133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
169233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
16931cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
16941cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
16951cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
16961cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
16978f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
16988f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
16991cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      kDefaultTestParams,
170023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
170123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
17021cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
170323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<updatecheck status=\"noupdate\"/></app></response>",
1704edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1705265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1706a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
170733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
170833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
170933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
17101cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
17111cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL));
17121cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
17131cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
171484c763cffce6778711792944387fadb760c55c8dDarin PetkovTEST(OmahaRequestActionTest, NoUniqueIDTest) {
171584c763cffce6778711792944387fadb760c55c8dDarin Petkov  vector<char> post_data;
171684c763cffce6778711792944387fadb760c55c8dDarin Petkov  ASSERT_FALSE(TestUpdateCheck(NULL,  // prefs
17178f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,  // payload_state
17188f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,  // p2p_manager
171984c763cffce6778711792944387fadb760c55c8dDarin Petkov                               kDefaultTestParams,
172084c763cffce6778711792944387fadb760c55c8dDarin Petkov                               "invalid xml>",
1721edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                               -1,
1722265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                               false,  // ping_only
1723a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                               kErrorCodeOmahaRequestXMLParseError,
172433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckResult::kParsingError,
172533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckReaction::kUnset,
172633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::DownloadErrorCode::kUnset,
172784c763cffce6778711792944387fadb760c55c8dDarin Petkov                               NULL,  // response
172884c763cffce6778711792944387fadb760c55c8dDarin Petkov                               &post_data));
172984c763cffce6778711792944387fadb760c55c8dDarin Petkov  // convert post_data to string
173084c763cffce6778711792944387fadb760c55c8dDarin Petkov  string post_str(&post_data[0], post_data.size());
173184c763cffce6778711792944387fadb760c55c8dDarin Petkov  EXPECT_EQ(post_str.find("machineid="), string::npos);
173284c763cffce6778711792944387fadb760c55c8dDarin Petkov  EXPECT_EQ(post_str.find("userid="), string::npos);
173384c763cffce6778711792944387fadb760c55c8dDarin Petkov}
173484c763cffce6778711792944387fadb760c55c8dDarin Petkov
1735edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin PetkovTEST(OmahaRequestActionTest, NetworkFailureTest) {
1736edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  OmahaResponse response;
1737edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  ASSERT_FALSE(
1738edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      TestUpdateCheck(NULL,  // prefs
17398f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
17408f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
1741edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      kDefaultTestParams,
1742edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      "",
1743edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      501,
1744265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1745a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      static_cast<ErrorCode>(
1746a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                          kErrorCodeOmahaRequestHTTPResponseBase + 501),
174733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kDownloadError,
174833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
174933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      static_cast<metrics::DownloadErrorCode>(501),
1750edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      &response,
1751edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      NULL));
1752edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  EXPECT_FALSE(response.update_exists);
1753edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov}
1754edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov
1755edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin PetkovTEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1756edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  OmahaResponse response;
1757edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  ASSERT_FALSE(
1758edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      TestUpdateCheck(NULL,  // prefs
17598f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
17608f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
1761edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      kDefaultTestParams,
1762edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      "",
1763edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      1500,
1764265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1765a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      static_cast<ErrorCode>(
1766a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                          kErrorCodeOmahaRequestHTTPResponseBase + 999),
176733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kDownloadError,
176833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
176933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kHttpStatusOther,
1770edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      &response,
1771edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      NULL));
1772edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  EXPECT_FALSE(response.update_exists);
1773edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov}
1774edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov
177534b5d86d057d450325dd06d35ae182ac6da306e4Jay SrinivasanTEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
177634b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  OmahaResponse response;
177734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
1778ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
1779ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta().FromDays(1));
1780ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(false);
178134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
178234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  string prefs_dir;
1783a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
178434b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                       &prefs_dir));
178534b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
178634b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
178734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  Prefs prefs;
178875039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
178934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan      << "Failed to initialize preferences.";
179034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
179134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_FALSE(TestUpdateCheck(
179234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      &prefs,  // prefs
17938f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
17948f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
179534b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      params,
179634b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
179734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "1.2.3.4",  // version
179834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "http://more/info",
179934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "true",  // prompt
180023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
180123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "file.signed", // file name
180234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "HASH1234=",  // checksum
180334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "false",  // needs admin
180434b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "123",  // size
180534b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "",  // deadline
18068f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "7", // max days to scatter
1807639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "42", // elapsed_days
18088f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
18098f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false), // disable_p2p_for sharing
181034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      -1,
181134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      false,  // ping_only
1812a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeOmahaUpdateDeferredPerPolicy,
181333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
181433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kDeferring,
181533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
181634b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      &response,
181734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      NULL));
181834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
181934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  int64 timestamp = 0;
182034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
182134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_TRUE(timestamp > 0);
182234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  EXPECT_FALSE(response.update_exists);
1823968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa
1824968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  // Verify if we are interactive check we don't defer.
1825968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  params.set_interactive(true);
1826968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  ASSERT_TRUE(
1827968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa      TestUpdateCheck(&prefs,  // prefs
18288f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
18298f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
1830968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      params,
1831968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      GetUpdateResponse2(OmahaRequestParams::kAppId,
1832968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "1.2.3.4",  // version
1833968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://more/info",
1834968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "true",  // prompt
1835968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://code/base/",  // dl url
1836968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "file.signed", // file name
1837968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "HASH1234=",  // checksum
1838968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "false",  // needs admin
1839968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "123",  // size
1840968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "",  // deadline
18418f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "7", // max days to scatter
1842639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "42", // elapsed_days
18438f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
18448f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false), // disable_p2p_for sharing
1845968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      -1,
1846968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      false,  // ping_only
1847968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      kErrorCodeSuccess,
184833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
184933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
185033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
1851968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      &response,
1852968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      NULL));
1853968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  EXPECT_TRUE(response.update_exists);
185434b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan}
185534b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
185634b5d86d057d450325dd06d35ae182ac6da306e4Jay SrinivasanTEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
185734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  OmahaResponse response;
185834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
1859ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
1860ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta().FromDays(1));
1861ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(false);
186234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
186334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  string prefs_dir;
1864a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
186534b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                       &prefs_dir));
186634b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
186734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
186834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  Prefs prefs;
186975039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
187034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan      << "Failed to initialize preferences.";
187134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
187234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  // Set the timestamp to a very old value such that it exceeds the
187334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  // waiting period set above.
187434b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  Time t1;
187534b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  Time::FromString("1/1/2012", &t1);
187634b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
187734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_TRUE(TestUpdateCheck(
187834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      &prefs,  // prefs
18798f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
18808f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
188134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      params,
188234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
188334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "1.2.3.4",  // version
188434b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "http://more/info",
188534b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "true",  // prompt
188623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
188723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "file.signed", // file name
188834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "HASH1234=",  // checksum
188934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "false",  // needs admin
189034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "123",  // size
189134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "",  // deadline
18928f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "7", // max days to scatter
1893639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "42", // elapsed_days
18948f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
18958f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false), // disable_p2p_for sharing
189634b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      -1,
189734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      false,  // ping_only
1898a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                      kErrorCodeSuccess,
189933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
190033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
190133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
190234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      &response,
190334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      NULL));
190434b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
190534b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  EXPECT_TRUE(response.update_exists);
190634b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
190734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  // Make sure the timestamp t1 is unchanged showing that it was reused.
190834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  int64 timestamp = 0;
190934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
191034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_TRUE(timestamp == t1.ToInternalValue());
191134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan}
191234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
1913ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
1914eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  // Create a uniquely named test directory.
1915eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  string test_dir;
1916eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_TRUE(utils::MakeTempDirectory(
1917eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold          "omaha_request_action-test-XXXXXX", &test_dir));
1918eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold
1919eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1920eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
1921be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa                      kStatefulPartition + "/etc"));
1922ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  vector<char> post_data;
1923ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  NiceMock<PrefsMock> prefs;
1924ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_TRUE(WriteFileString(
1925eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold      test_dir + "/etc/lsb-release",
1926ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1927ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1928ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1929ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_TRUE(WriteFileString(
1930eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold      test_dir + kStatefulPartition + "/etc/lsb-release",
1931ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
1932ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1933ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
1934d04f8e24716d5acca6a7d116b63851adc1506845Gilad Arnold  params.set_root(test_dir);
1935ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.SetLockDown(false);
1936ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.Init("1.2.3.4", "", 0);
1937ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("canary-channel", params.current_channel());
1938ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("stable-channel", params.target_channel());
1939ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_TRUE(params.to_more_stable_channel());
1940ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_TRUE(params.is_powerwash_allowed());
1941ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_FALSE(TestUpdateCheck(&prefs,
19428f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,    // payload_state
19438f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,    // p2p_manager
1944ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               params,
1945ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               "invalid xml>",
1946ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               -1,
1947ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               false,  // ping_only
1948a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                               kErrorCodeOmahaRequestXMLParseError,
194933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckResult::kParsingError,
195033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckReaction::kUnset,
195133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::DownloadErrorCode::kUnset,
1952ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               NULL,  // response
1953ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               &post_data));
1954ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  // convert post_data to string
1955ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  string post_str(&post_data[0], post_data.size());
1956ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_NE(string::npos, post_str.find(
1957ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "appid=\"{22222222-2222-2222-2222-222222222222}\" "
1958ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
1959ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "track=\"stable-channel\" from_track=\"canary-channel\" "));
1960eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold
1961eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
1962ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan}
1963ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan
1964ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST(OmahaRequestActionTest, TestChangingToLessStableChannel) {
1965eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  // Create a uniquely named test directory.
1966eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  string test_dir;
1967eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_TRUE(utils::MakeTempDirectory(
1968eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold          "omaha_request_action-test-XXXXXX", &test_dir));
1969eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold
1970eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1971eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
1972be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa                      kStatefulPartition + "/etc"));
1973ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  vector<char> post_data;
1974ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  NiceMock<PrefsMock> prefs;
1975ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_TRUE(WriteFileString(
1976eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold      test_dir + "/etc/lsb-release",
1977ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1978ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1979ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1980ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_TRUE(WriteFileString(
1981eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold      test_dir + kStatefulPartition + "/etc/lsb-release",
1982ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1983ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
1984d04f8e24716d5acca6a7d116b63851adc1506845Gilad Arnold  params.set_root(test_dir);
1985ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.SetLockDown(false);
1986ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.Init("5.6.7.8", "", 0);
1987ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("stable-channel", params.current_channel());
1988ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("canary-channel", params.target_channel());
1989ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_FALSE(params.to_more_stable_channel());
1990ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_FALSE(params.is_powerwash_allowed());
1991ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_FALSE(TestUpdateCheck(&prefs,
19928f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,    // payload_state
19938f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,    // p2p_manager
1994ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               params,
1995ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               "invalid xml>",
1996ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               -1,
1997ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               false,  // ping_only
1998a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                               kErrorCodeOmahaRequestXMLParseError,
199933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckResult::kParsingError,
200033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckReaction::kUnset,
200133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::DownloadErrorCode::kUnset,
2002ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               NULL,  // response
2003ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               &post_data));
2004ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  // convert post_data to string
2005ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  string post_str(&post_data[0], post_data.size());
2006ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_NE(string::npos, post_str.find(
2007ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "appid=\"{11111111-1111-1111-1111-111111111111}\" "
2008ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "version=\"5.6.7.8\" "
2009ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "track=\"canary-channel\" from_track=\"stable-channel\""));
2010ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ(string::npos, post_str.find( "from_version"));
2011eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold
2012eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
2013ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan}
2014ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan
20158f191b22a1a1ab2b803d65ee488729206e648695David Zeuthenvoid P2PTest(bool initial_allow_p2p_for_downloading,
20168f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             bool initial_allow_p2p_for_sharing,
20178f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             bool omaha_disable_p2p_for_downloading,
20188f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             bool omaha_disable_p2p_for_sharing,
20198f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             bool payload_state_allow_p2p_attempt,
20208f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             bool expect_p2p_client_lookup,
20218f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             const string& p2p_client_result_url,
20228f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             bool expected_allow_p2p_for_downloading,
20238f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             bool expected_allow_p2p_for_sharing,
20248f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             const string& expected_p2p_url) {
20258f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  OmahaResponse response;
20268f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  OmahaRequestParams request_params = kDefaultTestParams;
20278f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  request_params.set_use_p2p_for_downloading(initial_allow_p2p_for_downloading);
20288f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  request_params.set_use_p2p_for_sharing(initial_allow_p2p_for_sharing);
20298f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
20308f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  MockPayloadState mock_payload_state;
20318f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
20328f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
20338f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  MockP2PManager mock_p2p_manager;
20348f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
20358f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
20364cc5ed215180d19598d8b99f0a8a15cc24b831fcDavid Zeuthen  TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
20374cc5ed215180d19598d8b99f0a8a15cc24b831fcDavid Zeuthen  EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
20388f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      .Times(expect_p2p_client_lookup ? 1 : 0);
20398f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
20408f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  ASSERT_TRUE(
20418f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      TestUpdateCheck(NULL,  // prefs
20428f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      &mock_payload_state,
20438f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      &mock_p2p_manager,
20448f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      request_params,
20458f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      GetUpdateResponse2(OmahaRequestParams::kAppId,
20468f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "1.2.3.4",  // version
20478f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "http://more/info",
20488f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "true",  // prompt
20498f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "http://code/base/",  // dl url
20508f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "file.signed", // file name
20518f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "HASH1234=",  // checksum
20528f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "false",  // needs admin
20538f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "123",  // size
20548f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "",  // deadline
20558f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "7", // max days to scatter
2056639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "42", // elapsed_days
20578f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         omaha_disable_p2p_for_downloading,
20588f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         omaha_disable_p2p_for_sharing),
20598f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      -1,
20608f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      false,  // ping_only
20618f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      kErrorCodeSuccess,
206233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
206333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
206433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
20658f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      &response,
20668f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL));
20678f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_TRUE(response.update_exists);
20688f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
20698f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_EQ(response.disable_p2p_for_downloading,
20708f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen            omaha_disable_p2p_for_downloading);
20718f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_EQ(response.disable_p2p_for_sharing,
20728f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen            omaha_disable_p2p_for_sharing);
20738f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
20748f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_EQ(request_params.use_p2p_for_downloading(),
20758f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen            expected_allow_p2p_for_downloading);
20768f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
20778f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_EQ(request_params.use_p2p_for_sharing(),
20788f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen            expected_allow_p2p_for_sharing);
20798f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
20808f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_EQ(request_params.p2p_url(), expected_p2p_url);
20818f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
20828f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
20838f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST(OmahaRequestActionTest, P2PWithPeer) {
20848f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  P2PTest(true,                  // initial_allow_p2p_for_downloading
20858f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // initial_allow_p2p_for_sharing
20868f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // omaha_disable_p2p_for_downloading
20878f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // omaha_disable_p2p_for_sharing
20888f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // payload_state_allow_p2p_attempt
20898f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // expect_p2p_client_lookup
20908f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          "http://1.3.5.7/p2p",  // p2p_client_result_url
20918f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // expected_allow_p2p_for_downloading
20928f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // expected_allow_p2p_for_sharing
20938f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          "http://1.3.5.7/p2p"); // expected_p2p_url
20948f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
20958f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
20968f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST(OmahaRequestActionTest, P2PWithoutPeer) {
20978f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  P2PTest(true,                  // initial_allow_p2p_for_downloading
20988f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // initial_allow_p2p_for_sharing
20998f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // omaha_disable_p2p_for_downloading
21008f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // omaha_disable_p2p_for_sharing
21018f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // payload_state_allow_p2p_attempt
21028f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // expect_p2p_client_lookup
21038f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          "",                    // p2p_client_result_url
21048f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // expected_allow_p2p_for_downloading
21058f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // expected_allow_p2p_for_sharing
21068f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          "");                   // expected_p2p_url
21078f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
21088f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
21098f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST(OmahaRequestActionTest, P2PDownloadNotAllowed) {
21108f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  P2PTest(false,                 // initial_allow_p2p_for_downloading
21118f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // initial_allow_p2p_for_sharing
21128f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // omaha_disable_p2p_for_downloading
21138f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // omaha_disable_p2p_for_sharing
21148f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // payload_state_allow_p2p_attempt
21158f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // expect_p2p_client_lookup
21168f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          "unset",               // p2p_client_result_url
21178f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // expected_allow_p2p_for_downloading
21188f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // expected_allow_p2p_for_sharing
21198f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          "");                   // expected_p2p_url
21208f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
21218f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
21228f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
21238f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  P2PTest(true,                  // initial_allow_p2p_for_downloading
21248f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // initial_allow_p2p_for_sharing
21258f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // omaha_disable_p2p_for_downloading
21268f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // omaha_disable_p2p_for_sharing
21278f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // payload_state_allow_p2p_attempt
21288f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // expect_p2p_client_lookup
21298f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          "unset",               // p2p_client_result_url
21308f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // expected_allow_p2p_for_downloading
21318f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // expected_allow_p2p_for_sharing
21328f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          "");                   // expected_p2p_url
21338f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
21348f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
21358f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
21368f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  P2PTest(true,                  // initial_allow_p2p_for_downloading
21378f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // initial_allow_p2p_for_sharing
21388f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // omaha_disable_p2p_for_downloading
21398f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // omaha_disable_p2p_for_sharing
21408f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // payload_state_allow_p2p_attempt
21418f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // expect_p2p_client_lookup
21428f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          "http://1.3.5.7/p2p",  // p2p_client_result_url
21438f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // expected_allow_p2p_for_downloading
21448f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // expected_allow_p2p_for_sharing
21458f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          "http://1.3.5.7/p2p"); // expected_p2p_url
21468f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
21478f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
21488f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
21498f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  P2PTest(true,                  // initial_allow_p2p_for_downloading
21508f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // initial_allow_p2p_for_sharing
21518f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // omaha_disable_p2p_for_downloading
21528f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // omaha_disable_p2p_for_sharing
21538f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          true,                  // payload_state_allow_p2p_attempt
21548f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // expect_p2p_client_lookup
21558f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          "unset",               // p2p_client_result_url
21568f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // expected_allow_p2p_for_downloading
21578f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          false,                 // expected_allow_p2p_for_sharing
21588f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          "");                   // expected_p2p_url
21598f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
21608f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
2161639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthenbool InstallDateParseHelper(const std::string &elapsed_days,
2162639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                            PrefsInterface* prefs,
2163639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                            OmahaResponse *response) {
2164639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  return
2165639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      TestUpdateCheck(prefs,
2166639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      NULL,    // payload_state
2167639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      NULL,    // p2p_manager
2168639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      kDefaultTestParams,
2169639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      GetUpdateResponse2(OmahaRequestParams::kAppId,
2170639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "1.2.3.4",  // version
2171639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "http://more/info",
2172639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "true",  // prompt
2173639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "http://code/base/",  // dl url
2174639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "file.signed", // file name
2175639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "HASH1234=",  // checksum
2176639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "false",  // needs admin
2177639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "123",  // size
2178639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "",  // deadline
2179639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "7", // max days to scatter
2180639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         elapsed_days,
2181639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         false,  // disable_p2p_for_downloading
2182639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         false), // disable_p2p_for sharing
2183639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      -1,
2184639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      false,  // ping_only
2185639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      kErrorCodeSuccess,
218633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
218733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
218833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
2189639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      response,
2190639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      NULL);
2191639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen}
2192639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2193639aa36fc7e27ba400402cd7a32b091f555783a6David ZeuthenTEST(OmahaRequestActionTest, ParseInstallDateFromResponse) {
2194639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  OmahaResponse response;
2195639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  string temp_dir;
2196639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  Prefs prefs;
2197639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(utils::MakeTempDirectory("ParseInstallDateFromResponse.XXXXXX",
2198639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                       &temp_dir));
219975039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  prefs.Init(base::FilePath(temp_dir));
2200639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2201639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // Check that we parse elapsed_days in the Omaha Response correctly.
2202639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // and that the kPrefsInstallDateDays value is written to.
2203639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2204639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(InstallDateParseHelper("42", &prefs, &response));
2205639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(response.update_exists);
2206639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(42, response.install_date_days);
2207639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(prefs.Exists(kPrefsInstallDateDays));
2208639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  int64_t prefs_days;
2209639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2210639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(prefs_days, 42);
2211639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2212639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // If there already is a value set, we shouldn't do anything.
2213639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(InstallDateParseHelper("7", &prefs, &response));
2214639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(response.update_exists);
2215639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(7, response.install_date_days);
2216639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2217639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(prefs_days, 42);
2218639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2219639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // Note that elapsed_days is not necessarily divisible by 7 so check
2220639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // that we round down correctly when populating kPrefsInstallDateDays.
2221639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(prefs.Delete(kPrefsInstallDateDays));
2222639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(InstallDateParseHelper("23", &prefs, &response));
2223639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(response.update_exists);
2224639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(23, response.install_date_days);
2225639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2226639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(prefs_days, 21);
2227639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2228639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // Check that we correctly handle elapsed_days not being included in
2229639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // the Omaha Response.
2230639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(InstallDateParseHelper("", &prefs, &response));
2231639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(response.update_exists);
2232639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(-1, response.install_date_days);
2233639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2234639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
2235639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen}
2236639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2237639aa36fc7e27ba400402cd7a32b091f555783a6David ZeuthenTEST(OmahaRequestActionTest, GetInstallDate) {
2238639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  string temp_dir;
2239639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  Prefs prefs;
2240639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(utils::MakeTempDirectory("GetInstallDate.XXXXXX",
2241639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                       &temp_dir));
224275039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  prefs.Init(base::FilePath(temp_dir));
2243639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2244639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // If there is no prefs and OOBE is not complete, we should not
2245639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // report anything to Omaha.
2246639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  {
2247639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    NiceMock<MockSystemState> system_state;
2248639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    system_state.set_prefs(&prefs);
2249639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_EQ(OmahaRequestAction::GetInstallDate(&system_state), -1);
2250639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2251639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  }
2252639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2253639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // If OOBE is complete and happened on a valid date (e.g. after Jan
2254639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // 1 2007 0:00 PST), that date should be used and written to
2255639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // prefs. However, first try with an invalid date and check we do
2256639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // nothing.
2257639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  {
2258639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    NiceMock<MockSystemState> system_state;
2259639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    system_state.set_prefs(&prefs);
2260639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2261639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
2262639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_CALL(system_state,
2263639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                IsOOBEComplete(_))
2264639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                .WillRepeatedly(DoAll(SetArgumentPointee<0>(oobe_date),
2265639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                      Return(true)));
2266639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_EQ(OmahaRequestAction::GetInstallDate(&system_state), -1);
2267639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2268639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  }
2269639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2270639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // Then check with a valid date. The date Jan 20, 2007 0:00 PST
2271639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // should yield an InstallDate of 14.
2272639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  {
2273639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    NiceMock<MockSystemState> system_state;
2274639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    system_state.set_prefs(&prefs);
2275639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2276639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
2277639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_CALL(system_state,
2278639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                IsOOBEComplete(_))
2279639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                .WillRepeatedly(DoAll(SetArgumentPointee<0>(oobe_date),
2280639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                      Return(true)));
2281639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_EQ(OmahaRequestAction::GetInstallDate(&system_state), 14);
2282639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_TRUE(prefs.Exists(kPrefsInstallDateDays));
2283639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2284639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    int64_t prefs_days;
2285639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2286639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_EQ(prefs_days, 14);
2287639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  }
2288639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2289639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // Now that we have a valid date in prefs, check that we keep using
2290639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // that even if OOBE date reports something else. The date Jan 30,
2291639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // 2007 0:00 PST should yield an InstallDate of 28... but since
2292639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // there's a prefs file, we should still get 14.
2293639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  {
2294639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    NiceMock<MockSystemState> system_state;
2295639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    system_state.set_prefs(&prefs);
2296639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2297639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
2298639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_CALL(system_state,
2299639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                IsOOBEComplete(_))
2300639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                .WillRepeatedly(DoAll(SetArgumentPointee<0>(oobe_date),
2301639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                      Return(true)));
2302639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_EQ(OmahaRequestAction::GetInstallDate(&system_state), 14);
2303639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2304639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    int64_t prefs_days;
2305639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2306639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_EQ(prefs_days, 14);
2307639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2308639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    // If we delete the prefs file, we should get 28 days.
2309639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_TRUE(prefs.Delete(kPrefsInstallDateDays));
2310639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_EQ(OmahaRequestAction::GetInstallDate(&system_state), 28);
2311639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2312639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_EQ(prefs_days, 28);
2313639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  }
2314639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2315639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
2316639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen}
2317639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
23186a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}  // namespace chromeos_update_engine
2319