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