From e3bd8afc6bda58e482771e09adf8294e75b89eff Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Tue, 7 May 2013 13:43:13 +0200 Subject: add installerscriptengine autotest Change-Id: I662c22ea8fc1276c78abedd037f51f4afb08271f Reviewed-by: Karsten Heimrich --- tests/auto/installer/installer.pro | 3 +- .../installerscriptengine/data/auto-install.qs | 16 ++ .../installerscriptengine/data/component1.qs | 47 +++++ .../installerscriptengine/data/component2.qs | 6 + .../installerscriptengine.pro | 8 + .../installerscriptengine.qrc | 7 + .../tst_installerscriptengine.cpp | 196 +++++++++++++++++++++ 7 files changed, 282 insertions(+), 1 deletion(-) create mode 100644 tests/auto/installer/installerscriptengine/data/auto-install.qs create mode 100644 tests/auto/installer/installerscriptengine/data/component1.qs create mode 100644 tests/auto/installer/installerscriptengine/data/component2.qs create mode 100644 tests/auto/installer/installerscriptengine/installerscriptengine.pro create mode 100644 tests/auto/installer/installerscriptengine/installerscriptengine.qrc create mode 100644 tests/auto/installer/installerscriptengine/tst_installerscriptengine.cpp (limited to 'tests') diff --git a/tests/auto/installer/installer.pro b/tests/auto/installer/installer.pro index 5b4c32dab..351ecae06 100644 --- a/tests/auto/installer/installer.pro +++ b/tests/auto/installer/installer.pro @@ -7,4 +7,5 @@ SUBDIRS += \ fakestopprocessforupdateoperation \ messageboxhandler \ extractarchiveoperationtest \ - lib7zfacade + lib7zfacade \ + installerscriptengine diff --git a/tests/auto/installer/installerscriptengine/data/auto-install.qs b/tests/auto/installer/installerscriptengine/data/auto-install.qs new file mode 100644 index 000000000..26937fc05 --- /dev/null +++ b/tests/auto/installer/installerscriptengine/data/auto-install.qs @@ -0,0 +1,16 @@ +function Controller() +{ + installer.setMessageBoxAutomaticAnswer("OverwriteTargetDirectory", QMessageBox.Yes); + installer.setValue("GuiTestValue", "hello"); +} + +Controller.prototype.ComponentSelectionPageCallback = function() +{ + var notExistingButtonId = 9999999; + gui.clickButton(notExistingButtonId); +} + +Controller.prototype.FinishedPageCallback = function() +{ + print("FinishedPageCallback - OK") +} diff --git a/tests/auto/installer/installerscriptengine/data/component1.qs b/tests/auto/installer/installerscriptengine/data/component1.qs new file mode 100644 index 000000000..4f9ed571c --- /dev/null +++ b/tests/auto/installer/installerscriptengine/data/component1.qs @@ -0,0 +1,47 @@ +function Component() +{ +} + +Component.prototype.retranslateUi = function() +{ + // arguments.callee to get the current function name doesn't work in that case + print("retranslateUi - OK"); + // no default implementation for this method + // component.languageChanged(); +} + +Component.prototype.createOperationsForPath = function(path) +{ + print("createOperationsForPath - OK"); + component.createOperationsForPath(path); +} + +Component.prototype.createOperationsForArchive = function(archive) +{ + print("createOperationsForArchive - OK"); + component.createOperationsForArchive(archive); +} + +Component.prototype.beginInstallation = function() +{ + print("beginInstallation - OK"); + component.beginInstallation(); +} + +Component.prototype.createOperations = function() +{ + print("createOperations - OK"); + component.createOperations(); +} + +Component.prototype.isAutoDependOn = function() +{ + print("isAutoDependOn - OK"); + return false; +} + +Component.prototype.isDefault = function() +{ + print("isDefault - OK"); + return false; +} diff --git a/tests/auto/installer/installerscriptengine/data/component2.qs b/tests/auto/installer/installerscriptengine/data/component2.qs new file mode 100644 index 000000000..b27e45c83 --- /dev/null +++ b/tests/auto/installer/installerscriptengine/data/component2.qs @@ -0,0 +1,6 @@ +function Component() +{ + print("script function: " + arguments.callee.name); + // adding some broken javascript code here + broken + 789634 +} diff --git a/tests/auto/installer/installerscriptengine/installerscriptengine.pro b/tests/auto/installer/installerscriptengine/installerscriptengine.pro new file mode 100644 index 000000000..b54096a2a --- /dev/null +++ b/tests/auto/installer/installerscriptengine/installerscriptengine.pro @@ -0,0 +1,8 @@ +include(../../qttest.pri) + +QT += script + +SOURCES += tst_installerscriptengine.cpp + +RESOURCES += \ + installerscriptengine.qrc diff --git a/tests/auto/installer/installerscriptengine/installerscriptengine.qrc b/tests/auto/installer/installerscriptengine/installerscriptengine.qrc new file mode 100644 index 000000000..d38168175 --- /dev/null +++ b/tests/auto/installer/installerscriptengine/installerscriptengine.qrc @@ -0,0 +1,7 @@ + + + data/auto-install.qs + data/component1.qs + data/component2.qs + + diff --git a/tests/auto/installer/installerscriptengine/tst_installerscriptengine.cpp b/tests/auto/installer/installerscriptengine/tst_installerscriptengine.cpp new file mode 100644 index 000000000..58081897c --- /dev/null +++ b/tests/auto/installer/installerscriptengine/tst_installerscriptengine.cpp @@ -0,0 +1,196 @@ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace QInstaller; + +// -- InstallerGui + +class TestGui : public QInstaller::PackageManagerGui +{ + Q_OBJECT + +public: + explicit TestGui(QInstaller::PackageManagerCore *core) + : PackageManagerGui(core, 0) + { + setPage(PackageManagerCore::Introduction, new IntroductionPage(core)); + setPage(PackageManagerCore::ComponentSelection, new ComponentSelectionPage(core)); + setPage(PackageManagerCore::InstallationFinished, new FinishedPage(core)); + } + + virtual void init() {} + + void callProtectedDelayedControlScriptExecution(int id) + { + delayedControlScriptExecution(id); + } +}; + + +class tst_InstallerScriptEngine : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase() + { + m_component = new Component(&m_core); + // append the component to the packagemanager which deletes it at destructor + // (it calls clearAllComponentLists which calls qDeleteAll(m_rootComponents);) + m_core.appendRootComponent(m_component); + + m_component->setValue("AutoDependOn", "Script"); + m_component->setValue("Default", "Script"); + m_component->setValue(scName, "component.test.name"); + + m_scriptEngine = m_component->scriptEngine(); + } + + void testScriptPrint() + { + setExpectedScriptOutput("test"); + m_scriptEngine->evaluate("print(\"test\");"); + if (m_scriptEngine->hasUncaughtException()) { + QFAIL(qPrintable(QString::fromLatin1("installerScriptEngine hasUncaughtException:\n %1").arg( + uncaughtExceptionString(m_scriptEngine)))); + } + } + + void testExistingInstallerObject() + { + setExpectedScriptOutput("object"); + m_scriptEngine->evaluate("print(typeof installer)"); + if (m_scriptEngine->hasUncaughtException()) { + QFAIL(qPrintable(QString::fromLatin1("installerScriptEngine hasUncaughtException:\n %1").arg( + uncaughtExceptionString(m_scriptEngine)))); + } + } + + void testComponentByName() + { + const QString printComponentNameScript = QString::fromLatin1("var correctComponent = " \ + "installer.componentByName('%1');\nprint(correctComponent.name);").arg(m_component->name()); + + setExpectedScriptOutput("component.test.name"); + m_scriptEngine->evaluate(printComponentNameScript); + if (m_scriptEngine->hasUncaughtException()) { + QFAIL(qPrintable(QString::fromLatin1("installerScriptEngine hasUncaughtException:\n %1").arg( + uncaughtExceptionString(m_scriptEngine)))); + } + } + + void testComponentByWrongName() + { + const QString printComponentNameScript = QString::fromLatin1( "var brokenComponent = " \ + "installer.componentByName('%1');\nprint(brokenComponent.name);").arg("MyNotExistingComponentName"); + + m_scriptEngine->evaluate(printComponentNameScript); + QVERIFY(m_scriptEngine->hasUncaughtException()); + } + + void loadSimpleComponentScript() + { + try { + // ignore retranslateUi which is called by loadComponentScript + setExpectedScriptOutput("retranslateUi - OK"); + m_component->loadComponentScript(":///data/component1.qs"); + + setExpectedScriptOutput("retranslateUi - OK"); + m_component->languageChanged(); + + setExpectedScriptOutput("createOperationsForPath - OK"); + m_component->createOperationsForPath(":///data/"); + + setExpectedScriptOutput("createOperationsForArchive - OK"); + // ignore createOperationsForPath which is called by createOperationsForArchive + setExpectedScriptOutput("createOperationsForPath - OK"); + m_component->createOperationsForArchive("test.7z"); + + setExpectedScriptOutput("beginInstallation - OK"); + m_component->beginInstallation(); + + setExpectedScriptOutput("createOperations - OK"); + m_component->createOperations(); + + setExpectedScriptOutput("isAutoDependOn - OK"); + bool returnIsAutoDependOn = m_component->isAutoDependOn(QSet()); + QCOMPARE(returnIsAutoDependOn, false); + + setExpectedScriptOutput("isDefault - OK"); + bool returnIsDefault = m_component->isDefault(); + QCOMPARE(returnIsDefault, false); + + } catch (const Error &error) { + QFAIL(qPrintable(error.message())); + } + + } + void loadBrokenComponentScript() + { + PackageManagerCore core; + Component testComponent(&core); + + const QString debugMesssage( + "create Error-Exception: \"Exception while loading the component script: :///data/component2.qs\n\n" \ + "ReferenceError: Can't find variable: broken\n\n" \ + "Backtrace:\n" \ + "\t()@:///data/component2.qs:5\" "); + try { + // ignore Output from script + setExpectedScriptOutput("script function: Component"); + setExpectedScriptOutput(qPrintable(debugMesssage)); + testComponent.loadComponentScript(":///data/component2.qs"); + } catch (const Error &error) { + QVERIFY2(debugMesssage.contains(error.message()), "There was some unexpected error."); + } + } + + void loadSimpleAutoRunScript() + { + TestGui testGui(&m_core); + setExpectedScriptOutput("Loaded control script \":///data/auto-install.qs\" "); + testGui.loadControlScript(":///data/auto-install.qs"); + QCOMPARE(m_core.value("GuiTestValue"), QString("hello")); + + testGui.show(); + // show event calls automatically the first callback which does not exist + setExpectedScriptOutput("Control script callback \"IntroductionPageCallback\" does not exist. "); + // give some time to the event triggering mechanism + qApp->processEvents(); + + setExpectedScriptOutput("Calling control script callback \"ComponentSelectionPageCallback\" "); + // inside the auto-install script we are clicking the next button, with a not existing button + QTest::ignoreMessage(QtWarningMsg, "Button with type: \"unknown button\" not found! "); + testGui.callProtectedDelayedControlScriptExecution(PackageManagerCore::ComponentSelection); + + setExpectedScriptOutput("Calling control script callback \"FinishedPageCallback\" "); + setExpectedScriptOutput("FinishedPageCallback - OK"); + testGui.callProtectedDelayedControlScriptExecution(PackageManagerCore::InstallationFinished); + } + +private: + void setExpectedScriptOutput(const char *message) + { + // Using setExpectedScriptOutput(...); inside the test method + // as a simple test that the scripts are called. + QTest::ignoreMessage(QtDebugMsg, message); + } + + PackageManagerCore m_core; + Component *m_component; + QScriptEngine *m_scriptEngine; + +}; + + +QTEST_MAIN(tst_InstallerScriptEngine) + +#include "tst_installerscriptengine.moc" -- cgit v1.2.3