From df001695a1f9c387c7e9202c0e0e0b8c91dea52f Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Mon, 28 Apr 2014 20:22:17 +0200 Subject: [PATCH] convert ActionType to use ParamType instead of variants, extend tests --- libguh/devicemanager.cpp | 2 ++ libguh/types/actiontype.cpp | 4 ++-- libguh/types/actiontype.h | 7 ++++--- libguh/types/param.h | 3 ++- .../boblight/devicepluginboblight.cpp | 6 ++---- plugins/deviceplugins/elro/devicepluginelro.cpp | 6 ++---- .../googlemail/deviceplugingooglemail.cpp | 10 +++------- .../intertechno/devicepluginintertechno.cpp | 9 ++------- plugins/deviceplugins/mock/devicepluginmock.cpp | 6 ++++++ server/jsonrpc/jsontypes.cpp | 6 +++++- tests/auto/testjsonrpc.cpp | 17 ++++++++++++++--- tests/scripts/executeaction.sh | 10 +++++++--- 12 files changed, 51 insertions(+), 35 deletions(-) diff --git a/libguh/devicemanager.cpp b/libguh/devicemanager.cpp index 5a6429b8..3a98b9db 100644 --- a/libguh/devicemanager.cpp +++ b/libguh/devicemanager.cpp @@ -343,6 +343,8 @@ DeviceManager::DeviceError DeviceManager::executeAction(const Action &action) if (actionType.id() == action.actionTypeId()) { found = true; + qDebug() << "checking params" << actionType.parameters().count() << action.params().count(); + qDebug() << "action params:" << action.params(); if (actionType.parameters().count() > action.params().count()) { return DeviceErrorMissingParameter; } diff --git a/libguh/types/actiontype.cpp b/libguh/types/actiontype.cpp index cc505613..5a4cd426 100644 --- a/libguh/types/actiontype.cpp +++ b/libguh/types/actiontype.cpp @@ -59,14 +59,14 @@ void ActionType::setName(const QString &name) /*! Returns the parameter description of this ActionType. \l{Action}{Actions} created from this ActionType must have their parameters matching to this template. */ -QVariantList ActionType::parameters() const +QList ActionType::parameters() const { return m_parameters; } /*! Set the parameter description of this ActionType. \l{Action}{Actions} created from this ActionType must have their \a parameters matching to this template. */ -void ActionType::setParameters(const QVariantList ¶meters) +void ActionType::setParameters(const QList ¶meters) { m_parameters = parameters; } diff --git a/libguh/types/actiontype.h b/libguh/types/actiontype.h index 689495cb..c6f1e9e3 100644 --- a/libguh/types/actiontype.h +++ b/libguh/types/actiontype.h @@ -20,6 +20,7 @@ #define ACTIONTYPE_H #include "typeutils.h" +#include "paramtype.h" #include @@ -33,14 +34,14 @@ public: QString name() const; void setName(const QString &name); - QVariantList parameters() const; - void setParameters(const QVariantList ¶meters); + QList parameters() const; + void setParameters(const QList ¶meters); private: ActionTypeId m_id; QString m_name; - QVariantList m_parameters; + QList m_parameters; }; #endif // ACTIONTYPE_H diff --git a/libguh/types/param.h b/libguh/types/param.h index e17ad4bd..760ba8ef 100644 --- a/libguh/types/param.h +++ b/libguh/types/param.h @@ -25,7 +25,7 @@ class Param { public: - Param(const QString &name, const QVariant &value = QVariant()); + Param(const QString &name = QString(), const QVariant &value = QVariant()); QString name() const; void setName(const QString &name); @@ -40,6 +40,7 @@ private: QVariant m_value; }; +Q_DECLARE_METATYPE(Param) QDebug operator<<(QDebug dbg, const Param ¶m); QDebug operator<<(QDebug dbg, const QList ¶ms); diff --git a/plugins/deviceplugins/boblight/devicepluginboblight.cpp b/plugins/deviceplugins/boblight/devicepluginboblight.cpp index 1da5b85d..959c179b 100644 --- a/plugins/deviceplugins/boblight/devicepluginboblight.cpp +++ b/plugins/deviceplugins/boblight/devicepluginboblight.cpp @@ -74,10 +74,8 @@ QList DevicePluginBoblight::supportedDevices() const ActionType setColorAction(setColorActionTypeId); setColorAction.setName("Set color"); - QVariantList actionParamsSetColor; - QVariantMap actionParamSetColor; - actionParamSetColor.insert("name", "color"); - actionParamSetColor.insert("type", "color"); + QList actionParamsSetColor; + ParamType actionParamSetColor("color", QVariant::Color); actionParamsSetColor.append(actionParamSetColor); setColorAction.setParameters(actionParamsSetColor); diff --git a/plugins/deviceplugins/elro/devicepluginelro.cpp b/plugins/deviceplugins/elro/devicepluginelro.cpp index 8ac80990..18ee99d2 100644 --- a/plugins/deviceplugins/elro/devicepluginelro.cpp +++ b/plugins/deviceplugins/elro/devicepluginelro.cpp @@ -187,10 +187,8 @@ QList DevicePluginElro::supportedDevices() const deviceClassElroSwitch.setParams(deviceParamsSwitch); - QVariantList actionParamsSwitch; - QVariantMap actionParamSwitch; - actionParamSwitch.insert("name", "power"); - actionParamSwitch.insert("type", "bool"); + QList actionParamsSwitch; + ParamType actionParamSwitch("power", QVariant::Bool); actionParamsSwitch.append(actionParamSwitch); QList switchActions; diff --git a/plugins/deviceplugins/googlemail/deviceplugingooglemail.cpp b/plugins/deviceplugins/googlemail/deviceplugingooglemail.cpp index c8d93d2c..df26877e 100644 --- a/plugins/deviceplugins/googlemail/deviceplugingooglemail.cpp +++ b/plugins/deviceplugins/googlemail/deviceplugingooglemail.cpp @@ -185,15 +185,11 @@ QList DevicePluginGoogleMail::supportedDevices() const // Actions QList googleMailActions; - QVariantList actionParamsMail; - QVariantMap actionParamSubject; - actionParamSubject.insert("name", "subject"); - actionParamSubject.insert("type", "string"); + QList actionParamsMail; + ParamType actionParamSubject("subject", QVariant::String); actionParamsMail.append(actionParamSubject); - QVariantMap actionParamBody; - actionParamBody.insert("name", "body"); - actionParamBody.insert("type", "string"); + ParamType actionParamBody("body", QVariant::String); actionParamsMail.append(actionParamBody); ActionType sendMailAction(sendMailActionTypeId); diff --git a/plugins/deviceplugins/intertechno/devicepluginintertechno.cpp b/plugins/deviceplugins/intertechno/devicepluginintertechno.cpp index 1b04c907..cbdb3972 100644 --- a/plugins/deviceplugins/intertechno/devicepluginintertechno.cpp +++ b/plugins/deviceplugins/intertechno/devicepluginintertechno.cpp @@ -318,13 +318,8 @@ QList DevicePluginIntertechno::supportedDevices() const QList switchActions; - QVariantList paramsSwitch; - QVariantMap paramSwitch; - - // on = true - // off = false - paramSwitch.insert("name", "power"); - paramSwitch.insert("type", "bool"); + QList paramsSwitch; + ParamType paramSwitch("power", QVariant::Bool); paramsSwitch.append(paramSwitch); ActionType switchActionPower(ActionTypeId("df19fb51-c3cd-4b95-8d88-ebbb535f4789")); diff --git a/plugins/deviceplugins/mock/devicepluginmock.cpp b/plugins/deviceplugins/mock/devicepluginmock.cpp index 6d7419fe..06a92f6b 100644 --- a/plugins/deviceplugins/mock/devicepluginmock.cpp +++ b/plugins/deviceplugins/mock/devicepluginmock.cpp @@ -90,8 +90,14 @@ QList DevicePluginMock::supportedDevices() const QList mockActions; + mockParams.clear(); ActionType action1(mockAction1Id); action1.setName("Mock Action 1"); + ParamType mockActionParam1("mockActionParam1", QVariant::Int); + mockParams.append(mockActionParam1); + ParamType mockActionParam2("mockActionParam2", QVariant::Bool); + mockParams.append(mockActionParam2); + action1.setParameters(mockParams); mockActions.append(action1); ActionType action2(mockAction2Id); diff --git a/server/jsonrpc/jsontypes.cpp b/server/jsonrpc/jsontypes.cpp index e895f577..ef27807c 100644 --- a/server/jsonrpc/jsontypes.cpp +++ b/server/jsonrpc/jsontypes.cpp @@ -223,7 +223,11 @@ QVariantMap JsonTypes::packActionType(const ActionType &actionType) QVariantMap variantMap; variantMap.insert("id", actionType.id()); variantMap.insert("name", actionType.name()); - variantMap.insert("params", actionType.parameters()); + QVariantList params; + foreach (const ParamType ¶mType, actionType.parameters()) { + params.append(packParamType(paramType)); + } + variantMap.insert("params", params); return variantMap; } diff --git a/tests/auto/testjsonrpc.cpp b/tests/auto/testjsonrpc.cpp index cb790f33..521903c1 100644 --- a/tests/auto/testjsonrpc.cpp +++ b/tests/auto/testjsonrpc.cpp @@ -326,22 +326,33 @@ void TestJSONRPC::executeAction_data() { QTest::addColumn("deviceId"); QTest::addColumn("actionTypeId"); + QTest::addColumn("actionParams"); QTest::addColumn("success"); - QTest::newRow("valid action") << m_mockDeviceId << mockAction1Id << true; - QTest::newRow("invalid device TypeId") << DeviceId("f2965936-0dd0-4014-8f31-4c2ef7fc5952") << mockAction1Id << false; - QTest::newRow("invalid action TypeId") << m_mockDeviceId << ActionTypeId("f2965936-0dd0-4014-8f31-4c2ef7fc5952") << false; + QVariantList params; + QVariantMap param1; + param1.insert("mockActionParam1", 5); + params.append(param1); + QVariantMap param2; + param2.insert("mockActionParam2", true); + params.append(param2); + + QTest::newRow("valid action") << m_mockDeviceId << mockAction1Id << params << true; + QTest::newRow("invalid device TypeId") << DeviceId("f2965936-0dd0-4014-8f31-4c2ef7fc5952") << mockAction1Id << params << false; + QTest::newRow("invalid action TypeId") << m_mockDeviceId << ActionTypeId("f2965936-0dd0-4014-8f31-4c2ef7fc5952") << params << false; } void TestJSONRPC::executeAction() { QFETCH(DeviceId, deviceId); QFETCH(ActionTypeId, actionTypeId); + QFETCH(QVariantList, actionParams); QFETCH(bool, success); QVariantMap params; params.insert("actionTypeId", actionTypeId); params.insert("deviceId", deviceId); + params.insert("params", actionParams); QVariant response = injectAndWait("Actions.ExecuteAction", params); QCOMPARE(response.toMap().value("params").toMap().value("success").toBool(), success); diff --git a/tests/scripts/executeaction.sh b/tests/scripts/executeaction.sh index 7abc51ef..f24b3c1d 100755 --- a/tests/scripts/executeaction.sh +++ b/tests/scripts/executeaction.sh @@ -1,11 +1,15 @@ #!/bin/bash if [ -z $3 ]; then - echo "usage: $0 host actionTypeId deviceId [paramname paramvalue]" + echo "usage: $0 host actionTypeId deviceId [paramname paramvalue] [paramname paramvalue]" elif [ -z $4 ]; then (echo '{"id":1, "method":"Actions.ExecuteAction","params":{"actionTypeId": "{'$2'}", "deviceId":"{'$3'}"}}'; sleep 1) | nc $1 1234 elif [ -z $5 ]; then - echo "usage: $0 host actionTypeId deviceId [paramname paramvalue]" + echo "usage: $0 host actionTypeId deviceId [paramname paramvalue] [paramname paramvalue]" +elif [ -z $6 ]; then + (echo '{"id":1, "method":"Actions.ExecuteAction","params":{"actionTypeId": "{'$2'}", "deviceId":"{'$3'}","params":[{"'$4'":"'$5'"}]}}'; sleep 1) | nc $1 1234 +elif [ -z $7 ]; then + echo "usage: $0 host actionTypeId deviceId [paramname paramvalue] [paramname paramvalue]" else - (echo '{"id":1, "method":"Actions.ExecuteAction","params":{"actionTypeId": "{'$2'}", "deviceId":"{'$3'}","params":{"'$4'":"'$5'"}}}'; sleep 1) | nc $1 1234 + (echo '{"id":1, "method":"Actions.ExecuteAction","params":{"actionTypeId": "{'$2'}", "deviceId":"{'$3'}","params":[{"'$4'":"'$5'"}, {"'$6'": "'$7'"}]}}'; sleep 1) | nc $1 1234 fi