Merge lp:~bregma/qtmir/use-ual-info into lp:qtmir

Proposed by Stephen M. Webb
Status: Work in progress
Proposed branch: lp:~bregma/qtmir/use-ual-info
Merge into: lp:qtmir
Diff against target: 3126 lines (+493/-1554)
30 files modified
debian/control (+1/-1)
src/modules/Unity/Application/CMakeLists.txt (+2/-1)
src/modules/Unity/Application/application.cpp (+22/-67)
src/modules/Unity/Application/application.h (+3/-9)
src/modules/Unity/Application/application_manager.cpp (+29/-42)
src/modules/Unity/Application/application_manager.h (+0/-3)
src/modules/Unity/Application/applicationinfo.h (+59/-0)
src/modules/Unity/Application/dbuswindowstack.cpp (+1/-1)
src/modules/Unity/Application/desktopfilereader.cpp (+0/-320)
src/modules/Unity/Application/desktopfilereader.h (+0/-78)
src/modules/Unity/Application/taskcontroller.h (+3/-3)
src/modules/Unity/Application/upstart/applicationinfo.cpp (+109/-0)
src/modules/Unity/Application/upstart/applicationinfo.h (+57/-0)
src/modules/Unity/Application/upstart/taskcontroller.cpp (+75/-93)
src/modules/Unity/Application/upstart/taskcontroller.h (+1/-2)
tests/framework/CMakeLists.txt (+3/-3)
tests/framework/fake_application_info.cpp (+31/-41)
tests/framework/fake_application_info.h (+12/-17)
tests/framework/mock_application_info.cpp (+23/-94)
tests/framework/mock_application_info.h (+17/-35)
tests/framework/mock_task_controller.cpp (+5/-17)
tests/framework/mock_task_controller.h (+2/-5)
tests/framework/qtmir_test.cpp (+0/-10)
tests/framework/qtmir_test.h (+0/-2)
tests/modules/Application/application_test.cpp (+15/-14)
tests/modules/ApplicationManager/application_manager_test.cpp (+23/-246)
tests/modules/CMakeLists.txt (+0/-1)
tests/modules/DesktopFileReader/CMakeLists.txt (+0/-22)
tests/modules/DesktopFileReader/calculator.desktop (+0/-227)
tests/modules/DesktopFileReader/desktopfilereader_test.cpp (+0/-200)
To merge this branch: bzr merge lp:~bregma/qtmir/use-ual-info
Reviewer Review Type Date Requested Status
Mir development team Pending
Review via email: mp+284523@code.launchpad.net

Commit message

add required param to mock app object ctor to fix ftbfs

Description of the change

fix params to mock object ctor

To post a comment you must log in.
lp:~bregma/qtmir/use-ual-info updated
445. By Michael Terry

Merge from trunk

446. By Michael Terry

Remove leftover junk file from merge

447. By Michael Terry

And another

448. By Stephen M. Webb

synch with trunk

Unmerged revisions

448. By Stephen M. Webb

synch with trunk

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'debian/control'
--- debian/control 2016-02-03 16:40:09 +0000
+++ debian/control 2016-03-02 00:44:09 +0000
@@ -19,7 +19,7 @@
19 libqt5sensors5-dev,19 libqt5sensors5-dev,
20 libqtdbusmock1-dev (>= 0.2),20 libqtdbusmock1-dev (>= 0.2),
21 libqtdbustest1-dev (>= 0.2),21 libqtdbustest1-dev (>= 0.2),
22 libubuntu-app-launch2-dev,22 libubuntu-app-launch2-dev (>= 0.9),
23 libubuntu-application-api-dev (>= 2.1.0),23 libubuntu-application-api-dev (>= 2.1.0),
24 libudev-dev,24 libudev-dev,
25 libunity-api-dev (>= 7.106),25 libunity-api-dev (>= 7.106),
2626
=== modified file 'src/modules/Unity/Application/CMakeLists.txt'
--- src/modules/Unity/Application/CMakeLists.txt 2016-02-11 11:52:06 +0000
+++ src/modules/Unity/Application/CMakeLists.txt 2016-03-02 00:44:09 +0000
@@ -27,7 +27,6 @@
27 application.cpp27 application.cpp
28 ../../../common/abstractdbusservicemonitor.cpp28 ../../../common/abstractdbusservicemonitor.cpp
29 ../../../common/debughelpers.cpp29 ../../../common/debughelpers.cpp
30 desktopfilereader.cpp
31 plugin.cpp30 plugin.cpp
32 applicationscreenshotprovider.cpp31 applicationscreenshotprovider.cpp
33 dbuswindowstack.cpp32 dbuswindowstack.cpp
@@ -41,6 +40,7 @@
41 session.cpp40 session.cpp
42 sessionmanager.cpp41 sessionmanager.cpp
43 sharedwakelock.cpp42 sharedwakelock.cpp
43 upstart/applicationinfo.cpp
44 upstart/taskcontroller.cpp44 upstart/taskcontroller.cpp
45 timer.cpp45 timer.cpp
46 timesource.cpp46 timesource.cpp
@@ -54,6 +54,7 @@
54 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h54 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/Mir.h
55# Feed the automoc monster55# Feed the automoc monster
56 session_interface.h56 session_interface.h
57 applicationinfo.h
57 taskcontroller.h58 taskcontroller.h
58 settings_interface.h59 settings_interface.h
59 )60 )
6061
=== modified file 'src/modules/Unity/Application/application.cpp'
--- src/modules/Unity/Application/application.cpp 2016-02-12 00:07:09 +0000
+++ src/modules/Unity/Application/application.cpp 2016-03-02 00:44:09 +0000
@@ -16,8 +16,8 @@
1616
17// local17// local
18#include "application.h"18#include "application.h"
19#include "applicationinfo.h"
19#include "application_manager.h"20#include "application_manager.h"
20#include "desktopfilereader.h"
21#include "session.h"21#include "session.h"
22#include "sharedwakelock.h"22#include "sharedwakelock.h"
23#include "timer.h"23#include "timer.h"
@@ -38,14 +38,14 @@
38{38{
3939
40Application::Application(const QSharedPointer<SharedWakelock>& sharedWakelock,40Application::Application(const QSharedPointer<SharedWakelock>& sharedWakelock,
41 DesktopFileReader *desktopFileReader,41 ApplicationInfo *appInfo,
42 const QStringList &arguments,42 const QStringList &arguments,
43 ApplicationManager *parent)43 ApplicationManager *parent)
44 : ApplicationInfoInterface(desktopFileReader->appId(), parent)44 : ApplicationInfoInterface(appInfo->appId(), parent)
45 , m_sharedWakelock(sharedWakelock)45 , m_sharedWakelock(sharedWakelock)
46 , m_desktopData(desktopFileReader)46 , m_appInfo(appInfo)
47 , m_pid(0)47 , m_pid(0)
48 , m_stage((desktopFileReader->stageHint() == "SideStage") ? Application::SideStage : Application::MainStage)48 , m_stage(Application::MainStage)
49 , m_state(InternalState::Starting)49 , m_state(InternalState::Starting)
50 , m_focused(false)50 , m_focused(false)
51 , m_arguments(arguments)51 , m_arguments(arguments)
@@ -55,17 +55,14 @@
55 , m_closeTimer(nullptr)55 , m_closeTimer(nullptr)
56 , m_exemptFromLifecycle(false)56 , m_exemptFromLifecycle(false)
57{57{
58 qCDebug(QTMIR_APPLICATIONS) << "Application::Application - appId=" << desktopFileReader->appId();58 qCDebug(QTMIR_APPLICATIONS) << "Application::Application - appId=" << appInfo->appId();
5959
60 // Because m_state is InternalState::Starting60 // Because m_state is InternalState::Starting
61 acquireWakelock();61 acquireWakelock();
6262
63 // FIXME(greyback) need to save long appId internally until ubuntu-app-launch can hide it from us63 m_supportedOrientations = m_appInfo->supportedOrientations();
64 m_longAppId = desktopFileReader->file().remove(QRegExp(".desktop$")).split('/').last();64
6565 m_rotatesWindowContents = m_appInfo->rotatesWindowContents();
66 m_supportedOrientations = m_desktopData->supportedOrientations();
67
68 m_rotatesWindowContents = m_desktopData->rotatesWindowContents();
6966
70 setCloseTimer(new Timer);67 setCloseTimer(new Timer);
71}68}
@@ -102,7 +99,7 @@
102 m_session->setApplication(nullptr);99 m_session->setApplication(nullptr);
103 delete m_session;100 delete m_session;
104 }101 }
105 delete m_desktopData;102 delete m_appInfo;
106 delete m_closeTimer;103 delete m_closeTimer;
107}104}
108105
@@ -124,64 +121,37 @@
124121
125bool Application::isValid() const122bool Application::isValid() const
126{123{
127 return m_desktopData->loaded();124 return !appId().isEmpty();
128}
129
130QString Application::desktopFile() const
131{
132 return m_desktopData->file();
133}125}
134126
135QString Application::appId() const127QString Application::appId() const
136{128{
137 return m_desktopData->appId();129 return m_appInfo->appId();
138}130}
139131
140QString Application::name() const132QString Application::name() const
141{133{
142 return m_desktopData->name();134 return m_appInfo->name();
143}135}
144136
145QString Application::comment() const137QString Application::comment() const
146{138{
147 return m_desktopData->comment();139 return m_appInfo->comment();
148}140}
149141
150QUrl Application::icon() const142QUrl Application::icon() const
151{143{
152 QString iconString = m_desktopData->icon();144 return m_appInfo->icon();
153 QString pathString = m_desktopData->path();
154
155 if (QFileInfo(iconString).exists()) {
156 return QUrl(iconString);
157 } else if (QFileInfo(pathString + '/' + iconString).exists()) {
158 return QUrl(pathString + '/' + iconString);
159 } else {
160 return QUrl("image://theme/" + iconString);
161 }
162}145}
163146
164QString Application::splashTitle() const147QString Application::splashTitle() const
165{148{
166 return m_desktopData->splashTitle();149 return m_appInfo->splashTitle();
167}150}
168151
169QUrl Application::splashImage() const152QUrl Application::splashImage() const
170{153{
171 if (m_desktopData->splashImage().isEmpty()) {154 return m_appInfo->splashImage();
172 return QUrl();
173 } else {
174 QFileInfo imageFileInfo(m_desktopData->path(), m_desktopData->splashImage());
175 if (imageFileInfo.exists()) {
176 return QUrl::fromLocalFile(imageFileInfo.canonicalFilePath());
177 } else {
178 qCWarning(QTMIR_APPLICATIONS)
179 << QString("Application(%1).splashImage file does not exist: \"%2\". Ignoring it.")
180 .arg(appId()).arg(imageFileInfo.absoluteFilePath());
181
182 return QUrl();
183 }
184 }
185}155}
186156
187QColor Application::colorFromString(const QString &colorString, const char *colorName) const157QColor Application::colorFromString(const QString &colorString, const char *colorName) const
@@ -236,37 +206,27 @@
236206
237bool Application::splashShowHeader() const207bool Application::splashShowHeader() const
238{208{
239 QString showHeader = m_desktopData->splashShowHeader();209 return m_appInfo->splashShowHeader();
240 if (showHeader.toLower() == "true") {
241 return true;
242 } else {
243 return false;
244 }
245}210}
246211
247QColor Application::splashColor() const212QColor Application::splashColor() const
248{213{
249 QString colorStr = m_desktopData->splashColor();214 QString colorStr = m_appInfo->splashColor();
250 return colorFromString(colorStr, "splashColor");215 return colorFromString(colorStr, "splashColor");
251}216}
252217
253QColor Application::splashColorHeader() const218QColor Application::splashColorHeader() const
254{219{
255 QString colorStr = m_desktopData->splashColorHeader();220 QString colorStr = m_appInfo->splashColorHeader();
256 return colorFromString(colorStr, "splashColorHeader");221 return colorFromString(colorStr, "splashColorHeader");
257}222}
258223
259QColor Application::splashColorFooter() const224QColor Application::splashColorFooter() const
260{225{
261 QString colorStr = m_desktopData->splashColorFooter();226 QString colorStr = m_appInfo->splashColorFooter();
262 return colorFromString(colorStr, "splashColorFooter");227 return colorFromString(colorStr, "splashColorFooter");
263}228}
264229
265QString Application::exec() const
266{
267 return m_desktopData->exec();
268}
269
270Application::Stage Application::stage() const230Application::Stage Application::stage() const
271{231{
272 return m_stage;232 return m_stage;
@@ -690,7 +650,7 @@
690650
691bool Application::isTouchApp() const651bool Application::isTouchApp() const
692{652{
693 return m_desktopData->isTouchApp();653 return m_appInfo->isTouchApp();
694}654}
695655
696bool Application::exemptFromLifecycle() const656bool Application::exemptFromLifecycle() const
@@ -709,11 +669,6 @@
709 }669 }
710}670}
711671
712QString Application::longAppId() const
713{
714 return m_longAppId;
715}
716
717Qt::ScreenOrientations Application::supportedOrientations() const672Qt::ScreenOrientations Application::supportedOrientations() const
718{673{
719 return m_supportedOrientations;674 return m_supportedOrientations;
720675
=== modified file 'src/modules/Unity/Application/application.h'
--- src/modules/Unity/Application/application.h 2016-02-11 11:54:59 +0000
+++ src/modules/Unity/Application/application.h 2016-03-02 00:44:09 +0000
@@ -40,7 +40,7 @@
40{40{
4141
42class ApplicationManager;42class ApplicationManager;
43class DesktopFileReader;43class ApplicationInfo;
44class Session;44class Session;
45class SharedWakelock;45class SharedWakelock;
46class AbstractTimer;46class AbstractTimer;
@@ -49,8 +49,6 @@
49{49{
50 Q_OBJECT50 Q_OBJECT
5151
52 Q_PROPERTY(QString desktopFile READ desktopFile CONSTANT)
53 Q_PROPERTY(QString exec READ exec CONSTANT)
54 Q_PROPERTY(bool fullscreen READ fullscreen NOTIFY fullscreenChanged)52 Q_PROPERTY(bool fullscreen READ fullscreen NOTIFY fullscreenChanged)
55 Q_PROPERTY(Stage stage READ stage WRITE setStage NOTIFY stageChanged)53 Q_PROPERTY(Stage stage READ stage WRITE setStage NOTIFY stageChanged)
56 Q_PROPERTY(SessionInterface* session READ session NOTIFY sessionChanged DESIGNABLE false)54 Q_PROPERTY(SessionInterface* session READ session NOTIFY sessionChanged DESIGNABLE false)
@@ -82,7 +80,7 @@
82 };80 };
8381
84 Application(const QSharedPointer<SharedWakelock>& sharedWakelock,82 Application(const QSharedPointer<SharedWakelock>& sharedWakelock,
85 DesktopFileReader *desktopFileReader,83 ApplicationInfo *appInfo,
86 const QStringList &arguments,84 const QStringList &arguments,
87 ApplicationManager *parent);85 ApplicationManager *parent);
88 virtual ~Application();86 virtual ~Application();
@@ -124,8 +122,6 @@
124 bool canBeResumed() const;122 bool canBeResumed() const;
125123
126 bool isValid() const;124 bool isValid() const;
127 QString desktopFile() const;
128 QString exec() const;
129 bool fullscreen() const;125 bool fullscreen() const;
130126
131 Stages supportedStages() const;127 Stages supportedStages() const;
@@ -156,7 +152,6 @@
156152
157private:153private:
158154
159 QString longAppId() const;
160 void acquireWakelock() const;155 void acquireWakelock() const;
161 void releaseWakelock() const;156 void releaseWakelock() const;
162 void setPid(pid_t pid);157 void setPid(pid_t pid);
@@ -175,8 +170,7 @@
175 void doClose();170 void doClose();
176171
177 QSharedPointer<SharedWakelock> m_sharedWakelock;172 QSharedPointer<SharedWakelock> m_sharedWakelock;
178 DesktopFileReader* m_desktopData;173 ApplicationInfo *m_appInfo;
179 QString m_longAppId;
180 pid_t m_pid;174 pid_t m_pid;
181 Stage m_stage;175 Stage m_stage;
182 Stages m_supportedStages;176 Stages m_supportedStages;
183177
=== modified file 'src/modules/Unity/Application/application_manager.cpp'
--- src/modules/Unity/Application/application_manager.cpp 2016-02-11 11:54:59 +0000
+++ src/modules/Unity/Application/application_manager.cpp 2016-03-02 00:44:09 +0000
@@ -17,7 +17,7 @@
17// local17// local
18#include "application_manager.h"18#include "application_manager.h"
19#include "application.h"19#include "application.h"
20#include "desktopfilereader.h"20#include "applicationinfo.h"
21#include "dbuswindowstack.h"21#include "dbuswindowstack.h"
22#include "session.h"22#include "session.h"
23#include "sharedwakelock.h"23#include "sharedwakelock.h"
@@ -125,7 +125,6 @@
125 SessionAuthorizer *sessionAuthorizer = static_cast<SessionAuthorizer*>(nativeInterface->nativeResourceForIntegration("SessionAuthorizer"));125 SessionAuthorizer *sessionAuthorizer = static_cast<SessionAuthorizer*>(nativeInterface->nativeResourceForIntegration("SessionAuthorizer"));
126126
127 QSharedPointer<TaskController> taskController(new upstart::TaskController());127 QSharedPointer<TaskController> taskController(new upstart::TaskController());
128 QSharedPointer<DesktopFileReader::Factory> fileReaderFactory(new DesktopFileReader::Factory());
129 QSharedPointer<ProcInfo> procInfo(new ProcInfo());128 QSharedPointer<ProcInfo> procInfo(new ProcInfo());
130 QSharedPointer<SharedWakelock> sharedWakelock(new SharedWakelock);129 QSharedPointer<SharedWakelock> sharedWakelock(new SharedWakelock);
131 QSharedPointer<Settings> settings(new Settings());130 QSharedPointer<Settings> settings(new Settings());
@@ -139,7 +138,6 @@
139 mirServer,138 mirServer,
140 taskController,139 taskController,
141 sharedWakelock,140 sharedWakelock,
142 fileReaderFactory,
143 procInfo,141 procInfo,
144 settings142 settings
145 );143 );
@@ -178,7 +176,6 @@
178 const QSharedPointer<MirServer>& mirServer,176 const QSharedPointer<MirServer>& mirServer,
179 const QSharedPointer<TaskController>& taskController,177 const QSharedPointer<TaskController>& taskController,
180 const QSharedPointer<SharedWakelock>& sharedWakelock,178 const QSharedPointer<SharedWakelock>& sharedWakelock,
181 const QSharedPointer<DesktopFileReader::Factory>& desktopFileReaderFactory,
182 const QSharedPointer<ProcInfo>& procInfo,179 const QSharedPointer<ProcInfo>& procInfo,
183 const QSharedPointer<SettingsInterface>& settings,180 const QSharedPointer<SettingsInterface>& settings,
184 QObject *parent)181 QObject *parent)
@@ -187,7 +184,6 @@
187 , m_focusedApplication(nullptr)184 , m_focusedApplication(nullptr)
188 , m_dbusWindowStack(new DBusWindowStack(this))185 , m_dbusWindowStack(new DBusWindowStack(this))
189 , m_taskController(taskController)186 , m_taskController(taskController)
190 , m_desktopFileReaderFactory(desktopFileReaderFactory)
191 , m_procInfo(procInfo)187 , m_procInfo(procInfo)
192 , m_sharedWakelock(sharedWakelock)188 , m_sharedWakelock(sharedWakelock)
193 , m_settings(settings)189 , m_settings(settings)
@@ -383,17 +379,18 @@
383 if (application) {379 if (application) {
384 application->setArguments(arguments);380 application->setArguments(arguments);
385 } else {381 } else {
382 auto appInfo = m_taskController->getInfoForApp(appId);
383 if (!appInfo) {
384 qWarning() << "Unable to instantiate application with appId" << appId;
385 return nullptr;
386 }
387
386 application = new Application(388 application = new Application(
387 m_sharedWakelock,389 m_sharedWakelock,
388 m_desktopFileReaderFactory->createInstance(appId, m_taskController->findDesktopFileForAppId(appId)),390 appInfo,
389 arguments,391 arguments,
390 this);392 this);
391393
392 if (!application->isValid()) {
393 qWarning() << "Unable to instantiate application with appId" << appId;
394 return nullptr;
395 }
396
397 // override stage if necessary394 // override stage if necessary
398 if (application->stage() == Application::SideStage && flags.testFlag(ApplicationManager::ForceMainStage)) {395 if (application->stage() == Application::SideStage && flags.testFlag(ApplicationManager::ForceMainStage)) {
399 application->setStage(Application::MainStage);396 application->setStage(Application::MainStage);
@@ -411,17 +408,17 @@
411408
412 Application *application = findApplication(appId);409 Application *application = findApplication(appId);
413 if (!application) { // then shell did not start this application, so ubuntu-app-launch must have - add to list410 if (!application) { // then shell did not start this application, so ubuntu-app-launch must have - add to list
411 auto appInfo = m_taskController->getInfoForApp(appId);
412 if (!appInfo) {
413 qWarning() << "Unable to instantiate application with appId" << appId;
414 return;
415 }
416
414 application = new Application(417 application = new Application(
415 m_sharedWakelock,418 m_sharedWakelock,
416 m_desktopFileReaderFactory->createInstance(appId, m_taskController->findDesktopFileForAppId(appId)),419 appInfo,
417 QStringList(),420 QStringList(),
418 this);421 this);
419
420 if (!application->isValid()) {
421 qWarning() << "Unable to instantiate application with appId" << appId;
422 return;
423 }
424
425 add(application);422 add(application);
426 Q_EMIT focusRequested(appId);423 Q_EMIT focusRequested(appId);
427 }424 }
@@ -606,36 +603,27 @@
606 return;603 return;
607 }604 }
608605
609 qCDebug(QTMIR_APPLICATIONS) << "Process supplied desktop_file_hint, loading:" << desktopFileName;
610
611 // Guess appId from the desktop file hint606 // Guess appId from the desktop file hint
612 const QString appId = toShortAppIdIfPossible(desktopFileName.split('/').last().remove(QRegExp(".desktop$")));607 const QString appId = toShortAppIdIfPossible(desktopFileName.split('/').last().remove(QRegExp(".desktop$")));
613608
614 // FIXME: right now we support --desktop_file_hint=appId for historical reasons. So let's try that in609 qCDebug(QTMIR_APPLICATIONS) << "Process supplied desktop_file_hint, loading:" << appId;
615 // case we didn't get an existing .desktop file path610
616 DesktopFileReader* desktopData;611 ApplicationInfo* appInfo;
617 if (QFileInfo::exists(desktopFileName)) {612 appInfo = m_taskController->getInfoForApp(appId);
618 desktopData = m_desktopFileReaderFactory->createInstance(appId, QFileInfo(desktopFileName));613
619 } else {614 if (!appInfo) {
620 qCDebug(QTMIR_APPLICATIONS) << "Unable to find file:" << desktopFileName
621 << "so will search standard paths for one named" << appId << ".desktop";
622 desktopData = m_desktopFileReaderFactory->createInstance(appId, m_taskController->findDesktopFileForAppId(appId));
623 }
624
625 if (!desktopData->loaded()) {
626 delete desktopData;
627 qCritical() << "ApplicationManager REJECTED connection from app with pid" << pid615 qCritical() << "ApplicationManager REJECTED connection from app with pid" << pid
628 << "as the file specified by the desktop_file_hint argument could not be opened";616 << "as the app specified by the desktop_file_hint argument could not be found";
629 return;617 return;
630 }618 }
631619
632 // some naughty applications use a script to launch the actual application. Check for the620 // some naughty applications use a script to launch the actual application. Check for the
633 // case where shell actually launched the script.621 // case where shell actually launched the script.
634 Application *application = findApplication(desktopData->appId());622 Application *application = findApplication(appInfo->appId());
635 if (application && application->state() == Application::Starting) {623 if (application && application->state() == Application::Starting) {
636 qCDebug(QTMIR_APPLICATIONS) << "Process with pid" << pid << "appeared, attaching to existing entry"624 qCDebug(QTMIR_APPLICATIONS) << "Process with pid" << pid << "appeared, attaching to existing entry"
637 << "in application list with appId:" << application->appId();625 << "in application list with appId:" << application->appId();
638 delete desktopData;626 delete appInfo;
639 application->setPid(pid);627 application->setPid(pid);
640 authorized = true;628 authorized = true;
641 return;629 return;
@@ -650,12 +638,12 @@
650 }638 }
651639
652 qCDebug(QTMIR_APPLICATIONS) << "New process with pid" << pid << "appeared, adding new application to the"640 qCDebug(QTMIR_APPLICATIONS) << "New process with pid" << pid << "appeared, adding new application to the"
653 << "application list with appId:" << desktopData->appId();641 << "application list with appId:" << appInfo->appId();
654642
655 QStringList arguments(info->asStringList());643 QStringList arguments(info->asStringList());
656 application = new Application(644 application = new Application(
657 m_sharedWakelock,645 m_sharedWakelock,
658 desktopData,646 appInfo,
659 arguments,647 arguments,
660 this);648 this);
661 application->setPid(pid);649 application->setPid(pid);
@@ -742,7 +730,6 @@
742 connect(application, &Application::stageChanged, this, [this](Application::Stage) { onAppDataChanged(RoleStage); });730 connect(application, &Application::stageChanged, this, [this](Application::Stage) { onAppDataChanged(RoleStage); });
743731
744 QString appId = application->appId();732 QString appId = application->appId();
745 QString longAppId = application->longAppId();
746 QStringList arguments = application->arguments();733 QStringList arguments = application->arguments();
747734
748 // The connection is queued as a workaround an issue in the PhoneStage animation that735 // The connection is queued as a workaround an issue in the PhoneStage animation that
@@ -755,7 +742,7 @@
755 Qt::QueuedConnection);742 Qt::QueuedConnection);
756743
757 connect(application, &Application::stopProcessRequested, this, [=]() {744 connect(application, &Application::stopProcessRequested, this, [=]() {
758 if (!m_taskController->stop(application->longAppId()) && application->pid() > 0) {745 if (!m_taskController->stop(appId) && application->pid() > 0) {
759 qWarning() << "FAILED to ask Upstart to stop application with appId" << appId746 qWarning() << "FAILED to ask Upstart to stop application with appId" << appId
760 << "Sending SIGTERM to process:" << appId;747 << "Sending SIGTERM to process:" << appId;
761 kill(application->pid(), SIGTERM);748 kill(application->pid(), SIGTERM);
@@ -763,8 +750,8 @@
763 }750 }
764 });751 });
765752
766 connect(application, &Application::suspendProcessRequested, this, [=]() { m_taskController->suspend(longAppId); } );753 connect(application, &Application::suspendProcessRequested, this, [=]() { m_taskController->suspend(appId); } );
767 connect(application, &Application::resumeProcessRequested, this, [=]() { m_taskController->resume(longAppId); } );754 connect(application, &Application::resumeProcessRequested, this, [=]() { m_taskController->resume(appId); } );
768755
769 connect(application, &Application::stopped, this, [=]() {756 connect(application, &Application::stopped, this, [=]() {
770 remove(application);757 remove(application);
771758
=== modified file 'src/modules/Unity/Application/application_manager.h'
--- src/modules/Unity/Application/application_manager.h 2016-02-11 11:54:59 +0000
+++ src/modules/Unity/Application/application_manager.h 2016-03-02 00:44:09 +0000
@@ -29,7 +29,6 @@
2929
30// local30// local
31#include "application.h"31#include "application.h"
32#include "desktopfilereader.h"
33#include "taskcontroller.h"32#include "taskcontroller.h"
3433
35namespace mir {34namespace mir {
@@ -85,7 +84,6 @@
85 const QSharedPointer<MirServer> &mirServer,84 const QSharedPointer<MirServer> &mirServer,
86 const QSharedPointer<TaskController> &taskController,85 const QSharedPointer<TaskController> &taskController,
87 const QSharedPointer<SharedWakelock> &sharedWakelock,86 const QSharedPointer<SharedWakelock> &sharedWakelock,
88 const QSharedPointer<DesktopFileReader::Factory> &desktopFileReaderFactory,
89 const QSharedPointer<ProcInfo> &processInfo,87 const QSharedPointer<ProcInfo> &processInfo,
90 const QSharedPointer<SettingsInterface> &settings,88 const QSharedPointer<SettingsInterface> &settings,
91 QObject *parent = 0);89 QObject *parent = 0);
@@ -159,7 +157,6 @@
159 Application* m_focusedApplication;157 Application* m_focusedApplication;
160 DBusWindowStack* m_dbusWindowStack;158 DBusWindowStack* m_dbusWindowStack;
161 QSharedPointer<TaskController> m_taskController;159 QSharedPointer<TaskController> m_taskController;
162 QSharedPointer<DesktopFileReader::Factory> m_desktopFileReaderFactory;
163 QSharedPointer<ProcInfo> m_procInfo;160 QSharedPointer<ProcInfo> m_procInfo;
164 QSharedPointer<SharedWakelock> m_sharedWakelock;161 QSharedPointer<SharedWakelock> m_sharedWakelock;
165 QSharedPointer<SettingsInterface> m_settings;162 QSharedPointer<SettingsInterface> m_settings;
166163
=== added file 'src/modules/Unity/Application/applicationinfo.h'
--- src/modules/Unity/Application/applicationinfo.h 1970-01-01 00:00:00 +0000
+++ src/modules/Unity/Application/applicationinfo.h 2016-03-02 00:44:09 +0000
@@ -0,0 +1,59 @@
1/*
2 * Copyright (C) 2014-2015 Canonical, Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it under
5 * the terms of the GNU Lesser General Public License version 3, as published by
6 * the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10 * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 */
17
18#ifndef APPLICATION_INFO_H
19#define APPLICATION_INFO_H
20
21#include <QColor>
22#include <QObject>
23#include <QString>
24#include <QUrl>
25
26namespace qtmir
27{
28
29class ApplicationInfo : public QObject
30{
31 Q_OBJECT
32
33public:
34 ApplicationInfo(const ApplicationInfo&) = delete;
35 virtual ~ApplicationInfo() = default;
36
37 ApplicationInfo& operator=(const ApplicationInfo&) = delete;
38
39 virtual QString appId() const = 0;
40 virtual QString name() const = 0;
41 virtual QString comment() const = 0;
42 virtual QUrl icon() const = 0;
43 virtual QString splashTitle() const = 0;
44 virtual QUrl splashImage() const = 0;
45 virtual bool splashShowHeader() const = 0;
46 virtual QString splashColor() const = 0;
47 virtual QString splashColorHeader() const = 0;
48 virtual QString splashColorFooter() const = 0;
49 virtual Qt::ScreenOrientations supportedOrientations() const = 0;
50 virtual bool rotatesWindowContents() const = 0;
51 virtual bool isTouchApp() const = 0;
52
53protected:
54 ApplicationInfo() = default;
55};
56
57} // namespace qtmir
58
59#endif // APPLICATION_INFO_H
060
=== modified file 'src/modules/Unity/Application/dbuswindowstack.cpp'
--- src/modules/Unity/Application/dbuswindowstack.cpp 2015-08-11 12:08:32 +0000
+++ src/modules/Unity/Application/dbuswindowstack.cpp 2016-03-02 00:44:09 +0000
@@ -49,7 +49,7 @@
49 const Application *app = appMgr->findApplicationWithPid(pid);49 const Application *app = appMgr->findApplicationWithPid(pid);
50 if (app) {50 if (app) {
51 res.app_id = app->appId();51 res.app_id = app->appId();
52 res.desktop_file = app->desktopFile();52 res.desktop_file = "";
53 }53 }
54 return res;54 return res;
55}55}
5656
=== removed file 'src/modules/Unity/Application/desktopfilereader.cpp'
--- src/modules/Unity/Application/desktopfilereader.cpp 2015-11-19 12:55:57 +0000
+++ src/modules/Unity/Application/desktopfilereader.cpp 1970-01-01 00:00:00 +0000
@@ -1,320 +0,0 @@
1/*
2 * Copyright (C) 2013-2015 Canonical, Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it under
5 * the terms of the GNU Lesser General Public License version 3, as published by
6 * the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10 * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17// local
18#include "desktopfilereader.h"
19#include "gscopedpointer.h"
20#include "logging.h"
21
22// Qt
23#include <QFile>
24#include <QLocale>
25
26// GIO
27#include <gio/gdesktopappinfo.h>
28
29namespace qtmir
30{
31
32
33DesktopFileReader* DesktopFileReader::Factory::createInstance(const QString &appId, const QFileInfo& fi)
34{
35 return new DesktopFileReader(appId, fi);
36}
37
38typedef GObjectScopedPointer<GAppInfo> GAppInfoPointer;
39
40class DesktopFileReaderPrivate
41{
42public:
43 DesktopFileReaderPrivate(DesktopFileReader *parent):
44 q_ptr( parent )
45 {}
46
47 QString getKey(const char *key) const
48 {
49 if (!loaded()) return QString();
50
51 return QString::fromUtf8(g_desktop_app_info_get_string((GDesktopAppInfo*)appInfo.data(), key));
52 }
53
54 bool loaded() const
55 {
56 return !appInfo.isNull();
57 }
58
59 DesktopFileReader * const q_ptr;
60 Q_DECLARE_PUBLIC(DesktopFileReader)
61
62 QString appId;
63 QString file;
64 GAppInfoPointer appInfo; // GAppInfo is actually implemented by GDesktopAppInfo
65};
66
67
68DesktopFileReader::DesktopFileReader(const QString &appId, const QFileInfo &desktopFile)
69 : d_ptr(new DesktopFileReaderPrivate(this))
70{
71 Q_D(DesktopFileReader);
72 qCDebug(QTMIR_APPLICATIONS) << "Loading desktop file" << desktopFile.absoluteFilePath()
73 << "for appId" << appId;
74
75 d->appId = appId;
76 d->file = desktopFile.absoluteFilePath();
77 d->appInfo.reset((GAppInfo*) g_desktop_app_info_new_from_filename(d->file.toUtf8().constData()));
78
79 if (!d->loaded()) {
80 if (!desktopFile.exists()) {
81 qCWarning(QTMIR_APPLICATIONS) << "Desktop file for appId:" << appId << "at:" << d->file
82 << "does not exist";
83 } else {
84 qCWarning(QTMIR_APPLICATIONS) << "Desktop file for appId:" << appId << "at:" << d->file
85 << "is not valid - check its syntax, and that the binary specified"
86 << "by the Exec line is installed!";
87 }
88 }
89}
90
91DesktopFileReader::~DesktopFileReader()
92{
93 delete d_ptr;
94}
95
96QString DesktopFileReader::file() const
97{
98 Q_D(const DesktopFileReader);
99 return d->file;
100}
101
102QString DesktopFileReader::appId() const
103{
104 Q_D(const DesktopFileReader);
105 return d->appId;
106}
107
108QString DesktopFileReader::name() const
109{
110 Q_D(const DesktopFileReader);
111 if (!d->loaded()) return QString();
112
113 return QString::fromUtf8(g_app_info_get_name(d->appInfo.data()));
114}
115
116QString DesktopFileReader::comment() const
117{
118 Q_D(const DesktopFileReader);
119 if (!d->loaded()) return QString();
120
121 return QString::fromUtf8(g_app_info_get_description(d->appInfo.data()));
122}
123
124QString DesktopFileReader::icon() const
125{
126 Q_D(const DesktopFileReader);
127 return d->getKey("Icon");
128}
129
130QString DesktopFileReader::exec() const
131{
132 Q_D(const DesktopFileReader);
133 if (!d->loaded()) return QString();
134
135 return QString::fromUtf8(g_app_info_get_commandline(d->appInfo.data()));
136}
137
138QString DesktopFileReader::path() const
139{
140 Q_D(const DesktopFileReader);
141 return d->getKey("Path");
142}
143
144QString DesktopFileReader::stageHint() const
145{
146 Q_D(const DesktopFileReader);
147 return d->getKey("X-Ubuntu-StageHint");
148}
149
150QString DesktopFileReader::splashTitle() const
151{
152 Q_D(const DesktopFileReader);
153 if (!d->loaded()) return QString();
154
155 /* Sadly GDesktopAppInfo only considers Name, GenericName, Comments and Keywords to be keys
156 * which can have locale-specific entries. So we need to work to make X-Ubuntu-Splash-Title
157 * locale-aware, by generating a locale-correct key name and seeing if that exists. If yes,
158 * get the value and return it. Else fallback to the non-localized value.
159 */
160 GDesktopAppInfo *info = (GDesktopAppInfo*)d->appInfo.data();
161 QLocale defaultLocale;
162 QStringList locales = defaultLocale.uiLanguages();
163
164 QString keyTemplate("X-Ubuntu-Splash-Title[%1]");
165 for (QString locale: locales) {
166 // Desktop files use local specifiers with underscore separators but Qt uses hyphens
167 locale = locale.replace('-', '_');
168 const char* key = keyTemplate.arg(locale).toUtf8().constData();
169 if (g_desktop_app_info_has_key(info, key)) {
170 return d->getKey(key);
171 }
172 }
173
174 // Fallback to the non-localized string, if available
175 return d->getKey("X-Ubuntu-Splash-Title");
176}
177
178QString DesktopFileReader::splashImage() const
179{
180 Q_D(const DesktopFileReader);
181 return d->getKey("X-Ubuntu-Splash-Image");
182}
183
184QString DesktopFileReader::splashShowHeader() const
185{
186 Q_D(const DesktopFileReader);
187 return d->getKey("X-Ubuntu-Splash-Show-Header");
188}
189
190QString DesktopFileReader::splashColor() const
191{
192 Q_D(const DesktopFileReader);
193 return d->getKey("X-Ubuntu-Splash-Color");
194}
195
196QString DesktopFileReader::splashColorHeader() const
197{
198 Q_D(const DesktopFileReader);
199 return d->getKey("X-Ubuntu-Splash-Color-Header");
200}
201
202QString DesktopFileReader::splashColorFooter() const
203{
204 Q_D(const DesktopFileReader);
205 return d->getKey("X-Ubuntu-Splash-Color-Footer");
206}
207
208Qt::ScreenOrientations DesktopFileReader::supportedOrientations() const
209{
210 Q_D(const DesktopFileReader);
211 Qt::ScreenOrientations result;
212
213 if (!parseOrientations(d->getKey("X-Ubuntu-Supported-Orientations"), result)) {
214 qCWarning(QTMIR_APPLICATIONS) << d->file << "has an invalid X-Ubuntu-Supported-Orientations entry.";
215 }
216
217 return result;
218}
219
220bool DesktopFileReader::rotatesWindowContents() const
221{
222 Q_D(const DesktopFileReader);
223 bool result;
224
225 if (!parseBoolean(d->getKey("X-Ubuntu-Rotates-Window-Contents"), result)) {
226 qCWarning(QTMIR_APPLICATIONS) << d->file << "has an invalid X-Ubuntu-Rotates-Window-Contents entry.";
227 }
228
229 return result;
230}
231
232bool DesktopFileReader::isTouchApp() const
233{
234 Q_D(const DesktopFileReader);
235 bool result;
236
237 if (!parseBoolean(d->getKey("X-Ubuntu-Touch"), result)) {
238 qCWarning(QTMIR_APPLICATIONS) << d->file << "has an invalid X-Ubuntu-Touch entry.";
239 }
240
241 return result;
242}
243
244bool DesktopFileReader::parseOrientations(const QString &rawString, Qt::ScreenOrientations &result)
245{
246 // Default to all orientations
247 result = Qt::PortraitOrientation | Qt::LandscapeOrientation
248 | Qt::InvertedPortraitOrientation | Qt::InvertedLandscapeOrientation;
249
250 if (rawString.isEmpty()) {
251 return true;
252 }
253
254 Qt::ScreenOrientations parsedOrientations = 0;
255 bool ok = true;
256
257 QStringList orientationsList = rawString
258 .simplified()
259 .replace(QChar(','), ";")
260 .remove(QChar(' '))
261 .remove(QChar('-'))
262 .remove(QChar('_'))
263 .toLower()
264 .split(";");
265
266 for (int i = 0; i < orientationsList.count() && ok; ++i) {
267 const QString &orientationString = orientationsList.at(i);
268 if (orientationString.isEmpty()) {
269 // skip it
270 continue;
271 }
272
273 if (orientationString == "portrait") {
274 parsedOrientations |= Qt::PortraitOrientation;
275 } else if (orientationString == "landscape") {
276 parsedOrientations |= Qt::LandscapeOrientation;
277 } else if (orientationString == "invertedportrait") {
278 parsedOrientations |= Qt::InvertedPortraitOrientation;
279 } else if (orientationString == "invertedlandscape") {
280 parsedOrientations |= Qt::InvertedLandscapeOrientation;
281 } else if (orientationsList.count() == 1 && orientationString == "primary") {
282 // Special case: primary orientation must be alone
283 // There's no sense in supporting primary orientation + other orientations
284 // like "primary,landscape"
285 parsedOrientations = Qt::PrimaryOrientation;
286 } else {
287 ok = false;
288 }
289 }
290
291 if (ok) {
292 result = parsedOrientations;
293 }
294
295 return ok;
296}
297
298bool DesktopFileReader::parseBoolean(const QString &rawString, bool &result)
299{
300 QString cookedString = rawString.trimmed().toLower();
301
302 result = cookedString == "y"
303 || cookedString == "1"
304 || cookedString == "yes"
305 || cookedString == "true";
306
307 return result || rawString.isEmpty()
308 || cookedString == "n"
309 || cookedString == "0"
310 || cookedString == "no"
311 || cookedString == "false";
312}
313
314bool DesktopFileReader::loaded() const
315{
316 Q_D(const DesktopFileReader);
317 return d->loaded();
318}
319
320} // namespace qtmir
3210
=== removed file 'src/modules/Unity/Application/desktopfilereader.h'
--- src/modules/Unity/Application/desktopfilereader.h 2015-09-28 20:11:39 +0000
+++ src/modules/Unity/Application/desktopfilereader.h 1970-01-01 00:00:00 +0000
@@ -1,78 +0,0 @@
1/*
2 * Copyright (C) 2013-2015 Canonical, Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it under
5 * the terms of the GNU Lesser General Public License version 3, as published by
6 * the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10 * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#ifndef DESKTOPFILEREADER_H
18#define DESKTOPFILEREADER_H
19
20#include <QString>
21#include <QFileInfo>
22
23namespace qtmir
24{
25
26class DesktopFileReaderPrivate;
27class DesktopFileReader {
28public:
29 class Factory
30 {
31 public:
32 Factory() = default;
33 virtual ~Factory() = default;
34
35 Factory(const Factory&) = delete;
36
37 Factory& operator=(const Factory&) = delete;
38
39 virtual DesktopFileReader* createInstance(const QString &appId, const QFileInfo& fi);
40 };
41
42 virtual ~DesktopFileReader();
43
44 virtual QString file() const;
45 virtual QString appId() const;
46 virtual QString name() const;
47 virtual QString comment() const;
48 virtual QString icon() const;
49 virtual QString exec() const;
50 virtual QString path() const;
51 virtual QString stageHint() const;
52 virtual QString splashTitle() const;
53 virtual QString splashImage() const;
54 virtual QString splashShowHeader() const;
55 virtual QString splashColor() const;
56 virtual QString splashColorHeader() const;
57 virtual QString splashColorFooter() const;
58 virtual Qt::ScreenOrientations supportedOrientations() const;
59 virtual bool rotatesWindowContents() const;
60 virtual bool isTouchApp() const;
61 virtual bool loaded() const;
62
63 static bool parseOrientations(const QString &rawString, Qt::ScreenOrientations &result);
64 static bool parseBoolean(const QString &rawString, bool &result);
65
66protected:
67 DesktopFileReader() : d_ptr(nullptr) {}
68 DesktopFileReader(const QString &appId, const QFileInfo &desktopFile);
69
70 DesktopFileReaderPrivate * const d_ptr;
71
72private:
73 Q_DECLARE_PRIVATE(DesktopFileReader)
74};
75
76} // namespace qtmir
77
78#endif // DESKTOPFILEREADER_H
790
=== modified file 'src/modules/Unity/Application/taskcontroller.h'
--- src/modules/Unity/Application/taskcontroller.h 2016-02-11 11:52:06 +0000
+++ src/modules/Unity/Application/taskcontroller.h 2016-03-02 00:44:09 +0000
@@ -21,11 +21,12 @@
21#include <QObject>21#include <QObject>
22#include <QString>22#include <QString>
23#include <QStringList>23#include <QStringList>
24#include <QFileInfo>
2524
26namespace qtmir25namespace qtmir
27{26{
2827
28class ApplicationInfo;
29
29class TaskController : public QObject30class TaskController : public QObject
30{31{
31 Q_OBJECT32 Q_OBJECT
@@ -42,7 +43,6 @@
4243
43 TaskController& operator=(const TaskController&) = delete;44 TaskController& operator=(const TaskController&) = delete;
4445
45 virtual pid_t primaryPidForAppId(const QString &appId) = 0;
46 virtual bool appIdHasProcessId(const QString &appId, pid_t pid) = 0;46 virtual bool appIdHasProcessId(const QString &appId, pid_t pid) = 0;
4747
48 virtual bool stop(const QString &appId) = 0;48 virtual bool stop(const QString &appId) = 0;
@@ -51,7 +51,7 @@
51 virtual bool suspend(const QString &appId) = 0;51 virtual bool suspend(const QString &appId) = 0;
52 virtual bool resume(const QString &appId) = 0;52 virtual bool resume(const QString &appId) = 0;
5353
54 virtual QFileInfo findDesktopFileForAppId(const QString &appId) const = 0;54 virtual qtmir::ApplicationInfo *getInfoForApp(const QString &appId) const = 0;
5555
56Q_SIGNALS:56Q_SIGNALS:
57 void processStarting(const QString &appId);57 void processStarting(const QString &appId);
5858
=== added file 'src/modules/Unity/Application/upstart/applicationinfo.cpp'
--- src/modules/Unity/Application/upstart/applicationinfo.cpp 1970-01-01 00:00:00 +0000
+++ src/modules/Unity/Application/upstart/applicationinfo.cpp 2016-03-02 00:44:09 +0000
@@ -0,0 +1,109 @@
1/*
2 * Copyright (C) 2014,2015 Canonical, Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it under
5 * the terms of the GNU Lesser General Public License version 3, as published by
6 * the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10 * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 */
17
18#include "applicationinfo.h"
19
20namespace qtmir
21{
22namespace upstart
23{
24
25ApplicationInfo::ApplicationInfo(const QString &appId, std::shared_ptr<ubuntu::app_launch::Application::Info> info)
26 : qtmir::ApplicationInfo(),
27 m_appId(appId),
28 m_info(info)
29{
30}
31
32QString ApplicationInfo::appId() const
33{
34 return m_appId;
35}
36
37QString ApplicationInfo::name() const
38{
39 return QString::fromStdString(m_info->name().value());
40}
41
42QString ApplicationInfo::comment() const
43{
44 return QString::fromStdString(m_info->description().value());
45}
46
47QUrl ApplicationInfo::icon() const
48{
49 return QUrl::fromLocalFile(QString::fromStdString(m_info->iconPath().value()));
50}
51
52QString ApplicationInfo::splashTitle() const
53{
54 return QString::fromStdString(m_info->splash().title.value());
55}
56
57QUrl ApplicationInfo::splashImage() const
58{
59 return QUrl::fromLocalFile(QString::fromStdString(m_info->splash().image.value()));
60}
61
62bool ApplicationInfo::splashShowHeader() const
63{
64 return m_info->splash().showHeader.value();
65}
66
67QString ApplicationInfo::splashColor() const
68{
69 return QString::fromStdString(m_info->splash().backgroundColor.value());
70}
71
72QString ApplicationInfo::splashColorHeader() const
73{
74 return QString::fromStdString(m_info->splash().headerColor.value());
75}
76
77QString ApplicationInfo::splashColorFooter() const
78{
79 return QString::fromStdString(m_info->splash().footerColor.value());
80}
81
82Qt::ScreenOrientations ApplicationInfo::supportedOrientations() const
83{
84 Qt::ScreenOrientations response = 0;
85 auto orientations = m_info->supportedOrientations();
86 if (orientations.portrait)
87 response |= Qt::PortraitOrientation;
88 if (orientations.landscape)
89 response |= Qt::LandscapeOrientation;
90 if (orientations.invertedPortrait)
91 response |= Qt::InvertedPortraitOrientation;
92 if (orientations.invertedLandscape)
93 response |= Qt::InvertedLandscapeOrientation;
94 return response;
95}
96
97bool ApplicationInfo::rotatesWindowContents() const
98{
99 return m_info->rotatesWindowContents().value();
100}
101
102
103bool ApplicationInfo::isTouchApp() const
104{
105 return m_info->supportsUbuntuLifecycle().value();
106}
107
108} // namespace upstart
109} // namespace qtmir
0110
=== added file 'src/modules/Unity/Application/upstart/applicationinfo.h'
--- src/modules/Unity/Application/upstart/applicationinfo.h 1970-01-01 00:00:00 +0000
+++ src/modules/Unity/Application/upstart/applicationinfo.h 2016-03-02 00:44:09 +0000
@@ -0,0 +1,57 @@
1/*
2 * Copyright (C) 2013 Canonical, Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it under
5 * the terms of the GNU Lesser General Public License version 3, as published by
6 * the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10 * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 */
17
18#ifndef UPSTART_APPLICATION_INFO_H
19#define UPSTART_APPLICATION_INFO_H
20
21#include "../applicationinfo.h"
22
23#include <ubuntu-app-launch/application.h>
24
25namespace qtmir
26{
27namespace upstart
28{
29
30class ApplicationInfo : public qtmir::ApplicationInfo
31{
32public:
33 ApplicationInfo(const QString &appId, std::shared_ptr<ubuntu::app_launch::Application::Info> info);
34
35 QString appId() const override;
36 QString name() const override;
37 QString comment() const override;
38 QUrl icon() const override;
39 QString splashTitle() const override;
40 QUrl splashImage() const override;
41 bool splashShowHeader() const override;
42 QString splashColor() const override;
43 QString splashColorHeader() const override;
44 QString splashColorFooter() const override;
45 Qt::ScreenOrientations supportedOrientations() const override;
46 bool rotatesWindowContents() const override;
47 bool isTouchApp() const override;
48
49private:
50 QString m_appId;
51 std::shared_ptr<ubuntu::app_launch::Application::Info> m_info;
52};
53
54} // namespace upstart
55} // namespace qtmir
56
57#endif // UPSTART_APPLICATION_INFO_H
058
=== modified file 'src/modules/Unity/Application/upstart/taskcontroller.cpp'
--- src/modules/Unity/Application/upstart/taskcontroller.cpp 2016-02-11 11:52:06 +0000
+++ src/modules/Unity/Application/upstart/taskcontroller.cpp 2016-03-02 00:44:09 +0000
@@ -15,6 +15,7 @@
15 *15 *
16 */16 */
1717
18#include "applicationinfo.h"
18#include "taskcontroller.h"19#include "taskcontroller.h"
1920
20// qtmir21// qtmir
@@ -27,6 +28,9 @@
27extern "C" {28extern "C" {
28 #include "ubuntu-app-launch.h"29 #include "ubuntu-app-launch.h"
29}30}
31#include <ubuntu-app-launch/registry.h>
32
33namespace ual = ubuntu::app_launch;
3034
31namespace qtmir35namespace qtmir
32{36{
@@ -35,6 +39,7 @@
3539
36struct TaskController::Private40struct TaskController::Private
37{41{
42 std::shared_ptr<ual::Registry> registry;
38 UbuntuAppLaunchAppObserver preStartCallback = nullptr;43 UbuntuAppLaunchAppObserver preStartCallback = nullptr;
39 UbuntuAppLaunchAppObserver startedCallback = nullptr;44 UbuntuAppLaunchAppObserver startedCallback = nullptr;
40 UbuntuAppLaunchAppObserver stopCallback = nullptr;45 UbuntuAppLaunchAppObserver stopCallback = nullptr;
@@ -63,39 +68,14 @@
63 }68 }
64}69}
6570
66/**71std::shared_ptr<ual::Application> createApp(const QString &inputAppId, std::shared_ptr<ual::Registry> registry)
67 * @brief toLongAppIdIfPossible72{
68 * @param shortAppId - any string that you think is a short appId73 auto appId = ual::AppID::find(inputAppId.toStdString());
69 * @return if valid short appId was input, the corresponding long appId is returned. If a long appId was74 if (appId.empty()) {
70 * entered, it is returned unchanged. Anything else is also returned unchanged.75 qCDebug(QTMIR_APPLICATIONS) << "ApplicationController::createApp could not find appId" << inputAppId;
71 */76 return {};
72QString toLongAppIdIfPossible(const QString &shortAppId) {
73 if (ubuntu_app_launch_app_id_parse(shortAppId.toLatin1().constData(), nullptr, nullptr, nullptr)) {
74 // then we got a long appId after all, just return it
75 return shortAppId;
76 } else {
77 // try to parse the string in the form "$package_$application"
78 QRegExp shortAppIdMask("[a-z0-9][a-z0-9+.-]+_[a-zA-Z0-9+.-]+");
79 if (!shortAppIdMask.exactMatch(shortAppId)) {
80 // input string not a short appId, so just return it unchanged
81 return shortAppId;
82 }
83
84 // ask upstart for the long appId corresponding to this short appId
85 QStringList parts = shortAppId.split("_");
86 gchar *longAppId;
87 longAppId = ubuntu_app_launch_triplet_to_app_id(parts.first().toLatin1().constData(),
88 parts.last().toLatin1().constData(),
89 nullptr);
90 if (longAppId == nullptr) {
91 // was unable to construct a long appId from the short appId, return input unchanged
92 return shortAppId;
93 } else {
94 QString appId(longAppId);
95 g_free(longAppId);
96 return appId;
97 }
98 }77 }
78 return ual::Application::create(appId, registry);
99}79}
10080
101} // namespace81} // namespace
@@ -104,6 +84,8 @@
104 : qtmir::TaskController(),84 : qtmir::TaskController(),
105 impl(new Private())85 impl(new Private())
106{86{
87 impl->registry = std::make_shared<ual::Registry>();
88
107 impl->preStartCallback = [](const gchar * appId, gpointer userData) {89 impl->preStartCallback = [](const gchar * appId, gpointer userData) {
108 auto thiz = static_cast<TaskController*>(userData);90 auto thiz = static_cast<TaskController*>(userData);
109 Q_EMIT(thiz->processStarting(toShortAppIdIfPossible(appId)));91 Q_EMIT(thiz->processStarting(toShortAppIdIfPossible(appId)));
@@ -166,91 +148,91 @@
166 ubuntu_app_launch_observer_delete_app_failed(impl->failureCallback, this);148 ubuntu_app_launch_observer_delete_app_failed(impl->failureCallback, this);
167}149}
168150
169pid_t TaskController::primaryPidForAppId(const QString& appId)
170{
171 GPid pid = ubuntu_app_launch_get_primary_pid(toLongAppIdIfPossible(appId).toLatin1().constData());
172 if (!pid)
173 qDebug() << "TaskController::primaryPidForAppId FAILED to get PID for appId=" << appId;
174
175 return pid;
176}
177
178bool TaskController::appIdHasProcessId(const QString& appId, pid_t pid)151bool TaskController::appIdHasProcessId(const QString& appId, pid_t pid)
179{152{
180 return ubuntu_app_launch_pid_in_app_id(pid, toLongAppIdIfPossible(appId).toLatin1().constData());153 auto app = createApp(appId, impl->registry);
154 if (!app) {
155 return false;
156 }
157
158 for (auto &instance: app->instances()) {
159 if (instance->hasPid(pid)) {
160 return true;
161 }
162 }
163
164 return false;
181}165}
182166
183bool TaskController::stop(const QString& appId)167bool TaskController::stop(const QString& appId)
184{168{
185 auto result = ubuntu_app_launch_stop_application(toLongAppIdIfPossible(appId).toLatin1().constData());169 auto app = createApp(appId, impl->registry);
186 if (!result)170 if (!app) {
187 qDebug() << "TaskController::stopApplication FAILED to stop appId=" << appId;171 return false;
188172 }
189 return result;173
174 for (auto &instance: app->instances()) {
175 instance->stop();
176 }
177
178 return true;
190}179}
191180
192bool TaskController::start(const QString& appId, const QStringList& arguments)181bool TaskController::start(const QString& appId, const QStringList& arguments)
193{182{
183 auto app = createApp(appId, impl->registry);
184 if (!app) {
185 return false;
186 }
187
194 // Convert arguments QStringList into format suitable for ubuntu-app-launch188 // Convert arguments QStringList into format suitable for ubuntu-app-launch
195 // The last item should be null, which is done by g_new0, we just don't fill it.189 std::vector<ual::Application::URL> urls;
196 auto upstartArgs = g_new0(gchar *, arguments.length() + 1);190 for (auto &arg: arguments) {
197191 urls.emplace_back(ual::Application::URL::from_raw(arg.toStdString()));
198 for (int i=0; i<arguments.length(); i++) {
199 upstartArgs[i] = g_strdup(arguments.at(i).toUtf8().data());
200 }192 }
201193
202 auto result = ubuntu_app_launch_start_application(194 app->launch(urls);
203 toLongAppIdIfPossible(appId).toLatin1().constData(),195
204 static_cast<const gchar * const *>(upstartArgs));196 return true;
205
206 g_strfreev(upstartArgs);
207
208 if (!result)
209 qDebug() << "TaskController::start FAILED to start appId" << appId;
210
211 return result;
212}197}
213198
214bool TaskController::suspend(const QString& appId)199bool TaskController::suspend(const QString& appId)
215{200{
216 auto result = ubuntu_app_launch_pause_application(toLongAppIdIfPossible(appId).toLatin1().constData());201 auto app = createApp(appId, impl->registry);
217 if (!result)202 if (!app) {
218 qDebug() << "TaskController::pauseApplication FAILED to pause appId=" << appId;203 return false;
219204 }
220 return result;205
206 for (auto &instance: app->instances()) {
207 instance->pause();
208 }
209
210 return true;
221}211}
222212
223bool TaskController::resume(const QString& appId)213bool TaskController::resume(const QString& appId)
224{214{
225 auto result = ubuntu_app_launch_resume_application(toLongAppIdIfPossible(appId).toLatin1().constData());215 auto app = createApp(appId, impl->registry);
226 if (!result)216 if (!app) {
227 qDebug() << "TaskController::resumeApplication FAILED to resume appId=" << appId;217 return false;
228218 }
229 return result;219
220 for (auto &instance: app->instances()) {
221 instance->resume();
222 }
223
224 return true;
230}225}
231226
232227qtmir::ApplicationInfo *TaskController::getInfoForApp(const QString &appId) const
233QFileInfo TaskController::findDesktopFileForAppId(const QString &appId) const
234{228{
235 qCDebug(QTMIR_APPLICATIONS) << "TaskController::desktopFilePathForAppId - appId=" << appId;229 auto app = createApp(appId, impl->registry);
236230 if (!app || !app->info()) {
237 // Search for the correct desktop file using a simple heuristic231 return nullptr;
238 int dashPos = -1;232 }
239 QString helper = toLongAppIdIfPossible(appId);233
240 QString desktopFile;234 QString shortAppId = toShortAppIdIfPossible(QString::fromStdString(std::string(app->appId())));
241235 return new qtmir::upstart::ApplicationInfo(shortAppId, app->info());
242 do {
243 if (dashPos != -1) {
244 helper = helper.replace(dashPos, 1, '/');
245 }
246
247 desktopFile = QStandardPaths::locate(QStandardPaths::ApplicationsLocation, QString("%1.desktop").arg(helper));
248 if (!desktopFile.isEmpty()) return desktopFile;
249
250 dashPos = helper.indexOf("-");
251 } while (dashPos != -1);
252
253 return QFileInfo();
254}236}
255237
256} // namespace upstart238} // namespace upstart
257239
=== modified file 'src/modules/Unity/Application/upstart/taskcontroller.h'
--- src/modules/Unity/Application/upstart/taskcontroller.h 2016-02-11 11:52:06 +0000
+++ src/modules/Unity/Application/upstart/taskcontroller.h 2016-03-02 00:44:09 +0000
@@ -31,7 +31,6 @@
31 TaskController();31 TaskController();
32 ~TaskController();32 ~TaskController();
3333
34 pid_t primaryPidForAppId(const QString& appId) override;
35 bool appIdHasProcessId(const QString& appId, pid_t pid) override;34 bool appIdHasProcessId(const QString& appId, pid_t pid) override;
3635
37 bool stop(const QString& appId) override;36 bool stop(const QString& appId) override;
@@ -40,7 +39,7 @@
40 bool suspend(const QString& appId) override;39 bool suspend(const QString& appId) override;
41 bool resume(const QString& appId) override;40 bool resume(const QString& appId) override;
4241
43 QFileInfo findDesktopFileForAppId(const QString &appId) const override;42 qtmir::ApplicationInfo *getInfoForApp(const QString &appId) const override;
4443
45private:44private:
46 struct Private;45 struct Private;
4746
=== modified file 'tests/framework/CMakeLists.txt'
--- tests/framework/CMakeLists.txt 2016-02-11 11:52:06 +0000
+++ tests/framework/CMakeLists.txt 2016-03-02 00:44:09 +0000
@@ -10,11 +10,10 @@
10)10)
1111
12set(QTMIR_TEST_PRIVATE_SRC12set(QTMIR_TEST_PRIVATE_SRC
13 fake_desktopfilereader.cpp13 fake_application_info.cpp
14 fake_mirsurface.cpp14 fake_mirsurface.cpp
15 fake_session.cpp15 fake_session.cpp
16 mock_task_controller.cpp16 mock_application_info.cpp
17 mock_desktop_file_reader.cpp
18 mock_display.cpp17 mock_display.cpp
19 mock_display_configuration.cpp18 mock_display_configuration.cpp
20 mock_gl_display_buffer.cpp19 mock_gl_display_buffer.cpp
@@ -28,6 +27,7 @@
28 mock_settings.cpp27 mock_settings.cpp
29 mock_shared_wakelock.cpp28 mock_shared_wakelock.cpp
30 mock_surface.cpp29 mock_surface.cpp
30 mock_task_controller.cpp
31 stub_input_channel.cpp31 stub_input_channel.cpp
32 stub_scene_surface.cpp32 stub_scene_surface.cpp
33 qtmir_test.cpp33 qtmir_test.cpp
3434
=== renamed file 'tests/framework/fake_desktopfilereader.cpp' => 'tests/framework/fake_application_info.cpp'
--- tests/framework/fake_desktopfilereader.cpp 2016-02-11 11:52:06 +0000
+++ tests/framework/fake_application_info.cpp 2016-03-02 00:44:09 +0000
@@ -14,63 +14,53 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */15 */
1616
17#include "fake_desktopfilereader.h"17#include "fake_application_info.h"
1818
19#include <QDebug>19#include <QDebug>
2020
21namespace qtmir21namespace qtmir
22{22{
2323
24FakeDesktopFileReader::FakeDesktopFileReader(const QString &appId)24FakeApplicationInfo::FakeApplicationInfo(const QString &appId)
25 : DesktopFileReader()25 : ApplicationInfo()
26 , m_appId(appId)26 , m_appId(appId)
27{27{
28}28}
2929
30FakeDesktopFileReader::FakeDesktopFileReader()30FakeApplicationInfo::FakeApplicationInfo()
31 : DesktopFileReader()31 : ApplicationInfo()
32 , m_appId("foo-app")32 , m_appId("foo-app")
33{33{
34}34}
3535
36FakeDesktopFileReader::~FakeDesktopFileReader()36FakeApplicationInfo::~FakeApplicationInfo()
37{37{
38}38}
3939
40QString FakeDesktopFileReader::file() const { return m_appId + ".desktop"; }40QString FakeApplicationInfo::appId() const { return m_appId; }
4141
42QString FakeDesktopFileReader::appId() const { return m_appId; }42QString FakeApplicationInfo::name() const { return QString(); }
4343
44QString FakeDesktopFileReader::name() const { return QString(); }44QString FakeApplicationInfo::comment() const { return QString(); }
4545
46QString FakeDesktopFileReader::comment() const { return QString(); }46QUrl FakeApplicationInfo::icon() const { return QUrl(); }
4747
48QString FakeDesktopFileReader::icon() const { return QString(); }48QString FakeApplicationInfo::splashTitle() const { return QString(); }
4949
50QString FakeDesktopFileReader::exec() const { return QString(); }50QUrl FakeApplicationInfo::splashImage() const { return QUrl(); }
5151
52QString FakeDesktopFileReader::path() const { return QString(); }52bool FakeApplicationInfo::splashShowHeader() const { return false; }
5353
54QString FakeDesktopFileReader::stageHint() const { return QString(); }54QString FakeApplicationInfo::splashColor() const { return QString(); }
5555
56QString FakeDesktopFileReader::splashTitle() const { return QString(); }56QString FakeApplicationInfo::splashColorHeader() const { return QString(); }
5757
58QString FakeDesktopFileReader::splashImage() const { return QString(); }58QString FakeApplicationInfo::splashColorFooter() const { return QString(); }
5959
60QString FakeDesktopFileReader::splashShowHeader() const { return QString(); }60Qt::ScreenOrientations FakeApplicationInfo::supportedOrientations() const { return Qt::PortraitOrientation; }
6161
62QString FakeDesktopFileReader::splashColor() const { return QString(); }62bool FakeApplicationInfo::rotatesWindowContents() const { return false; }
6363
64QString FakeDesktopFileReader::splashColorHeader() const { return QString(); }64bool FakeApplicationInfo::isTouchApp() const { return true; }
65
66QString FakeDesktopFileReader::splashColorFooter() const { return QString(); }
67
68Qt::ScreenOrientations FakeDesktopFileReader::supportedOrientations() const { return Qt::PortraitOrientation; }
69
70bool FakeDesktopFileReader::rotatesWindowContents() const { return false; }
71
72bool FakeDesktopFileReader::isTouchApp() const { return true; }
73
74bool FakeDesktopFileReader::loaded() const { return true; }
7565
76} // namespace qtmir66} // namespace qtmir
7767
=== renamed file 'tests/framework/fake_desktopfilereader.h' => 'tests/framework/fake_application_info.h'
--- tests/framework/fake_desktopfilereader.h 2016-02-11 11:52:06 +0000
+++ tests/framework/fake_application_info.h 2016-03-02 00:44:09 +0000
@@ -1,5 +1,5 @@
1/*1/*
2 * Copyright (C) 2015 Canonical, Ltd.2 * Copyright (C) 2015,2016 Canonical, Ltd.
3 *3 *
4 * This program is free software: you can redistribute it and/or modify it under4 * This program is free software: you can redistribute it and/or modify it under
5 * the terms of the GNU Lesser General Public License version 3, as published by5 * the terms of the GNU Lesser General Public License version 3, as published by
@@ -14,42 +14,37 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */15 */
1616
17#ifndef FAKE_DESKTOPFILEREADER_H17#ifndef FAKE_APPLICATION_INFO_H
18#define FAKE_DESKTOPFILEREADER_H18#define FAKE_APPLICATION_INFO_H
1919
20#include <Unity/Application/desktopfilereader.h>20#include <Unity/Application/applicationinfo.h>
2121
22namespace qtmir {22namespace qtmir {
2323
24class FakeDesktopFileReader : public qtmir::DesktopFileReader24class FakeApplicationInfo : public ApplicationInfo
25{25{
26public:26public:
27 FakeDesktopFileReader(const QString &appId);27 FakeApplicationInfo(const QString &appId);
28 FakeDesktopFileReader();28 FakeApplicationInfo();
29 virtual ~FakeDesktopFileReader();29 virtual ~FakeApplicationInfo();
3030
31 QString file() const override;
32 QString appId() const override;31 QString appId() const override;
33 QString name() const override;32 QString name() const override;
34 QString comment() const override;33 QString comment() const override;
35 QString icon() const override;34 QUrl icon() const override;
36 QString exec() const override;
37 QString path() const override;
38 QString stageHint() const override;
39 QString splashTitle() const override;35 QString splashTitle() const override;
40 QString splashImage() const override;36 QUrl splashImage() const override;
41 QString splashShowHeader() const override;37 bool splashShowHeader() const override;
42 QString splashColor() const override;38 QString splashColor() const override;
43 QString splashColorHeader() const override;39 QString splashColorHeader() const override;
44 QString splashColorFooter() const override;40 QString splashColorFooter() const override;
45 Qt::ScreenOrientations supportedOrientations() const override;41 Qt::ScreenOrientations supportedOrientations() const override;
46 bool rotatesWindowContents() const override;42 bool rotatesWindowContents() const override;
47 bool isTouchApp() const override;43 bool isTouchApp() const override;
48 bool loaded() const override;
4944
50 QString m_appId;45 QString m_appId;
51};46};
5247
53} // namespace qtmir48} // namespace qtmir
5449
55#endif // FAKE_DESKTOPFILEREADER_H50#endif // FAKE_APPLICATION_INFO_H
5651
=== renamed file 'tests/framework/mock_desktop_file_reader.cpp' => 'tests/framework/mock_application_info.cpp'
--- tests/framework/mock_desktop_file_reader.cpp 2015-11-11 10:43:36 +0000
+++ tests/framework/mock_application_info.cpp 2016-03-02 00:44:09 +0000
@@ -14,104 +14,33 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */15 */
1616
17#include "mock_desktop_file_reader.h"17#include "mock_application_info.h"
1818
19namespace qtmir19namespace qtmir
20{20{
2121
22MockDesktopFileReader::MockDesktopFileReader(const QString &appId, const QFileInfo &fileInfo)22MockApplicationInfo::MockApplicationInfo(const QString &appId)
23 : DesktopFileReader(appId, fileInfo)23 : ApplicationInfo()
24{24{
25 using namespace ::testing;25 using namespace ::testing;
2626
27 ON_CALL(*this, file()).WillByDefault(Invoke(this, &MockDesktopFileReader::doFile));27 ON_CALL(*this, appId()).WillByDefault(Return(appId));
28 ON_CALL(*this, appId()).WillByDefault(Invoke(this, &MockDesktopFileReader::doAppId));28 ON_CALL(*this, name()).WillByDefault(Return(QString()));
29 ON_CALL(*this, name()).WillByDefault(Invoke(this, &MockDesktopFileReader::doName));29 ON_CALL(*this, comment()).WillByDefault(Return(QString()));
30 ON_CALL(*this, comment()).WillByDefault(Invoke(this, &MockDesktopFileReader::doComment));30 ON_CALL(*this, icon()).WillByDefault(Return(QUrl()));
31 ON_CALL(*this, icon()).WillByDefault(Invoke(this, &MockDesktopFileReader::doIcon));31 ON_CALL(*this, splashTitle()).WillByDefault(Return(QString()));
32 ON_CALL(*this, exec()).WillByDefault(Invoke(this, &MockDesktopFileReader::doExec));32 ON_CALL(*this, splashImage()).WillByDefault(Return(QUrl()));
33 ON_CALL(*this, path()).WillByDefault(Invoke(this, &MockDesktopFileReader::doPath));33 ON_CALL(*this, splashShowHeader()).WillByDefault(Return(false));
34 ON_CALL(*this, stageHint()).WillByDefault(Invoke(this, &MockDesktopFileReader::doStageHint));34 ON_CALL(*this, splashColor()).WillByDefault(Return(QString()));
35 ON_CALL(*this, isTouchApp()).WillByDefault(Invoke(this, &MockDesktopFileReader::doIsTouchApp));35 ON_CALL(*this, splashColorHeader()).WillByDefault(Return(QString()));
36 ON_CALL(*this, loaded()).WillByDefault(Invoke(this, &MockDesktopFileReader::doLoaded));36 ON_CALL(*this, splashColorFooter()).WillByDefault(Return(QString()));
37}37 ON_CALL(*this, supportedOrientations()).WillByDefault(Return(Qt::PrimaryOrientation));
3838 ON_CALL(*this, rotatesWindowContents()).WillByDefault(Return(false));
39MockDesktopFileReader::~MockDesktopFileReader()39 ON_CALL(*this, isTouchApp()).WillByDefault(Return(true));
40{40}
41}41
4242MockApplicationInfo::~MockApplicationInfo()
43QString MockDesktopFileReader::doFile() const43{
44{
45 return DesktopFileReader::file();
46}
47
48QString MockDesktopFileReader::doAppId() const
49{
50 return DesktopFileReader::appId();
51}
52
53QString MockDesktopFileReader::doName() const
54{
55 return DesktopFileReader::name();
56}
57
58QString MockDesktopFileReader::doComment() const
59{
60 return DesktopFileReader::comment();
61}
62
63QString MockDesktopFileReader::doIcon() const
64{
65 return DesktopFileReader::icon();
66}
67
68QString MockDesktopFileReader::doExec() const
69{
70 return DesktopFileReader::exec();
71}
72
73QString MockDesktopFileReader::doPath() const
74{
75 return DesktopFileReader::path();
76}
77
78QString MockDesktopFileReader::doStageHint() const
79{
80 return DesktopFileReader::stageHint();
81}
82
83bool MockDesktopFileReader::doIsTouchApp() const
84{
85 return DesktopFileReader::isTouchApp();
86}
87
88bool MockDesktopFileReader::doLoaded() const
89{
90 return DesktopFileReader::loaded();
91}
92
93
94MockDesktopFileReaderFactory::MockDesktopFileReaderFactory()
95{
96 using namespace ::testing;
97 ON_CALL(*this, createInstance(_, _))
98 .WillByDefault(
99 Invoke(
100 this,
101 &MockDesktopFileReaderFactory::doCreateInstance));
102}
103
104MockDesktopFileReaderFactory::~MockDesktopFileReaderFactory()
105{
106}
107
108qtmir::DesktopFileReader *MockDesktopFileReaderFactory::doCreateInstance(const QString &appId, const QFileInfo &fi)
109{
110 using namespace ::testing;
111 auto instance = new NiceMock<MockDesktopFileReader>(appId, fi);
112 ON_CALL(*instance, loaded()).WillByDefault(Return(true));
113
114 return instance;
115}44}
11645
117} // namespace qtmir46} // namespace qtmir
11847
=== renamed file 'tests/framework/mock_desktop_file_reader.h' => 'tests/framework/mock_application_info.h'
--- tests/framework/mock_desktop_file_reader.h 2015-11-11 10:43:36 +0000
+++ tests/framework/mock_application_info.h 2016-03-02 00:44:09 +0000
@@ -14,54 +14,36 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */15 */
1616
17#ifndef MOCK_DESKTOP_FILE_READER_H17#ifndef MOCK_APPLICATION_INFO_H
18#define MOCK_DESKTOP_FILE_READER_H18#define MOCK_APPLICATION_INFO_H
1919
20#include <Unity/Application/desktopfilereader.h>20#include <Unity/Application/applicationinfo.h>
2121
22#include <gmock/gmock.h>22#include <gmock/gmock.h>
2323
24namespace qtmir24namespace qtmir
25{25{
2626
27struct MockDesktopFileReader : public qtmir::DesktopFileReader27struct MockApplicationInfo : public qtmir::ApplicationInfo
28{28{
29 MockDesktopFileReader(const QString &appId, const QFileInfo& fileInfo);29 MockApplicationInfo(const QString &appId);
30 virtual ~MockDesktopFileReader();30 virtual ~MockApplicationInfo();
3131
32 MOCK_CONST_METHOD0(file, QString());32 MOCK_CONST_METHOD0(appId, QString());
33 MOCK_CONST_METHOD0(appId, QString ());
34 MOCK_CONST_METHOD0(name, QString());33 MOCK_CONST_METHOD0(name, QString());
35 MOCK_CONST_METHOD0(comment, QString());34 MOCK_CONST_METHOD0(comment, QString());
36 MOCK_CONST_METHOD0(icon, QString());35 MOCK_CONST_METHOD0(icon, QUrl());
37 MOCK_CONST_METHOD0(exec, QString());36 MOCK_CONST_METHOD0(splashTitle, QString());
38 MOCK_CONST_METHOD0(path, QString());37 MOCK_CONST_METHOD0(splashImage, QUrl());
39 MOCK_CONST_METHOD0(stageHint, QString());38 MOCK_CONST_METHOD0(splashShowHeader, bool());
39 MOCK_CONST_METHOD0(splashColor, QString());
40 MOCK_CONST_METHOD0(splashColorHeader, QString());
41 MOCK_CONST_METHOD0(splashColorFooter, QString());
42 MOCK_CONST_METHOD0(supportedOrientations, Qt::ScreenOrientations());
43 MOCK_CONST_METHOD0(rotatesWindowContents, bool());
40 MOCK_CONST_METHOD0(isTouchApp, bool());44 MOCK_CONST_METHOD0(isTouchApp, bool());
41 MOCK_CONST_METHOD0(loaded, bool());
42
43 QString doFile() const;
44 QString doAppId() const;
45 QString doName() const;
46 QString doComment() const;
47 QString doIcon() const;
48 QString doExec() const;
49 QString doPath() const;
50 QString doStageHint() const;
51 bool doIsTouchApp() const;
52 bool doLoaded() const;
53};
54
55struct MockDesktopFileReaderFactory : public qtmir::DesktopFileReader::Factory
56{
57 MockDesktopFileReaderFactory();
58 virtual ~MockDesktopFileReaderFactory();
59
60 virtual qtmir::DesktopFileReader* doCreateInstance(const QString &appId, const QFileInfo &fi);
61
62 MOCK_METHOD2(createInstance, qtmir::DesktopFileReader*(const QString &appId, const QFileInfo &fi));
63};45};
6446
65} // namespace qtmir47} // namespace qtmir
6648
67#endif // MOCK_DESKTOP_FILE_READER_H49#endif // MOCK_APPLICATION_INFO_H
6850
=== modified file 'tests/framework/mock_task_controller.cpp'
--- tests/framework/mock_task_controller.cpp 2016-02-11 11:52:06 +0000
+++ tests/framework/mock_task_controller.cpp 2016-03-02 00:44:09 +0000
@@ -14,6 +14,7 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */15 */
1616
17#include "mock_application_info.h"
17#include "mock_task_controller.h"18#include "mock_task_controller.h"
1819
19namespace qtmir20namespace qtmir
@@ -22,17 +23,14 @@
22MockTaskController::MockTaskController()23MockTaskController::MockTaskController()
23{24{
24 using namespace ::testing;25 using namespace ::testing;
25 ON_CALL(*this, primaryPidForAppId(_))
26 .WillByDefault(
27 Invoke(this, &MockTaskController::doPrimaryPidForAppId));
2826
29 ON_CALL(*this, appIdHasProcessId(_, _))27 ON_CALL(*this, appIdHasProcessId(_, _))
30 .WillByDefault(28 .WillByDefault(
31 Invoke(this, &MockTaskController::doAppIdHasProcessId));29 Invoke(this, &MockTaskController::doAppIdHasProcessId));
3230
33 ON_CALL(*this, findDesktopFileForAppId(_))31 ON_CALL(*this, getInfoForApp(_))
34 .WillByDefault(32 .WillByDefault(
35 Invoke(this, &MockTaskController::doFindDesktopFileForAppId));33 Invoke(this, &MockTaskController::doGetInfoForApp));
3634
37 ON_CALL(*this, stop(_))35 ON_CALL(*this, stop(_))
38 .WillByDefault(36 .WillByDefault(
@@ -56,15 +54,6 @@
5654
57}55}
5856
59pid_t MockTaskController::doPrimaryPidForAppId(const QString &appId)
60{
61 auto it = children.find(appId);
62 if (it == children.end())
63 return -1;
64
65 return it->pid();
66}
67
6857
69bool MockTaskController::doAppIdHasProcessId(const QString &appId, pid_t pid)58bool MockTaskController::doAppIdHasProcessId(const QString &appId, pid_t pid)
70{59{
@@ -76,10 +65,9 @@
76}65}
7766
7867
79QFileInfo MockTaskController::doFindDesktopFileForAppId(const QString &appId) const68qtmir::ApplicationInfo *MockTaskController::doGetInfoForApp(const QString& appId) const
80{69{
81 QString path = QString("/usr/share/applications/%1.desktop").arg(appId);70 return new testing::NiceMock<MockApplicationInfo>(appId);
82 return QFileInfo(path);
83}71}
8472
8573
8674
=== modified file 'tests/framework/mock_task_controller.h'
--- tests/framework/mock_task_controller.h 2016-02-11 11:52:06 +0000
+++ tests/framework/mock_task_controller.h 2016-03-02 00:44:09 +0000
@@ -31,20 +31,17 @@
31 MockTaskController();31 MockTaskController();
32 virtual ~MockTaskController();32 virtual ~MockTaskController();
3333
34 MOCK_METHOD1(primaryPidForAppId, pid_t(const QString& appId));
35 MOCK_METHOD2(appIdHasProcessId, bool(const QString&, pid_t));34 MOCK_METHOD2(appIdHasProcessId, bool(const QString&, pid_t));
36 MOCK_CONST_METHOD1(findDesktopFileForAppId, QFileInfo(const QString &appId));35 MOCK_CONST_METHOD1(getInfoForApp, qtmir::ApplicationInfo *(const QString &));
3736
38 MOCK_METHOD1(stop, bool(const QString&));37 MOCK_METHOD1(stop, bool(const QString&));
39 MOCK_METHOD2(start, bool(const QString&, const QStringList&));38 MOCK_METHOD2(start, bool(const QString&, const QStringList&));
40 MOCK_METHOD1(suspend, bool(const QString&));39 MOCK_METHOD1(suspend, bool(const QString&));
41 MOCK_METHOD1(resume, bool(const QString&));40 MOCK_METHOD1(resume, bool(const QString&));
4241
43 pid_t doPrimaryPidForAppId(const QString& appId);
44
45 bool doAppIdHasProcessId(const QString& appId, pid_t pid);42 bool doAppIdHasProcessId(const QString& appId, pid_t pid);
4643
47 QFileInfo doFindDesktopFileForAppId(const QString& appId) const;44 qtmir::ApplicationInfo *doGetInfoForApp(const QString& appId) const;
4845
49 bool doStop(const QString& appId);46 bool doStop(const QString& appId);
5047
5148
=== modified file 'tests/framework/qtmir_test.cpp'
--- tests/framework/qtmir_test.cpp 2016-02-11 11:52:06 +0000
+++ tests/framework/qtmir_test.cpp 2016-03-02 00:44:09 +0000
@@ -123,7 +123,6 @@
123 , applicationManager(mirServer,123 , applicationManager(mirServer,
124 taskControllerSharedPointer,124 taskControllerSharedPointer,
125 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),125 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),
126 QSharedPointer<DesktopFileReader::Factory>(&desktopFileReaderFactory,[](DesktopFileReader::Factory*){}),
127 QSharedPointer<ProcInfo>(&procInfo,[](ProcInfo *){}),126 QSharedPointer<ProcInfo>(&procInfo,[](ProcInfo *){}),
128 QSharedPointer<MockSettings>(&settings,[](MockSettings *){}))127 QSharedPointer<MockSettings>(&settings,[](MockSettings *){}))
129 , sessionManager(mirServer, &applicationManager)128 , sessionManager(mirServer, &applicationManager)
@@ -143,14 +142,6 @@
143 ON_CALL(*taskController,appIdHasProcessId(appId, procId)).WillByDefault(Return(true));142 ON_CALL(*taskController,appIdHasProcessId(appId, procId)).WillByDefault(Return(true));
144143
145 // Set up Mocks & signal watcher144 // Set up Mocks & signal watcher
146 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
147 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
148 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
149
150 EXPECT_CALL(desktopFileReaderFactory, createInstance(appId, _))
151 .Times(1)
152 .WillOnce(Return(mockDesktopFileReader));
153
154 EXPECT_CALL(*taskController, start(appId, _))145 EXPECT_CALL(*taskController, start(appId, _))
155 .Times(1)146 .Times(1)
156 .WillOnce(Return(true));147 .WillOnce(Return(true));
@@ -167,7 +158,6 @@
167 sessionManager.onSessionStarting(appSession);158 sessionManager.onSessionStarting(appSession);
168159
169 Mock::VerifyAndClearExpectations(taskController);160 Mock::VerifyAndClearExpectations(taskController);
170 Mock::VerifyAndClearExpectations(&desktopFileReaderFactory);
171 return application;161 return application;
172}162}
173163
174164
=== modified file 'tests/framework/qtmir_test.h'
--- tests/framework/qtmir_test.h 2016-02-11 11:52:06 +0000
+++ tests/framework/qtmir_test.h 2016-03-02 00:44:09 +0000
@@ -32,7 +32,6 @@
32#include <Unity/Application/proc_info.h>32#include <Unity/Application/proc_info.h>
33#include <mirserver.h>33#include <mirserver.h>
3434
35#include "mock_desktop_file_reader.h"
36#include "mock_proc_info.h"35#include "mock_proc_info.h"
37#include "mock_mir_session.h"36#include "mock_mir_session.h"
38#include "mock_prompt_session_manager.h"37#include "mock_prompt_session_manager.h"
@@ -67,7 +66,6 @@
67 QSharedPointer<qtmir::TaskController> taskControllerSharedPointer{new testing::NiceMock<qtmir::MockTaskController>};66 QSharedPointer<qtmir::TaskController> taskControllerSharedPointer{new testing::NiceMock<qtmir::MockTaskController>};
68 testing::NiceMock<qtmir::MockTaskController> *taskController{static_cast<testing::NiceMock<qtmir::MockTaskController>*>(taskControllerSharedPointer.data())};67 testing::NiceMock<qtmir::MockTaskController> *taskController{static_cast<testing::NiceMock<qtmir::MockTaskController>*>(taskControllerSharedPointer.data())};
69 testing::NiceMock<MockProcInfo> procInfo;68 testing::NiceMock<MockProcInfo> procInfo;
70 testing::NiceMock<MockDesktopFileReaderFactory> desktopFileReaderFactory;
71 testing::NiceMock<MockSharedWakelock> sharedWakelock;69 testing::NiceMock<MockSharedWakelock> sharedWakelock;
72 testing::NiceMock<MockSettings> settings;70 testing::NiceMock<MockSettings> settings;
73 std::shared_ptr<StubPromptSessionManager> promptSessionManager;71 std::shared_ptr<StubPromptSessionManager> promptSessionManager;
7472
=== modified file 'tests/modules/Application/application_test.cpp'
--- tests/modules/Application/application_test.cpp 2015-10-15 14:40:58 +0000
+++ tests/modules/Application/application_test.cpp 2016-03-02 00:44:09 +0000
@@ -19,8 +19,9 @@
1919
20#include "qtmir_test.h"20#include "qtmir_test.h"
2121
22#include <fake_desktopfilereader.h>22#include <fake_application_info.h>
23#include <fake_session.h>23#include <fake_session.h>
24#include <mock_application_info.h>
24#include <mock_session.h>25#include <mock_session.h>
2526
26#include <QScopedPointer>27#include <QScopedPointer>
@@ -41,7 +42,7 @@
4142
42 QScopedPointer<Application> application(new Application(43 QScopedPointer<Application> application(new Application(
43 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),44 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),
44 new FakeDesktopFileReader, QStringList(), nullptr));45 new FakeApplicationInfo(), QStringList(), nullptr));
4546
46 application->setProcessState(Application::ProcessRunning);47 application->setProcessState(Application::ProcessRunning);
4748
@@ -79,7 +80,7 @@
7980
80 QScopedPointer<Application> application(new Application(81 QScopedPointer<Application> application(new Application(
81 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),82 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),
82 new FakeDesktopFileReader, QStringList(), nullptr));83 new FakeApplicationInfo(), QStringList(), nullptr));
83 NiceMock<MockSession> *session = new NiceMock<MockSession>;84 NiceMock<MockSession> *session = new NiceMock<MockSession>;
8485
85 // Get it running and then suspend it86 // Get it running and then suspend it
@@ -106,7 +107,7 @@
106107
107 QScopedPointer<Application> application(new Application(108 QScopedPointer<Application> application(new Application(
108 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),109 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),
109 new FakeDesktopFileReader, QStringList(), nullptr));110 new FakeApplicationInfo(), QStringList(), nullptr));
110 NiceMock<MockSession> *session = new NiceMock<MockSession>;111 NiceMock<MockSession> *session = new NiceMock<MockSession>;
111112
112 // Get it running, suspend it, and finally stop it113 // Get it running, suspend it, and finally stop it
@@ -140,12 +141,12 @@
140 EXPECT_CALL(sharedWakelock, acquire(_)).Times(0);141 EXPECT_CALL(sharedWakelock, acquire(_)).Times(0);
141 EXPECT_CALL(sharedWakelock, release(_)).Times(0);142 EXPECT_CALL(sharedWakelock, release(_)).Times(0);
142143
143 FakeDesktopFileReader *desktopFileReader = new FakeDesktopFileReader;144 auto applicationInfo = new FakeApplicationInfo();
144 desktopFileReader->m_appId = QString("unity8-dash");145 applicationInfo->m_appId = QString("unity8-dash");
145146
146 QScopedPointer<Application> application(new Application(147 QScopedPointer<Application> application(new Application(
147 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),148 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),
148 desktopFileReader, QStringList(), nullptr));149 applicationInfo, QStringList(), nullptr));
149150
150 application->setProcessState(Application::ProcessRunning);151 application->setProcessState(Application::ProcessRunning);
151152
@@ -183,7 +184,7 @@
183184
184 QScopedPointer<Application> application(new Application(185 QScopedPointer<Application> application(new Application(
185 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),186 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),
186 new FakeDesktopFileReader, QStringList(), nullptr));187 new FakeApplicationInfo(), QStringList(), nullptr));
187188
188 application->setProcessState(Application::ProcessRunning);189 application->setProcessState(Application::ProcessRunning);
189190
@@ -218,7 +219,7 @@
218219
219 QScopedPointer<Application> application(new Application(220 QScopedPointer<Application> application(new Application(
220 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),221 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),
221 new FakeDesktopFileReader, QStringList(), nullptr));222 new FakeApplicationInfo(), QStringList(), nullptr));
222223
223 application->setProcessState(Application::ProcessRunning);224 application->setProcessState(Application::ProcessRunning);
224225
@@ -250,7 +251,7 @@
250251
251 QScopedPointer<Application> application(new Application(252 QScopedPointer<Application> application(new Application(
252 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),253 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),
253 new FakeDesktopFileReader, QStringList(), nullptr));254 new FakeApplicationInfo(), QStringList(), nullptr));
254255
255 application->setProcessState(Application::ProcessRunning);256 application->setProcessState(Application::ProcessRunning);
256257
@@ -292,14 +293,14 @@
292{293{
293 using namespace ::testing;294 using namespace ::testing;
294295
295 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(QString(), QFileInfo());296 auto mockApplicationInfo = new NiceMock<MockApplicationInfo>("foo-app");
296 QScopedPointer<Application> application(new Application(297 QScopedPointer<Application> application(new Application(
297 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),298 QSharedPointer<MockSharedWakelock>(&sharedWakelock, [](MockSharedWakelock *){}),
298 mockDesktopFileReader, QStringList(), nullptr));299 mockApplicationInfo, QStringList(), nullptr));
299300
300 ON_CALL(*mockDesktopFileReader, isTouchApp()).WillByDefault(Return(true));301 ON_CALL(*mockApplicationInfo, isTouchApp()).WillByDefault(Return(true));
301 ASSERT_TRUE(application->isTouchApp());302 ASSERT_TRUE(application->isTouchApp());
302303
303 ON_CALL(*mockDesktopFileReader, isTouchApp()).WillByDefault(Return(false));304 ON_CALL(*mockApplicationInfo, isTouchApp()).WillByDefault(Return(false));
304 ASSERT_FALSE(application->isTouchApp());305 ASSERT_FALSE(application->isTouchApp());
305}306}
306307
=== modified file 'tests/modules/ApplicationManager/application_manager_test.cpp'
--- tests/modules/ApplicationManager/application_manager_test.cpp 2016-02-12 00:07:09 +0000
+++ tests/modules/ApplicationManager/application_manager_test.cpp 2016-03-02 00:44:09 +0000
@@ -23,8 +23,8 @@
23#include <Unity/Application/applicationscreenshotprovider.h>23#include <Unity/Application/applicationscreenshotprovider.h>
24#include <Unity/Application/timer.h>24#include <Unity/Application/timer.h>
2525
26#include <fake_desktopfilereader.h>
27#include <fake_mirsurface.h>26#include <fake_mirsurface.h>
27#include <mock_application_info.h>
28#include <mock_surface.h>28#include <mock_surface.h>
29#include <qtmir_test.h>29#include <qtmir_test.h>
3030
@@ -152,9 +152,7 @@
152 const QString shortAppId("com.canonical.test_test");152 const QString shortAppId("com.canonical.test_test");
153153
154 EXPECT_CALL(*taskController, start(_, _)).Times(1);154 EXPECT_CALL(*taskController, start(_, _)).Times(1);
155 EXPECT_CALL(*taskController, findDesktopFileForAppId(shortAppId)).Times(1);155 EXPECT_CALL(*taskController, getInfoForApp(shortAppId)).Times(1);
156
157 EXPECT_CALL(desktopFileReaderFactory, createInstance(_, _)).Times(1);
158156
159 auto application = applicationManager.startApplication(157 auto application = applicationManager.startApplication(
160 shortAppId,158 shortAppId,
@@ -172,9 +170,7 @@
172 const QString shortAppId("com.canonical.test_test");170 const QString shortAppId("com.canonical.test_test");
173171
174 EXPECT_CALL(*taskController, start(_, _)).Times(1);172 EXPECT_CALL(*taskController, start(_, _)).Times(1);
175 EXPECT_CALL(*taskController, findDesktopFileForAppId(shortAppId)).Times(1);173 EXPECT_CALL(*taskController, getInfoForApp(shortAppId)).Times(1);
176
177 EXPECT_CALL(desktopFileReaderFactory, createInstance(_, _)).Times(1);
178174
179 auto application = applicationManager.startApplication(175 auto application = applicationManager.startApplication(
180 longAppId,176 longAppId,
@@ -299,28 +295,6 @@
299 EXPECT_EQ(second_session, the_app->session()->session());295 EXPECT_EQ(second_session, the_app->session()->session());
300}296}
301297
302TEST_F(ApplicationManagerTests,DISABLED_upstart_launching_sidestage_app_on_phone_forced_into_mainstage)
303{
304 using namespace ::testing;
305 QString appId("sideStage");
306
307 EXPECT_CALL(*taskController, findDesktopFileForAppId(appId)).Times(1);
308
309 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
310 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
311 ON_CALL(*mockDesktopFileReader, stageHint()).WillByDefault(Return("SideStage"));
312
313 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
314
315 // mock upstart launching an app which reports itself as sidestage, but we're on phone
316 applicationManager.onProcessStarting(appId);
317
318 // ensure the app stage is overridden to be main stage
319 Application* theApp = applicationManager.findApplication(appId);
320 ASSERT_NE(theApp, nullptr);
321 EXPECT_EQ(Application::MainStage, theApp->stage());
322}
323
324TEST_F(ApplicationManagerTests,two_session_on_one_application_after_starting)298TEST_F(ApplicationManagerTests,two_session_on_one_application_after_starting)
325{299{
326 using namespace ::testing;300 using namespace ::testing;
@@ -473,12 +447,12 @@
473 const QString name("Test App");447 const QString name("Test App");
474448
475 // Set up Mocks & signal watcher449 // Set up Mocks & signal watcher
476 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());450 auto mockApplicationInfo = new NiceMock<MockApplicationInfo>(appId);
477 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));451 ON_CALL(*mockApplicationInfo, name()).WillByDefault(Return(name));
478 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
479 ON_CALL(*mockDesktopFileReader, name()).WillByDefault(Return(name));
480452
481 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));453 EXPECT_CALL(*taskController, getInfoForApp(appId))
454 .Times(1)
455 .WillOnce(Return(mockApplicationInfo));
482456
483 EXPECT_CALL(*taskController, start(appId, _))457 EXPECT_CALL(*taskController, start(appId, _))
484 .Times(1)458 .Times(1)
@@ -518,12 +492,12 @@
518 const QString name("Test App");492 const QString name("Test App");
519493
520 // Set up Mocks & signal watcher494 // Set up Mocks & signal watcher
521 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());495 auto mockApplicationInfo = new NiceMock<MockApplicationInfo>(appId);
522 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));496 ON_CALL(*mockApplicationInfo, name()).WillByDefault(Return(name));
523 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
524 ON_CALL(*mockDesktopFileReader, name()).WillByDefault(Return(name));
525497
526 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));498 EXPECT_CALL(*taskController, getInfoForApp(appId))
499 .Times(1)
500 .WillOnce(Return(mockApplicationInfo));
527501
528 QSignalSpy countSpy(&applicationManager, SIGNAL(countChanged()));502 QSignalSpy countSpy(&applicationManager, SIGNAL(countChanged()));
529 QSignalSpy addedSpy(&applicationManager, SIGNAL(applicationAdded(const QString &)));503 QSignalSpy addedSpy(&applicationManager, SIGNAL(applicationAdded(const QString &)));
@@ -567,12 +541,12 @@
567 .Times(1)541 .Times(1)
568 .WillOnce(Return(cmdLine));542 .WillOnce(Return(cmdLine));
569543
570 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());544 auto mockApplicationInfo = new NiceMock<MockApplicationInfo>(appId);
571 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));545 ON_CALL(*mockApplicationInfo, name()).WillByDefault(Return(name));
572 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
573 ON_CALL(*mockDesktopFileReader, name()).WillByDefault(Return(name));
574546
575 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));547 EXPECT_CALL(*taskController, getInfoForApp(appId))
548 .Times(1)
549 .WillOnce(Return(mockApplicationInfo));
576550
577 QSignalSpy countSpy(&applicationManager, SIGNAL(countChanged()));551 QSignalSpy countSpy(&applicationManager, SIGNAL(countChanged()));
578 QSignalSpy addedSpy(&applicationManager, SIGNAL(applicationAdded(const QString &)));552 QSignalSpy addedSpy(&applicationManager, SIGNAL(applicationAdded(const QString &)));
@@ -632,35 +606,6 @@
632}606}
633607
634/*608/*
635 * Test that an application launched via the command line with the --desktop_file_hint but an incorrect
636 * desktop file specified is rejected
637 */
638TEST_F(ApplicationManagerTests,appDoesNotStartWhenUsingBadDesktopFileHintFile)
639{
640 using namespace ::testing;
641 const QString appId("testAppId");
642 const QString badDesktopFile = QString("%1.desktop").arg(appId);
643 const pid_t procId = 5551;
644 QByteArray cmdLine("/usr/bin/testApp --desktop_file_hint=");
645 cmdLine = cmdLine.append(badDesktopFile);
646
647 // Set up Mocks & signal watcher
648 EXPECT_CALL(procInfo,command_line(procId))
649 .Times(1)
650 .WillOnce(Return(cmdLine));
651
652 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
653 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(false));
654
655 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
656
657 // Mir requests authentication for an application that was started, should fail
658 bool authed = true;
659 applicationManager.authorizeSession(procId, authed);
660 EXPECT_EQ(authed, false);
661}
662
663/*
664 * Test that if TaskController synchronously calls back processStarted, that ApplicationManager609 * Test that if TaskController synchronously calls back processStarted, that ApplicationManager
665 * does not add the app to the model twice.610 * does not add the app to the model twice.
666 */611 */
@@ -671,12 +616,12 @@
671 const QString name("Test App");616 const QString name("Test App");
672617
673 // Set up Mocks & signal watcher618 // Set up Mocks & signal watcher
674 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());619 auto mockApplicationInfo = new NiceMock<MockApplicationInfo>(appId);
675 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));620 ON_CALL(*mockApplicationInfo, name()).WillByDefault(Return(name));
676 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
677 ON_CALL(*mockDesktopFileReader, name()).WillByDefault(Return(name));
678621
679 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));622 EXPECT_CALL(*taskController, getInfoForApp(appId))
623 .Times(1)
624 .WillOnce(Return(mockApplicationInfo));
680625
681 ON_CALL(*taskController, start(appId, _))626 ON_CALL(*taskController, start(appId, _))
682 .WillByDefault(Invoke(627 .WillByDefault(Invoke(
@@ -751,12 +696,6 @@
751 const QString appId("testAppId");696 const QString appId("testAppId");
752697
753 // Set up Mocks & signal watcher698 // Set up Mocks & signal watcher
754 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
755 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
756 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
757
758 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
759
760 EXPECT_CALL(*taskController, start(appId, _))699 EXPECT_CALL(*taskController, start(appId, _))
761 .Times(1)700 .Times(1)
762 .WillOnce(Return(true));701 .WillOnce(Return(true));
@@ -789,12 +728,6 @@
789 const pid_t procId = 5551;728 const pid_t procId = 5551;
790729
791 // Set up Mocks & signal watcher730 // Set up Mocks & signal watcher
792 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
793 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
794 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
795
796 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
797
798 EXPECT_CALL(*taskController, start(appId, _))731 EXPECT_CALL(*taskController, start(appId, _))
799 .Times(1)732 .Times(1)
800 .WillOnce(Return(true));733 .WillOnce(Return(true));
@@ -833,12 +766,6 @@
833 const pid_t procId = 5551;766 const pid_t procId = 5551;
834767
835 // Set up Mocks & signal watcher768 // Set up Mocks & signal watcher
836 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
837 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
838 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
839
840 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
841
842 EXPECT_CALL(*taskController, start(appId, _))769 EXPECT_CALL(*taskController, start(appId, _))
843 .Times(1)770 .Times(1)
844 .WillOnce(Return(true));771 .WillOnce(Return(true));
@@ -869,17 +796,9 @@
869{796{
870 using namespace ::testing;797 using namespace ::testing;
871 const QString appId("testAppId");798 const QString appId("testAppId");
872 const QString desktopFilePath("testAppId.desktop");
873 const pid_t procId = 5551;799 const pid_t procId = 5551;
874800
875 // Set up Mocks & signal watcher801 // Set up Mocks & signal watcher
876 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
877 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
878 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
879 ON_CALL(*mockDesktopFileReader, file()).WillByDefault(Return(desktopFilePath));
880
881 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
882
883 EXPECT_CALL(*taskController, start(appId, _))802 EXPECT_CALL(*taskController, start(appId, _))
884 .Times(1)803 .Times(1)
885 .WillOnce(Return(true));804 .WillOnce(Return(true));
@@ -917,12 +836,6 @@
917 const pid_t procId = 5551;836 const pid_t procId = 5551;
918837
919 // Set up Mocks & signal watcher838 // Set up Mocks & signal watcher
920 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
921 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
922 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
923
924 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
925
926 EXPECT_CALL(*taskController, start(appId, _))839 EXPECT_CALL(*taskController, start(appId, _))
927 .Times(1)840 .Times(1)
928 .WillOnce(Return(true));841 .WillOnce(Return(true));
@@ -960,12 +873,6 @@
960 const pid_t procId = 5551;873 const pid_t procId = 5551;
961874
962 // Set up Mocks & signal watcher875 // Set up Mocks & signal watcher
963 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
964 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
965 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
966
967 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
968
969 EXPECT_CALL(*taskController, start(appId, _))876 EXPECT_CALL(*taskController, start(appId, _))
970 .Times(1)877 .Times(1)
971 .WillOnce(Return(true));878 .WillOnce(Return(true));
@@ -1006,12 +913,6 @@
1006 const pid_t procId = 5551;913 const pid_t procId = 5551;
1007914
1008 // Set up Mocks & signal watcher915 // Set up Mocks & signal watcher
1009 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1010 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1011 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1012
1013 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1014
1015 EXPECT_CALL(*taskController, start(appId, _))916 EXPECT_CALL(*taskController, start(appId, _))
1016 .Times(1)917 .Times(1)
1017 .WillOnce(Return(true));918 .WillOnce(Return(true));
@@ -1051,12 +952,6 @@
1051 const pid_t procId = 5551;952 const pid_t procId = 5551;
1052953
1053 // Set up Mocks & signal watcher954 // Set up Mocks & signal watcher
1054 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1055 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1056 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1057
1058 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1059
1060 EXPECT_CALL(*taskController, start(appId, _))955 EXPECT_CALL(*taskController, start(appId, _))
1061 .Times(1)956 .Times(1)
1062 .WillOnce(Return(true));957 .WillOnce(Return(true));
@@ -1102,12 +997,6 @@
1102 const pid_t procId = 5551;997 const pid_t procId = 5551;
1103998
1104 // Set up Mocks & signal watcher999 // Set up Mocks & signal watcher
1105 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1106 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1107 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1108
1109 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1110
1111 EXPECT_CALL(*taskController, start(appId, _))1000 EXPECT_CALL(*taskController, start(appId, _))
1112 .Times(1)1001 .Times(1)
1113 .WillOnce(Return(true));1002 .WillOnce(Return(true));
@@ -1160,12 +1049,6 @@
1160 const pid_t procId = 5551;1049 const pid_t procId = 5551;
11611050
1162 // Set up Mocks & signal watcher1051 // Set up Mocks & signal watcher
1163 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1164 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1165 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1166
1167 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1168
1169 EXPECT_CALL(*taskController, start(appId, _))1052 EXPECT_CALL(*taskController, start(appId, _))
1170 .Times(1)1053 .Times(1)
1171 .WillOnce(Return(true));1054 .WillOnce(Return(true));
@@ -1213,12 +1096,6 @@
1213 const pid_t procId = 5551;1096 const pid_t procId = 5551;
12141097
1215 // Set up Mocks & signal watcher1098 // Set up Mocks & signal watcher
1216 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1217 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1218 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1219
1220 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1221
1222 EXPECT_CALL(*taskController, start(appId, _))1099 EXPECT_CALL(*taskController, start(appId, _))
1223 .Times(1)1100 .Times(1)
1224 .WillOnce(Return(true));1101 .WillOnce(Return(true));
@@ -1252,12 +1129,6 @@
1252 const pid_t procId = 5551;1129 const pid_t procId = 5551;
12531130
1254 // Set up Mocks & signal watcher1131 // Set up Mocks & signal watcher
1255 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1256 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1257 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1258
1259 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1260
1261 EXPECT_CALL(*taskController, start(appId, _))1132 EXPECT_CALL(*taskController, start(appId, _))
1262 .Times(1)1133 .Times(1)
1263 .WillOnce(Return(true));1134 .WillOnce(Return(true));
@@ -1294,7 +1165,6 @@
1294{1165{
1295 using namespace ::testing;1166 using namespace ::testing;
1296 const QString appId("testAppId");1167 const QString appId("testAppId");
1297 const QString name("Test App");
1298 const pid_t procId = 5551;1168 const pid_t procId = 5551;
1299 QByteArray cmdLine("/usr/bin/testApp --desktop_file_hint=");1169 QByteArray cmdLine("/usr/bin/testApp --desktop_file_hint=");
1300 cmdLine = cmdLine.append(appId);1170 cmdLine = cmdLine.append(appId);
@@ -1304,13 +1174,6 @@
1304 .Times(1)1174 .Times(1)
1305 .WillOnce(Return(cmdLine));1175 .WillOnce(Return(cmdLine));
13061176
1307 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1308 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1309 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1310 ON_CALL(*mockDesktopFileReader, name()).WillByDefault(Return(name));
1311
1312 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1313
1314 // Mir requests authentication for an application that was started1177 // Mir requests authentication for an application that was started
1315 bool authed = true;1178 bool authed = true;
1316 applicationManager.authorizeSession(procId, authed);1179 applicationManager.authorizeSession(procId, authed);
@@ -1348,12 +1211,6 @@
1348 const pid_t procId = 5551;1211 const pid_t procId = 5551;
13491212
1350 // Set up Mocks & signal watcher1213 // Set up Mocks & signal watcher
1351 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1352 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1353 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1354
1355 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1356
1357 EXPECT_CALL(*taskController, start(appId, _))1214 EXPECT_CALL(*taskController, start(appId, _))
1358 .Times(1)1215 .Times(1)
1359 .WillOnce(Return(true));1216 .WillOnce(Return(true));
@@ -1407,13 +1264,6 @@
1407 const pid_t procId = 5551;1264 const pid_t procId = 5551;
14081265
1409 // Set up Mocks & signal watcher1266 // Set up Mocks & signal watcher
1410 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1411 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1412 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1413 ON_CALL(*mockDesktopFileReader, file()).WillByDefault(Return(appId + ".desktop"));
1414
1415 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1416
1417 EXPECT_CALL(*taskController, start(appId, _))1267 EXPECT_CALL(*taskController, start(appId, _))
1418 .Times(1)1268 .Times(1)
1419 .WillOnce(Return(true));1269 .WillOnce(Return(true));
@@ -1465,12 +1315,6 @@
1465 ON_CALL(*taskController,appIdHasProcessId(_, procId2)).WillByDefault(Return(false));1315 ON_CALL(*taskController,appIdHasProcessId(_, procId2)).WillByDefault(Return(false));
14661316
1467 // Set up Mocks & signal watcher1317 // Set up Mocks & signal watcher
1468 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1469 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1470 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1471
1472 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1473
1474 EXPECT_CALL(*taskController, start(appId, _))1318 EXPECT_CALL(*taskController, start(appId, _))
1475 .Times(1)1319 .Times(1)
1476 .WillOnce(Return(true));1320 .WillOnce(Return(true));
@@ -1525,12 +1369,6 @@
1525 ON_CALL(*taskController,appIdHasProcessId(_, procId2)).WillByDefault(Return(false));1369 ON_CALL(*taskController,appIdHasProcessId(_, procId2)).WillByDefault(Return(false));
15261370
1527 // Set up Mocks & signal watcher1371 // Set up Mocks & signal watcher
1528 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1529 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1530 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1531
1532 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1533
1534 EXPECT_CALL(*taskController, start(appId, _))1372 EXPECT_CALL(*taskController, start(appId, _))
1535 .Times(1)1373 .Times(1)
1536 .WillOnce(Return(true));1374 .WillOnce(Return(true));
@@ -1583,12 +1421,6 @@
1583 const pid_t procId = 5551;1421 const pid_t procId = 5551;
15841422
1585 // Set up Mocks & signal watcher1423 // Set up Mocks & signal watcher
1586 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1587 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1588 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1589
1590 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1591
1592 EXPECT_CALL(*taskController, start(appId, _))1424 EXPECT_CALL(*taskController, start(appId, _))
1593 .Times(1)1425 .Times(1)
1594 .WillOnce(Return(true));1426 .WillOnce(Return(true));
@@ -1636,13 +1468,6 @@
1636 std::condition_variable cv;1468 std::condition_variable cv;
1637 bool done = false;1469 bool done = false;
16381470
1639 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1640 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1641 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1642 ON_CALL(*mockDesktopFileReader, file()).WillByDefault(Return(desktopFilePath));
1643
1644 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1645
1646 EXPECT_CALL(*taskController, start(appId, _))1471 EXPECT_CALL(*taskController, start(appId, _))
1647 .Times(1)1472 .Times(1)
1648 .WillOnce(Return(true));1473 .WillOnce(Return(true));
@@ -1753,12 +1578,6 @@
1753 const quint64 procId = 12345;1578 const quint64 procId = 12345;
17541579
1755 // Set up Mocks & signal watcher1580 // Set up Mocks & signal watcher
1756 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1757 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1758 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1759
1760 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1761
1762 EXPECT_CALL(*taskController, start(appId, _))1581 EXPECT_CALL(*taskController, start(appId, _))
1763 .Times(1)1582 .Times(1)
1764 .WillOnce(Return(true));1583 .WillOnce(Return(true));
@@ -1821,12 +1640,6 @@
1821 const quint64 procId = 12345;1640 const quint64 procId = 12345;
18221641
1823 // Set up Mocks & signal watcher1642 // Set up Mocks & signal watcher
1824 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1825 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1826 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1827
1828 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1829
1830 EXPECT_CALL(*taskController, start(appId, _))1643 EXPECT_CALL(*taskController, start(appId, _))
1831 .Times(1)1644 .Times(1)
1832 .WillOnce(Return(true));1645 .WillOnce(Return(true));
@@ -1863,13 +1676,6 @@
1863 const pid_t procId = 5551;1676 const pid_t procId = 5551;
18641677
1865 // Set up Mocks & signal watcher1678 // Set up Mocks & signal watcher
1866 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1867 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1868 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1869 ON_CALL(*mockDesktopFileReader, file()).WillByDefault(Return(appId + ".desktop"));
1870
1871 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1872
1873 EXPECT_CALL(*taskController, start(appId, _))1679 EXPECT_CALL(*taskController, start(appId, _))
1874 .Times(1)1680 .Times(1)
1875 .WillOnce(Return(true));1681 .WillOnce(Return(true));
@@ -1908,12 +1714,6 @@
1908 const pid_t procId = 5551;1714 const pid_t procId = 5551;
19091715
1910 // Set up Mocks & signal watcher1716 // Set up Mocks & signal watcher
1911 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1912 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1913 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1914
1915 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1916
1917 EXPECT_CALL(*taskController, start(appId, _))1717 EXPECT_CALL(*taskController, start(appId, _))
1918 .Times(1)1718 .Times(1)
1919 .WillOnce(Return(true));1719 .WillOnce(Return(true));
@@ -1957,12 +1757,6 @@
1957 const pid_t procId = 5551;1757 const pid_t procId = 5551;
19581758
1959 // Set up Mocks & signal watcher1759 // Set up Mocks & signal watcher
1960 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
1961 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
1962 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
1963
1964 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
1965
1966 EXPECT_CALL(*taskController, start(appId, _))1760 EXPECT_CALL(*taskController, start(appId, _))
1967 .Times(1)1761 .Times(1)
1968 .WillOnce(Return(true));1762 .WillOnce(Return(true));
@@ -2032,13 +1826,6 @@
2032 const QString appId("testAppId");1826 const QString appId("testAppId");
2033 quint64 procId = 5551;1827 quint64 procId = 5551;
20341828
2035 auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
2036 ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
2037 ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
2038 ON_CALL(*mockDesktopFileReader, file()).WillByDefault(Return(appId + ".desktop"));
2039
2040 ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
2041
2042 EXPECT_CALL(*taskController, start(appId, _))1829 EXPECT_CALL(*taskController, start(appId, _))
2043 .Times(1)1830 .Times(1)
2044 .WillOnce(Return(true));1831 .WillOnce(Return(true));
@@ -2085,11 +1872,6 @@
2085 const QString appId("testAppId");1872 const QString appId("testAppId");
2086 quint64 procId = 5551;1873 quint64 procId = 5551;
20871874
2088 ON_CALL(desktopFileReaderFactory, createInstance(appId, _))
2089 .WillByDefault(Invoke(
2090 [](const QString &appId, const QFileInfo&) { return new FakeDesktopFileReader(appId); }
2091 ));
2092
2093 EXPECT_CALL(*taskController, start(appId, _))1875 EXPECT_CALL(*taskController, start(appId, _))
2094 .Times(1)1876 .Times(1)
2095 .WillOnce(Return(true));1877 .WillOnce(Return(true));
@@ -2186,11 +1968,6 @@
2186 ON_CALL(procInfo,command_line(procId)).WillByDefault(Return(QByteArray("/usr/bin/testAppId")));1968 ON_CALL(procInfo,command_line(procId)).WillByDefault(Return(QByteArray("/usr/bin/testAppId")));
2187 ON_CALL(*taskController,appIdHasProcessId(appId, procId)).WillByDefault(Return(true));1969 ON_CALL(*taskController,appIdHasProcessId(appId, procId)).WillByDefault(Return(true));
21881970
2189 ON_CALL(desktopFileReaderFactory, createInstance(appId, _))
2190 .WillByDefault(Invoke(
2191 [](const QString &appId, const QFileInfo&) { return new FakeDesktopFileReader(appId); }
2192 ));
2193
2194 auto app = applicationManager.startApplication(appId, ApplicationManager::NoFlag);1971 auto app = applicationManager.startApplication(appId, ApplicationManager::NoFlag);
2195 applicationManager.onProcessStarting(appId);1972 applicationManager.onProcessStarting(appId);
2196 std::shared_ptr<mir::scene::Session> session = std::make_shared<MockSession>("", procId);1973 std::shared_ptr<mir::scene::Session> session = std::make_shared<MockSession>("", procId);
21971974
=== modified file 'tests/modules/CMakeLists.txt'
--- tests/modules/CMakeLists.txt 2016-02-11 11:52:06 +0000
+++ tests/modules/CMakeLists.txt 2016-03-02 00:44:09 +0000
@@ -1,6 +1,5 @@
1add_subdirectory(Application)1add_subdirectory(Application)
2add_subdirectory(ApplicationManager)2add_subdirectory(ApplicationManager)
3add_subdirectory(DesktopFileReader)
4add_subdirectory(General)3add_subdirectory(General)
5add_subdirectory(SharedWakelock)4add_subdirectory(SharedWakelock)
6add_subdirectory(SessionManager)5add_subdirectory(SessionManager)
76
=== removed directory 'tests/modules/DesktopFileReader'
=== removed file 'tests/modules/DesktopFileReader/CMakeLists.txt'
--- tests/modules/DesktopFileReader/CMakeLists.txt 2015-09-30 15:45:17 +0000
+++ tests/modules/DesktopFileReader/CMakeLists.txt 1970-01-01 00:00:00 +0000
@@ -1,22 +0,0 @@
1add_definitions(-DTEST_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
2
3set(
4 DESKTOP_FILE_READER_TEST_SOURCES
5 desktopfilereader_test.cpp
6)
7
8include_directories(
9 ${CMAKE_SOURCE_DIR}/src/modules
10)
11
12add_executable(desktop_file_reader_test ${DESKTOP_FILE_READER_TEST_SOURCES})
13
14target_link_libraries(
15 desktop_file_reader_test
16
17 unityapplicationplugin
18
19 ${GTEST_BOTH_LIBRARIES}
20)
21
22add_test(DesktopFileReader desktop_file_reader_test)
230
=== removed file 'tests/modules/DesktopFileReader/calculator.desktop'
--- tests/modules/DesktopFileReader/calculator.desktop 2014-10-06 22:37:55 +0000
+++ tests/modules/DesktopFileReader/calculator.desktop 1970-01-01 00:00:00 +0000
@@ -1,227 +0,0 @@
1[Desktop Entry]
2Name=Calculator
3Name[am]=መደመሪያ
4Name[ar]=الآلة الحاسبة
5Name[ast]=Calculadora
6Name[az]=Kalkulyator
7Name[be]=Калькулятар
8Name[bg]=Калкулатор
9Name[br]=Jederez
10Name[bs]=Kalkulator
11Name[ca]=Calculadora
12Name[cs]=Kalkulačka
13Name[cy]=Cyfrifiannell
14Name[da]=Lommeregner
15Name[de]=Taschenrechner
16Name[el]=Αριθμομηχανή
17Name[en_AU]=Calculator
18Name[en_CA]=Calculator
19Name[en_GB]=Calculator
20Name[es]=Calculadora
21Name[eu]=Kalkulagailua
22Name[fa]=ماشین‌حساب
23Name[fi]=Laskin
24Name[fr]=Calculatrice
25Name[gd]=An t-àireamhair
26Name[gl]=Calculadora
27Name[gu]=કેલ્ક્યુલેટર
28Name[he]=מחשבון
29Name[hi]=कैलकुलेटर
30Name[hu]=Számológép
31Name[id]=Kalkulator
32Name[is]=Reiknivél
33Name[it]=Calcolatrice
34Name[ja]=電卓
35Name[km]=ម៉ាស៊ីន​គិត​លេខ
36Name[ko]=계산기
37Name[lv]=Kalkulators
38Name[mr]=गणनयंत्र
39Name[ms]=Kalkulator
40Name[my]=ဂဏန်းတွက်စက်
41Name[nb]=Kalkulator
42Name[ne]=क्याल्कुलेटर
43Name[nl]=Rekenmachine
44Name[pa]=ਕੈਲਕੂਲੇਟਰ
45Name[pl]=Kalkulator
46Name[pt]=Calculadora
47Name[pt_BR]=Calculadora
48Name[ro]=Calculator
49Name[ru]=Калькулятор
50Name[sa]=सङ्कलकम्
51Name[shn]=ၸၢၵ်ႈၼပ့်သွၼ်
52Name[sl]=Računalo
53Name[sr]=Калкулатор
54Name[sv]=Kalkylator
55Name[ta]=கணிப்பான்
56Name[te]=గణన పరికరం
57Name[tr]=Hesap Makinesi
58Name[ug]=ھېسابلىغۇچ
59Name[uk]=Калькулятор
60Name[zh_CN]=计算器
61Name[zh_HK]=計數機
62Name[zh_TW]=計算機
63Comment=A simple calculator for Ubuntu.
64Comment[am]=ለ ኡቡንቱ ቀላል መደመሪያ
65Comment[ar]=آلة حاسبة بسيطة لأوبونتو.
66Comment[ast]=Una calculadora cenciella pa Ubuntu.
67Comment[az]=Ubuntu üçün sadә kalkulyator.
68Comment[br]=Ur jederez eeun evit Ubuntu.
69Comment[ca]=Una calculadora simple per a l'Ubuntu.
70Comment[cy]=Cyfrifiannell hawdd ar gyfer Ubuntu.
71Comment[da]=En simpel lommeregner til Ubuntu.
72Comment[de]=Ein einfach Tachenrechner für Ubuntu.
73Comment[el]=Μια απλή αριθμομηχανή για το Ubuntu
74Comment[en_AU]=A simple calculator for Ubuntu.
75Comment[en_GB]=A simple calculator for Ubuntu.
76Comment[es]=Una calculadora sencilla para Ubuntu.
77Comment[eu]=Ubunturako kalkulagailu sinplea.
78Comment[fa]=یک ماشین حساب ساده برای اوبونتو.
79Comment[fi]=Laskin Ubuntulle.
80Comment[fr]=Une calculatrice simple pour Ubuntu.
81Comment[gd]=Àireamhair simplidh airson Ubuntu.
82Comment[gl]=Calculadora sinxela para Ubuntu.
83Comment[he]=מחשבון פשוט לאובונטו.
84Comment[hu]=Egyszerű számológép Ubuntuhoz.
85Comment[is]=Einföld reiknivél
86Comment[it]=Una semplice calcolatrice per Ubuntu.
87Comment[ja]=Ubuntu用のシンプルな電卓です。
88Comment[km]=ម៉ាស៊ីន​គិត​លេខ​ធម្មតា​សម្រាប់ Ubuntu ។
89Comment[ko]=우분투를 위한 간단한 계산기
90Comment[lv]=Vienkāršs kalkulators priekš Ubuntu
91Comment[nb]=En enkel kalkulator for Ubuntu.
92Comment[ne]=Ubuntu को लागि एक सरल कैलकुलेटर।
93Comment[nl]=Een eenvoudige rekenmachine voor Ubuntu.
94Comment[pa]=ਉਬੰਤੂ ਲਈ ਇੱਕ ਸਧਾਰਨ ਕੈਲਕੂਲੇਟਰ
95Comment[pl]=Prosty kalkulator dla Ubuntu
96Comment[pt]=Uma calculadora simples para o Ubuntu.
97Comment[pt_BR]=Uma simples calculadora para Ubuntu
98Comment[ro]=Un calculator simplu pentru Ubuntu.
99Comment[ru]=Простой калькулятор для Ubuntu
100Comment[sa]=Ubuntu इत्यस्मा एकं सरलं सङ्कलकम्।
101Comment[sl]=Preprost kalkulator za Ubuntu.
102Comment[sr]=Једноставан калкулатор за Убунту
103Comment[sv]=En enkel kalkylator för Ubuntu.
104Comment[tr]=Ubuntu için sade bir hesap makinesi.
105Comment[ug]=ئاددىي ھېسابلىغۇچى
106Comment[uk]=Простий калькулятор для Ubuntu.
107Comment[zh_CN]=Ubuntu 简易计算器
108Comment[zh_TW]=Ubuntu 簡易計算機。
109Keywords=math;addition;subtraction;multiplication;division;
110Keywords[am]=ሂሳብ;መደመሪያ;መቀነሻ;ማባዣ;ማካፈያ;
111Keywords[ar]=رياضة;ياضيات;حساب;حسابات;جمع;طرح;ضرب;قسمة;
112Keywords[ast]=matemática;suma;resta;multiplicación;división;
113Keywords[az]=riyaziyyat;әlavә etmә;çıxma;vurma;bölmә;toplama;
114Keywords[br]=matematikoù;sammadenn;lamadenn;lieskementadenn;rannadenn;
115Keywords[ca]=suma;resta;calculadora;multiplica;divideix
116Keywords[da]=matematik;plus;minus;gange;dividere;beregning;lommeregner;
117Keywords[de]=Mathe;Mathematik;Multiplikation;Subtraktion;Addition;Division;
118Keywords[en_AU]=math;addition;subtraction;multiplication;division;
119Keywords[en_GB]=maths;addition;subtraction;multiplication;division;
120Keywords[es]=matemática;suma;resta;multiplicación;división;
121Keywords[eu]=matematikak;gehitu;kendu;biderkatu;zatitu;
122Keywords[fa]=حساب;جمع;تفریق;ضرب;تقسیم
123Keywords[fi]=math;addition;subtraction;multiplication;division;matematiikka;lisäys;vähennys;kertaus;jakaminen;
124Keywords[fr]=math;addition;soustraction;multiplication;division;
125Keywords[gd]=math;addition;subtraction;multiplication;division;matamataig;roinneadh;toirt air falbh;cur ris;iomadadh
126Keywords[gl]=matemáticas;suma;resta;multiplicación;división;
127Keywords[he]=מתמטיקה;חשבון;חיבור;חיסור;כפל;חילוק;
128Keywords[hu]=számolás;összeadás;kivonás;szorzás;osztás;
129Keywords[is]=reikna;samlagning;frádráttur;margföldun;deiling
130Keywords[it]=matematica;addizioni;sottrazioni;moltiplicazioni;divisioni;
131Keywords[ja]=math;addition;subtraction;multiplication;division;計算;電卓;足し算;引き算;かけ算;わり算;
132Keywords[km]=math;addition;subtraction;multiplication;division;
133Keywords[ko]=수학;덧셈;뺄셈;곱셈;나눗셈;
134Keywords[nb]=matte;addisjon;subtraksjon;multiplikasjon;divisjon;
135Keywords[ne]=गणित; जोड्; घटाउ; गुणन; विभाजन;
136Keywords[nl]=math;addition;subtraction;multiplication;division;optellen;aftrekken;vermenigvuldigen;delen;
137Keywords[pa]=ਹਿਸਾਬ;ਜੋੜ;ਘਟਾਉ;ਗੁਣਾ;ਭਾਗ;
138Keywords[pl]=liczenie;dodawanie;odejmowanie;mnożenie;dzielenie;
139Keywords[pt]=matemática;soma;subtracção;multiplicação;divisão;
140Keywords[pt_BR]=matemática;adição;subtração;multiplicação;divisão
141Keywords[ro]=matematică;adunare;scădere;înmulțire;împărțire
142Keywords[ru]=математика;сложение;умножение;деление;
143Keywords[sa]=गणितम्;योजनम्;वियोजनम्;गुणनम्;विभाजनम्;
144Keywords[sl]=matematika;seštevanje;odštevanje;množenje;deljenje;
145Keywords[sr]=математика;сабирање;одузимање;множење;дељење;рачунање;дигитрон;
146Keywords[sv]=matematik;addition;substraktion;multiplikation;division
147Keywords[tr]=matematik;ekleme;çıkarma;çarpma;bölme;toplama
148Keywords[ug]=ماتېماتىكا;قوشۇش;ئېلىش;كۆپەيتىش;بۆلۈش;
149Keywords[uk]=math;addition;subtraction;multiplication;division;математика;додавання;віднімання;множення;ділення;калькулятор;
150Keywords[zh_CN]=数学;加;减;乘;除;
151Keywords[zh_TW]=math;addition;subtraction;multiplication;division;數學;加;減;乘;除;
152Type=Application
153Terminal=false
154Exec=yes -p com.ubuntu.calculator_calculator_1.3.329 -- qmlscene -qt5 ubuntu-calculator-app.qml
155Icon=/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.calculator/calculator-app@30.png
156X-Ubuntu-Touch=true
157X-Ubuntu-StageHint=SideStage
158X-Ubuntu-Default-Department-ID=accessories
159Path=/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.calculator
160X-Ubuntu-Old-Icon=calculator-app@30.png
161X-Ubuntu-Application-ID=com.ubuntu.calculator_calculator_1.3.329
162X-Ubuntu-Splash-Show-Header=True
163X-Ubuntu-Splash-Color=#aabbcc
164X-Ubuntu-Splash-Color-Header=purple
165X-Ubuntu-Splash-Color-Footer=#deadbeefda
166X-Ubuntu-Splash-Image=/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.calculator/calculator-app@30.png
167X-Ubuntu-Splash-Title=Calculator 2.0
168X-Ubuntu-Splash-Title[am]=መደመሪያ 2.0
169X-Ubuntu-Splash-Title[ar]=الآلة 2.0الحاسبة
170X-Ubuntu-Splash-Title[ast]=Calculadora 2.0
171X-Ubuntu-Splash-Title[az]=Kalkulyator 2.0
172X-Ubuntu-Splash-Title[be]=Калькулятар 2.0
173X-Ubuntu-Splash-Title[bg]=Калкулатор 2.0
174X-Ubuntu-Splash-Title[br]=Jederez 2.0
175X-Ubuntu-Splash-Title[bs]=Kalkulator 2.0
176X-Ubuntu-Splash-Title[ca]=Calculadora 2.0
177X-Ubuntu-Splash-Title[cs]=Kalkulačka 2.0
178X-Ubuntu-Splash-Title[cy]=Cyfrifiannell 2.0
179X-Ubuntu-Splash-Title[da]=Lommeregner 2.0
180X-Ubuntu-Splash-Title[de]=Taschenrechner 2.0
181X-Ubuntu-Splash-Title[el]=Αριθμομηχανή 2.0
182X-Ubuntu-Splash-Title[en_AU]=Calculator 2.0
183X-Ubuntu-Splash-Title[en_CA]=Calculator 2.0
184X-Ubuntu-Splash-Title[en_GB]=Calculator 2.0
185X-Ubuntu-Splash-Title[es]=Calculadora 2.0
186X-Ubuntu-Splash-Title[eu]=Kalkulagailua 2.0
187X-Ubuntu-Splash-Title[fa]= 2.0ماشین‌حساب
188X-Ubuntu-Splash-Title[fi]=Laskin 2.0
189X-Ubuntu-Splash-Title[fr]=Calculatrice 2.0
190X-Ubuntu-Splash-Title[gd]=An t-àireamhair 2.0
191X-Ubuntu-Splash-Title[gl]=Calculadora 2.0
192X-Ubuntu-Splash-Title[gu]=કેલ્ક્યુલેટર 2.0
193X-Ubuntu-Splash-Title[he]= 2.0מחשבון
194X-Ubuntu-Splash-Title[hi]=कैलकुलेटर 2.0
195X-Ubuntu-Splash-Title[hu]=Számológép 2.0
196X-Ubuntu-Splash-Title[id]=Kalkulator 2.0
197X-Ubuntu-Splash-Title[is]=Reiknivél 2.0
198X-Ubuntu-Splash-Title[it]=Calcolatrice 2.0
199X-Ubuntu-Splash-Title[ja]=電卓 2.0
200X-Ubuntu-Splash-Title[km]=ម៉ាស៊ីន​គិត​លេខ 2.0
201X-Ubuntu-Splash-Title[ko]=계산기 2.0
202X-Ubuntu-Splash-Title[lv]=Kalkulators 2.0
203X-Ubuntu-Splash-Title[mr]=गणनयंत्र 2.0
204X-Ubuntu-Splash-Title[ms]=Kalkulator 2.0
205X-Ubuntu-Splash-Title[my]=ဂဏန်းတွက်စက် 2.0
206X-Ubuntu-Splash-Title[nb]=Kalkulator 2.0
207X-Ubuntu-Splash-Title[ne]=क्याल्कुलेटर 2.0
208X-Ubuntu-Splash-Title[nl]=Rekenmachine 2.0
209X-Ubuntu-Splash-Title[pa]=ਕੈਲਕੂਲੇਟਰ 2.0
210X-Ubuntu-Splash-Title[pl]=Kalkulator 2.0
211X-Ubuntu-Splash-Title[pt]=Calculadora 2.0
212X-Ubuntu-Splash-Title[pt_BR]=Calculadora 2.0
213X-Ubuntu-Splash-Title[ro]=Calculator 2.0
214X-Ubuntu-Splash-Title[ru]=Калькулятор 2.0
215X-Ubuntu-Splash-Title[sa]=सङ्कलकम् 2.0
216X-Ubuntu-Splash-Title[shn]=ၸၢၵ်ႈၼပ့်သွၼ် 2.0
217X-Ubuntu-Splash-Title[sl]=Računalo 2.0
218X-Ubuntu-Splash-Title[sr]=Калкулатор 2.0
219X-Ubuntu-Splash-Title[sv]=Kalkylator 2.0
220X-Ubuntu-Splash-Title[ta]=கணிப்பான் 2.0
221X-Ubuntu-Splash-Title[te]=గణన పరికరం 2.0
222X-Ubuntu-Splash-Title[tr]=Hesap Makinesi 2.0
223X-Ubuntu-Splash-Title[ug]= 2.0ھېسابلىغۇچ
224X-Ubuntu-Splash-Title[uk]=Калькулятор 2.0
225X-Ubuntu-Splash-Title[zh_CN]=计算器 2.0
226X-Ubuntu-Splash-Title[zh_HK]=計數機 2.0
227X-Ubuntu-Splash-Title[zh_TW]=計算機 2.0
2280
=== removed file 'tests/modules/DesktopFileReader/desktopfilereader_test.cpp'
--- tests/modules/DesktopFileReader/desktopfilereader_test.cpp 2015-09-28 20:11:39 +0000
+++ tests/modules/DesktopFileReader/desktopfilereader_test.cpp 1970-01-01 00:00:00 +0000
@@ -1,200 +0,0 @@
1/*
2 * Copyright (C) 2014-2015 Canonical, Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it under
5 * the terms of the GNU Lesser General Public License version 3, as published by
6 * the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10 * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include <Unity/Application/desktopfilereader.h>
18
19#include <gtest/gtest.h>
20
21#include <QDir>
22#include <QFileInfo>
23#include <QLocale>
24#include <QtGlobal>
25#include <QString>
26
27using namespace qtmir;
28
29namespace {
30 static void setLocale(const char *locale)
31 {
32 qputenv("LANGUAGE", locale);
33 qputenv("LC_ALL", locale); // set these for GIO
34 QLocale::setDefault(QString(locale)); // set for Qt
35 }
36}
37
38TEST(DesktopFileReader, testReadsDesktopFile)
39{
40 using namespace ::testing;
41 setLocale("C");
42
43 QFileInfo fileInfo(QString(TEST_SOURCE_DIR) + "/calculator.desktop");
44 DesktopFileReader::Factory readerFactory;
45 DesktopFileReader *reader = readerFactory.createInstance("calculator", fileInfo);
46
47 EXPECT_EQ(reader->loaded(), true);
48 EXPECT_EQ(reader->appId(), "calculator");
49 EXPECT_EQ(reader->name(), "Calculator");
50 EXPECT_EQ(reader->exec(), "yes -p com.ubuntu.calculator_calculator_1.3.329 -- qmlscene -qt5 ubuntu-calculator-app.qml");
51 EXPECT_EQ(reader->icon(), "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.calculator/calculator-app@30.png");
52 EXPECT_EQ(reader->path(), "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.calculator");
53 EXPECT_EQ(reader->comment(), "A simple calculator for Ubuntu.");
54 EXPECT_EQ(reader->stageHint(), "SideStage");
55 EXPECT_EQ(reader->splashColor(), "#aabbcc");
56 EXPECT_EQ(reader->splashColorFooter(), "#deadbeefda");
57 EXPECT_EQ(reader->splashColorHeader(), "purple");
58 EXPECT_EQ(reader->splashImage(), "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.calculator/calculator-app@30.png");
59 EXPECT_EQ(reader->splashShowHeader(), "True");
60 EXPECT_EQ(reader->splashTitle(), "Calculator 2.0");
61 EXPECT_EQ(reader->isTouchApp(), true);
62}
63
64TEST(DesktopFileReader, testReadsLocalizedDesktopFile)
65{
66 using namespace ::testing;
67 setLocale("de");
68
69 QFileInfo fileInfo(QString(TEST_SOURCE_DIR) + "/calculator.desktop");
70 DesktopFileReader::Factory readerFactory;
71 DesktopFileReader *reader = readerFactory.createInstance("calculator", fileInfo);
72
73 EXPECT_EQ(reader->loaded(), true);
74 EXPECT_EQ(reader->appId(), "calculator");
75 EXPECT_EQ(reader->name(), "Taschenrechner");
76 EXPECT_EQ(reader->exec(), "yes -p com.ubuntu.calculator_calculator_1.3.329 -- qmlscene -qt5 ubuntu-calculator-app.qml");
77 EXPECT_EQ(reader->icon(), "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.calculator/calculator-app@30.png");
78 EXPECT_EQ(reader->path(), "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.calculator");
79 EXPECT_EQ(reader->comment(), "Ein einfach Tachenrechner für Ubuntu.");
80 EXPECT_EQ(reader->stageHint(), "SideStage");
81 EXPECT_EQ(reader->splashColor(), "#aabbcc");
82 EXPECT_EQ(reader->splashColorFooter(), "#deadbeefda");
83 EXPECT_EQ(reader->splashColorHeader(), "purple");
84 EXPECT_EQ(reader->splashImage(), "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.calculator/calculator-app@30.png");
85 EXPECT_EQ(reader->splashShowHeader(), "True");
86 EXPECT_EQ(reader->splashTitle(), "Taschenrechner 2.0");
87 EXPECT_EQ(reader->isTouchApp(), true);
88}
89
90TEST(DesktopFileReader, testMissingDesktopFile)
91{
92 using namespace ::testing;
93 setLocale("C");
94
95 QFileInfo fileInfo(QString(TEST_SOURCE_DIR) + "/missing.desktop");
96 DesktopFileReader::Factory readerFactory;
97 DesktopFileReader *reader = readerFactory.createInstance("calculator", fileInfo);
98
99 EXPECT_EQ(reader->loaded(), false);
100 EXPECT_EQ(reader->appId(), "calculator");
101 EXPECT_EQ(reader->name(), "");
102 EXPECT_EQ(reader->exec(), "");
103 EXPECT_EQ(reader->icon(), "");
104 EXPECT_EQ(reader->path(), "");
105 EXPECT_EQ(reader->comment(), "");
106 EXPECT_EQ(reader->stageHint(), "");
107 EXPECT_EQ(reader->splashColor(), "");
108 EXPECT_EQ(reader->splashColorFooter(), "");
109 EXPECT_EQ(reader->splashColorHeader(), "");
110 EXPECT_EQ(reader->splashImage(), "");
111 EXPECT_EQ(reader->splashShowHeader(), "");
112 EXPECT_EQ(reader->splashTitle(), "");
113 EXPECT_EQ(reader->isTouchApp(), false);
114}
115
116TEST(DesktopFileReader, testUTF8Characters)
117{
118 using namespace ::testing;
119 setLocale("zh_CN");
120
121 QFileInfo fileInfo(QString(TEST_SOURCE_DIR) + "/calculator.desktop");
122 DesktopFileReader::Factory readerFactory;
123 DesktopFileReader *reader = readerFactory.createInstance("calculator", fileInfo);
124
125 EXPECT_EQ(reader->loaded(), true);
126 EXPECT_EQ(reader->appId(), "calculator");
127 EXPECT_EQ(reader->name(), "计算器");
128 EXPECT_EQ(reader->comment(), "Ubuntu 简易计算器");
129 EXPECT_EQ(reader->splashTitle(), "计算器 2.0");
130}
131
132TEST(DesktopFileReader, parseOrientations)
133{
134 using namespace ::testing;
135
136 const Qt::ScreenOrientations defaultOrientations = Qt::PortraitOrientation | Qt::LandscapeOrientation
137 | Qt::InvertedPortraitOrientation | Qt::InvertedLandscapeOrientation;
138 bool ok;
139 Qt::ScreenOrientations orientations;
140
141 ok = DesktopFileReader::parseOrientations(QString(), orientations);
142 ASSERT_TRUE(ok);
143 EXPECT_EQ(defaultOrientations, orientations);
144
145 ok = DesktopFileReader::parseOrientations("An invalid string!", orientations);
146 ASSERT_FALSE(ok);
147 EXPECT_EQ(defaultOrientations, orientations);
148
149 ok = DesktopFileReader::parseOrientations("landscape", orientations);
150 ASSERT_TRUE(ok);
151 EXPECT_EQ(Qt::LandscapeOrientation, orientations);
152
153 ok = DesktopFileReader::parseOrientations(" InvertedPortrait , Portrait ", orientations);
154 ASSERT_TRUE(ok);
155 EXPECT_EQ(Qt::InvertedPortraitOrientation | Qt::PortraitOrientation, orientations);
156
157 ok = DesktopFileReader::parseOrientations(",inverted-landscape, inverted_portrait, ", orientations);
158 ASSERT_TRUE(ok);
159 EXPECT_EQ(Qt::InvertedPortraitOrientation | Qt::InvertedLandscapeOrientation, orientations);
160
161 ok = DesktopFileReader::parseOrientations(",inverted-landscape, some-invalid-text, ", orientations);
162 ASSERT_FALSE(ok);
163 EXPECT_EQ(defaultOrientations, orientations);
164
165 ok = DesktopFileReader::parseOrientations("landscape;portrait", orientations);
166 ASSERT_TRUE(ok);
167 EXPECT_EQ(Qt::PortraitOrientation | Qt::LandscapeOrientation, orientations);
168
169 ok = DesktopFileReader::parseOrientations("primary", orientations);
170 ASSERT_TRUE(ok);
171 EXPECT_EQ(Qt::PrimaryOrientation, orientations);
172
173 ok = DesktopFileReader::parseOrientations("landscpe,primary", orientations);
174 ASSERT_FALSE(ok);
175 EXPECT_EQ(defaultOrientations, orientations);
176}
177
178TEST(DesktopFileReader, parseBoolean)
179{
180 using namespace ::testing;
181
182 bool ok;
183 bool boolean;
184
185 ok = DesktopFileReader::parseBoolean(QString(), boolean);
186 ASSERT_TRUE(ok);
187 EXPECT_FALSE(boolean);
188
189 ok = DesktopFileReader::parseBoolean(" Yes ", boolean);
190 ASSERT_TRUE(ok);
191 EXPECT_TRUE(boolean);
192
193 ok = DesktopFileReader::parseBoolean("False", boolean);
194 ASSERT_TRUE(ok);
195 EXPECT_FALSE(boolean);
196
197 ok = DesktopFileReader::parseBoolean("Hello World!", boolean);
198 ASSERT_FALSE(ok);
199 EXPECT_FALSE(boolean);
200}

Subscribers

People subscribed via source and target branches