diff --git a/tests/auto/actions/actions.pro b/tests/auto/actions/actions.pro
new file mode 100644
index 00000000..b8e65eed
--- /dev/null
+++ b/tests/auto/actions/actions.pro
@@ -0,0 +1,6 @@
+TARGET = testactions
+
+include(../../../guh.pri)
+include(../autotests.pri)
+
+SOURCES += testactions.cpp
diff --git a/tests/auto/actions/testactions.cpp b/tests/auto/actions/testactions.cpp
new file mode 100644
index 00000000..bd4bc41f
--- /dev/null
+++ b/tests/auto/actions/testactions.cpp
@@ -0,0 +1,120 @@
+/****************************************************************************
+ * *
+ * This file is part of guh. *
+ * *
+ * Guh is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, version 2 of the License. *
+ * *
+ * Guh is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with guh. If not, see . *
+ * *
+ ***************************************************************************/
+
+#include "guhtestbase.h"
+#include "guhcore.h"
+#include "devicemanager.h"
+#include "mocktcpserver.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+class TestActions: public GuhTestBase
+{
+ Q_OBJECT
+
+private slots:
+ void executeAction_data();
+ void executeAction();
+
+};
+
+void TestActions::executeAction_data()
+{
+ QTest::addColumn("deviceId");
+ QTest::addColumn("actionTypeId");
+ QTest::addColumn("actionParams");
+ QTest::addColumn("success");
+
+ 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 << mockActionIdWithParams << params << true;
+ QTest::newRow("invalid deviceId") << DeviceId::createDeviceId() << mockActionIdWithParams << params << false;
+ QTest::newRow("invalid actionTypeId") << m_mockDeviceId << ActionTypeId::createActionTypeId() << params << false;
+ QTest::newRow("missing params") << m_mockDeviceId << mockActionIdWithParams << QVariantList() << false;
+ QTest::newRow("async action") << m_mockDeviceId << mockActionIdAsync << QVariantList() << true;
+ QTest::newRow("broken action") << m_mockDeviceId << mockActionIdFailing << QVariantList() << false;
+ QTest::newRow("async broken action") << m_mockDeviceId << mockActionIdAsyncFailing << QVariantList() << false;
+}
+
+void TestActions::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);
+ qDebug() << "executeActionresponse" << response;
+ verifySuccess(response, success);
+
+ // Fetch action execution history from mock device
+ QNetworkAccessManager nam;
+ QSignalSpy spy(&nam, SIGNAL(finished(QNetworkReply*)));
+
+ QNetworkRequest request(QUrl(QString("http://localhost:%1/actionhistory").arg(m_mockDevice1Port)));
+ QNetworkReply *reply = nam.get(request);
+ spy.wait();
+ QCOMPARE(spy.count(), 1);
+ reply->deleteLater();
+ QByteArray data = reply->readAll();
+
+ if (success) {
+ QVERIFY2(actionTypeId == ActionTypeId(data), QString("ActionTypeId mismatch. Got %1, Expected: %2")
+ .arg(ActionTypeId(data).toString()).arg(actionTypeId.toString()).toLatin1().data());
+ } else {
+ QVERIFY2(data.length() == 0, QString("Data is %1, should be empty.").arg(QString(data)).toLatin1().data());
+ }
+
+ // cleanup for the next run
+ spy.clear();
+ request.setUrl(QUrl(QString("http://localhost:%1/clearactionhistory").arg(m_mockDevice1Port)));
+ reply = nam.get(request);
+ spy.wait();
+ QCOMPARE(spy.count(), 1);
+ reply->deleteLater();
+
+ spy.clear();
+ request.setUrl(QUrl(QString("http://localhost:%1/actionhistory").arg(m_mockDevice1Port)));
+ reply = nam.get(request);
+ spy.wait();
+ QCOMPARE(spy.count(), 1);
+ reply->deleteLater();
+ data = reply->readAll();
+ qDebug() << "cleared data:" << data;
+
+}
+
+
+#include "testactions.moc"
+QTEST_MAIN(TestActions)