diff options
Diffstat (limited to 'tools/code_coverage/process_coverage.py')
-rw-r--r-- | tools/code_coverage/process_coverage.py | 466 |
1 files changed, 233 insertions, 233 deletions
diff --git a/tools/code_coverage/process_coverage.py b/tools/code_coverage/process_coverage.py index c902f4d..6cec95b 100644 --- a/tools/code_coverage/process_coverage.py +++ b/tools/code_coverage/process_coverage.py @@ -1,233 +1,233 @@ -#!/usr/bin/python2.4
-#
-# Copyright 2008, Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-"""Script to clean the lcov files and convert it to HTML
-
-TODO(niranjan): Add usage information here
-"""
-
-
-import optparse
-import os
-import shutil
-import sys
-import tempfile
-
-
-# These are source files that were generated during compile time. We want to
-# remove references to these files from the lcov file otherwise genhtml will
-# throw an error.
-win32_srcs_exclude = ['parse.y',
- 'xpathgrammar.cpp',
- 'cssgrammar.cpp']
-
-
-def CleanPathNames(dir):
- """Clean the pathnames of the HTML generated by genhtml.
-
- This method is required only for code coverage on Win32. Due to a known issue
- with reading from CIFS shares mounted on Linux, genhtml appends a ^M to every
- file name it reads from the Windows share, causing corrupt filenames in
- genhtml's output folder.
-
- Args:
- dir: Output folder of the genhtml output.
-
- Returns:
- None
- """
- # Stip off the ^M characters that get appended to the file name
- for file in os.walk(dir):
- file_clean = file.replace('\r', '')
- if file_clean != file:
- os.rename(file, file_clean)
-
-
-def GenerateHtml(lcov_path, dash_root):
- """Runs genhtml to convert lcov data to human readable HTML.
-
- This script expects the LCOV file name to be in the format:
- chrome_<platform>_<revision#>.lcov.
- This method parses the file name and then sets up the correct folder
- hierarchy for the coverage data and then runs genhtml to get the actual HTML
- formatted coverage data.
-
- Args:
- lcov_path: Path of the lcov data file.
- dash_root: Root location of the dashboard.
-
- Returns:
- Code coverage percentage on sucess.
- None on failure.
- """
- # Parse the LCOV file name.
- filename = os.path.basename(lcov_path).split('.')[0]
- buffer = filename.split('_')
- dash_root = dash_root.rstrip('/') # Remove trailing '/'
-
- # Set up correct folder heirarchy in the dashboard root
- # TODO(niranjan): Check the formatting using a regexp
- if len(buffer) >= 3: # Check if filename has right formatting
- platform = buffer[len(buffer) - 2]
- revision = buffer[len(buffer) - 1]
- if os.path.exists(os.path.join(dash_root, platform)) == False:
- os.mkdir(os.path.join(dash_root, platform))
- output_dir = os.join.path(dash_root, platform, revision)
- os.mkdir(output_dir)
- else:
- # TODO(niranjan): Add failure logging here.
- return None # File not formatted correctly
-
- # Run genhtml
- os.system('/usr/bin/genhtml -o %s %s' % (output_dir, lcov_path))
- # TODO(niranjan): Check the exit status of the genhtml command.
- # TODO(niranjan): Parse the stdout and return coverage percentage.
- CleanPathNames(output_dir)
- return 'dummy' # TODO(niranjan): Return actual percentage.
-
-
-def CleanWin32Lcov(lcov_path, src_root):
- """Cleanup the lcov data generated on Windows.
-
- This method fixes up the paths inside the lcov file from the Win32 specific
- paths to the actual paths of the mounted CIFS share. The lcov files generated
- on Windows have the following format:
-
- SF:c:\chrome_src\src\skia\sgl\skscan_antihair.cpp
- DA:97,0
- DA:106,0
- DA:107,0
- DA:109,0
- ...
- end_of_record
-
- This method changes the source-file (SF) lines to a format compatible with
- genhtml on Linux by fixing paths. This method also removes references to
- certain dynamically generated files to be excluded from the code ceverage.
-
- Args:
- lcov_path: Path of the Win32 lcov file to be cleaned.
- src_root: Location of the source and symbols dir.
- Returns:
- None
- """
- strip_flag = False
- lcov = open(lcov_path, 'r')
- (tmpfile, tmpfile_name) = tempfile.mkstemp()
- src_root = src_root.rstrip('/') # Remove trailing '/'
- for line in lcov:
- if line.startswith('SF'):
- # We want to exclude certain auto-generated files otherwise genhtml will
- # fail to convert lcov to HTML.
- for exp in win32_srcs_exclude:
- if line.rfind(exp) != -1:
- strip_flag = True # Indicates that we want to remove this section
-
- # Now we normalize the paths
- # e.g. Change SF:c:\foo\src\... to SF:/chrome_src/...
- parse_buffer = line.split(':')
- buffer = '%s:%s%s' % (parse_buffer[0],
- src_root,
- parse_buffer[2])
- buffer = buffer.replace('\\', '/')
- line = buffer
-
- # Write to the temp file if the section to write is valid
- if strip_flag == False:
- tmpfile.write('%s' % (line))
-
- # Reset the strip flag
- if line.endswith('end_of_record'):
- strip_flag = False
-
- # Close the files and replace the lcov file by the 'clean' tmpfile
- tmpfile.close()
- lcov.close()
- shutil.move(tmpfile_name, lcov_path)
-
-
-def main():
- if sys.platform[:5] != 'linux': # Run this only on Linux
- print 'This script is supported only on Linux'
- os.exit(1)
-
- # Command line parsing
- parser = optparse.OptionParser()
- parser.add_option('-p',
- '--platform',
- dest='platform',
- default=None,
- help='Platform that the locv file was generated on. Must be
- one of {win32, linux2, macosx}')
- parser.add_option('-s',
- '--source',
- dest='src_dir',
- default=None,
- help='Path to the source code and symbols')
- parser.add_option('-d',
- '--dash_root',
- dest='dash_root',
- default=None,
- help='Root directory for the dashboard')
- parser.add_option('-l',
- '--lcov',
- dest='lcov_path',
- default=None,
- help='Location of the LCOV file to process')
- (options, args) = parser.parse_args()
-
- if options.platform == None:
- parser.error('Platform not specified')
- if options.lcov_path == None:
- parser.error('lcov file path not specified')
- if options.src_dir == None:
- parser.error('Source directory not specified')
- if options.dash_root == None:
- parser.error('Dashboard root not specified')
- if options.platform == 'win32':
- CleanWin32Lcov(options.lcov_path, options.src_dir)
- percent = GenerateHtml(options.lcov_path, options.dash_root)
- if percent == None:
- # TODO(niranjan): Add logging.
- print 'Failed to generate code coverage'
- os.exit(1)
- else:
- # TODO(niranjan): Do something with the code coverage numbers
- pass
- else:
- print 'Unsupported platform'
- os.exit(1)
-
-
-if __name__ == '__main__':
- main()
-
+#!/usr/bin/python2.4 +# +# Copyright 2008, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +"""Script to clean the lcov files and convert it to HTML + +TODO(niranjan): Add usage information here +""" + + +import optparse +import os +import shutil +import sys +import tempfile + + +# These are source files that were generated during compile time. We want to +# remove references to these files from the lcov file otherwise genhtml will +# throw an error. +win32_srcs_exclude = ['parse.y', + 'xpathgrammar.cpp', + 'cssgrammar.cpp'] + + +def CleanPathNames(dir): + """Clean the pathnames of the HTML generated by genhtml. + + This method is required only for code coverage on Win32. Due to a known issue + with reading from CIFS shares mounted on Linux, genhtml appends a ^M to every + file name it reads from the Windows share, causing corrupt filenames in + genhtml's output folder. + + Args: + dir: Output folder of the genhtml output. + + Returns: + None + """ + # Stip off the ^M characters that get appended to the file name + for file in os.walk(dir): + file_clean = file.replace('\r', '') + if file_clean != file: + os.rename(file, file_clean) + + +def GenerateHtml(lcov_path, dash_root): + """Runs genhtml to convert lcov data to human readable HTML. + + This script expects the LCOV file name to be in the format: + chrome_<platform>_<revision#>.lcov. + This method parses the file name and then sets up the correct folder + hierarchy for the coverage data and then runs genhtml to get the actual HTML + formatted coverage data. + + Args: + lcov_path: Path of the lcov data file. + dash_root: Root location of the dashboard. + + Returns: + Code coverage percentage on sucess. + None on failure. + """ + # Parse the LCOV file name. + filename = os.path.basename(lcov_path).split('.')[0] + buffer = filename.split('_') + dash_root = dash_root.rstrip('/') # Remove trailing '/' + + # Set up correct folder heirarchy in the dashboard root + # TODO(niranjan): Check the formatting using a regexp + if len(buffer) >= 3: # Check if filename has right formatting + platform = buffer[len(buffer) - 2] + revision = buffer[len(buffer) - 1] + if os.path.exists(os.path.join(dash_root, platform)) == False: + os.mkdir(os.path.join(dash_root, platform)) + output_dir = os.join.path(dash_root, platform, revision) + os.mkdir(output_dir) + else: + # TODO(niranjan): Add failure logging here. + return None # File not formatted correctly + + # Run genhtml + os.system('/usr/bin/genhtml -o %s %s' % (output_dir, lcov_path)) + # TODO(niranjan): Check the exit status of the genhtml command. + # TODO(niranjan): Parse the stdout and return coverage percentage. + CleanPathNames(output_dir) + return 'dummy' # TODO(niranjan): Return actual percentage. + + +def CleanWin32Lcov(lcov_path, src_root): + """Cleanup the lcov data generated on Windows. + + This method fixes up the paths inside the lcov file from the Win32 specific + paths to the actual paths of the mounted CIFS share. The lcov files generated + on Windows have the following format: + + SF:c:\chrome_src\src\skia\sgl\skscan_antihair.cpp + DA:97,0 + DA:106,0 + DA:107,0 + DA:109,0 + ... + end_of_record + + This method changes the source-file (SF) lines to a format compatible with + genhtml on Linux by fixing paths. This method also removes references to + certain dynamically generated files to be excluded from the code ceverage. + + Args: + lcov_path: Path of the Win32 lcov file to be cleaned. + src_root: Location of the source and symbols dir. + Returns: + None + """ + strip_flag = False + lcov = open(lcov_path, 'r') + (tmpfile, tmpfile_name) = tempfile.mkstemp() + src_root = src_root.rstrip('/') # Remove trailing '/' + for line in lcov: + if line.startswith('SF'): + # We want to exclude certain auto-generated files otherwise genhtml will + # fail to convert lcov to HTML. + for exp in win32_srcs_exclude: + if line.rfind(exp) != -1: + strip_flag = True # Indicates that we want to remove this section + + # Now we normalize the paths + # e.g. Change SF:c:\foo\src\... to SF:/chrome_src/... + parse_buffer = line.split(':') + buffer = '%s:%s%s' % (parse_buffer[0], + src_root, + parse_buffer[2]) + buffer = buffer.replace('\\', '/') + line = buffer + + # Write to the temp file if the section to write is valid + if strip_flag == False: + tmpfile.write('%s' % (line)) + + # Reset the strip flag + if line.endswith('end_of_record'): + strip_flag = False + + # Close the files and replace the lcov file by the 'clean' tmpfile + tmpfile.close() + lcov.close() + shutil.move(tmpfile_name, lcov_path) + + +def main(): + if sys.platform[:5] != 'linux': # Run this only on Linux + print 'This script is supported only on Linux' + os.exit(1) + + # Command line parsing + parser = optparse.OptionParser() + parser.add_option('-p', + '--platform', + dest='platform', + default=None, + help='Platform that the locv file was generated on. Must be + one of {win32, linux2, macosx}') + parser.add_option('-s', + '--source', + dest='src_dir', + default=None, + help='Path to the source code and symbols') + parser.add_option('-d', + '--dash_root', + dest='dash_root', + default=None, + help='Root directory for the dashboard') + parser.add_option('-l', + '--lcov', + dest='lcov_path', + default=None, + help='Location of the LCOV file to process') + (options, args) = parser.parse_args() + + if options.platform == None: + parser.error('Platform not specified') + if options.lcov_path == None: + parser.error('lcov file path not specified') + if options.src_dir == None: + parser.error('Source directory not specified') + if options.dash_root == None: + parser.error('Dashboard root not specified') + if options.platform == 'win32': + CleanWin32Lcov(options.lcov_path, options.src_dir) + percent = GenerateHtml(options.lcov_path, options.dash_root) + if percent == None: + # TODO(niranjan): Add logging. + print 'Failed to generate code coverage' + os.exit(1) + else: + # TODO(niranjan): Do something with the code coverage numbers + pass + else: + print 'Unsupported platform' + os.exit(1) + + +if __name__ == '__main__': + main() + |