diff options
Diffstat (limited to 'tests/auto')
7 files changed, 282 insertions, 1 deletions
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 @@ +<RCC> + <qresource prefix="/"> + <file>data/auto-install.qs</file> + <file>data/component1.qs</file> + <file>data/component2.qs</file> + </qresource> +</RCC> 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 <component.h> +#include <errors.h> +#include <packagemanagercore.h> +#include <packagemanagergui.h> + +#include <QTest> +#include <QSet> +#include <QFile> +#include <QString> +#include <QScriptEngine> + +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<QString>()); + 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<anonymous>()@:///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" |