1cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// 2cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// Copyright (C) 2015 The Android Open Source Project 3cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// 4cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// Licensed under the Apache License, Version 2.0 (the "License"); 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// you may not use this file except in compliance with the License. 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// You may obtain a copy of the License at 7cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// 8cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// http://www.apache.org/licenses/LICENSE-2.0 9cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// 10cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// Unless required by applicable law or agreed to in writing, software 11cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// distributed under the License is distributed on an "AS IS" BASIS, 12cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// See the License for the specific language governing permissions and 14cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// limitations under the License. 15cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// 16cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant 17cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant#ifndef UPDATE_ENGINE_COMMON_FAKE_BOOT_CONTROL_H_ 186dfff1c9b9147641601574c953e208ece17f27d8Marshall Clow#define UPDATE_ENGINE_COMMON_FAKE_BOOT_CONTROL_H_ 19cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant 20cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant#include <map> 21cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant#include <string> 22cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant#include <vector> 23cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant 24cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant#include <base/time/time.h> 25cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant 26cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant#include "update_engine/common/boot_control_interface.h" 27cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant 28cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnantnamespace chromeos_update_engine { 29cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant 30cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant// Implements a fake bootloader control interface used for testing. 31cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnantclass FakeBootControl : public BootControlInterface { 32cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant public: 33cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant FakeBootControl() { 34cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant SetNumSlots(num_slots_); 35cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant // The current slot should be bootable. 36cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant is_bootable_[current_slot_] = true; 37cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant } 38cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant 39cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant // BootControlInterface overrides. 40cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant unsigned int GetNumSlots() const override { return num_slots_; } 41cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant BootControlInterface::Slot GetCurrentSlot() const override { 42cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant return current_slot_; 43cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant } 44cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant 45cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant bool GetPartitionDevice(const std::string& partition_name, 46cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant BootControlInterface::Slot slot, 47cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant std::string* device) const override { 48cd85b9ee137e179cf38d935fc500e12521ccd3d2Howard Hinnant 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 57 bool IsSlotBootable(BootControlInterface::Slot slot) const override { 58 return slot < num_slots_ && is_bootable_[slot]; 59 } 60 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 68 bool SetActiveBootSlot(Slot slot) override { return true; } 69 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 77 // Setters 78 void SetNumSlots(unsigned int num_slots) { 79 num_slots_ = num_slots; 80 is_bootable_.resize(num_slots_, false); 81 devices_.resize(num_slots_); 82 } 83 84 void SetCurrentSlot(BootControlInterface::Slot slot) { 85 current_slot_ = slot; 86 } 87 88 void SetPartitionDevice(const std::string& partition_name, 89 BootControlInterface::Slot slot, 90 const std::string& device) { 91 DCHECK(slot < num_slots_); 92 devices_[slot][partition_name] = device; 93 } 94 95 void SetSlotBootable(BootControlInterface::Slot slot, bool bootable) { 96 DCHECK(slot < num_slots_); 97 is_bootable_[slot] = bootable; 98 } 99 100 private: 101 BootControlInterface::Slot num_slots_{2}; 102 BootControlInterface::Slot current_slot_{0}; 103 104 std::vector<bool> is_bootable_; 105 std::vector<std::map<std::string, std::string>> devices_; 106 107 DISALLOW_COPY_AND_ASSIGN(FakeBootControl); 108}; 109 110} // namespace chromeos_update_engine 111 112#endif // UPDATE_ENGINE_COMMON_FAKE_BOOT_CONTROL_H_ 113