1*5a923131SAndroid Build Coastguard Worker // 2*5a923131SAndroid Build Coastguard Worker // Copyright (C) 2013 The Android Open Source Project 3*5a923131SAndroid Build Coastguard Worker // 4*5a923131SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 5*5a923131SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 6*5a923131SAndroid Build Coastguard Worker // You may obtain a copy of the License at 7*5a923131SAndroid Build Coastguard Worker // 8*5a923131SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0 9*5a923131SAndroid Build Coastguard Worker // 10*5a923131SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 11*5a923131SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 12*5a923131SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*5a923131SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 14*5a923131SAndroid Build Coastguard Worker // limitations under the License. 15*5a923131SAndroid Build Coastguard Worker // 16*5a923131SAndroid Build Coastguard Worker 17*5a923131SAndroid Build Coastguard Worker #ifndef UPDATE_ENGINE_COMMON_FAKE_HARDWARE_H_ 18*5a923131SAndroid Build Coastguard Worker #define UPDATE_ENGINE_COMMON_FAKE_HARDWARE_H_ 19*5a923131SAndroid Build Coastguard Worker 20*5a923131SAndroid Build Coastguard Worker #include <map> 21*5a923131SAndroid Build Coastguard Worker #include <string> 22*5a923131SAndroid Build Coastguard Worker #include <utility> 23*5a923131SAndroid Build Coastguard Worker 24*5a923131SAndroid Build Coastguard Worker #include <base/time/time.h> 25*5a923131SAndroid Build Coastguard Worker 26*5a923131SAndroid Build Coastguard Worker #include "update_engine/common/error_code.h" 27*5a923131SAndroid Build Coastguard Worker #include "update_engine/common/hardware_interface.h" 28*5a923131SAndroid Build Coastguard Worker #include "update_engine/common/utils.h" 29*5a923131SAndroid Build Coastguard Worker 30*5a923131SAndroid Build Coastguard Worker namespace chromeos_update_engine { 31*5a923131SAndroid Build Coastguard Worker 32*5a923131SAndroid Build Coastguard Worker // Implements a fake hardware interface used for testing. 33*5a923131SAndroid Build Coastguard Worker class FakeHardware : public HardwareInterface { 34*5a923131SAndroid Build Coastguard Worker public: 35*5a923131SAndroid Build Coastguard Worker // Value used to signal that the powerwash_count file is not present. When 36*5a923131SAndroid Build Coastguard Worker // this value is used in SetPowerwashCount(), GetPowerwashCount() will return 37*5a923131SAndroid Build Coastguard Worker // false. 38*5a923131SAndroid Build Coastguard Worker static const int kPowerwashCountNotSet = -1; 39*5a923131SAndroid Build Coastguard Worker 40*5a923131SAndroid Build Coastguard Worker // Default value for crossystem tpm_kernver. 41*5a923131SAndroid Build Coastguard Worker static const int kMinKernelKeyVersion = 3; 42*5a923131SAndroid Build Coastguard Worker 43*5a923131SAndroid Build Coastguard Worker // Default value for crossystem tpm_fwver. 44*5a923131SAndroid Build Coastguard Worker static const int kMinFirmwareKeyVersion = 13; 45*5a923131SAndroid Build Coastguard Worker 46*5a923131SAndroid Build Coastguard Worker // Default value for crossystem kernel_max_rollforward. This value is the 47*5a923131SAndroid Build Coastguard Worker // default for consumer devices and effectively means "unlimited rollforward 48*5a923131SAndroid Build Coastguard Worker // is allowed", which is the same as the behavior prior to implementing 49*5a923131SAndroid Build Coastguard Worker // roll forward prevention. 50*5a923131SAndroid Build Coastguard Worker static const int kKernelMaxRollforward = 0xfffffffe; 51*5a923131SAndroid Build Coastguard Worker 52*5a923131SAndroid Build Coastguard Worker // Default value for crossystem firmware_max_rollforward. This value is the 53*5a923131SAndroid Build Coastguard Worker // default for consumer devices and effectively means "unlimited rollforward 54*5a923131SAndroid Build Coastguard Worker // is allowed", which is the same as the behavior prior to implementing 55*5a923131SAndroid Build Coastguard Worker // roll forward prevention. 56*5a923131SAndroid Build Coastguard Worker static const int kFirmwareMaxRollforward = 0xfffffffe; 57*5a923131SAndroid Build Coastguard Worker 58*5a923131SAndroid Build Coastguard Worker FakeHardware() = default; 59*5a923131SAndroid Build Coastguard Worker 60*5a923131SAndroid Build Coastguard Worker // HardwareInterface methods. IsOfficialBuild()61*5a923131SAndroid Build Coastguard Worker bool IsOfficialBuild() const override { return is_official_build_; } 62*5a923131SAndroid Build Coastguard Worker IsNormalBootMode()63*5a923131SAndroid Build Coastguard Worker bool IsNormalBootMode() const override { return is_normal_boot_mode_; } 64*5a923131SAndroid Build Coastguard Worker AreDevFeaturesEnabled()65*5a923131SAndroid Build Coastguard Worker bool AreDevFeaturesEnabled() const override { 66*5a923131SAndroid Build Coastguard Worker return are_dev_features_enabled_; 67*5a923131SAndroid Build Coastguard Worker } 68*5a923131SAndroid Build Coastguard Worker IsOOBEEnabled()69*5a923131SAndroid Build Coastguard Worker bool IsOOBEEnabled() const override { return is_oobe_enabled_; } 70*5a923131SAndroid Build Coastguard Worker IsOOBEComplete(base::Time * out_time_of_oobe)71*5a923131SAndroid Build Coastguard Worker bool IsOOBEComplete(base::Time* out_time_of_oobe) const override { 72*5a923131SAndroid Build Coastguard Worker if (out_time_of_oobe != nullptr) 73*5a923131SAndroid Build Coastguard Worker *out_time_of_oobe = oobe_timestamp_; 74*5a923131SAndroid Build Coastguard Worker return is_oobe_complete_; 75*5a923131SAndroid Build Coastguard Worker } 76*5a923131SAndroid Build Coastguard Worker GetHardwareClass()77*5a923131SAndroid Build Coastguard Worker std::string GetHardwareClass() const override { return hardware_class_; } 78*5a923131SAndroid Build Coastguard Worker GetDeviceRequisition()79*5a923131SAndroid Build Coastguard Worker std::string GetDeviceRequisition() const override { 80*5a923131SAndroid Build Coastguard Worker return device_requisition_; 81*5a923131SAndroid Build Coastguard Worker } 82*5a923131SAndroid Build Coastguard Worker GetMinKernelKeyVersion()83*5a923131SAndroid Build Coastguard Worker int GetMinKernelKeyVersion() const override { 84*5a923131SAndroid Build Coastguard Worker return min_kernel_key_version_; 85*5a923131SAndroid Build Coastguard Worker } 86*5a923131SAndroid Build Coastguard Worker GetMinFirmwareKeyVersion()87*5a923131SAndroid Build Coastguard Worker int GetMinFirmwareKeyVersion() const override { 88*5a923131SAndroid Build Coastguard Worker return min_firmware_key_version_; 89*5a923131SAndroid Build Coastguard Worker } 90*5a923131SAndroid Build Coastguard Worker GetMaxFirmwareKeyRollforward()91*5a923131SAndroid Build Coastguard Worker int GetMaxFirmwareKeyRollforward() const override { 92*5a923131SAndroid Build Coastguard Worker return firmware_max_rollforward_; 93*5a923131SAndroid Build Coastguard Worker } 94*5a923131SAndroid Build Coastguard Worker SetMaxFirmwareKeyRollforward(int firmware_max_rollforward)95*5a923131SAndroid Build Coastguard Worker bool SetMaxFirmwareKeyRollforward(int firmware_max_rollforward) override { 96*5a923131SAndroid Build Coastguard Worker if (GetMaxFirmwareKeyRollforward() == -1) 97*5a923131SAndroid Build Coastguard Worker return false; 98*5a923131SAndroid Build Coastguard Worker 99*5a923131SAndroid Build Coastguard Worker firmware_max_rollforward_ = firmware_max_rollforward; 100*5a923131SAndroid Build Coastguard Worker return true; 101*5a923131SAndroid Build Coastguard Worker } 102*5a923131SAndroid Build Coastguard Worker SetMaxKernelKeyRollforward(int kernel_max_rollforward)103*5a923131SAndroid Build Coastguard Worker bool SetMaxKernelKeyRollforward(int kernel_max_rollforward) override { 104*5a923131SAndroid Build Coastguard Worker kernel_max_rollforward_ = kernel_max_rollforward; 105*5a923131SAndroid Build Coastguard Worker return true; 106*5a923131SAndroid Build Coastguard Worker } 107*5a923131SAndroid Build Coastguard Worker GetPowerwashCount()108*5a923131SAndroid Build Coastguard Worker int GetPowerwashCount() const override { return powerwash_count_; } 109*5a923131SAndroid Build Coastguard Worker SchedulePowerwash()110*5a923131SAndroid Build Coastguard Worker bool SchedulePowerwash() override { 111*5a923131SAndroid Build Coastguard Worker powerwash_scheduled_ = true; 112*5a923131SAndroid Build Coastguard Worker return true; 113*5a923131SAndroid Build Coastguard Worker } 114*5a923131SAndroid Build Coastguard Worker CancelPowerwash()115*5a923131SAndroid Build Coastguard Worker bool CancelPowerwash() override { 116*5a923131SAndroid Build Coastguard Worker powerwash_scheduled_ = false; 117*5a923131SAndroid Build Coastguard Worker return true; 118*5a923131SAndroid Build Coastguard Worker } 119*5a923131SAndroid Build Coastguard Worker IsPowerwashScheduled()120*5a923131SAndroid Build Coastguard Worker bool IsPowerwashScheduled() { return powerwash_scheduled_; } 121*5a923131SAndroid Build Coastguard Worker GetNonVolatileDirectory(base::FilePath * path)122*5a923131SAndroid Build Coastguard Worker bool GetNonVolatileDirectory(base::FilePath* path) const override { 123*5a923131SAndroid Build Coastguard Worker return false; 124*5a923131SAndroid Build Coastguard Worker } 125*5a923131SAndroid Build Coastguard Worker GetPowerwashSafeDirectory(base::FilePath * path)126*5a923131SAndroid Build Coastguard Worker bool GetPowerwashSafeDirectory(base::FilePath* path) const override { 127*5a923131SAndroid Build Coastguard Worker return false; 128*5a923131SAndroid Build Coastguard Worker } 129*5a923131SAndroid Build Coastguard Worker GetBuildTimestamp()130*5a923131SAndroid Build Coastguard Worker int64_t GetBuildTimestamp() const override { return build_timestamp_; } 131*5a923131SAndroid Build Coastguard Worker AllowDowngrade()132*5a923131SAndroid Build Coastguard Worker bool AllowDowngrade() const override { return false; } 133*5a923131SAndroid Build Coastguard Worker GetFirstActiveOmahaPingSent()134*5a923131SAndroid Build Coastguard Worker bool GetFirstActiveOmahaPingSent() const override { 135*5a923131SAndroid Build Coastguard Worker return first_active_omaha_ping_sent_; 136*5a923131SAndroid Build Coastguard Worker } 137*5a923131SAndroid Build Coastguard Worker SetFirstActiveOmahaPingSent()138*5a923131SAndroid Build Coastguard Worker bool SetFirstActiveOmahaPingSent() override { 139*5a923131SAndroid Build Coastguard Worker first_active_omaha_ping_sent_ = true; 140*5a923131SAndroid Build Coastguard Worker return true; 141*5a923131SAndroid Build Coastguard Worker } 142*5a923131SAndroid Build Coastguard Worker 143*5a923131SAndroid Build Coastguard Worker // Setters SetIsOfficialBuild(bool is_official_build)144*5a923131SAndroid Build Coastguard Worker void SetIsOfficialBuild(bool is_official_build) { 145*5a923131SAndroid Build Coastguard Worker is_official_build_ = is_official_build; 146*5a923131SAndroid Build Coastguard Worker } 147*5a923131SAndroid Build Coastguard Worker SetIsNormalBootMode(bool is_normal_boot_mode)148*5a923131SAndroid Build Coastguard Worker void SetIsNormalBootMode(bool is_normal_boot_mode) { 149*5a923131SAndroid Build Coastguard Worker is_normal_boot_mode_ = is_normal_boot_mode; 150*5a923131SAndroid Build Coastguard Worker } 151*5a923131SAndroid Build Coastguard Worker SetAreDevFeaturesEnabled(bool are_dev_features_enabled)152*5a923131SAndroid Build Coastguard Worker void SetAreDevFeaturesEnabled(bool are_dev_features_enabled) { 153*5a923131SAndroid Build Coastguard Worker are_dev_features_enabled_ = are_dev_features_enabled; 154*5a923131SAndroid Build Coastguard Worker } 155*5a923131SAndroid Build Coastguard Worker 156*5a923131SAndroid Build Coastguard Worker // Sets the SetIsOOBEEnabled to |is_oobe_enabled|. SetIsOOBEEnabled(bool is_oobe_enabled)157*5a923131SAndroid Build Coastguard Worker void SetIsOOBEEnabled(bool is_oobe_enabled) { 158*5a923131SAndroid Build Coastguard Worker is_oobe_enabled_ = is_oobe_enabled; 159*5a923131SAndroid Build Coastguard Worker } 160*5a923131SAndroid Build Coastguard Worker 161*5a923131SAndroid Build Coastguard Worker // Sets the IsOOBEComplete to True with the given timestamp. SetIsOOBEComplete(base::Time oobe_timestamp)162*5a923131SAndroid Build Coastguard Worker void SetIsOOBEComplete(base::Time oobe_timestamp) { 163*5a923131SAndroid Build Coastguard Worker is_oobe_complete_ = true; 164*5a923131SAndroid Build Coastguard Worker oobe_timestamp_ = oobe_timestamp; 165*5a923131SAndroid Build Coastguard Worker } 166*5a923131SAndroid Build Coastguard Worker UnsetIsOOBEComplete()167*5a923131SAndroid Build Coastguard Worker void UnsetIsOOBEComplete() { is_oobe_complete_ = false; } 168*5a923131SAndroid Build Coastguard Worker SetHardwareClass(const std::string & hardware_class)169*5a923131SAndroid Build Coastguard Worker void SetHardwareClass(const std::string& hardware_class) { 170*5a923131SAndroid Build Coastguard Worker hardware_class_ = hardware_class; 171*5a923131SAndroid Build Coastguard Worker } 172*5a923131SAndroid Build Coastguard Worker SetDeviceRequisition(const std::string & requisition)173*5a923131SAndroid Build Coastguard Worker void SetDeviceRequisition(const std::string& requisition) { 174*5a923131SAndroid Build Coastguard Worker device_requisition_ = requisition; 175*5a923131SAndroid Build Coastguard Worker } 176*5a923131SAndroid Build Coastguard Worker SetMinKernelKeyVersion(int min_kernel_key_version)177*5a923131SAndroid Build Coastguard Worker void SetMinKernelKeyVersion(int min_kernel_key_version) { 178*5a923131SAndroid Build Coastguard Worker min_kernel_key_version_ = min_kernel_key_version; 179*5a923131SAndroid Build Coastguard Worker } 180*5a923131SAndroid Build Coastguard Worker SetMinFirmwareKeyVersion(int min_firmware_key_version)181*5a923131SAndroid Build Coastguard Worker void SetMinFirmwareKeyVersion(int min_firmware_key_version) { 182*5a923131SAndroid Build Coastguard Worker min_firmware_key_version_ = min_firmware_key_version; 183*5a923131SAndroid Build Coastguard Worker } 184*5a923131SAndroid Build Coastguard Worker SetPowerwashCount(int powerwash_count)185*5a923131SAndroid Build Coastguard Worker void SetPowerwashCount(int powerwash_count) { 186*5a923131SAndroid Build Coastguard Worker powerwash_count_ = powerwash_count; 187*5a923131SAndroid Build Coastguard Worker } 188*5a923131SAndroid Build Coastguard Worker SetBuildTimestamp(int64_t build_timestamp)189*5a923131SAndroid Build Coastguard Worker void SetBuildTimestamp(int64_t build_timestamp) { 190*5a923131SAndroid Build Coastguard Worker build_timestamp_ = build_timestamp; 191*5a923131SAndroid Build Coastguard Worker } 192*5a923131SAndroid Build Coastguard Worker SetWarmReset(bool warm_reset)193*5a923131SAndroid Build Coastguard Worker void SetWarmReset(bool warm_reset) override { warm_reset_ = warm_reset; } 194*5a923131SAndroid Build Coastguard Worker SetVbmetaDigestForInactiveSlot(bool reset)195*5a923131SAndroid Build Coastguard Worker void SetVbmetaDigestForInactiveSlot(bool reset) override {} 196*5a923131SAndroid Build Coastguard Worker 197*5a923131SAndroid Build Coastguard Worker // Getters to verify state. GetMaxKernelKeyRollforward()198*5a923131SAndroid Build Coastguard Worker int GetMaxKernelKeyRollforward() const { return kernel_max_rollforward_; } 199*5a923131SAndroid Build Coastguard Worker GetIsRollbackPowerwashScheduled()200*5a923131SAndroid Build Coastguard Worker bool GetIsRollbackPowerwashScheduled() const { 201*5a923131SAndroid Build Coastguard Worker return powerwash_scheduled_ && save_rollback_data_; 202*5a923131SAndroid Build Coastguard Worker } GetVersionForLogging(const std::string & partition_name)203*5a923131SAndroid Build Coastguard Worker std::string GetVersionForLogging( 204*5a923131SAndroid Build Coastguard Worker const std::string& partition_name) const override { 205*5a923131SAndroid Build Coastguard Worker return partition_timestamps_[partition_name]; 206*5a923131SAndroid Build Coastguard Worker } SetVersion(const std::string & partition_name,std::string timestamp)207*5a923131SAndroid Build Coastguard Worker void SetVersion(const std::string& partition_name, std::string timestamp) { 208*5a923131SAndroid Build Coastguard Worker partition_timestamps_[partition_name] = std::move(timestamp); 209*5a923131SAndroid Build Coastguard Worker } IsPartitionUpdateValid(const std::string & partition_name,const std::string & new_version)210*5a923131SAndroid Build Coastguard Worker ErrorCode IsPartitionUpdateValid( 211*5a923131SAndroid Build Coastguard Worker const std::string& partition_name, 212*5a923131SAndroid Build Coastguard Worker const std::string& new_version) const override { 213*5a923131SAndroid Build Coastguard Worker const auto old_version = GetVersionForLogging(partition_name); 214*5a923131SAndroid Build Coastguard Worker return utils::IsTimestampNewer(old_version, new_version); 215*5a923131SAndroid Build Coastguard Worker } 216*5a923131SAndroid Build Coastguard Worker GetPartitionMountOptions(const std::string & partition_name)217*5a923131SAndroid Build Coastguard Worker const char* GetPartitionMountOptions( 218*5a923131SAndroid Build Coastguard Worker const std::string& partition_name) const override { 219*5a923131SAndroid Build Coastguard Worker #ifdef __ANDROID__ 220*5a923131SAndroid Build Coastguard Worker // TODO(allight): This matches the declaration in hardware_android.cc but 221*5a923131SAndroid Build Coastguard Worker // ideally shouldn't be duplicated. 222*5a923131SAndroid Build Coastguard Worker return "defcontext=u:object_r:postinstall_file:s0"; 223*5a923131SAndroid Build Coastguard Worker #else 224*5a923131SAndroid Build Coastguard Worker return ""; 225*5a923131SAndroid Build Coastguard Worker #endif 226*5a923131SAndroid Build Coastguard Worker } 227*5a923131SAndroid Build Coastguard Worker 228*5a923131SAndroid Build Coastguard Worker private: 229*5a923131SAndroid Build Coastguard Worker bool is_official_build_{true}; 230*5a923131SAndroid Build Coastguard Worker bool is_normal_boot_mode_{true}; 231*5a923131SAndroid Build Coastguard Worker bool are_dev_features_enabled_{false}; 232*5a923131SAndroid Build Coastguard Worker bool is_oobe_enabled_{true}; 233*5a923131SAndroid Build Coastguard Worker bool is_oobe_complete_{true}; 234*5a923131SAndroid Build Coastguard Worker // Jan 20, 2007 235*5a923131SAndroid Build Coastguard Worker base::Time oobe_timestamp_{base::Time::FromTimeT(1169280000)}; 236*5a923131SAndroid Build Coastguard Worker std::string hardware_class_{"Fake HWID BLAH-1234"}; 237*5a923131SAndroid Build Coastguard Worker std::string device_requisition_{"fake_requisition"}; 238*5a923131SAndroid Build Coastguard Worker int min_kernel_key_version_{kMinKernelKeyVersion}; 239*5a923131SAndroid Build Coastguard Worker int min_firmware_key_version_{kMinFirmwareKeyVersion}; 240*5a923131SAndroid Build Coastguard Worker int kernel_max_rollforward_{kKernelMaxRollforward}; 241*5a923131SAndroid Build Coastguard Worker int firmware_max_rollforward_{kFirmwareMaxRollforward}; 242*5a923131SAndroid Build Coastguard Worker int powerwash_count_{kPowerwashCountNotSet}; 243*5a923131SAndroid Build Coastguard Worker bool powerwash_scheduled_{false}; 244*5a923131SAndroid Build Coastguard Worker bool save_rollback_data_{false}; 245*5a923131SAndroid Build Coastguard Worker int64_t build_timestamp_{0}; 246*5a923131SAndroid Build Coastguard Worker bool first_active_omaha_ping_sent_{false}; 247*5a923131SAndroid Build Coastguard Worker bool warm_reset_{false}; 248*5a923131SAndroid Build Coastguard Worker mutable std::map<std::string, std::string> partition_timestamps_; 249*5a923131SAndroid Build Coastguard Worker 250*5a923131SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(FakeHardware); 251*5a923131SAndroid Build Coastguard Worker }; 252*5a923131SAndroid Build Coastguard Worker 253*5a923131SAndroid Build Coastguard Worker } // namespace chromeos_update_engine 254*5a923131SAndroid Build Coastguard Worker 255*5a923131SAndroid Build Coastguard Worker #endif // UPDATE_ENGINE_COMMON_FAKE_HARDWARE_H_ 256