Home | History | Annotate | Download | only in coverage
      1 #!/usr/bin/env python
      2 #
      3 # Copyright (C) 2016 The Android Open Source Project
      4 #
      5 # Licensed under the Apache License, Version 2.0 (the "License");
      6 # you may not use this file except in compliance with the License.
      7 # You may obtain a copy of the License at
      8 #
      9 #      http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 # Unless required by applicable law or agreed to in writing, software
     12 # distributed under the License is distributed on an "AS IS" BASIS,
     13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 # See the License for the specific language governing permissions and
     15 # limitations under the License.
     16 #
     17 import os
     18 import unittest
     19 
     20 from vts.utils.python.coverage import arc_summary
     21 from vts.utils.python.coverage import block_summary
     22 from vts.utils.python.coverage import file_summary
     23 from vts.utils.python.coverage import function_summary
     24 from vts.utils.python.coverage import gcda_parser
     25 from vts.utils.python.coverage import gcno_parser
     26 from vts.utils.python.coverage.parser_test import MockStream
     27 
     28 
     29 class GCDAParserTest(unittest.TestCase):
     30     """Tests for GCDA parser of vts.utils.python.coverage.
     31     """
     32 
     33     def setUp(self):
     34         """Creates a stream for each test.
     35       """
     36         self.stream = MockStream(gcda_parser.GCDAParser.MAGIC)
     37 
     38     def testReadFunction(self):
     39         """Verifies that the correct function is read and returned.
     40         """
     41         ident = 100
     42         checksum = 0
     43         fs = file_summary.FileSummary()
     44         func = function_summary.FunctionSummary(ident, 'test', 'test.c', 0)
     45         fs.functions[ident] = func
     46         self.stream = MockStream.concat_int(self.stream, ident)
     47         self.stream = MockStream.concat_int(self.stream, 0)
     48         self.stream = MockStream.concat_int(self.stream, 0)
     49         self.stream = MockStream.concat_string(self.stream, 'test')
     50         length = 5
     51         parser = gcda_parser.GCDAParser(self.stream)
     52         parser.file_summary = fs
     53         func = parser.ReadFunction(5)
     54         assert (func.ident == ident)
     55 
     56     def testReadCountsNormal(self):
     57         """Verifies that counts are read correctly.
     58 
     59         Verifies that arcs are marked as resolved and count is correct.
     60         """
     61         n = 5
     62         fs = file_summary.FileSummary()
     63         func = function_summary.FunctionSummary(0, 'test', 'test.c', 0)
     64         blocks = [block_summary.BlockSummary(i, 0) for i in range(n)]
     65         func.blocks = blocks
     66         fs.functions[func.ident] = func
     67         for i in range(1, n):
     68             arc = arc_summary.ArcSummary(blocks[0], blocks[i], 0)
     69             blocks[0].exit_arcs.append(arc)
     70             blocks[i].entry_arcs.append(arc)
     71             self.stream = MockStream.concat_int64(self.stream, i)
     72         parser = gcda_parser.GCDAParser(self.stream)
     73         parser.file_summary = fs
     74         parser.ReadCounts(func)
     75         for i, arc in zip(range(1, n), blocks[0].exit_arcs):
     76             self.assertEqual(i, arc.count)
     77             self.assertTrue(arc.resolved)
     78 
     79     def testReadCountsFakeOrOnTree(self):
     80         """Verifies that counts are read correctly when there are skipped arcs.
     81 
     82         Verifies that the fake arc and the arc on the tree are skipped while other
     83         arcs are read and resolved correctly.
     84         """
     85         n = 10
     86         fs = file_summary.FileSummary()
     87         func = function_summary.FunctionSummary(0, 'test', 'test.c', 0)
     88         blocks = [block_summary.BlockSummary(i, 0) for i in range(n)]
     89         func.blocks = blocks
     90         fs.functions[func.ident] = func
     91 
     92         arc = arc_summary.ArcSummary(blocks[0], blocks[1],
     93                                      arc_summary.ArcSummary.GCOV_ARC_FAKE)
     94         blocks[0].exit_arcs.append(arc)
     95         blocks[1].entry_arcs.append(arc)
     96 
     97         arc = arc_summary.ArcSummary(blocks[0], blocks[2],
     98                                      arc_summary.ArcSummary.GCOV_ARC_ON_TREE)
     99         blocks[0].exit_arcs.append(arc)
    100         blocks[2].entry_arcs.append(arc)
    101 
    102         for i in range(3, n):
    103             arc = arc_summary.ArcSummary(blocks[0], blocks[i], 0)
    104             blocks[0].exit_arcs.append(arc)
    105             blocks[i].entry_arcs.append(arc)
    106             self.stream = MockStream.concat_int64(self.stream, i)
    107 
    108         parser = gcda_parser.GCDAParser(self.stream)
    109         parser.file_summary = fs
    110         parser.ReadCounts(func)
    111         self.assertFalse(blocks[0].exit_arcs[0].resolved)
    112         self.assertFalse(blocks[0].exit_arcs[1].resolved)
    113         for i, arc in zip(range(3, n), blocks[0].exit_arcs[2:]):
    114             self.assertEqual(i, arc.count)
    115             self.assertTrue(arc.resolved)
    116 
    117     def testSampleFile(self):
    118         """Asserts correct parsing of sample GCDA file.
    119 
    120         Verifies the block coverage counts for each function.
    121         """
    122         gcno_path = os.path.join(
    123             os.getenv('ANDROID_BUILD_TOP'),
    124             'test/vts/utils/python/coverage/testdata/sample.gcno')
    125         gcda_path = os.path.join(
    126             os.getenv('ANDROID_BUILD_TOP'),
    127             'test/vts/utils/python/coverage/testdata/sample.gcda')
    128         summary = gcno_parser.ParseGcnoFile(gcno_path)
    129         gcda_parser.ParseGcdaFile(gcda_path, summary)
    130         # Function: main
    131         expected_list = [2, 0, 2, 2, 2, 0, 2, 2, 500, 502, 2, 2]
    132         for index, expected in zip(range(len(expected_list)), expected_list):
    133             self.assertEqual(summary.functions[3].blocks[index].count,
    134                              expected)
    135 
    136         # Function: testFunctionName
    137         expected_list = [2, 2, 2, 2, 2]
    138         for index, expected in zip(range(len(expected_list)), expected_list):
    139             self.assertEqual(summary.functions[4].blocks[index].count,
    140                              expected)
    141 
    142 
    143 if __name__ == "__main__":
    144     unittest.main()
    145