]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - tests/src/test-python-greeter
Return errors from all liblightdm methods
[sojka/lightdm.git] / tests / src / test-python-greeter
index 78a23c2bb27acbe2dc9d08629d667db582173e57..6c8fa79b40a775a5bada780c4b0aeb2e0827f357 100755 (executable)
@@ -9,129 +9,249 @@ import signal
 from gi.repository import GLib
 from gi.repository import LightDM
 
+display = os.getenv ('DISPLAY');
+xdg_seat = os.getenv ('XDG_SEAT');
+xdg_vtnr = os.getenv ('XDG_VTNR');
+xdg_session_cookie = os.getenv ('XDG_SESSION_COOKIE');
+xdg_session_class = os.getenv ('XDG_SESSION_CLASS');
+if display is not None:
+    if display.startswith (':'):
+        greeter_id = 'GREETER-X-%s' % display[1:]
+    else:
+        greeter_id = 'GREETER-X-%s' % display
+else:
+    greeter_id = 'GREETER-?'
+
 loop = GLib.MainLoop ()
 
-def sigterm_cb (signum, frame):
-    sys.stderr.write ("sigterm\n")
-    status_notify ('GREETER %s TERMINATE SIGNAL=%d' % (os.getenv ('DISPLAY'), signum))
-    loop.quit ();
-signal.signal (signal.SIGTERM, sigterm_cb)
+def sigterm_cb (data):
+    status_notify ('%s TERMINATE SIGNAL=%d' % (greeter_id, signal.SIGTERM))
+    loop.quit ()
+GLib.unix_signal_add (GLib.PRIORITY_DEFAULT, signal.SIGTERM, sigterm_cb, None)
 
 status_socket = None
 
 def status_notify (message):
-    sys.stderr.write ("status_notify\n");
     if status_socket is not None:
         status_socket.send (struct.pack ('i', len (message)) + message)
     else:
         sys.stderr.write ('%s\n' % message)
 
 def request_cb (channel, condition):
-    sys.stderr.write ("request_cb\n")
     length = status_socket.recv (4)
-    sys.stderr.write ("read %d\n" % len (length))
     if len (length) == 0:
+        loop.quit ();
         return False
     if len (length) > 0:
         (l,) = struct.unpack ('i', length)
         request = status_socket.recv (l)
-        sys.stderr.write ("read '%s' %d\n" % (request, len (request)))
 
-    r = 'GREETER %s AUTHENTICATE' % os.getenv ('DISPLAY')
+    r = '%s AUTHENTICATE' % greeter_id
     if request == r:
         greeter.authenticate (None)
 
-    r = 'GREETER %s AUTHENTICATE USERNAME=' % os.getenv ('DISPLAY')
+    r = '%s AUTHENTICATE USERNAME=' % greeter_id
     if request.startswith (r):
         greeter.authenticate (request[len(r):])
 
-    r = 'GREETER %s AUTHENTICATE-GUEST' % os.getenv ('DISPLAY')
+    r = '%s AUTHENTICATE-GUEST' % greeter_id
     if request == r:
         greeter.authenticate_as_guest ()
 
-    r = 'GREETER %s RESPOND TEXT=\"' % os.getenv ('DISPLAY')
+    r = '%s AUTHENTICATE-AUTOLOGIN' % greeter_id
+    if request == r:
+        greeter.authenticate_autologin ()
+
+    r = '%s AUTHENTICATE-REMOTE SESSION=' % greeter_id
+    if request.startswith (r):
+        greeter.authenticate_remote (request[len(r):], None)
+
+    r = '%s RESPOND TEXT=\"' % greeter_id
     if request.startswith (r):
         greeter.respond (request[len (r):-1])
 
-    r = 'GREETER %s START-SESSION' % os.getenv ('DISPLAY')
+    r = '%s CANCEL-AUTHENTICATION' % greeter_id
+    if request == r:
+        greeter.cancel_authentication ()
+
+    r = '%s START-SESSION' % greeter_id
     if request == r:
-        sys.stderr.write ("start-session\n");
-        if not greeter.start_session_sync (None):
-            sys.stderr.write ("start-session-failed\n");
-            status_notify ('GREETER %s SESSION-FAILED' % os.getenv ('DISPLAY'))
-        sys.stderr.write ("start-session ok\n");
+        try:
+            greeter.start_session_sync (None)
+        except GLib.Error as e:
+            status_notify ('%s SESSION-FAILED ERROR=%s' % (greeter_id, e.message))
 
-    r = 'GREETER %s START-SESSION SESSION=' % os.getenv ('DISPLAY')
+    r = '%s START-SESSION SESSION=' % greeter_id
     if request.startswith (r):
-        if not greeter.start_session_sync (request[len(r):]):
-            status_notify ('GREETER %s SESSION-FAILED' % os.getenv ('DISPLAY')) 
+        try:
+            greeter.start_session_sync (request[len(r):])
+        except GLib.Error as e:
+            status_notify ('%s SESSION-FAILED ERROR=%s' % (greeter_id, e.message))
+
+    r = '%s LOG-USER-LIST-LENGTH' % greeter_id
+    if request == r:
+        status_notify ('%s LOG-USER-LIST-LENGTH N=%d' % (greeter_id, LightDM.UserList.get_instance ().get_length ()))
 
-    r = 'GREETER %s LOG-LAYOUT USERNAME=' % os.getenv ('DISPLAY')
+    r = '%s LOG-USER USERNAME=' % greeter_id
     if request.startswith (r):
         username = request[len(r):]
-        user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username)
-        layout = lightdm_user_get_layout (user)
+        user = LightDM.UserList.get_instance ().get_user_by_name (username)
+        status_notify ('%s LOG-USER USERNAME=%s' % (greeter_id, user.get_name ()))
+
+    r = '%s LOG-USER-LIST' % greeter_id
+    if request == r:
+        users = LightDM.UserList.get_instance ().get_users ();
+        for user in users:
+            status_notify ('%s LOG-USER USERNAME=%s' % (greeter_id, user.get_name ()))
+
+    r = '%s LOG-LAYOUT' % greeter_id
+    if request == r:
+        layout = LightDM.get_layout ().get_name ()
+        status_notify ('%s LOG-LAYOUT LAYOUT=%s' % (greeter_id, layout))
+
+    r = '%s LOG-LAYOUT USERNAME=' % greeter_id
+    if request.startswith (r):
+        username = request[len(r):]
+        user = LightDM.UserList.get_instance ().get_user_by_name (username)
+        layout = user.get_layout ()
         if layout is None:
             layout = ''
-        status_notify ('GREETER %s LOG-LAYOUT USERNAME=%s LAYOUT=%s' % (os.getenv ('DISPLAY'), username, layout))
+        status_notify ('%s LOG-LAYOUT USERNAME=%s LAYOUT=%s' % (greeter_id, username, layout))
 
-    r = 'GREETER %s LOG-LANGUAGE USERNAME=' % os.getenv ('DISPLAY')  
+    r = '%s LOG-LANGUAGE USERNAME=' % greeter_id
     if request.startswith (r):
         username = request[len(r):]
-        user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username)
-        language = lightdm_user_get_language (user)
+        user = LightDM.UserList.get_instance ().get_user_by_name (username)
+        language = user.get_language ()
         if language is None:
             language = ''
-        status_notify ('GREETER %s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s' % (os.getenv ('DISPLAY'), username, language))
+        status_notify ('%s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s' % (greeter_id, username, language))
+
+    r = '%s GET-CAN-SUSPEND' % greeter_id
+    if request == r:
+        if LightDM.get_can_suspend ():
+            allowed = "TRUE"
+        else:
+            allowed = "FALSE"
+        status_notify ('%s CAN-SUSPEND ALLOWED=%s' % (greeter_id, allowed))
+
+    r = '%s SUSPEND' % greeter_id
+    if request == r:
+        try:
+            LightDM.suspend ()
+        except:
+            status_notify ('%s FAIL-SUSPEND' % greeter_id)
+
+    r = '%s GET-CAN-HIBERNATE' % greeter_id
+    if request == r:
+        if LightDM.get_can_hibernate ():
+            allowed = "TRUE"
+        else:
+            allowed = "FALSE"
+        status_notify ('%s CAN-HIBERNATE ALLOWED=%s' % (greeter_id, allowed))
+
+    r = '%s HIBERNATE' % greeter_id
+    if request == r:
+        try:
+            LightDM.hibernate ()
+        except:
+            status_notify ('%s FAIL-HIBERNATE' % greeter_id)
+
+    r = '%s GET-CAN-RESTART' % greeter_id
+    if request == r:
+        if LightDM.get_can_restart ():
+            allowed = "TRUE"
+        else:
+            allowed = "FALSE"
+        status_notify ('%s CAN-RESTART ALLOWED=%s' % (greeter_id, allowed))
+
+    r = '%s RESTART' % greeter_id
+    if request == r:
+        try:
+            LightDM.restart ()
+        except:
+            status_notify ('%s FAIL-RESTART' % greeter_id)
+
+    r = '%s GET-CAN-SHUTDOWN' % greeter_id
+    if request == r:
+        if LightDM.get_can_shutdown ():
+            allowed = "TRUE"
+        else:
+            allowed = "FALSE"
+        status_notify ('%s CAN-SHUTDOWN ALLOWED=%s' % (greeter_id, allowed))
+
+    r = '%s SHUTDOWN' % greeter_id
+    if request == r:
+        try:
+            LightDM.shutdown ()
+        except:
+            status_notify ('%s FAIL-SHUTDOWN' % greeter_id)
 
-    sys.stderr.write ("request_cb end\n")
     return True
 
-path = os.getenv ('LIGHTDM_TEST_STATUS_SOCKET')
-if path is None:
-    sys.stderr.write ('LIGHTDM_TEST_STATUS_SOCKET not defined\n')
-else:
-    status_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
-    status_socket.connect (path)
-    GLib.io_add_watch (status_socket.fileno (), GLib.IO_IN, request_cb)
+def notify_hints (greeter):
+    if greeter.get_select_user_hint () is not None:
+        status_notify ('%s SELECT-USER-HINT USERNAME=%s' % (greeter_id, greeter.get_select_user_hint ()))
+    if greeter.get_select_guest_hint ():
+        status_notify ('%s SELECT-GUEST-HINT' % greeter_id)
+    if greeter.get_lock_hint ():
+        status_notify ('%s LOCK-HINT' % greeter_id)
+    if not greeter.get_has_guest_account_hint ():
+        status_notify ('%s HAS-GUEST-ACCOUNT-HINT=FALSE' % greeter_id)
+    if greeter.get_hide_users_hint ():
+        status_notify ('%s HIDE-USERS-HINT' % greeter_id)
+    if greeter.get_show_manual_login_hint ():
+        status_notify ('%s SHOW-MANUAL-LOGIN-HINT' % greeter_id)
+    if not greeter.get_show_remote_login_hint ():
+        status_notify ('%s SHOW-REMOTE-LOGIN-HINT=FALSE' % greeter_id)
+    timeout = greeter.get_autologin_timeout_hint ()
+    if greeter.get_autologin_user_hint () is not None:
+        if timeout != 0:
+            status_notify ('%s AUTOLOGIN-USER USERNAME=%s TIMEOUT=%d' % (greeter_id, greeter.get_autologin_user_hint (), timeout))
+        else:
+            status_notify ('%s AUTOLOGIN-USER USERNAME=%s' % (greeter_id, greeter.get_autologin_user_hint ()))
+    elif greeter.get_autologin_guest_hint ():
+        if timeout != 0:
+            status_notify ('%s AUTOLOGIN-GUEST TIMEOUT=%d' % (greeter_id, timeout))
+        else:
+            status_notify ('%s AUTOLOGIN-GUEST' % greeter_id)
+
+path = os.getenv ('LIGHTDM_TEST_ROOT') + '/.s'
+status_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
+status_socket.connect (path)
+GLib.io_add_watch (status_socket.fileno (), GLib.IO_IN | GLib.IO_HUP, request_cb)
+
+status_text = '%s START' % greeter_id
+if xdg_seat is not None:
+    status_text += ' XDG_SEAT=%s' % xdg_seat
+if xdg_vtnr is not None:
+    status_text += ' XDG_VTNR=%s' % xdg_vtnr
+if xdg_session_cookie is not None:
+    status_text += ' XDG_SESSION_COOKIE=%s' % xdg_session_cookie
+if xdg_session_class is not None:
+    status_text += ' XDG_SESSION_CLASS=%s' % xdg_session_class
+status_notify (status_text)
 
-status_notify ('GREETER %s START' % os.getenv ('DISPLAY'))
+config = GLib.KeyFile ()
+config.load_from_file (os.getenv ('LIGHTDM_TEST_ROOT') + '/script', GLib.KeyFileFlags.NONE)
 
 # NOTE: There don't seem to be any good X bindings so we have to mock up our own...
-(host, display) = os.getenv ('DISPLAY').split (':')
-if host == '':
-    x_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
-    x_socket.connect ('/tmp/.X11-unix/X%s' % display)
-else:
-    x_socket = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
-    x_socket.connect ((host, 6000 + int (display)))
-authority = subprocess.check_output(['xauth', 'list']).split ()
-auth_name = ''
-auth_data = ''
-if len (authority) >= 3:
-    auth_name = authority[1]
-    hex = authority[2]
-    while len (hex) >= 2:
-        auth_data += chr (int (hex[:2], 16))
-        hex = hex[2:]
-def pad (value):
-    if len (value) % 4 != 0:
-        return value + '\x00' * (4 - len (value) % 4)
+if display is not None:
+    (host, display_number) = display.split (':')
+    if host == '':
+        x_socket = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
+        x_socket.connect (os.getenv ('LIGHTDM_TEST_ROOT') + '/.x' + display)
     else:
-        return value
-x_socket.send (struct.pack ('!cxHHHHxx', 'B', 11, 0, len (auth_name), len (auth_data)) + pad (auth_name) + pad (auth_data))
-data = x_socket.recv (1024)
-if ord (data[0]) != 1:
-    status_notify ('GREETER %s FAIL-CONNECT-XSERVER' % os.getenv ('DISPLAY'))
-    exit (1)
+        x_socket = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
+        x_socket.connect ((host, 6000 + int (display_number)))
 
-status_notify ('GREETER %s CONNECT-XSERVER' % (os.getenv ('DISPLAY')))
+    status_notify ('%s CONNECT-XSERVER' % (greeter_id))
 
 def show_message_cb (greeter, text, type):
-    status_notify ('GREETER %s SHOW-MESSAGE TEXT=\"%s\"' % (os.getenv ('DISPLAY'), text))
+    status_notify ('%s SHOW-MESSAGE TEXT=\"%s\"' % (greeter_id, text))
 
 def show_prompt_cb (greeter, text, type):
-    status_notify ('GREETER %s SHOW-PROMPT TEXT=\"%s\"' % (os.getenv ('DISPLAY'), text))
+    status_notify ('%s SHOW-PROMPT TEXT=\"%s\"' % (greeter_id, text))
 
 def authentication_complete_cb (greeter):
     if greeter.get_is_authenticated ():
@@ -139,25 +259,56 @@ def authentication_complete_cb (greeter):
     else:
         is_authenticated = 'FALSE'
     if greeter.get_authentication_user () is not None:
-        status_notify ('GREETER %s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s' % (os.getenv ('DISPLAY'), greeter.get_authentication_user (), is_authenticated))
+        status_notify ('%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s' % (greeter_id, greeter.get_authentication_user (), is_authenticated))
     else:
-        status_notify ('GREETER %s AUTHENTICATION-COMPLETE AUTHENTICATED=%s' % (os.getenv ('DISPLAY'), is_authenticated))
+        status_notify ('%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s' % (greeter_id, is_authenticated))
+
+def autologin_timer_expired_cb (greeter):
+    pass
 
 greeter = LightDM.Greeter ()
 greeter.connect ('show-message', show_message_cb)
 greeter.connect ('show-prompt', show_prompt_cb)
 greeter.connect ('authentication-complete', authentication_complete_cb)
+greeter.connect ('autologin-timer-expired', autologin_timer_expired_cb)
+resettable = False
+try:
+    resettable = config.get_boolean ('test-greeter-config', 'resettable')
+except:
+    pass
+if resettable:
+    LightDM.Greeter.get_instance ().set_resettable (True)
+    LightDM.Greeter.get_instance ().connect ('idle', idle_cb)
+    LightDM.Greeter.get_instance ().connect ('reset', reset_cb)
 
-status_notify ('GREETER %s CONNECT-TO-DAEMON' % os.getenv ('DISPLAY'))
-if not greeter.connect_sync ():
-    status_notify ('GREETER %s FAIL-CONNECT-DAEMON' % os.getenv ('DISPLAY'))
+def user_added_cb (user_list, user):
+    status_notify ('%s USER-ADDED USERNAME=%s' % (greeter_id, user.get_name ()))
+def user_removed_cb (user_list, user):
+    status_notify ('%s USER-REMOVED USERNAME=%s' % (greeter_id, user.get_name ()))
+log_user_changes = False
+try:
+    log_user_changes = config.get_boolean ('test-greeter-config', 'log-user-changes')
+except:
+    pass
+if log_user_changes:
+    LightDM.UserList.get_instance ().connect ('user-added', user_added_cb)
+    LightDM.UserList.get_instance ().connect ('user-removed', user_removed_cb)
+
+status_notify ('%s CONNECT-TO-DAEMON' % greeter_id)
+try:
+    greeter.connect_to_daemon_sync ()
+except:
+    status_notify ('%s FAIL-CONNECT-DAEMON' % greeter_id)
     exit (1)
 
-status_notify ('GREETER %s CONNECTED-TO-DAEMON' % os.getenv ('DISPLAY'))
+status_notify ('%s CONNECTED-TO-DAEMON' % greeter_id)
+
+def idle_cb (greeter):
+    status_notify ('%s IDLE' % (greeter_id))
+def reset_cb (greeter):
+    status_notify ('%s RESET' % (greeter_id))
+    notify_hints (greeter)
 
-if greeter.get_select_user_hint () is not None:
-    status_notify ('GREETER %s SELECT-USER-HINT USERNAME=%s' % (os.getenv ('DISPLAY'), greeter.get_select_user_hint ()))
-if greeter.get_lock_hint ():
-        status_notify ('GREETER %s LOCK-HINT' % os.getenv ('DISPLAY'));
+notify_hints (greeter)
 
 loop.run ()