#!/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',
  'ortc_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/.*\''] +
         ['-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())
