• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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