1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2012 The Android Open Source Project
3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License");
5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License.
6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at
7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//      http://www.apache.org/licenses/LICENSE-2.0
9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software
11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS,
12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and
14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License.
15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
166a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
178427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo#include "update_engine/omaha_request_action.h"
188427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo
199abb763fa3840d69cc1098c0233162557a7f99eaBen Chan#include <stdint.h>
209abb763fa3840d69cc1098c0233162557a7f99eaBen Chan
216a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include <string>
226a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include <vector>
230dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
2460ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo#include <base/bind.h>
25110e030ba1a37787635e229bd36b42e33b9a9208Alex Deymo#include <base/files/file_util.h>
268e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo#include <base/strings/string_number_conversions.h>
2775039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/strings/string_util.h>
2875039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/strings/stringprintf.h>
2975039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/time/time.h>
303f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/bind_lambda.h>
31c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo#include <brillo/make_unique_ptr.h>
323f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/message_loops/fake_message_loop.h>
333f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/message_loops/message_loop.h>
343f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/message_loops/message_loop_utils.h>
35e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo#include <gtest/gtest.h>
36d29695df35b7192faef4009d42a62c37bdd90a8fJay Srinivasan
3739910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/action_pipe.h"
3839910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/constants.h"
3939910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/fake_prefs.h"
4039910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/hash_calculator.h"
4139910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/mock_http_fetcher.h"
4239910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/platform_constants.h"
4339910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/prefs.h"
4439910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/test_utils.h"
4539910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/utils.h"
46c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo#include "update_engine/fake_system_state.h"
4738429cf76aaac8c499004b6f537229a26b381602Alex Deymo#include "update_engine/metrics.h"
4877f79e876a77796fc248d099b6574f05bd23c954Chris Sosa#include "update_engine/mock_connection_manager.h"
4974b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold#include "update_engine/mock_payload_state.h"
50a4a8a8ccc2d9e0285728ed247b43f09433e63323Darin Petkov#include "update_engine/omaha_request_params.h"
516a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
521cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing base::Time;
531cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing base::TimeDelta;
5410875d90cf67f883ba7c9ed13bc8d706aa8c6fbcAlex Deymousing chromeos_update_engine::test_utils::System;
5510875d90cf67f883ba7c9ed13bc8d706aa8c6fbcAlex Deymousing chromeos_update_engine::test_utils::WriteFileString;
566a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovusing std::string;
576a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovusing std::vector;
581cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::AllOf;
59f329b933db41d26644a97afef928eb1b319d6d99Alex Deymousing testing::AnyNumber;
6034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasanusing testing::DoAll;
611cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::Ge;
621cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::Le;
639c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkovusing testing::NiceMock;
641cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::Return;
6574b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnoldusing testing::ReturnPointee;
6674b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnoldusing testing::SaveArg;
671cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkovusing testing::SetArgumentPointee;
68f329b933db41d26644a97afef928eb1b319d6d99Alex Deymousing testing::_;
696a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
708e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymonamespace {
718e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
72856166594771c61973856f563e622ccb7dd48aa1Alex Deymoconst char kTestAppId[] = "test-app-id";
73856166594771c61973856f563e622ccb7dd48aa1Alex Deymo
748e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo// This is a helper struct to allow unit tests build an update response with the
758e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo// values they care about.
768e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymostruct FakeUpdateResponse {
778e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string GetNoUpdateResponse() const {
788e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo    string entity_str;
798e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo    if (include_entity)
808e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo      entity_str = "<!DOCTYPE response [<!ENTITY CrOS \"ChromeOS\">]>";
8100d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo    return
8200d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
8300d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo        entity_str + "<response protocol=\"3.0\">"
848e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "<daystart elapsed_seconds=\"100\"/>"
8500d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo        "<app appid=\"" + app_id + "\" " +
8600d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo        (include_cohorts ? "cohort=\"" + cohort + "\" cohorthint=\"" +
8700d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo         cohorthint + "\" cohortname=\"" + cohortname + "\" " : "") +
8800d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo        " status=\"ok\">"
8900d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo        "<ping status=\"ok\"/>"
9000d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo        "<updatecheck status=\"noupdate\"/></app></response>";
918e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  }
928e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
938e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string GetUpdateResponse() const {
948e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo    return
958e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
968e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "protocol=\"3.0\">"
978e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "<daystart elapsed_seconds=\"100\"" +
988e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        (elapsed_days.empty() ? "" : (" elapsed_days=\"" + elapsed_days + "\""))
998e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        + "/>"
1008e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "<app appid=\"" + app_id + "\" " +
1018e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        (include_cohorts ? "cohort=\"" + cohort + "\" cohorthint=\"" +
1028e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo         cohorthint + "\" cohortname=\"" + cohortname + "\" " : "") +
1038e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        " status=\"ok\">"
1048e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "<ping status=\"ok\"/><updatecheck status=\"ok\">"
1058e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "<urls><url codebase=\"" + codebase + "\"/></urls>"
1068e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "<manifest version=\"" + version + "\">"
1078e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "<packages><package hash=\"not-used\" name=\"" + filename +  "\" "
1088e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "size=\"" + base::Int64ToString(size) + "\"/></packages>"
1098e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "<actions><action event=\"postinstall\" "
1108e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "ChromeOSVersion=\"" + version + "\" "
1118e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
1128e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "IsDelta=\"true\" "
1138e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "IsDeltaPayload=\"true\" "
1148e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
1158e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "sha256=\"" + hash + "\" "
1168e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "needsadmin=\"" + needsadmin + "\" " +
1178e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
1188e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        (disable_p2p_for_downloading ?
1198e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo            "DisableP2PForDownloading=\"true\" " : "") +
1208e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
1218e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo        "/></actions></manifest></updatecheck></app></response>";
1228e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  }
1238e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
1248e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  // Return the payload URL, which is split in two fields in the XML response.
1258e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string GetPayloadUrl() {
1268e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo    return codebase + filename;
1278e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  }
1288e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
129856166594771c61973856f563e622ccb7dd48aa1Alex Deymo  string app_id = kTestAppId;
1308e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string version = "1.2.3.4";
1318e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string more_info_url = "http://more/info";
1328e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string prompt = "true";
1338e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string codebase = "http://code/base/";
1348e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string filename = "file.signed";
1358e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string hash = "HASH1234=";
1368e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string needsadmin = "false";
1378e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  int64_t size = 123;
1388e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string deadline = "";
1398e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string max_days_to_scatter = "7";
1408e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string elapsed_days = "42";
1418e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
1428e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  // P2P setting defaults to allowed.
1438e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  bool disable_p2p_for_downloading = false;
1448e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  bool disable_p2p_for_sharing = false;
1458e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
1468e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  // Omaha cohorts settings.
1478e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  bool include_cohorts = false;
1488e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string cohort = "";
1498e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string cohorthint = "";
1508e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string cohortname = "";
1518e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
1528e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  // Whether to include the CrOS <!ENTITY> in the XML response.
1538e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  bool include_entity = false;
1548e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo};
1558e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
1568e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo}  // namespace
1578e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
1586a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovnamespace chromeos_update_engine {
1596a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
160e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymoclass OmahaRequestActionTest : public ::testing::Test {
161e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo protected:
162610277efc6f7e5239158dfa4bb3b1021804326e0Alex Deymo  void SetUp() override {
163e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    fake_system_state_.set_request_params(&request_params_);
164e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    fake_system_state_.set_prefs(&fake_prefs_);
165e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  }
1666a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
167e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // Returns true iff an output response was obtained from the
1688427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  // OmahaRequestAction. |prefs| may be null, in which case a local MockPrefs
169e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // is used. |payload_state| may be null, in which case a local mock is used.
170e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // |p2p_manager| may be null, in which case a local mock is used.
171e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // |connection_manager| may be null, in which case a local mock is used.
172e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // out_response may be null. If |fail_http_response_code| is non-negative,
173e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // the transfer will fail with that code. |ping_only| is passed through to the
174e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // OmahaRequestAction constructor. out_post_data may be null; if non-null, the
175e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // post-data received by the mock HttpFetcher is returned.
176e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  //
177e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // The |expected_check_result|, |expected_check_reaction| and
178e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // |expected_error_code| parameters are for checking expectations
179e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
180e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // UMA statistics. Use the appropriate ::kUnset value to specify that
181e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // the given metric should not be reported.
182e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  bool TestUpdateCheck(OmahaRequestParams* request_params,
183e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                       const string& http_response,
184e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                       int fail_http_response_code,
185e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                       bool ping_only,
186e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                       ErrorCode expected_code,
187e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                       metrics::CheckResult expected_check_result,
188e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                       metrics::CheckReaction expected_check_reaction,
189e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                       metrics::DownloadErrorCode expected_download_error_code,
190e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                       OmahaResponse* out_response,
1913f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko                       brillo::Blob* out_post_data);
192e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo
193f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko  // Runs and checks a ping test. |ping_only| indicates whether it should send
194e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // only a ping or also an updatecheck.
195e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  void PingTest(bool ping_only);
196e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo
197e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // InstallDate test helper function.
198f329b933db41d26644a97afef928eb1b319d6d99Alex Deymo  bool InstallDateParseHelper(const string &elapsed_days,
199e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                              OmahaResponse *response);
200e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo
201e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // P2P test helper function.
202e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  void P2PTest(
203e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      bool initial_allow_p2p_for_downloading,
204e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      bool initial_allow_p2p_for_sharing,
205e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      bool omaha_disable_p2p_for_downloading,
206e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      bool omaha_disable_p2p_for_sharing,
207e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      bool payload_state_allow_p2p_attempt,
208e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      bool expect_p2p_client_lookup,
209e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      const string& p2p_client_result_url,
210e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      bool expected_allow_p2p_for_downloading,
211e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      bool expected_allow_p2p_for_sharing,
212e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      const string& expected_p2p_url);
213e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo
214e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  FakeSystemState fake_system_state_;
2158e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  FakeUpdateResponse fake_update_response_;
216e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo
217e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // By default, all tests use these objects unless they replace them in the
218e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // fake_system_state_.
219e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestParams request_params_ = OmahaRequestParams{
220e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      &fake_system_state_,
221ac41a82e4be1be43913292d13d58b5eb2c572f53Alex Deymo      constants::kOmahaPlatformName,
222e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      OmahaRequestParams::kOsVersion,
223e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      "service_pack",
224e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      "x86-generic",
225856166594771c61973856f563e622ccb7dd48aa1Alex Deymo      kTestAppId,
226e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      "0.1.0.0",
227e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      "en-US",
228e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      "unittest",
229e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      "OEM MODEL 09235 7471",
230e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      "ChromeOSFirmware.1.0",
231e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      "0X0A1",
232e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      false,   // delta okay
233e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      false,   // interactive
234e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      "http://url",
23574b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold      ""};     // target_version_prefix
236e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo
237e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  FakePrefs fake_prefs_;
238e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo};
239480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
240e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymonamespace {
2416a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
2426a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
2436a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaRequestActionTestProcessorDelegate()
24460ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo      : expected_code_(ErrorCode::kSuccess) {}
245610277efc6f7e5239158dfa4bb3b1021804326e0Alex Deymo  ~OmahaRequestActionTestProcessorDelegate() override {
2466a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
24735866ed08bcefa9d8bffab9ca64cf994ad0f4290Yunlian Jiang  void ProcessingDone(const ActionProcessor* processor,
24835866ed08bcefa9d8bffab9ca64cf994ad0f4290Yunlian Jiang                      ErrorCode code) override {
2493f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko    brillo::MessageLoop::current()->BreakLoop();
2506a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
2516a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
25235866ed08bcefa9d8bffab9ca64cf994ad0f4290Yunlian Jiang  void ActionCompleted(ActionProcessor* processor,
25335866ed08bcefa9d8bffab9ca64cf994ad0f4290Yunlian Jiang                       AbstractAction* action,
25435866ed08bcefa9d8bffab9ca64cf994ad0f4290Yunlian Jiang                       ErrorCode code) override {
2556a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    // make sure actions always succeed
2566a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    if (action->Type() == OmahaRequestAction::StaticType())
257c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov      EXPECT_EQ(expected_code_, code);
2586a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    else
259d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      EXPECT_EQ(ErrorCode::kSuccess, code);
2606a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
261a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen  ErrorCode expected_code_;
2626a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
263d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko}  // namespace
2646a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2656a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass OutputObjectCollectorAction;
2666a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2676a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovtemplate<>
2686a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass ActionTraits<OutputObjectCollectorAction> {
2696a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
2706a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Does not take an object for input
2716a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  typedef OmahaResponse InputObjectType;
2726a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // On success, puts the output path on output
2736a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  typedef NoneType OutputObjectType;
2746a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
2756a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
2766a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
2776a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
2786a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OutputObjectCollectorAction() : has_input_object_(false) {}
2796a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  void PerformAction() {
2806a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    // copy input object
2816a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    has_input_object_ = HasInputObject();
2826a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    if (has_input_object_)
2836a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      omaha_response_ = GetInputObject();
284d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold    processor_->ActionComplete(this, ErrorCode::kSuccess);
2856a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
2866a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Should never be called
2876a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  void TerminateProcessing() {
2886a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    CHECK(false);
2896a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
2906a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Debugging/logging
291f329b933db41d26644a97afef928eb1b319d6d99Alex Deymo  static string StaticType() {
2926a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    return "OutputObjectCollectorAction";
2936a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
294f329b933db41d26644a97afef928eb1b319d6d99Alex Deymo  string Type() const { return StaticType(); }
2950057daa5dd6adc2db3b5524cfb3e66011c69c152Alex Vakulenko  using InputObjectType =
2960057daa5dd6adc2db3b5524cfb3e66011c69c152Alex Vakulenko      ActionTraits<OutputObjectCollectorAction>::InputObjectType;
2970057daa5dd6adc2db3b5524cfb3e66011c69c152Alex Vakulenko  using OutputObjectType =
2980057daa5dd6adc2db3b5524cfb3e66011c69c152Alex Vakulenko      ActionTraits<OutputObjectCollectorAction>::OutputObjectType;
2996a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  bool has_input_object_;
3006a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse omaha_response_;
3016a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
3026a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
303e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymobool OmahaRequestActionTest::TestUpdateCheck(
304e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    OmahaRequestParams* request_params,
305e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    const string& http_response,
306e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    int fail_http_response_code,
307e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    bool ping_only,
308e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    ErrorCode expected_code,
309e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    metrics::CheckResult expected_check_result,
310e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    metrics::CheckReaction expected_check_reaction,
311e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    metrics::DownloadErrorCode expected_download_error_code,
312e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    OmahaResponse* out_response,
3133f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko    brillo::Blob* out_post_data) {
3143f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::FakeMessageLoop loop(nullptr);
31560ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop.SetAsCurrent();
3160dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
3174516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                 http_response.size(),
31888b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                                                 nullptr);
319edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  if (fail_http_response_code >= 0) {
320edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov    fetcher->FailTransfer(fail_http_response_code);
321edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  }
322e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  if (request_params)
323e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    fake_system_state_.set_request_params(request_params);
324e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestAction action(&fake_system_state_,
32588b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                            nullptr,
326c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                            brillo::make_unique_ptr(fetcher),
327265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                            ping_only);
3286a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaRequestActionTestProcessorDelegate delegate;
329c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov  delegate.expected_code_ = expected_code;
330a4a8a8ccc2d9e0285728ed247b43f09433e63323Darin Petkov
3316a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor processor;
3326a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.set_delegate(&delegate);
3336a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&action);
3346a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
3356a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OutputObjectCollectorAction collector_action;
3366a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  BondActions(&action, &collector_action);
3376a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&collector_action);
3386a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
339e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_CALL(*fake_system_state_.mock_metrics_lib(), SendEnumToUMA(_, _, _))
34033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      .Times(AnyNumber());
341e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
34233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      SendEnumToUMA(metrics::kMetricCheckResult,
34333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen          static_cast<int>(expected_check_result),
34433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen          static_cast<int>(metrics::CheckResult::kNumConstants) - 1))
34533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      .Times(expected_check_result == metrics::CheckResult::kUnset ? 0 : 1);
346e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
34733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      SendEnumToUMA(metrics::kMetricCheckReaction,
34833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen          static_cast<int>(expected_check_reaction),
34933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen          static_cast<int>(metrics::CheckReaction::kNumConstants) - 1))
35033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      .Times(expected_check_reaction == metrics::CheckReaction::kUnset ? 0 : 1);
351e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
352c0dd0210d01406df4b88086ea1349a75b8fe0584David Zeuthen      SendSparseToUMA(metrics::kMetricCheckDownloadErrorCode,
353c0dd0210d01406df4b88086ea1349a75b8fe0584David Zeuthen          static_cast<int>(expected_download_error_code)))
35433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      .Times(expected_download_error_code == metrics::DownloadErrorCode::kUnset
35533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen             ? 0 : 1);
35633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
35760ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop.PostTask(base::Bind([&processor] { processor.StartProcessing(); }));
35860ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  LOG(INFO) << "loop.PendingTasks() = " << loop.PendingTasks();
35960ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop.Run();
36060ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  LOG(INFO) << "loop.PendingTasks() = " << loop.PendingTasks();
36160ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  EXPECT_FALSE(loop.PendingTasks());
3626a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  if (collector_action.has_input_object_ && out_response)
3636a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    *out_response = collector_action.omaha_response_;
3646a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  if (out_post_data)
3656a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov    *out_post_data = fetcher->post_data();
3666a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  return collector_action.has_input_object_;
3676a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
3686a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
3690dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov// Tests Event requests -- they should always succeed. |out_post_data|
3700dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov// may be null; if non-null, the post-data received by the mock
3710dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov// HttpFetcher is returned.
372480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanvoid TestEvent(OmahaRequestParams params,
3730dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov               OmahaEvent* event,
3740dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov               const string& http_response,
3753f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko               brillo::Blob* out_post_data) {
3763f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::FakeMessageLoop loop(nullptr);
37760ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop.SetAsCurrent();
3780dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
3794516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes                                                 http_response.size(),
38088b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                                                 nullptr);
3815bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  FakeSystemState fake_system_state;
3825bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state.set_request_params(&params);
383c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo  OmahaRequestAction action(&fake_system_state,
384c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                            event,
385c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                            brillo::make_unique_ptr(fetcher),
386c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                            false);
3870dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  OmahaRequestActionTestProcessorDelegate delegate;
3880dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ActionProcessor processor;
3890dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  processor.set_delegate(&delegate);
3900dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  processor.EnqueueAction(&action);
3910dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
39260ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop.PostTask(base::Bind([&processor] { processor.StartProcessing(); }));
39360ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop.Run();
39460ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo
39560ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  // This test should schedule a callback to notify the crash reporter if
39660ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  // the passed event is an error.
39760ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  EXPECT_EQ(event->result == OmahaEvent::kResultError, loop.PendingTasks());
39860ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo
3990dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  if (out_post_data)
4000dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov    *out_post_data = fetcher->post_data();
4010dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
4020dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
403e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, RejectEntities) {
404f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen  OmahaResponse response;
4058e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.include_entity = true;
406f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen  ASSERT_FALSE(
407e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
4088e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetNoUpdateResponse(),
409f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      -1,
410f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      false,  // ping_only
411f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      ErrorCode::kOmahaRequestXMLHasEntityDecl,
412f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      metrics::CheckResult::kParsingError,
413f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      metrics::CheckReaction::kUnset,
414f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      metrics::DownloadErrorCode::kUnset,
415f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen                      &response,
41688b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
417f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen  EXPECT_FALSE(response.update_exists);
418f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen}
419f3e2801f18bae14e41099e007de7c9a019735556David Zeuthen
420e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, NoUpdateTest) {
4216a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
4226a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
423e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
4248e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetNoUpdateResponse(),
425edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
426265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
427d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
42833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
42933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
43033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
4310dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
43288b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
4336a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
4346a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
4356a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
4368e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo// Test that all the values in the response are parsed in a normal update
4378e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo// response.
438e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, ValidUpdateTest) {
4396a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
4408e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.deadline = "20101020";
4416a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
442e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
4438e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
444edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
445265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
446d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
44733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
44833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
44933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
4500dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
45188b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
4526a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_TRUE(response.update_exists);
45334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  EXPECT_TRUE(response.update_exists);
4548e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(fake_update_response_.version, response.version);
4558e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(fake_update_response_.GetPayloadUrl(), response.payload_urls[0]);
4568e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(fake_update_response_.more_info_url, response.more_info_url);
4578e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(fake_update_response_.hash, response.hash);
4588e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(fake_update_response_.size, response.size);
4598e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(fake_update_response_.prompt == "true", response.prompt);
4608e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(fake_update_response_.deadline, response.deadline);
4618e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  // Omaha cohort attribets are not set in the response, so they should not be
4628e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  // persisted.
4638e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohort));
4648e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohortHint));
4658e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohortName));
4666a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
4676a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
468e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
46977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  OmahaResponse response;
47077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  // Set up a connection manager that doesn't allow a valid update over
47177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  // the current ethernet connection.
472f6ee0163504eaf1a7cc136ba2c075d77ae2b4dd5Alex Deymo  MockConnectionManager mock_cm;
473e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_connection_manager(&mock_cm);
474e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo
475305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo  EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
476305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo      .WillRepeatedly(
477305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo          DoAll(SetArgumentPointee<0>(NetworkConnectionType::kEthernet),
478305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo                SetArgumentPointee<1>(NetworkTethering::kUnknown),
479305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo                Return(true)));
48075eac7e523f825afdb88508922d7dc65fa366b19Alex Deymo  EXPECT_CALL(mock_cm, IsUpdateAllowedOver(NetworkConnectionType::kEthernet, _))
48177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa    .WillRepeatedly(Return(false));
48277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa
48377f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  ASSERT_FALSE(
484e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
4858e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
48677f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      -1,
48777f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      false,  // ping_only
488d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaUpdateIgnoredPerPolicy,
48977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      metrics::CheckResult::kUpdateAvailable,
49077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      metrics::CheckReaction::kIgnored,
49177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      metrics::DownloadErrorCode::kUnset,
49277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      &response,
49388b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
49477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  EXPECT_FALSE(response.update_exists);
49577f79e876a77796fc248d099b6574f05bd23c954Chris Sosa}
49677f79e876a77796fc248d099b6574f05bd23c954Chris Sosa
497e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
49877f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  string rollback_version = "1234.0.0";
49977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  OmahaResponse response;
50077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa
50177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  MockPayloadState mock_payload_state;
502e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_payload_state(&mock_payload_state);
503e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo
50477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  EXPECT_CALL(mock_payload_state, GetRollbackVersion())
50577f79e876a77796fc248d099b6574f05bd23c954Chris Sosa    .WillRepeatedly(Return(rollback_version));
50677f79e876a77796fc248d099b6574f05bd23c954Chris Sosa
5078e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.version = rollback_version;
50877f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  ASSERT_FALSE(
509e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
5108e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
51177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      -1,
51277f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      false,  // ping_only
513d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaUpdateIgnoredPerPolicy,
51477f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      metrics::CheckResult::kUpdateAvailable,
51577f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      metrics::CheckReaction::kIgnored,
51677f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      metrics::DownloadErrorCode::kUnset,
51777f79e876a77796fc248d099b6574f05bd23c954Chris Sosa                      &response,
51888b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
51977f79e876a77796fc248d099b6574f05bd23c954Chris Sosa  EXPECT_FALSE(response.update_exists);
52077f79e876a77796fc248d099b6574f05bd23c954Chris Sosa}
52177f79e876a77796fc248d099b6574f05bd23c954Chris Sosa
522e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
523480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
524e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestParams params = request_params_;
525ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
526ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(false);
527ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta::FromDays(2));
528480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
529480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_FALSE(
530e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(&params,
5318e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
532480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
533480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
534d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaUpdateDeferredPerPolicy,
53533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
53633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kDeferring,
53733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
538480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
53988b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
540480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_FALSE(response.update_exists);
541968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa
542968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  // Verify if we are interactive check we don't defer.
543968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  params.set_interactive(true);
544968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  ASSERT_TRUE(
545e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(&params,
5468e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
547968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      -1,
548968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      false,  // ping_only
549d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
55033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
55133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
55233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
553968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      &response,
55488b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
555968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  EXPECT_TRUE(response.update_exists);
556480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
557480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
558e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
559480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
560e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestParams params = request_params_;
561ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(false);
562ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta::FromDays(2));
563480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
564ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(true);
565ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_min_update_checks_needed(1);
566ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_max_update_checks_allowed(8);
567480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
568480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(
569e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(&params,
5708e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
571480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
572480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
573d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
57433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
57533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
57633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
577480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
57888b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
579480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_TRUE(response.update_exists);
580480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
581480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
582e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
583480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
584e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestParams params = request_params_;
585ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
586ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta::FromDays(2));
587480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
588ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(true);
589ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_min_update_checks_needed(1);
590ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_max_update_checks_allowed(8);
591480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
5928e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.max_days_to_scatter = "0";
593480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(
594e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(&params,
5958e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
596480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
597480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
598d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
59933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
60033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
60133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
602480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
60388b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
604480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_TRUE(response.update_exists);
605480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
606480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
607480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
608e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
609480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
610e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestParams params = request_params_;
611ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
612ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta());
613480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
614ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(true);
615ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_min_update_checks_needed(0);
616ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_max_update_checks_allowed(0);
617480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
618480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_TRUE(TestUpdateCheck(
619d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
6208e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
621480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
622480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
623d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
62433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
62533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
62633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
627480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
62888b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
629480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
6309abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t count;
631e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
632d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  ASSERT_EQ(count, 0);
633480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_TRUE(response.update_exists);
634480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
635480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
636e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
637480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
638e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestParams params = request_params_;
639ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
640ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta());
641480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
642ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(true);
643ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_min_update_checks_needed(1);
644ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_max_update_checks_allowed(8);
645480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
646480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_FALSE(TestUpdateCheck(
647d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
6488e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
649480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
650480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
651d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaUpdateDeferredPerPolicy,
65233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
65333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kDeferring,
65433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
655480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
65688b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
657480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
6589abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t count;
659e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
660d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  ASSERT_GT(count, 0);
661480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_FALSE(response.update_exists);
662968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa
663968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  // Verify if we are interactive check we don't defer.
664968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  params.set_interactive(true);
665968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  ASSERT_TRUE(
666e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(&params,
6678e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
668968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      -1,
669968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      false,  // ping_only
670d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
67133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
67233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
67333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
674968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      &response,
67588b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
676968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  EXPECT_TRUE(response.update_exists);
677480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
678480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
679e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
680480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  OmahaResponse response;
681e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestParams params = request_params_;
682ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
683ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta());
684480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
685ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(true);
686ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_min_update_checks_needed(1);
687ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_max_update_checks_allowed(8);
688480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
689e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsUpdateCheckCount, 5));
690480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
691480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  ASSERT_FALSE(TestUpdateCheck(
692d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
6938e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
694480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      -1,
695480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      false,  // ping_only
696d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaUpdateDeferredPerPolicy,
69733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
69833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kDeferring,
69933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
700480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan                      &response,
70188b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
702480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
7039abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t count;
704e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
705480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  // count remains the same, as the decrementing happens in update_attempter
706480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  // which this test doesn't exercise.
707d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  ASSERT_EQ(count, 5);
708480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_FALSE(response.update_exists);
709968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa
710968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  // Verify if we are interactive check we don't defer.
711968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  params.set_interactive(true);
712968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  ASSERT_TRUE(
713e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(&params,
7148e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
715968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      -1,
716968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      false,  // ping_only
717d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
71833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
71933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
72033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
721968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      &response,
72288b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
723968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  EXPECT_TRUE(response.update_exists);
724480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
7250a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan
7268e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex DeymoTEST_F(OmahaRequestActionTest, CohortsArePersisted) {
7278e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  OmahaResponse response;
7288e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  OmahaRequestParams params = request_params_;
7298e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.include_cohorts = true;
7308e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.cohort = "s/154454/8479665";
7318e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.cohorthint = "please-put-me-on-beta";
7328e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.cohortname = "stable";
7338e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
7348e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  ASSERT_TRUE(TestUpdateCheck(&params,
7358e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              fake_update_response_.GetUpdateResponse(),
7368e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              -1,
7378e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              false,  // ping_only
7388e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              ErrorCode::kSuccess,
7398e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              metrics::CheckResult::kUpdateAvailable,
7408e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              metrics::CheckReaction::kUpdating,
7418e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              metrics::DownloadErrorCode::kUnset,
7428e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              &response,
7438e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              nullptr));
7448e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
7458e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string value;
7468e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
7478e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(fake_update_response_.cohort, value);
7488e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
7498e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
7508e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(fake_update_response_.cohorthint, value);
7518e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
7528e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
7538e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(fake_update_response_.cohortname, value);
7548e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo}
7558e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
7568e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex DeymoTEST_F(OmahaRequestActionTest, CohortsAreUpdated) {
7578e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  OmahaResponse response;
7588e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  OmahaRequestParams params = request_params_;
7598e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohort, "old_value"));
7608e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohortHint, "old_hint"));
7618e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohortName, "old_name"));
7628e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.include_cohorts = true;
7638e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.cohort = "s/154454/8479665";
7648e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.cohorthint = "please-put-me-on-beta";
7658e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.cohortname = "";
7668e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
7678e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  ASSERT_TRUE(TestUpdateCheck(&params,
7688e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              fake_update_response_.GetUpdateResponse(),
7698e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              -1,
7708e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              false,  // ping_only
7718e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              ErrorCode::kSuccess,
7728e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              metrics::CheckResult::kUpdateAvailable,
7738e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              metrics::CheckReaction::kUpdating,
7748e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              metrics::DownloadErrorCode::kUnset,
7758e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              &response,
7768e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              nullptr));
7778e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
7788e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string value;
7798e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
7808e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(fake_update_response_.cohort, value);
7818e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
7828e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
7838e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(fake_update_response_.cohorthint, value);
7848e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
7858e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
7868e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo}
7878e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
7888e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex DeymoTEST_F(OmahaRequestActionTest, CohortsAreNotModifiedWhenMissing) {
7898e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  OmahaResponse response;
7908e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  OmahaRequestParams params = request_params_;
7918e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohort, "old_value"));
7928e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
7938e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  ASSERT_TRUE(TestUpdateCheck(&params,
7948e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              fake_update_response_.GetUpdateResponse(),
7958e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              -1,
7968e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              false,  // ping_only
7978e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              ErrorCode::kSuccess,
7988e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              metrics::CheckResult::kUpdateAvailable,
7998e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              metrics::CheckReaction::kUpdating,
8008e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              metrics::DownloadErrorCode::kUnset,
8018e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              &response,
8028e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                              nullptr));
8038e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
8048e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  string value;
8058e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
8068e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ("old_value", value);
8078e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
8088e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
8098e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
8108e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo}
8118e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo
81200d79acf5b081e80978fb0e07caeae77b99f0372Alex DeymoTEST_F(OmahaRequestActionTest, CohortsArePersistedWhenNoUpdate) {
81300d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo  OmahaResponse response;
81400d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo  OmahaRequestParams params = request_params_;
81500d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo  fake_update_response_.include_cohorts = true;
81600d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo  fake_update_response_.cohort = "s/154454/8479665";
81700d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo  fake_update_response_.cohorthint = "please-put-me-on-beta";
81800d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo  fake_update_response_.cohortname = "stable";
81900d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo
82000d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo  ASSERT_TRUE(TestUpdateCheck(&params,
82100d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo                              fake_update_response_.GetNoUpdateResponse(),
82200d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo                              -1,
82300d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo                              false,  // ping_only
82400d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo                              ErrorCode::kSuccess,
82500d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo                              metrics::CheckResult::kNoUpdateAvailable,
82600d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo                              metrics::CheckReaction::kUnset,
82700d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo                              metrics::DownloadErrorCode::kUnset,
82800d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo                              &response,
82900d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo                              nullptr));
83000d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo
83100d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo  string value;
83200d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo  EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
83300d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo  EXPECT_EQ(fake_update_response_.cohort, value);
83400d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo
83500d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo  EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
83600d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo  EXPECT_EQ(fake_update_response_.cohorthint, value);
83700d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo
83800d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo  EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
83900d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo  EXPECT_EQ(fake_update_response_.cohortname, value);
84000d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo}
84100d79acf5b081e80978fb0e07caeae77b99f0372Alex Deymo
842e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, NoOutputPipeTest) {
8438e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  const string http_response(fake_update_response_.GetNoUpdateResponse());
8446a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
8453f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::FakeMessageLoop loop(nullptr);
84660ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop.SetAsCurrent();
8476a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
848e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestParams params = request_params_;
849e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_request_params(&params);
850e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestAction action(&fake_system_state_, nullptr,
851c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                            brillo::make_unique_ptr(
852c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                                new MockHttpFetcher(http_response.data(),
853c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                                                    http_response.size(),
854c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                                                    nullptr)),
855116fda3221ff3df037ea1feb271883c87644c839Thieu Le                            false);
8566a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaRequestActionTestProcessorDelegate delegate;
8576a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor processor;
8586a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.set_delegate(&delegate);
8596a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&action);
8606a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
86160ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop.PostTask(base::Bind([&processor] { processor.StartProcessing(); }));
86260ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop.Run();
86360ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  EXPECT_FALSE(loop.PendingTasks());
8646a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(processor.IsRunning());
8656a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
8666a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
867e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, InvalidXmlTest) {
8686a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
8696a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_FALSE(
870e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
8710dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      "invalid xml>",
872edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
873265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
874d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaRequestXMLParseError,
87533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kParsingError,
87633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
87733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
878edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      &response,
87988b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
880edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  EXPECT_FALSE(response.update_exists);
881edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov}
882edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov
883e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, EmptyResponseTest) {
884edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  OmahaResponse response;
885edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  ASSERT_FALSE(
886e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
887edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      "",
888edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
889265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
890d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaRequestEmptyResponseError,
89133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kParsingError,
89233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
89333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
8940dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
89588b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
8966a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
8976a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
8986a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
899e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, MissingStatusTest) {
9006a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
9010dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ASSERT_FALSE(TestUpdateCheck(
902e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      nullptr,  // request_params
90323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
90423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<daystart elapsed_seconds=\"100\"/>"
90523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"foo\" status=\"ok\">"
90623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<ping status=\"ok\"/>"
90723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<updatecheck/></app></response>",
908edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      -1,
909265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov      false,  // ping_only
910d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      ErrorCode::kOmahaResponseInvalid,
91133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckResult::kParsingError,
91233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckReaction::kUnset,
91333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::DownloadErrorCode::kUnset,
9146a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      &response,
91588b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko      nullptr));
9166a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
9176a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
9186a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
919e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, InvalidStatusTest) {
9206a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
9210dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ASSERT_FALSE(TestUpdateCheck(
922e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      nullptr,  // request_params
92323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
92423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<daystart elapsed_seconds=\"100\"/>"
92523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"foo\" status=\"ok\">"
92623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<ping status=\"ok\"/>"
92723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
928edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      -1,
929265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov      false,  // ping_only
930d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      ErrorCode::kOmahaResponseInvalid,
93133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckResult::kParsingError,
93233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckReaction::kUnset,
93333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::DownloadErrorCode::kUnset,
9346a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      &response,
93588b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko      nullptr));
9366a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
9376a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
9386a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
939e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, MissingNodesetTest) {
9406a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
9410dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  ASSERT_FALSE(TestUpdateCheck(
942e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      nullptr,  // request_params
94323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
94423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<daystart elapsed_seconds=\"100\"/>"
94523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"foo\" status=\"ok\">"
94623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<ping status=\"ok\"/>"
94723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "</app></response>",
948edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov      -1,
949265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov      false,  // ping_only
950d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      ErrorCode::kOmahaResponseInvalid,
95133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckResult::kParsingError,
95233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::CheckReaction::kUnset,
95333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metrics::DownloadErrorCode::kUnset,
9546a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov      &response,
95588b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko      nullptr));
9566a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.update_exists);
9576a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
9586a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
959e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, MissingFieldTest) {
96023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  string input_response =
96123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
96223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<daystart elapsed_seconds=\"100\"/>"
96323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<app appid=\"xyz\" status=\"ok\">"
96423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<updatecheck status=\"ok\">"
96523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
9663b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa      "<manifest version=\"10.2.3.4\">"
96723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<packages><package hash=\"not-used\" name=\"f\" "
96823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "size=\"587\"/></packages>"
96923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "<actions><action event=\"postinstall\" "
97023b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "ChromeOSVersion=\"10.2.3.4\" "
97123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "Prompt=\"false\" "
97223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "IsDelta=\"true\" "
973d671e97c8cc87c71a01ee3e4a889753ea9bec35fJay Srinivasan      "IsDeltaPayload=\"false\" "
97423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "sha256=\"lkq34j5345\" "
97523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "needsadmin=\"true\" "
97623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "/></actions></manifest></updatecheck></app></response>";
97723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  LOG(INFO) << "Input Response = " << input_response;
97823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan
9796a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
980e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  ASSERT_TRUE(TestUpdateCheck(nullptr,  // request_params
98123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                              input_response,
982edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                              -1,
983265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                              false,  // ping_only
984d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                              ErrorCode::kSuccess,
98533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              metrics::CheckResult::kUpdateAvailable,
98633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              metrics::CheckReaction::kUpdating,
98733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              metrics::DownloadErrorCode::kUnset,
9880dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                              &response,
98988b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                              nullptr));
9906a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_TRUE(response.update_exists);
9913b74843840fda8e6954986bdd6a9fccc835d5580Chris Sosa  EXPECT_EQ("10.2.3.4", response.version);
9926f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
9936a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ("", response.more_info_url);
99423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ("lkq34j5345", response.hash);
99523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(587, response.size);
9966a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_FALSE(response.prompt);
9976c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov  EXPECT_TRUE(response.deadline.empty());
9986a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
9996a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
10006a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovnamespace {
10016a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkovclass TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
10026a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov public:
10036a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  void ProcessingStopped(const ActionProcessor* processor) {
10043f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko    brillo::MessageLoop::current()->BreakLoop();
10056a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  }
10066a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov};
10076a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
100860ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymovoid TerminateTransferTestStarter(ActionProcessor* processor) {
10096a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor->StartProcessing();
10106a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  CHECK(processor->IsRunning());
10116a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor->StopProcessing();
10126a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
1013d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko}  // namespace
10146a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1015e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, TerminateTransferTest) {
10163f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::FakeMessageLoop loop(nullptr);
101760ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop.SetAsCurrent();
10186a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
101960ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  string http_response("doesn't matter");
1020e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestAction action(&fake_system_state_, nullptr,
1021c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                            brillo::make_unique_ptr(
1022c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                                new MockHttpFetcher(http_response.data(),
1023c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                                                    http_response.size(),
1024c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                                                    nullptr)),
1025116fda3221ff3df037ea1feb271883c87644c839Thieu Le                            false);
10266a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  TerminateEarlyTestProcessorDelegate delegate;
10276a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ActionProcessor processor;
10286a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.set_delegate(&delegate);
10296a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  processor.EnqueueAction(&action);
10306a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
103160ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop.PostTask(base::Bind(&TerminateTransferTestStarter, &processor));
103260ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop.Run();
103360ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  EXPECT_FALSE(loop.PendingTasks());
10346a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
10356a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1036e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, XmlEncodeTest) {
1037b0d74eb91183eef5955974c515e40c994098372fAlex Deymo  string output;
1038b0d74eb91183eef5955974c515e40c994098372fAlex Deymo  EXPECT_TRUE(XmlEncode("ab", &output));
1039b0d74eb91183eef5955974c515e40c994098372fAlex Deymo  EXPECT_EQ("ab", output);
1040b0d74eb91183eef5955974c515e40c994098372fAlex Deymo  EXPECT_TRUE(XmlEncode("a<b", &output));
1041b0d74eb91183eef5955974c515e40c994098372fAlex Deymo  EXPECT_EQ("a&lt;b", output);
1042cc4578542d44889453db197672c97d8c3d3d9a1eAlex Deymo  EXPECT_TRUE(XmlEncode("<&>\"\'\\", &output));
1043cc4578542d44889453db197672c97d8c3d3d9a1eAlex Deymo  EXPECT_EQ("&lt;&amp;&gt;&quot;&apos;\\", output);
1044b0d74eb91183eef5955974c515e40c994098372fAlex Deymo  EXPECT_TRUE(XmlEncode("&lt;&amp;&gt;", &output));
1045b0d74eb91183eef5955974c515e40c994098372fAlex Deymo  EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", output);
1046cc4578542d44889453db197672c97d8c3d3d9a1eAlex Deymo  // Check that unterminated UTF-8 strings are handled properly.
1047b0d74eb91183eef5955974c515e40c994098372fAlex Deymo  EXPECT_FALSE(XmlEncode("\xc2", &output));
1048b0d74eb91183eef5955974c515e40c994098372fAlex Deymo  // Fail with invalid ASCII-7 chars.
1049b0d74eb91183eef5955974c515e40c994098372fAlex Deymo  EXPECT_FALSE(XmlEncode("This is an 'n' with a tilde: \xc3\xb1", &output));
1050b0d74eb91183eef5955974c515e40c994098372fAlex Deymo}
1051b0d74eb91183eef5955974c515e40c994098372fAlex Deymo
1052b0d74eb91183eef5955974c515e40c994098372fAlex DeymoTEST_F(OmahaRequestActionTest, XmlEncodeWithDefaultTest) {
1053b0d74eb91183eef5955974c515e40c994098372fAlex Deymo  EXPECT_EQ("&lt;&amp;&gt;", XmlEncodeWithDefault("<&>", "something else"));
1054b0d74eb91183eef5955974c515e40c994098372fAlex Deymo  EXPECT_EQ("<not escaped>", XmlEncodeWithDefault("\xc2", "<not escaped>"));
1055b0d74eb91183eef5955974c515e40c994098372fAlex Deymo}
10566a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1057b0d74eb91183eef5955974c515e40c994098372fAlex DeymoTEST_F(OmahaRequestActionTest, XmlEncodeIsUsedForParams) {
10583f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::Blob post_data;
10596a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
10606a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // Make sure XML Encode is being called on the params
1061e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestParams params(&fake_system_state_,
1062ac41a82e4be1be43913292d13d58b5eb2c572f53Alex Deymo                            constants::kOmahaPlatformName,
10636a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            OmahaRequestParams::kOsVersion,
10646a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            "testtheservice_pack>",
10651cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                            "x86 generic<id",
1066856166594771c61973856f563e622ccb7dd48aa1Alex Deymo                            kTestAppId,
10676a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            "0.1.0.0",
10686a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov                            "en-US",
10691cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                            "unittest_track&lt;",
1070fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov                            "<OEM MODEL>",
1071c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                            "ChromeOSFirmware.1.0",
1072c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                            "EC100",
1073d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                            false,   // delta okay
1074d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                            false,   // interactive
10750a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                            "http://url",
107674b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold                            "");     // target_version_prefix
10778e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_prefs_.SetString(kPrefsOmahaCohort, "evil\nstring");
10788e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_prefs_.SetString(kPrefsOmahaCohortHint, "evil&string\\");
10798e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_prefs_.SetString(kPrefsOmahaCohortName,
10800103c36caa2e38e034e0d22185736b9ccfb35c58Alex Vakulenko                        base::JoinString(
10810103c36caa2e38e034e0d22185736b9ccfb35c58Alex Vakulenko                            vector<string>(100, "My spoon is too big."), " "));
10826a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
10836a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_FALSE(
1084e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(&params,
10850dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      "invalid xml>",
1086edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1087265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1088d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaRequestXMLParseError,
108933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kParsingError,
109033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
109133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
10920dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
10930dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &post_data));
10946a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  // convert post_data to string
1095f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko  string post_str(post_data.begin(), post_data.end());
10968e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_NE(string::npos, post_str.find("testtheservice_pack&gt;"));
10978e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(string::npos, post_str.find("testtheservice_pack>"));
10988e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_NE(string::npos, post_str.find("x86 generic&lt;id"));
10998e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(string::npos, post_str.find("x86 generic<id"));
11008e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_NE(string::npos, post_str.find("unittest_track&amp;lt;"));
11018e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(string::npos, post_str.find("unittest_track&lt;"));
11028e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_NE(string::npos, post_str.find("&lt;OEM MODEL&gt;"));
11038e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(string::npos, post_str.find("<OEM MODEL>"));
11048e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_NE(string::npos, post_str.find("cohort=\"evil\nstring\""));
11058e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(string::npos, post_str.find("cohorthint=\"evil&string\\\""));
11068e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_NE(string::npos, post_str.find("cohorthint=\"evil&amp;string\\\""));
11078e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  // Values from Prefs that are too big are removed from the XML instead of
11088e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  // encoded.
11098e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  EXPECT_EQ(string::npos, post_str.find("cohortname="));
11106a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
11116a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1112e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, XmlDecodeTest) {
11136a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
11148e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.deadline = "&lt;20110101";
11158e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.more_info_url = "testthe&lt;url";
11168e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.codebase = "testthe&amp;codebase/";
11176a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
1118e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
11198e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
1120edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1121265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1122d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
112333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
112433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
112533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
11260dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
112788b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
11286a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
11296a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ(response.more_info_url, "testthe<url");
11306f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
11316c11864907e9a92f8069c77c08650102e0b34e0dDarin Petkov  EXPECT_EQ(response.deadline, "<20110101");
11326a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
11336a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1134e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, ParseIntTest) {
11356a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  OmahaResponse response;
11368e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  // overflows int32_t:
11378e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.size = 123123123123123ll;
11386a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  ASSERT_TRUE(
1139e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
11408e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
1141edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1142265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1143d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
114433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
114533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
114633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
11470dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                      &response,
114888b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
11496a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
11506a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov  EXPECT_EQ(response.size, 123123123123123ll);
11516a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}
11526a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov
1153e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
11543f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::Blob post_data;
11558427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  NiceMock<MockPrefs> prefs;
1156e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_prefs(&prefs);
1157e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo
115895508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov  EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
115995508da905b279a6b91aadfc7c4c72f57a5fa610Darin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
1160efb9d8394c58054cc8ebe1efd0fd2c5e7b4b344aAlex Deymo  // An existing but empty previous version means that we didn't reboot to a new
1161efb9d8394c58054cc8ebe1efd0fd2c5e7b4b344aAlex Deymo  // update, therefore, no need to update the previous version.
1162efb9d8394c58054cc8ebe1efd0fd2c5e7b4b344aAlex Deymo  EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
1163e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  ASSERT_FALSE(TestUpdateCheck(nullptr,  // request_params
11640dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                               "invalid xml>",
1165edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                               -1,
1166265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                               false,  // ping_only
1167d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                               ErrorCode::kOmahaRequestXMLParseError,
116833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckResult::kParsingError,
116933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckReaction::kUnset,
117033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::DownloadErrorCode::kUnset,
117188b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                               nullptr,  // response
11720dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov                               &post_data));
11730dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  // convert post_data to string
1174f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko  string post_str(post_data.begin(), post_data.end());
1175116fda3221ff3df037ea1feb271883c87644c839Thieu Le  EXPECT_NE(post_str.find(
117623b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "        <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
1177ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "        <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
11780a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan      string::npos);
1179fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov  EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1180fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov            string::npos);
1181c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa  EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1182c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa            string::npos);
1183c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa  EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1184c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa            string::npos);
1185efb9d8394c58054cc8ebe1efd0fd2c5e7b4b344aAlex Deymo  // No <event> tag should be sent if we didn't reboot to an update.
1186efb9d8394c58054cc8ebe1efd0fd2c5e7b4b344aAlex Deymo  EXPECT_EQ(post_str.find("<event"), string::npos);
11870dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
11880dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
11890a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan
1190e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
11913f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::Blob post_data;
1192e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  TestEvent(request_params_,
1193e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
1194e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            "invalid xml>",
1195e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            &post_data);
1196e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  // convert post_data to string
1197f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko  string post_str(post_data.begin(), post_data.end());
119875039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  string expected_event = base::StringPrintf(
119923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "        <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
1200e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kTypeUpdateDownloadStarted,
1201e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kResultSuccess);
1202e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_NE(post_str.find(expected_event), string::npos);
120323b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(post_str.find("ping"), string::npos);
120423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(post_str.find("updatecheck"), string::npos);
1205e17f86bae4299882232d3e6858ada68692e80501Darin Petkov}
1206e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
1207e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, FormatErrorEventOutputTest) {
12083f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::Blob post_data;
1209e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  TestEvent(request_params_,
1210e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
1211e17f86bae4299882232d3e6858ada68692e80501Darin Petkov                           OmahaEvent::kResultError,
1212d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                           ErrorCode::kError),
1213e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            "invalid xml>",
1214e17f86bae4299882232d3e6858ada68692e80501Darin Petkov            &post_data);
1215e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  // convert post_data to string
1216f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko  string post_str(post_data.begin(), post_data.end());
121775039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko  string expected_event = base::StringPrintf(
121823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "        <event eventtype=\"%d\" eventresult=\"%d\" "
121923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan      "errorcode=\"%d\"></event>\n",
1220e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kTypeDownloadComplete,
1221e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      OmahaEvent::kResultError,
1222d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      static_cast<int>(ErrorCode::kError));
12230dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  EXPECT_NE(post_str.find(expected_event), string::npos);
122423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(post_str.find("updatecheck"), string::npos);
12250dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
12260dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
1227e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, IsEventTest) {
12280dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  string http_response("doesn't matter");
1229e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // Create a copy of the OmahaRequestParams to reuse it later.
1230e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestParams params = request_params_;
1231e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_request_params(&params);
12320dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  OmahaRequestAction update_check_action(
1233e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      &fake_system_state_,
123488b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko      nullptr,
1235c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo      brillo::make_unique_ptr(
1236c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo          new MockHttpFetcher(http_response.data(),
1237c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                              http_response.size(),
1238c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                              nullptr)),
1239116fda3221ff3df037ea1feb271883c87644c839Thieu Le      false);
12400dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  EXPECT_FALSE(update_check_action.IsEvent());
12410dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
1242e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  params = request_params_;
1243e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_request_params(&params);
12440dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  OmahaRequestAction event_action(
1245e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      &fake_system_state_,
1246e17f86bae4299882232d3e6858ada68692e80501Darin Petkov      new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
1247c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo      brillo::make_unique_ptr(
1248c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo          new MockHttpFetcher(http_response.data(),
1249c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                              http_response.size(),
1250c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                              nullptr)),
1251116fda3221ff3df037ea1feb271883c87644c839Thieu Le      false);
12520dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov  EXPECT_TRUE(event_action.IsEvent());
12530dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov}
12540dc8e9a73fc3179a67a72ab72ceb2bc6540949bfDarin Petkov
1255e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
12563f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes  for (int i = 0; i < 2; i++) {
12573f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    bool delta_okay = i == 1;
12583f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    const char* delta_okay_str = delta_okay ? "true" : "false";
12593f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko    brillo::Blob post_data;
1260e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    OmahaRequestParams params(&fake_system_state_,
1261ac41a82e4be1be43913292d13d58b5eb2c572f53Alex Deymo                              constants::kOmahaPlatformName,
12623f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              OmahaRequestParams::kOsVersion,
12633f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "service_pack",
12643f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "x86-generic",
1265856166594771c61973856f563e622ccb7dd48aa1Alex Deymo                              kTestAppId,
12663f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "0.1.0.0",
12673f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "en-US",
12683f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              "unittest_track",
1269fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov                              "OEM MODEL REV 1234",
1270c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                              "ChromeOSFirmware.1.0",
1271c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                              "EC100",
12723f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                              delta_okay,
1273bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              false,  // interactive
12740a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan                              "http://url",
127574b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold                              "");    // target_version_prefix
1276e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    ASSERT_FALSE(TestUpdateCheck(&params,
12773f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                                 "invalid xml>",
1278edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                                 -1,
1279265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                                 false,  // ping_only
1280d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                                 ErrorCode::kOmahaRequestXMLParseError,
128133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::CheckResult::kParsingError,
128233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::CheckReaction::kUnset,
128333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::DownloadErrorCode::kUnset,
128488b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                                 nullptr,
12853f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes                                 &post_data));
12863f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes    // convert post_data to string
1287f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko    string post_str(post_data.begin(), post_data.end());
128875039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko    EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
128975039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko                                               delta_okay_str)),
12903f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes              string::npos)
12913f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes        << "i = " << i;
12923f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes  }
12933f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes}
12943f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes
1295e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, FormatInteractiveOutputTest) {
1296bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold  for (int i = 0; i < 2; i++) {
1297bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold    bool interactive = i == 1;
12988a659d80dc1912c664ef16f0bc66acaa01bd8b73Gilad Arnold    const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
12993f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko    brillo::Blob post_data;
13005bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    FakeSystemState fake_system_state;
1301e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    OmahaRequestParams params(&fake_system_state_,
1302ac41a82e4be1be43913292d13d58b5eb2c572f53Alex Deymo                              constants::kOmahaPlatformName,
1303bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              OmahaRequestParams::kOsVersion,
1304bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "service_pack",
1305bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "x86-generic",
1306856166594771c61973856f563e622ccb7dd48aa1Alex Deymo                              kTestAppId,
1307bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "0.1.0.0",
1308bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "en-US",
1309bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "unittest_track",
1310bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "OEM MODEL REV 1234",
1311c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                              "ChromeOSFirmware.1.0",
1312c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa                              "EC100",
13138f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                              true,   // delta_okay
1314bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              interactive,
1315bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                              "http://url",
131674b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold                              "");    // target_version_prefix
1317e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    ASSERT_FALSE(TestUpdateCheck(&params,
1318bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                                 "invalid xml>",
1319bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                                 -1,
1320bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                                 false,  // ping_only
1321d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                                 ErrorCode::kOmahaRequestXMLParseError,
132233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::CheckResult::kParsingError,
132333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::CheckReaction::kUnset,
132433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                 metrics::DownloadErrorCode::kUnset,
132588b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                                 nullptr,
1326bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold                                 &post_data));
1327bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold    // convert post_data to string
1328f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko    string post_str(post_data.begin(), post_data.end());
132975039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko    EXPECT_NE(post_str.find(base::StringPrintf("installsource=\"%s\"",
133075039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko                                               interactive_str)),
1331bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold              string::npos)
1332bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold        << "i = " << i;
1333bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold  }
1334bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold}
1335bbdd4909bcd20448ad89aa1e02c936e42aedf548Gilad Arnold
1336e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, OmahaEventTest) {
1337e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  OmahaEvent default_event;
1338e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1339e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
1340d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  EXPECT_EQ(ErrorCode::kError, default_event.error_code);
1341e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
1342e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1343e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1344e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
1345d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
1346e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
1347e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1348e17f86bae4299882232d3e6858ada68692e80501Darin Petkov                         OmahaEvent::kResultError,
1349d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                         ErrorCode::kError);
1350e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1351e17f86bae4299882232d3e6858ada68692e80501Darin Petkov  EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
1352d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  EXPECT_EQ(ErrorCode::kError, error_event.error_code);
1353e17f86bae4299882232d3e6858ada68692e80501Darin Petkov}
1354e17f86bae4299882232d3e6858ada68692e80501Darin Petkov
1355e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymovoid OmahaRequestActionTest::PingTest(bool ping_only) {
13568427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  NiceMock<MockPrefs> prefs;
1357e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_prefs(&prefs);
1358e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1359e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    .Times(AnyNumber());
1360e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
1361e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // Add a few hours to the day difference to test no rounding, etc.
1362e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  int64_t five_days_ago =
1363e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1364e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  int64_t six_days_ago =
1365e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1366e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1367e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
1368e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1369e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1370e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1371e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
13723f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::Blob post_data;
1373e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  ASSERT_TRUE(
1374e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
13758e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetNoUpdateResponse(),
1376e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                      -1,
1377e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                      ping_only,
1378e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                      ErrorCode::kSuccess,
1379e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                      metrics::CheckResult::kUnset,
1380e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                      metrics::CheckReaction::kUnset,
1381e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                      metrics::DownloadErrorCode::kUnset,
1382e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                      nullptr,
1383e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo                      &post_data));
1384f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko  string post_str(post_data.begin(), post_data.end());
1385e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
1386e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo            string::npos);
1387e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  if (ping_only) {
1388e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    EXPECT_EQ(post_str.find("updatecheck"), string::npos);
1389e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    EXPECT_EQ(post_str.find("previousversion"), string::npos);
1390e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  } else {
1391e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    EXPECT_NE(post_str.find("updatecheck"), string::npos);
1392e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    EXPECT_NE(post_str.find("previousversion"), string::npos);
1393265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov  }
13941cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
13951cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
1396e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, PingTestSendOnlyAPing) {
1397e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  PingTest(true  /* ping_only */);
1398e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo}
1399e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo
1400e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, PingTestSendAlsoAnUpdateCheck) {
1401e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  PingTest(false  /* ping_only */);
1402e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo}
1403e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo
1404e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, ActivePingTest) {
14058427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  NiceMock<MockPrefs> prefs;
1406e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_prefs(&prefs);
140733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
140833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    .Times(AnyNumber());
140933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
14101cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t three_days_ago =
14111cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
14121cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t now = Time::Now().ToInternalValue();
1413639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1414639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
14151cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
14161cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
14171cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
14181cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
14193f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::Blob post_data;
14201cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
1421e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
14228e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetNoUpdateResponse(),
1423edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1424265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1425d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
142633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
142733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
142833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
142988b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr,
14301cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
1431f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko  string post_str(post_data.begin(), post_data.end());
143223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
1433116fda3221ff3df037ea1feb271883c87644c839Thieu Le            string::npos);
14341cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
14351cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
1436e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, RollCallPingTest) {
14378427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  NiceMock<MockPrefs> prefs;
1438e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_prefs(&prefs);
143933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
144033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    .Times(AnyNumber());
144133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
14421cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t four_days_ago =
14431cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
14441cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t now = Time::Now().ToInternalValue();
1445639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1446639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
14471cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
14481cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
14491cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
14501cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
14513f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::Blob post_data;
14521cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
1453e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
14548e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetNoUpdateResponse(),
1455edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1456265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1457d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
145833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
145933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
146033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
146188b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr,
14621cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
1463f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko  string post_str(post_data.begin(), post_data.end());
146423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
1465116fda3221ff3df037ea1feb271883c87644c839Thieu Le            string::npos);
14661cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
14671cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
1468e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, NoPingTest) {
14698427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  NiceMock<MockPrefs> prefs;
1470e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_prefs(&prefs);
147133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
147233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    .Times(AnyNumber());
147333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
14741cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t one_hour_ago =
14751cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
1476639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1477639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
14781cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
14791cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
14801cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
14811cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1482ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo  // LastActivePingDay and PrefsLastRollCallPingDay are set even if we didn't
1483ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo  // send a ping.
1484ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1485ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo      .WillOnce(Return(true));
1486ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1487ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo      .WillOnce(Return(true));
14883f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::Blob post_data;
14891cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
1490e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
14918e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetNoUpdateResponse(),
1492edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1493265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1494d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
149533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
149633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
149733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
149888b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr,
14991cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
1500f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko  string post_str(post_data.begin(), post_data.end());
150123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(post_str.find("ping"), string::npos);
15021cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
15031cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
1504e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1505b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  // This test ensures that we ignore empty ping only requests.
15068427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  NiceMock<MockPrefs> prefs;
1507e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_prefs(&prefs);
1508b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  int64_t now = Time::Now().ToInternalValue();
1509b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1510b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le      .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1511b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1512b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le      .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1513b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1514b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
15153f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::Blob post_data;
1516b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le  EXPECT_TRUE(
1517e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
15188e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetNoUpdateResponse(),
1519b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le                      -1,
1520b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le                      true,  // ping_only
1521d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
152233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUnset,
152333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
152433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
152588b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr,
1526b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le                      &post_data));
152780f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo  EXPECT_EQ(0U, post_data.size());
1528b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le}
1529b44e9e8fcfdac6432ba45867fce0ec8557860734Thieu Le
1530e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, BackInTimePingTest) {
15318427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  NiceMock<MockPrefs> prefs;
1532e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_prefs(&prefs);
153333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
153433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    .Times(AnyNumber());
153533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
15361cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t future =
15371cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
1538639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1539639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen      .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
15401cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
15411cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
15421cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
15431cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
15441cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
15451cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
15461cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
15471cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
15483f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::Blob post_data;
15491cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
1550e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
155123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
155223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
15531cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
155423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<updatecheck status=\"noupdate\"/></app></response>",
1555edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1556265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1557d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
155833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
155933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
156033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
156188b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr,
15621cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      &post_data));
1563f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko  string post_str(post_data.begin(), post_data.end());
156423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan  EXPECT_EQ(post_str.find("ping"), string::npos);
15651cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
15661cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
1567e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, LastPingDayUpdateTest) {
15681cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  // This test checks that the action updates the last ping day to now
156984c763cffce6778711792944387fadb760c55c8dDarin Petkov  // minus 200 seconds with a slack of 5 seconds. Therefore, the test
15701cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  // may fail if it runs for longer than 5 seconds. It shouldn't run
15711cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  // that long though.
15721cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t midnight =
15731cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
15741cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  int64_t midnight_slack =
15751cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
15768427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  NiceMock<MockPrefs> prefs;
1577e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_prefs(&prefs);
157833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
157933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
15801cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
15811cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                              AllOf(Ge(midnight), Le(midnight_slack))))
15821cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
15831cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
15841cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                              AllOf(Ge(midnight), Le(midnight_slack))))
15851cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov      .WillOnce(Return(true));
15861cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
1587e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
158823b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
158923b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
15901cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
159123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<updatecheck status=\"noupdate\"/></app></response>",
1592edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1593265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1594d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
159533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
159633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
159733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
159888b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr,
159988b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
16001cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
16011cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
1602e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, NoElapsedSecondsTest) {
16038427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  NiceMock<MockPrefs> prefs;
1604e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_prefs(&prefs);
160533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
160633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
16071cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
16081cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
16091cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
1610e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
161123b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
161223b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "protocol=\"3.0\"><daystart blah=\"200\"/>"
16131cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
161423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<updatecheck status=\"noupdate\"/></app></response>",
1615edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1616265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1617d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
161833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
161933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
162033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
162188b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr,
162288b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
16231cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
16241cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
1625e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, BadElapsedSecondsTest) {
16268427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  NiceMock<MockPrefs> prefs;
1627e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_prefs(&prefs);
162833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
162933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
16301cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
16311cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
16321cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov  ASSERT_TRUE(
1633e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
163423b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
163523b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
16361cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov                      "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
163723b92a52e8781d68c451d6cd5e67aab1e5f82264Jay Srinivasan                      "<updatecheck status=\"noupdate\"/></app></response>",
1638edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      -1,
1639265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1640d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
164133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kNoUpdateAvailable,
164233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
164333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
164488b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr,
164588b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
16461cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov}
16471cbd78ffe68039a5781c3434816e03e64033dc0bDarin Petkov
1648e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, NoUniqueIDTest) {
16493f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::Blob post_data;
1650e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  ASSERT_FALSE(TestUpdateCheck(nullptr,  // request_params
165184c763cffce6778711792944387fadb760c55c8dDarin Petkov                               "invalid xml>",
1652edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                               -1,
1653265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                               false,  // ping_only
1654d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                               ErrorCode::kOmahaRequestXMLParseError,
165533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckResult::kParsingError,
165633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckReaction::kUnset,
165733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::DownloadErrorCode::kUnset,
165888b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                               nullptr,  // response
165984c763cffce6778711792944387fadb760c55c8dDarin Petkov                               &post_data));
166084c763cffce6778711792944387fadb760c55c8dDarin Petkov  // convert post_data to string
1661f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko  string post_str(post_data.begin(), post_data.end());
166284c763cffce6778711792944387fadb760c55c8dDarin Petkov  EXPECT_EQ(post_str.find("machineid="), string::npos);
166384c763cffce6778711792944387fadb760c55c8dDarin Petkov  EXPECT_EQ(post_str.find("userid="), string::npos);
166484c763cffce6778711792944387fadb760c55c8dDarin Petkov}
166584c763cffce6778711792944387fadb760c55c8dDarin Petkov
1666e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, NetworkFailureTest) {
1667edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  OmahaResponse response;
1668d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  const int http_error_code =
1669d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
1670edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  ASSERT_FALSE(
1671e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
1672edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      "",
1673edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      501,
1674265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1675d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      static_cast<ErrorCode>(http_error_code),
167633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kDownloadError,
167733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
167833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      static_cast<metrics::DownloadErrorCode>(501),
1679edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      &response,
168088b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
1681edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  EXPECT_FALSE(response.update_exists);
1682edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov}
1683edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov
1684e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1685edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  OmahaResponse response;
1686d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  const int http_error_code =
1687d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
1688edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  ASSERT_FALSE(
1689e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
1690edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      "",
1691edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      1500,
1692265f290d2be0a68b6266d5962f7c23290c0ced5fDarin Petkov                      false,  // ping_only
1693d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      static_cast<ErrorCode>(http_error_code),
169433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kDownloadError,
169533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUnset,
169633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kHttpStatusOther,
1697edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov                      &response,
169888b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
1699edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov  EXPECT_FALSE(response.update_exists);
1700edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov}
1701edc522e7e5c0c14c3f8a55fd2a0d23d8a6032917Darin Petkov
1702e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
170334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  OmahaResponse response;
1704e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestParams params = request_params_;
1705ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
1706ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta().FromDays(1));
1707ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(false);
170834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
170934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_FALSE(TestUpdateCheck(
1710d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
17118e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
171234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      -1,
171334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      false,  // ping_only
1714d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kOmahaUpdateDeferredPerPolicy,
171533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
171633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kDeferring,
171733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
171834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      &response,
171988b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
172034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
17219abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t timestamp = 0;
1722e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1723d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  ASSERT_GT(timestamp, 0);
172434b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  EXPECT_FALSE(response.update_exists);
1725968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa
1726968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  // Verify if we are interactive check we don't defer.
1727968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  params.set_interactive(true);
1728968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  ASSERT_TRUE(
1729e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(&params,
17308e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
1731968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      -1,
1732968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      false,  // ping_only
1733d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
173433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
173533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
173633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
1737968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa                      &response,
173888b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
1739968d057f7a37bc981e2a732fb07521cfc8dcb16aChris Sosa  EXPECT_TRUE(response.update_exists);
174034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan}
174134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
1742e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
174334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  OmahaResponse response;
1744e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestParams params = request_params_;
1745ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_wall_clock_based_wait_enabled(true);
1746ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_waiting_period(TimeDelta().FromDays(1));
1747ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.set_update_check_count_wait_enabled(false);
174834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
174934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  // Set the timestamp to a very old value such that it exceeds the
175034b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  // waiting period set above.
175134b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  Time t1;
175234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  Time::FromString("1/1/2012", &t1);
1753e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  ASSERT_TRUE(fake_prefs_.SetInt64(
1754e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
175534b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_TRUE(TestUpdateCheck(
1756d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko                      &params,
17578e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
175834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      -1,
175934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      false,  // ping_only
1760d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
176133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
176233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
176333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
176434b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan                      &response,
176588b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
176634b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
176734b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  EXPECT_TRUE(response.update_exists);
176834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
176934b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  // Make sure the timestamp t1 is unchanged showing that it was reused.
17709abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t timestamp = 0;
1771e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
177234b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan  ASSERT_TRUE(timestamp == t1.ToInternalValue());
177334b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan}
177434b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan
1775e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
1776eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  // Create a uniquely named test directory.
1777eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  string test_dir;
1778eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_TRUE(utils::MakeTempDirectory(
1779eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold          "omaha_request_action-test-XXXXXX", &test_dir));
1780eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold
1781eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1782eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
1783be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa                      kStatefulPartition + "/etc"));
17843f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::Blob post_data;
17858427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  NiceMock<MockPrefs> prefs;
1786e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_prefs(&prefs);
1787ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_TRUE(WriteFileString(
1788eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold      test_dir + "/etc/lsb-release",
1789ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1790ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1791ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1792ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_TRUE(WriteFileString(
1793eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold      test_dir + kStatefulPartition + "/etc/lsb-release",
1794ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
1795ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1796e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestParams params = request_params_;
1797d04f8e24716d5acca6a7d116b63851adc1506845Gilad Arnold  params.set_root(test_dir);
1798ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.Init("1.2.3.4", "", 0);
1799ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("canary-channel", params.current_channel());
1800ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("stable-channel", params.target_channel());
1801ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_TRUE(params.to_more_stable_channel());
1802ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_TRUE(params.is_powerwash_allowed());
1803e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  ASSERT_FALSE(TestUpdateCheck(&params,
1804ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               "invalid xml>",
1805ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               -1,
1806ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               false,  // ping_only
1807d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                               ErrorCode::kOmahaRequestXMLParseError,
180833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckResult::kParsingError,
180933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckReaction::kUnset,
181033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::DownloadErrorCode::kUnset,
181188b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                               nullptr,  // response
1812ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               &post_data));
1813ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  // convert post_data to string
1814f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko  string post_str(post_data.begin(), post_data.end());
1815ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_NE(string::npos, post_str.find(
1816ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "appid=\"{22222222-2222-2222-2222-222222222222}\" "
1817ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
1818ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "track=\"stable-channel\" from_track=\"canary-channel\" "));
1819eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold
1820110e030ba1a37787635e229bd36b42e33b9a9208Alex Deymo  ASSERT_TRUE(base::DeleteFile(base::FilePath(test_dir), true));
1821ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan}
1822ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan
1823e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, TestChangingToLessStableChannel) {
1824eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  // Create a uniquely named test directory.
1825eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  string test_dir;
1826eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_TRUE(utils::MakeTempDirectory(
1827eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold          "omaha_request_action-test-XXXXXX", &test_dir));
1828eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold
1829eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1830eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold  ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
1831be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa                      kStatefulPartition + "/etc"));
18323f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::Blob post_data;
18338427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  NiceMock<MockPrefs> prefs;
1834e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_prefs(&prefs);
1835ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_TRUE(WriteFileString(
1836eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold      test_dir + "/etc/lsb-release",
1837ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1838ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1839ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1840ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  ASSERT_TRUE(WriteFileString(
1841eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold      test_dir + kStatefulPartition + "/etc/lsb-release",
1842ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1843e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestParams params = request_params_;
1844d04f8e24716d5acca6a7d116b63851adc1506845Gilad Arnold  params.set_root(test_dir);
1845ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  params.Init("5.6.7.8", "", 0);
1846ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("stable-channel", params.current_channel());
1847ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("canary-channel", params.target_channel());
1848ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_FALSE(params.to_more_stable_channel());
1849ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_FALSE(params.is_powerwash_allowed());
1850e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  ASSERT_FALSE(TestUpdateCheck(&params,
1851ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               "invalid xml>",
1852ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               -1,
1853ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               false,  // ping_only
1854d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                               ErrorCode::kOmahaRequestXMLParseError,
185533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckResult::kParsingError,
185633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::CheckReaction::kUnset,
185733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                               metrics::DownloadErrorCode::kUnset,
185888b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                               nullptr,  // response
1859ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan                               &post_data));
1860ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  // convert post_data to string
1861f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko  string post_str(post_data.begin(), post_data.end());
1862ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_NE(string::npos, post_str.find(
1863ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "appid=\"{11111111-1111-1111-1111-111111111111}\" "
1864ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "version=\"5.6.7.8\" "
1865ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      "track=\"canary-channel\" from_track=\"stable-channel\""));
1866d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  EXPECT_EQ(string::npos, post_str.find("from_version"));
1867ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan}
1868ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan
1869ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo// Checks that the initial ping with a=-1 r=-1 is not send when the device
1870ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo// was powerwashed.
1871ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex DeymoTEST_F(OmahaRequestActionTest, PingWhenPowerwashed) {
1872ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo  fake_prefs_.SetString(kPrefsPreviousVersion, "");
1873ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo
1874ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo  // Flag that the device was powerwashed in the past.
1875ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo  fake_system_state_.fake_hardware()->SetPowerwashCount(1);
1876ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo
18773f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::Blob post_data;
1878ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo  ASSERT_TRUE(
1879ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo      TestUpdateCheck(nullptr,  // request_params
18808e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetNoUpdateResponse(),
1881ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo                      -1,
1882ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo                      false,  // ping_only
1883ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo                      ErrorCode::kSuccess,
1884ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo                      metrics::CheckResult::kNoUpdateAvailable,
1885ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo                      metrics::CheckReaction::kUnset,
1886ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo                      metrics::DownloadErrorCode::kUnset,
1887ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo                      nullptr,
1888ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo                      &post_data));
1889ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo  // We shouldn't send a ping in this case since powerwash > 0.
1890f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko  string post_str(post_data.begin(), post_data.end());
1891ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo  EXPECT_EQ(string::npos, post_str.find("<ping"));
1892ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo}
1893ebbe7ef75279183ba3cf055158dbbb3b3b605e0eAlex Deymo
18949fded1eee295295d33da477f00d9c9a240623e91Alex Deymo// Checks that the event 54 is sent on a reboot to a new update.
18959fded1eee295295d33da477f00d9c9a240623e91Alex DeymoTEST_F(OmahaRequestActionTest, RebootAfterUpdateEvent) {
18969fded1eee295295d33da477f00d9c9a240623e91Alex Deymo  // Flag that the device was updated in a previous boot.
18979fded1eee295295d33da477f00d9c9a240623e91Alex Deymo  fake_prefs_.SetString(kPrefsPreviousVersion, "1.2.3.4");
18989fded1eee295295d33da477f00d9c9a240623e91Alex Deymo
18999fded1eee295295d33da477f00d9c9a240623e91Alex Deymo  brillo::Blob post_data;
19009fded1eee295295d33da477f00d9c9a240623e91Alex Deymo  ASSERT_TRUE(
19019fded1eee295295d33da477f00d9c9a240623e91Alex Deymo      TestUpdateCheck(nullptr,  // request_params
19029fded1eee295295d33da477f00d9c9a240623e91Alex Deymo                      fake_update_response_.GetNoUpdateResponse(),
19039fded1eee295295d33da477f00d9c9a240623e91Alex Deymo                      -1,
19049fded1eee295295d33da477f00d9c9a240623e91Alex Deymo                      false,  // ping_only
19059fded1eee295295d33da477f00d9c9a240623e91Alex Deymo                      ErrorCode::kSuccess,
19069fded1eee295295d33da477f00d9c9a240623e91Alex Deymo                      metrics::CheckResult::kNoUpdateAvailable,
19079fded1eee295295d33da477f00d9c9a240623e91Alex Deymo                      metrics::CheckReaction::kUnset,
19089fded1eee295295d33da477f00d9c9a240623e91Alex Deymo                      metrics::DownloadErrorCode::kUnset,
19099fded1eee295295d33da477f00d9c9a240623e91Alex Deymo                      nullptr,
19109fded1eee295295d33da477f00d9c9a240623e91Alex Deymo                      &post_data));
19119fded1eee295295d33da477f00d9c9a240623e91Alex Deymo  string post_str(post_data.begin(), post_data.end());
19129fded1eee295295d33da477f00d9c9a240623e91Alex Deymo
19139fded1eee295295d33da477f00d9c9a240623e91Alex Deymo  // An event 54 is included and has the right version.
19149fded1eee295295d33da477f00d9c9a240623e91Alex Deymo  EXPECT_NE(string::npos,
19159fded1eee295295d33da477f00d9c9a240623e91Alex Deymo            post_str.find(base::StringPrintf(
19169fded1eee295295d33da477f00d9c9a240623e91Alex Deymo                              "<event eventtype=\"%d\"",
19179fded1eee295295d33da477f00d9c9a240623e91Alex Deymo                              OmahaEvent::kTypeRebootedAfterUpdate)));
19189fded1eee295295d33da477f00d9c9a240623e91Alex Deymo  EXPECT_NE(string::npos,
19199fded1eee295295d33da477f00d9c9a240623e91Alex Deymo            post_str.find("previousversion=\"1.2.3.4\"></event>"));
19209fded1eee295295d33da477f00d9c9a240623e91Alex Deymo
19219fded1eee295295d33da477f00d9c9a240623e91Alex Deymo  // The previous version flag should have been removed.
19229fded1eee295295d33da477f00d9c9a240623e91Alex Deymo  EXPECT_TRUE(fake_prefs_.Exists(kPrefsPreviousVersion));
19239fded1eee295295d33da477f00d9c9a240623e91Alex Deymo  string prev_version;
19249fded1eee295295d33da477f00d9c9a240623e91Alex Deymo  EXPECT_TRUE(fake_prefs_.GetString(kPrefsPreviousVersion, &prev_version));
19259fded1eee295295d33da477f00d9c9a240623e91Alex Deymo  EXPECT_TRUE(prev_version.empty());
19269fded1eee295295d33da477f00d9c9a240623e91Alex Deymo}
19279fded1eee295295d33da477f00d9c9a240623e91Alex Deymo
1928e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymovoid OmahaRequestActionTest::P2PTest(
1929e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    bool initial_allow_p2p_for_downloading,
1930e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    bool initial_allow_p2p_for_sharing,
1931e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    bool omaha_disable_p2p_for_downloading,
1932e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    bool omaha_disable_p2p_for_sharing,
1933e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    bool payload_state_allow_p2p_attempt,
1934e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    bool expect_p2p_client_lookup,
1935e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    const string& p2p_client_result_url,
1936e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    bool expected_allow_p2p_for_downloading,
1937e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    bool expected_allow_p2p_for_sharing,
1938e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo    const string& expected_p2p_url) {
19398f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  OmahaResponse response;
1940e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  OmahaRequestParams request_params = request_params_;
194174b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  bool actual_allow_p2p_for_downloading = initial_allow_p2p_for_downloading;
194274b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  bool actual_allow_p2p_for_sharing = initial_allow_p2p_for_sharing;
194374b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  string actual_p2p_url;
19448f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
19458f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  MockPayloadState mock_payload_state;
1946e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_payload_state(&mock_payload_state);
19478f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
19488f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
194974b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_CALL(mock_payload_state, GetUsingP2PForDownloading())
195074b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold      .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_downloading));
195174b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_CALL(mock_payload_state, GetUsingP2PForSharing())
195274b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold      .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_sharing));
195374b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_CALL(mock_payload_state, SetUsingP2PForDownloading(_))
195474b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold      .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_downloading));
195574b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_CALL(mock_payload_state, SetUsingP2PForSharing(_))
195674b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold      .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_sharing));
195774b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_CALL(mock_payload_state, SetP2PUrl(_))
195874b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold      .WillRepeatedly(SaveArg<0>(&actual_p2p_url));
195974b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold
19608f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  MockP2PManager mock_p2p_manager;
1961e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.set_p2p_manager(&mock_p2p_manager);
19628f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
19638f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
19644cc5ed215180d19598d8b99f0a8a15cc24b831fcDavid Zeuthen  TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
19654cc5ed215180d19598d8b99f0a8a15cc24b831fcDavid Zeuthen  EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
19668f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen      .Times(expect_p2p_client_lookup ? 1 : 0);
19678f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
19688e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.disable_p2p_for_downloading =
19698e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo      omaha_disable_p2p_for_downloading;
19708e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.disable_p2p_for_sharing = omaha_disable_p2p_for_sharing;
19718f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  ASSERT_TRUE(
1972e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(&request_params,
19738e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
19748f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      -1,
19758f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      false,  // ping_only
1976d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
197733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
197833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
197933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
19808f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen                      &response,
198188b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr));
19828f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_TRUE(response.update_exists);
19838f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
198474b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_EQ(omaha_disable_p2p_for_downloading,
198574b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold            response.disable_p2p_for_downloading);
198674b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_EQ(omaha_disable_p2p_for_sharing,
198774b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold            response.disable_p2p_for_sharing);
19888f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
198974b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_EQ(expected_allow_p2p_for_downloading,
199074b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold            actual_allow_p2p_for_downloading);
199174b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_EQ(expected_allow_p2p_for_sharing, actual_allow_p2p_for_sharing);
199274b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_EQ(expected_p2p_url, actual_p2p_url);
19938f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
19948f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
1995e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, P2PWithPeer) {
1996d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  P2PTest(true,                   // initial_allow_p2p_for_downloading
1997d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // initial_allow_p2p_for_sharing
1998d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_downloading
1999d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_sharing
2000d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // payload_state_allow_p2p_attempt
2001d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expect_p2p_client_lookup
2002d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "http://1.3.5.7/p2p",   // p2p_client_result_url
2003d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expected_allow_p2p_for_downloading
2004d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expected_allow_p2p_for_sharing
2005d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "http://1.3.5.7/p2p");  // expected_p2p_url
20068f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
20078f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
2008e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, P2PWithoutPeer) {
2009d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  P2PTest(true,                   // initial_allow_p2p_for_downloading
2010d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // initial_allow_p2p_for_sharing
2011d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_downloading
2012d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_sharing
2013d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // payload_state_allow_p2p_attempt
2014d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expect_p2p_client_lookup
2015d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "",                     // p2p_client_result_url
2016d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expected_allow_p2p_for_downloading
2017d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expected_allow_p2p_for_sharing
2018d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "");                    // expected_p2p_url
20198f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
20208f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
2021e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, P2PDownloadNotAllowed) {
2022d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  P2PTest(false,                  // initial_allow_p2p_for_downloading
2023d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // initial_allow_p2p_for_sharing
2024d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_downloading
2025d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_sharing
2026d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // payload_state_allow_p2p_attempt
2027d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expect_p2p_client_lookup
2028d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "unset",                // p2p_client_result_url
2029d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expected_allow_p2p_for_downloading
2030d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expected_allow_p2p_for_sharing
2031d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "");                    // expected_p2p_url
20328f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
20338f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
2034e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
2035d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  P2PTest(true,                   // initial_allow_p2p_for_downloading
2036d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // initial_allow_p2p_for_sharing
2037d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // omaha_disable_p2p_for_downloading
2038d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_sharing
2039d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // payload_state_allow_p2p_attempt
2040d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expect_p2p_client_lookup
2041d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "unset",                // p2p_client_result_url
2042d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expected_allow_p2p_for_downloading
2043d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expected_allow_p2p_for_sharing
2044d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "");                    // expected_p2p_url
20458f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
20468f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
2047e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
2048d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  P2PTest(true,                   // initial_allow_p2p_for_downloading
2049d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // initial_allow_p2p_for_sharing
2050d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // omaha_disable_p2p_for_downloading
2051d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // omaha_disable_p2p_for_sharing
2052d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // payload_state_allow_p2p_attempt
2053d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expect_p2p_client_lookup
2054d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "http://1.3.5.7/p2p",   // p2p_client_result_url
2055d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // expected_allow_p2p_for_downloading
2056d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expected_allow_p2p_for_sharing
2057d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "http://1.3.5.7/p2p");  // expected_p2p_url
20588f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
20598f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
2060e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
2061d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko  P2PTest(true,                   // initial_allow_p2p_for_downloading
2062d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // initial_allow_p2p_for_sharing
2063d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // omaha_disable_p2p_for_downloading
2064d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // omaha_disable_p2p_for_sharing
2065d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          true,                   // payload_state_allow_p2p_attempt
2066d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expect_p2p_client_lookup
2067d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "unset",                // p2p_client_result_url
2068d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expected_allow_p2p_for_downloading
2069d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          false,                  // expected_allow_p2p_for_sharing
2070d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko          "");                    // expected_p2p_url
20718f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
20728f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
2073f329b933db41d26644a97afef928eb1b319d6d99Alex Deymobool OmahaRequestActionTest::InstallDateParseHelper(const string &elapsed_days,
2074f329b933db41d26644a97afef928eb1b319d6d99Alex Deymo                                                    OmahaResponse *response) {
20758e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo  fake_update_response_.elapsed_days = elapsed_days;
2076639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  return
2077e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo      TestUpdateCheck(nullptr,  // request_params
20788e18f931f634d7c3b3a5fcbfc057e79fa9d6fb80Alex Deymo                      fake_update_response_.GetUpdateResponse(),
2079639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      -1,
2080639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      false,  // ping_only
2081d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                      ErrorCode::kSuccess,
208233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckResult::kUpdateAvailable,
208333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::CheckReaction::kUpdating,
208433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                      metrics::DownloadErrorCode::kUnset,
2085639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen                      response,
208688b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                      nullptr);
2087639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen}
2088639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2089e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, ParseInstallDateFromResponse) {
2090639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  OmahaResponse response;
2091639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2092639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // Check that we parse elapsed_days in the Omaha Response correctly.
2093639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // and that the kPrefsInstallDateDays value is written to.
2094e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2095e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_TRUE(InstallDateParseHelper("42", &response));
2096639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(response.update_exists);
2097639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(42, response.install_date_days);
2098e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
2099639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  int64_t prefs_days;
2100e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2101639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(prefs_days, 42);
2102639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2103639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // If there already is a value set, we shouldn't do anything.
2104e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_TRUE(InstallDateParseHelper("7", &response));
2105639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(response.update_exists);
2106639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(7, response.install_date_days);
2107e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2108639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(prefs_days, 42);
2109639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2110639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // Note that elapsed_days is not necessarily divisible by 7 so check
2111639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // that we round down correctly when populating kPrefsInstallDateDays.
2112e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2113e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_TRUE(InstallDateParseHelper("23", &response));
2114639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(response.update_exists);
2115639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(23, response.install_date_days);
2116e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2117639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(prefs_days, 21);
2118639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2119639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // Check that we correctly handle elapsed_days not being included in
2120639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  // the Omaha Response.
2121e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_TRUE(InstallDateParseHelper("", &response));
2122639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_TRUE(response.update_exists);
2123639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen  EXPECT_EQ(-1, response.install_date_days);
2124639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen}
2125639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2126e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo// If there is no prefs and OOBE is not complete, we should not
2127e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo// report anything to Omaha.
2128e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, GetInstallDateWhenNoPrefsNorOOBE) {
2129e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2130e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2131e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo}
2132639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2133e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo// If OOBE is complete and happened on a valid date (e.g. after Jan
2134e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo// 1 2007 0:00 PST), that date should be used and written to
2135e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo// prefs. However, first try with an invalid date and check we do
2136e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo// nothing.
2137e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithInvalidDate) {
2138e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  Time oobe_date = Time::FromTimeT(42);  // Dec 31, 1969 16:00:42 PST.
2139e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2140e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2141e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2142e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo}
2143639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2144e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo// Then check with a valid date. The date Jan 20, 2007 0:00 PST
2145e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo// should yield an InstallDate of 14.
2146e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithValidDate) {
2147e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  Time oobe_date = Time::FromTimeT(1169280000);  // Jan 20, 2007 0:00 PST.
2148e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2149e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
2150e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
2151639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2152e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  int64_t prefs_days;
2153e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2154e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_EQ(prefs_days, 14);
2155e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo}
2156639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2157e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo// Now that we have a valid date in prefs, check that we keep using
2158e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo// that even if OOBE date reports something else. The date Jan 30,
2159e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo// 2007 0:00 PST should yield an InstallDate of 28... but since
2160e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo// there's a prefs file, we should still get 14.
2161e1e3afe30a214b3661a36474c1448f520662f33cAlex DeymoTEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedDateChanges) {
2162e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // Set a valid date in the prefs first.
2163e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_TRUE(fake_prefs_.SetInt64(kPrefsInstallDateDays, 14));
2164639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2165e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  Time oobe_date = Time::FromTimeT(1170144000);  // Jan 30, 2007 0:00 PST.
2166e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2167e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
2168639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
2169e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  int64_t prefs_days;
2170e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2171e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_EQ(prefs_days, 14);
2172e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo
2173e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  // If we delete the prefs file, we should get 28 days.
2174e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2175e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 28);
2176e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2177e1e3afe30a214b3661a36474c1448f520662f33cAlex Deymo  EXPECT_EQ(prefs_days, 28);
2178639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen}
2179639aa36fc7e27ba400402cd7a32b091f555783a6David Zeuthen
21806a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov}  // namespace chromeos_update_engine
2181