Update Crashpad bot scripts to python3.

Change-Id: Ie3848c2f2bbbe34ca3a5e7da5e7d05e3cfba5b72
Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/3549021
Reviewed-by: Mark Mentovai <mark@chromium.org>
Commit-Queue: Justin Cohen <justincohen@chromium.org>
This commit is contained in:
Justin Cohen 2022-03-25 10:36:27 -04:00 committed by Crashpad LUCI CQ
parent f88a116c0e
commit dedbc0f61b
3 changed files with 61 additions and 20 deletions

32
.vpython3 Normal file
View File

@ -0,0 +1,32 @@
# Copyright 2022 The Crashpad Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This is a vpython "spec" file.
#
# It describes patterns for python wheel dependencies of the python scripts.
#
# Read more about `vpython` and how to modify this file here:
# https://chromium.googlesource.com/infra/infra/+/master/doc/users/vpython.md
# This is needed for snapshot/win/end_to_end_test.py.
wheel: <
name: "infra/python/wheels/pywin32/${vpython_platform}"
version: "version:300"
match_tag: <
platform: "win32"
>
match_tag: <
platform: "win_amd64"
>
>

View File

@ -1,5 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
# coding: utf-8
# Copyright 2014 The Crashpad Authors. All rights reserved. # Copyright 2014 The Crashpad Authors. All rights reserved.
# #
@ -15,8 +14,6 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from __future__ import print_function
import argparse import argparse
import os import os
import pipes import pipes
@ -40,7 +37,7 @@ def _FindGNFromBinaryDir(binary_dir):
build_ninja = os.path.join(binary_dir, 'build.ninja') build_ninja = os.path.join(binary_dir, 'build.ninja')
if os.path.isfile(build_ninja): if os.path.isfile(build_ninja):
with open(build_ninja, 'rb') as f: with open(build_ninja, 'r') as f:
# Look for the always-generated regeneration rule of the form: # Look for the always-generated regeneration rule of the form:
# #
# rule gn # rule gn
@ -78,10 +75,11 @@ def _BinaryDirTargetOS(binary_dir):
], ],
shell=IS_WINDOWS_HOST, shell=IS_WINDOWS_HOST,
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=open(os.devnull)) stderr=open(os.devnull),
text=True)
value = popen.communicate()[0] value = popen.communicate()[0]
if popen.returncode == 0: if popen.returncode == 0:
match = re.match('target_os = "(.*)"$', value.decode('utf-8')) match = re.match('target_os = "(.*)"$', value)
if match: if match:
return match.group(1) return match.group(1)
@ -196,13 +194,14 @@ def _RunOnAndroidTarget(binary_dir, test, android_device, extra_command_line):
child = subprocess.Popen(adb_command, child = subprocess.Popen(adb_command,
shell=IS_WINDOWS_HOST, shell=IS_WINDOWS_HOST,
stdin=open(os.devnull), stdin=open(os.devnull),
stdout=subprocess.PIPE) stdout=subprocess.PIPE,
text=True)
FINAL_LINE_RE = re.compile('status=(\d+)$') FINAL_LINE_RE = re.compile('status=(\d+)$')
final_line = None final_line = None
while True: while True:
# Use readline so that the test output appears “live” when running. # Use readline so that the test output appears “live” when running.
data = child.stdout.readline().decode('utf-8') data = child.stdout.readline()
if data == '': if data == '':
break break
if final_line is not None: if final_line is not None:
@ -369,10 +368,11 @@ def _RunOnIOSTarget(binary_dir, test, is_xcuitest=False):
xctestrun_path = f.name xctestrun_path = f.name
print(xctestrun_path) print(xctestrun_path)
if is_xcuitest: with open(xctestrun_path, 'wb') as fp:
plistlib.writePlist(xcuitest(binary_dir, test), xctestrun_path) if is_xcuitest:
else: plistlib.dump(xcuitest(binary_dir, test), fp)
plistlib.writePlist(xctest(binary_dir, test), xctestrun_path) else:
plistlib.dump(xctest(binary_dir, test), fp)
subprocess.check_call([ subprocess.check_call([
'xcodebuild', 'test-without-building', '-xctestrun', xctestrun_path, 'xcodebuild', 'test-without-building', '-xctestrun', xctestrun_path,
@ -421,10 +421,11 @@ def main(args):
android_device = os.environ.get('ANDROID_DEVICE') android_device = os.environ.get('ANDROID_DEVICE')
if not android_device: if not android_device:
adb_devices = subprocess.check_output(['adb', 'devices'], adb_devices = subprocess.check_output(['adb', 'devices'],
shell=IS_WINDOWS_HOST) shell=IS_WINDOWS_HOST,
text=True)
devices = [] devices = []
for line in adb_devices.splitlines(): for line in adb_devices.splitlines():
line = line.decode('utf-8') line = line
if (line == 'List of devices attached' or if (line == 'List of devices attached' or
re.match('^\* daemon .+ \*$', line) or line == ''): re.match('^\* daemon .+ \*$', line) or line == ''):
continue continue

View File

@ -14,13 +14,12 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from __future__ import print_function
import os import os
import platform import platform
import pywintypes import pywintypes
import random import random
import re import re
import struct
import subprocess import subprocess
import sys import sys
import tempfile import tempfile
@ -104,7 +103,7 @@ def NamedPipeExistsAndReady(pipe_name):
try: try:
win32pipe.WaitNamedPipe(pipe_name, win32pipe.NMPWAIT_WAIT_FOREVER) win32pipe.WaitNamedPipe(pipe_name, win32pipe.NMPWAIT_WAIT_FOREVER)
except pywintypes.error as e: except pywintypes.error as e:
if e[0] == winerror.ERROR_FILE_NOT_FOUND: if e.winerror == winerror.ERROR_FILE_NOT_FOUND:
return False return False
raise raise
return True return True
@ -152,6 +151,14 @@ def GetDumpFromProgram(out_dir, pipe_name, executable_name, expect_exit_code,
] + list(args)) ] + list(args))
print('Running %s' % os.path.basename(command[0])) print('Running %s' % os.path.basename(command[0]))
exit_code = subprocess.call(command) exit_code = subprocess.call(command)
# Some win32con codes are negative signed integers, whereas all exit
# codes are unsigned integers. Convert from signed to unsigned.
if expect_exit_code < 0:
expect_exit_code = struct.unpack('I',
struct.pack('i',
expect_exit_code))[0]
if exit_code != expect_exit_code: if exit_code != expect_exit_code:
raise subprocess.CalledProcessError(exit_code, executable_name) raise subprocess.CalledProcessError(exit_code, executable_name)
@ -160,7 +167,8 @@ def GetDumpFromProgram(out_dir, pipe_name, executable_name, expect_exit_code,
'--database=' + test_database, '--database=' + test_database,
'--show-pending-reports', '--show-pending-reports',
'--show-all-report-info', '--show-all-report-info',
]) ],
text=True)
for line in out.splitlines(): for line in out.splitlines():
if line.strip().startswith('Path:'): if line.strip().startswith('Path:'):
return line.partition(':')[2].strip() return line.partition(':')[2].strip()
@ -205,7 +213,7 @@ class CdbRun(object):
# Run a command line that loads the dump, runs the specified cdb # Run a command line that loads the dump, runs the specified cdb
# command, and then quits, and capturing stdout. # command, and then quits, and capturing stdout.
self.out = subprocess.check_output( self.out = subprocess.check_output(
[cdb_path, '-z', dump_path, '-c', command + ';q']) [cdb_path, '-z', dump_path, '-c', command + ';q'], text=True)
def Check(self, pattern, message, re_flags=0): def Check(self, pattern, message, re_flags=0):
match_obj = re.search(pattern, self.out, re_flags) match_obj = re.search(pattern, self.out, re_flags)