bpo-33522: Enable CI builds on Visual Studio Team Services (GH-6865) (GH-6926)

(cherry picked from commit e5f41d2f1e0b8b8e61d5fa427c19bd1ea90fd9a3)

Co-authored-by: Steve Dower <steve.dower@microsoft.com>
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index 2389d58..1024ab6 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -363,6 +363,20 @@
                     _force_run(fullname, os.unlink, fullname)
         _waitfor(_rmtree_inner, path, waitall=True)
         _waitfor(lambda p: _force_run(p, os.rmdir, p), path)
+
+    def _longpath(path):
+        try:
+            import ctypes
+        except ImportError:
+            # No ctypes means we can't expands paths.
+            pass
+        else:
+            buffer = ctypes.create_unicode_buffer(len(path) * 2)
+            length = ctypes.windll.kernel32.GetLongPathNameW(path, buffer,
+                                                             len(buffer))
+            if length:
+                return buffer[:length]
+        return path
 else:
     _unlink = os.unlink
     _rmdir = os.rmdir
@@ -389,6 +403,9 @@
         _rmtree_inner(path)
         os.rmdir(path)
 
+    def _longpath(path):
+        return path
+
 def unlink(filename):
     try:
         _unlink(filename)
@@ -2381,13 +2398,15 @@
     if not hasattr(os, "setxattr"):
         can = False
     else:
-        tmp_fp, tmp_name = tempfile.mkstemp()
+        tmp_dir = tempfile.mkdtemp()
+        tmp_fp, tmp_name = tempfile.mkstemp(dir=tmp_dir)
         try:
             with open(TESTFN, "wb") as fp:
                 try:
                     # TESTFN & tempfile may use different file systems with
                     # different capabilities
                     os.setxattr(tmp_fp, b"user.test", b"")
+                    os.setxattr(tmp_name, b"trusted.foo", b"42")
                     os.setxattr(fp.fileno(), b"user.test", b"")
                     # Kernels < 2.6.39 don't respect setxattr flags.
                     kernel_version = platform.release()
@@ -2398,6 +2417,7 @@
         finally:
             unlink(TESTFN)
             unlink(tmp_name)
+            rmdir(tmp_dir)
     _can_xattr = can
     return can
 
diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py
index ab6560c..72c63df 100644
--- a/Lib/test/test_asyncio/test_base_events.py
+++ b/Lib/test/test_asyncio/test_base_events.py
@@ -1848,10 +1848,22 @@
     def prepare(self):
         sock = self.make_socket()
         proto = self.MyProto(self.loop)
-        port = support.find_unused_port()
+        af = socket.AF_UNSPEC if support.IPV6_ENABLED else socket.AF_INET
         server = self.run_loop(self.loop.create_server(
-            lambda: proto, support.HOST, port))
-        self.run_loop(self.loop.sock_connect(sock, (support.HOST, port)))
+            lambda: proto, support.HOST, 0, family=af))
+        port = server.sockets[0].getsockname()[1]
+
+        for _ in range(10):
+            try:
+                self.run_loop(self.loop.sock_connect(sock, (support.HOST, port)))
+            except OSError:
+                time.sleep(0.5)
+                continue
+            else:
+                break
+        else:
+            # One last try, so we get the exception
+            self.run_loop(self.loop.sock_connect(sock, (support.HOST, port)))
 
         def cleanup():
             server.close()
diff --git a/Lib/test/test_bdb.py b/Lib/test/test_bdb.py
index bda74a2..616c3a8 100644
--- a/Lib/test/test_bdb.py
+++ b/Lib/test/test_bdb.py
@@ -417,15 +417,17 @@
         self.dry_run = test_case.dry_run
         self.tracer = Tracer(test_case.expect_set, skip=skip,
                              dry_run=self.dry_run, test_case=test_case.id())
+        self._original_tracer = None
 
     def __enter__(self):
         # test_pdb does not reset Breakpoint class attributes on exit :-(
         reset_Breakpoint()
+        self._original_tracer = sys.gettrace()
         return self.tracer
 
     def __exit__(self, type_=None, value=None, traceback=None):
         reset_Breakpoint()
-        sys.settrace(None)
+        sys.settrace(self._original_tracer)
 
         not_empty = ''
         if self.tracer.set_list:
diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py
index d1a3fba..d95a831 100644
--- a/Lib/test/test_pathlib.py
+++ b/Lib/test/test_pathlib.py
@@ -1516,7 +1516,7 @@
             # resolves to 'dirB/..' first before resolving to parent of dirB.
             self._check_resolve_relative(p, P(BASE, 'foo', 'in', 'spam'), False)
         # Now create absolute symlinks
-        d = tempfile.mkdtemp(suffix='-dirD')
+        d = support._longpath(tempfile.mkdtemp(suffix='-dirD'))
         self.addCleanup(support.rmtree, d)
         os.symlink(os.path.join(d), join('dirA', 'linkX'))
         os.symlink(join('dirB'), os.path.join(d, 'linkY'))
diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py
index bf568bd..bbedbbd 100644
--- a/Lib/test/test_poplib.py
+++ b/Lib/test/test_poplib.py
@@ -179,7 +179,8 @@
                 elif err.args[0] == ssl.SSL_ERROR_EOF:
                     return self.handle_close()
                 # TODO: SSLError does not expose alert information
-                elif "SSLV3_ALERT_BAD_CERTIFICATE" in err.args[1]:
+                elif ("SSLV3_ALERT_BAD_CERTIFICATE" in err.args[1] or
+                      "SSLV3_ALERT_CERTIFICATE_UNKNOWN" in err.args[1]):
                     return self.handle_close()
                 raise
             except OSError as err:
@@ -222,11 +223,12 @@
     def run(self):
         self.active = True
         self.__flag.set()
-        while self.active and asyncore.socket_map:
-            self.active_lock.acquire()
-            asyncore.loop(timeout=0.1, count=1)
-            self.active_lock.release()
-        asyncore.close_all(ignore_all=True)
+        try:
+            while self.active and asyncore.socket_map:
+                with self.active_lock:
+                    asyncore.loop(timeout=0.1, count=1)
+        finally:
+            asyncore.close_all(ignore_all=True)
 
     def stop(self):
         assert self.active
diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py
index 79ac25c..3161122 100644
--- a/Lib/test/test_selectors.py
+++ b/Lib/test/test_selectors.py
@@ -481,7 +481,14 @@
                     self.skipTest("FD limit reached")
                 raise
 
-        self.assertEqual(NUM_FDS // 2, len(s.select()))
+        try:
+            fds = s.select()
+        except OSError as e:
+            if e.errno == errno.EINVAL and sys.platform == 'darwin':
+                # unexplainable errors on macOS don't need to fail the test
+                self.skipTest("Invalid argument error calling poll()")
+            raise
+        self.assertEqual(NUM_FDS // 2, len(fds))
 
 
 class DefaultSelectorTestCase(BaseSelectorTestCase):