blob: 8126960a97aecdcdb505e27bcb3098402283548f [file] [log] [blame]
// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <brillo/blkdev_utils/device_mapper_fake.h>
#include <memory>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>
namespace brillo {
namespace fake {
namespace {
// Stub DmTask runs into a map for easy reference.
bool StubDmRunTask(DmTask* task, bool udev_sync) {
std::string dev_name = task->name;
std::string params;
int type = task->type;
static auto& dm_target_map_ =
*new std::unordered_map<std::string, std::vector<DmTarget>>();
switch (type) {
case DM_DEVICE_CREATE:
CHECK_EQ(udev_sync, true);
if (dm_target_map_.find(dev_name) != dm_target_map_.end())
return false;
dm_target_map_.insert(std::make_pair(dev_name, task->targets));
break;
case DM_DEVICE_REMOVE:
CHECK_EQ(udev_sync, true);
if (dm_target_map_.find(dev_name) == dm_target_map_.end())
return false;
dm_target_map_.erase(dev_name);
break;
case DM_DEVICE_TABLE:
CHECK_EQ(udev_sync, false);
if (dm_target_map_.find(dev_name) == dm_target_map_.end())
return false;
task->targets = dm_target_map_[dev_name];
break;
case DM_DEVICE_RELOAD:
CHECK_EQ(udev_sync, false);
if (dm_target_map_.find(dev_name) == dm_target_map_.end())
return false;
dm_target_map_.erase(dev_name);
dm_target_map_.insert(std::make_pair(dev_name, task->targets));
break;
default:
return false;
}
return true;
}
std::unique_ptr<DmTask> DmTaskCreate(int type) {
auto t = std::make_unique<DmTask>();
t->type = type;
return t;
}
} // namespace
FakeDevmapperTask::FakeDevmapperTask(int type) : task_(DmTaskCreate(type)) {}
bool FakeDevmapperTask::SetName(const std::string& name) {
task_->name = std::string(name);
return true;
}
bool FakeDevmapperTask::AddTarget(uint64_t start,
uint64_t sectors,
const std::string& type,
const SecureBlob& parameters) {
DmTarget dmt;
dmt.start = start;
dmt.size = sectors;
dmt.type = type;
dmt.parameters = parameters;
task_->targets.push_back(dmt);
return true;
}
bool FakeDevmapperTask::GetNextTarget(uint64_t* start,
uint64_t* sectors,
std::string* type,
SecureBlob* parameters) {
if (task_->targets.empty())
return false;
DmTarget dmt = task_->targets[0];
*start = dmt.start;
*sectors = dmt.size;
*type = dmt.type;
*parameters = dmt.parameters;
task_->targets.erase(task_->targets.begin());
return !task_->targets.empty();
}
bool FakeDevmapperTask::Run(bool udev_sync) {
return StubDmRunTask(task_.get(), udev_sync);
}
std::unique_ptr<DevmapperTask> CreateDevmapperTask(int type) {
return std::make_unique<FakeDevmapperTask>(type);
}
} // namespace fake
} // namespace brillo