• 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 
77   // Setters
SetNumSlots(unsigned int num_slots)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 
SetCurrentSlot(BootControlInterface::Slot slot)84   void SetCurrentSlot(BootControlInterface::Slot slot) {
85     current_slot_ = slot;
86   }
87 
SetPartitionDevice(const std::string & partition_name,BootControlInterface::Slot slot,const std::string & device)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 
SetSlotBootable(BootControlInterface::Slot slot,bool bootable)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