omaha_request_action_unittest.cc revision f3e2801f18bae14e41099e007de7c9a019735556
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
59abb763fa3840d69cc1098c0233162557a7f99eaBen Chan#include <glib.h>
69abb763fa3840d69cc1098c0233162557a7f99eaBen Chan#include <stdint.h>
79abb763fa3840d69cc1098c0233162557a7f99eaBen Chan
86a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include <string>
96a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include <vector>
100dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
1175039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/strings/string_util.h>
1275039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/strings/stringprintf.h>
1375039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/time/time.h>
1477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa#include <chromeos/dbus/service_constants.h>
150dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov#include "gtest/gtest.h"
16d29695df35b7192faef4009d42a62c37bdd90a8fJay Srinivasan
176a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/action_pipe.h"
18d29695df35b7192faef4009d42a62c37bdd90a8fJay Srinivasan#include "update_engine/constants.h"
1977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa#include "update_engine/mock_connection_manager.h"
206a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/mock_http_fetcher.h"
216a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/omaha_hash_calculator.h"
226a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/omaha_request_action.h"
23a4a8a8ccc2d9e0285728ed247b43f09433e63323Darin Petkov#include "update_engine/omaha_request_params.h"
24480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan#include "update_engine/prefs.h"
256a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/test_utils.h"
26480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan#include "update_engine/utils.h"
276a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
281cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing base::Time;
291cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing base::TimeDelta;
306a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovusing std::string;
316a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovusing std::vector;
321cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::_;
331cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::AllOf;
3434b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasanusing testing::DoAll;
351cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::Ge;
361cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::Le;
379c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkovusing testing::NiceMock;
381cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::Return;
391cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::SetArgumentPointee;
4033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenusing testing::AnyNumber;
416a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
426a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovnamespace chromeos_update_engine {
436a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
44ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasanclass OmahaRequestActionTest : public ::testing::Test {};
456a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
466a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovnamespace {
47480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
485bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad ArnoldFakeSystemState fake_system_state;
49480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanOmahaRequestParams kDefaultTestParams(
505bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    &fake_system_state,
511cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    OmahaRequestParams::kOsPlatform,
521cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    OmahaRequestParams::kOsVersion,
531cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "service_pack",
541cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "x86-generic",
551cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    OmahaRequestParams::kAppId,
561cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "0.1.0.0",
571cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "en-US",
581cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    "unittest",
59fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov    "OEM MODEL 09235 7471",
60c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa    "ChromeOSFirmware.1.0",
61c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa    "0X0A1",
62d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko    false,   // delta okay
63d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko    false,   // interactive
640a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan    "http://url",
65d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko    false,   // update_disabled
66d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko    "",      // target_version_prefix
67d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko    false,   // use_p2p_for_downloading
68d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko    false);  // use_p2p_for_sharing
691cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
706a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovstring GetNoUpdateResponse(const string& app_id) {
716a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  return string(
7223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
7323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<daystart elapsed_seconds=\"100\"/>"
7423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
7523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
766a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
776a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
78f3e2801f18bae14e41099e007de7c9a019735556David Zeuthenstring GetNoUpdateResponseWithEntity(const string& app_id) {
79f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen  return string(
80f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen      "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
81f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen      "<!DOCTYPE response ["
82f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen      "<!ENTITY CrOS \"ChromeOS\">"
83f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen      "]>"
84f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen      "<response protocol=\"3.0\">"
85f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen      "<daystart elapsed_seconds=\"100\"/>"
86f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen      "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
87f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen      "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
88f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen}
89f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen
90480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanstring GetUpdateResponse2(const string& app_id,
913b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa                          const string& version,
92480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                          const string& more_info_url,
93480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                          const string& prompt,
94480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                          const string& codebase,
9523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                          const string& filename,
96480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                          const string& hash,
97480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                          const string& needsadmin,
98480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                          const string& size,
99480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                          const string& deadline,
1008f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                          const string& max_days_to_scatter,
101639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                          const string& elapsed_days,
1028f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                          bool disable_p2p_for_downloading,
1038f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                          bool disable_p2p_for_sharing) {
10423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  string response =
10523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
10623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "protocol=\"3.0\">"
107639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      "<daystart elapsed_seconds=\"100\"" +
108639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      (elapsed_days.empty() ? "" : (" elapsed_days=\"" + elapsed_days + "\"")) +
109639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      "/>"
11023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"" + app_id + "\" status=\"ok\">"
11123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<ping status=\"ok\"/><updatecheck status=\"ok\">"
11223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<urls><url codebase=\"" + codebase + "\"/></urls>"
1133b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa      "<manifest version=\"" + version + "\">"
11423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<packages><package hash=\"not-used\" name=\"" + filename +  "\" "
11523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "size=\"" + size + "\"/></packages>"
11623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<actions><action event=\"postinstall\" "
1173b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa      "ChromeOSVersion=\"" + version + "\" "
1186a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
1193270f7411f55b872db385d0edffdfed18a684121Andrew de los Reyes      "IsDelta=\"true\" "
120d671e97c8cc87c71a01ee3e4a889753ea9bec35fJay Srinivasan      "IsDeltaPayload=\"true\" "
121480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
122480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      "sha256=\"" + hash + "\" "
12323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "needsadmin=\"" + needsadmin + "\" " +
124480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
1258f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      (disable_p2p_for_downloading ?
1268f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen          "DisableP2PForDownloading=\"true\" " : "") +
1278f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
12823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "/></actions></manifest></updatecheck></app></response>";
12923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  LOG(INFO) << "Response = " << response;
13023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  return response;
131480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
132480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
133480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanstring GetUpdateResponse(const string& app_id,
1343b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa                         const string& version,
135480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                         const string& more_info_url,
136480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                         const string& prompt,
137480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                         const string& codebase,
13823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                         const string& filename,
139480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                         const string& hash,
140480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                         const string& needsadmin,
141480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                         const string& size,
142480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                         const string& deadline) {
143480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  return GetUpdateResponse2(app_id,
1443b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa                            version,
145480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                            more_info_url,
146480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                            prompt,
147480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                            codebase,
14823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                            filename,
149480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                            hash,
150480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                            needsadmin,
151480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                            size,
152480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                            deadline,
1538f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                            "7",
154d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                            "42",    // elapsed_days
155d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                            false,   // disable_p2p_for_downloading
156d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                            false);  // disable_p2p_for sharing
1576a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
1586a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1596a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
1606a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
1616a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaRequestActionTestProcessorDelegate()
1626a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      : loop_(NULL),
163d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold        expected_code_(ErrorCode::kSuccess) {}
1646a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  virtual ~OmahaRequestActionTestProcessorDelegate() {
1656a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
166c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov  virtual void ProcessingDone(const ActionProcessor* processor,
167a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                              ErrorCode code) {
1686a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    ASSERT_TRUE(loop_);
1696a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    g_main_loop_quit(loop_);
1706a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
1716a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1726a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  virtual void ActionCompleted(ActionProcessor* processor,
1736a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                               AbstractAction* action,
174a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                               ErrorCode code) {
1756a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    // make sure actions always succeed
1766a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    if (action->Type() == OmahaRequestAction::StaticType())
177c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov      EXPECT_EQ(expected_code_, code);
1786a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    else
179d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      EXPECT_EQ(ErrorCode::kSuccess, code);
1806a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
1816a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  GMainLoop *loop_;
182a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen  ErrorCode expected_code_;
1836a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
1846a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1856a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovgboolean StartProcessorInRunLoop(gpointer data) {
1866a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
1876a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor->StartProcessing();
1886a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  return FALSE;
1896a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
190d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko}  // namespace
1916a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1926a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass OutputObjectCollectorAction;
1936a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1946a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovtemplate<>
1956a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass ActionTraits<OutputObjectCollectorAction> {
1966a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
1976a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Does not take an object for input
1986a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  typedef OmahaResponse InputObjectType;
1996a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // On success, puts the output path on output
2006a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  typedef NoneType OutputObjectType;
2016a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
2026a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2036a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
2046a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
2056a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OutputObjectCollectorAction() : has_input_object_(false) {}
2066a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  void PerformAction() {
2076a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    // copy input object
2086a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    has_input_object_ = HasInputObject();
2096a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    if (has_input_object_)
2106a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      omaha_response_ = GetInputObject();
211d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold    processor_->ActionComplete(this, ErrorCode::kSuccess);
2126a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
2136a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Should never be called
2146a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  void TerminateProcessing() {
2156a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    CHECK(false);
2166a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
2176a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Debugging/logging
2186a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  static std::string StaticType() {
2196a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    return "OutputObjectCollectorAction";
2206a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
2216a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  std::string Type() const { return StaticType(); }
2226a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  bool has_input_object_;
2236a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse omaha_response_;
2246a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
2256a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2261cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov// Returns true iff an output response was obtained from the
227edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
2288f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen// used. |payload_state| may be NULL, in which case a local mock is used.
2298f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen// |p2p_manager| may be NULL, in which case a local mock is used.
23077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa// |connection_manager| may be NULL, in which case a local mock is used.
2318f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen// out_response may be NULL. If |fail_http_response_code| is non-negative,
232265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov// the transfer will fail with that code. |ping_only| is passed through to the
233265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
234265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov// post-data received by the mock HttpFetcher is returned.
23533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
23633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The |expected_check_result|, |expected_check_reaction| and
23733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// |expected_error_code| parameters are for checking expectations
23833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
23933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UMA statistics. Use the appropriate ::kUnset value to specify that
24033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// the given metric should not be reported.
2411cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovbool TestUpdateCheck(PrefsInterface* prefs,
2428f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                     PayloadStateInterface *payload_state,
2438f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                     P2PManager *p2p_manager,
24477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                     ConnectionManager *connection_manager,
245d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                     OmahaRequestParams* params,
2460dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                     const string& http_response,
247edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                     int fail_http_response_code,
248265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                     bool ping_only,
249a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                     ErrorCode expected_code,
25033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                     metrics::CheckResult expected_check_result,
25133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                     metrics::CheckReaction expected_check_reaction,
25233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                     metrics::DownloadErrorCode expected_download_error_code,
2530dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                     OmahaResponse* out_response,
2540dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                     vector<char>* out_post_data) {
2550dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
2560dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
2574516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                 http_response.size(),
2584516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                 NULL);
259edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  if (fail_http_response_code >= 0) {
260edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov    fetcher->FailTransfer(fail_http_response_code);
261edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  }
2625bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  FakeSystemState fake_system_state;
2636f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  if (prefs)
2645bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    fake_system_state.set_prefs(prefs);
2658f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  if (payload_state)
2665bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    fake_system_state.set_payload_state(payload_state);
2678f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  if (p2p_manager)
2685bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    fake_system_state.set_p2p_manager(p2p_manager);
26977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  if (connection_manager)
27077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa    fake_system_state.set_connection_manager(connection_manager);
271d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  fake_system_state.set_request_params(params);
2725bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  OmahaRequestAction action(&fake_system_state,
2731cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                            NULL,
274116fda3221ff3df037ea1feb271883c87644c839Thieu Le                            fetcher,
275265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                            ping_only);
2766a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaRequestActionTestProcessorDelegate delegate;
2776a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  delegate.loop_ = loop;
278c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov  delegate.expected_code_ = expected_code;
279a4a8a8ccc2d9e0285728ed247b43f09433e63323Darin Petkov
2806a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor processor;
2816a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.set_delegate(&delegate);
2826a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&action);
2836a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2846a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OutputObjectCollectorAction collector_action;
2856a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  BondActions(&action, &collector_action);
2866a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&collector_action);
2876a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2885bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _))
28933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      .Times(AnyNumber());
2905bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
29133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      SendEnumToUMA(metrics::kMetricCheckResult,
29233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen          static_cast<int>(expected_check_result),
29333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen          static_cast<int>(metrics::CheckResult::kNumConstants) - 1))
29433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      .Times(expected_check_result == metrics::CheckResult::kUnset ? 0 : 1);
2955bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
29633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      SendEnumToUMA(metrics::kMetricCheckReaction,
29733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen          static_cast<int>(expected_check_reaction),
29833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen          static_cast<int>(metrics::CheckReaction::kNumConstants) - 1))
29933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      .Times(expected_check_reaction == metrics::CheckReaction::kUnset ? 0 : 1);
3005bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
301c0dd0210d01406df4b88086ea1349a75b8fe0584David Zeuthen      SendSparseToUMA(metrics::kMetricCheckDownloadErrorCode,
302c0dd0210d01406df4b88086ea1349a75b8fe0584David Zeuthen          static_cast<int>(expected_download_error_code)))
30333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      .Times(expected_download_error_code == metrics::DownloadErrorCode::kUnset
30433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen             ? 0 : 1);
30533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
3066a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_timeout_add(0, &StartProcessorInRunLoop, &processor);
3076a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_run(loop);
3086a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_unref(loop);
3096a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  if (collector_action.has_input_object_ && out_response)
3106a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    *out_response = collector_action.omaha_response_;
3116a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  if (out_post_data)
3126a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    *out_post_data = fetcher->post_data();
3136a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  return collector_action.has_input_object_;
3146a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
3156a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
3160dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov// Tests Event requests -- they should always succeed. |out_post_data|
3170dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov// may be null; if non-null, the post-data received by the mock
3180dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov// HttpFetcher is returned.
319480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanvoid TestEvent(OmahaRequestParams params,
3200dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov               OmahaEvent* event,
3210dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov               const string& http_response,
3220dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov               vector<char>* out_post_data) {
3230dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
3240dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
3254516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                 http_response.size(),
3264516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                 NULL);
3275bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  FakeSystemState fake_system_state;
3285bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state.set_request_params(&params);
3295bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  OmahaRequestAction action(&fake_system_state, event, fetcher, false);
3300dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  OmahaRequestActionTestProcessorDelegate delegate;
3310dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  delegate.loop_ = loop;
3320dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ActionProcessor processor;
3330dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  processor.set_delegate(&delegate);
3340dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  processor.EnqueueAction(&action);
3350dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
3360dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  g_timeout_add(0, &StartProcessorInRunLoop, &processor);
3370dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  g_main_loop_run(loop);
3380dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  g_main_loop_unref(loop);
3390dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  if (out_post_data)
3400dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov    *out_post_data = fetcher->post_data();
3410dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
3420dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
343f3e2801f18bae14e41099e007de7c9a019735556David ZeuthenTEST(OmahaRequestActionTest, RejectEntities) {
344f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen  OmahaResponse response;
345f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen  ASSERT_FALSE(
346f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen      TestUpdateCheck(NULL,  // prefs
347f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      NULL,  // payload_state
348f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      NULL,  // p2p_manager
349f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      NULL,  // connection_manager
350f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      &kDefaultTestParams,
351f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      GetNoUpdateResponseWithEntity(OmahaRequestParams::kAppId),
352f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      -1,
353f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      false,  // ping_only
354f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      ErrorCode::kOmahaRequestXMLHasEntityDecl,
355f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      metrics::CheckResult::kParsingError,
356f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      metrics::CheckReaction::kUnset,
357f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      metrics::DownloadErrorCode::kUnset,
358f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      &response,
359f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      NULL));
360f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen  EXPECT_FALSE(response.update_exists);
361f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen}
362f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen
3636a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, NoUpdateTest) {
3646a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
3656a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
3661cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
3678f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
3688f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
36977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
370d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
3710dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
372edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
373265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
374d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
37533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
37633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
37733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
3780dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
3790dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      NULL));
3806a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
3816a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
3826a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
3836a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, ValidUpdateTest) {
3846a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
3856a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
3861cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
3878f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
3888f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
38977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
390d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
3910dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      GetUpdateResponse(OmahaRequestParams::kAppId,
3920dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "1.2.3.4",  // version
3930dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "http://more/info",
3940dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "true",  // prompt
39523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                        "http://code/base/",  // dl url
396d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                        "file.signed",  // file name
3970dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "HASH1234=",  // checksum
3980dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "false",  // needs admin
3996c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "123",  // size
4006c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "20101020"),  // deadline
401edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
402265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
403d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
40433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
40533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
40633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
4070dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
4080dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      NULL));
4096a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_TRUE(response.update_exists);
41034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  EXPECT_TRUE(response.update_exists);
4113b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa  EXPECT_EQ("1.2.3.4", response.version);
4126f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
4136a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("http://more/info", response.more_info_url);
4146a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("HASH1234=", response.hash);
4156a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ(123, response.size);
4166a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_TRUE(response.prompt);
4176c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov  EXPECT_EQ("20101020", response.deadline);
4186a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
4196a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
4200a70874c61118a2b276edc731ad890c6826be2beJay SrinivasanTEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
4210a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  OmahaResponse response;
4220a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
423ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_disabled(true);
4240a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  ASSERT_FALSE(
4250a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan      TestUpdateCheck(NULL,  // prefs
4268f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
4278f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
42877f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
429d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
4300a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      GetUpdateResponse(OmahaRequestParams::kAppId,
4310a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                                        "1.2.3.4",  // version
4320a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                                        "http://more/info",
4330a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                                        "true",  // prompt
43423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                        "http://code/base/",  // dl url
435d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                        "file.signed",  // file name
4360a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                                        "HASH1234=",  // checksum
4370a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                                        "false",  // needs admin
4380a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                                        "123",  // size
439480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                        ""),  // deadline
4400a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      -1,
4410a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      false,  // ping_only
442d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaUpdateIgnoredPerPolicy,
44333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
44433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kIgnored,
44533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
4460a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      &response,
4470a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      NULL));
4480a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  EXPECT_FALSE(response.update_exists);
4490a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan}
4500a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan
45177f79e876a77796fc248d099b6574f05bd23c954Chris SosaTEST(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
45277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  OmahaResponse response;
45377f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  // Set up a connection manager that doesn't allow a valid update over
45477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  // the current ethernet connection.
45577f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  MockConnectionManager mock_cm(NULL);
456d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  EXPECT_CALL(mock_cm, GetConnectionProperties(_, _, _))
45777f79e876a77796fc248d099b6574f05bd23c954Chris Sosa    .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetEthernet),
45877f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                          SetArgumentPointee<2>(NetworkTethering::kUnknown),
45977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                          Return(true)));
46077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  EXPECT_CALL(mock_cm, IsUpdateAllowedOver(kNetEthernet, _))
46177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa    .WillRepeatedly(Return(false));
46277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  EXPECT_CALL(mock_cm, StringForConnectionType(kNetEthernet))
46377f79e876a77796fc248d099b6574f05bd23c954Chris Sosa    .WillRepeatedly(Return(shill::kTypeEthernet));
46477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa
46577f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  ASSERT_FALSE(
46677f79e876a77796fc248d099b6574f05bd23c954Chris Sosa      TestUpdateCheck(NULL,  // prefs
46777f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // payload_state
46877f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // p2p_manager
469d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &mock_cm,  // connection_manager
470d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
47177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      GetUpdateResponse(OmahaRequestParams::kAppId,
47277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        "1.2.3.4",  // version
47377f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        "http://more/info",
47477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        "true",  // prompt
47577f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        "http://code/base/",  // dl url
476d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                        "file.signed",  // file name
47777f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        "HASH1234=",  // checksum
47877f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        "false",  // needs admin
47977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        "123",  // size
48077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        ""),  // deadline
48177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      -1,
48277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      false,  // ping_only
483d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaUpdateIgnoredPerPolicy,
48477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      metrics::CheckResult::kUpdateAvailable,
48577f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      metrics::CheckReaction::kIgnored,
48677f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      metrics::DownloadErrorCode::kUnset,
48777f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      &response,
48877f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL));
48977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  EXPECT_FALSE(response.update_exists);
49077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa}
49177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa
49277f79e876a77796fc248d099b6574f05bd23c954Chris SosaTEST(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
49377f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  string rollback_version = "1234.0.0";
49477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  OmahaResponse response;
49577f79e876a77796fc248d099b6574f05bd23c954Chris Sosa
49677f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  MockPayloadState mock_payload_state;
49777f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  EXPECT_CALL(mock_payload_state, GetRollbackVersion())
49877f79e876a77796fc248d099b6574f05bd23c954Chris Sosa    .WillRepeatedly(Return(rollback_version));
49977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa
50077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  ASSERT_FALSE(
50177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa      TestUpdateCheck(NULL,  // prefs
50277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      &mock_payload_state,  // payload_state
50377f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // p2p_manager
50477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
505d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
50677f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      GetUpdateResponse(OmahaRequestParams::kAppId,
50777f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        rollback_version,  // version
50877f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        "http://more/info",
50977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        "true",  // prompt
51077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        "http://code/base/",  // dl url
511d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                        "file.signed",  // file name
51277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        "HASH1234=",  // checksum
51377f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        "false",  // needs admin
51477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        "123",  // size
51577f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                        ""),  // deadline
51677f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      -1,
51777f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      false,  // ping_only
518d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaUpdateIgnoredPerPolicy,
51977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      metrics::CheckResult::kUpdateAvailable,
52077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      metrics::CheckReaction::kIgnored,
52177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      metrics::DownloadErrorCode::kUnset,
52277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      &response,
52377f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL));
52477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  EXPECT_FALSE(response.update_exists);
52577f79e876a77796fc248d099b6574f05bd23c954Chris Sosa}
52677f79e876a77796fc248d099b6574f05bd23c954Chris Sosa
5270a70874c61118a2b276edc731ad890c6826be2beJay SrinivasanTEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
5280a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  OmahaResponse response;
5290a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
530ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_disabled(true);
5310a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  ASSERT_TRUE(
5320a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan      TestUpdateCheck(NULL,  // prefs
5338f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
5348f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
53577f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
536d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
5370a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
5380a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      -1,
5390a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      false,  // ping_only
540d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
54133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
54233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
54333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
5440a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      &response,
5450a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                      NULL));
5460a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  EXPECT_FALSE(response.update_exists);
5470a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan}
5480a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan
549480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanTEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
550480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
551480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
552ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
553ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(false);
554ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta::FromDays(2));
555480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
556480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  string prefs_dir;
557a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
558480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                       &prefs_dir));
559480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
560480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
561480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  Prefs prefs;
56275039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
563480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      << "Failed to initialize preferences.";
564480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
565480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_FALSE(
566480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      TestUpdateCheck(&prefs,  // prefs
5678f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
5688f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
56977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
570d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
571480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
572480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "1.2.3.4",  // version
573480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "http://more/info",
574480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "true",  // prompt
57523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
576d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "file.signed",  // file name
577480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "HASH1234=",  // checksum
578480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "false",  // needs admin
579480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "123",  // size
580480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "",  // deadline
581d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "7",  // max days to scatter
582d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "42",  // elapsed_days
5838f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
584d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         false),  // disable_p2p_for sharing
585480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
586480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
587d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaUpdateDeferredPerPolicy,
58833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
58933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kDeferring,
59033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
591480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
592480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      NULL));
593480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_FALSE(response.update_exists);
594968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa
595968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  // Verify if we are interactive check we don't defer.
596968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  params.set_interactive(true);
597968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  ASSERT_TRUE(
598968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa      TestUpdateCheck(&prefs,  // prefs
5998f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
6008f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
60177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
602d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
603968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      GetUpdateResponse2(OmahaRequestParams::kAppId,
604968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "1.2.3.4",  // version
605968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://more/info",
606968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "true",  // prompt
607968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://code/base/",  // dl url
608d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "file.signed",  // file name
609968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "HASH1234=",  // checksum
610968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "false",  // needs admin
611968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "123",  // size
612968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "",  // deadline
613d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "7",  // max days to scatter
614d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "42",  // elapsed_days
6158f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
616d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         false),  // disable_p2p_for sharing
617968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      -1,
618968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      false,  // ping_only
619d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
62033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
62133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
62233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
623968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      &response,
624968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      NULL));
625968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  EXPECT_TRUE(response.update_exists);
626480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
627480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
628480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanTEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
629480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
630480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
631ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(false);
632ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta::FromDays(2));
633480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
634ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(true);
635ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_min_update_checks_needed(1);
636ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_max_update_checks_allowed(8);
637480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
638480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  string prefs_dir;
639a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
640480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                       &prefs_dir));
641480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
642480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
643480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  Prefs prefs;
64475039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
645480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      << "Failed to initialize preferences.";
646480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
647480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(
648480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      TestUpdateCheck(&prefs,  // prefs
6498f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
6508f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
65177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
652d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
653480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
654480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "1.2.3.4",  // version
655480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "http://more/info",
656480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "true",  // prompt
65723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
658d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "file.signed",  // file name
659480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "HASH1234=",  // checksum
660480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "false",  // needs admin
661480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "123",  // size
662480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "",  // deadline
663d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "7",  // max days to scatter
664d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "42",  // elapsed_days
6658f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
666d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         false),  // disable_p2p_for sharing
667480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
668480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
669d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
67033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
67133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
67233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
673480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
674480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      NULL));
675480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_TRUE(response.update_exists);
676480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
677480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
678480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanTEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
679480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
680480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
681ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
682ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta::FromDays(2));
683480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
684ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(true);
685ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_min_update_checks_needed(1);
686ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_max_update_checks_allowed(8);
687480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
688480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  string prefs_dir;
689a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
690480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                       &prefs_dir));
691480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
692480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
693480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  Prefs prefs;
69475039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
695480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      << "Failed to initialize preferences.";
696480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
697480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(
698480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      TestUpdateCheck(&prefs,  // prefs
6998f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
7008f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
70177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
702d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
703480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
704480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "1.2.3.4",  // version
705480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "http://more/info",
706480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "true",  // prompt
70723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
708d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "file.signed",  // file name
709480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "HASH1234=",  // checksum
710480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "false",  // needs admin
711480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "123",  // size
712480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "",  // deadline
713d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "0",  // max days to scatter
714d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "42",  // elapsed_days
7158f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
716d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         false),  // disable_p2p_for sharing
717480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
718480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
719d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
72033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
72133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
72233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
723480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
724480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      NULL));
725480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_TRUE(response.update_exists);
726480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
727480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
728480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
729480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanTEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
730480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
731480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
732ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
733ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta());
734480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
735ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(true);
736ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_min_update_checks_needed(0);
737ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_max_update_checks_allowed(0);
738480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
739480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  string prefs_dir;
740a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
741480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                       &prefs_dir));
742480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
743480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
744480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  Prefs prefs;
74575039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
746480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      << "Failed to initialize preferences.";
747480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
748480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(TestUpdateCheck(
749480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &prefs,  // prefs
7508f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
7518f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
75277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
753d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
754480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
755480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "1.2.3.4",  // version
756480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "http://more/info",
757480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "true",  // prompt
75823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
759d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "file.signed",  // file name
760480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "HASH1234=",  // checksum
761480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "false",  // needs admin
762480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "123",  // size
763480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "",  // deadline
764d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "7",  // max days to scatter
765d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "42",  // elapsed_days
7668f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
767d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         false),  // disable_p2p_for sharing
768480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
769480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
770d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
77133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
77233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
77333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
774480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
775480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      NULL));
776480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
7779abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t count;
778480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
779d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  ASSERT_EQ(count, 0);
780480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_TRUE(response.update_exists);
781480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
782480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
783480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanTEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
784480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
785480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
786ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
787ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta());
788480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
789ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(true);
790ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_min_update_checks_needed(1);
791ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_max_update_checks_allowed(8);
792480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
793480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  string prefs_dir;
794a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
795480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                       &prefs_dir));
796480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
797480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
798480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  Prefs prefs;
79975039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
800480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      << "Failed to initialize preferences.";
801480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
802480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_FALSE(TestUpdateCheck(
803480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &prefs,  // prefs
8048f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
8058f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
80677f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,    // connection_manager
807d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
808480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
809480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "1.2.3.4",  // version
810480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "http://more/info",
811480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "true",  // prompt
81223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
813d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "file.signed",  // file name
814480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "HASH1234=",  // checksum
815480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "false",  // needs admin
816480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "123",  // size
817480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "",  // deadline
818d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "7",  // max days to scatter
819d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "42",  // elapsed_days
8208f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
821d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         false),  // disable_p2p_for sharing
822480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
823480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
824d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaUpdateDeferredPerPolicy,
82533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
82633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kDeferring,
82733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
828480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
829480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      NULL));
830480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
8319abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t count;
832480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
833d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  ASSERT_GT(count, 0);
834480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_FALSE(response.update_exists);
835968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa
836968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  // Verify if we are interactive check we don't defer.
837968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  params.set_interactive(true);
838968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  ASSERT_TRUE(
839968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa      TestUpdateCheck(&prefs,  // prefs
8408f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
8418f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
84277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
843d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
844968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      GetUpdateResponse2(OmahaRequestParams::kAppId,
845968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "1.2.3.4",  // version
846968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://more/info",
847968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "true",  // prompt
848968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://code/base/",  // dl url
849d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "file.signed",  // file name
850968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "HASH1234=",  // checksum
851968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "false",  // needs admin
852968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "123",  // size
853968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "",  // deadline
854d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "7",  // max days to scatter
855d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "42",  // elapsed_days
8568f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
857d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         false),  // disable_p2p_for sharing
858968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      -1,
859968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      false,  // ping_only
860d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
86133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
86233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
86333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
864968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      &response,
865968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      NULL));
866968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  EXPECT_TRUE(response.update_exists);
867480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
868480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
869480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanTEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
870480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
871480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
872ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
873ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta());
874480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
875ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(true);
876ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_min_update_checks_needed(1);
877ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_max_update_checks_allowed(8);
878480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
879480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  string prefs_dir;
880a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
881480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                       &prefs_dir));
882480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
883480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
884480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  Prefs prefs;
88575039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
886480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      << "Failed to initialize preferences.";
887480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
888480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
889480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
890480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_FALSE(TestUpdateCheck(
891480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &prefs,  // prefs
8928f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
8938f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
89477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
895d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
896480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
897480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "1.2.3.4",  // version
898480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "http://more/info",
899480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "true",  // prompt
90023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
901d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "file.signed",  // file name
902480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "HASH1234=",  // checksum
903480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "false",  // needs admin
904480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "123",  // size
905480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                                         "",  // deadline
906d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "7",  // max days to scatter
907d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "42",  // elapsed_days
9088f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
909d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         false),  // disable_p2p_for sharing
910480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
911480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
912d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaUpdateDeferredPerPolicy,
91333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
91433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kDeferring,
91533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
916480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
917480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      NULL));
918480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
9199abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t count;
920480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
921480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  // count remains the same, as the decrementing happens in update_attempter
922480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  // which this test doesn't exercise.
923d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  ASSERT_EQ(count, 5);
924480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_FALSE(response.update_exists);
925968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa
926968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  // Verify if we are interactive check we don't defer.
927968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  params.set_interactive(true);
928968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  ASSERT_TRUE(
929968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa      TestUpdateCheck(&prefs,  // prefs
9308f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
9318f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
93277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
933d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
934968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      GetUpdateResponse2(OmahaRequestParams::kAppId,
935968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "1.2.3.4",  // version
936968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://more/info",
937968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "true",  // prompt
938968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://code/base/",  // dl url
939d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "file.signed",  // file name
940968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "HASH1234=",  // checksum
941968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "false",  // needs admin
942968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "123",  // size
943968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "",  // deadline
944d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "7",  // max days to scatter
945d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "42",  // elapsed_days
9468f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
947d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         false),  // disable_p2p_for sharing
948968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      -1,
949968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      false,  // ping_only
950d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
95133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
95233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
95333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
954968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      &response,
955968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      NULL));
956968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  EXPECT_TRUE(response.update_exists);
957480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
9580a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan
9596a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, NoOutputPipeTest) {
9606a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
9616a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
9626a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
9636a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
9645bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  FakeSystemState fake_system_state;
965480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
9665bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state.set_request_params(&params);
9675bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  OmahaRequestAction action(&fake_system_state, NULL,
9680dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                            new MockHttpFetcher(http_response.data(),
9694516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                http_response.size(),
970116fda3221ff3df037ea1feb271883c87644c839Thieu Le                                                NULL),
971116fda3221ff3df037ea1feb271883c87644c839Thieu Le                            false);
9726a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaRequestActionTestProcessorDelegate delegate;
9736a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  delegate.loop_ = loop;
9746a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor processor;
9756a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.set_delegate(&delegate);
9766a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&action);
9776a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
9786a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_timeout_add(0, &StartProcessorInRunLoop, &processor);
9796a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_run(loop);
9806a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_unref(loop);
9816a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(processor.IsRunning());
9826a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
9836a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
9846a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, InvalidXmlTest) {
9856a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
9866a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_FALSE(
9871cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
9888f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
9898f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
99077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
991d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
9920dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      "invalid xml>",
993edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
994265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
995d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaRequestXMLParseError,
99633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kParsingError,
99733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
99833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
999edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      &response,
1000edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      NULL));
1001edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  EXPECT_FALSE(response.update_exists);
1002edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov}
1003edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov
1004edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin PetkovTEST(OmahaRequestActionTest, EmptyResponseTest) {
1005edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  OmahaResponse response;
1006edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  ASSERT_FALSE(
1007edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      TestUpdateCheck(NULL,  // prefs
10088f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
10098f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
101077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1011d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
1012edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      "",
1013edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1014265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1015d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaRequestEmptyResponseError,
101633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kParsingError,
101733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
101833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
10190dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
10200dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      NULL));
10216a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
10226a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
10236a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
10246a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, MissingStatusTest) {
10256a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
10260dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ASSERT_FALSE(TestUpdateCheck(
10271cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      NULL,  // prefs
10288f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      NULL,  // payload_state
10298f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      NULL,  // p2p_manager
103077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa      NULL,  // connection_manager
1031d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko      &kDefaultTestParams,
103223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
103323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<daystart elapsed_seconds=\"100\"/>"
103423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"foo\" status=\"ok\">"
103523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<ping status=\"ok\"/>"
103623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<updatecheck/></app></response>",
1037edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      -1,
1038265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov      false,  // ping_only
1039d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      ErrorCode::kOmahaResponseInvalid,
104033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckResult::kParsingError,
104133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckReaction::kUnset,
104233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::DownloadErrorCode::kUnset,
10436a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      &response,
10446a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      NULL));
10456a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
10466a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
10476a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
10486a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, InvalidStatusTest) {
10496a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
10500dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ASSERT_FALSE(TestUpdateCheck(
10511cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      NULL,  // prefs
10528f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      NULL,  // payload_state
10538f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      NULL,  // p2p_manager
105477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa      NULL,  // connection_manager
1055d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko      &kDefaultTestParams,
105623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
105723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<daystart elapsed_seconds=\"100\"/>"
105823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"foo\" status=\"ok\">"
105923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<ping status=\"ok\"/>"
106023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
1061edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      -1,
1062265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov      false,  // ping_only
1063d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      ErrorCode::kOmahaResponseInvalid,
106433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckResult::kParsingError,
106533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckReaction::kUnset,
106633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::DownloadErrorCode::kUnset,
10676a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      &response,
10686a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      NULL));
10696a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
10706a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
10716a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
10726a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, MissingNodesetTest) {
10736a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
10740dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ASSERT_FALSE(TestUpdateCheck(
10751cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      NULL,  // prefs
10768f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      NULL,  // payload_state
10778f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      NULL,  // p2p_manager
107877f79e876a77796fc248d099b6574f05bd23c954Chris Sosa      NULL,  // connection_manager
1079d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko      &kDefaultTestParams,
108023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
108123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<daystart elapsed_seconds=\"100\"/>"
108223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"foo\" status=\"ok\">"
108323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<ping status=\"ok\"/>"
108423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "</app></response>",
1085edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      -1,
1086265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov      false,  // ping_only
1087d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      ErrorCode::kOmahaResponseInvalid,
108833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckResult::kParsingError,
108933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckReaction::kUnset,
109033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::DownloadErrorCode::kUnset,
10916a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      &response,
10926a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      NULL));
10936a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
10946a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
10956a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
10966a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, MissingFieldTest) {
109723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  string input_response =
109823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
109923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<daystart elapsed_seconds=\"100\"/>"
110023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"xyz\" status=\"ok\">"
110123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<updatecheck status=\"ok\">"
110223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
11033b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa      "<manifest version=\"10.2.3.4\">"
110423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<packages><package hash=\"not-used\" name=\"f\" "
110523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "size=\"587\"/></packages>"
110623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<actions><action event=\"postinstall\" "
110723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "ChromeOSVersion=\"10.2.3.4\" "
110823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "Prompt=\"false\" "
110923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "IsDelta=\"true\" "
1110d671e97c8cc87c71a01ee3e4a889753ea9bec35fJay Srinivasan      "IsDeltaPayload=\"false\" "
111123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "sha256=\"lkq34j5345\" "
111223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "needsadmin=\"true\" "
111323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "/></actions></manifest></updatecheck></app></response>";
111423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  LOG(INFO) << "Input Response = " << input_response;
111523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan
11166a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
11171cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(TestUpdateCheck(NULL,  // prefs
11188f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              NULL,  // payload_state
11198f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              NULL,  // p2p_manager
112077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                              NULL,  // connection_manager
1121d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                              &kDefaultTestParams,
112223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                              input_response,
1123edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                              -1,
1124265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                              false,  // ping_only
1125d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                              ErrorCode::kSuccess,
112633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              metrics::CheckResult::kUpdateAvailable,
112733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              metrics::CheckReaction::kUpdating,
112833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              metrics::DownloadErrorCode::kUnset,
11290dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                              &response,
11300dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                              NULL));
11316a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_TRUE(response.update_exists);
11323b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa  EXPECT_EQ("10.2.3.4", response.version);
11336f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
11346a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("", response.more_info_url);
113523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ("lkq34j5345", response.hash);
113623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(587, response.size);
11376a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.prompt);
11386c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov  EXPECT_TRUE(response.deadline.empty());
11396a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
11406a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
11416a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovnamespace {
11426a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
11436a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
11446a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  void ProcessingStopped(const ActionProcessor* processor) {
11456a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    ASSERT_TRUE(loop_);
11466a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    g_main_loop_quit(loop_);
11476a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
11486a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  GMainLoop *loop_;
11496a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
11506a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
11516a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovgboolean TerminateTransferTestStarter(gpointer data) {
11526a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
11536a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor->StartProcessing();
11546a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  CHECK(processor->IsRunning());
11556a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor->StopProcessing();
11566a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  return FALSE;
11576a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
1158d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko}  // namespace
11596a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
11606a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, TerminateTransferTest) {
11616a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  string http_response("doesn't matter");
11626a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
11636a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
11645bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  FakeSystemState fake_system_state;
1165480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
11665bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state.set_request_params(&params);
11675bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  OmahaRequestAction action(&fake_system_state, NULL,
11680dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                            new MockHttpFetcher(http_response.data(),
11694516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                http_response.size(),
1170116fda3221ff3df037ea1feb271883c87644c839Thieu Le                                                NULL),
1171116fda3221ff3df037ea1feb271883c87644c839Thieu Le                            false);
11726a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  TerminateEarlyTestProcessorDelegate delegate;
11736a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  delegate.loop_ = loop;
11746a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor processor;
11756a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.set_delegate(&delegate);
11766a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&action);
11776a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
11786a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_timeout_add(0, &TerminateTransferTestStarter, &processor);
11796a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_run(loop);
11806a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  g_main_loop_unref(loop);
11816a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
11826a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
11836a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, XmlEncodeTest) {
11846a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("ab", XmlEncode("ab"));
11856a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
11866a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
11876a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
11886a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
11896a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  vector<char> post_data;
11906a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
11916a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Make sure XML Encode is being called on the params
11925bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  FakeSystemState fake_system_state;
11935bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  OmahaRequestParams params(&fake_system_state,
1194ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                            OmahaRequestParams::kOsPlatform,
11956a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            OmahaRequestParams::kOsVersion,
11966a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            "testtheservice_pack>",
11971cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                            "x86 generic<id",
11986a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            OmahaRequestParams::kAppId,
11996a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            "0.1.0.0",
12006a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            "en-US",
12011cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                            "unittest_track&lt;",
1202fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov                            "<OEM MODEL>",
1203c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                            "ChromeOSFirmware.1.0",
1204c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                            "EC100",
1205d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                            false,   // delta okay
1206d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                            false,   // interactive
12070a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                            "http://url",
1208d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                            false,   // update_disabled
1209d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                            "",      // target_version_prefix
1210d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                            false,   // use_p2p_for_downloading
1211d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                            false);  // use_p2p_for_sharing
12126a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
12136a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_FALSE(
12141cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
12158f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
12168f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
121777f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1218d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
12190dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      "invalid xml>",
1220edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1221265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1222d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaRequestXMLParseError,
122333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kParsingError,
122433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
122533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
12260dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
12270dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &post_data));
12286a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // convert post_data to string
12296a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  string post_str(&post_data[0], post_data.size());
12306a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
12316a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
12321cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
12331cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
12341cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
12351cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
1236fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov  EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
1237fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov  EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
12386a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
12396a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
12406a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, XmlDecodeTest) {
12416a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
12426a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
12431cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
12448f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
12458f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
124677f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1247d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
12480dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      GetUpdateResponse(OmahaRequestParams::kAppId,
12490dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "1.2.3.4",  // version
12500dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "testthe&lt;url",  // more info
12510dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "true",  // prompt
125223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                        "testthe&amp;codebase/",  // dl url
1253d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                        "file.signed",  // file name
1254d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                        "HASH1234=",  // checksum
12550dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "false",  // needs admin
12566c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "123",  // size
12576c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "&lt;20110101"),  // deadline
1258edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1259265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1260d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
126133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
126233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
126333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
12640dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
12650dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      NULL));
12666a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
12676a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ(response.more_info_url, "testthe<url");
12686f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
12696c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov  EXPECT_EQ(response.deadline, "<20110101");
12706a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
12716a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
12726a5b3229b44c1f81ee153829e9b501e547f29926Darin PetkovTEST(OmahaRequestActionTest, ParseIntTest) {
12736a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
12746a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
12751cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(NULL,  // prefs
12768f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
12778f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
127877f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1279d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
12800dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      GetUpdateResponse(OmahaRequestParams::kAppId,
12810dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "1.2.3.4",  // version
12820dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "theurl",  // more info
12830dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "true",  // prompt
128423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                        "thecodebase/",  // dl url
1285d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                        "file.signed",  // file name
1286d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                        "HASH1234=",  // checksum
12870dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                                        "false",  // needs admin
12889abb763fa3840d69cc1098c0233162557a7f99eaBen Chan                                        // overflows int32_t:
12896c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "123123123123123",  // size
12906c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov                                        "deadline"),
1291edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1292265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1293d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
129433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
129533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
129633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
12970dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
12980dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      NULL));
12996a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
13006a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ(response.size, 123123123123123ll);
13016a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
13026a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
13030dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin PetkovTEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
13040dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  vector<char> post_data;
130595508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  NiceMock<PrefsMock> prefs;
130695508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
130795508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
1308ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
130995508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  ASSERT_FALSE(TestUpdateCheck(&prefs,
13108f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,  // payload_state
13118f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,  // p2p_manager
131277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                               NULL,  // connection_manager
1313d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                               &kDefaultTestParams,
13140dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                               "invalid xml>",
1315edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                               -1,
1316265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                               false,  // ping_only
1317d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                               ErrorCode::kOmahaRequestXMLParseError,
131833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckResult::kParsingError,
131933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckReaction::kUnset,
132033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::DownloadErrorCode::kUnset,
13211cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                               NULL,  // response
13220dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                               &post_data));
13230dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  // convert post_data to string
13240dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  string post_str(&post_data[0], post_data.size());
1325116fda3221ff3df037ea1feb271883c87644c839Thieu Le  EXPECT_NE(post_str.find(
132623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "        <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
1327ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "        <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
13280a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan      string::npos);
1329fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov  EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1330fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov            string::npos);
1331c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa  EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1332c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa            string::npos);
1333c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa  EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1334c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa            string::npos);
13350dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
13360dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
13370a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan
1338ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST(OmahaRequestActionTest, FormatUpdateDisabledOutputTest) {
133995508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  vector<char> post_data;
134095508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  NiceMock<PrefsMock> prefs;
134195508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
13420a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan      .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
1343ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
13440a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
1345ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_disabled(true);
134695508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  ASSERT_FALSE(TestUpdateCheck(&prefs,
13478f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,  // payload_state
13488f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,  // p2p_manager
134977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                               NULL,  // connection_manager
1350d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                               &params,
135195508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov                               "invalid xml>",
135295508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov                               -1,
1353265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                               false,  // ping_only
1354d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                               ErrorCode::kOmahaRequestXMLParseError,
135533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckResult::kParsingError,
135633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckReaction::kUnset,
135733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::DownloadErrorCode::kUnset,
135895508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov                               NULL,  // response
135995508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov                               &post_data));
136095508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  // convert post_data to string
136195508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  string post_str(&post_data[0], post_data.size());
1362116fda3221ff3df037ea1feb271883c87644c839Thieu Le  EXPECT_NE(post_str.find(
136323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "        <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
1364ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "        <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
13650a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan      string::npos);
136695508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
136795508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov            string::npos);
1368c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa  EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1369c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa            string::npos);
1370c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa  EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1371c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa            string::npos);
137295508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov}
137395508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov
1374e17f86bae4299882232d3e6858ada68692e80501Darin PetkovTEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
1375e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  vector<char> post_data;
13761cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  TestEvent(kDefaultTestParams,
1377e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
1378e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            "invalid xml>",
1379e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            &post_data);
1380e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  // convert post_data to string
1381e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  string post_str(&post_data[0], post_data.size());
138275039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  string expected_event = base::StringPrintf(
138323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "        <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
1384e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kTypeUpdateDownloadStarted,
1385e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kResultSuccess);
1386e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_NE(post_str.find(expected_event), string::npos);
138723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(post_str.find("ping"), string::npos);
138823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(post_str.find("updatecheck"), string::npos);
1389e17f86bae4299882232d3e6858ada68692e80501Darin Petkov}
1390e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
1391e17f86bae4299882232d3e6858ada68692e80501Darin PetkovTEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
1392e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  vector<char> post_data;
13931cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  TestEvent(kDefaultTestParams,
1394e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
1395e17f86bae4299882232d3e6858ada68692e80501Darin Petkov                           OmahaEvent::kResultError,
1396d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                           ErrorCode::kError),
1397e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            "invalid xml>",
1398e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            &post_data);
1399e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  // convert post_data to string
1400e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  string post_str(&post_data[0], post_data.size());
140175039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  string expected_event = base::StringPrintf(
140223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "        <event eventtype=\"%d\" eventresult=\"%d\" "
140323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "errorcode=\"%d\"></event>\n",
1404e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kTypeDownloadComplete,
1405e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kResultError,
1406d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      static_cast<int>(ErrorCode::kError));
14070dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  EXPECT_NE(post_str.find(expected_event), string::npos);
140823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(post_str.find("updatecheck"), string::npos);
14090dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
14100dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
14110dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin PetkovTEST(OmahaRequestActionTest, IsEventTest) {
14120dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  string http_response("doesn't matter");
14135bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  FakeSystemState fake_system_state;
1414480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
14155bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state.set_request_params(&params);
14160dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  OmahaRequestAction update_check_action(
14175bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold      &fake_system_state,
14180dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov      NULL,
14190dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov      new MockHttpFetcher(http_response.data(),
14204516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                          http_response.size(),
1421116fda3221ff3df037ea1feb271883c87644c839Thieu Le                          NULL),
1422116fda3221ff3df037ea1feb271883c87644c839Thieu Le      false);
14230dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  EXPECT_FALSE(update_check_action.IsEvent());
14240dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
1425480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  params = kDefaultTestParams;
14265bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state.set_request_params(&params);
14270dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  OmahaRequestAction event_action(
14285bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold      &fake_system_state,
1429e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
14300dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov      new MockHttpFetcher(http_response.data(),
14314516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                          http_response.size(),
1432116fda3221ff3df037ea1feb271883c87644c839Thieu Le                          NULL),
1433116fda3221ff3df037ea1feb271883c87644c839Thieu Le      false);
14340dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  EXPECT_TRUE(event_action.IsEvent());
14350dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
14360dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
14373f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los ReyesTEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
14383f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes  for (int i = 0; i < 2; i++) {
14393f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    bool delta_okay = i == 1;
14403f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    const char* delta_okay_str = delta_okay ? "true" : "false";
14413f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    vector<char> post_data;
14425bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    FakeSystemState fake_system_state;
14435bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    OmahaRequestParams params(&fake_system_state,
1444ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                              OmahaRequestParams::kOsPlatform,
14453f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              OmahaRequestParams::kOsVersion,
14463f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "service_pack",
14473f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "x86-generic",
14483f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              OmahaRequestParams::kAppId,
14493f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "0.1.0.0",
14503f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "en-US",
14513f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "unittest_track",
1452fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov                              "OEM MODEL REV 1234",
1453c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                              "ChromeOSFirmware.1.0",
1454c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                              "EC100",
14553f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              delta_okay,
1456bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              false,  // interactive
14570a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                              "http://url",
14588f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              false,  // update_disabled
14598f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              "",     // target_version_prefix
14608f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              false,  // use_p2p_for_downloading
1461d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                              false);  // use_p2p_for_sharing
14621cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov    ASSERT_FALSE(TestUpdateCheck(NULL,  // prefs
14638f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                 NULL,  // payload_state
14648f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                 NULL,  // p2p_manager
146577f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                 NULL,  // connection_manager
1466d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                 &params,
14673f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                                 "invalid xml>",
1468edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                                 -1,
1469265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                                 false,  // ping_only
1470d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                                 ErrorCode::kOmahaRequestXMLParseError,
147133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::CheckResult::kParsingError,
147233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::CheckReaction::kUnset,
147333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::DownloadErrorCode::kUnset,
14743f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                                 NULL,
14753f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                                 &post_data));
14763f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    // convert post_data to string
147775039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko    string post_str(post_data.data(), post_data.size());
147875039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko    EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
147975039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko                                               delta_okay_str)),
14803f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes              string::npos)
14813f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes        << "i = " << i;
14823f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes  }
14833f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes}
14843f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes
1485bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad ArnoldTEST(OmahaRequestActionTest, FormatInteractiveOutputTest) {
1486bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold  for (int i = 0; i < 2; i++) {
1487bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold    bool interactive = i == 1;
14888a659d80dc1912c664ef16f0bc66acaa01bd8b73Gilad Arnold    const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
1489bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold    vector<char> post_data;
14905bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    FakeSystemState fake_system_state;
14915bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    OmahaRequestParams params(&fake_system_state,
1492ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                              OmahaRequestParams::kOsPlatform,
1493bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              OmahaRequestParams::kOsVersion,
1494bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "service_pack",
1495bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "x86-generic",
1496bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              OmahaRequestParams::kAppId,
1497bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "0.1.0.0",
1498bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "en-US",
1499bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "unittest_track",
1500bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "OEM MODEL REV 1234",
1501c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                              "ChromeOSFirmware.1.0",
1502c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                              "EC100",
15038f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              true,   // delta_okay
1504bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              interactive,
1505bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "http://url",
15068f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              false,  // update_disabled
15078f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              "",     // target_version_prefix
15088f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              false,  // use_p2p_for_downloading
1509d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                              false);  // use_p2p_for_sharing
1510bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold    ASSERT_FALSE(TestUpdateCheck(NULL,  // prefs
15118f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                 NULL,  // payload_state
15128f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                 NULL,  // p2p_manager
151377f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                                 NULL,  // connection_manager
1514d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                 &params,
1515bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                                 "invalid xml>",
1516bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                                 -1,
1517bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                                 false,  // ping_only
1518d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                                 ErrorCode::kOmahaRequestXMLParseError,
151933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::CheckResult::kParsingError,
152033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::CheckReaction::kUnset,
152133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::DownloadErrorCode::kUnset,
1522bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                                 NULL,
1523bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                                 &post_data));
1524bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold    // convert post_data to string
1525bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold    string post_str(&post_data[0], post_data.size());
152675039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko    EXPECT_NE(post_str.find(base::StringPrintf("installsource=\"%s\"",
152775039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko                                               interactive_str)),
1528bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold              string::npos)
1529bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold        << "i = " << i;
1530bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold  }
1531bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold}
1532bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold
1533e17f86bae4299882232d3e6858ada68692e80501Darin PetkovTEST(OmahaRequestActionTest, OmahaEventTest) {
1534e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  OmahaEvent default_event;
1535e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1536e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
1537d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  EXPECT_EQ(ErrorCode::kError, default_event.error_code);
1538e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
1539e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1540e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1541e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
1542d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
1543e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
1544e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1545e17f86bae4299882232d3e6858ada68692e80501Darin Petkov                         OmahaEvent::kResultError,
1546d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                         ErrorCode::kError);
1547e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1548e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
1549d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  EXPECT_EQ(ErrorCode::kError, error_event.error_code);
1550e17f86bae4299882232d3e6858ada68692e80501Darin Petkov}
1551e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
15521cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, PingTest) {
1553265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov  for (int ping_only = 0; ping_only < 2; ping_only++) {
1554265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    NiceMock<PrefsMock> prefs;
155533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
155633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      .Times(AnyNumber());
155733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
1558265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    // Add a few hours to the day difference to test no rounding, etc.
1559265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    int64_t five_days_ago =
1560265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov        (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1561265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    int64_t six_days_ago =
1562265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov        (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1563639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1564639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen        .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
1565265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1566265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov        .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1567265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1568265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov        .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1569265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    vector<char> post_data;
1570265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    ASSERT_TRUE(
1571265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov        TestUpdateCheck(&prefs,
15728f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                        NULL,  // payload_state
15738f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                        NULL,  // p2p_manager
157477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                        NULL,  // connection_manager
1575d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                        &kDefaultTestParams,
1576265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                        GetNoUpdateResponse(OmahaRequestParams::kAppId),
1577265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                        -1,
1578265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                        ping_only,
1579d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                        ErrorCode::kSuccess,
158033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                        metrics::CheckResult::kUnset,
158133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                        metrics::CheckReaction::kUnset,
158233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                        metrics::DownloadErrorCode::kUnset,
1583265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                        NULL,
1584265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                        &post_data));
1585265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    string post_str(&post_data[0], post_data.size());
158623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan    EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
1587265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov              string::npos);
1588265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    if (ping_only) {
158923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      EXPECT_EQ(post_str.find("updatecheck"), string::npos);
1590265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov      EXPECT_EQ(post_str.find("previousversion"), string::npos);
1591265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    } else {
159223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      EXPECT_NE(post_str.find("updatecheck"), string::npos);
1593265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov      EXPECT_NE(post_str.find("previousversion"), string::npos);
1594265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov    }
1595265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov  }
15961cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
15971cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
15981cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, ActivePingTest) {
15999c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
160033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
160133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    .Times(AnyNumber());
160233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
16031cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t three_days_ago =
16041cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
16051cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t now = Time::Now().ToInternalValue();
1606639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1607639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
16081cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
16091cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
16101cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
16111cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
16121cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  vector<char> post_data;
16131cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
16141cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
16158f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
16168f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
161777f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1618d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
16191cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
1620edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1621265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1622d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
162333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
162433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
162533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
16261cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
16271cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
16281cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  string post_str(&post_data[0], post_data.size());
162923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
1630116fda3221ff3df037ea1feb271883c87644c839Thieu Le            string::npos);
16311cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
16321cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
16331cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, RollCallPingTest) {
16349c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
163533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
163633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    .Times(AnyNumber());
163733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
16381cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t four_days_ago =
16391cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
16401cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t now = Time::Now().ToInternalValue();
1641639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1642639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
16431cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
16441cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
16451cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
16461cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
16471cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  vector<char> post_data;
16481cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
16491cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
16508f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
16518f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
165277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1653d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
16541cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
1655edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1656265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1657d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
165833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
165933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
166033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
16611cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
16621cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
16631cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  string post_str(&post_data[0], post_data.size());
166423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
1665116fda3221ff3df037ea1feb271883c87644c839Thieu Le            string::npos);
16661cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
16671cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
16681cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, NoPingTest) {
16699c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
167033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
167133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    .Times(AnyNumber());
167233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
16731cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t one_hour_ago =
16741cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
1675639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1676639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
16771cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
16781cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
16791cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
16801cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
16811cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
16821cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
16831cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  vector<char> post_data;
16841cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
16851cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
16868f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
16878f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
168877f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1689d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
16901cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
1691edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1692265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1693d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
169433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
169533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
169633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
16971cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
16981cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
16991cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  string post_str(&post_data[0], post_data.size());
170023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(post_str.find("ping"), string::npos);
17011cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
17021cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
1703b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu LeTEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1704b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  // This test ensures that we ignore empty ping only requests.
1705b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  NiceMock<PrefsMock> prefs;
1706b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  int64_t now = Time::Now().ToInternalValue();
1707b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1708b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le      .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1709b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1710b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le      .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1711b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1712b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1713b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  vector<char> post_data;
1714b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_TRUE(
1715b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le      TestUpdateCheck(&prefs,
17168f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
17178f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
171877f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1719d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
1720b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le                      GetNoUpdateResponse(OmahaRequestParams::kAppId),
1721b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le                      -1,
1722b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le                      true,  // ping_only
1723d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
172433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUnset,
172533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
172633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
1727b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le                      NULL,
1728b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le                      &post_data));
1729b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_EQ(post_data.size(), 0);
1730b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le}
1731b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le
17321cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, BackInTimePingTest) {
17339c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
173433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
173533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    .Times(AnyNumber());
173633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
17371cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t future =
17381cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
1739639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1740639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
17411cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
17421cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
17431cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
17441cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
17451cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
17461cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
17471cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
17481cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
17491cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  vector<char> post_data;
17501cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
17511cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
17528f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
17538f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
175477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1755d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
175623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
175723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
17581cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
175923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<updatecheck status=\"noupdate\"/></app></response>",
1760edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1761265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1762d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
176333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
176433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
176533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
17661cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
17671cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
17681cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  string post_str(&post_data[0], post_data.size());
176923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(post_str.find("ping"), string::npos);
17701cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
17711cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
17721cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
17731cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  // This test checks that the action updates the last ping day to now
177484c763cffce6778711792944387fadb760c55c8dDarin Petkov  // minus 200 seconds with a slack of 5 seconds. Therefore, the test
17751cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  // may fail if it runs for longer than 5 seconds. It shouldn't run
17761cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  // that long though.
17771cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t midnight =
17781cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
17791cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t midnight_slack =
17801cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
17819c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
178233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
178333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
17841cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
17851cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                              AllOf(Ge(midnight), Le(midnight_slack))))
17861cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
17871cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
17881cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                              AllOf(Ge(midnight), Le(midnight_slack))))
17891cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
17901cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
17911cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
17928f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
17938f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
179477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1795d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
179623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
179723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
17981cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
179923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<updatecheck status=\"noupdate\"/></app></response>",
1800edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1801265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1802d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
180333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
180433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
180533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
18061cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
18071cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL));
18081cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
18091cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
18101cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
18119c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
181233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
181333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
18141cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
18151cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
18161cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
18171cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
18188f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
18198f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
182077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1821d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
182223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
182323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "protocol=\"3.0\"><daystart blah=\"200\"/>"
18241cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
182523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<updatecheck status=\"noupdate\"/></app></response>",
1826edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1827265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1828d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
182933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
183033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
183133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
18321cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
18331cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL));
18341cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
18351cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
18361cbd78ffe68039a5781c3434816e03e64033dc0bDarin PetkovTEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
18379c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkov  NiceMock<PrefsMock> prefs;
183833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
183933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
18401cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
18411cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
18421cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
18431cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      TestUpdateCheck(&prefs,
18448f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
18458f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
184677f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1847d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
184823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
184923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
18501cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
185123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<updatecheck status=\"noupdate\"/></app></response>",
1852edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1853265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1854d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
185533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
185633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
185733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
18581cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL,
18591cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      NULL));
18601cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
18611cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
186284c763cffce6778711792944387fadb760c55c8dDarin PetkovTEST(OmahaRequestActionTest, NoUniqueIDTest) {
186384c763cffce6778711792944387fadb760c55c8dDarin Petkov  vector<char> post_data;
186484c763cffce6778711792944387fadb760c55c8dDarin Petkov  ASSERT_FALSE(TestUpdateCheck(NULL,  // prefs
18658f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,  // payload_state
18668f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,  // p2p_manager
186777f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                               NULL,  // connection_manager
1868d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                               &kDefaultTestParams,
186984c763cffce6778711792944387fadb760c55c8dDarin Petkov                               "invalid xml>",
1870edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                               -1,
1871265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                               false,  // ping_only
1872d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                               ErrorCode::kOmahaRequestXMLParseError,
187333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckResult::kParsingError,
187433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckReaction::kUnset,
187533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::DownloadErrorCode::kUnset,
187684c763cffce6778711792944387fadb760c55c8dDarin Petkov                               NULL,  // response
187784c763cffce6778711792944387fadb760c55c8dDarin Petkov                               &post_data));
187884c763cffce6778711792944387fadb760c55c8dDarin Petkov  // convert post_data to string
187984c763cffce6778711792944387fadb760c55c8dDarin Petkov  string post_str(&post_data[0], post_data.size());
188084c763cffce6778711792944387fadb760c55c8dDarin Petkov  EXPECT_EQ(post_str.find("machineid="), string::npos);
188184c763cffce6778711792944387fadb760c55c8dDarin Petkov  EXPECT_EQ(post_str.find("userid="), string::npos);
188284c763cffce6778711792944387fadb760c55c8dDarin Petkov}
188384c763cffce6778711792944387fadb760c55c8dDarin Petkov
1884edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin PetkovTEST(OmahaRequestActionTest, NetworkFailureTest) {
1885edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  OmahaResponse response;
1886d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  const int http_error_code =
1887d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
1888edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  ASSERT_FALSE(
1889edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      TestUpdateCheck(NULL,  // prefs
18908f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
18918f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
189277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1893d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
1894edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      "",
1895edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      501,
1896265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1897d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      static_cast<ErrorCode>(http_error_code),
189833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kDownloadError,
189933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
190033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      static_cast<metrics::DownloadErrorCode>(501),
1901edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      &response,
1902edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      NULL));
1903edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  EXPECT_FALSE(response.update_exists);
1904edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov}
1905edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov
1906edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin PetkovTEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1907edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  OmahaResponse response;
1908d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  const int http_error_code =
1909d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
1910edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  ASSERT_FALSE(
1911edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      TestUpdateCheck(NULL,  // prefs
19128f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // payload_state
19138f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,  // p2p_manager
191477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1915d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
1916edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      "",
1917edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      1500,
1918265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1919d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      static_cast<ErrorCode>(http_error_code),
192033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kDownloadError,
192133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
192233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kHttpStatusOther,
1923edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      &response,
1924edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      NULL));
1925edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  EXPECT_FALSE(response.update_exists);
1926edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov}
1927edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov
192834b5d86d057d450325dd06d35ae182ac6da306e4Jay SrinivasanTEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
192934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  OmahaResponse response;
193034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
1931ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
1932ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta().FromDays(1));
1933ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(false);
193434b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
193534b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  string prefs_dir;
1936a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
193734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                       &prefs_dir));
193834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
193934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
194034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  Prefs prefs;
194175039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
194234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan      << "Failed to initialize preferences.";
194334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
194434b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_FALSE(TestUpdateCheck(
194534b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      &prefs,  // prefs
19468f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
19478f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
194877f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1949d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
195034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
195134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "1.2.3.4",  // version
195234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "http://more/info",
195334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "true",  // prompt
195423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
1955d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "file.signed",  // file name
195634b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "HASH1234=",  // checksum
195734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "false",  // needs admin
195834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "123",  // size
195934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "",  // deadline
1960d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "7",  // max days to scatter
1961d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "42",  // elapsed_days
19628f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
1963d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         false),  // disable_p2p_for sharing
196434b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      -1,
196534b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      false,  // ping_only
1966d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaUpdateDeferredPerPolicy,
196733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
196833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kDeferring,
196933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
197034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      &response,
197134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      NULL));
197234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
19739abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t timestamp = 0;
197434b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1975d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  ASSERT_GT(timestamp, 0);
197634b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  EXPECT_FALSE(response.update_exists);
1977968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa
1978968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  // Verify if we are interactive check we don't defer.
1979968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  params.set_interactive(true);
1980968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  ASSERT_TRUE(
1981968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa      TestUpdateCheck(&prefs,  // prefs
19828f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
19838f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
198477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
1985d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
1986968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      GetUpdateResponse2(OmahaRequestParams::kAppId,
1987968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "1.2.3.4",  // version
1988968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://more/info",
1989968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "true",  // prompt
1990968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "http://code/base/",  // dl url
1991d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "file.signed",  // file name
1992968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "HASH1234=",  // checksum
1993968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "false",  // needs admin
1994968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "123",  // size
1995968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                                         "",  // deadline
1996d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "7",  // max days to scatter
1997d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "42",  // elapsed_days
19988f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
1999d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         false),  // disable_p2p_for sharing
2000968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      -1,
2001968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      false,  // ping_only
2002d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
200333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
200433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
200533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
2006968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      &response,
2007968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      NULL));
2008968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  EXPECT_TRUE(response.update_exists);
200934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan}
201034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
201134b5d86d057d450325dd06d35ae182ac6da306e4Jay SrinivasanTEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
201234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  OmahaResponse response;
201334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
2014ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
2015ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta().FromDays(1));
2016ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(false);
201734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
201834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  string prefs_dir;
2019a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold  EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
202034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                       &prefs_dir));
202134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ScopedDirRemover temp_dir_remover(prefs_dir);
202234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
202334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  Prefs prefs;
202475039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
202534b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan      << "Failed to initialize preferences.";
202634b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
202734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  // Set the timestamp to a very old value such that it exceeds the
202834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  // waiting period set above.
202934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  Time t1;
203034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  Time::FromString("1/1/2012", &t1);
203134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
203234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_TRUE(TestUpdateCheck(
203334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      &prefs,  // prefs
20348f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // payload_state
20358f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL,    // p2p_manager
203677f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
2037d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
203834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      GetUpdateResponse2(OmahaRequestParams::kAppId,
203934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "1.2.3.4",  // version
204034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "http://more/info",
204134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "true",  // prompt
204223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                                         "http://code/base/",  // dl url
2043d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "file.signed",  // file name
204434b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "HASH1234=",  // checksum
204534b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "false",  // needs admin
204634b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "123",  // size
204734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                                         "",  // deadline
2048d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "7",  // max days to scatter
2049d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "42",  // elapsed_days
20508f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         false,  // disable_p2p_for_downloading
2051d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         false),  // disable_p2p_for sharing
205234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      -1,
205334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      false,  // ping_only
2054d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
205533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
205633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
205733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
205834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      &response,
205934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      NULL));
206034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
206134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  EXPECT_TRUE(response.update_exists);
206234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
206334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  // Make sure the timestamp t1 is unchanged showing that it was reused.
20649abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t timestamp = 0;
206534b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
206634b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_TRUE(timestamp == t1.ToInternalValue());
206734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan}
206834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
2069ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
2070eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  // Create a uniquely named test directory.
2071eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  string test_dir;
2072eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_TRUE(utils::MakeTempDirectory(
2073eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold          "omaha_request_action-test-XXXXXX", &test_dir));
2074eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold
2075eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
2076eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
2077be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa                      kStatefulPartition + "/etc"));
2078ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  vector<char> post_data;
2079ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  NiceMock<PrefsMock> prefs;
2080ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_TRUE(WriteFileString(
2081eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold      test_dir + "/etc/lsb-release",
2082ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
2083ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
2084ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
2085ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_TRUE(WriteFileString(
2086eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold      test_dir + kStatefulPartition + "/etc/lsb-release",
2087ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
2088ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
2089ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
2090d04f8e24716d5acca6a7d116b63851adc1506845Gilad Arnold  params.set_root(test_dir);
2091ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.SetLockDown(false);
2092ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.Init("1.2.3.4", "", 0);
2093ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("canary-channel", params.current_channel());
2094ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("stable-channel", params.target_channel());
2095ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_TRUE(params.to_more_stable_channel());
2096ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_TRUE(params.is_powerwash_allowed());
2097ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_FALSE(TestUpdateCheck(&prefs,
20988f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,    // payload_state
20998f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,    // p2p_manager
210077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                               NULL,  // connection_manager
2101d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                               &params,
2102ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               "invalid xml>",
2103ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               -1,
2104ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               false,  // ping_only
2105d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                               ErrorCode::kOmahaRequestXMLParseError,
210633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckResult::kParsingError,
210733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckReaction::kUnset,
210833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::DownloadErrorCode::kUnset,
2109ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               NULL,  // response
2110ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               &post_data));
2111ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  // convert post_data to string
2112ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  string post_str(&post_data[0], post_data.size());
2113ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_NE(string::npos, post_str.find(
2114ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "appid=\"{22222222-2222-2222-2222-222222222222}\" "
2115ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
2116ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "track=\"stable-channel\" from_track=\"canary-channel\" "));
2117eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold
2118eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
2119ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan}
2120ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan
2121ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST(OmahaRequestActionTest, TestChangingToLessStableChannel) {
2122eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  // Create a uniquely named test directory.
2123eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  string test_dir;
2124eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_TRUE(utils::MakeTempDirectory(
2125eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold          "omaha_request_action-test-XXXXXX", &test_dir));
2126eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold
2127eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
2128eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
2129be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa                      kStatefulPartition + "/etc"));
2130ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  vector<char> post_data;
2131ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  NiceMock<PrefsMock> prefs;
2132ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_TRUE(WriteFileString(
2133eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold      test_dir + "/etc/lsb-release",
2134ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
2135ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
2136ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
2137ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_TRUE(WriteFileString(
2138eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold      test_dir + kStatefulPartition + "/etc/lsb-release",
2139ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
2140ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  OmahaRequestParams params = kDefaultTestParams;
2141d04f8e24716d5acca6a7d116b63851adc1506845Gilad Arnold  params.set_root(test_dir);
2142ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.SetLockDown(false);
2143ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.Init("5.6.7.8", "", 0);
2144ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("stable-channel", params.current_channel());
2145ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("canary-channel", params.target_channel());
2146ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_FALSE(params.to_more_stable_channel());
2147ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_FALSE(params.is_powerwash_allowed());
2148ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_FALSE(TestUpdateCheck(&prefs,
21498f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,    // payload_state
21508f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                               NULL,    // p2p_manager
215177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                               NULL,  // connection_manager
2152d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                               &params,
2153ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               "invalid xml>",
2154ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               -1,
2155ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               false,  // ping_only
2156d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                               ErrorCode::kOmahaRequestXMLParseError,
215733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckResult::kParsingError,
215833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckReaction::kUnset,
215933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::DownloadErrorCode::kUnset,
2160ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               NULL,  // response
2161ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               &post_data));
2162ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  // convert post_data to string
2163ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  string post_str(&post_data[0], post_data.size());
2164ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_NE(string::npos, post_str.find(
2165ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "appid=\"{11111111-1111-1111-1111-111111111111}\" "
2166ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "version=\"5.6.7.8\" "
2167ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "track=\"canary-channel\" from_track=\"stable-channel\""));
2168d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  EXPECT_EQ(string::npos, post_str.find("from_version"));
2169eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold
2170eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
2171ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan}
2172ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan
21738f191b22a1a1ab2b803d65ee488729206e648695David Zeuthenvoid P2PTest(bool initial_allow_p2p_for_downloading,
21748f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             bool initial_allow_p2p_for_sharing,
21758f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             bool omaha_disable_p2p_for_downloading,
21768f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             bool omaha_disable_p2p_for_sharing,
21778f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             bool payload_state_allow_p2p_attempt,
21788f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             bool expect_p2p_client_lookup,
21798f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             const string& p2p_client_result_url,
21808f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             bool expected_allow_p2p_for_downloading,
21818f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             bool expected_allow_p2p_for_sharing,
21828f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen             const string& expected_p2p_url) {
21838f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  OmahaResponse response;
21848f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  OmahaRequestParams request_params = kDefaultTestParams;
21858f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  request_params.set_use_p2p_for_downloading(initial_allow_p2p_for_downloading);
21868f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  request_params.set_use_p2p_for_sharing(initial_allow_p2p_for_sharing);
21878f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
21888f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  MockPayloadState mock_payload_state;
21898f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
21908f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
21918f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  MockP2PManager mock_p2p_manager;
21928f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
21938f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
21944cc5ed215180d19598d8b99f0a8a15cc24b831fcDavid Zeuthen  TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
21954cc5ed215180d19598d8b99f0a8a15cc24b831fcDavid Zeuthen  EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
21968f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      .Times(expect_p2p_client_lookup ? 1 : 0);
21978f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
21988f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  ASSERT_TRUE(
21998f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      TestUpdateCheck(NULL,  // prefs
22008f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      &mock_payload_state,
22018f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      &mock_p2p_manager,
220277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
2203d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &request_params,
22048f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      GetUpdateResponse2(OmahaRequestParams::kAppId,
22058f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "1.2.3.4",  // version
22068f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "http://more/info",
22078f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "true",  // prompt
22088f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "http://code/base/",  // dl url
2209d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "file.signed",  // file name
22108f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "HASH1234=",  // checksum
22118f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "false",  // needs admin
22128f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "123",  // size
22138f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         "",  // deadline
2214d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "7",  // max days to scatter
2215d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "42",  // elapsed_days
22168f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         omaha_disable_p2p_for_downloading,
22178f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                                         omaha_disable_p2p_for_sharing),
22188f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      -1,
22198f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      false,  // ping_only
2220d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
222133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
222233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
222333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
22248f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      &response,
22258f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      NULL));
22268f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_TRUE(response.update_exists);
22278f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
22288f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_EQ(response.disable_p2p_for_downloading,
22298f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen            omaha_disable_p2p_for_downloading);
22308f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_EQ(response.disable_p2p_for_sharing,
22318f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen            omaha_disable_p2p_for_sharing);
22328f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
22338f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_EQ(request_params.use_p2p_for_downloading(),
22348f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen            expected_allow_p2p_for_downloading);
22358f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
22368f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_EQ(request_params.use_p2p_for_sharing(),
22378f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen            expected_allow_p2p_for_sharing);
22388f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
22398f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_EQ(request_params.p2p_url(), expected_p2p_url);
22408f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
22418f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
22428f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST(OmahaRequestActionTest, P2PWithPeer) {
2243d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  P2PTest(true,                   // initial_allow_p2p_for_downloading
2244d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // initial_allow_p2p_for_sharing
2245d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_downloading
2246d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_sharing
2247d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // payload_state_allow_p2p_attempt
2248d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expect_p2p_client_lookup
2249d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "http://1.3.5.7/p2p",   // p2p_client_result_url
2250d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expected_allow_p2p_for_downloading
2251d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expected_allow_p2p_for_sharing
2252d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "http://1.3.5.7/p2p");  // expected_p2p_url
22538f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
22548f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
22558f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST(OmahaRequestActionTest, P2PWithoutPeer) {
2256d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  P2PTest(true,                   // initial_allow_p2p_for_downloading
2257d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // initial_allow_p2p_for_sharing
2258d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_downloading
2259d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_sharing
2260d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // payload_state_allow_p2p_attempt
2261d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expect_p2p_client_lookup
2262d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "",                     // p2p_client_result_url
2263d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expected_allow_p2p_for_downloading
2264d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expected_allow_p2p_for_sharing
2265d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "");                    // expected_p2p_url
22668f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
22678f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
22688f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST(OmahaRequestActionTest, P2PDownloadNotAllowed) {
2269d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  P2PTest(false,                  // initial_allow_p2p_for_downloading
2270d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // initial_allow_p2p_for_sharing
2271d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_downloading
2272d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_sharing
2273d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // payload_state_allow_p2p_attempt
2274d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expect_p2p_client_lookup
2275d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "unset",                // p2p_client_result_url
2276d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expected_allow_p2p_for_downloading
2277d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expected_allow_p2p_for_sharing
2278d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "");                    // expected_p2p_url
22798f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
22808f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
22818f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
2282d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  P2PTest(true,                   // initial_allow_p2p_for_downloading
2283d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // initial_allow_p2p_for_sharing
2284d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // omaha_disable_p2p_for_downloading
2285d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_sharing
2286d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // payload_state_allow_p2p_attempt
2287d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expect_p2p_client_lookup
2288d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "unset",                // p2p_client_result_url
2289d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expected_allow_p2p_for_downloading
2290d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expected_allow_p2p_for_sharing
2291d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "");                    // expected_p2p_url
22928f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
22938f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
22948f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
2295d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  P2PTest(true,                   // initial_allow_p2p_for_downloading
2296d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // initial_allow_p2p_for_sharing
2297d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_downloading
2298d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // omaha_disable_p2p_for_sharing
2299d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // payload_state_allow_p2p_attempt
2300d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expect_p2p_client_lookup
2301d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "http://1.3.5.7/p2p",   // p2p_client_result_url
2302d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expected_allow_p2p_for_downloading
2303d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expected_allow_p2p_for_sharing
2304d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "http://1.3.5.7/p2p");  // expected_p2p_url
23058f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
23068f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
23078f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
2308d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  P2PTest(true,                   // initial_allow_p2p_for_downloading
2309d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // initial_allow_p2p_for_sharing
2310d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // omaha_disable_p2p_for_downloading
2311d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // omaha_disable_p2p_for_sharing
2312d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // payload_state_allow_p2p_attempt
2313d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expect_p2p_client_lookup
2314d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "unset",                // p2p_client_result_url
2315d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expected_allow_p2p_for_downloading
2316d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expected_allow_p2p_for_sharing
2317d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "");                    // expected_p2p_url
23188f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
23198f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
2320639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthenbool InstallDateParseHelper(const std::string &elapsed_days,
2321639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                            PrefsInterface* prefs,
2322639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                            OmahaResponse *response) {
2323639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  return
2324639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      TestUpdateCheck(prefs,
2325639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      NULL,    // payload_state
2326639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      NULL,    // p2p_manager
232777f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      NULL,  // connection_manager
2328d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &kDefaultTestParams,
2329639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      GetUpdateResponse2(OmahaRequestParams::kAppId,
2330639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "1.2.3.4",  // version
2331639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "http://more/info",
2332639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "true",  // prompt
2333639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "http://code/base/",  // dl url
2334d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "file.signed",  // file name
2335639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "HASH1234=",  // checksum
2336639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "false",  // needs admin
2337639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "123",  // size
2338639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         "",  // deadline
2339d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         "7",  // max days to scatter
2340639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         elapsed_days,
2341639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                         false,  // disable_p2p_for_downloading
2342d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                                         false),  // disable_p2p_for sharing
2343639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      -1,
2344639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      false,  // ping_only
2345d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
234633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
234733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
234833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
2349639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      response,
2350639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      NULL);
2351639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen}
2352639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2353639aa36fc7e27ba400402cd7a32b091f555783a6David ZeuthenTEST(OmahaRequestActionTest, ParseInstallDateFromResponse) {
2354639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  OmahaResponse response;
2355639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  string temp_dir;
2356639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  Prefs prefs;
2357639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(utils::MakeTempDirectory("ParseInstallDateFromResponse.XXXXXX",
2358639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                       &temp_dir));
235975039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  prefs.Init(base::FilePath(temp_dir));
2360639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2361639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // Check that we parse elapsed_days in the Omaha Response correctly.
2362639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // and that the kPrefsInstallDateDays value is written to.
2363639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2364639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(InstallDateParseHelper("42", &prefs, &response));
2365639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(response.update_exists);
2366639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(42, response.install_date_days);
2367639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(prefs.Exists(kPrefsInstallDateDays));
2368639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  int64_t prefs_days;
2369639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2370639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(prefs_days, 42);
2371639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2372639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // If there already is a value set, we shouldn't do anything.
2373639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(InstallDateParseHelper("7", &prefs, &response));
2374639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(response.update_exists);
2375639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(7, response.install_date_days);
2376639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2377639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(prefs_days, 42);
2378639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2379639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // Note that elapsed_days is not necessarily divisible by 7 so check
2380639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // that we round down correctly when populating kPrefsInstallDateDays.
2381639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(prefs.Delete(kPrefsInstallDateDays));
2382639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(InstallDateParseHelper("23", &prefs, &response));
2383639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(response.update_exists);
2384639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(23, response.install_date_days);
2385639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2386639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(prefs_days, 21);
2387639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2388639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // Check that we correctly handle elapsed_days not being included in
2389639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // the Omaha Response.
2390639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(InstallDateParseHelper("", &prefs, &response));
2391639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(response.update_exists);
2392639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(-1, response.install_date_days);
2393639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2394639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
2395639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen}
2396639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2397639aa36fc7e27ba400402cd7a32b091f555783a6David ZeuthenTEST(OmahaRequestActionTest, GetInstallDate) {
2398639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  string temp_dir;
2399639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  Prefs prefs;
2400639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(utils::MakeTempDirectory("GetInstallDate.XXXXXX",
2401639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                                       &temp_dir));
240275039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  prefs.Init(base::FilePath(temp_dir));
2403639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2404639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // If there is no prefs and OOBE is not complete, we should not
2405639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // report anything to Omaha.
2406639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  {
24075bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    FakeSystemState system_state;
2408639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    system_state.set_prefs(&prefs);
2409639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_EQ(OmahaRequestAction::GetInstallDate(&system_state), -1);
2410639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2411639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  }
2412639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2413639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // If OOBE is complete and happened on a valid date (e.g. after Jan
2414639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // 1 2007 0:00 PST), that date should be used and written to
2415639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // prefs. However, first try with an invalid date and check we do
2416639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // nothing.
2417639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  {
24185bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    FakeSystemState fake_system_state;
24195bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    fake_system_state.set_prefs(&prefs);
2420639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2421d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko    Time oobe_date = Time::FromTimeT(42);  // Dec 31, 1969 16:00:42 PST.
24225bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
24235bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), -1);
2424639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2425639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  }
2426639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2427639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // Then check with a valid date. The date Jan 20, 2007 0:00 PST
2428639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // should yield an InstallDate of 14.
2429639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  {
24305bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    FakeSystemState fake_system_state;
24315bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    fake_system_state.set_prefs(&prefs);
2432639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2433d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko    Time oobe_date = Time::FromTimeT(1169280000);  // Jan 20, 2007 0:00 PST.
24345bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
24355bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 14);
2436639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_TRUE(prefs.Exists(kPrefsInstallDateDays));
2437639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2438639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    int64_t prefs_days;
2439639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2440639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_EQ(prefs_days, 14);
2441639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  }
2442639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2443639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // Now that we have a valid date in prefs, check that we keep using
2444639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // that even if OOBE date reports something else. The date Jan 30,
2445639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // 2007 0:00 PST should yield an InstallDate of 28... but since
2446639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // there's a prefs file, we should still get 14.
2447639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  {
24485bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    FakeSystemState fake_system_state;
24495bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    fake_system_state.set_prefs(&prefs);
2450639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2451d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko    Time oobe_date = Time::FromTimeT(1170144000);  // Jan 30, 2007 0:00 PST.
24525bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
24535bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 14);
2454639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2455639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    int64_t prefs_days;
2456639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2457639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_EQ(prefs_days, 14);
2458639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2459639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    // If we delete the prefs file, we should get 28 days.
2460639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_TRUE(prefs.Delete(kPrefsInstallDateDays));
24615bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 28);
2462639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2463639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen    EXPECT_EQ(prefs_days, 28);
2464639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  }
2465639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2466639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
2467639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen}
2468639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
24696a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}  // namespace chromeos_update_engine
2470