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