1ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler/*
2ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * Copyright (C) 2016 The Android Open Source Project
3ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler *
4ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * Licensed under the Apache License, Version 2.0 (the "License");
5ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * you may not use this file except in compliance with the License.
6ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * You may obtain a copy of the License at
7ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler *
8ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler *      http://www.apache.org/licenses/LICENSE-2.0
9ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler *
10ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * Unless required by applicable law or agreed to in writing, software
11ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * distributed under the License is distributed on an "AS IS" BASIS,
12ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * See the License for the specific language governing permissions and
14ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler * limitations under the License.
15ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler */
16ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
17ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler#include "fake_storage.h"
18ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
19ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler#include <nvram/messages/blob.h>
20ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler#include <nvram/messages/compiler.h>
21ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
22ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler#define countof(a) (sizeof(a) / sizeof((a)[0]))
23ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
24ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nisslernamespace nvram {
25ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nisslernamespace storage {
26ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
27ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nisslernamespace {
28ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
29ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nisslerclass StorageSlot {
30ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler public:
31ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  Status Load(Blob* blob) {
32625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    if (read_error_) {
33ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      return Status::kStorageError;
34ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    }
35ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
36ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    if (!present_) {
37ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      return Status::kNotFound;
38ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    }
39ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
40ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    NVRAM_CHECK(blob->Assign(blob_.data(), blob_.size()));
41ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    return Status::kSuccess;
42ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  }
43ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
44ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  Status Store(const Blob& blob) {
45625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    if (write_error_) {
46ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      return Status::kStorageError;
47ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    }
48ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
49ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    NVRAM_CHECK(blob_.Assign(blob.data(), blob.size()));
50ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    present_ = true;
51ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    return Status::kSuccess;
52ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  }
53ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
54625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  Status Delete() {
55625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    if (write_error_) {
56625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler      return Status::kStorageError;
57625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    }
58625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
59ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    NVRAM_CHECK(blob_.Resize(0));
60ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    present_ = false;
61625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    return Status::kSuccess;
62625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  }
63625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
64625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  void Clear() {
65625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    present_ = false;
66625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    read_error_ = false;
67625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    write_error_ = false;
68625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    NVRAM_CHECK(blob_.Resize(0));
69ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  }
70ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
71ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  bool present() const { return present_; }
72ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  void set_present(bool present) { present_ = present; }
73625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  void set_read_error(bool error) { read_error_ = error; }
74625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  void set_write_error(bool error) { write_error_ = error; }
75ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
76ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler private:
77ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  bool present_ = false;
78625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  bool read_error_ = false;
79625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  bool write_error_ = false;
80ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  Blob blob_;
81ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler};
82ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
83ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler// Header storage.
84ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStorageSlot g_header;
85ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
86ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler// Space blob storage.
87ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nisslerstruct SpaceStorageSlot {
88ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  uint32_t index;
89ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  StorageSlot slot;
90ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler};
91ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
92ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerSpaceStorageSlot g_spaces[256];
93ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
94ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler// Find the position in |g_spaces| corresponding to a given space |index|.
95ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler// Returns the slot pointer or |nullptr| if not found.
96ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStorageSlot* FindSlotForIndex(uint32_t index) {
97ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  for (size_t i = 0; i < countof(g_spaces); ++i) {
98ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    if (g_spaces[i].slot.present() && g_spaces[i].index == index) {
99ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      return &g_spaces[i].slot;
100ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    }
101ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  }
102ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
103ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  return nullptr;
104ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
105ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
106ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler// Finds or creates the slot for |index|. Returns the slot pointer or |nullptr|
107ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler// if not found.
108ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStorageSlot* FindOrCreateSlotForIndex(uint32_t index) {
109ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  StorageSlot* slot = FindSlotForIndex(index);
110ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  if (slot) {
111ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    return slot;
112ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  }
113ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
114ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
115ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  for (size_t i = 0; i < countof(g_spaces); ++i) {
116ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    if (!g_spaces[i].slot.present()) {
117ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      g_spaces[i].index = index;
118ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler      return &g_spaces[i].slot;
119ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    }
120ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  }
121ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
122ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  return nullptr;
123ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
124ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
125ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}  // namespace
126ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
127ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStatus LoadHeader(Blob* blob) {
128ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  return g_header.Load(blob);
129ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
130ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
131ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStatus StoreHeader(const Blob& blob) {
132ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  return g_header.Store(blob);
133ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
134ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
135625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nisslervoid SetHeaderReadError(bool error) {
136625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  g_header.set_read_error(error);
137625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
138625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
139625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nisslervoid SetHeaderWriteError(bool error) {
140625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  g_header.set_write_error(error);
141ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
142ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
143ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStatus LoadSpace(uint32_t index, Blob* blob) {
144ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  StorageSlot* slot = FindSlotForIndex(index);
145ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  return slot ? slot->Load(blob) : Status::kNotFound;
146ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
147ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
148ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStatus StoreSpace(uint32_t index, const Blob& blob) {
149ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  StorageSlot* slot = FindOrCreateSlotForIndex(index);
150ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  return slot ? slot->Store(blob) : Status::kStorageError;
151ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
152ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
153ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias NisslerStatus DeleteSpace(uint32_t index) {
154ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  StorageSlot* slot = FindSlotForIndex(index);
155625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  return slot ? slot->Delete() : Status::kNotFound;
156ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
157ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
158ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nisslervoid Clear() {
159ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  g_header.Clear();
160ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  for (size_t i = 0; i < countof(g_spaces); ++i) {
161ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler    g_spaces[i].slot.Clear();
162ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  }
163ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
164ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
165625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nisslervoid SetSpaceReadError(uint32_t index, bool error) {
166625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  StorageSlot* slot = FindOrCreateSlotForIndex(index);
167625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  if (slot) {
168625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    slot->set_read_error(error);
169625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler  }
170625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler}
171625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler
172625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nisslervoid SetSpaceWriteError(uint32_t index, bool error) {
173ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  StorageSlot* slot = FindOrCreateSlotForIndex(index);
174ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  if (slot) {
175625cbbe0b6f4a31079e889ac092456ac1893812bMattias Nissler    slot->set_write_error(error);
176ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler  }
177ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}
178ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler
179ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}  // namespace storage
180ad80c7ab75ab15826ba825b609c3e27af4449e86Mattias Nissler}  // namespace nvram
181