1297e583af1cec04f5f332b57b91f846921744c91Sen Jiang// 2297e583af1cec04f5f332b57b91f846921744c91Sen Jiang// Copyright (C) 2016 The Android Open Source Project 3297e583af1cec04f5f332b57b91f846921744c91Sen Jiang// 4297e583af1cec04f5f332b57b91f846921744c91Sen Jiang// Licensed under the Apache License, Version 2.0 (the "License"); 5297e583af1cec04f5f332b57b91f846921744c91Sen Jiang// you may not use this file except in compliance with the License. 6297e583af1cec04f5f332b57b91f846921744c91Sen Jiang// You may obtain a copy of the License at 7297e583af1cec04f5f332b57b91f846921744c91Sen Jiang// 8297e583af1cec04f5f332b57b91f846921744c91Sen Jiang// http://www.apache.org/licenses/LICENSE-2.0 9297e583af1cec04f5f332b57b91f846921744c91Sen Jiang// 10297e583af1cec04f5f332b57b91f846921744c91Sen Jiang// Unless required by applicable law or agreed to in writing, software 11297e583af1cec04f5f332b57b91f846921744c91Sen Jiang// distributed under the License is distributed on an "AS IS" BASIS, 12297e583af1cec04f5f332b57b91f846921744c91Sen Jiang// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13297e583af1cec04f5f332b57b91f846921744c91Sen Jiang// See the License for the specific language governing permissions and 14297e583af1cec04f5f332b57b91f846921744c91Sen Jiang// limitations under the License. 15297e583af1cec04f5f332b57b91f846921744c91Sen Jiang// 16297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 17297e583af1cec04f5f332b57b91f846921744c91Sen Jiang#include "update_engine/image_properties.h" 18297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 19297e583af1cec04f5f332b57b91f846921744c91Sen Jiang#include <string> 20297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 21297e583af1cec04f5f332b57b91f846921744c91Sen Jiang#include <base/files/file_util.h> 22297e583af1cec04f5f332b57b91f846921744c91Sen Jiang#include <base/files/scoped_temp_dir.h> 23297e583af1cec04f5f332b57b91f846921744c91Sen Jiang#include <gtest/gtest.h> 24297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 25297e583af1cec04f5f332b57b91f846921744c91Sen Jiang#include "update_engine/common/constants.h" 26297e583af1cec04f5f332b57b91f846921744c91Sen Jiang#include "update_engine/common/test_utils.h" 27297e583af1cec04f5f332b57b91f846921744c91Sen Jiang#include "update_engine/fake_system_state.h" 28297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 29297e583af1cec04f5f332b57b91f846921744c91Sen Jiangusing chromeos_update_engine::test_utils::WriteFileString; 30297e583af1cec04f5f332b57b91f846921744c91Sen Jiangusing std::string; 31297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 32297e583af1cec04f5f332b57b91f846921744c91Sen Jiangnamespace chromeos_update_engine { 33297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 34297e583af1cec04f5f332b57b91f846921744c91Sen Jiangclass ImagePropertiesTest : public ::testing::Test { 35297e583af1cec04f5f332b57b91f846921744c91Sen Jiang protected: 36297e583af1cec04f5f332b57b91f846921744c91Sen Jiang void SetUp() override { 37297e583af1cec04f5f332b57b91f846921744c91Sen Jiang // Create a uniquely named test directory. 38297e583af1cec04f5f332b57b91f846921744c91Sen Jiang ASSERT_TRUE(tempdir_.CreateUniqueTempDir()); 39a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli EXPECT_TRUE(base::CreateDirectory(tempdir_.GetPath().Append("etc"))); 40a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli EXPECT_TRUE(base::CreateDirectory(base::FilePath( 41a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli tempdir_.GetPath().value() + kStatefulPartition + "/etc"))); 42a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli test::SetImagePropertiesRootPrefix(tempdir_.GetPath().value().c_str()); 43297e583af1cec04f5f332b57b91f846921744c91Sen Jiang SetLockDown(false); 44297e583af1cec04f5f332b57b91f846921744c91Sen Jiang } 45297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 46297e583af1cec04f5f332b57b91f846921744c91Sen Jiang void SetLockDown(bool locked_down) { 47297e583af1cec04f5f332b57b91f846921744c91Sen Jiang fake_system_state_.fake_hardware()->SetIsOfficialBuild(locked_down); 48297e583af1cec04f5f332b57b91f846921744c91Sen Jiang fake_system_state_.fake_hardware()->SetIsNormalBootMode(locked_down); 49297e583af1cec04f5f332b57b91f846921744c91Sen Jiang } 50297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 51297e583af1cec04f5f332b57b91f846921744c91Sen Jiang FakeSystemState fake_system_state_; 52297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 53297e583af1cec04f5f332b57b91f846921744c91Sen Jiang base::ScopedTempDir tempdir_; 54297e583af1cec04f5f332b57b91f846921744c91Sen Jiang}; 55297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 56297e583af1cec04f5f332b57b91f846921744c91Sen JiangTEST_F(ImagePropertiesTest, SimpleTest) { 57a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli ASSERT_TRUE( 58a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli WriteFileString(tempdir_.GetPath().Append("etc/lsb-release").value(), 59a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_BOARD=arm-generic\n" 60a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_FOO=bar\n" 61a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_VERSION=0.2.2.3\n" 62a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_TRACK=dev-channel\n" 63a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_AUSERVER=http://www.google.com")); 64297e583af1cec04f5f332b57b91f846921744c91Sen Jiang ImageProperties props = LoadImageProperties(&fake_system_state_); 65297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("arm-generic", props.board); 66297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("{87efface-864d-49a5-9bb3-4b050a7c227a}", props.product_id); 67297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("0.2.2.3", props.version); 68297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("dev-channel", props.current_channel); 69297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("http://www.google.com", props.omaha_url); 70297e583af1cec04f5f332b57b91f846921744c91Sen Jiang} 71297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 72297e583af1cec04f5f332b57b91f846921744c91Sen JiangTEST_F(ImagePropertiesTest, AppIDTest) { 73297e583af1cec04f5f332b57b91f846921744c91Sen Jiang ASSERT_TRUE(WriteFileString( 74a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli tempdir_.GetPath().Append("etc/lsb-release").value(), 75297e583af1cec04f5f332b57b91f846921744c91Sen Jiang "CHROMEOS_RELEASE_APPID={58c35cef-9d30-476e-9098-ce20377d535d}")); 76297e583af1cec04f5f332b57b91f846921744c91Sen Jiang ImageProperties props = LoadImageProperties(&fake_system_state_); 77297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("{58c35cef-9d30-476e-9098-ce20377d535d}", props.product_id); 78297e583af1cec04f5f332b57b91f846921744c91Sen Jiang} 79297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 80297e583af1cec04f5f332b57b91f846921744c91Sen JiangTEST_F(ImagePropertiesTest, ConfusingReleaseTest) { 81297e583af1cec04f5f332b57b91f846921744c91Sen Jiang ASSERT_TRUE( 82a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli WriteFileString(tempdir_.GetPath().Append("etc/lsb-release").value(), 83297e583af1cec04f5f332b57b91f846921744c91Sen Jiang "CHROMEOS_RELEASE_FOO=CHROMEOS_RELEASE_VERSION=1.2.3.4\n" 84297e583af1cec04f5f332b57b91f846921744c91Sen Jiang "CHROMEOS_RELEASE_VERSION=0.2.2.3")); 85297e583af1cec04f5f332b57b91f846921744c91Sen Jiang ImageProperties props = LoadImageProperties(&fake_system_state_); 86297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("0.2.2.3", props.version); 87297e583af1cec04f5f332b57b91f846921744c91Sen Jiang} 88297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 89297e583af1cec04f5f332b57b91f846921744c91Sen JiangTEST_F(ImagePropertiesTest, MissingVersionTest) { 90297e583af1cec04f5f332b57b91f846921744c91Sen Jiang ImageProperties props = LoadImageProperties(&fake_system_state_); 91297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("", props.version); 92297e583af1cec04f5f332b57b91f846921744c91Sen Jiang} 93297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 94297e583af1cec04f5f332b57b91f846921744c91Sen JiangTEST_F(ImagePropertiesTest, OverrideTest) { 95a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli ASSERT_TRUE( 96a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli WriteFileString(tempdir_.GetPath().Append("etc/lsb-release").value(), 97a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_BOARD=arm-generic\n" 98a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_FOO=bar\n" 99a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_TRACK=dev-channel\n" 100a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_AUSERVER=http://www.google.com")); 101297e583af1cec04f5f332b57b91f846921744c91Sen Jiang ASSERT_TRUE(WriteFileString( 102a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli tempdir_.GetPath().value() + kStatefulPartition + "/etc/lsb-release", 103297e583af1cec04f5f332b57b91f846921744c91Sen Jiang "CHROMEOS_RELEASE_BOARD=x86-generic\n" 104297e583af1cec04f5f332b57b91f846921744c91Sen Jiang "CHROMEOS_RELEASE_TRACK=beta-channel\n" 105297e583af1cec04f5f332b57b91f846921744c91Sen Jiang "CHROMEOS_AUSERVER=https://www.google.com")); 106297e583af1cec04f5f332b57b91f846921744c91Sen Jiang ImageProperties props = LoadImageProperties(&fake_system_state_); 107297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("x86-generic", props.board); 108297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("dev-channel", props.current_channel); 109297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("https://www.google.com", props.omaha_url); 110297e583af1cec04f5f332b57b91f846921744c91Sen Jiang MutableImageProperties mutable_props = 111297e583af1cec04f5f332b57b91f846921744c91Sen Jiang LoadMutableImageProperties(&fake_system_state_); 112297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("beta-channel", mutable_props.target_channel); 113297e583af1cec04f5f332b57b91f846921744c91Sen Jiang} 114297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 115297e583af1cec04f5f332b57b91f846921744c91Sen JiangTEST_F(ImagePropertiesTest, OverrideLockDownTest) { 116a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli ASSERT_TRUE( 117a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli WriteFileString(tempdir_.GetPath().Append("etc/lsb-release").value(), 118a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_BOARD=arm-generic\n" 119a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_FOO=bar\n" 120a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_TRACK=dev-channel\n" 121a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_AUSERVER=https://www.google.com")); 122297e583af1cec04f5f332b57b91f846921744c91Sen Jiang ASSERT_TRUE(WriteFileString( 123a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli tempdir_.GetPath().value() + kStatefulPartition + "/etc/lsb-release", 124297e583af1cec04f5f332b57b91f846921744c91Sen Jiang "CHROMEOS_RELEASE_BOARD=x86-generic\n" 125297e583af1cec04f5f332b57b91f846921744c91Sen Jiang "CHROMEOS_RELEASE_TRACK=stable-channel\n" 126297e583af1cec04f5f332b57b91f846921744c91Sen Jiang "CHROMEOS_AUSERVER=http://www.google.com")); 127297e583af1cec04f5f332b57b91f846921744c91Sen Jiang SetLockDown(true); 128297e583af1cec04f5f332b57b91f846921744c91Sen Jiang ImageProperties props = LoadImageProperties(&fake_system_state_); 129297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("arm-generic", props.board); 130297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("dev-channel", props.current_channel); 131297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("https://www.google.com", props.omaha_url); 132297e583af1cec04f5f332b57b91f846921744c91Sen Jiang MutableImageProperties mutable_props = 133297e583af1cec04f5f332b57b91f846921744c91Sen Jiang LoadMutableImageProperties(&fake_system_state_); 134297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("stable-channel", mutable_props.target_channel); 135297e583af1cec04f5f332b57b91f846921744c91Sen Jiang} 136297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 137297e583af1cec04f5f332b57b91f846921744c91Sen JiangTEST_F(ImagePropertiesTest, BoardAppIdUsedForNonCanaryChannelTest) { 138a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli ASSERT_TRUE( 139a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli WriteFileString(tempdir_.GetPath().Append("etc/lsb-release").value(), 140a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_APPID=r\n" 141a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_BOARD_APPID=b\n" 142a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_CANARY_APPID=c\n" 143a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_TRACK=stable-channel\n")); 144297e583af1cec04f5f332b57b91f846921744c91Sen Jiang ImageProperties props = LoadImageProperties(&fake_system_state_); 145297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("stable-channel", props.current_channel); 146297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("b", props.product_id); 147297e583af1cec04f5f332b57b91f846921744c91Sen Jiang} 148297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 149297e583af1cec04f5f332b57b91f846921744c91Sen JiangTEST_F(ImagePropertiesTest, CanaryAppIdUsedForCanaryChannelTest) { 150a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli ASSERT_TRUE( 151a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli WriteFileString(tempdir_.GetPath().Append("etc/lsb-release").value(), 152a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_APPID=r\n" 153a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_BOARD_APPID=b\n" 154a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_CANARY_APPID=c\n" 155a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_TRACK=canary-channel\n")); 156297e583af1cec04f5f332b57b91f846921744c91Sen Jiang ImageProperties props = LoadImageProperties(&fake_system_state_); 157297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("canary-channel", props.current_channel); 158297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("c", props.canary_product_id); 159297e583af1cec04f5f332b57b91f846921744c91Sen Jiang} 160297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 161297e583af1cec04f5f332b57b91f846921744c91Sen JiangTEST_F(ImagePropertiesTest, ReleaseAppIdUsedAsDefaultTest) { 162a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli ASSERT_TRUE( 163a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli WriteFileString(tempdir_.GetPath().Append("etc/lsb-release").value(), 164a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_APPID=r\n" 165a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_CANARY_APPID=c\n" 166a78ddf883fe270dfd44ca030dd79eebf4ce22179Jay Civelli "CHROMEOS_RELEASE_TRACK=stable-channel\n")); 167297e583af1cec04f5f332b57b91f846921744c91Sen Jiang ImageProperties props = LoadImageProperties(&fake_system_state_); 168297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("stable-channel", props.current_channel); 169297e583af1cec04f5f332b57b91f846921744c91Sen Jiang EXPECT_EQ("r", props.product_id); 170297e583af1cec04f5f332b57b91f846921744c91Sen Jiang} 171297e583af1cec04f5f332b57b91f846921744c91Sen Jiang 172297e583af1cec04f5f332b57b91f846921744c91Sen Jiang} // namespace chromeos_update_engine 173