]> granicus.if.org Git - python/commitdiff
bpo-36511: Add buildbot scripts and fix tests for Windows ARM32 buildbot (GH-13454)
authorPaul Monson <paulmon@users.noreply.github.com>
Wed, 19 Jun 2019 20:09:54 +0000 (13:09 -0700)
committerSteve Dower <steve.dower@python.org>
Wed, 19 Jun 2019 20:09:54 +0000 (13:09 -0700)
Lib/test/support/__init__.py
Lib/test/test_math.py
Lib/test/test_pyexpat.py
Lib/test/test_regrtest.py
Lib/test/test_ssl.py
Tools/buildbot/remoteDeploy.bat [new file with mode: 0644]
Tools/buildbot/remotePythonInfo.bat [new file with mode: 0644]
Tools/buildbot/test.bat

index 7c0efc783edb2fbf24880cd94498b8e30a2dff21..b5538d22fb2aceca541087bd234d925e37f29f0e 100644 (file)
@@ -485,7 +485,9 @@ def _is_gui_available():
     if hasattr(_is_gui_available, 'result'):
         return _is_gui_available.result
     reason = None
-    if sys.platform.startswith('win'):
+    if sys.platform.startswith('win') and platform.win32_is_iot():
+        reason = "gui is not available on Windows IoT Core"
+    elif sys.platform.startswith('win'):
         # if Python is running as a service (such as the buildbot service),
         # gui interaction may be disallowed
         import ctypes
index fa690441be43cec52ec70e6bff241656bd6109ea..362d09370d4522007e57fa9647500582a46041b9 100644 (file)
@@ -468,6 +468,8 @@ class MathTests(unittest.TestCase):
             self.assertRaises(ValueError, math.cos, NINF)
         self.assertTrue(math.isnan(math.cos(NAN)))
 
+    @unittest.skipIf(sys.platform == 'win32' and platform.machine() in ('ARM', 'ARM64'),
+                    "Windows UCRT is off by 2 ULP this test requires accuracy within 1 ULP")
     def testCosh(self):
         self.assertRaises(TypeError, math.cosh)
         self.ftest('cosh(0)', math.cosh(0), 1)
index 92fffc45f30a964fb8ee59df03a05ce04985aa8b..082d85a3d2b94575ef1452efbb44e94a0b46e3eb 100644 (file)
@@ -3,6 +3,7 @@
 
 from io import BytesIO
 import os
+import platform
 import sys
 import sysconfig
 import unittest
@@ -465,7 +466,7 @@ class HandlerExceptionTest(unittest.TestCase):
                                        "pyexpat.c", "StartElement")
             self.check_traceback_entry(entries[2],
                                        "test_pyexpat.py", "StartElementHandler")
-            if sysconfig.is_python_build():
+            if sysconfig.is_python_build() and not (sys.platform == 'win32' and platform.machine() == 'ARM'):
                 self.assertIn('call_with_frame("StartElement"', entries[1][3])
 
 
index 904b326d0e2049a0b4fbfd4e1d724d35d2599db0..0a009255cb9b5678225238249b3d13b280f06b2f 100644 (file)
@@ -618,6 +618,8 @@ class ProgramsTestCase(BaseTestCase):
         test_args = ['--testdir=%s' % self.tmptestdir]
         if platform.machine() == 'ARM64':
             test_args.append('-arm64') # ARM 64-bit build
+        elif platform.machine() == 'ARM':
+            test_args.append('-arm32')   # 32-bit ARM build
         elif platform.architecture()[0] == '64bit':
             test_args.append('-x64')   # 64-bit build
         if not Py_DEBUG:
@@ -633,6 +635,8 @@ class ProgramsTestCase(BaseTestCase):
         rt_args = ["-q"]             # Quick, don't run tests twice
         if platform.machine() == 'ARM64':
             rt_args.append('-arm64') # ARM 64-bit build
+        elif platform.machine() == 'ARM':
+            rt_args.append('-arm32')   # 32-bit ARM build
         elif platform.architecture()[0] == '64bit':
             rt_args.append('-x64')   # 64-bit build
         if Py_DEBUG:
index 7ba8156eef5da8a640b6a121937f409ff86436ab..c72a85710d5cb8c0a9f24df5d9684a94d513c52d 100644 (file)
@@ -28,6 +28,9 @@ ssl = support.import_module("ssl")
 
 from ssl import TLSVersion, _TLSContentType, _TLSMessageType, _TLSAlertType
 
+Py_DEBUG = hasattr(sys, 'gettotalrefcount')
+Py_DEBUG_WIN32 = Py_DEBUG and sys.platform == 'win32'
+
 PROTOCOLS = sorted(ssl._PROTOCOL_NAMES)
 HOST = support.HOST
 IS_LIBRESSL = ssl.OPENSSL_VERSION.startswith('LibreSSL')
@@ -1347,6 +1350,7 @@ class ContextTests(unittest.TestCase):
             ctx.load_verify_locations(cadata=b"broken")
 
 
+    @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows")
     def test_load_dh_params(self):
         ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
         ctx.load_dh_params(DHFILE)
@@ -1665,6 +1669,7 @@ class SSLErrorTests(unittest.TestCase):
         self.assertEqual(str(e), "foo")
         self.assertEqual(e.errno, 1)
 
+    @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows")
     def test_lib_reason(self):
         # Test the library and reason attributes
         ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
@@ -3845,6 +3850,7 @@ class ThreadedTests(unittest.TestCase):
                                    sni_name=hostname)
         self.assertIs(stats['compression'], None)
 
+    @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows")
     def test_dh_params(self):
         # Check we can get a connection with ephemeral Diffie-Hellman
         client_context, server_context, hostname = testing_context()
@@ -4440,6 +4446,7 @@ class TestSSLDebug(unittest.TestCase):
             return len(list(f))
 
     @requires_keylog
+    @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows")
     def test_keylog_defaults(self):
         self.addCleanup(support.unlink, support.TESTFN)
         ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
@@ -4463,6 +4470,7 @@ class TestSSLDebug(unittest.TestCase):
             ctx.keylog_filename = 1
 
     @requires_keylog
+    @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows")
     def test_keylog_filename(self):
         self.addCleanup(support.unlink, support.TESTFN)
         client_context, server_context, hostname = testing_context()
@@ -4500,6 +4508,7 @@ class TestSSLDebug(unittest.TestCase):
     @requires_keylog
     @unittest.skipIf(sys.flags.ignore_environment,
                      "test is not compatible with ignore_environment")
+    @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows")
     def test_keylog_env(self):
         self.addCleanup(support.unlink, support.TESTFN)
         with unittest.mock.patch.dict(os.environ):
diff --git a/Tools/buildbot/remoteDeploy.bat b/Tools/buildbot/remoteDeploy.bat
new file mode 100644 (file)
index 0000000..ac1e38b
--- /dev/null
@@ -0,0 +1,48 @@
+@echo off
+rem Used by the buildbot "remotedeploy" step.
+setlocal
+
+set here=%~dp0
+set arm32_ssh=
+
+:CheckOpts
+if "%1"=="-arm32" (set arm32_ssh=true) & shift & goto CheckOpts
+if NOT "%1"=="" (echo unrecognized option %1) & goto Arm32SshHelp
+
+if "%arm32_ssh%"=="true" goto :Arm32Ssh
+
+:Arm32Ssh
+if "%SSH_SERVER%"=="" goto :Arm32SshHelp
+if "%SSH%"=="" if EXIST %WINDIR%\System32\OpenSSH\ssh.exe (set SSH=%WINDIR%\System32\OpenSSH\ssh.exe)
+if "%SCP%"=="" if EXIST %WINDIR%\System32\OpenSSH\scp.exe (set SCP=%WINDIR%\System32\OpenSSH\scp.exe)
+echo SSH = %SSH%
+echo SCP = %SCP%
+if "%PYTHON_SOURCE%"=="" (set PYTHON_SOURCE=%here%..\..\)
+if "%REMOTE_PYTHON_DIR%"=="" (set REMOTE_PYTHON_DIR=C:\python\)
+if NOT "%REMOTE_PYTHON_DIR:~-1,1%"=="\" (set REMOTE_PYTHON_DIR=%REMOTE_PYTHON_DIR%\)
+%SSH% %SSH_SERVER% "if EXIST %REMOTE_PYTHON_DIR% (rd %REMOTE_PYTHON_DIR% /s/q)"
+%SSH% %SSH_SERVER% "md %REMOTE_PYTHON_DIR%PCBuild\arm32"
+%SSH% %SSH_SERVER% "md %REMOTE_PYTHON_DIR%temp"
+%SSH% %SSH_SERVER% "md %REMOTE_PYTHON_DIR%Modules"
+%SSH% %SSH_SERVER% "md %REMOTE_PYTHON_DIR%PC"
+for /f "USEBACKQ" %%i in (`dir PCbuild\*.bat /b`) do @%SCP% PCBuild\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild"
+for /f "USEBACKQ" %%i in (`dir PCbuild\*.py /b`) do @%SCP% PCBuild\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild"
+for /f "USEBACKQ" %%i in (`dir PCbuild\arm32\*.exe /b`) do @%SCP% PCBuild\arm32\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild\arm32"
+for /f "USEBACKQ" %%i in (`dir PCbuild\arm32\*.pyd /b`) do @%SCP% PCBuild\arm32\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild\arm32"
+for /f "USEBACKQ" %%i in (`dir PCbuild\arm32\*.dll /b`) do @%SCP% PCBuild\arm32\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild\arm32"
+%SCP% -r "%PYTHON_SOURCE%Include" "%SSH_SERVER%:%REMOTE_PYTHON_DIR%Include"
+%SCP% -r "%PYTHON_SOURCE%Lib" "%SSH_SERVER%:%REMOTE_PYTHON_DIR%Lib"
+%SCP% -r "%PYTHON_SOURCE%Tools" "%SSH_SERVER%:%REMOTE_PYTHON_DIR%Tools"
+%SCP% "%PYTHON_SOURCE%Modules\Setup" "%SSH_SERVER%:%REMOTE_PYTHON_DIR%Modules"
+%SCP% "%PYTHON_SOURCE%PC\pyconfig.h" "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PC"
+
+exit /b %ERRORLEVEL%
+
+:Arm32SshHelp
+echo SSH_SERVER environment variable must be set to administrator@[ip address]
+echo where [ip address] is the address of a Windows IoT Core ARM32 device.
+echo.
+echo The test worker should have the SSH agent running.
+echo Also a key must be created with ssh-keygen and added to both the buildbot worker machine
+echo and the ARM32 worker device: see https://docs.microsoft.com/en-us/windows/iot-core/connect-your-device/ssh
+exit /b 127
diff --git a/Tools/buildbot/remotePythonInfo.bat b/Tools/buildbot/remotePythonInfo.bat
new file mode 100644 (file)
index 0000000..263808c
--- /dev/null
@@ -0,0 +1,34 @@
+@echo off
+rem Used by the buildbot "remotedeploy" step.
+setlocal
+
+set here=%~dp0
+set arm32_ssh=
+set suffix=_d
+if "%REMOTE_PYTHON_DIR%"=="" (set REMOTE_PYTHON_DIR=C:\python\)
+if NOT "%REMOTE_PYTHON_DIR:~-1,1%"=="\" (set REMOTE_PYTHON_DIR=%REMOTE_PYTHON_DIR%\)
+
+:CheckOpts
+if "%1"=="-arm32" (set arm32_ssh=true) & (set prefix=%REMOTE_PYTHON_DIR%pcbuild\arm32) & shift & goto CheckOpts
+if "%1"=="-d" (set suffix=_d) & shift & goto CheckOpts
+if "%1"=="+d" (set suffix=) & shift & goto CheckOpts
+if NOT "%1"=="" (echo unrecognized option %1) & goto Arm32SshHelp
+
+if "%arm32_ssh%"=="true" goto :Arm32Ssh
+
+:Arm32Ssh
+if "%SSH_SERVER%"=="" goto :Arm32SshHelp
+if "%SSH%"=="" if EXIST %WINDIR%\System32\OpenSSH\ssh.exe (set SSH=%WINDIR%\System32\OpenSSH\ssh.exe)
+set PYTHON_EXE=%prefix%\python%suffix%.exe
+echo on
+%SSH% %SSH_SERVER% %PYTHON_EXE% -m test.pythoninfo
+exit /b %ERRORLEVEL%
+
+:Arm32SshHelp
+echo SSH_SERVER environment variable must be set to administrator@[ip address]
+echo where [ip address] is the address of a Windows IoT Core ARM32 device.
+echo.
+echo The test worker should have the SSH agent running.
+echo Also a key must be created with ssh-keygen and added to both the buildbot worker machine
+echo and the ARM32 worker device: see https://docs.microsoft.com/en-us/windows/iot-core/connect-your-device/ssh
+exit /b 127
index 1566f46c534f753ba8c791d0ae9036c9ad9563a2..685f73d41edc4fa68d18c2d177dd52c0809bbc5f 100644 (file)
@@ -18,8 +18,10 @@ if "%1"=="+d" (set rt_opts=%rt_opts:-d=%) & shift & goto CheckOpts
 if "%1"=="+q" (set rt_opts=%rt_opts:-q=%) & shift & goto CheckOpts
 if NOT "%1"=="" (set regrtest_args=%regrtest_args% %1) & shift & goto CheckOpts
 
+if "%PROCESSOR_ARCHITECTURE%"=="ARM" if "%arm32_ssh%"=="true" goto NativeExecution
 if "%arm32_ssh%"=="true" goto :Arm32Ssh
 
+:NativeExecution
 call "%here%..\..\PCbuild\rt.bat" %rt_opts% -uall -rwW --slowest --timeout=1200 --fail-env-changed %regrtest_args%
 exit /b %ERRORLEVEL%
 
@@ -28,20 +30,12 @@ set dashU=-unetwork,decimal,subprocess,urlfetch,tzdata
 if "%SSH_SERVER%"=="" goto :Arm32SshHelp
 if "%PYTHON_SOURCE%"=="" (set PYTHON_SOURCE=%here%..\..\)
 if "%REMOTE_PYTHON_DIR%"=="" (set REMOTE_PYTHON_DIR=C:\python\)
+if NOT "%REMOTE_PYTHON_DIR:~-1,1%"=="\" (set REMOTE_PYTHON_DIR=%REMOTE_PYTHON_DIR%\)
+if "%SSH%"=="" if EXIST %WINDIR%\System32\OpenSSH\ssh.exe (set SSH=%WINDIR%\System32\OpenSSH\ssh.exe)
 set TEMP_ARGS=--temp %REMOTE_PYTHON_DIR%temp
-ssh %SSH_SERVER% "if EXIST %REMOTE_PYTHON_DIR% (rd %REMOTE_PYTHON_DIR% /s/q)"
-ssh %SSH_SERVER% "md %REMOTE_PYTHON_DIR%PCBuild\arm32"
-ssh %SSH_SERVER% "md %REMOTE_PYTHON_DIR%temp"
-for /f "USEBACKQ" %%i in (`dir PCbuild\*.bat /b`) do @scp PCBuild\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild"
-for /f "USEBACKQ" %%i in (`dir PCbuild\*.py /b`) do @scp PCBuild\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild"
-for /f "USEBACKQ" %%i in (`dir PCbuild\arm32\*.exe /b`) do @scp PCBuild\arm32\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild\arm32"
-for /f "USEBACKQ" %%i in (`dir PCbuild\arm32\*.pyd /b`) do @scp PCBuild\arm32\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild\arm32"
-for /f "USEBACKQ" %%i in (`dir PCbuild\arm32\*.dll /b`) do @scp PCBuild\arm32\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild\arm32"
-scp -r "%PYTHON_SOURCE%Include" "%SSH_SERVER%:%REMOTE_PYTHON_DIR%Include"
-scp -r "%PYTHON_SOURCE%Lib" "%SSH_SERVER%:%REMOTE_PYTHON_DIR%Lib"
 
 set rt_args=%rt_opts% %dashU% -rwW --slowest --timeout=1200 --fail-env-changed %regrtest_args% %TEMP_ARGS%
-ssh %SSH_SERVER% "set TEMP=%REMOTE_PYTHON_DIR%temp& %REMOTE_PYTHON_DIR%PCbuild\rt.bat" %rt_args%
+%SSH% %SSH_SERVER% "set TEMP=%REMOTE_PYTHON_DIR%temp& %REMOTE_PYTHON_DIR%PCbuild\rt.bat" %rt_args%
 exit /b %ERRORLEVEL%
 
 :Arm32SshHelp