diff --git a/libguh/plugin/device.cpp b/libguh/plugin/device.cpp index 2ed467f0..1694fa56 100644 --- a/libguh/plugin/device.cpp +++ b/libguh/plugin/device.cpp @@ -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(); } diff --git a/server/jsonrpc/devicehandler.cpp b/server/jsonrpc/devicehandler.cpp index b259e93f..3e672773 100644 --- a/server/jsonrpc/devicehandler.cpp +++ b/server/jsonrpc/devicehandler.cpp @@ -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 ¶ms) const return createReply(returns); } +JsonReply *DeviceHandler::GetStateValues(const QVariantMap ¶ms) 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; diff --git a/server/jsonrpc/devicehandler.h b/server/jsonrpc/devicehandler.h index d083299e..5f93d54b 100644 --- a/server/jsonrpc/devicehandler.h +++ b/server/jsonrpc/devicehandler.h @@ -60,6 +60,8 @@ public: Q_INVOKABLE JsonReply* GetStateValue(const QVariantMap ¶ms) const; + Q_INVOKABLE JsonReply* GetStateValues(const QVariantMap ¶ms) const; + signals: void StateChanged(const QVariantMap ¶ms); diff --git a/tests/auto/devices/testdevices.cpp b/tests/auto/devices/testdevices.cpp index 171d2e6d..d1ca5d21 100644 --- a/tests/auto/devices/testdevices.cpp +++ b/tests/auto/devices/testdevices.cpp @@ -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"); - QTest::addColumn("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"); + QTest::addColumn("stateTypeId"); + QTest::addColumn("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"); + QTest::addColumn("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"); + QTest::addColumn("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)