blob: 733243190df9bc7ba5b44bf955e30cbea40c8779 [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
Alex Deymo8427b4a2014-11-05 14:00:32 -080017#include "update_engine/omaha_request_params.h"
18
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"
Sen Jiang297e5832016-03-17 14:45:51 -070028#include "update_engine/common/fake_prefs.h"
Alex Deymo39910dc2015-11-09 17:04:30 -080029#include "update_engine/common/platform_constants.h"
30#include "update_engine/common/test_utils.h"
31#include "update_engine/common/utils.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070032#include "update_engine/fake_system_state.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000033
Alex Deymo10875d92014-11-10 21:52:57 -080034using chromeos_update_engine::test_utils::WriteFileString;
adlr@google.com3defe6a2009-12-04 20:57:17 +000035using std::string;
36
37namespace chromeos_update_engine {
38
Jay Srinivasanae4697c2013-03-18 17:08:08 -070039class OmahaRequestParamsTest : public ::testing::Test {
40 public:
Gilad Arnold5bb4c902014-04-10 12:32:13 -070041 OmahaRequestParamsTest() : params_(&fake_system_state_) {}
Jay Srinivasanae4697c2013-03-18 17:08:08 -070042
Darin Petkov5a7f5652010-07-22 21:40:09 -070043 protected:
Alex Deymo610277e2014-11-11 21:18:11 -080044 void SetUp() override {
Gilad Arnoldc9abbec2013-07-01 06:24:42 -070045 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -070046 ASSERT_TRUE(tempdir_.CreateUniqueTempDir());
Hidehiko Abe2b9d2412017-12-13 18:56:18 +090047 params_.set_root(tempdir_.GetPath().value());
Alex Deymo85616652015-10-15 18:48:31 -070048 SetLockDown(false);
Sen Jiang297e5832016-03-17 14:45:51 -070049 fake_system_state_.set_prefs(&fake_prefs_);
Alex Deymo85616652015-10-15 18:48:31 -070050 }
51
52 void SetLockDown(bool locked_down) {
53 fake_system_state_.fake_hardware()->SetIsOfficialBuild(locked_down);
54 fake_system_state_.fake_hardware()->SetIsNormalBootMode(locked_down);
Darin Petkov5a7f5652010-07-22 21:40:09 -070055 }
56
Gilad Arnold5bb4c902014-04-10 12:32:13 -070057 FakeSystemState fake_system_state_;
Marton Hunyady2abda312018-04-24 18:21:49 +020058 OmahaRequestParams params_{&fake_system_state_};
Sen Jiang297e5832016-03-17 14:45:51 -070059 FakePrefs fake_prefs_;
Darin Petkov49d91322010-10-25 16:34:58 -070060
Sen Jiang297e5832016-03-17 14:45:51 -070061 base::ScopedTempDir tempdir_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000062};
63
adlr@google.com3defe6a2009-12-04 20:57:17 +000064namespace {
adlr@google.com3defe6a2009-12-04 20:57:17 +000065string GetMachineType() {
Gilad Arnold19a45f02012-07-19 12:36:10 -070066 string machine_type;
67 if (!utils::ReadPipe("uname -m", &machine_type))
adlr@google.com3defe6a2009-12-04 20:57:17 +000068 return "";
Gilad Arnold19a45f02012-07-19 12:36:10 -070069 // Strip anything from the first newline char.
70 size_t newline_pos = machine_type.find('\n');
71 if (newline_pos != string::npos)
72 machine_type.erase(newline_pos);
73 return machine_type;
adlr@google.com3defe6a2009-12-04 20:57:17 +000074}
Alex Vakulenkod2779df2014-06-16 13:19:00 -070075} // namespace
adlr@google.com3defe6a2009-12-04 20:57:17 +000076
Jay Srinivasanae4697c2013-03-18 17:08:08 -070077TEST_F(OmahaRequestParamsTest, MissingChannelTest) {
Sen Jiang297e5832016-03-17 14:45:51 -070078 EXPECT_TRUE(params_.Init("", "", false));
Alex Deymo85616652015-10-15 18:48:31 -070079 // By default, if no channel is set, we should track the stable-channel.
Sen Jiang297e5832016-03-17 14:45:51 -070080 EXPECT_EQ("stable-channel", params_.target_channel());
Darin Petkov5a7f5652010-07-22 21:40:09 -070081}
82
Jay Srinivasanae4697c2013-03-18 17:08:08 -070083TEST_F(OmahaRequestParamsTest, ForceVersionTest) {
Sen Jiang297e5832016-03-17 14:45:51 -070084 EXPECT_TRUE(params_.Init("ForcedVersion", "", false));
85 EXPECT_EQ(string("ForcedVersion_") + GetMachineType(), params_.os_sp());
86 EXPECT_EQ("ForcedVersion", params_.app_version());
Darin Petkov5a7f5652010-07-22 21:40:09 -070087}
88
Jay Srinivasanae4697c2013-03-18 17:08:08 -070089TEST_F(OmahaRequestParamsTest, ForcedURLTest) {
Sen Jiang297e5832016-03-17 14:45:51 -070090 EXPECT_TRUE(params_.Init("", "http://forced.google.com", false));
91 EXPECT_EQ("http://forced.google.com", params_.update_url());
Darin Petkov5a7f5652010-07-22 21:40:09 -070092}
93
Jay Srinivasanae4697c2013-03-18 17:08:08 -070094TEST_F(OmahaRequestParamsTest, MissingURLTest) {
Sen Jiang297e5832016-03-17 14:45:51 -070095 EXPECT_TRUE(params_.Init("", "", false));
96 EXPECT_EQ(constants::kOmahaDefaultProductionURL, params_.update_url());
97}
98
99TEST_F(OmahaRequestParamsTest, DeltaOKTest) {
100 EXPECT_TRUE(params_.Init("", "", false));
101 EXPECT_TRUE(params_.delta_okay());
Andrew de los Reyes970bb282009-12-09 16:34:04 -0800102}
103
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700104TEST_F(OmahaRequestParamsTest, NoDeltasTest) {
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900105 ASSERT_TRUE(
106 WriteFileString(tempdir_.GetPath().Append(".nodelta").value(), ""));
Sen Jiang297e5832016-03-17 14:45:51 -0700107 EXPECT_TRUE(params_.Init("", "", false));
108 EXPECT_FALSE(params_.delta_okay());
Darin Petkova3df55b2010-11-15 13:33:55 -0800109}
110
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700111TEST_F(OmahaRequestParamsTest, SetTargetChannelTest) {
Darin Petkov49d91322010-10-25 16:34:58 -0700112 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700113 OmahaRequestParams params(&fake_system_state_);
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900114 params.set_root(tempdir_.GetPath().value());
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700115 EXPECT_TRUE(params.Init("", "", false));
Sen Jiang297e5832016-03-17 14:45:51 -0700116 EXPECT_TRUE(params.SetTargetChannel("canary-channel", false, nullptr));
Sen Jiang8500d3a2018-02-08 12:04:05 -0800117 EXPECT_FALSE(params.mutable_image_props_.is_powerwash_allowed);
Darin Petkov49d91322010-10-25 16:34:58 -0700118 }
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900119 params_.set_root(tempdir_.GetPath().value());
Sen Jiang297e5832016-03-17 14:45:51 -0700120 EXPECT_TRUE(params_.Init("", "", false));
121 EXPECT_EQ("canary-channel", params_.target_channel());
Sen Jiang8500d3a2018-02-08 12:04:05 -0800122 EXPECT_FALSE(params_.mutable_image_props_.is_powerwash_allowed);
Darin Petkov49d91322010-10-25 16:34:58 -0700123}
124
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700125TEST_F(OmahaRequestParamsTest, SetIsPowerwashAllowedTest) {
Darin Petkov49d91322010-10-25 16:34:58 -0700126 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700127 OmahaRequestParams params(&fake_system_state_);
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900128 params.set_root(tempdir_.GetPath().value());
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700129 EXPECT_TRUE(params.Init("", "", false));
Sen Jiang297e5832016-03-17 14:45:51 -0700130 EXPECT_TRUE(params.SetTargetChannel("canary-channel", true, nullptr));
Sen Jiang8500d3a2018-02-08 12:04:05 -0800131 EXPECT_TRUE(params.mutable_image_props_.is_powerwash_allowed);
Darin Petkov49d91322010-10-25 16:34:58 -0700132 }
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900133 params_.set_root(tempdir_.GetPath().value());
Sen Jiang297e5832016-03-17 14:45:51 -0700134 EXPECT_TRUE(params_.Init("", "", false));
135 EXPECT_EQ("canary-channel", params_.target_channel());
Sen Jiang8500d3a2018-02-08 12:04:05 -0800136 EXPECT_TRUE(params_.mutable_image_props_.is_powerwash_allowed);
Darin Petkov49d91322010-10-25 16:34:58 -0700137}
138
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700139TEST_F(OmahaRequestParamsTest, SetTargetChannelInvalidTest) {
Darin Petkov49d91322010-10-25 16:34:58 -0700140 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700141 OmahaRequestParams params(&fake_system_state_);
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900142 params.set_root(tempdir_.GetPath().value());
Alex Deymo85616652015-10-15 18:48:31 -0700143 SetLockDown(true);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700144 EXPECT_TRUE(params.Init("", "", false));
Sen Jiang7f785f52018-01-24 13:31:56 -0800145 params.image_props_.allow_arbitrary_channels = false;
Alex Deymod942f9d2015-11-06 16:11:50 -0800146 string error_message;
147 EXPECT_FALSE(
148 params.SetTargetChannel("dogfood-channel", true, &error_message));
149 // The error message should include a message about the valid channels.
150 EXPECT_NE(string::npos, error_message.find("stable-channel"));
Sen Jiang8500d3a2018-02-08 12:04:05 -0800151 EXPECT_FALSE(params.mutable_image_props_.is_powerwash_allowed);
Darin Petkov49d91322010-10-25 16:34:58 -0700152 }
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900153 params_.set_root(tempdir_.GetPath().value());
Sen Jiang297e5832016-03-17 14:45:51 -0700154 EXPECT_TRUE(params_.Init("", "", false));
155 EXPECT_EQ("stable-channel", params_.target_channel());
Sen Jiang8500d3a2018-02-08 12:04:05 -0800156 EXPECT_FALSE(params_.mutable_image_props_.is_powerwash_allowed);
Darin Petkov49d91322010-10-25 16:34:58 -0700157}
158
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700159TEST_F(OmahaRequestParamsTest, IsValidChannelTest) {
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700160 EXPECT_TRUE(params_.IsValidChannel("canary-channel"));
161 EXPECT_TRUE(params_.IsValidChannel("stable-channel"));
162 EXPECT_TRUE(params_.IsValidChannel("beta-channel"));
163 EXPECT_TRUE(params_.IsValidChannel("dev-channel"));
164 EXPECT_FALSE(params_.IsValidChannel("testimage-channel"));
165 EXPECT_FALSE(params_.IsValidChannel("dogfood-channel"));
166 EXPECT_FALSE(params_.IsValidChannel("some-channel"));
167 EXPECT_FALSE(params_.IsValidChannel(""));
Sen Jiang7f785f52018-01-24 13:31:56 -0800168 params_.image_props_.allow_arbitrary_channels = true;
169 EXPECT_TRUE(params_.IsValidChannel("some-channel"));
Sen Jiangce3f7cf2018-01-25 14:07:45 -0800170 EXPECT_FALSE(params_.IsValidChannel("wrong-suffix"));
171 EXPECT_FALSE(params_.IsValidChannel(""));
Darin Petkov49d91322010-10-25 16:34:58 -0700172}
173
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700174TEST_F(OmahaRequestParamsTest, SetTargetChannelWorks) {
Sen Jiang297e5832016-03-17 14:45:51 -0700175 params_.set_target_channel("dev-channel");
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700176 EXPECT_EQ("dev-channel", params_.target_channel());
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200177
Sen Jiang297e5832016-03-17 14:45:51 -0700178 // When an invalid value is set, it should be ignored.
Alex Deymod942f9d2015-11-06 16:11:50 -0800179 EXPECT_FALSE(params_.SetTargetChannel("invalid-channel", false, nullptr));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700180 EXPECT_EQ("dev-channel", params_.target_channel());
181
182 // When set to a valid value, it should take effect.
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 the same value, it should be idempotent.
Alex Deymod942f9d2015-11-06 16:11:50 -0800187 EXPECT_TRUE(params_.SetTargetChannel("beta-channel", true, nullptr));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700188 EXPECT_EQ("beta-channel", params_.target_channel());
189
190 // When set to a valid value while a change is already pending, it should
Jay Srinivasan1c0fe792013-03-28 16:45:25 -0700191 // succeed.
Alex Deymod942f9d2015-11-06 16:11:50 -0800192 EXPECT_TRUE(params_.SetTargetChannel("stable-channel", true, nullptr));
Jay Srinivasan1c0fe792013-03-28 16:45:25 -0700193 EXPECT_EQ("stable-channel", params_.target_channel());
194
Sen Jiang297e5832016-03-17 14:45:51 -0700195 // Set a different channel in mutable_image_props_.
196 params_.set_target_channel("stable-channel");
Jay Srinivasan1c0fe792013-03-28 16:45:25 -0700197
198 // When set to a valid value while a change is already pending, it should
199 // succeed.
200 params_.Init("", "", false);
Alex Deymod942f9d2015-11-06 16:11:50 -0800201 EXPECT_TRUE(params_.SetTargetChannel("beta-channel", true, nullptr));
Jay Srinivasan1c0fe792013-03-28 16:45:25 -0700202 // The target channel should reflect the change, but the download channel
203 // should continue to retain the old value ...
204 EXPECT_EQ("beta-channel", params_.target_channel());
205 EXPECT_EQ("stable-channel", params_.download_channel());
206
207 // ... until we update the download channel explicitly.
208 params_.UpdateDownloadChannel();
209 EXPECT_EQ("beta-channel", params_.download_channel());
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700210 EXPECT_EQ("beta-channel", params_.target_channel());
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200211}
212
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700213TEST_F(OmahaRequestParamsTest, ChannelIndexTest) {
214 int canary = params_.GetChannelIndex("canary-channel");
215 int dev = params_.GetChannelIndex("dev-channel");
216 int beta = params_.GetChannelIndex("beta-channel");
217 int stable = params_.GetChannelIndex("stable-channel");
218 EXPECT_LE(canary, dev);
219 EXPECT_LE(dev, beta);
220 EXPECT_LE(beta, stable);
221
222 // testimage-channel or other names are not recognized, so index will be -1.
223 int testimage = params_.GetChannelIndex("testimage-channel");
224 int bogus = params_.GetChannelIndex("bogus-channel");
225 EXPECT_EQ(-1, testimage);
226 EXPECT_EQ(-1, bogus);
227}
228
229TEST_F(OmahaRequestParamsTest, ToMoreStableChannelFlagTest) {
Sen Jiang297e5832016-03-17 14:45:51 -0700230 params_.image_props_.current_channel = "canary-channel";
231 params_.download_channel_ = "stable-channel";
Sen Jiang8500d3a2018-02-08 12:04:05 -0800232 EXPECT_TRUE(params_.ToMoreStableChannel());
Sen Jiangce3f7cf2018-01-25 14:07:45 -0800233 params_.image_props_.current_channel = "stable-channel";
Sen Jiang8500d3a2018-02-08 12:04:05 -0800234 EXPECT_FALSE(params_.ToMoreStableChannel());
Sen Jiangce3f7cf2018-01-25 14:07:45 -0800235 params_.download_channel_ = "beta-channel";
Sen Jiang8500d3a2018-02-08 12:04:05 -0800236 EXPECT_FALSE(params_.ToMoreStableChannel());
237}
238
239TEST_F(OmahaRequestParamsTest, ShouldPowerwashTest) {
240 params_.mutable_image_props_.is_powerwash_allowed = false;
241 EXPECT_FALSE(params_.ShouldPowerwash());
242 params_.mutable_image_props_.is_powerwash_allowed = true;
243 params_.image_props_.allow_arbitrary_channels = true;
244 params_.image_props_.current_channel = "foo-channel";
245 params_.download_channel_ = "bar-channel";
246 EXPECT_TRUE(params_.ShouldPowerwash());
247 params_.image_props_.allow_arbitrary_channels = false;
248 params_.image_props_.current_channel = "canary-channel";
249 params_.download_channel_ = "stable-channel";
250 EXPECT_TRUE(params_.ShouldPowerwash());
Jay Srinivasandb0acdf2013-04-02 14:47:45 -0700251}
252
Chris Sosac1972482013-04-30 22:31:10 -0700253TEST_F(OmahaRequestParamsTest, CollectECFWVersionsTest) {
Sen Jiang297e5832016-03-17 14:45:51 -0700254 params_.hwid_ = string("STUMPY ALEX 12345");
255 EXPECT_FALSE(params_.CollectECFWVersions());
Chris Sosac1972482013-04-30 22:31:10 -0700256
Sen Jiang297e5832016-03-17 14:45:51 -0700257 params_.hwid_ = string("SNOW 12345");
258 EXPECT_TRUE(params_.CollectECFWVersions());
Chris Sosac1972482013-04-30 22:31:10 -0700259}
260
adlr@google.com3defe6a2009-12-04 20:57:17 +0000261} // namespace chromeos_update_engine