]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - tests/src/test-python-greeter
Fix up final tests
[sojka/lightdm.git] / tests / src / test-python-greeter
1 #!/usr/bin/python
2
3 import sys
4 import os
5 import struct
6 import socket
7 import subprocess
8 import signal
9 from gi.repository import GLib
10 from gi.repository import LightDM
11
12 display = os.getenv ('DISPLAY');
13 if display is None:
14     greeter_id = 'GREETER-?'
15 elif display.startswith (':'):
16     greeter_id = 'GREETER-X-%s' % display[1:]
17 else:
18     greeter_id = 'GREETER-X-%s' % display
19
20 loop = GLib.MainLoop ()
21
22 def sigterm_cb (data):
23     status_notify ('%s TERMINATE SIGNAL=%d' % (greeter_id, signal.SIGTERM))
24     loop.quit ()
25 GLib.unix_signal_add (GLib.PRIORITY_DEFAULT, signal.SIGTERM, sigterm_cb, None)
26
27 status_socket = None
28
29 def status_notify (message):
30     if status_socket is not None:
31         status_socket.send (struct.pack ('i', len (message)) + message)
32     else:
33         sys.stderr.write ('%s\n' % message)
34
35 def request_cb (channel, condition):
36     length = status_socket.recv (4)
37     if len (length) == 0:
38         loop.quit ();
39         return False
40     if len (length) > 0:
41         (l,) = struct.unpack ('i', length)
42         request = status_socket.recv (l)
43
44     r = '%s AUTHENTICATE' % greeter_id
45     if request == r:
46         greeter.authenticate (None)
47
48     r = '%s AUTHENTICATE USERNAME=' % greeter_id
49     if request.startswith (r):
50         greeter.authenticate (request[len(r):])
51
52     r = '%s AUTHENTICATE-GUEST' % greeter_id
53     if request == r:
54         greeter.authenticate_as_guest ()
55
56     r = '%s AUTHENTICATE-AUTOLOGIN' % greeter_id
57     if request == r:
58         greeter.authenticate_autologin ()
59
60     r = '%s AUTHENTICATE-REMOTE SESSION=' % greeter_id
61     if request.startswith (r):
62         greeter.authenticate_remote (request[len(r):], None)
63
64     r = '%s RESPOND TEXT=\"' % greeter_id
65     if request.startswith (r):
66         greeter.respond (request[len (r):-1])
67
68     r = '%s CANCEL-AUTHENTICATION' % greeter_id
69     if request == r:
70         greeter.cancel_authentication ()
71
72     r = '%s START-SESSION' % greeter_id
73     if request == r:
74         if not greeter.start_session_sync (None):
75             status_notify ('%s SESSION-FAILED' % greeter_id)
76
77     r = '%s START-SESSION SESSION=' % greeter_id
78     if request.startswith (r):
79         if not greeter.start_session_sync (request[len(r):]):
80             status_notify ('%s SESSION-FAILED' % greeter_id)
81
82     r = '%s LOG-USER-LIST-LENGTH' % greeter_id
83     if request == r:
84         status_notify ('%s LOG-USER-LIST-LENGTH N=%d' % (greeter_id, LightDM.UserList.get_instance ().get_length ()))
85
86     r = '%s LOG-USER USERNAME=' % greeter_id
87     if request.startswith (r):
88         username = request[len(r):]
89         user = LightDM.UserList.get_instance ().get_user_by_name (username)
90         status_notify ('%s LOG-USER USERNAME=%s' % (greeter_id, user.get_name ()))
91
92     r = '%s LOG-USER-LIST' % greeter_id
93     if request == r:
94         users = LightDM.UserList.get_instance ().get_users ();
95         for user in users:
96             status_notify ('%s LOG-USER USERNAME=%s' % (greeter_id, user.get_name ()))
97
98     r = '%s LOG-LAYOUT' % greeter_id
99     if request == r:
100         layout = LightDM.get_layout ().get_name ()
101         status_notify ('%s LOG-LAYOUT LAYOUT=%s' % (greeter_id, layout))
102
103     r = '%s LOG-LAYOUT USERNAME=' % greeter_id
104     if request.startswith (r):
105         username = request[len(r):]
106         user = LightDM.UserList.get_instance ().get_user_by_name (username)
107         layout = user.get_layout ()
108         if layout is None:
109             layout = ''
110         status_notify ('%s LOG-LAYOUT USERNAME=%s LAYOUT=%s' % (greeter_id, username, layout))
111
112     r = '%s LOG-LANGUAGE USERNAME=' % greeter_id
113     if request.startswith (r):
114         username = request[len(r):]
115         user = LightDM.UserList.get_instance ().get_user_by_name (username)
116         language = user.get_language ()
117         if language is None:
118             language = ''
119         status_notify ('%s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s' % (greeter_id, username, language))
120
121     r = '%s GET-CAN-SUSPEND' % greeter_id
122     if request == r:
123         if LightDM.get_can_suspend ():
124             allowed = "TRUE"
125         else:
126             allowed = "FALSE"
127         status_notify ('%s CAN-SUSPEND ALLOWED=%s' % (greeter_id, allowed))
128
129     r = '%s SUSPEND' % greeter_id
130     if request == r:
131         try:
132             LightDM.suspend ()
133         except:
134             status_notify ('%s FAIL-SUSPEND' % greeter_id)
135
136     r = '%s GET-CAN-HIBERNATE' % greeter_id
137     if request == r:
138         if LightDM.get_can_hibernate ():
139             allowed = "TRUE"
140         else:
141             allowed = "FALSE"
142         status_notify ('%s CAN-HIBERNATE ALLOWED=%s' % (greeter_id, allowed))
143
144     r = '%s HIBERNATE' % greeter_id
145     if request == r:
146         try:
147             LightDM.hibernate ()
148         except:
149             status_notify ('%s FAIL-HIBERNATE' % greeter_id)
150
151     r = '%s GET-CAN-RESTART' % greeter_id
152     if request == r:
153         if LightDM.get_can_restart ():
154             allowed = "TRUE"
155         else:
156             allowed = "FALSE"
157         status_notify ('%s CAN-RESTART ALLOWED=%s' % (greeter_id, allowed))
158
159     r = '%s RESTART' % greeter_id
160     if request == r:
161         try:
162             LightDM.restart ()
163         except:
164             status_notify ('%s FAIL-RESTART' % greeter_id)
165
166     r = '%s GET-CAN-SHUTDOWN' % greeter_id
167     if request == r:
168         if LightDM.get_can_shutdown ():
169             allowed = "TRUE"
170         else:
171             allowed = "FALSE"
172         status_notify ('%s CAN-SHUTDOWN ALLOWED=%s' % (greeter_id, allowed))
173
174     r = '%s SHUTDOWN' % greeter_id
175     if request == r:
176         try:
177             LightDM.shutdown ()
178         except:
179             status_notify ('%s FAIL-SHUTDOWN' % greeter_id)
180
181     return True
182
183 path = os.getenv ('LIGHTDM_TEST_ROOT') + '/.s'
184 status_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
185 status_socket.connect (path)
186 GLib.io_add_watch (status_socket.fileno (), GLib.IO_IN | GLib.IO_HUP, request_cb)
187
188 status_notify ('%s START' % greeter_id)
189
190 config = GLib.KeyFile ()
191 config.load_from_file (os.getenv ('LIGHTDM_TEST_ROOT') + '/script', GLib.KeyFileFlags.NONE)
192
193 # NOTE: There don't seem to be any good X bindings so we have to mock up our own...
194 (host, display_number) = display.split (':')
195 if host == '':
196     x_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
197     x_socket.connect (os.getenv ('LIGHTDM_TEST_ROOT') + '/.x' + display)
198 else:
199     x_socket = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
200     x_socket.connect ((host, 6000 + int (display_number)))
201
202 status_notify ('%s CONNECT-XSERVER' % (greeter_id))
203
204 def show_message_cb (greeter, text, type):
205     status_notify ('%s SHOW-MESSAGE TEXT=\"%s\"' % (greeter_id, text))
206
207 def show_prompt_cb (greeter, text, type):
208     status_notify ('%s SHOW-PROMPT TEXT=\"%s\"' % (greeter_id, text))
209
210 def authentication_complete_cb (greeter):
211     if greeter.get_is_authenticated ():
212         is_authenticated = 'TRUE'
213     else:
214         is_authenticated = 'FALSE'
215     if greeter.get_authentication_user () is not None:
216         status_notify ('%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s' % (greeter_id, greeter.get_authentication_user (), is_authenticated))
217     else:
218         status_notify ('%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s' % (greeter_id, is_authenticated))
219
220 def autologin_timer_expired_cb (greeter):
221     status_notify ('%s AUTOLOGIN-TIMER-EXPIRED' % greeter_id)
222
223 greeter = LightDM.Greeter ()
224 greeter.connect ('show-message', show_message_cb)
225 greeter.connect ('show-prompt', show_prompt_cb)
226 greeter.connect ('authentication-complete', authentication_complete_cb)
227 greeter.connect ('autologin-timer-expired', autologin_timer_expired_cb)
228
229 def user_added_cb (user_list, user):
230     status_notify ('%s USER-ADDED USERNAME=%s' % (greeter_id, user.get_name ()))
231 def user_removed_cb (user_list, user):
232     status_notify ('%s USER-REMOVED USERNAME=%s' % (greeter_id, user.get_name ()))
233 log_user_changes = False
234 try:
235     log_user_changes = config.get_boolean ('test-greeter-config', 'log-user-changes')
236 except:
237     pass
238 if log_user_changes:
239     LightDM.UserList.get_instance ().connect ('user-added', user_added_cb)
240     LightDM.UserList.get_instance ().connect ('user-removed', user_removed_cb)
241
242 status_notify ('%s CONNECT-TO-DAEMON' % greeter_id)
243 if not greeter.connect_sync ():
244     status_notify ('%s FAIL-CONNECT-DAEMON' % greeter_id)
245     exit (1)
246
247 status_notify ('%s CONNECTED-TO-DAEMON' % greeter_id)
248
249 if greeter.get_select_user_hint () is not None:
250     status_notify ('%s SELECT-USER-HINT USERNAME=%s' % (greeter_id, greeter.get_select_user_hint ()))
251 if greeter.get_select_guest_hint ():
252     status_notify ('%s SELECT-GUEST-HINT' % greeter_id)
253 if greeter.get_lock_hint ():
254     status_notify ('%s LOCK-HINT' % greeter_id);
255
256 loop.run ()