webrtc_m130/tools_webrtc/coverage/generate_ios_coverage_command.py
Mirko Bonadei 8c185fcabe Reland "Add WebRTC specific dcheck_always_on."
This is a reland of 9f2a20f4342a3e86e1f9fdfe6f3d76fb539d41c2

See https://webrtc-review.googlesource.com/c/src/+/226563/1..2
for the fix. RTC_DCHECK_ALWAYS_ON needs to be in public_configs
in order to be propagated together with header #includes and
avoid ODR violations.

Original change's description:
> Add WebRTC specific dcheck_always_on.
>
> Inspired by V8 CL: crrev.com/c/3038528.
>
> This makes the WebRTC's dcheck control independent of Chromium's and
> prepares switching Chromium's default behavior without affecting
> WebRTC developers or builders.
>
> Preparation for: https://crrev.com/c/2893204
>
> Bug: chromium:1225701, webrtc:12988
> Change-Id: Ia0d21f9fb8e9d7704fd1beca16504c301a263b3b
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/226465
> Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
> Reviewed-by: Markus Handell <handellm@webrtc.org>
> Reviewed-by: Dirk Pranke <dpranke@google.com>
> Cr-Commit-Position: refs/heads/master@{#34512}

Bug: chromium:1225701, webrtc:12988
Change-Id: I1f78587487ee7b1a4a07b8c91b737a9e797b2323
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/226563
Reviewed-by: Florent Castelli <orphis@webrtc.org>
Reviewed-by: Markus Handell <handellm@webrtc.org>
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34519}
2021-07-21 13:26:14 +00:00

167 lines
5.6 KiB
Python

#!/usr/bin/env python
# Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS. All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
"""Generates command-line instructions to produce one-time iOS coverage using
coverage.py.
This script is usable for both real devices and simulator.
But for real devices actual execution should be done manually from Xcode
and coverage.profraw files should be also copied manually from the device.
Additional prerequisites:
1. Xcode 10+ with iPhone Simulator SDK. Can be installed by command:
$ mac_toolchain install -kind ios -xcode-version 10l232m \
-output-dir build/mac_files/Xcode.app
2. For computing coverage on real device you probably also need to apply
following patch to code_coverage/coverage.py script:
========== BEGINNING OF PATCH ==========
--- a/code_coverage/coverage.py
+++ b/code_coverage/coverage.py
@@ -693,8 +693,7 @@ def _AddArchArgumentForIOSIfNeeded(cmd_list, num_archs):
to use, and one architecture needs to be specified for each binary.
"" "
if _IsIOS():
- cmd_list.extend(['-arch=x86_64'] * num_archs)
+ cmd_list.extend(['-arch=arm64'] * num_archs)
def _GetBinaryPath(command):
@@ -836,8 +835,8 @@ def _GetBinaryPathsFromTargets(targets, build_dir):
binary_path = os.path.join(build_dir, target)
if coverage_utils.GetHostPlatform() == 'win':
binary_path += '.exe'
+ elif coverage_utils.GetHostPlatform() == 'mac':
+ binary_path += '.app/%s' % target
if os.path.exists(binary_path):
binary_paths.append(binary_path)
========== ENDING OF PATCH ==========
"""
import sys
DIRECTORY = 'out/coverage'
TESTS = [
'audio_decoder_unittests',
'common_audio_unittests',
'common_video_unittests',
'modules_tests',
'modules_unittests',
'rtc_media_unittests',
'rtc_pc_unittests',
'rtc_stats_unittests',
'rtc_unittests',
'slow_tests',
'system_wrappers_unittests',
'test_support_unittests',
'tools_unittests',
'video_capture_tests',
'video_engine_tests',
'webrtc_nonparallel_tests',
]
XC_TESTS = [
'apprtcmobile_tests',
'sdk_framework_unittests',
'sdk_unittests',
]
def FormatIossimTest(test_name, is_xctest=False):
args = ['%s/%s.app' % (DIRECTORY, test_name)]
if is_xctest:
args += ['%s/%s_module.xctest' % (DIRECTORY, test_name)]
return '-c \'%s/iossim %s\'' % (DIRECTORY, ' '.join(args))
def GetGNArgs(is_simulator):
target_cpu = 'x64' if is_simulator else 'arm64'
return ([] + ['target_os="ios"'] + ['target_cpu="%s"' % target_cpu] +
['use_clang_coverage=true'] + ['is_component_build=false'] +
['rtc_dcheck_always_on=true'])
def GenerateIOSSimulatorCommand():
gn_args_string = ' '.join(GetGNArgs(is_simulator=True))
gn_cmd = ['gn', 'gen', DIRECTORY, '--args=\'%s\'' % gn_args_string]
coverage_cmd = ([sys.executable, 'tools/code_coverage/coverage.py'] +
["%s.app" % t for t in XC_TESTS + TESTS] +
['-b %s' % DIRECTORY, '-o out/report'] +
['-i=\'.*/out/.*|.*/third_party/.*|.*test.*\''] +
[FormatIossimTest(t, is_xctest=True) for t in XC_TESTS] +
[FormatIossimTest(t, is_xctest=False) for t in TESTS])
print 'To get code coverage using iOS sim just run following commands:'
print ''
print ' '.join(gn_cmd)
print ''
print ' '.join(coverage_cmd)
return 0
def GenerateIOSDeviceCommand():
gn_args_string = ' '.join(GetGNArgs(is_simulator=False))
coverage_report_cmd = (
[sys.executable, 'tools/code_coverage/coverage.py'] +
['%s.app' % t for t in TESTS] + ['-b %s' % DIRECTORY] +
['-o out/report'] + ['-p %s/merged.profdata' % DIRECTORY] +
['-i=\'.*/out/.*|.*/third_party/.*|.*test.*\''])
print 'Computing code coverage for real iOS device is a little bit tedious.'
print ''
print 'You will need:'
print ''
print '1. Generate xcode project and open it with Xcode 10+:'
print ' gn gen %s --ide=xcode --args=\'%s\'' % (DIRECTORY, gn_args_string)
print ' open %s/all.xcworkspace' % DIRECTORY
print ''
print '2. Execute these Run targets manually with Xcode Run button and '
print 'manually save generated coverage.profraw file to %s:' % DIRECTORY
print '\n'.join('- %s' % t for t in TESTS)
print ''
print '3. Execute these Test targets manually with Xcode Test button and '
print 'manually save generated coverage.profraw file to %s:' % DIRECTORY
print '\n'.join('- %s' % t for t in XC_TESTS)
print ''
print '4. Merge *.profraw files to *.profdata using llvm-profdata tool:'
print(' build/mac_files/Xcode.app/Contents/Developer/Toolchains/' +
'XcodeDefault.xctoolchain/usr/bin/llvm-profdata merge ' +
'-o %s/merged.profdata ' % DIRECTORY +
'-sparse=true %s/*.profraw' % DIRECTORY)
print ''
print '5. Generate coverage report:'
print ' ' + ' '.join(coverage_report_cmd)
return 0
def Main():
if len(sys.argv) < 2:
print 'Please specify type of coverage:'
print ' %s simulator' % sys.argv[0]
print ' %s device' % sys.argv[0]
elif sys.argv[1] == 'simulator':
GenerateIOSSimulatorCommand()
elif sys.argv[1] == 'device':
GenerateIOSDeviceCommand()
else:
print 'Unsupported type of coverage'
return 0
if __name__ == '__main__':
sys.exit(Main())