add Devices.GetStateValues

Fixes #65
This commit is contained in:
Michael Zanetti 2014-12-13 16:59:39 +01:00 committed by Michael Zanetti
parent f32a362ebc
commit 213b28ea83
4 changed files with 143 additions and 39 deletions

View File

@ -159,7 +159,6 @@ bool Device::hasState(const StateTypeId &stateTypeId) const
QVariant Device::stateValue(const StateTypeId &stateTypeId) const
{
foreach (const State &state, m_states) {
qDebug() << "checking" << stateTypeId << state.stateTypeId();
if (state.stateTypeId() == stateTypeId) {
return state.value();
}

View File

@ -187,6 +187,19 @@ DeviceHandler::DeviceHandler(QObject *parent) :
returns.insert("o:value", JsonTypes::basicTypeToString(JsonTypes::Variant));
setReturns("GetStateValue", returns);
params.clear(); returns.clear();
setDescription("GetStateValues", "Get all the state values of the give device.");
params.insert("deviceId", JsonTypes::basicTypeToString(JsonTypes::Uuid));
setParams("GetStateValues", params);
returns.insert("deviceError", JsonTypes::deviceErrorRef());
states.clear();
QVariantMap state;
state.insert("stateTypeId", JsonTypes::basicTypeToString(JsonTypes::Uuid));
state.insert("value", JsonTypes::basicTypeToString(JsonTypes::Variant));
states.append(state);
returns.insert("o:values", states);
setReturns("GetStateValues", returns);
// Notifications
params.clear(); returns.clear();
setDescription("StateChanged", "Emitted whenever a State of a device changes.");
@ -464,6 +477,33 @@ JsonReply* DeviceHandler::GetStateValue(const QVariantMap &params) const
return createReply(returns);
}
JsonReply *DeviceHandler::GetStateValues(const QVariantMap &params) const
{
QVariantMap returns;
Device *device = GuhCore::instance()->findConfiguredDevice(DeviceId(params.value("deviceId").toString()));
if (!device) {
returns.insert("deviceError", JsonTypes::deviceErrorToString(DeviceManager::DeviceErrorDeviceNotFound));
return createReply(returns);
}
DeviceClass deviceClass = GuhCore::instance()->findDeviceClass(device->deviceClassId());
if (!deviceClass.isValid()) {
returns.insert("deviceError", JsonTypes::deviceErrorToString(DeviceManager::DeviceErrorDeviceClassNotFound));
return createReply(returns);
}
QVariantList values;
foreach (const StateType &stateType, deviceClass.stateTypes()) {
QVariantMap stateValue;
stateValue.insert("stateTypeId", stateType.id().toString());
stateValue.insert("value", device->stateValue(stateType.id()));
values.append(stateValue);
}
returns.insert("deviceError", JsonTypes::deviceErrorToString(DeviceManager::DeviceErrorNoError));
returns.insert("values", values);
return createReply(returns);
}
void DeviceHandler::deviceStateChanged(Device *device, const QUuid &stateTypeId, const QVariant &value)
{
QVariantMap params;

View File

@ -60,6 +60,8 @@ public:
Q_INVOKABLE JsonReply* GetStateValue(const QVariantMap &params) const;
Q_INVOKABLE JsonReply* GetStateValues(const QVariantMap &params) const;
signals:
void StateChanged(const QVariantMap &params);

View File

@ -47,9 +47,6 @@ private slots:
void getConfiguredDevices();
void removeDevice_data();
void removeDevice();
void storedDevices();
void discoverDevices_data();
@ -63,6 +60,17 @@ private slots:
void getStateTypes_data();
void getStateTypes();
void getStateValue_data();
void getStateValue();
void getStateValues_data();
void getStateValues();
// Keep this the last one! It'll remove the configured mock device
void removeDevice_data();
void removeDevice();
};
void TestDevices::getPlugins()
@ -269,41 +277,6 @@ void TestDevices::getConfiguredDevices()
QCOMPARE(devices.count(), 2); // There should be one auto created mock device and the one created in initTestcase()
}
void TestDevices::removeDevice_data()
{
QTest::addColumn<DeviceId>("deviceId");
QTest::addColumn<DeviceManager::DeviceError>("deviceError");
QTest::newRow("Existing Device") << m_mockDeviceId << DeviceManager::DeviceErrorNoError;
QTest::newRow("Not existing Device") << DeviceId::createDeviceId() << DeviceManager::DeviceErrorDeviceNotFound;
}
void TestDevices::removeDevice()
{
QFETCH(DeviceId, deviceId);
QFETCH(DeviceManager::DeviceError, deviceError);
QSettings settings(m_deviceSettings);
settings.beginGroup("DeviceConfig");
if (deviceError == DeviceManager::DeviceErrorNoError) {
settings.beginGroup(m_mockDeviceId.toString());
// Make sure we have some config values for this device
QVERIFY(settings.allKeys().count() > 0);
}
QVariantMap params;
params.insert("deviceId", deviceId);
QVariant response = injectAndWait("Devices.RemoveConfiguredDevice", params);
verifyDeviceError(response, deviceError);
if (DeviceManager::DeviceErrorNoError) {
// Make sure the device is gone from settings too
QCOMPARE(settings.allKeys().count(), 0);
}
}
void TestDevices::storedDevices()
{
QVariantMap params;
@ -483,6 +456,96 @@ void TestDevices::getStateTypes()
}
}
void TestDevices::getStateValue_data()
{
QTest::addColumn<DeviceId>("deviceId");
QTest::addColumn<StateTypeId>("stateTypeId");
QTest::addColumn<DeviceManager::DeviceError>("statusCode");
QTest::newRow("valid deviceId") << m_mockDeviceId << mockIntStateId << DeviceManager::DeviceErrorNoError;
QTest::newRow("invalid deviceId") << DeviceId("094f8024-5caa-48c1-ab6a-de486a92088f") << mockIntStateId << DeviceManager::DeviceErrorDeviceNotFound;
QTest::newRow("invalid statetypeId") << m_mockDeviceId << StateTypeId("120514f1-343e-4621-9bff-dac616169df9") << DeviceManager::DeviceErrorStateTypeNotFound;
}
void TestDevices::getStateValue()
{
QFETCH(DeviceId, deviceId);
QFETCH(StateTypeId, stateTypeId);
QFETCH(DeviceManager::DeviceError, statusCode);
QVariantMap params;
params.insert("deviceId", deviceId);
params.insert("stateTypeId", stateTypeId);
QVariant response = injectAndWait("Devices.GetStateValue", params);
QCOMPARE(response.toMap().value("params").toMap().value("deviceError").toString(), JsonTypes::deviceErrorToString(statusCode));
if (statusCode == DeviceManager::DeviceErrorNoError) {
QVariant value = response.toMap().value("params").toMap().value("value");
QCOMPARE(value.toInt(), 10); // Mock device has value 10 by default...
}
}
void TestDevices::getStateValues_data()
{
QTest::addColumn<DeviceId>("deviceId");
QTest::addColumn<DeviceManager::DeviceError>("statusCode");
QTest::newRow("valid deviceId") << m_mockDeviceId << DeviceManager::DeviceErrorNoError;
QTest::newRow("invalid deviceId") << DeviceId("094f8024-5caa-48c1-ab6a-de486a92088f") << DeviceManager::DeviceErrorDeviceNotFound;
}
void TestDevices::getStateValues()
{
QFETCH(DeviceId, deviceId);
QFETCH(DeviceManager::DeviceError, statusCode);
QVariantMap params;
params.insert("deviceId", deviceId);
QVariant response = injectAndWait("Devices.GetStateValues", params);
QCOMPARE(response.toMap().value("params").toMap().value("deviceError").toString(), JsonTypes::deviceErrorToString(statusCode));
if (statusCode == DeviceManager::DeviceErrorNoError) {
QVariantList values = response.toMap().value("params").toMap().value("values").toList();
QCOMPARE(values.count(), 2); // Mock device has two states...
}
}
void TestDevices::removeDevice_data()
{
QTest::addColumn<DeviceId>("deviceId");
QTest::addColumn<DeviceManager::DeviceError>("deviceError");
QTest::newRow("Existing Device") << m_mockDeviceId << DeviceManager::DeviceErrorNoError;
QTest::newRow("Not existing Device") << DeviceId::createDeviceId() << DeviceManager::DeviceErrorDeviceNotFound;
}
void TestDevices::removeDevice()
{
QFETCH(DeviceId, deviceId);
QFETCH(DeviceManager::DeviceError, deviceError);
QSettings settings(m_deviceSettings);
settings.beginGroup("DeviceConfig");
if (deviceError == DeviceManager::DeviceErrorNoError) {
settings.beginGroup(m_mockDeviceId.toString());
// Make sure we have some config values for this device
QVERIFY(settings.allKeys().count() > 0);
}
QVariantMap params;
params.insert("deviceId", deviceId);
QVariant response = injectAndWait("Devices.RemoveConfiguredDevice", params);
verifyDeviceError(response, deviceError);
if (DeviceManager::DeviceErrorNoError) {
// Make sure the device is gone from settings too
QCOMPARE(settings.allKeys().count(), 0);
}
}
#include "testdevices.moc"
QTEST_MAIN(TestDevices)