1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2011 The Android Open Source Project
3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License");
5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License.
6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at
7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//      http://www.apache.org/licenses/LICENSE-2.0
9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software
11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS,
12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and
14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License.
15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
163defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.com
178427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo#include "update_engine/omaha_request_params.h"
188427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo
193defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.com#include <stdio.h>
20fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov
213defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.com#include <string>
22fbb40098314ab45efa60667ad7ccae354c4f18daDarin Petkov
238427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo#include <base/files/file_util.h>
24297e583af1cec04f5f332b57b91f846921744c91Sen Jiang#include <base/files/scoped_temp_dir.h>
258427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo#include <gtest/gtest.h>
268427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo
2739910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/constants.h"
28297e583af1cec04f5f332b57b91f846921744c91Sen Jiang#include "update_engine/common/fake_prefs.h"
2939910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/platform_constants.h"
3039910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/test_utils.h"
3139910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/utils.h"
325bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold#include "update_engine/fake_system_state.h"
333defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.com
3410875d90cf67f883ba7c9ed13bc8d706aa8c6fbcAlex Deymousing chromeos_update_engine::test_utils::WriteFileString;
353defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.comusing std::string;
363defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.com
373defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.comnamespace chromeos_update_engine {
383defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.com
39ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasanclass OmahaRequestParamsTest : public ::testing::Test {
40ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan public:
415bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  OmahaRequestParamsTest() : params_(&fake_system_state_) {}
42ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan
435a7f565a542196f24eb87ddac96508f8a84e3329Darin Petkov protected:
44610277efc6f7e5239158dfa4bb3b1021804326e0Alex Deymo  void SetUp() override {
45c9abbec864f283d1873883bc8f9b523020ee2acbGilad Arnold    // Create a uniquely named test directory.
46297e583af1cec04f5f332b57b91f846921744c91Sen Jiang    ASSERT_TRUE(tempdir_.CreateUniqueTempDir());
47ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan    // Create a fresh copy of the params for each test, so there's no
48ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan    // unintended reuse of state across tests.
49297e583af1cec04f5f332b57b91f846921744c91Sen Jiang    params_ = OmahaRequestParams(&fake_system_state_);
502b9d2417722cd4052b0e22494886f93c5b4ef042Hidehiko Abe    params_.set_root(tempdir_.GetPath().value());
51856166594771c61973856f563e622ccb7dd48aa1Alex Deymo    SetLockDown(false);
52297e583af1cec04f5f332b57b91f846921744c91Sen Jiang    fake_system_state_.set_prefs(&fake_prefs_);
53856166594771c61973856f563e622ccb7dd48aa1Alex Deymo  }
54856166594771c61973856f563e622ccb7dd48aa1Alex Deymo
55856166594771c61973856f563e622ccb7dd48aa1Alex Deymo  void SetLockDown(bool locked_down) {
56856166594771c61973856f563e622ccb7dd48aa1Alex Deymo    fake_system_state_.fake_hardware()->SetIsOfficialBuild(locked_down);
57856166594771c61973856f563e622ccb7dd48aa1Alex Deymo    fake_system_state_.fake_hardware()->SetIsNormalBootMode(locked_down);
585a7f565a542196f24eb87ddac96508f8a84e3329Darin Petkov  }
595a7f565a542196f24eb87ddac96508f8a84e3329Darin Petkov
60ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  OmahaRequestParams params_;
615bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  FakeSystemState fake_system_state_;
62297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  FakePrefs fake_prefs_;
6349d91329a3a84d7e2b35f6e1ffc8a9b4d478515bDarin Petkov
64297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  base::ScopedTempDir tempdir_;
653defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.com};
663defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.com
673defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.comnamespace {
683defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.comstring GetMachineType() {
6919a45f0eda0917b7788b925b501e774208474fdeGilad Arnold  string machine_type;
7019a45f0eda0917b7788b925b501e774208474fdeGilad Arnold  if (!utils::ReadPipe("uname -m", &machine_type))
713defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.com    return "";
7219a45f0eda0917b7788b925b501e774208474fdeGilad Arnold  // Strip anything from the first newline char.
7319a45f0eda0917b7788b925b501e774208474fdeGilad Arnold  size_t newline_pos = machine_type.find('\n');
7419a45f0eda0917b7788b925b501e774208474fdeGilad Arnold  if (newline_pos != string::npos)
7519a45f0eda0917b7788b925b501e774208474fdeGilad Arnold    machine_type.erase(newline_pos);
7619a45f0eda0917b7788b925b501e774208474fdeGilad Arnold  return machine_type;
773defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.com}
78d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko}  // namespace
793defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.com
80ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST_F(OmahaRequestParamsTest, MissingChannelTest) {
81297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_TRUE(params_.Init("", "", false));
82856166594771c61973856f563e622ccb7dd48aa1Alex Deymo  // By default, if no channel is set, we should track the stable-channel.
83297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_EQ("stable-channel", params_.target_channel());
845a7f565a542196f24eb87ddac96508f8a84e3329Darin Petkov}
855a7f565a542196f24eb87ddac96508f8a84e3329Darin Petkov
86ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST_F(OmahaRequestParamsTest, ForceVersionTest) {
87297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_TRUE(params_.Init("ForcedVersion", "", false));
88297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_EQ(string("ForcedVersion_") + GetMachineType(), params_.os_sp());
89297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_EQ("ForcedVersion", params_.app_version());
905a7f565a542196f24eb87ddac96508f8a84e3329Darin Petkov}
915a7f565a542196f24eb87ddac96508f8a84e3329Darin Petkov
92ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST_F(OmahaRequestParamsTest, ForcedURLTest) {
93297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_TRUE(params_.Init("", "http://forced.google.com", false));
94297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_EQ("http://forced.google.com", params_.update_url());
955a7f565a542196f24eb87ddac96508f8a84e3329Darin Petkov}
965a7f565a542196f24eb87ddac96508f8a84e3329Darin Petkov
97ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST_F(OmahaRequestParamsTest, MissingURLTest) {
98297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_TRUE(params_.Init("", "", false));
99297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_EQ(constants::kOmahaDefaultProductionURL, params_.update_url());
1003f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes}
1013f0303aa211e2de2d466cef063ff6f39fffe32ddAndrew de los Reyes
102297e583af1cec04f5f332b57b91f846921744c91Sen JiangTEST_F(OmahaRequestParamsTest, DeltaOKTest) {
103297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_TRUE(params_.Init("", "", false));
104297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_TRUE(params_.delta_okay());
10510d02dd60d4c4f41f7f4ed92322fa7b597760118Darin Petkov}
10610d02dd60d4c4f41f7f4ed92322fa7b597760118Darin Petkov
107297e583af1cec04f5f332b57b91f846921744c91Sen JiangTEST_F(OmahaRequestParamsTest, NoDeltasTest) {
1082b9d2417722cd4052b0e22494886f93c5b4ef042Hidehiko Abe  ASSERT_TRUE(
1092b9d2417722cd4052b0e22494886f93c5b4ef042Hidehiko Abe      WriteFileString(tempdir_.GetPath().Append(".nodelta").value(), ""));
110297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_TRUE(params_.Init("", "", false));
111297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_FALSE(params_.delta_okay());
112a3df55badfc7dc25792aba1ca6e7ade582b566a7Darin Petkov}
113a3df55badfc7dc25792aba1ca6e7ade582b566a7Darin Petkov
114ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST_F(OmahaRequestParamsTest, SetTargetChannelTest) {
11549d91329a3a84d7e2b35f6e1ffc8a9b4d478515bDarin Petkov  {
1165bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    OmahaRequestParams params(&fake_system_state_);
1172b9d2417722cd4052b0e22494886f93c5b4ef042Hidehiko Abe    params.set_root(tempdir_.GetPath().value());
118ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan    EXPECT_TRUE(params.Init("", "", false));
119297e583af1cec04f5f332b57b91f846921744c91Sen Jiang    EXPECT_TRUE(params.SetTargetChannel("canary-channel", false, nullptr));
1208500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang    EXPECT_FALSE(params.mutable_image_props_.is_powerwash_allowed);
12149d91329a3a84d7e2b35f6e1ffc8a9b4d478515bDarin Petkov  }
1222b9d2417722cd4052b0e22494886f93c5b4ef042Hidehiko Abe  params_.set_root(tempdir_.GetPath().value());
123297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_TRUE(params_.Init("", "", false));
124297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_EQ("canary-channel", params_.target_channel());
1258500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  EXPECT_FALSE(params_.mutable_image_props_.is_powerwash_allowed);
12649d91329a3a84d7e2b35f6e1ffc8a9b4d478515bDarin Petkov}
12749d91329a3a84d7e2b35f6e1ffc8a9b4d478515bDarin Petkov
128ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST_F(OmahaRequestParamsTest, SetIsPowerwashAllowedTest) {
12949d91329a3a84d7e2b35f6e1ffc8a9b4d478515bDarin Petkov  {
1305bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    OmahaRequestParams params(&fake_system_state_);
1312b9d2417722cd4052b0e22494886f93c5b4ef042Hidehiko Abe    params.set_root(tempdir_.GetPath().value());
132ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan    EXPECT_TRUE(params.Init("", "", false));
133297e583af1cec04f5f332b57b91f846921744c91Sen Jiang    EXPECT_TRUE(params.SetTargetChannel("canary-channel", true, nullptr));
1348500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang    EXPECT_TRUE(params.mutable_image_props_.is_powerwash_allowed);
13549d91329a3a84d7e2b35f6e1ffc8a9b4d478515bDarin Petkov  }
1362b9d2417722cd4052b0e22494886f93c5b4ef042Hidehiko Abe  params_.set_root(tempdir_.GetPath().value());
137297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_TRUE(params_.Init("", "", false));
138297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_EQ("canary-channel", params_.target_channel());
1398500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  EXPECT_TRUE(params_.mutable_image_props_.is_powerwash_allowed);
14049d91329a3a84d7e2b35f6e1ffc8a9b4d478515bDarin Petkov}
14149d91329a3a84d7e2b35f6e1ffc8a9b4d478515bDarin Petkov
142ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST_F(OmahaRequestParamsTest, SetTargetChannelInvalidTest) {
14349d91329a3a84d7e2b35f6e1ffc8a9b4d478515bDarin Petkov  {
1445bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    OmahaRequestParams params(&fake_system_state_);
1452b9d2417722cd4052b0e22494886f93c5b4ef042Hidehiko Abe    params.set_root(tempdir_.GetPath().value());
146856166594771c61973856f563e622ccb7dd48aa1Alex Deymo    SetLockDown(true);
147ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan    EXPECT_TRUE(params.Init("", "", false));
1487f785f584d943308b06596f8d279e9c4b711adb6Sen Jiang    params.image_props_.allow_arbitrary_channels = false;
149d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo    string error_message;
150d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo    EXPECT_FALSE(
151d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo        params.SetTargetChannel("dogfood-channel", true, &error_message));
152d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo    // The error message should include a message about the valid channels.
153d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo    EXPECT_NE(string::npos, error_message.find("stable-channel"));
1548500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang    EXPECT_FALSE(params.mutable_image_props_.is_powerwash_allowed);
15549d91329a3a84d7e2b35f6e1ffc8a9b4d478515bDarin Petkov  }
1562b9d2417722cd4052b0e22494886f93c5b4ef042Hidehiko Abe  params_.set_root(tempdir_.GetPath().value());
157297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_TRUE(params_.Init("", "", false));
158297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_EQ("stable-channel", params_.target_channel());
1598500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  EXPECT_FALSE(params_.mutable_image_props_.is_powerwash_allowed);
16049d91329a3a84d7e2b35f6e1ffc8a9b4d478515bDarin Petkov}
16149d91329a3a84d7e2b35f6e1ffc8a9b4d478515bDarin Petkov
162ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST_F(OmahaRequestParamsTest, IsValidChannelTest) {
163ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_TRUE(params_.IsValidChannel("canary-channel"));
164ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_TRUE(params_.IsValidChannel("stable-channel"));
165ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_TRUE(params_.IsValidChannel("beta-channel"));
166ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_TRUE(params_.IsValidChannel("dev-channel"));
167ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_FALSE(params_.IsValidChannel("testimage-channel"));
168ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_FALSE(params_.IsValidChannel("dogfood-channel"));
169ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_FALSE(params_.IsValidChannel("some-channel"));
170ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_FALSE(params_.IsValidChannel(""));
1717f785f584d943308b06596f8d279e9c4b711adb6Sen Jiang  params_.image_props_.allow_arbitrary_channels = true;
1727f785f584d943308b06596f8d279e9c4b711adb6Sen Jiang  EXPECT_TRUE(params_.IsValidChannel("some-channel"));
173ce3f7cf69f3a03a5371beecae003651fa7f953a3Sen Jiang  EXPECT_FALSE(params_.IsValidChannel("wrong-suffix"));
174ce3f7cf69f3a03a5371beecae003651fa7f953a3Sen Jiang  EXPECT_FALSE(params_.IsValidChannel(""));
17549d91329a3a84d7e2b35f6e1ffc8a9b4d478515bDarin Petkov}
17649d91329a3a84d7e2b35f6e1ffc8a9b4d478515bDarin Petkov
177ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST_F(OmahaRequestParamsTest, SetTargetChannelWorks) {
178297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  params_.set_target_channel("dev-channel");
179ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("dev-channel", params_.target_channel());
180ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan
181297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  // When an invalid value is set, it should be ignored.
182d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo  EXPECT_FALSE(params_.SetTargetChannel("invalid-channel", false, nullptr));
183ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("dev-channel", params_.target_channel());
184ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan
185ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  // When set to a valid value, it should take effect.
186d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo  EXPECT_TRUE(params_.SetTargetChannel("beta-channel", true, nullptr));
187ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("beta-channel", params_.target_channel());
188ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan
189ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  // When set to the same value, it should be idempotent.
190d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo  EXPECT_TRUE(params_.SetTargetChannel("beta-channel", true, nullptr));
191ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("beta-channel", params_.target_channel());
192ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan
193ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  // When set to a valid value while a change is already pending, it should
1941c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan  // succeed.
195d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo  EXPECT_TRUE(params_.SetTargetChannel("stable-channel", true, nullptr));
1961c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan  EXPECT_EQ("stable-channel", params_.target_channel());
1971c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan
198297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  // Set a different channel in mutable_image_props_.
199297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  params_.set_target_channel("stable-channel");
2001c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan
2011c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan  // When set to a valid value while a change is already pending, it should
2021c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan  // succeed.
2031c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan  params_.Init("", "", false);
204d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo  EXPECT_TRUE(params_.SetTargetChannel("beta-channel", true, nullptr));
2051c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan  // The target channel should reflect the change, but the download channel
2061c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan  // should continue to retain the old value ...
2071c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan  EXPECT_EQ("beta-channel", params_.target_channel());
2081c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan  EXPECT_EQ("stable-channel", params_.download_channel());
2091c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan
2101c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan  // ... until we update the download channel explicitly.
2111c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan  params_.UpdateDownloadChannel();
2121c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan  EXPECT_EQ("beta-channel", params_.download_channel());
213ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ("beta-channel", params_.target_channel());
214ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan}
2157fbbe8a9e57ec52f7bc597d0cb607036300ac54cPatrick Dubroy
216ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST_F(OmahaRequestParamsTest, ChannelIndexTest) {
217ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  int canary = params_.GetChannelIndex("canary-channel");
218ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  int dev = params_.GetChannelIndex("dev-channel");
219ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  int beta = params_.GetChannelIndex("beta-channel");
220ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  int stable = params_.GetChannelIndex("stable-channel");
221ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_LE(canary, dev);
222ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_LE(dev, beta);
223ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_LE(beta, stable);
224ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan
225ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  // testimage-channel or other names are not recognized, so index will be -1.
226ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  int testimage = params_.GetChannelIndex("testimage-channel");
227ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  int bogus = params_.GetChannelIndex("bogus-channel");
228ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ(-1, testimage);
229ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ(-1, bogus);
230ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan}
2317fbbe8a9e57ec52f7bc597d0cb607036300ac54cPatrick Dubroy
232ae4697c073b84b260990a141acd53c6806da0708Jay SrinivasanTEST_F(OmahaRequestParamsTest, ToMoreStableChannelFlagTest) {
233297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  params_.image_props_.current_channel = "canary-channel";
234297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  params_.download_channel_ = "stable-channel";
2358500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  EXPECT_TRUE(params_.ToMoreStableChannel());
236ce3f7cf69f3a03a5371beecae003651fa7f953a3Sen Jiang  params_.image_props_.current_channel = "stable-channel";
2378500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  EXPECT_FALSE(params_.ToMoreStableChannel());
238ce3f7cf69f3a03a5371beecae003651fa7f953a3Sen Jiang  params_.download_channel_ = "beta-channel";
2398500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  EXPECT_FALSE(params_.ToMoreStableChannel());
2408500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang}
2418500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang
2428500d3a0b3e3944d7390e0eff6e9d39f92261085Sen JiangTEST_F(OmahaRequestParamsTest, ShouldPowerwashTest) {
2438500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  params_.mutable_image_props_.is_powerwash_allowed = false;
2448500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  EXPECT_FALSE(params_.ShouldPowerwash());
2458500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  params_.mutable_image_props_.is_powerwash_allowed = true;
2468500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  params_.image_props_.allow_arbitrary_channels = true;
2478500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  params_.image_props_.current_channel = "foo-channel";
2488500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  params_.download_channel_ = "bar-channel";
2498500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  EXPECT_TRUE(params_.ShouldPowerwash());
2508500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  params_.image_props_.allow_arbitrary_channels = false;
2518500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  params_.image_props_.current_channel = "canary-channel";
2528500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  params_.download_channel_ = "stable-channel";
2538500d3a0b3e3944d7390e0eff6e9d39f92261085Sen Jiang  EXPECT_TRUE(params_.ShouldPowerwash());
254db0acdfca1ea33987e8b29325f4594417d1fae57Jay Srinivasan}
255db0acdfca1ea33987e8b29325f4594417d1fae57Jay Srinivasan
256297e583af1cec04f5f332b57b91f846921744c91Sen JiangTEST_F(OmahaRequestParamsTest, CollectECFWVersionsTest) {
257297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  params_.hwid_ = string("STUMPY ALEX 12345");
258297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_FALSE(params_.CollectECFWVersions());
259db0acdfca1ea33987e8b29325f4594417d1fae57Jay Srinivasan
260297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  params_.hwid_ = string("SNOW 12345");
261297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_TRUE(params_.CollectECFWVersions());
262db0acdfca1ea33987e8b29325f4594417d1fae57Jay Srinivasan
263297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  params_.hwid_ = string("SAMS ALEX 12345");
264297e583af1cec04f5f332b57b91f846921744c91Sen Jiang  EXPECT_TRUE(params_.CollectECFWVersions());
265c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa}
266c1972483fa3446852b42ce97d1ea43b9caaaf56fChris Sosa
2673defe6acb3609e70e851a6eff062577d25a2af9dadlr@google.com}  // namespace chromeos_update_engine
268