blob: d2108792a151a02bbcd39cd5acbb9cbcf0bf7d0c [file] [log] [blame]
Mike Frysinger8155d082012-04-06 15:23:18 -04001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkov6a5b3222010-07-13 14:55:28 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <string>
6#include <vector>
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07007
Darin Petkov6a5b3222010-07-13 14:55:28 -07008#include <glib.h>
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07009
Alex Vakulenko75039d72014-03-25 12:36:28 -070010#include <base/strings/string_util.h>
11#include <base/strings/stringprintf.h>
12#include <base/time/time.h>
Chris Sosa77f79e82014-06-02 18:16:24 -070013#include <chromeos/dbus/service_constants.h>
Darin Petkov0dc8e9a2010-07-14 14:51:57 -070014#include "gtest/gtest.h"
Jay Srinivasand29695d2013-04-08 15:08:05 -070015
Darin Petkov6a5b3222010-07-13 14:55:28 -070016#include "update_engine/action_pipe.h"
Jay Srinivasand29695d2013-04-08 15:08:05 -070017#include "update_engine/constants.h"
Chris Sosa77f79e82014-06-02 18:16:24 -070018#include "update_engine/mock_connection_manager.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070019#include "update_engine/mock_http_fetcher.h"
20#include "update_engine/omaha_hash_calculator.h"
21#include "update_engine/omaha_request_action.h"
Darin Petkova4a8a8c2010-07-15 22:21:12 -070022#include "update_engine/omaha_request_params.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070023#include "update_engine/prefs.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070024#include "update_engine/test_utils.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070025#include "update_engine/utils.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070026
Darin Petkov1cbd78f2010-07-29 12:38:34 -070027using base::Time;
28using base::TimeDelta;
Darin Petkov6a5b3222010-07-13 14:55:28 -070029using std::string;
30using std::vector;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070031using testing::_;
32using testing::AllOf;
Jay Srinivasan34b5d862012-07-23 11:43:22 -070033using testing::DoAll;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070034using testing::Ge;
35using testing::Le;
Darin Petkov9c096d62010-11-17 14:49:04 -080036using testing::NiceMock;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070037using testing::Return;
38using testing::SetArgumentPointee;
David Zeuthen33bae492014-02-25 16:16:18 -080039using testing::AnyNumber;
Darin Petkov6a5b3222010-07-13 14:55:28 -070040
41namespace chromeos_update_engine {
42
Jay Srinivasanae4697c2013-03-18 17:08:08 -070043class OmahaRequestActionTest : public ::testing::Test {};
Darin Petkov6a5b3222010-07-13 14:55:28 -070044
45namespace {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070046
Gilad Arnold5bb4c902014-04-10 12:32:13 -070047FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070048OmahaRequestParams kDefaultTestParams(
Gilad Arnold5bb4c902014-04-10 12:32:13 -070049 &fake_system_state,
Darin Petkov1cbd78f2010-07-29 12:38:34 -070050 OmahaRequestParams::kOsPlatform,
51 OmahaRequestParams::kOsVersion,
52 "service_pack",
53 "x86-generic",
54 OmahaRequestParams::kAppId,
55 "0.1.0.0",
56 "en-US",
57 "unittest",
Darin Petkovfbb40092010-07-29 17:05:50 -070058 "OEM MODEL 09235 7471",
Chris Sosac1972482013-04-30 22:31:10 -070059 "ChromeOSFirmware.1.0",
60 "0X0A1",
Alex Vakulenkod2779df2014-06-16 13:19:00 -070061 false, // delta okay
62 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -070063 "http://url",
Alex Vakulenkod2779df2014-06-16 13:19:00 -070064 false, // update_disabled
65 "", // target_version_prefix
66 false, // use_p2p_for_downloading
67 false); // use_p2p_for_sharing
Darin Petkov1cbd78f2010-07-29 12:38:34 -070068
Darin Petkov6a5b3222010-07-13 14:55:28 -070069string GetNoUpdateResponse(const string& app_id) {
70 return string(
Jay Srinivasan23b92a52012-10-27 02:00:21 -070071 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
72 "<daystart elapsed_seconds=\"100\"/>"
73 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
74 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
Darin Petkov6a5b3222010-07-13 14:55:28 -070075}
76
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070077string GetUpdateResponse2(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -070078 const string& version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070079 const string& more_info_url,
80 const string& prompt,
81 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -070082 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070083 const string& hash,
84 const string& needsadmin,
85 const string& size,
86 const string& deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -070087 const string& max_days_to_scatter,
David Zeuthen639aa362014-02-03 16:23:44 -080088 const string& elapsed_days,
David Zeuthen8f191b22013-08-06 12:27:50 -070089 bool disable_p2p_for_downloading,
90 bool disable_p2p_for_sharing) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -070091 string response =
92 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
93 "protocol=\"3.0\">"
David Zeuthen639aa362014-02-03 16:23:44 -080094 "<daystart elapsed_seconds=\"100\"" +
95 (elapsed_days.empty() ? "" : (" elapsed_days=\"" + elapsed_days + "\"")) +
96 "/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -070097 "<app appid=\"" + app_id + "\" status=\"ok\">"
98 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
99 "<urls><url codebase=\"" + codebase + "\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -0700100 "<manifest version=\"" + version + "\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700101 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
102 "size=\"" + size + "\"/></packages>"
103 "<actions><action event=\"postinstall\" "
Chris Sosa3b748432013-06-20 16:42:59 -0700104 "ChromeOSVersion=\"" + version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700105 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
106 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800107 "IsDeltaPayload=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700108 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700109 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700110 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700111 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
David Zeuthen8f191b22013-08-06 12:27:50 -0700112 (disable_p2p_for_downloading ?
113 "DisableP2PForDownloading=\"true\" " : "") +
114 (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700115 "/></actions></manifest></updatecheck></app></response>";
116 LOG(INFO) << "Response = " << response;
117 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700118}
119
Darin Petkov6a5b3222010-07-13 14:55:28 -0700120string GetUpdateResponse(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700121 const string& version,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700122 const string& more_info_url,
123 const string& prompt,
124 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700125 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700126 const string& hash,
127 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700128 const string& size,
129 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700130 return GetUpdateResponse2(app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700131 version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700132 more_info_url,
133 prompt,
134 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700135 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700136 hash,
137 needsadmin,
138 size,
139 deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -0700140 "7",
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700141 "42", // elapsed_days
142 false, // disable_p2p_for_downloading
143 false); // disable_p2p_for sharing
Darin Petkov6a5b3222010-07-13 14:55:28 -0700144}
145
146class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
147 public:
148 OmahaRequestActionTestProcessorDelegate()
149 : loop_(NULL),
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700150 expected_code_(ErrorCode::kSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700151 virtual ~OmahaRequestActionTestProcessorDelegate() {
152 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700153 virtual void ProcessingDone(const ActionProcessor* processor,
David Zeuthena99981f2013-04-29 13:42:47 -0700154 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700155 ASSERT_TRUE(loop_);
156 g_main_loop_quit(loop_);
157 }
158
159 virtual void ActionCompleted(ActionProcessor* processor,
160 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -0700161 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700162 // make sure actions always succeed
163 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700164 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700165 else
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700166 EXPECT_EQ(ErrorCode::kSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700167 }
168 GMainLoop *loop_;
David Zeuthena99981f2013-04-29 13:42:47 -0700169 ErrorCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700170};
171
172gboolean StartProcessorInRunLoop(gpointer data) {
173 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
174 processor->StartProcessing();
175 return FALSE;
176}
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700177} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -0700178
179class OutputObjectCollectorAction;
180
181template<>
182class ActionTraits<OutputObjectCollectorAction> {
183 public:
184 // Does not take an object for input
185 typedef OmahaResponse InputObjectType;
186 // On success, puts the output path on output
187 typedef NoneType OutputObjectType;
188};
189
190class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
191 public:
192 OutputObjectCollectorAction() : has_input_object_(false) {}
193 void PerformAction() {
194 // copy input object
195 has_input_object_ = HasInputObject();
196 if (has_input_object_)
197 omaha_response_ = GetInputObject();
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700198 processor_->ActionComplete(this, ErrorCode::kSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700199 }
200 // Should never be called
201 void TerminateProcessing() {
202 CHECK(false);
203 }
204 // Debugging/logging
205 static std::string StaticType() {
206 return "OutputObjectCollectorAction";
207 }
208 std::string Type() const { return StaticType(); }
209 bool has_input_object_;
210 OmahaResponse omaha_response_;
211};
212
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700213// Returns true iff an output response was obtained from the
Darin Petkovedc522e2010-11-05 09:35:17 -0700214// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
David Zeuthen8f191b22013-08-06 12:27:50 -0700215// used. |payload_state| may be NULL, in which case a local mock is used.
216// |p2p_manager| may be NULL, in which case a local mock is used.
Chris Sosa77f79e82014-06-02 18:16:24 -0700217// |connection_manager| may be NULL, in which case a local mock is used.
David Zeuthen8f191b22013-08-06 12:27:50 -0700218// out_response may be NULL. If |fail_http_response_code| is non-negative,
Darin Petkov265f2902011-05-09 15:17:40 -0700219// the transfer will fail with that code. |ping_only| is passed through to the
220// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
221// post-data received by the mock HttpFetcher is returned.
David Zeuthen33bae492014-02-25 16:16:18 -0800222//
223// The |expected_check_result|, |expected_check_reaction| and
224// |expected_error_code| parameters are for checking expectations
225// about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
226// UMA statistics. Use the appropriate ::kUnset value to specify that
227// the given metric should not be reported.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700228bool TestUpdateCheck(PrefsInterface* prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -0700229 PayloadStateInterface *payload_state,
230 P2PManager *p2p_manager,
Chris Sosa77f79e82014-06-02 18:16:24 -0700231 ConnectionManager *connection_manager,
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700232 OmahaRequestParams* params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700233 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700234 int fail_http_response_code,
Darin Petkov265f2902011-05-09 15:17:40 -0700235 bool ping_only,
David Zeuthena99981f2013-04-29 13:42:47 -0700236 ErrorCode expected_code,
David Zeuthen33bae492014-02-25 16:16:18 -0800237 metrics::CheckResult expected_check_result,
238 metrics::CheckReaction expected_check_reaction,
239 metrics::DownloadErrorCode expected_download_error_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700240 OmahaResponse* out_response,
241 vector<char>* out_post_data) {
242 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
243 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800244 http_response.size(),
245 NULL);
Darin Petkovedc522e2010-11-05 09:35:17 -0700246 if (fail_http_response_code >= 0) {
247 fetcher->FailTransfer(fail_http_response_code);
248 }
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700249 FakeSystemState fake_system_state;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800250 if (prefs)
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700251 fake_system_state.set_prefs(prefs);
David Zeuthen8f191b22013-08-06 12:27:50 -0700252 if (payload_state)
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700253 fake_system_state.set_payload_state(payload_state);
David Zeuthen8f191b22013-08-06 12:27:50 -0700254 if (p2p_manager)
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700255 fake_system_state.set_p2p_manager(p2p_manager);
Chris Sosa77f79e82014-06-02 18:16:24 -0700256 if (connection_manager)
257 fake_system_state.set_connection_manager(connection_manager);
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700258 fake_system_state.set_request_params(params);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700259 OmahaRequestAction action(&fake_system_state,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700260 NULL,
Thieu Le116fda32011-04-19 11:01:54 -0700261 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700262 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700263 OmahaRequestActionTestProcessorDelegate delegate;
264 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700265 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700266
Darin Petkov6a5b3222010-07-13 14:55:28 -0700267 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700268 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700269 processor.EnqueueAction(&action);
270
271 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700272 BondActions(&action, &collector_action);
273 processor.EnqueueAction(&collector_action);
274
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700275 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800276 .Times(AnyNumber());
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700277 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800278 SendEnumToUMA(metrics::kMetricCheckResult,
279 static_cast<int>(expected_check_result),
280 static_cast<int>(metrics::CheckResult::kNumConstants) - 1))
281 .Times(expected_check_result == metrics::CheckResult::kUnset ? 0 : 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700282 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800283 SendEnumToUMA(metrics::kMetricCheckReaction,
284 static_cast<int>(expected_check_reaction),
285 static_cast<int>(metrics::CheckReaction::kNumConstants) - 1))
286 .Times(expected_check_reaction == metrics::CheckReaction::kUnset ? 0 : 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700287 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
David Zeuthenc0dd0212014-04-04 14:49:49 -0700288 SendSparseToUMA(metrics::kMetricCheckDownloadErrorCode,
289 static_cast<int>(expected_download_error_code)))
David Zeuthen33bae492014-02-25 16:16:18 -0800290 .Times(expected_download_error_code == metrics::DownloadErrorCode::kUnset
291 ? 0 : 1);
292
Darin Petkov6a5b3222010-07-13 14:55:28 -0700293 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
294 g_main_loop_run(loop);
295 g_main_loop_unref(loop);
296 if (collector_action.has_input_object_ && out_response)
297 *out_response = collector_action.omaha_response_;
298 if (out_post_data)
299 *out_post_data = fetcher->post_data();
300 return collector_action.has_input_object_;
301}
302
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700303// Tests Event requests -- they should always succeed. |out_post_data|
304// may be null; if non-null, the post-data received by the mock
305// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700306void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700307 OmahaEvent* event,
308 const string& http_response,
309 vector<char>* out_post_data) {
310 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
311 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800312 http_response.size(),
313 NULL);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700314 FakeSystemState fake_system_state;
315 fake_system_state.set_request_params(&params);
316 OmahaRequestAction action(&fake_system_state, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700317 OmahaRequestActionTestProcessorDelegate delegate;
318 delegate.loop_ = loop;
319 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700320 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700321 processor.EnqueueAction(&action);
322
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700323 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
324 g_main_loop_run(loop);
325 g_main_loop_unref(loop);
326 if (out_post_data)
327 *out_post_data = fetcher->post_data();
328}
329
Darin Petkov6a5b3222010-07-13 14:55:28 -0700330TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700331 OmahaResponse response;
332 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700333 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700334 NULL, // payload_state
335 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700336 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700337 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700338 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700339 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700340 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700341 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800342 metrics::CheckResult::kNoUpdateAvailable,
343 metrics::CheckReaction::kUnset,
344 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700345 &response,
346 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700347 EXPECT_FALSE(response.update_exists);
348}
349
350TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700351 OmahaResponse response;
352 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700353 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700354 NULL, // payload_state
355 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700356 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700357 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700358 GetUpdateResponse(OmahaRequestParams::kAppId,
359 "1.2.3.4", // version
360 "http://more/info",
361 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700362 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700363 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700364 "HASH1234=", // checksum
365 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700366 "123", // size
367 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700368 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700369 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700370 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800371 metrics::CheckResult::kUpdateAvailable,
372 metrics::CheckReaction::kUpdating,
373 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700374 &response,
375 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700376 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700377 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700378 EXPECT_EQ("1.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800379 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700380 EXPECT_EQ("http://more/info", response.more_info_url);
381 EXPECT_EQ("HASH1234=", response.hash);
382 EXPECT_EQ(123, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700383 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700384 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700385}
386
Jay Srinivasan0a708742012-03-20 11:26:12 -0700387TEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
388 OmahaResponse response;
389 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700390 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700391 ASSERT_FALSE(
392 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700393 NULL, // payload_state
394 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700395 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700396 &params,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700397 GetUpdateResponse(OmahaRequestParams::kAppId,
398 "1.2.3.4", // version
399 "http://more/info",
400 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700401 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700402 "file.signed", // file name
Jay Srinivasan0a708742012-03-20 11:26:12 -0700403 "HASH1234=", // checksum
404 "false", // needs admin
405 "123", // size
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700406 ""), // deadline
Jay Srinivasan0a708742012-03-20 11:26:12 -0700407 -1,
408 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700409 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800410 metrics::CheckResult::kUpdateAvailable,
411 metrics::CheckReaction::kIgnored,
412 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700413 &response,
414 NULL));
415 EXPECT_FALSE(response.update_exists);
416}
417
Chris Sosa77f79e82014-06-02 18:16:24 -0700418TEST(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
419 OmahaResponse response;
420 // Set up a connection manager that doesn't allow a valid update over
421 // the current ethernet connection.
422 MockConnectionManager mock_cm(NULL);
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700423 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _, _))
Chris Sosa77f79e82014-06-02 18:16:24 -0700424 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetEthernet),
425 SetArgumentPointee<2>(NetworkTethering::kUnknown),
426 Return(true)));
427 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(kNetEthernet, _))
428 .WillRepeatedly(Return(false));
429 EXPECT_CALL(mock_cm, StringForConnectionType(kNetEthernet))
430 .WillRepeatedly(Return(shill::kTypeEthernet));
431
432 ASSERT_FALSE(
433 TestUpdateCheck(NULL, // prefs
434 NULL, // payload_state
435 NULL, // p2p_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700436 &mock_cm, // connection_manager
437 &kDefaultTestParams,
Chris Sosa77f79e82014-06-02 18:16:24 -0700438 GetUpdateResponse(OmahaRequestParams::kAppId,
439 "1.2.3.4", // version
440 "http://more/info",
441 "true", // prompt
442 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700443 "file.signed", // file name
Chris Sosa77f79e82014-06-02 18:16:24 -0700444 "HASH1234=", // checksum
445 "false", // needs admin
446 "123", // size
447 ""), // deadline
448 -1,
449 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700450 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700451 metrics::CheckResult::kUpdateAvailable,
452 metrics::CheckReaction::kIgnored,
453 metrics::DownloadErrorCode::kUnset,
454 &response,
455 NULL));
456 EXPECT_FALSE(response.update_exists);
457}
458
459TEST(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
460 string rollback_version = "1234.0.0";
461 OmahaResponse response;
462
463 MockPayloadState mock_payload_state;
464 EXPECT_CALL(mock_payload_state, GetRollbackVersion())
465 .WillRepeatedly(Return(rollback_version));
466
467 ASSERT_FALSE(
468 TestUpdateCheck(NULL, // prefs
469 &mock_payload_state, // payload_state
470 NULL, // p2p_manager
471 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700472 &kDefaultTestParams,
Chris Sosa77f79e82014-06-02 18:16:24 -0700473 GetUpdateResponse(OmahaRequestParams::kAppId,
474 rollback_version, // version
475 "http://more/info",
476 "true", // prompt
477 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700478 "file.signed", // file name
Chris Sosa77f79e82014-06-02 18:16:24 -0700479 "HASH1234=", // checksum
480 "false", // needs admin
481 "123", // size
482 ""), // deadline
483 -1,
484 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700485 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700486 metrics::CheckResult::kUpdateAvailable,
487 metrics::CheckReaction::kIgnored,
488 metrics::DownloadErrorCode::kUnset,
489 &response,
490 NULL));
491 EXPECT_FALSE(response.update_exists);
492}
493
Jay Srinivasan0a708742012-03-20 11:26:12 -0700494TEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
495 OmahaResponse response;
496 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700497 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700498 ASSERT_TRUE(
499 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700500 NULL, // payload_state
501 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700502 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700503 &params,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700504 GetNoUpdateResponse(OmahaRequestParams::kAppId),
505 -1,
506 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700507 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800508 metrics::CheckResult::kNoUpdateAvailable,
509 metrics::CheckReaction::kUnset,
510 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700511 &response,
512 NULL));
513 EXPECT_FALSE(response.update_exists);
514}
515
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700516TEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
517 OmahaResponse response;
518 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700519 params.set_wall_clock_based_wait_enabled(true);
520 params.set_update_check_count_wait_enabled(false);
521 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700522
523 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800524 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700525 &prefs_dir));
526 ScopedDirRemover temp_dir_remover(prefs_dir);
527
528 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700529 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700530 << "Failed to initialize preferences.";
531
532 ASSERT_FALSE(
533 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700534 NULL, // payload_state
535 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700536 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700537 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700538 GetUpdateResponse2(OmahaRequestParams::kAppId,
539 "1.2.3.4", // version
540 "http://more/info",
541 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700542 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700543 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700544 "HASH1234=", // checksum
545 "false", // needs admin
546 "123", // size
547 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700548 "7", // max days to scatter
549 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700550 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700551 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700552 -1,
553 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700554 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800555 metrics::CheckResult::kUpdateAvailable,
556 metrics::CheckReaction::kDeferring,
557 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700558 &response,
559 NULL));
560 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700561
562 // Verify if we are interactive check we don't defer.
563 params.set_interactive(true);
564 ASSERT_TRUE(
565 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700566 NULL, // payload_state
567 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700568 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700569 &params,
Chris Sosa968d0572013-08-23 14:46:02 -0700570 GetUpdateResponse2(OmahaRequestParams::kAppId,
571 "1.2.3.4", // version
572 "http://more/info",
573 "true", // prompt
574 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700575 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700576 "HASH1234=", // checksum
577 "false", // needs admin
578 "123", // size
579 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700580 "7", // max days to scatter
581 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700582 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700583 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700584 -1,
585 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700586 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800587 metrics::CheckResult::kUpdateAvailable,
588 metrics::CheckReaction::kUpdating,
589 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700590 &response,
591 NULL));
592 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700593}
594
595TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
596 OmahaResponse response;
597 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700598 params.set_wall_clock_based_wait_enabled(false);
599 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700600
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700601 params.set_update_check_count_wait_enabled(true);
602 params.set_min_update_checks_needed(1);
603 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700604
605 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800606 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700607 &prefs_dir));
608 ScopedDirRemover temp_dir_remover(prefs_dir);
609
610 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700611 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700612 << "Failed to initialize preferences.";
613
614 ASSERT_TRUE(
615 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700616 NULL, // payload_state
617 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700618 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700619 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700620 GetUpdateResponse2(OmahaRequestParams::kAppId,
621 "1.2.3.4", // version
622 "http://more/info",
623 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700624 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700625 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700626 "HASH1234=", // checksum
627 "false", // needs admin
628 "123", // size
629 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700630 "7", // max days to scatter
631 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700632 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700633 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700634 -1,
635 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700636 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800637 metrics::CheckResult::kUpdateAvailable,
638 metrics::CheckReaction::kUpdating,
639 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700640 &response,
641 NULL));
642 EXPECT_TRUE(response.update_exists);
643}
644
645TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
646 OmahaResponse response;
647 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700648 params.set_wall_clock_based_wait_enabled(true);
649 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700650
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700651 params.set_update_check_count_wait_enabled(true);
652 params.set_min_update_checks_needed(1);
653 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700654
655 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800656 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700657 &prefs_dir));
658 ScopedDirRemover temp_dir_remover(prefs_dir);
659
660 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700661 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700662 << "Failed to initialize preferences.";
663
664 ASSERT_TRUE(
665 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700666 NULL, // payload_state
667 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700668 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700669 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700670 GetUpdateResponse2(OmahaRequestParams::kAppId,
671 "1.2.3.4", // version
672 "http://more/info",
673 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700674 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700675 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700676 "HASH1234=", // checksum
677 "false", // needs admin
678 "123", // size
679 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700680 "0", // max days to scatter
681 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700682 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700683 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700684 -1,
685 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700686 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800687 metrics::CheckResult::kUpdateAvailable,
688 metrics::CheckReaction::kUpdating,
689 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700690 &response,
691 NULL));
692 EXPECT_TRUE(response.update_exists);
693}
694
695
696TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
697 OmahaResponse response;
698 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700699 params.set_wall_clock_based_wait_enabled(true);
700 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700701
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700702 params.set_update_check_count_wait_enabled(true);
703 params.set_min_update_checks_needed(0);
704 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700705
706 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800707 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700708 &prefs_dir));
709 ScopedDirRemover temp_dir_remover(prefs_dir);
710
711 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700712 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700713 << "Failed to initialize preferences.";
714
715 ASSERT_TRUE(TestUpdateCheck(
716 &prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700717 NULL, // payload_state
718 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700719 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700720 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700721 GetUpdateResponse2(OmahaRequestParams::kAppId,
722 "1.2.3.4", // version
723 "http://more/info",
724 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700725 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700726 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700727 "HASH1234=", // checksum
728 "false", // needs admin
729 "123", // size
730 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700731 "7", // max days to scatter
732 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700733 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700734 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700735 -1,
736 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700737 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800738 metrics::CheckResult::kUpdateAvailable,
739 metrics::CheckReaction::kUpdating,
740 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700741 &response,
742 NULL));
743
744 int64 count;
745 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700746 ASSERT_EQ(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700747 EXPECT_TRUE(response.update_exists);
748}
749
750TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
751 OmahaResponse response;
752 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700753 params.set_wall_clock_based_wait_enabled(true);
754 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700755
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700756 params.set_update_check_count_wait_enabled(true);
757 params.set_min_update_checks_needed(1);
758 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700759
760 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800761 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700762 &prefs_dir));
763 ScopedDirRemover temp_dir_remover(prefs_dir);
764
765 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700766 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700767 << "Failed to initialize preferences.";
768
769 ASSERT_FALSE(TestUpdateCheck(
770 &prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700771 NULL, // payload_state
772 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700773 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700774 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700775 GetUpdateResponse2(OmahaRequestParams::kAppId,
776 "1.2.3.4", // version
777 "http://more/info",
778 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700779 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700780 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700781 "HASH1234=", // checksum
782 "false", // needs admin
783 "123", // size
784 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700785 "7", // max days to scatter
786 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700787 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700788 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700789 -1,
790 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700791 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800792 metrics::CheckResult::kUpdateAvailable,
793 metrics::CheckReaction::kDeferring,
794 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700795 &response,
796 NULL));
797
798 int64 count;
799 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700800 ASSERT_GT(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700801 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700802
803 // Verify if we are interactive check we don't defer.
804 params.set_interactive(true);
805 ASSERT_TRUE(
806 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700807 NULL, // payload_state
808 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700809 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700810 &params,
Chris Sosa968d0572013-08-23 14:46:02 -0700811 GetUpdateResponse2(OmahaRequestParams::kAppId,
812 "1.2.3.4", // version
813 "http://more/info",
814 "true", // prompt
815 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700816 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700817 "HASH1234=", // checksum
818 "false", // needs admin
819 "123", // size
820 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700821 "7", // max days to scatter
822 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700823 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700824 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700825 -1,
826 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700827 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800828 metrics::CheckResult::kUpdateAvailable,
829 metrics::CheckReaction::kUpdating,
830 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700831 &response,
832 NULL));
833 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700834}
835
836TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
837 OmahaResponse response;
838 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700839 params.set_wall_clock_based_wait_enabled(true);
840 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700841
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700842 params.set_update_check_count_wait_enabled(true);
843 params.set_min_update_checks_needed(1);
844 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700845
846 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800847 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700848 &prefs_dir));
849 ScopedDirRemover temp_dir_remover(prefs_dir);
850
851 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700852 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700853 << "Failed to initialize preferences.";
854
855 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
856
857 ASSERT_FALSE(TestUpdateCheck(
858 &prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700859 NULL, // payload_state
860 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700861 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700862 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700863 GetUpdateResponse2(OmahaRequestParams::kAppId,
864 "1.2.3.4", // version
865 "http://more/info",
866 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700867 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700868 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700869 "HASH1234=", // checksum
870 "false", // needs admin
871 "123", // size
872 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700873 "7", // max days to scatter
874 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700875 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700876 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700877 -1,
878 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700879 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800880 metrics::CheckResult::kUpdateAvailable,
881 metrics::CheckReaction::kDeferring,
882 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700883 &response,
884 NULL));
885
886 int64 count;
887 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
888 // count remains the same, as the decrementing happens in update_attempter
889 // which this test doesn't exercise.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700890 ASSERT_EQ(count, 5);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700891 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700892
893 // Verify if we are interactive check we don't defer.
894 params.set_interactive(true);
895 ASSERT_TRUE(
896 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700897 NULL, // payload_state
898 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700899 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700900 &params,
Chris Sosa968d0572013-08-23 14:46:02 -0700901 GetUpdateResponse2(OmahaRequestParams::kAppId,
902 "1.2.3.4", // version
903 "http://more/info",
904 "true", // prompt
905 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700906 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700907 "HASH1234=", // checksum
908 "false", // needs admin
909 "123", // size
910 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700911 "7", // max days to scatter
912 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700913 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700914 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700915 -1,
916 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700917 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800918 metrics::CheckResult::kUpdateAvailable,
919 metrics::CheckReaction::kUpdating,
920 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700921 &response,
922 NULL));
923 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700924}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700925
Darin Petkov6a5b3222010-07-13 14:55:28 -0700926TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700927 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
928
929 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
930
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700931 FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700932 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700933 fake_system_state.set_request_params(&params);
934 OmahaRequestAction action(&fake_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700935 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800936 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700937 NULL),
938 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700939 OmahaRequestActionTestProcessorDelegate delegate;
940 delegate.loop_ = loop;
941 ActionProcessor processor;
942 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700943 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700944
945 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
946 g_main_loop_run(loop);
947 g_main_loop_unref(loop);
948 EXPECT_FALSE(processor.IsRunning());
949}
950
951TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700952 OmahaResponse response;
953 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700954 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700955 NULL, // payload_state
956 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700957 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700958 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700959 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700960 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700961 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700962 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800963 metrics::CheckResult::kParsingError,
964 metrics::CheckReaction::kUnset,
965 metrics::DownloadErrorCode::kUnset,
Darin Petkovedc522e2010-11-05 09:35:17 -0700966 &response,
967 NULL));
968 EXPECT_FALSE(response.update_exists);
969}
970
971TEST(OmahaRequestActionTest, EmptyResponseTest) {
972 OmahaResponse response;
973 ASSERT_FALSE(
974 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700975 NULL, // payload_state
976 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700977 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700978 &kDefaultTestParams,
Darin Petkovedc522e2010-11-05 09:35:17 -0700979 "",
980 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700981 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700982 ErrorCode::kOmahaRequestEmptyResponseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800983 metrics::CheckResult::kParsingError,
984 metrics::CheckReaction::kUnset,
985 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700986 &response,
987 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700988 EXPECT_FALSE(response.update_exists);
989}
990
991TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700992 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700993 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700994 NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700995 NULL, // payload_state
996 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700997 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700998 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700999 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1000 "<daystart elapsed_seconds=\"100\"/>"
1001 "<app appid=\"foo\" status=\"ok\">"
1002 "<ping status=\"ok\"/>"
1003 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001004 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001005 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001006 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001007 metrics::CheckResult::kParsingError,
1008 metrics::CheckReaction::kUnset,
1009 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001010 &response,
1011 NULL));
1012 EXPECT_FALSE(response.update_exists);
1013}
1014
1015TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001016 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001017 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001018 NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001019 NULL, // payload_state
1020 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001021 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001022 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001023 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1024 "<daystart elapsed_seconds=\"100\"/>"
1025 "<app appid=\"foo\" status=\"ok\">"
1026 "<ping status=\"ok\"/>"
1027 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001028 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001029 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001030 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001031 metrics::CheckResult::kParsingError,
1032 metrics::CheckReaction::kUnset,
1033 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001034 &response,
1035 NULL));
1036 EXPECT_FALSE(response.update_exists);
1037}
1038
1039TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001040 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001041 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001042 NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001043 NULL, // payload_state
1044 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001045 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001046 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001047 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1048 "<daystart elapsed_seconds=\"100\"/>"
1049 "<app appid=\"foo\" status=\"ok\">"
1050 "<ping status=\"ok\"/>"
1051 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001052 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001053 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001054 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001055 metrics::CheckResult::kParsingError,
1056 metrics::CheckReaction::kUnset,
1057 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001058 &response,
1059 NULL));
1060 EXPECT_FALSE(response.update_exists);
1061}
1062
1063TEST(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001064 string input_response =
1065 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1066 "<daystart elapsed_seconds=\"100\"/>"
1067 "<app appid=\"xyz\" status=\"ok\">"
1068 "<updatecheck status=\"ok\">"
1069 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -07001070 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001071 "<packages><package hash=\"not-used\" name=\"f\" "
1072 "size=\"587\"/></packages>"
1073 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001074 "ChromeOSVersion=\"10.2.3.4\" "
1075 "Prompt=\"false\" "
1076 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -08001077 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001078 "sha256=\"lkq34j5345\" "
1079 "needsadmin=\"true\" "
1080 "/></actions></manifest></updatecheck></app></response>";
1081 LOG(INFO) << "Input Response = " << input_response;
1082
Darin Petkov6a5b3222010-07-13 14:55:28 -07001083 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001084 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001085 NULL, // payload_state
1086 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001087 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001088 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001089 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -07001090 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001091 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001092 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001093 metrics::CheckResult::kUpdateAvailable,
1094 metrics::CheckReaction::kUpdating,
1095 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001096 &response,
1097 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001098 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -07001099 EXPECT_EQ("10.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001100 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001101 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001102 EXPECT_EQ("lkq34j5345", response.hash);
1103 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001104 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -07001105 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001106}
1107
1108namespace {
1109class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
1110 public:
1111 void ProcessingStopped(const ActionProcessor* processor) {
1112 ASSERT_TRUE(loop_);
1113 g_main_loop_quit(loop_);
1114 }
1115 GMainLoop *loop_;
1116};
1117
1118gboolean TerminateTransferTestStarter(gpointer data) {
1119 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
1120 processor->StartProcessing();
1121 CHECK(processor->IsRunning());
1122 processor->StopProcessing();
1123 return FALSE;
1124}
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001125} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -07001126
1127TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001128 string http_response("doesn't matter");
1129 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
1130
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001131 FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001132 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001133 fake_system_state.set_request_params(&params);
1134 OmahaRequestAction action(&fake_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001135 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001136 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001137 NULL),
1138 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001139 TerminateEarlyTestProcessorDelegate delegate;
1140 delegate.loop_ = loop;
1141 ActionProcessor processor;
1142 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001143 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001144
1145 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
1146 g_main_loop_run(loop);
1147 g_main_loop_unref(loop);
1148}
1149
1150TEST(OmahaRequestActionTest, XmlEncodeTest) {
1151 EXPECT_EQ("ab", XmlEncode("ab"));
1152 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001153 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
1154 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
1155
1156 vector<char> post_data;
1157
1158 // Make sure XML Encode is being called on the params
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001159 FakeSystemState fake_system_state;
1160 OmahaRequestParams params(&fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001161 OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001162 OmahaRequestParams::kOsVersion,
1163 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001164 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -07001165 OmahaRequestParams::kAppId,
1166 "0.1.0.0",
1167 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001168 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -07001169 "<OEM MODEL>",
Chris Sosac1972482013-04-30 22:31:10 -07001170 "ChromeOSFirmware.1.0",
1171 "EC100",
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001172 false, // delta okay
1173 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001174 "http://url",
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001175 false, // update_disabled
1176 "", // target_version_prefix
1177 false, // use_p2p_for_downloading
1178 false); // use_p2p_for_sharing
Darin Petkov6a5b3222010-07-13 14:55:28 -07001179 OmahaResponse response;
1180 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001181 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001182 NULL, // payload_state
1183 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001184 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001185 &params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001186 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001187 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001188 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001189 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001190 metrics::CheckResult::kParsingError,
1191 metrics::CheckReaction::kUnset,
1192 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001193 &response,
1194 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001195 // convert post_data to string
1196 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001197 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
1198 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001199 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
1200 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
1201 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
1202 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001203 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
1204 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001205}
1206
1207TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001208 OmahaResponse response;
1209 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001210 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001211 NULL, // payload_state
1212 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001213 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001214 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001215 GetUpdateResponse(OmahaRequestParams::kAppId,
1216 "1.2.3.4", // version
1217 "testthe&lt;url", // more info
1218 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001219 "testthe&amp;codebase/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001220 "file.signed", // file name
1221 "HASH1234=", // checksum
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001222 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -07001223 "123", // size
1224 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -07001225 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001226 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001227 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001228 metrics::CheckResult::kUpdateAvailable,
1229 metrics::CheckReaction::kUpdating,
1230 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001231 &response,
1232 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001233
1234 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001235 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -07001236 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -07001237}
1238
1239TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001240 OmahaResponse response;
1241 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001242 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001243 NULL, // payload_state
1244 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001245 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001246 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001247 GetUpdateResponse(OmahaRequestParams::kAppId,
1248 "1.2.3.4", // version
1249 "theurl", // more info
1250 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001251 "thecodebase/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001252 "file.signed", // file name
1253 "HASH1234=", // checksum
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001254 "false", // needs admin
1255 // overflows int32:
Darin Petkov6c118642010-10-21 12:06:30 -07001256 "123123123123123", // size
1257 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -07001258 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001259 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001260 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001261 metrics::CheckResult::kUpdateAvailable,
1262 metrics::CheckReaction::kUpdating,
1263 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001264 &response,
1265 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001266
1267 EXPECT_EQ(response.size, 123123123123123ll);
1268}
1269
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001270TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
1271 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -08001272 NiceMock<PrefsMock> prefs;
1273 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
1274 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001275 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Darin Petkov95508da2011-01-05 12:42:29 -08001276 ASSERT_FALSE(TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001277 NULL, // payload_state
1278 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001279 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001280 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001281 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001282 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001283 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001284 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001285 metrics::CheckResult::kParsingError,
1286 metrics::CheckReaction::kUnset,
1287 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001288 NULL, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001289 &post_data));
1290 // convert post_data to string
1291 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001292 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001293 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001294 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001295 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001296 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1297 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001298 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1299 string::npos);
1300 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1301 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001302}
1303
Jay Srinivasan0a708742012-03-20 11:26:12 -07001304
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001305TEST(OmahaRequestActionTest, FormatUpdateDisabledOutputTest) {
Darin Petkov95508da2011-01-05 12:42:29 -08001306 vector<char> post_data;
1307 NiceMock<PrefsMock> prefs;
1308 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Jay Srinivasan0a708742012-03-20 11:26:12 -07001309 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001310 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Jay Srinivasan0a708742012-03-20 11:26:12 -07001311 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001312 params.set_update_disabled(true);
Darin Petkov95508da2011-01-05 12:42:29 -08001313 ASSERT_FALSE(TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001314 NULL, // payload_state
1315 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001316 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001317 &params,
Darin Petkov95508da2011-01-05 12:42:29 -08001318 "invalid xml>",
1319 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001320 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001321 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001322 metrics::CheckResult::kParsingError,
1323 metrics::CheckReaction::kUnset,
1324 metrics::DownloadErrorCode::kUnset,
Darin Petkov95508da2011-01-05 12:42:29 -08001325 NULL, // response
1326 &post_data));
1327 // convert post_data to string
1328 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001329 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001330 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001331 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001332 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -08001333 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1334 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001335 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1336 string::npos);
1337 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1338 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -08001339}
1340
Darin Petkove17f86b2010-07-20 09:12:01 -07001341TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
1342 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001343 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -07001344 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
1345 "invalid xml>",
1346 &post_data);
1347 // convert post_data to string
1348 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001349 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001350 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001351 OmahaEvent::kTypeUpdateDownloadStarted,
1352 OmahaEvent::kResultSuccess);
1353 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001354 EXPECT_EQ(post_str.find("ping"), string::npos);
1355 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -07001356}
1357
1358TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
1359 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001360 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -07001361 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
1362 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001363 ErrorCode::kError),
Darin Petkove17f86b2010-07-20 09:12:01 -07001364 "invalid xml>",
1365 &post_data);
1366 // convert post_data to string
1367 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001368 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001369 " <event eventtype=\"%d\" eventresult=\"%d\" "
1370 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001371 OmahaEvent::kTypeDownloadComplete,
1372 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001373 static_cast<int>(ErrorCode::kError));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001374 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001375 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001376}
1377
1378TEST(OmahaRequestActionTest, IsEventTest) {
1379 string http_response("doesn't matter");
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001380 FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001381 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001382 fake_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001383 OmahaRequestAction update_check_action(
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001384 &fake_system_state,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001385 NULL,
1386 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001387 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001388 NULL),
1389 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001390 EXPECT_FALSE(update_check_action.IsEvent());
1391
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001392 params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001393 fake_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001394 OmahaRequestAction event_action(
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001395 &fake_system_state,
Darin Petkove17f86b2010-07-20 09:12:01 -07001396 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001397 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001398 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001399 NULL),
1400 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001401 EXPECT_TRUE(event_action.IsEvent());
1402}
1403
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001404TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
1405 for (int i = 0; i < 2; i++) {
1406 bool delta_okay = i == 1;
1407 const char* delta_okay_str = delta_okay ? "true" : "false";
1408 vector<char> post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001409 FakeSystemState fake_system_state;
1410 OmahaRequestParams params(&fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001411 OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001412 OmahaRequestParams::kOsVersion,
1413 "service_pack",
1414 "x86-generic",
1415 OmahaRequestParams::kAppId,
1416 "0.1.0.0",
1417 "en-US",
1418 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001419 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001420 "ChromeOSFirmware.1.0",
1421 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001422 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001423 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001424 "http://url",
David Zeuthen8f191b22013-08-06 12:27:50 -07001425 false, // update_disabled
1426 "", // target_version_prefix
1427 false, // use_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001428 false); // use_p2p_for_sharing
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001429 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001430 NULL, // payload_state
1431 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001432 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001433 &params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001434 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001435 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001436 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001437 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001438 metrics::CheckResult::kParsingError,
1439 metrics::CheckReaction::kUnset,
1440 metrics::DownloadErrorCode::kUnset,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001441 NULL,
1442 &post_data));
1443 // convert post_data to string
Alex Vakulenko75039d72014-03-25 12:36:28 -07001444 string post_str(post_data.data(), post_data.size());
1445 EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
1446 delta_okay_str)),
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001447 string::npos)
1448 << "i = " << i;
1449 }
1450}
1451
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001452TEST(OmahaRequestActionTest, FormatInteractiveOutputTest) {
1453 for (int i = 0; i < 2; i++) {
1454 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001455 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001456 vector<char> post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001457 FakeSystemState fake_system_state;
1458 OmahaRequestParams params(&fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001459 OmahaRequestParams::kOsPlatform,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001460 OmahaRequestParams::kOsVersion,
1461 "service_pack",
1462 "x86-generic",
1463 OmahaRequestParams::kAppId,
1464 "0.1.0.0",
1465 "en-US",
1466 "unittest_track",
1467 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001468 "ChromeOSFirmware.1.0",
1469 "EC100",
David Zeuthen8f191b22013-08-06 12:27:50 -07001470 true, // delta_okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001471 interactive,
1472 "http://url",
David Zeuthen8f191b22013-08-06 12:27:50 -07001473 false, // update_disabled
1474 "", // target_version_prefix
1475 false, // use_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001476 false); // use_p2p_for_sharing
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001477 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001478 NULL, // payload_state
1479 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001480 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001481 &params,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001482 "invalid xml>",
1483 -1,
1484 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001485 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001486 metrics::CheckResult::kParsingError,
1487 metrics::CheckReaction::kUnset,
1488 metrics::DownloadErrorCode::kUnset,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001489 NULL,
1490 &post_data));
1491 // convert post_data to string
1492 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001493 EXPECT_NE(post_str.find(base::StringPrintf("installsource=\"%s\"",
1494 interactive_str)),
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001495 string::npos)
1496 << "i = " << i;
1497 }
1498}
1499
Darin Petkove17f86b2010-07-20 09:12:01 -07001500TEST(OmahaRequestActionTest, OmahaEventTest) {
1501 OmahaEvent default_event;
1502 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1503 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001504 EXPECT_EQ(ErrorCode::kError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001505
1506 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1507 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1508 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001509 EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001510
1511 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1512 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001513 ErrorCode::kError);
Darin Petkove17f86b2010-07-20 09:12:01 -07001514 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1515 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001516 EXPECT_EQ(ErrorCode::kError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001517}
1518
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001519TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov265f2902011-05-09 15:17:40 -07001520 for (int ping_only = 0; ping_only < 2; ping_only++) {
1521 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001522 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1523 .Times(AnyNumber());
1524 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov265f2902011-05-09 15:17:40 -07001525 // Add a few hours to the day difference to test no rounding, etc.
1526 int64_t five_days_ago =
1527 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1528 int64_t six_days_ago =
1529 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001530 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1531 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov265f2902011-05-09 15:17:40 -07001532 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1533 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1534 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1535 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1536 vector<char> post_data;
1537 ASSERT_TRUE(
1538 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001539 NULL, // payload_state
1540 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001541 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001542 &kDefaultTestParams,
Darin Petkov265f2902011-05-09 15:17:40 -07001543 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1544 -1,
1545 ping_only,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001546 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001547 metrics::CheckResult::kUnset,
1548 metrics::CheckReaction::kUnset,
1549 metrics::DownloadErrorCode::kUnset,
Darin Petkov265f2902011-05-09 15:17:40 -07001550 NULL,
1551 &post_data));
1552 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001553 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
Darin Petkov265f2902011-05-09 15:17:40 -07001554 string::npos);
1555 if (ping_only) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001556 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001557 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1558 } else {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001559 EXPECT_NE(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001560 EXPECT_NE(post_str.find("previousversion"), string::npos);
1561 }
1562 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001563}
1564
1565TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001566 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001567 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1568 .Times(AnyNumber());
1569 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001570 int64_t three_days_ago =
1571 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1572 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001573 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1574 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001575 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1576 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1577 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1578 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1579 vector<char> post_data;
1580 ASSERT_TRUE(
1581 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001582 NULL, // payload_state
1583 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001584 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001585 &kDefaultTestParams,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001586 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001587 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001588 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001589 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001590 metrics::CheckResult::kNoUpdateAvailable,
1591 metrics::CheckReaction::kUnset,
1592 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001593 NULL,
1594 &post_data));
1595 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001596 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001597 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001598}
1599
1600TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001601 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001602 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1603 .Times(AnyNumber());
1604 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001605 int64_t four_days_ago =
1606 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1607 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001608 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1609 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001610 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1611 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1612 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1613 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1614 vector<char> post_data;
1615 ASSERT_TRUE(
1616 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001617 NULL, // payload_state
1618 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001619 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001620 &kDefaultTestParams,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001621 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001622 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001623 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001624 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001625 metrics::CheckResult::kNoUpdateAvailable,
1626 metrics::CheckReaction::kUnset,
1627 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001628 NULL,
1629 &post_data));
1630 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001631 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001632 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001633}
1634
1635TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001636 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001637 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1638 .Times(AnyNumber());
1639 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001640 int64_t one_hour_ago =
1641 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001642 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1643 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001644 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1645 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1646 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1647 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1648 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1649 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1650 vector<char> post_data;
1651 ASSERT_TRUE(
1652 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001653 NULL, // payload_state
1654 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001655 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001656 &kDefaultTestParams,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001657 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001658 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001659 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001660 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001661 metrics::CheckResult::kNoUpdateAvailable,
1662 metrics::CheckReaction::kUnset,
1663 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001664 NULL,
1665 &post_data));
1666 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001667 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001668}
1669
Thieu Leb44e9e82011-06-06 14:34:04 -07001670TEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1671 // This test ensures that we ignore empty ping only requests.
1672 NiceMock<PrefsMock> prefs;
1673 int64_t now = Time::Now().ToInternalValue();
1674 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1675 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1676 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1677 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1678 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1679 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1680 vector<char> post_data;
1681 EXPECT_TRUE(
1682 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001683 NULL, // payload_state
1684 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001685 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001686 &kDefaultTestParams,
Thieu Leb44e9e82011-06-06 14:34:04 -07001687 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1688 -1,
1689 true, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001690 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001691 metrics::CheckResult::kUnset,
1692 metrics::CheckReaction::kUnset,
1693 metrics::DownloadErrorCode::kUnset,
Thieu Leb44e9e82011-06-06 14:34:04 -07001694 NULL,
1695 &post_data));
1696 EXPECT_EQ(post_data.size(), 0);
1697}
1698
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001699TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001700 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001701 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1702 .Times(AnyNumber());
1703 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001704 int64_t future =
1705 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001706 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1707 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001708 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1709 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1710 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1711 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1712 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1713 .WillOnce(Return(true));
1714 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1715 .WillOnce(Return(true));
1716 vector<char> post_data;
1717 ASSERT_TRUE(
1718 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001719 NULL, // payload_state
1720 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001721 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001722 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001723 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1724 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001725 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001726 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001727 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001728 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001729 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001730 metrics::CheckResult::kNoUpdateAvailable,
1731 metrics::CheckReaction::kUnset,
1732 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001733 NULL,
1734 &post_data));
1735 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001736 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001737}
1738
1739TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
1740 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001741 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001742 // may fail if it runs for longer than 5 seconds. It shouldn't run
1743 // that long though.
1744 int64_t midnight =
1745 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1746 int64_t midnight_slack =
1747 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001748 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001749 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1750 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001751 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1752 AllOf(Ge(midnight), Le(midnight_slack))))
1753 .WillOnce(Return(true));
1754 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1755 AllOf(Ge(midnight), Le(midnight_slack))))
1756 .WillOnce(Return(true));
1757 ASSERT_TRUE(
1758 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001759 NULL, // payload_state
1760 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001761 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001762 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001763 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1764 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001765 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001766 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001767 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001768 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001769 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001770 metrics::CheckResult::kNoUpdateAvailable,
1771 metrics::CheckReaction::kUnset,
1772 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001773 NULL,
1774 NULL));
1775}
1776
1777TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001778 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001779 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1780 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001781 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1782 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1783 ASSERT_TRUE(
1784 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001785 NULL, // payload_state
1786 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001787 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001788 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001789 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1790 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001791 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001792 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001793 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001794 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001795 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001796 metrics::CheckResult::kNoUpdateAvailable,
1797 metrics::CheckReaction::kUnset,
1798 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001799 NULL,
1800 NULL));
1801}
1802
1803TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001804 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001805 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1806 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001807 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1808 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1809 ASSERT_TRUE(
1810 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001811 NULL, // payload_state
1812 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001813 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001814 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001815 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1816 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001817 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001818 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001819 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001820 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001821 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001822 metrics::CheckResult::kNoUpdateAvailable,
1823 metrics::CheckReaction::kUnset,
1824 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001825 NULL,
1826 NULL));
1827}
1828
Darin Petkov84c763c2010-07-29 16:27:58 -07001829TEST(OmahaRequestActionTest, NoUniqueIDTest) {
1830 vector<char> post_data;
1831 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001832 NULL, // payload_state
1833 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001834 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001835 &kDefaultTestParams,
Darin Petkov84c763c2010-07-29 16:27:58 -07001836 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001837 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001838 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001839 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001840 metrics::CheckResult::kParsingError,
1841 metrics::CheckReaction::kUnset,
1842 metrics::DownloadErrorCode::kUnset,
Darin Petkov84c763c2010-07-29 16:27:58 -07001843 NULL, // response
1844 &post_data));
1845 // convert post_data to string
1846 string post_str(&post_data[0], post_data.size());
1847 EXPECT_EQ(post_str.find("machineid="), string::npos);
1848 EXPECT_EQ(post_str.find("userid="), string::npos);
1849}
1850
Darin Petkovedc522e2010-11-05 09:35:17 -07001851TEST(OmahaRequestActionTest, NetworkFailureTest) {
1852 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001853 const int http_error_code =
1854 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
Darin Petkovedc522e2010-11-05 09:35:17 -07001855 ASSERT_FALSE(
1856 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001857 NULL, // payload_state
1858 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001859 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001860 &kDefaultTestParams,
Darin Petkovedc522e2010-11-05 09:35:17 -07001861 "",
1862 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001863 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001864 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001865 metrics::CheckResult::kDownloadError,
1866 metrics::CheckReaction::kUnset,
1867 static_cast<metrics::DownloadErrorCode>(501),
Darin Petkovedc522e2010-11-05 09:35:17 -07001868 &response,
1869 NULL));
1870 EXPECT_FALSE(response.update_exists);
1871}
1872
1873TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1874 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001875 const int http_error_code =
1876 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
Darin Petkovedc522e2010-11-05 09:35:17 -07001877 ASSERT_FALSE(
1878 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001879 NULL, // payload_state
1880 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001881 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001882 &kDefaultTestParams,
Darin Petkovedc522e2010-11-05 09:35:17 -07001883 "",
1884 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001885 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001886 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001887 metrics::CheckResult::kDownloadError,
1888 metrics::CheckReaction::kUnset,
1889 metrics::DownloadErrorCode::kHttpStatusOther,
Darin Petkovedc522e2010-11-05 09:35:17 -07001890 &response,
1891 NULL));
1892 EXPECT_FALSE(response.update_exists);
1893}
1894
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001895TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
1896 OmahaResponse response;
1897 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001898 params.set_wall_clock_based_wait_enabled(true);
1899 params.set_waiting_period(TimeDelta().FromDays(1));
1900 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001901
1902 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -08001903 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001904 &prefs_dir));
1905 ScopedDirRemover temp_dir_remover(prefs_dir);
1906
1907 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -07001908 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001909 << "Failed to initialize preferences.";
1910
1911 ASSERT_FALSE(TestUpdateCheck(
1912 &prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001913 NULL, // payload_state
1914 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001915 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001916 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001917 GetUpdateResponse2(OmahaRequestParams::kAppId,
1918 "1.2.3.4", // version
1919 "http://more/info",
1920 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001921 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001922 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001923 "HASH1234=", // checksum
1924 "false", // needs admin
1925 "123", // size
1926 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001927 "7", // max days to scatter
1928 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001929 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001930 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001931 -1,
1932 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001933 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001934 metrics::CheckResult::kUpdateAvailable,
1935 metrics::CheckReaction::kDeferring,
1936 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001937 &response,
1938 NULL));
1939
1940 int64 timestamp = 0;
1941 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001942 ASSERT_GT(timestamp, 0);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001943 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001944
1945 // Verify if we are interactive check we don't defer.
1946 params.set_interactive(true);
1947 ASSERT_TRUE(
1948 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001949 NULL, // payload_state
1950 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001951 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001952 &params,
Chris Sosa968d0572013-08-23 14:46:02 -07001953 GetUpdateResponse2(OmahaRequestParams::kAppId,
1954 "1.2.3.4", // version
1955 "http://more/info",
1956 "true", // prompt
1957 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001958 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -07001959 "HASH1234=", // checksum
1960 "false", // needs admin
1961 "123", // size
1962 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001963 "7", // max days to scatter
1964 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001965 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001966 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -07001967 -1,
1968 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001969 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001970 metrics::CheckResult::kUpdateAvailable,
1971 metrics::CheckReaction::kUpdating,
1972 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -07001973 &response,
1974 NULL));
1975 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001976}
1977
1978TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
1979 OmahaResponse response;
1980 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001981 params.set_wall_clock_based_wait_enabled(true);
1982 params.set_waiting_period(TimeDelta().FromDays(1));
1983 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001984
1985 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -08001986 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001987 &prefs_dir));
1988 ScopedDirRemover temp_dir_remover(prefs_dir);
1989
1990 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -07001991 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001992 << "Failed to initialize preferences.";
1993
1994 // Set the timestamp to a very old value such that it exceeds the
1995 // waiting period set above.
1996 Time t1;
1997 Time::FromString("1/1/2012", &t1);
1998 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
1999 ASSERT_TRUE(TestUpdateCheck(
2000 &prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07002001 NULL, // payload_state
2002 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07002003 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002004 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002005 GetUpdateResponse2(OmahaRequestParams::kAppId,
2006 "1.2.3.4", // version
2007 "http://more/info",
2008 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002009 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002010 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002011 "HASH1234=", // checksum
2012 "false", // needs admin
2013 "123", // size
2014 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002015 "7", // max days to scatter
2016 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07002017 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002018 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002019 -1,
2020 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002021 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002022 metrics::CheckResult::kUpdateAvailable,
2023 metrics::CheckReaction::kUpdating,
2024 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002025 &response,
2026 NULL));
2027
2028 EXPECT_TRUE(response.update_exists);
2029
2030 // Make sure the timestamp t1 is unchanged showing that it was reused.
2031 int64 timestamp = 0;
2032 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
2033 ASSERT_TRUE(timestamp == t1.ToInternalValue());
2034}
2035
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002036TEST(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002037 // Create a uniquely named test directory.
2038 string test_dir;
2039 ASSERT_TRUE(utils::MakeTempDirectory(
2040 "omaha_request_action-test-XXXXXX", &test_dir));
2041
2042 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
2043 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07002044 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002045 vector<char> post_data;
2046 NiceMock<PrefsMock> prefs;
2047 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002048 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002049 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
2050 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
2051 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
2052 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002053 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002054 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
2055 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
2056 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08002057 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002058 params.SetLockDown(false);
2059 params.Init("1.2.3.4", "", 0);
2060 EXPECT_EQ("canary-channel", params.current_channel());
2061 EXPECT_EQ("stable-channel", params.target_channel());
2062 EXPECT_TRUE(params.to_more_stable_channel());
2063 EXPECT_TRUE(params.is_powerwash_allowed());
2064 ASSERT_FALSE(TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07002065 NULL, // payload_state
2066 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07002067 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002068 &params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002069 "invalid xml>",
2070 -1,
2071 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002072 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002073 metrics::CheckResult::kParsingError,
2074 metrics::CheckReaction::kUnset,
2075 metrics::DownloadErrorCode::kUnset,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002076 NULL, // response
2077 &post_data));
2078 // convert post_data to string
2079 string post_str(&post_data[0], post_data.size());
2080 EXPECT_NE(string::npos, post_str.find(
2081 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
2082 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
2083 "track=\"stable-channel\" from_track=\"canary-channel\" "));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002084
2085 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002086}
2087
2088TEST(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002089 // Create a uniquely named test directory.
2090 string test_dir;
2091 ASSERT_TRUE(utils::MakeTempDirectory(
2092 "omaha_request_action-test-XXXXXX", &test_dir));
2093
2094 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
2095 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07002096 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002097 vector<char> post_data;
2098 NiceMock<PrefsMock> prefs;
2099 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002100 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002101 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
2102 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
2103 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
2104 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002105 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002106 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
2107 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08002108 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002109 params.SetLockDown(false);
2110 params.Init("5.6.7.8", "", 0);
2111 EXPECT_EQ("stable-channel", params.current_channel());
2112 EXPECT_EQ("canary-channel", params.target_channel());
2113 EXPECT_FALSE(params.to_more_stable_channel());
2114 EXPECT_FALSE(params.is_powerwash_allowed());
2115 ASSERT_FALSE(TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07002116 NULL, // payload_state
2117 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07002118 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002119 &params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002120 "invalid xml>",
2121 -1,
2122 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002123 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002124 metrics::CheckResult::kParsingError,
2125 metrics::CheckReaction::kUnset,
2126 metrics::DownloadErrorCode::kUnset,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002127 NULL, // response
2128 &post_data));
2129 // convert post_data to string
2130 string post_str(&post_data[0], post_data.size());
2131 EXPECT_NE(string::npos, post_str.find(
2132 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
2133 "version=\"5.6.7.8\" "
2134 "track=\"canary-channel\" from_track=\"stable-channel\""));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002135 EXPECT_EQ(string::npos, post_str.find("from_version"));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002136
2137 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002138}
2139
David Zeuthen8f191b22013-08-06 12:27:50 -07002140void P2PTest(bool initial_allow_p2p_for_downloading,
2141 bool initial_allow_p2p_for_sharing,
2142 bool omaha_disable_p2p_for_downloading,
2143 bool omaha_disable_p2p_for_sharing,
2144 bool payload_state_allow_p2p_attempt,
2145 bool expect_p2p_client_lookup,
2146 const string& p2p_client_result_url,
2147 bool expected_allow_p2p_for_downloading,
2148 bool expected_allow_p2p_for_sharing,
2149 const string& expected_p2p_url) {
2150 OmahaResponse response;
2151 OmahaRequestParams request_params = kDefaultTestParams;
2152 request_params.set_use_p2p_for_downloading(initial_allow_p2p_for_downloading);
2153 request_params.set_use_p2p_for_sharing(initial_allow_p2p_for_sharing);
2154
2155 MockPayloadState mock_payload_state;
2156 EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
2157 .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
2158 MockP2PManager mock_p2p_manager;
2159 mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
2160
David Zeuthen4cc5ed22014-01-15 12:35:03 -08002161 TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
2162 EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
David Zeuthen8f191b22013-08-06 12:27:50 -07002163 .Times(expect_p2p_client_lookup ? 1 : 0);
2164
2165 ASSERT_TRUE(
2166 TestUpdateCheck(NULL, // prefs
2167 &mock_payload_state,
2168 &mock_p2p_manager,
Chris Sosa77f79e82014-06-02 18:16:24 -07002169 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002170 &request_params,
David Zeuthen8f191b22013-08-06 12:27:50 -07002171 GetUpdateResponse2(OmahaRequestParams::kAppId,
2172 "1.2.3.4", // version
2173 "http://more/info",
2174 "true", // prompt
2175 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002176 "file.signed", // file name
David Zeuthen8f191b22013-08-06 12:27:50 -07002177 "HASH1234=", // checksum
2178 "false", // needs admin
2179 "123", // size
2180 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002181 "7", // max days to scatter
2182 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07002183 omaha_disable_p2p_for_downloading,
2184 omaha_disable_p2p_for_sharing),
2185 -1,
2186 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002187 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002188 metrics::CheckResult::kUpdateAvailable,
2189 metrics::CheckReaction::kUpdating,
2190 metrics::DownloadErrorCode::kUnset,
David Zeuthen8f191b22013-08-06 12:27:50 -07002191 &response,
2192 NULL));
2193 EXPECT_TRUE(response.update_exists);
2194
2195 EXPECT_EQ(response.disable_p2p_for_downloading,
2196 omaha_disable_p2p_for_downloading);
2197 EXPECT_EQ(response.disable_p2p_for_sharing,
2198 omaha_disable_p2p_for_sharing);
2199
2200 EXPECT_EQ(request_params.use_p2p_for_downloading(),
2201 expected_allow_p2p_for_downloading);
2202
2203 EXPECT_EQ(request_params.use_p2p_for_sharing(),
2204 expected_allow_p2p_for_sharing);
2205
2206 EXPECT_EQ(request_params.p2p_url(), expected_p2p_url);
2207}
2208
2209TEST(OmahaRequestActionTest, P2PWithPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002210 P2PTest(true, // initial_allow_p2p_for_downloading
2211 true, // initial_allow_p2p_for_sharing
2212 false, // omaha_disable_p2p_for_downloading
2213 false, // omaha_disable_p2p_for_sharing
2214 true, // payload_state_allow_p2p_attempt
2215 true, // expect_p2p_client_lookup
2216 "http://1.3.5.7/p2p", // p2p_client_result_url
2217 true, // expected_allow_p2p_for_downloading
2218 true, // expected_allow_p2p_for_sharing
2219 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002220}
2221
2222TEST(OmahaRequestActionTest, P2PWithoutPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002223 P2PTest(true, // initial_allow_p2p_for_downloading
2224 true, // initial_allow_p2p_for_sharing
2225 false, // omaha_disable_p2p_for_downloading
2226 false, // omaha_disable_p2p_for_sharing
2227 true, // payload_state_allow_p2p_attempt
2228 true, // expect_p2p_client_lookup
2229 "", // p2p_client_result_url
2230 false, // expected_allow_p2p_for_downloading
2231 true, // expected_allow_p2p_for_sharing
2232 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002233}
2234
2235TEST(OmahaRequestActionTest, P2PDownloadNotAllowed) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002236 P2PTest(false, // initial_allow_p2p_for_downloading
2237 true, // initial_allow_p2p_for_sharing
2238 false, // omaha_disable_p2p_for_downloading
2239 false, // omaha_disable_p2p_for_sharing
2240 true, // payload_state_allow_p2p_attempt
2241 false, // expect_p2p_client_lookup
2242 "unset", // p2p_client_result_url
2243 false, // expected_allow_p2p_for_downloading
2244 true, // expected_allow_p2p_for_sharing
2245 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002246}
2247
2248TEST(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002249 P2PTest(true, // initial_allow_p2p_for_downloading
2250 true, // initial_allow_p2p_for_sharing
2251 true, // omaha_disable_p2p_for_downloading
2252 false, // omaha_disable_p2p_for_sharing
2253 true, // payload_state_allow_p2p_attempt
2254 false, // expect_p2p_client_lookup
2255 "unset", // p2p_client_result_url
2256 false, // expected_allow_p2p_for_downloading
2257 true, // expected_allow_p2p_for_sharing
2258 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002259}
2260
2261TEST(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002262 P2PTest(true, // initial_allow_p2p_for_downloading
2263 true, // initial_allow_p2p_for_sharing
2264 false, // omaha_disable_p2p_for_downloading
2265 true, // omaha_disable_p2p_for_sharing
2266 true, // payload_state_allow_p2p_attempt
2267 true, // expect_p2p_client_lookup
2268 "http://1.3.5.7/p2p", // p2p_client_result_url
2269 true, // expected_allow_p2p_for_downloading
2270 false, // expected_allow_p2p_for_sharing
2271 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002272}
2273
2274TEST(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002275 P2PTest(true, // initial_allow_p2p_for_downloading
2276 true, // initial_allow_p2p_for_sharing
2277 true, // omaha_disable_p2p_for_downloading
2278 true, // omaha_disable_p2p_for_sharing
2279 true, // payload_state_allow_p2p_attempt
2280 false, // expect_p2p_client_lookup
2281 "unset", // p2p_client_result_url
2282 false, // expected_allow_p2p_for_downloading
2283 false, // expected_allow_p2p_for_sharing
2284 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002285}
2286
David Zeuthen639aa362014-02-03 16:23:44 -08002287bool InstallDateParseHelper(const std::string &elapsed_days,
2288 PrefsInterface* prefs,
2289 OmahaResponse *response) {
2290 return
2291 TestUpdateCheck(prefs,
2292 NULL, // payload_state
2293 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07002294 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002295 &kDefaultTestParams,
David Zeuthen639aa362014-02-03 16:23:44 -08002296 GetUpdateResponse2(OmahaRequestParams::kAppId,
2297 "1.2.3.4", // version
2298 "http://more/info",
2299 "true", // prompt
2300 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002301 "file.signed", // file name
David Zeuthen639aa362014-02-03 16:23:44 -08002302 "HASH1234=", // checksum
2303 "false", // needs admin
2304 "123", // size
2305 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002306 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -08002307 elapsed_days,
2308 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002309 false), // disable_p2p_for sharing
David Zeuthen639aa362014-02-03 16:23:44 -08002310 -1,
2311 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002312 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002313 metrics::CheckResult::kUpdateAvailable,
2314 metrics::CheckReaction::kUpdating,
2315 metrics::DownloadErrorCode::kUnset,
David Zeuthen639aa362014-02-03 16:23:44 -08002316 response,
2317 NULL);
2318}
2319
2320TEST(OmahaRequestActionTest, ParseInstallDateFromResponse) {
2321 OmahaResponse response;
2322 string temp_dir;
2323 Prefs prefs;
2324 EXPECT_TRUE(utils::MakeTempDirectory("ParseInstallDateFromResponse.XXXXXX",
2325 &temp_dir));
Alex Vakulenko75039d72014-03-25 12:36:28 -07002326 prefs.Init(base::FilePath(temp_dir));
David Zeuthen639aa362014-02-03 16:23:44 -08002327
2328 // Check that we parse elapsed_days in the Omaha Response correctly.
2329 // and that the kPrefsInstallDateDays value is written to.
2330 EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2331 EXPECT_TRUE(InstallDateParseHelper("42", &prefs, &response));
2332 EXPECT_TRUE(response.update_exists);
2333 EXPECT_EQ(42, response.install_date_days);
2334 EXPECT_TRUE(prefs.Exists(kPrefsInstallDateDays));
2335 int64_t prefs_days;
2336 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2337 EXPECT_EQ(prefs_days, 42);
2338
2339 // If there already is a value set, we shouldn't do anything.
2340 EXPECT_TRUE(InstallDateParseHelper("7", &prefs, &response));
2341 EXPECT_TRUE(response.update_exists);
2342 EXPECT_EQ(7, response.install_date_days);
2343 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2344 EXPECT_EQ(prefs_days, 42);
2345
2346 // Note that elapsed_days is not necessarily divisible by 7 so check
2347 // that we round down correctly when populating kPrefsInstallDateDays.
2348 EXPECT_TRUE(prefs.Delete(kPrefsInstallDateDays));
2349 EXPECT_TRUE(InstallDateParseHelper("23", &prefs, &response));
2350 EXPECT_TRUE(response.update_exists);
2351 EXPECT_EQ(23, response.install_date_days);
2352 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2353 EXPECT_EQ(prefs_days, 21);
2354
2355 // Check that we correctly handle elapsed_days not being included in
2356 // the Omaha Response.
2357 EXPECT_TRUE(InstallDateParseHelper("", &prefs, &response));
2358 EXPECT_TRUE(response.update_exists);
2359 EXPECT_EQ(-1, response.install_date_days);
2360
2361 EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
2362}
2363
2364TEST(OmahaRequestActionTest, GetInstallDate) {
2365 string temp_dir;
2366 Prefs prefs;
2367 EXPECT_TRUE(utils::MakeTempDirectory("GetInstallDate.XXXXXX",
2368 &temp_dir));
Alex Vakulenko75039d72014-03-25 12:36:28 -07002369 prefs.Init(base::FilePath(temp_dir));
David Zeuthen639aa362014-02-03 16:23:44 -08002370
2371 // If there is no prefs and OOBE is not complete, we should not
2372 // report anything to Omaha.
2373 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002374 FakeSystemState system_state;
David Zeuthen639aa362014-02-03 16:23:44 -08002375 system_state.set_prefs(&prefs);
2376 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&system_state), -1);
2377 EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2378 }
2379
2380 // If OOBE is complete and happened on a valid date (e.g. after Jan
2381 // 1 2007 0:00 PST), that date should be used and written to
2382 // prefs. However, first try with an invalid date and check we do
2383 // nothing.
2384 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002385 FakeSystemState fake_system_state;
2386 fake_system_state.set_prefs(&prefs);
David Zeuthen639aa362014-02-03 16:23:44 -08002387
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002388 Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002389 fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
2390 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), -1);
David Zeuthen639aa362014-02-03 16:23:44 -08002391 EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2392 }
2393
2394 // Then check with a valid date. The date Jan 20, 2007 0:00 PST
2395 // should yield an InstallDate of 14.
2396 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002397 FakeSystemState fake_system_state;
2398 fake_system_state.set_prefs(&prefs);
David Zeuthen639aa362014-02-03 16:23:44 -08002399
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002400 Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002401 fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
2402 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002403 EXPECT_TRUE(prefs.Exists(kPrefsInstallDateDays));
2404
2405 int64_t prefs_days;
2406 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2407 EXPECT_EQ(prefs_days, 14);
2408 }
2409
2410 // Now that we have a valid date in prefs, check that we keep using
2411 // that even if OOBE date reports something else. The date Jan 30,
2412 // 2007 0:00 PST should yield an InstallDate of 28... but since
2413 // there's a prefs file, we should still get 14.
2414 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002415 FakeSystemState fake_system_state;
2416 fake_system_state.set_prefs(&prefs);
David Zeuthen639aa362014-02-03 16:23:44 -08002417
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002418 Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002419 fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
2420 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002421
2422 int64_t prefs_days;
2423 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2424 EXPECT_EQ(prefs_days, 14);
2425
2426 // If we delete the prefs file, we should get 28 days.
2427 EXPECT_TRUE(prefs.Delete(kPrefsInstallDateDays));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002428 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 28);
David Zeuthen639aa362014-02-03 16:23:44 -08002429 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2430 EXPECT_EQ(prefs_days, 28);
2431 }
2432
2433 EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
2434}
2435
Darin Petkov6a5b3222010-07-13 14:55:28 -07002436} // namespace chromeos_update_engine