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
18import os
19import unittest
20
21from vts.utils.python.coverage import arc_summary
22from vts.utils.python.coverage import block_summary
23from vts.utils.python.coverage import function_summary
24
25
26class FunctionSummaryTest(unittest.TestCase):
27    """Tests for FunctionSummary of vts.utils.python.coverage.
28    """
29
30    def setUp(self):
31        """Creates a function summary and a chain of blocks.
32
33        Creates an arc between adjacent blocks. All arcs are left with default
34        values (unresolved, count of 0).
35        """
36        self.n = 10
37        self.count = 5
38        self.function_summary = function_summary.FunctionSummary(0, 'test',
39                                                                 'test.c', 0)
40        self.function_summary.blocks = [block_summary.BlockSummary(i, 0)
41                                        for i in range(self.n)]
42        self.arcs = []
43        for i in range(1, self.n):
44            arc = arc_summary.ArcSummary(self.function_summary.blocks[i - 1],
45                                         self.function_summary.blocks[i], 0)
46            self.function_summary.blocks[i - 1].exit_arcs.append(arc)
47            self.function_summary.blocks[i].entry_arcs.append(arc)
48            self.arcs.append(arc)
49
50    def testResolveChainStart(self):
51        """Tests for correct resolution in a long chain.
52
53        Test resolution for the case when there is a chain of unresolved arcs
54        after a resolved arc.
55        """
56        self.arcs[0].resolved = True
57        self.arcs[0].count = self.count
58
59        self.function_summary.Resolve()
60        for arc in self.arcs:
61            self.assertTrue(arc.resolved)
62            self.assertEqual(self.count, arc.count)
63            self.assertEqual(self.count, arc.src_block.count)
64            self.assertEqual(self.count, arc.dst_block.count)
65
66    def testResolveChainEnd(self):
67        """Tests for correct resolution in a long chain.
68
69        Test resolution for the case when there is a chain of unresolved arcs
70        before a resolved arc.
71        """
72        self.arcs[-1].resolved = True
73        self.arcs[-1].count = self.count
74
75        self.function_summary.Resolve()
76        for arc in self.arcs:
77            self.assertTrue(arc.resolved)
78            self.assertEqual(self.count, arc.count)
79            self.assertEqual(self.count, arc.src_block.count)
80            self.assertEqual(self.count, arc.dst_block.count)
81
82    def testResolveFailure(self):
83        """Tests for failure when no progress can be made.
84
85        Test that Resolve() returns False when there is not enough information
86        to resolve any arcs.
87        """
88        self.assertFalse(self.function_summary.Resolve())
89
90
91if __name__ == "__main__":
92    unittest.main()
93