1 // 2 // Copyright (C) 2015 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_BOOT_CONTROL_H_ 18 #define UPDATE_ENGINE_COMMON_FAKE_BOOT_CONTROL_H_ 19 20 #include <map> 21 #include <string> 22 #include <vector> 23 24 #include <base/time/time.h> 25 26 #include "update_engine/common/boot_control_interface.h" 27 28 namespace chromeos_update_engine { 29 30 // Implements a fake bootloader control interface used for testing. 31 class FakeBootControl : public BootControlInterface { 32 public: FakeBootControl()33 FakeBootControl() { 34 SetNumSlots(num_slots_); 35 // The current slot should be bootable. 36 is_bootable_[current_slot_] = true; 37 } 38 39 // BootControlInterface overrides. GetNumSlots()40 unsigned int GetNumSlots() const override { return num_slots_; } GetCurrentSlot()41 BootControlInterface::Slot GetCurrentSlot() const override { 42 return current_slot_; 43 } 44 GetPartitionDevice(const std::string & partition_name,BootControlInterface::Slot slot,std::string * device)45 bool GetPartitionDevice(const std::string& partition_name, 46 BootControlInterface::Slot slot, 47 std::string* device) const override { 48 if (slot >= num_slots_) 49 return false; 50 auto part_it = devices_[slot].find(partition_name); 51 if (part_it == devices_[slot].end()) 52 return false; 53 *device = part_it->second; 54 return true; 55 } 56 IsSlotBootable(BootControlInterface::Slot slot)57 bool IsSlotBootable(BootControlInterface::Slot slot) const override { 58 return slot < num_slots_ && is_bootable_[slot]; 59 } 60 MarkSlotUnbootable(BootControlInterface::Slot slot)61 bool MarkSlotUnbootable(BootControlInterface::Slot slot) override { 62 if (slot >= num_slots_) 63 return false; 64 is_bootable_[slot] = false; 65 return true; 66 } 67 SetActiveBootSlot(Slot slot)68 bool SetActiveBootSlot(Slot slot) override { return true; } 69 MarkBootSuccessfulAsync(base::Callback<void (bool)> callback)70 bool MarkBootSuccessfulAsync(base::Callback<void(bool)> callback) override { 71 // We run the callback directly from here to avoid having to setup a message 72 // loop in the test environment. 73 callback.Run(true); 74 return true; 75 } 76 InitPartitionMetadata(Slot slot,const PartitionMetadata & partition_metadata,bool update_metadata)77 bool InitPartitionMetadata(Slot slot, 78 const PartitionMetadata& partition_metadata, 79 bool update_metadata) override { 80 return true; 81 } 82 Cleanup()83 void Cleanup() override {} 84 85 // Setters SetNumSlots(unsigned int num_slots)86 void SetNumSlots(unsigned int num_slots) { 87 num_slots_ = num_slots; 88 is_bootable_.resize(num_slots_, false); 89 devices_.resize(num_slots_); 90 } 91 SetCurrentSlot(BootControlInterface::Slot slot)92 void SetCurrentSlot(BootControlInterface::Slot slot) { current_slot_ = slot; } 93 SetPartitionDevice(const std::string & partition_name,BootControlInterface::Slot slot,const std::string & device)94 void SetPartitionDevice(const std::string& partition_name, 95 BootControlInterface::Slot slot, 96 const std::string& device) { 97 DCHECK(slot < num_slots_); 98 devices_[slot][partition_name] = device; 99 } 100 SetSlotBootable(BootControlInterface::Slot slot,bool bootable)101 void SetSlotBootable(BootControlInterface::Slot slot, bool bootable) { 102 DCHECK(slot < num_slots_); 103 is_bootable_[slot] = bootable; 104 } 105 106 private: 107 BootControlInterface::Slot num_slots_{2}; 108 BootControlInterface::Slot current_slot_{0}; 109 110 std::vector<bool> is_bootable_; 111 std::vector<std::map<std::string, std::string>> devices_; 112 113 DISALLOW_COPY_AND_ASSIGN(FakeBootControl); 114 }; 115 116 } // namespace chromeos_update_engine 117 118 #endif // UPDATE_ENGINE_COMMON_FAKE_BOOT_CONTROL_H_ 119