avs-device-sdk/CapabilitiesDelegate/test/Common/TestableMiscStorage.cpp

195 lines
5.8 KiB
C++

/*
* Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0/
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
#include "TestableMiscStorage.h"
namespace alexaClientSDK {
namespace capabilitiesDelegate {
namespace test {
/// Separator between keys
static const std::string DB_KEY_SEPARATOR = ",";
/// Component key
static const std::string DB_KEY_COMPONENT = "component:";
/// Table key
static const std::string DB_KEY_TABLE = "table:";
/**
* Gets the key that is actually used to store values in the DB.
*
* @param componentName The interface type.
* @param tableName The interface name.
* @param key The interface version.
* @return interfaceConfig The interface config as a json string.
*/
static std::string getInternalKey(
const std::string& componentName,
const std::string& tableName,
const std::string& key);
bool TestMiscStorage::createDatabase() {
return true;
}
bool TestMiscStorage::open() {
return true;
}
void TestMiscStorage::close() {
}
bool TestMiscStorage::createTable(
const std::string& componentName,
const std::string& tableName,
KeyType keyType,
ValueType valueType) {
return true;
}
bool TestMiscStorage::deleteTable(const std::string& componentName, const std::string& tableName) {
return clearTable(componentName, tableName);
}
bool TestMiscStorage::clearTable(const std::string& componentName, const std::string& tableName) {
std::string keyPrefix = DB_KEY_COMPONENT + componentName + DB_KEY_SEPARATOR + DB_KEY_TABLE + tableName;
size_t keyPrefixLength = keyPrefix.length();
for (auto iter = m_miscDB_stringKeyValue.begin(); iter != m_miscDB_stringKeyValue.end();) {
std::string mapEntryKey = iter->first;
// Increment iterator before erase to get next element.
iter++;
if (mapEntryKey.substr(0, keyPrefixLength) == keyPrefix) {
m_miscDB_stringKeyValue.erase(mapEntryKey);
}
}
return true;
}
bool TestMiscStorage::add(
const std::string& componentName,
const std::string& tableName,
const std::string& key,
const std::string& value) {
return put(componentName, tableName, key, value);
}
bool TestMiscStorage::update(
const std::string& componentName,
const std::string& tableName,
const std::string& key,
const std::string& value) {
return put(componentName, tableName, key, value);
}
bool TestMiscStorage::put(
const std::string& componentName,
const std::string& tableName,
const std::string& key,
const std::string& value) {
m_miscDB_stringKeyValue[getInternalKey(componentName, tableName, key)] = value;
return true;
}
bool TestMiscStorage::remove(const std::string& componentName, const std::string& tableName, const std::string& key) {
m_miscDB_stringKeyValue.erase(getInternalKey(componentName, tableName, key));
return true;
}
bool TestMiscStorage::tableEntryExists(
const std::string& componentName,
const std::string& tableName,
const std::string& key,
bool* tableEntryExistsValue) {
if (!tableEntryExistsValue) {
return false;
}
auto mapIterator = m_miscDB_stringKeyValue.find(getInternalKey(componentName, tableName, key));
if (mapIterator == m_miscDB_stringKeyValue.end()) {
*tableEntryExistsValue = false;
} else {
*tableEntryExistsValue = true;
}
return true;
}
bool TestMiscStorage::tableExists(
const std::string& componentName,
const std::string& tableName,
bool* tableExistsValue) {
if (!tableExistsValue) {
return false;
}
*tableExistsValue = true;
return true;
}
bool TestMiscStorage::load(
const std::string& componentName,
const std::string& tableName,
std::unordered_map<std::string, std::string>* valueContainer) {
if (!valueContainer) {
return false;
}
std::string keyPrefix = DB_KEY_COMPONENT + componentName + DB_KEY_SEPARATOR + DB_KEY_TABLE + tableName;
size_t keyPrefixLength = keyPrefix.length();
for (auto mapEntry : m_miscDB_stringKeyValue) {
std::string mapEntryKey = mapEntry.first;
if (mapEntryKey.substr(0, keyPrefixLength) == keyPrefix) {
valueContainer->insert(mapEntry);
}
}
return true;
}
bool TestMiscStorage::get(
const std::string& componentName,
const std::string& tableName,
const std::string& key,
std::string* value) {
auto mapIterator = m_miscDB_stringKeyValue.find(getInternalKey(componentName, tableName, key));
if (mapIterator == m_miscDB_stringKeyValue.end()) {
return false;
}
*value = mapIterator->second;
return true;
}
bool TestMiscStorage::dataExists(const std::string& componentName, const std::string& tableName) {
std::string keyPrefix = DB_KEY_COMPONENT + componentName + DB_KEY_SEPARATOR + DB_KEY_TABLE + tableName;
size_t keyPrefixLength = keyPrefix.length();
for (auto mapEntry : m_miscDB_stringKeyValue) {
std::string mapEntryKey = mapEntry.first;
if (mapEntryKey.substr(0, keyPrefixLength) == keyPrefix) {
return true;
}
}
return false;
}
std::string getInternalKey(const std::string& componentName, const std::string& tableName, const std::string& key) {
return DB_KEY_COMPONENT + componentName + DB_KEY_SEPARATOR + DB_KEY_TABLE + tableName + DB_KEY_SEPARATOR + key;
}
} // namespace test
} // namespace capabilitiesDelegate
} // namespace alexaClientSDK