18
#include <Unity/Application/application_manager.h>
20
#include <Unity/Application/applicationcontroller.h>
21
#include <Unity/Application/taskcontroller.h>
22
#include <Unity/Application/proc_info.h>
23
#include <mirserverconfiguration.h>
25
#include <core/posix/linux/proc/process/oom_score_adj.h>
27
#include <gmock/gmock.h>
28
#include <gtest/gtest.h>
30
19
#include <condition_variable>
31
20
#include <QSignalSpy>
33
22
#include <applicationscreenshotprovider.h>
35
#include "mock_application_controller.h"
36
#include "mock_desktop_file_reader.h"
37
#include "mock_oom_controller.h"
38
#include "mock_process_controller.h"
39
#include "mock_proc_info.h"
40
#include "mock_session.h"
41
#include "mock_surface.h"
42
#include "mock_focus_controller.h"
43
#include "mock_prompt_session_manager.h"
44
#include "mock_prompt_session.h"
24
#include "mock_surface.h"
25
#include "qtmir_test.h"
46
27
using namespace qtmir;
48
29
namespace ms = mir::scene;
50
class TestMirConfiguration: public MirServerConfiguration
53
TestMirConfiguration()
54
: MirServerConfiguration(0, nullptr)
55
, mock_prompt_session_manager(std::make_shared<testing::MockPromptSessionManager>())
59
std::shared_ptr<ms::PromptSessionManager> the_prompt_session_manager() override
61
return prompt_session_manager([this]()
62
->std::shared_ptr<ms::PromptSessionManager>
64
return the_mock_prompt_session_manager();
68
std::shared_ptr<testing::MockPromptSessionManager> the_mock_prompt_session_manager()
70
return mock_prompt_session_manager;
73
std::shared_ptr<testing::MockPromptSessionManager> mock_prompt_session_manager;
76
class ApplicationManagerTests : public ::testing::Test
31
class ApplicationManagerTests : public ::testing::QtMirTest
79
34
ApplicationManagerTests()
81
QSharedPointer<ProcessController::OomController> (
83
[](ProcessController::OomController*){})
86
QSharedPointer<TestMirConfiguration> (new TestMirConfiguration)
89
QSharedPointer<TaskController> (
92
QSharedPointer<ApplicationController>(
94
[](ApplicationController*){}),
95
QSharedPointer<ProcessController>(
97
[](ProcessController*){})
101
, applicationManager{
104
QSharedPointer<DesktopFileReader::Factory>(
105
&desktopFileReaderFactory,
106
[](DesktopFileReader::Factory*){}),
107
QSharedPointer<ProcInfo>(&procInfo,[](ProcInfo *){})
112
Application* startApplication(quint64 procId, QString const& appId)
114
using namespace testing;
116
ON_CALL(appController,appIdHasProcessId(procId, appId)).WillByDefault(Return(true));
118
// Set up Mocks & signal watcher
119
auto mockDesktopFileReader = new NiceMock<MockDesktopFileReader>(appId, QFileInfo());
120
ON_CALL(*mockDesktopFileReader, loaded()).WillByDefault(Return(true));
121
ON_CALL(*mockDesktopFileReader, appId()).WillByDefault(Return(appId));
123
ON_CALL(desktopFileReaderFactory, createInstance(appId, _)).WillByDefault(Return(mockDesktopFileReader));
125
EXPECT_CALL(appController, startApplicationWithAppIdAndArgs(appId, _))
127
.WillOnce(Return(true));
129
auto application = applicationManager.startApplication(appId, ApplicationManager::NoFlag);
130
applicationManager.onProcessStarting(appId);
133
applicationManager.authorizeSession(procId, authed);
134
EXPECT_EQ(authed, true);
136
auto appSession = std::make_shared<MockSession>(appId.toStdString(), procId);
138
applicationManager.onSessionStarting(appSession);
142
testing::NiceMock<testing::MockOomController> oomController;
143
testing::NiceMock<testing::MockProcessController> processController;
144
testing::NiceMock<testing::MockApplicationController> appController;
145
testing::NiceMock<testing::MockProcInfo> procInfo;
146
testing::NiceMock<testing::MockDesktopFileReaderFactory> desktopFileReaderFactory;
147
QSharedPointer<TestMirConfiguration> mirConfig;
148
QSharedPointer<TaskController> taskController;
149
ApplicationManager applicationManager;
37
inline void onSessionStarting(const std::shared_ptr<mir::scene::Session> &session) {
38
applicationManager.onSessionStarting(session);
39
sessionManager.onSessionStarting(session);
41
inline void onSessionStopping(const std::shared_ptr<mir::scene::Session> &session) {
42
applicationManager.onSessionStopping(session);
43
sessionManager.onSessionStopping(session);
152
47
TEST_F(ApplicationManagerTests, SuspendingAndResumingARunningApplicationResultsInOomScoreAdjustment)
415
312
applicationManager.authorizeSession(first_procId, authed);
416
313
applicationManager.authorizeSession(second_procId, authed);
417
314
applicationManager.authorizeSession(third_procId, authed);
418
applicationManager.onSessionStarting(first_session);
419
applicationManager.onSessionStarting(third_session);
420
applicationManager.onSessionStarting(second_session);
315
onSessionStarting(first_session);
316
onSessionStarting(third_session);
317
onSessionStarting(second_session);
422
319
Application * firstApp = applicationManager.findApplication(first_app_id);
423
320
Application * secondApp = applicationManager.findApplication(second_app_id);
424
321
Application * thirdApp = applicationManager.findApplication(third_app_id);
426
EXPECT_EQ(first_session, firstApp->session());
427
EXPECT_EQ(second_session, secondApp->session());
428
EXPECT_EQ(third_session, thirdApp->session());
323
EXPECT_EQ(first_session, firstApp->session()->session());
324
EXPECT_EQ(second_session, secondApp->session()->session());
325
EXPECT_EQ(third_session, thirdApp->session()->session());
431
328
TEST_F(ApplicationManagerTests,two_session_on_one_application)
494
391
std::shared_ptr<mir::scene::Session> second_session = std::make_shared<MockSession>("oO", a_procId);
495
392
applicationManager.authorizeSession(a_procId, authed);
497
applicationManager.onSessionStarting(first_session);
394
onSessionStarting(first_session);
498
395
applicationManager.onSessionCreatedSurface(first_session.get(), aSurface);
499
applicationManager.onSessionStarting(second_session);
396
onSessionStarting(second_session);
501
398
Application * the_app = applicationManager.findApplication(an_app_id);
503
400
EXPECT_EQ(true, authed);
504
401
EXPECT_EQ(Application::Running, the_app->state());
505
EXPECT_EQ(first_session, the_app->session());
402
EXPECT_EQ(first_session, the_app->session()->session());
508
405
TEST_F(ApplicationManagerTests,suspended_suspends_focused_app_and_marks_it_unfocused_in_the_model)
1391
1288
std::shared_ptr<mir::scene::Session> session = std::make_shared<MockSession>("", procId);
1392
1289
bool authed = true;
1393
1290
applicationManager.authorizeSession(procId, authed);
1394
applicationManager.onSessionStarting(session);
1291
onSessionStarting(session);
1396
1293
QSignalSpy countSpy(&applicationManager, SIGNAL(countChanged()));
1397
1294
QSignalSpy removedSpy(&applicationManager, SIGNAL(applicationRemoved(const QString &)));
1399
1296
// Mir notifies of stopping app
1400
applicationManager.onSessionStopping(session);
1297
onSessionStopping(session);
1402
1299
EXPECT_EQ(countSpy.count(), 2); //FIXME(greyback)
1403
1300
EXPECT_EQ(applicationManager.count(), 0);