1
// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
3
* Copyright (C) 2014 Canonical Ltd
5
* This program is free software: you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License version 3 as
7
* published by the Free Software Foundation.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17
* Authored by: Andrea Azzarone <andrea.azzarone@canonical.com>
20
#include <gmock/gmock.h>
21
using namespace testing;
23
#include "lockscreen/LockScreenController.h"
25
#include <Nux/NuxTimerTickSource.h>
26
#include <NuxCore/AnimationController.h>
27
#include <UnityCore/GLibDBusServer.h>
30
#include "lockscreen/LockScreenSettings.h"
31
#include "unity-shared/PanelStyle.h"
32
#include "unity-shared/UScreen.h"
33
#include "unity-shared/UnitySettings.h"
34
#include "test_mock_session_manager.h"
35
#include "test_uscreen_mock.h"
36
#include "test_utils.h"
45
const unsigned ANIMATION_DURATION = 400 * 1000; // in microseconds
46
const unsigned TICK_DURATION = 10 * 1000;
48
const std::string TEST_SERVER_NAME = "com.canonical.Unity.Test.DisplayManager";
49
const std::string LIGHTDM_PATH = "/org/freedesktop/DisplayManager/Session0";
53
namespace introspection
56
const std::string LIGHTDM =
58
<interface name="org.freedesktop.DisplayManager.Session">
65
struct ShieldFactoryMock : ShieldFactoryInterface
67
nux::ObjectPtr<AbstractShield> CreateShield(session::Manager::Ptr const&, int, bool) override
69
return nux::ObjectPtr<AbstractShield>(new AbstractShield(nullptr, 0, false));
73
struct TestLockScreenController : Test
75
TestLockScreenController()
76
: animation_controller(tick_source)
77
, session_manager(std::make_shared<NiceMock<session::MockManager>>())
78
, upstart_wrapper(std::make_shared<UpstartWrapper>())
79
, shield_factory(std::make_shared<ShieldFactoryMock>())
80
, controller(session_manager, upstart_wrapper, shield_factory)
82
lightdm_ = std::make_shared<glib::DBusServer>(TEST_SERVER_NAME);
83
lightdm_->AddObjects(introspection::LIGHTDM, LIGHTDM_PATH);
85
Utils::WaitUntilMSec([] { return lightdm_->IsConnected(); });
88
struct ControllerWrap : Controller
90
ControllerWrap(session::Manager::Ptr const& session_manager,
91
UpstartWrapper::Ptr const& upstart_wrapper,
92
ShieldFactoryInterface::Ptr const& shield_factory)
93
: Controller(session_manager, upstart_wrapper, shield_factory, /* test_mode */ true)
96
using Controller::shields_;
99
nux::NuxTimerTickSource tick_source;
100
nux::animation::AnimationController animation_controller;
103
unity::Settings unity_settings;
104
unity::panel::Style panel_style;
105
unity::lockscreen::Settings lockscreen_settings;
106
static glib::DBusServer::Ptr lightdm_;
107
session::MockManager::Ptr session_manager;
108
unity::UpstartWrapper::Ptr upstart_wrapper;
110
ShieldFactoryMock::Ptr shield_factory;
111
ControllerWrap controller;
114
glib::DBusServer::Ptr TestLockScreenController::lightdm_;
116
TEST_F(TestLockScreenController, Construct)
118
EXPECT_TRUE(controller.shields_.empty());
121
TEST_F(TestLockScreenController, DisconnectUScreenSignalsOnDestruction)
123
size_t before = uscreen.changed.size();
125
Controller dummy(session_manager);
127
ASSERT_EQ(before, uscreen.changed.size());
129
std::vector<nux::Geometry> monitors;
130
uscreen.changed.emit(0, monitors);
133
TEST_F(TestLockScreenController, DisconnectSessionManagerSignalsOnDestruction)
135
size_t before = session_manager->unlock_requested.size();
137
Controller dummy(session_manager);
139
ASSERT_EQ(before, session_manager->unlock_requested.size());
141
session_manager->unlock_requested.emit();
144
TEST_F(TestLockScreenController, UScreenChangedIgnoredOnScreenUnlocked)
146
uscreen.SetupFakeMultiMonitor(/*primary*/ 0, /*emit_change*/ true);
147
EXPECT_TRUE(controller.shields_.empty());
150
TEST_F(TestLockScreenController, LockScreenTypeNone)
152
lockscreen_settings.lockscreen_type = Type::NONE;
153
session_manager->lock_requested.emit();
155
ASSERT_EQ(0, controller.shields_.size());
158
TEST_F(TestLockScreenController, LockScreenTypeLightdmOnSingleMonitor)
160
g_setenv("XDG_SESSION_PATH", LIGHTDM_PATH.c_str(), true);
162
bool lock_called = false;
164
lightdm_->GetObjects().front()->SetMethodsCallsHandler([&] (std::string const& method, GVariant*) -> GVariant* {
165
if (method == "Lock")
171
lockscreen_settings.lockscreen_type = Type::LIGHTDM;
172
session_manager->lock_requested.emit();
174
ASSERT_EQ(1, controller.shields_.size());
175
EXPECT_FALSE(controller.shields_.at(0)->primary());
176
Utils::WaitUntilMSec(lock_called);
179
TEST_F(TestLockScreenController, LockScreenTypeLightdmOnMultiMonitor)
181
g_setenv("XDG_SESSION_PATH", LIGHTDM_PATH.c_str(), true);
183
bool lock_called = false;
185
lightdm_->GetObjects().front()->SetMethodsCallsHandler([&] (std::string const& method, GVariant*) -> GVariant* {
186
if (method == "Lock")
192
lockscreen_settings.lockscreen_type = Type::LIGHTDM;
193
uscreen.SetupFakeMultiMonitor(/*primary*/ 0, /*emit_change*/ true);
194
session_manager->lock_requested.emit();
196
ASSERT_EQ(monitors::MAX, controller.shields_.size());
198
for (unsigned int i=0; i < monitors::MAX; ++i)
199
EXPECT_FALSE(controller.shields_.at(i)->primary());
201
Utils::WaitUntilMSec(lock_called);
204
TEST_F(TestLockScreenController, UnlockScreenTypeLightdmOnSingleMonitor)
206
g_setenv("XDG_SESSION_PATH", LIGHTDM_PATH.c_str(), true);
208
bool lock_called = false;
210
lightdm_->GetObjects().front()->SetMethodsCallsHandler([&] (std::string const& method, GVariant*) -> GVariant* {
211
if (method == "Lock")
217
lockscreen_settings.lockscreen_type = Type::LIGHTDM;
218
session_manager->lock_requested.emit();
220
ASSERT_EQ(1, controller.shields_.size());
221
Utils::WaitUntilMSec(lock_called);
223
session_manager->unlock_requested.emit();
224
tick_source.tick(ANIMATION_DURATION);
226
ASSERT_EQ(0, controller.shields_.size());
229
TEST_F(TestLockScreenController, UnlockScreenTypeLightdmOnMultiMonitor)
231
g_setenv("XDG_SESSION_PATH", LIGHTDM_PATH.c_str(), true);
233
bool lock_called = false;
235
lightdm_->GetObjects().front()->SetMethodsCallsHandler([&] (std::string const& method, GVariant*) -> GVariant* {
236
if (method == "Lock")
242
lockscreen_settings.lockscreen_type = Type::LIGHTDM;
243
uscreen.SetupFakeMultiMonitor(/*primary*/ 0, /*emit_change*/ true);
244
session_manager->lock_requested.emit();
246
ASSERT_EQ(monitors::MAX, controller.shields_.size());
247
Utils::WaitUntilMSec(lock_called);
249
session_manager->unlock_requested.emit();
250
tick_source.tick(ANIMATION_DURATION);
252
ASSERT_EQ(0, controller.shields_.size());
255
TEST_F(TestLockScreenController, LockScreenOnSingleMonitor)
257
session_manager->lock_requested.emit();
259
ASSERT_EQ(1, controller.shields_.size());
260
EXPECT_EQ(uscreen.GetMonitors().at(0), controller.shields_.at(0)->GetGeometry());
263
TEST_F(TestLockScreenController, LockScreenOnMultiMonitor)
265
uscreen.SetupFakeMultiMonitor();
267
session_manager->lock_requested.emit();
268
ASSERT_EQ(monitors::MAX, controller.shields_.size());
270
for (unsigned int i=0; i < monitors::MAX; ++i)
271
EXPECT_EQ(uscreen.GetMonitors().at(i), controller.shields_.at(i)->GetAbsoluteGeometry());
274
TEST_F(TestLockScreenController, SwitchToMultiMonitor)
276
session_manager->lock_requested.emit();
277
tick_source.tick(ANIMATION_DURATION);
279
ASSERT_EQ(1, controller.shields_.size());
280
EXPECT_EQ(uscreen.GetMonitors().at(0), controller.shields_.at(0)->GetGeometry());
282
uscreen.SetupFakeMultiMonitor(/* primary */ 0, /* emit_change */ true);
284
ASSERT_EQ(monitors::MAX, controller.shields_.size());
286
for (unsigned int i=0; i < monitors::MAX; ++i)
288
ASSERT_EQ(uscreen.GetMonitors().at(i), controller.shields_.at(i)->GetAbsoluteGeometry());
289
ASSERT_TRUE(controller.shields_.at(i)->IsVisible());
293
TEST_F(TestLockScreenController, SwitchToSingleMonitor)
295
uscreen.SetupFakeMultiMonitor(/* primary */ 0, /* emit_change */ true);
296
session_manager->lock_requested.emit();
298
ASSERT_EQ(monitors::MAX, controller.shields_.size());
300
for (unsigned int i=0; i < monitors::MAX; ++i)
301
ASSERT_EQ(uscreen.GetMonitors().at(i), controller.shields_.at(i)->GetAbsoluteGeometry());
303
uscreen.Reset(/* emit_change */ true);
305
ASSERT_EQ(1, controller.shields_.size());
306
EXPECT_EQ(uscreen.GetMonitors().at(0), controller.shields_.at(0)->GetGeometry());
309
TEST_F(TestLockScreenController, UnlockScreenOnSingleMonitor)
311
session_manager->lock_requested.emit();
313
ASSERT_EQ(1, controller.shields_.size());
315
session_manager->unlock_requested.emit();
316
tick_source.tick(ANIMATION_DURATION);
318
EXPECT_TRUE(controller.shields_.empty());
321
TEST_F(TestLockScreenController, UnlockScreenOnMultiMonitor)
323
uscreen.SetupFakeMultiMonitor(/* primary */ 0, /* emit_change */ true);
324
session_manager->lock_requested.emit();
326
ASSERT_EQ(monitors::MAX, controller.shields_.size());
328
session_manager->unlock_requested.emit();
329
tick_source.tick(ANIMATION_DURATION);
331
EXPECT_TRUE(controller.shields_.empty());