blob: 2d67ec0957df433f935ae163d869e778ecb62931 [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2011 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
adlr@google.com3defe6a2009-12-04 20:57:17 +000016
Amin Hassaniec7bc112020-10-29 16:47:58 -070017#include "update_engine/cros/omaha_request_params.h"
Alex Deymo8427b4a2014-11-05 14:00:32 -080018
adlr@google.com3defe6a2009-12-04 20:57:17 +000019#include <stdio.h>
Darin Petkovfbb40092010-07-29 17:05:50 -070020
adlr@google.com3defe6a2009-12-04 20:57:17 +000021#include <string>
Darin Petkovfbb40092010-07-29 17:05:50 -070022
Alex Deymo8427b4a2014-11-05 14:00:32 -080023#include <base/files/file_util.h>
Sen Jiang297e5832016-03-17 14:45:51 -070024#include <base/files/scoped_temp_dir.h>
Alex Deymo8427b4a2014-11-05 14:00:32 -080025#include <gtest/gtest.h>
26
Alex Deymo39910dc2015-11-09 17:04:30 -080027#include "update_engine/common/constants.h"
28#include "update_engine/common/platform_constants.h"
29#include "update_engine/common/test_utils.h"
30#include "update_engine/common/utils.h"
Amin Hassaniec7bc112020-10-29 16:47:58 -070031#include "update_engine/cros/fake_system_state.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000032
Alex Deymo10875d92014-11-10 21:52:57 -080033using chromeos_update_engine::test_utils::WriteFileString;
adlr@google.com3defe6a2009-12-04 20:57:17 +000034using std::string;
35
36namespace chromeos_update_engine {
37
Jay Srinivasanae4697c2013-03-18 17:08:08 -070038class OmahaRequestParamsTest : public ::testing::Test {
39 public:
Amin Hassani538bd592020-11-04 20:46:08 -080040 OmahaRequestParamsTest() : params_() {}
Jay Srinivasanae4697c2013-03-18 17:08:08 -070041
Darin Petkov5a7f5652010-07-22 21:40:09 -070042 protected:
Alex Deymo610277e2014-11-11 21:18:11 -080043 void SetUp() override {
Gilad Arnoldc9abbec2013-07-01 06:24:42 -070044 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -070045 ASSERT_TRUE(tempdir_.CreateUniqueTempDir());
Hidehiko Abe2b9d2412017-12-13 18:56:18 +090046 params_.set_root(tempdir_.GetPath().value());
Amin Hassani538bd592020-11-04 20:46:08 -080047 FakeSystemState::CreateInstance();
Alex Deymo85616652015-10-15 18:48:31 -070048 SetLockDown(false);
Alex Deymo85616652015-10-15 18:48:31 -070049 }
50
51 void SetLockDown(bool locked_down) {
Amin Hassani538bd592020-11-04 20:46:08 -080052 FakeSystemState::Get()->fake_hardware()->SetIsOfficialBuild(locked_down);
53 FakeSystemState::Get()->fake_hardware()->SetIsNormalBootMode(locked_down);
Darin Petkov5a7f5652010-07-22 21:40:09 -070054 }
55
Amin Hassani538bd592020-11-04 20:46:08 -080056 OmahaRequestParams params_;
Sen Jiang297e5832016-03-17 14:45:51 -070057 base::ScopedTempDir tempdir_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000058};
59
adlr@google.com3defe6a2009-12-04 20:57:17 +000060namespace {
adlr@google.com3defe6a2009-12-04 20:57:17 +000061string GetMachineType() {
Gilad Arnold19a45f02012-07-19 12:36:10 -070062 string machine_type;
63 if (!utils::ReadPipe("uname -m", &machine_type))
adlr@google.com3defe6a2009-12-04 20:57:17 +000064 return "";
Gilad Arnold19a45f02012-07-19 12:36:10 -070065 // Strip anything from the first newline char.
66 size_t newline_pos = machine_type.find('\n');
67 if (newline_pos != string::npos)
68 machine_type.erase(newline_pos);
69 return machine_type;
adlr@google.com3defe6a2009-12-04 20:57:17 +000070}
Alex Vakulenkod2779df2014-06-16 13:19:00 -070071} // namespace
adlr@google.com3defe6a2009-12-04 20:57:17 +000072
Jay Srinivasanae4697c2013-03-18 17:08:08 -070073TEST_F(OmahaRequestParamsTest, MissingChannelTest) {
Amin Hassanie8153632020-10-27 15:11:28 -070074 EXPECT_TRUE(params_.Init("", "", {}));
Alex Deymo85616652015-10-15 18:48:31 -070075 // By default, if no channel is set, we should track the stable-channel.
Sen Jiang297e5832016-03-17 14:45:51 -070076 EXPECT_EQ("stable-channel", params_.target_channel());
Darin Petkov5a7f5652010-07-22 21:40:09 -070077}
78
Jay Srinivasanae4697c2013-03-18 17:08:08 -070079TEST_F(OmahaRequestParamsTest, ForceVersionTest) {
Amin Hassanie8153632020-10-27 15:11:28 -070080 EXPECT_TRUE(params_.Init("ForcedVersion", "", {}));
Sen Jiang297e5832016-03-17 14:45:51 -070081 EXPECT_EQ(string("ForcedVersion_") + GetMachineType(), params_.os_sp());
82 EXPECT_EQ("ForcedVersion", params_.app_version());
Darin Petkov5a7f5652010-07-22 21:40:09 -070083}
84
Jay Srinivasanae4697c2013-03-18 17:08:08 -070085TEST_F(OmahaRequestParamsTest, ForcedURLTest) {
Amin Hassanie8153632020-10-27 15:11:28 -070086 EXPECT_TRUE(params_.Init("", "http://forced.google.com", {}));
Sen Jiang297e5832016-03-17 14:45:51 -070087 EXPECT_EQ("http://forced.google.com", params_.update_url());
Darin Petkov5a7f5652010-07-22 21:40:09 -070088}
89
Jay Srinivasanae4697c2013-03-18 17:08:08 -070090TEST_F(OmahaRequestParamsTest, MissingURLTest) {
Amin Hassanie8153632020-10-27 15:11:28 -070091 EXPECT_TRUE(params_.Init("", "", {}));
Sen Jiang297e5832016-03-17 14:45:51 -070092 EXPECT_EQ(constants::kOmahaDefaultProductionURL, params_.update_url());
93}
94
95TEST_F(OmahaRequestParamsTest, DeltaOKTest) {
Amin Hassanie8153632020-10-27 15:11:28 -070096 EXPECT_TRUE(params_.Init("", "", {}));
Sen Jiang297e5832016-03-17 14:45:51 -070097 EXPECT_TRUE(params_.delta_okay());
Andrew de los Reyes970bb282009-12-09 16:34:04 -080098}
99
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700100TEST_F(OmahaRequestParamsTest, NoDeltasTest) {
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900101 ASSERT_TRUE(
102 WriteFileString(tempdir_.GetPath().Append(".nodelta").value(), ""));
Amin Hassanie8153632020-10-27 15:11:28 -0700103 EXPECT_TRUE(params_.Init("", "", {}));
Sen Jiang297e5832016-03-17 14:45:51 -0700104 EXPECT_FALSE(params_.delta_okay());
Darin Petkova3df55b2010-11-15 13:33:55 -0800105}
106
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700107TEST_F(OmahaRequestParamsTest, SetTargetChannelTest) {
Darin Petkov49d91322010-10-25 16:34:58 -0700108 {
Amin Hassani538bd592020-11-04 20:46:08 -0800109 OmahaRequestParams params;
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900110 params.set_root(tempdir_.GetPath().value());
Amin Hassanie8153632020-10-27 15:11:28 -0700111 EXPECT_TRUE(params.Init("", "", {}));
Sen Jiang297e5832016-03-17 14:45:51 -0700112 EXPECT_TRUE(params.SetTargetChannel("canary-channel", false, nullptr));
Sen Jiang8500d3a2018-02-08 12:04:05 -0800113 EXPECT_FALSE(params.mutable_image_props_.is_powerwash_allowed);
Darin Petkov49d91322010-10-25 16:34:58 -0700114 }
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900115 params_.set_root(tempdir_.GetPath().value());
Amin Hassanie8153632020-10-27 15:11:28 -0700116 EXPECT_TRUE(params_.Init("", "", {}));
Sen Jiang297e5832016-03-17 14:45:51 -0700117 EXPECT_EQ("canary-channel", params_.target_channel());
Sen Jiang8500d3a2018-02-08 12:04:05 -0800118 EXPECT_FALSE(params_.mutable_image_props_.is_powerwash_allowed);
Darin Petkov49d91322010-10-25 16:34:58 -0700119}
120
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700121TEST_F(OmahaRequestParamsTest, SetIsPowerwashAllowedTest) {
Darin Petkov49d91322010-10-25 16:34:58 -0700122 {
Amin Hassani538bd592020-11-04 20:46:08 -0800123 OmahaRequestParams params;
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900124 params.set_root(tempdir_.GetPath().value());
Amin Hassanie8153632020-10-27 15:11:28 -0700125 EXPECT_TRUE(params.Init("", "", {}));
Sen Jiang297e5832016-03-17 14:45:51 -0700126 EXPECT_TRUE(params.SetTargetChannel("canary-channel", true, nullptr));
Sen Jiang8500d3a2018-02-08 12:04:05 -0800127 EXPECT_TRUE(params.mutable_image_props_.is_powerwash_allowed);
Darin Petkov49d91322010-10-25 16:34:58 -0700128 }
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900129 params_.set_root(tempdir_.GetPath().value());
Amin Hassanie8153632020-10-27 15:11:28 -0700130 EXPECT_TRUE(params_.Init("", "", {}));
Sen Jiang297e5832016-03-17 14:45:51 -0700131 EXPECT_EQ("canary-channel", params_.target_channel());
Sen Jiang8500d3a2018-02-08 12:04:05 -0800132 EXPECT_TRUE(params_.mutable_image_props_.is_powerwash_allowed);
Darin Petkov49d91322010-10-25 16:34:58 -0700133}
134
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700135TEST_F(OmahaRequestParamsTest, SetTargetChannelInvalidTest) {
Darin Petkov49d91322010-10-25 16:34:58 -0700136 {
Amin Hassani538bd592020-11-04 20:46:08 -0800137 OmahaRequestParams params;
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900138 params.set_root(tempdir_.GetPath().value());
Alex Deymo85616652015-10-15 18:48:31 -0700139 SetLockDown(true);
Amin Hassanie8153632020-10-27 15:11:28 -0700140 EXPECT_TRUE(params.Init("", "", {}));
Sen Jiang7f785f52018-01-24 13:31:56 -0800141 params.image_props_.allow_arbitrary_channels = false;
Alex Deymod942f9d2015-11-06 16:11:50 -0800142 string error_message;
143 EXPECT_FALSE(
144 params.SetTargetChannel("dogfood-channel", true, &error_message));
145 // The error message should include a message about the valid channels.
146 EXPECT_NE(string::npos, error_message.find("stable-channel"));
Sen Jiang8500d3a2018-02-08 12:04:05 -0800147 EXPECT_FALSE(params.mutable_image_props_.is_powerwash_allowed);
Darin Petkov49d91322010-10-25 16:34:58 -0700148 }
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900149 params_.set_root(tempdir_.GetPath().value());
Amin Hassanie8153632020-10-27 15:11:28 -0700150 EXPECT_TRUE(params_.Init("", "", {}));
Sen Jiang297e5832016-03-17 14:45:51 -0700151 EXPECT_EQ("stable-channel", params_.target_channel());
Sen Jiang8500d3a2018-02-08 12:04:05 -0800152 EXPECT_FALSE(params_.mutable_image_props_.is_powerwash_allowed);
Darin Petkov49d91322010-10-25 16:34:58 -0700153}
154
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700155TEST_F(OmahaRequestParamsTest, IsValidChannelTest) {
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700156 EXPECT_TRUE(params_.IsValidChannel("canary-channel"));
157 EXPECT_TRUE(params_.IsValidChannel("stable-channel"));
158 EXPECT_TRUE(params_.IsValidChannel("beta-channel"));
159 EXPECT_TRUE(params_.IsValidChannel("dev-channel"));
160 EXPECT_FALSE(params_.IsValidChannel("testimage-channel"));
161 EXPECT_FALSE(params_.IsValidChannel("dogfood-channel"));
162 EXPECT_FALSE(params_.IsValidChannel("some-channel"));
163 EXPECT_FALSE(params_.IsValidChannel(""));
Sen Jiang7f785f52018-01-24 13:31:56 -0800164 params_.image_props_.allow_arbitrary_channels = true;
165 EXPECT_TRUE(params_.IsValidChannel("some-channel"));
Sen Jiangce3f7cf2018-01-25 14:07:45 -0800166 EXPECT_FALSE(params_.IsValidChannel("wrong-suffix"));
167 EXPECT_FALSE(params_.IsValidChannel(""));
Darin Petkov49d91322010-10-25 16:34:58 -0700168}
169
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700170TEST_F(OmahaRequestParamsTest, SetTargetChannelWorks) {
Sen Jiang297e5832016-03-17 14:45:51 -0700171 params_.set_target_channel("dev-channel");
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700172 EXPECT_EQ("dev-channel", params_.target_channel());
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200173
Sen Jiang297e5832016-03-17 14:45:51 -0700174 // When an invalid value is set, it should be ignored.
Alex Deymod942f9d2015-11-06 16:11:50 -0800175 EXPECT_FALSE(params_.SetTargetChannel("invalid-channel", false, nullptr));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700176 EXPECT_EQ("dev-channel", params_.target_channel());
177
178 // When set to a valid value, it should take effect.
Alex Deymod942f9d2015-11-06 16:11:50 -0800179 EXPECT_TRUE(params_.SetTargetChannel("beta-channel", true, nullptr));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700180 EXPECT_EQ("beta-channel", params_.target_channel());
181
182 // When set to the same value, it should be idempotent.
Alex Deymod942f9d2015-11-06 16:11:50 -0800183 EXPECT_TRUE(params_.SetTargetChannel("beta-channel", true, nullptr));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700184 EXPECT_EQ("beta-channel", params_.target_channel());
185
186 // When set to a valid value while a change is already pending, it should
Jay Srinivasan1c0fe792013-03-28 16:45:25 -0700187 // succeed.
Alex Deymod942f9d2015-11-06 16:11:50 -0800188 EXPECT_TRUE(params_.SetTargetChannel("stable-channel", true, nullptr));
Jay Srinivasan1c0fe792013-03-28 16:45:25 -0700189 EXPECT_EQ("stable-channel", params_.target_channel());
190
Sen Jiang297e5832016-03-17 14:45:51 -0700191 // Set a different channel in mutable_image_props_.
192 params_.set_target_channel("stable-channel");
Jay Srinivasan1c0fe792013-03-28 16:45:25 -0700193
194 // When set to a valid value while a change is already pending, it should
195 // succeed.
Amin Hassanie8153632020-10-27 15:11:28 -0700196 params_.Init("", "", {});
Alex Deymod942f9d2015-11-06 16:11:50 -0800197 EXPECT_TRUE(params_.SetTargetChannel("beta-channel", true, nullptr));
Jay Srinivasan1c0fe792013-03-28 16:45:25 -0700198 // The target channel should reflect the change, but the download channel
199 // should continue to retain the old value ...
200 EXPECT_EQ("beta-channel", params_.target_channel());
201 EXPECT_EQ("stable-channel", params_.download_channel());
202
203 // ... until we update the download channel explicitly.
204 params_.UpdateDownloadChannel();
205 EXPECT_EQ("beta-channel", params_.download_channel());
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700206 EXPECT_EQ("beta-channel", params_.target_channel());
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200207}
208
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700209TEST_F(OmahaRequestParamsTest, ChannelIndexTest) {
210 int canary = params_.GetChannelIndex("canary-channel");
211 int dev = params_.GetChannelIndex("dev-channel");
212 int beta = params_.GetChannelIndex("beta-channel");
213 int stable = params_.GetChannelIndex("stable-channel");
214 EXPECT_LE(canary, dev);
215 EXPECT_LE(dev, beta);
216 EXPECT_LE(beta, stable);
217
218 // testimage-channel or other names are not recognized, so index will be -1.
219 int testimage = params_.GetChannelIndex("testimage-channel");
220 int bogus = params_.GetChannelIndex("bogus-channel");
221 EXPECT_EQ(-1, testimage);
222 EXPECT_EQ(-1, bogus);
223}
224
225TEST_F(OmahaRequestParamsTest, ToMoreStableChannelFlagTest) {
Sen Jiang297e5832016-03-17 14:45:51 -0700226 params_.image_props_.current_channel = "canary-channel";
227 params_.download_channel_ = "stable-channel";
Sen Jiang8500d3a2018-02-08 12:04:05 -0800228 EXPECT_TRUE(params_.ToMoreStableChannel());
Sen Jiangce3f7cf2018-01-25 14:07:45 -0800229 params_.image_props_.current_channel = "stable-channel";
Sen Jiang8500d3a2018-02-08 12:04:05 -0800230 EXPECT_FALSE(params_.ToMoreStableChannel());
Sen Jiangce3f7cf2018-01-25 14:07:45 -0800231 params_.download_channel_ = "beta-channel";
Sen Jiang8500d3a2018-02-08 12:04:05 -0800232 EXPECT_FALSE(params_.ToMoreStableChannel());
233}
234
Amin Hassani37b67232020-08-13 09:29:48 -0700235TEST_F(OmahaRequestParamsTest, TargetChannelHintTest) {
Amin Hassanie8153632020-10-27 15:11:28 -0700236 EXPECT_TRUE(params_.Init("", "", {}));
Amin Hassani37b67232020-08-13 09:29:48 -0700237 const string kHint("foo-hint");
238 params_.set_lts_tag(kHint);
239 EXPECT_EQ(kHint, params_.lts_tag());
240}
241
Sen Jiang8500d3a2018-02-08 12:04:05 -0800242TEST_F(OmahaRequestParamsTest, ShouldPowerwashTest) {
243 params_.mutable_image_props_.is_powerwash_allowed = false;
244 EXPECT_FALSE(params_.ShouldPowerwash());
245 params_.mutable_image_props_.is_powerwash_allowed = true;
246 params_.image_props_.allow_arbitrary_channels = true;
247 params_.image_props_.current_channel = "foo-channel";
248 params_.download_channel_ = "bar-channel";
249 EXPECT_TRUE(params_.ShouldPowerwash());
250 params_.image_props_.allow_arbitrary_channels = false;
251 params_.image_props_.current_channel = "canary-channel";
252 params_.download_channel_ = "stable-channel";
253 EXPECT_TRUE(params_.ShouldPowerwash());
Jay Srinivasandb0acdf2013-04-02 14:47:45 -0700254}
255
Matt Ziegelbaumaa8e1a42019-05-09 21:41:58 -0400256TEST_F(OmahaRequestParamsTest, RequisitionIsSetTest) {
Amin Hassanie8153632020-10-27 15:11:28 -0700257 EXPECT_TRUE(params_.Init("", "", {}));
Matt Ziegelbaumaa8e1a42019-05-09 21:41:58 -0400258 EXPECT_EQ("fake_requisition", params_.device_requisition());
259}
Jae Hoon Kime2cac612020-11-02 18:30:29 -0800260
261TEST_F(OmahaRequestParamsTest, GetMissingDlcId) {
262 EXPECT_TRUE(params_.Init("", "", {}));
263
264 string dlc_id;
265 EXPECT_FALSE(params_.GetDlcId("some-dlc-app-id", &dlc_id));
266}
267
268TEST_F(OmahaRequestParamsTest, GetDlcId) {
269 EXPECT_TRUE(params_.Init("", "", {}));
270 const string kExpectedDlcId = "test-dlc";
271 const string dlc_app_id = params_.GetDlcAppId(kExpectedDlcId);
272 params_.set_dlc_apps_params({{dlc_app_id, {.name = kExpectedDlcId}}});
273
274 string dlc_id;
275 EXPECT_TRUE(params_.GetDlcId(dlc_app_id, &dlc_id));
276 EXPECT_EQ(kExpectedDlcId, dlc_id);
277}
278
279TEST_F(OmahaRequestParamsTest, GetDlcAppId) {
280 EXPECT_TRUE(params_.Init("", "", {}));
281 const string kAppId = "test-app-id";
282 params_.set_app_id(kAppId);
283 const string kDlcId = "test-dlc";
284 const string expected_dlc_app_id = kAppId + "_" + kDlcId;
285
286 EXPECT_EQ(expected_dlc_app_id, params_.GetDlcAppId(kDlcId));
287}
288
Saurabh Nijhara43d7adc2020-11-06 16:13:02 +0100289TEST_F(OmahaRequestParamsTest, AutoUpdateTokenTest) {
290 EXPECT_TRUE(params_.Init("", "", {.quick_fix_build_token = "foo-token"}));
291 EXPECT_EQ("foo-token", params_.autoupdate_token());
292}
293
adlr@google.com3defe6a2009-12-04 20:57:17 +0000294} // namespace chromeos_update_engine