#!/usr/bin/env python # utils/coverage/coverage-query-db - Find covering tests using coverage database # # This source file is part of the Swift.org open source project # # Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors # Licensed under Apache License v2.0 with Runtime Library Exception # # See https://swift.org/LICENSE.txt for license information # See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors import subprocess import argparse import sys def covering_func(args): return subprocess.call([ 'sqlite3', args.coverage_db, "select distinct test_string.string " "from strings as function_string, strings as src_string, " " coverage, strings as test_string " "where src_string.string = '{0}' and " " function_string.string like '%{1}%' and " " src_string.id = coverage.src and " " test_string.id = coverage.test and " " function_string.id = coverage.function;".format( args.src_file, args.function_str ) ]) def covering_line(args): return subprocess.call([ 'sqlite3', args.coverage_db, "select distinct test_string.string " "from strings as src_string, coverage, " " strings as test_string " "where src_string.string = '{0}' and " " istart < {1} and {1} < iend and " " src_string.id = coverage.src and " " test_string.id = coverage.test;".format( args.src_file, args.line_number ) ]) def parse_arguments(): parser = argparse.ArgumentParser( 'Find covering tests using coverage database') subparsers = parser.add_subparsers() covering_func_parser = subparsers.add_parser( 'covering_func', help='Find tests that cover any part of a given function' ) covering_func_parser.add_argument( '--coverage-db', help='coverage database to query (e.g. coverage.db)', required=True) covering_func_parser.add_argument( '--src-file', help='src file name containing the specified function ' '(e.g. DocComment.cpp)', required=True) covering_func_parser.add_argument( '--function-str', help='find tests that cover any part of a function containing this ' 'string in its signature', required=True) covering_func_parser.set_defaults(which='covering_func') covering_line_parser = subparsers.add_parser( 'covering_line', help='Find tests that cover a given line' ) covering_line_parser.add_argument( '--coverage-db', help='coverage database to query (e.g. coverage.db)', required=True) covering_line_parser.add_argument( '--src-file', help='src file name containing the specified line number ' '(e.g. DocComment.cpp)', required=True) covering_line_parser.add_argument( '--line-number', help='find tests that cover this line number', required=True) covering_line_parser.set_defaults(which='covering_line') return parser.parse_args() def main(): args = parse_arguments() return globals()[args.which](args) if __name__ == '__main__': sys.exit(main())