16
16
# with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
"""Windows tests."""
19
# pylint: disable=F0401
20
from _winreg import REG_SZ
19
22
from mocker import MATCH, Mocker, MockerTestCase
21
24
from twisted.internet import defer, reactor
22
25
from twisted.trial.unittest import TestCase
23
from twisted.spread.pb import PBClientFactory, PBServerFactory
26
from twisted.spread.pb import (
31
from ubuntu_sso.main import windows
24
32
from ubuntu_sso.main.windows import (
27
35
CredentialsManagement,
28
36
CredentialsManagementClient,
30
39
SSOCredentialsClient,
35
NAMED_PIPE_URL = "\\\\.\\pipe\\ubuntuone_sso\\tests"
37
46
# because we are using twisted we have java like names C0103 and
38
47
# the issues that mocker brings with it like W0104
145
154
# pylint: enable=W0201
157
class FakeDeadRemoteClient(object):
158
"""A fake dead remote client."""
160
def callRemote(self, signal_name, *args, **kwargs):
161
"""Fails with DeadReferenceError."""
162
raise DeadReferenceError("Calling Stale Broker")
165
class SignalBroadcasterTestCase(TestCase):
166
"""Test the SignalBroadcaster class."""
168
def test_emit_signal_dead_reference(self):
169
"""Test dead reference while emiting the signal."""
170
fake_remote_client = FakeDeadRemoteClient()
171
sb = SignalBroadcaster()
172
sb.remote_register_to_signals(fake_remote_client)
173
self.assertIn(fake_remote_client, sb.clients)
174
sb.emit_signal("sample_signal")
175
self.assertNotIn(fake_remote_client, sb.clients)
148
178
class SSOLoginTestCase(TestCase):
149
179
"""Test the login class."""
161
191
self.sso_root = UbuntuSSORoot(self.login, None, None)
162
192
self.server_factory = SaveProtocolServerFactory(self.sso_root)
163
193
# pylint: disable=E1101
164
self.listener = reactor.listenPipe(NAMED_PIPE_URL, self.server_factory)
194
host, port = get_sso_pb_hostport()
195
self.listener = reactor.listenTCP(port, self.server_factory)
165
196
self.client_factory = PBClientFactory()
166
self.connector = reactor.connectPipe(NAMED_PIPE_URL,
197
self.connector = reactor.connectTCP(host, port,
167
198
self.client_factory)
168
199
# pylint: enable=E1101
659
690
self.sso_root = UbuntuSSORoot(None, self.creds, None)
660
691
self.server_factory = SaveProtocolServerFactory(self.sso_root)
661
692
# pylint: disable=E1101
662
self.listener = reactor.listenPipe(NAMED_PIPE_URL, self.server_factory)
693
host, port = get_sso_pb_hostport()
694
self.listener = reactor.listenTCP(port, self.server_factory)
663
695
self.client_factory = PBClientFactory()
664
self.connector = reactor.connectPipe(NAMED_PIPE_URL,
696
self.connector = reactor.connectTCP(host, port,
665
697
self.client_factory)
666
698
# pylint: enable=E1101
913
945
self.sso_root = UbuntuSSORoot(None, None, self.creds)
914
946
self.server_factory = SaveProtocolServerFactory(self.sso_root)
915
947
# pylint: disable=E1101
916
self.listener = reactor.listenPipe(NAMED_PIPE_URL, self.server_factory)
948
host, port = get_sso_pb_hostport()
949
self.listener = reactor.listenTCP(port, self.server_factory)
917
950
self.client_factory = PBClientFactory()
918
self.connector = reactor.connectPipe(NAMED_PIPE_URL,
951
self.connector = reactor.connectTCP(host, port,
919
952
self.client_factory)
920
953
# pylint: enable=E1101
1223
1256
d.addCallback(test_execution)
1224
1257
# pylint: enable=E1101
1261
class MockRemoteObject(object):
1262
"""A mock RemoteObject."""
1265
"""A place to store MockRemoteObjects created by this."""
1268
def callRemote(self, method_name, *args, **kwargs):
1269
"""Any call to a remote object returns one of us."""
1270
new_child = MockRemoteObject()
1271
self.children.append(new_child)
1272
return defer.succeed(new_child)
1275
class MockPBClientFactory(object):
1276
"""A mock PBClientFactory."""
1281
def getRootObject(self):
1282
"""Store that we were called; return a deferred."""
1283
assert self.connected == True
1284
self.root_object = MockRemoteObject()
1285
return defer.succeed(self.root_object)
1288
class MockReactor(object):
1289
"""A mock twisted.reactor."""
1291
def connectTCP(self, host, port, factory):
1292
"""Set the factory as connected."""
1293
factory.connected = True
1296
class MockActivationClient(object):
1297
"""A mock tcpactivation.ActivationClient."""
1300
"""Initialize this mock instance."""
1302
self.port_requested = False
1304
def _set_config(self, config):
1305
"""Set the configuration."""
1306
self.config = config
1309
def get_active_port(self):
1310
"""Return the port for tests."""
1311
self.port_requested = True
1312
return defer.succeed(self.config.port)
1315
class UbuntuSSOClientTestCase(TestCase):
1316
"""Tests for the UbuntuSSOClient class."""
1318
@defer.inlineCallbacks
1319
def test_connect(self):
1320
"""Test the connect method."""
1321
ussoc = UbuntuSSOClient()
1322
mac = MockActivationClient()
1323
self.patch(windows, "reactor", MockReactor())
1324
self.patch(windows, "PBClientFactory", MockPBClientFactory)
1325
# pylint: disable=W0212
1326
self.patch(windows, "ActivationClient", mac._set_config)
1327
self.patch(windows, "get_activation_cmdline",
1328
lambda _: "sample executable")
1329
connect_result = yield ussoc.connect()
1330
self.assertEqual(connect_result, ussoc)
1331
self.assertTrue(mac.port_requested, "The port must be requested.")
1332
self.assertNotEqual(ussoc.sso_login, None)
1333
self.assertNotEqual(ussoc.sso_cred, None)
1334
self.assertNotEqual(ussoc.cred_management, None)
1336
def test_get_activation_cmdline(self):
1337
"""Test the get_activation_cmdline method."""
1338
SAMPLE_VALUE = "test 123"
1339
self.patch(windows, "OpenKey", lambda key, subkey: SAMPLE_VALUE)
1340
self.patch(windows, "QueryValueEx", lambda key, v: (key, REG_SZ))
1341
cmdline = windows.get_activation_cmdline(windows.SSO_SERVICE_NAME)
1342
self.assertEqual(SAMPLE_VALUE, cmdline)