]> granicus.if.org Git - python/commitdiff
Issue #17883: Backport test.test_support._is_gui_available()
authorZachary Ware <zachary.ware@gmail.com>
Mon, 4 Nov 2013 04:27:04 +0000 (22:27 -0600)
committerZachary Ware <zachary.ware@gmail.com>
Mon, 4 Nov 2013 04:27:04 +0000 (22:27 -0600)
This should stop the Windows buildbots from hanging on test_ttk_guionly.

Lib/test/test_support.py
Misc/NEWS

index 1f3c039b2f5d5f73a23133b220c3faaa85d924d7..e3dd7129e6ab6d656d08d0ca4664c691c3784c9c 100644 (file)
@@ -271,6 +271,36 @@ def forget(modname):
         # is exited) but there is a .pyo file.
         unlink(os.path.join(dirname, modname + os.extsep + 'pyo'))
 
+# On some platforms, should not run gui test even if it is allowed
+# in `use_resources'.
+if sys.platform.startswith('win'):
+    import ctypes
+    import ctypes.wintypes
+    def _is_gui_available():
+        UOI_FLAGS = 1
+        WSF_VISIBLE = 0x0001
+        class USEROBJECTFLAGS(ctypes.Structure):
+            _fields_ = [("fInherit", ctypes.wintypes.BOOL),
+                        ("fReserved", ctypes.wintypes.BOOL),
+                        ("dwFlags", ctypes.wintypes.DWORD)]
+        dll = ctypes.windll.user32
+        h = dll.GetProcessWindowStation()
+        if not h:
+            raise ctypes.WinError()
+        uof = USEROBJECTFLAGS()
+        needed = ctypes.wintypes.DWORD()
+        res = dll.GetUserObjectInformationW(h,
+            UOI_FLAGS,
+            ctypes.byref(uof),
+            ctypes.sizeof(uof),
+            ctypes.byref(needed))
+        if not res:
+            raise ctypes.WinError()
+        return bool(uof.dwFlags & WSF_VISIBLE)
+else:
+    def _is_gui_available():
+        return True
+
 def is_resource_enabled(resource):
     """Test whether a resource is enabled.  Known resources are set by
     regrtest.py."""
@@ -281,6 +311,8 @@ def requires(resource, msg=None):
 
     If the caller's module is __main__ then automatically return True.  The
     possibility of False being returned occurs when regrtest.py is executing."""
+    if resource == 'gui' and not _is_gui_available():
+        raise unittest.SkipTest("Cannot use the 'gui' resource")
     # see if the caller's module is __main__ - if so, treat as if
     # the resource was set
     if sys._getframe(1).f_globals.get("__name__") == "__main__":
@@ -1128,6 +1160,8 @@ def _id(obj):
     return obj
 
 def requires_resource(resource):
+    if resource == 'gui' and not _is_gui_available():
+        return unittest.skip("resource 'gui' is not available")
     if is_resource_enabled(resource):
         return _id
     else:
index 12bfafb4660341d731a3b051c134d80b69725adc..22be7c46f27ca3022bc66350383dc96213d853cc 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -23,6 +23,9 @@ Library
 Tests
 -----
 
+- Issue #17883: Backported _is_gui_available() in test.test_support to
+  avoid hanging Windows buildbots on test_ttk_guionly.
+
 - Issue #18702: All skipped tests now reported as skipped.
 
 - Issue #19085: Added basic tests for all tkinter widget options.