#!/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 a command-line for coverage.py. Useful for manual coverage runs.

Before running the generated command line, do this:

gn gen out/coverage --args='use_clang_coverage=true is_component_build=false'
"""

import sys

TESTS = [
    'video_capture_tests', 'webrtc_nonparallel_tests', 'video_engine_tests',
    'tools_unittests', 'test_support_unittests',
    'system_wrappers_unittests', 'rtc_unittests', 'rtc_stats_unittests',
    'rtc_pc_unittests', 'rtc_media_unittests', 'peerconnection_unittests',
    'modules_unittests', 'modules_tests', 'low_bandwidth_audio_test',
    'common_video_unittests', 'common_audio_unittests',
    'audio_decoder_unittests'
]


def main():
    cmd = ([sys.executable, 'tools/code_coverage/coverage.py'] + TESTS +
           ['-b out/coverage', '-o out/report'] +
           ['-i=\'.*/out/.*|.*/third_party/.*|.*test.*\''] +
           ['-c \'out/coverage/%s\'' % t for t in TESTS])

    def WithXvfb(binary):
        return '-c \'%s testing/xvfb.py %s\'' % (sys.executable, binary)

    modules_unittests = 'out/coverage/modules_unittests'
    cmd[cmd.index('-c \'%s\'' %
                  modules_unittests)] = WithXvfb(modules_unittests)

    print ' '.join(cmd)
    return 0


if __name__ == '__main__':
    sys.exit(main())
