xref: /aosp_15_r20/tools/aadevtools/dev/change_report_test.py (revision b32fbb6340ee6fe4a25d7b39d84085c084465677)
1*b32fbb63SXin Li#!/usr/bin/python3
2*b32fbb63SXin Li#
3*b32fbb63SXin Li# Copyright (C) 2021 The Android Open Source Project
4*b32fbb63SXin Li#
5*b32fbb63SXin Li# Licensed under the Apache License, Version 2.0 (the "License");
6*b32fbb63SXin Li# you may not use this file except in compliance with the License.
7*b32fbb63SXin Li# You may obtain a copy of the License at
8*b32fbb63SXin Li#
9*b32fbb63SXin Li#      http://www.apache.org/licenses/LICENSE-2.0
10*b32fbb63SXin Li#
11*b32fbb63SXin Li# Unless required by applicable law or agreed to in writing, software
12*b32fbb63SXin Li# distributed under the License is distributed on an "AS IS" BASIS,
13*b32fbb63SXin Li# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*b32fbb63SXin Li# See the License for the specific language governing permissions and
15*b32fbb63SXin Li# limitations under the License.
16*b32fbb63SXin Li"""Tests for change_report.py."""
17*b32fbb63SXin Li
18*b32fbb63SXin Liimport os
19*b32fbb63SXin Liimport pathlib
20*b32fbb63SXin Liimport unittest
21*b32fbb63SXin Li
22*b32fbb63SXin Liimport change_report
23*b32fbb63SXin Li
24*b32fbb63SXin Li
25*b32fbb63SXin Liclass ChangeReportTest(unittest.TestCase):
26*b32fbb63SXin Li  """Tests for ChangeReport."""
27*b32fbb63SXin Li
28*b32fbb63SXin Li  def setUp(self):
29*b32fbb63SXin Li    super().setUp()
30*b32fbb63SXin Li    old_dir = str(ChangeReportTest.get_resrouce_path('old_codebase'))
31*b32fbb63SXin Li    new_dir = str(ChangeReportTest.get_resrouce_path('new_codebase'))
32*b32fbb63SXin Li    self.change_report = change_report.ChangeReport(
33*b32fbb63SXin Li        old_dir, new_dir, state_filter='0,1,2,3,4')
34*b32fbb63SXin Li
35*b32fbb63SXin Li  def test_get_diff_stat_lines(self):
36*b32fbb63SXin Li    """Tests if the diff stat of new & old_codebase matches change_report-new_vs_old_codebase.csv."""
37*b32fbb63SXin Li    diff_stat_lines = []
38*b32fbb63SXin Li    diff_stat_lines.append(change_report.ChangeReport.get_diff_stat_header())
39*b32fbb63SXin Li    diff_stat_lines.extend(self.change_report.get_diff_stat_lines())
40*b32fbb63SXin Li
41*b32fbb63SXin Li    expected_diff_stat_lines = ChangeReportTest.get_expected_lines(
42*b32fbb63SXin Li        'change_report-new_vs_old_codebase.csv')
43*b32fbb63SXin Li
44*b32fbb63SXin Li    offending_line_indexes = ChangeReportTest.diff_lines(
45*b32fbb63SXin Li        expected_diff_stat_lines, diff_stat_lines)
46*b32fbb63SXin Li    self.assertEqual(len(offending_line_indexes), 0)
47*b32fbb63SXin Li
48*b32fbb63SXin Li  def test_get_diff_lines(self):
49*b32fbb63SXin Li    """Tests if the diff stat of new & old_codebase matches change_report_diff-new_vs_old_codebase.txt."""
50*b32fbb63SXin Li    diff_lines = self.change_report.get_diff_lines()
51*b32fbb63SXin Li
52*b32fbb63SXin Li    expected_diff_lines = ChangeReportTest.get_expected_lines(
53*b32fbb63SXin Li        'change_report_diff-new_vs_old_codebase.txt')
54*b32fbb63SXin Li
55*b32fbb63SXin Li    offending_line_indexes = ChangeReportTest.diff_lines(
56*b32fbb63SXin Li        expected_diff_lines, diff_lines)
57*b32fbb63SXin Li    self.assertEqual(len(offending_line_indexes), 0)
58*b32fbb63SXin Li
59*b32fbb63SXin Li  @staticmethod
60*b32fbb63SXin Li  def get_resrouce_path(target):
61*b32fbb63SXin Li    # .../dev/change_report_test.py
62*b32fbb63SXin Li    this_path = pathlib.Path(os.path.abspath(__file__)).parents[0]
63*b32fbb63SXin Li    return pathlib.Path(this_path, 'resource', target)
64*b32fbb63SXin Li
65*b32fbb63SXin Li  @staticmethod
66*b32fbb63SXin Li  def get_expected_lines(target):
67*b32fbb63SXin Li    file = ChangeReportTest.get_resrouce_path(target)
68*b32fbb63SXin Li    with open(file, 'r') as f:
69*b32fbb63SXin Li      lines = f.readlines()
70*b32fbb63SXin Li    return lines
71*b32fbb63SXin Li
72*b32fbb63SXin Li  @staticmethod
73*b32fbb63SXin Li  def diff_lines(expected, actual):
74*b32fbb63SXin Li    expected_len = len(expected)
75*b32fbb63SXin Li    actual_len = len(actual)
76*b32fbb63SXin Li    offending_line_indexes = []
77*b32fbb63SXin Li
78*b32fbb63SXin Li    if actual_len < expected_len:
79*b32fbb63SXin Li      l = actual_len
80*b32fbb63SXin Li    else:
81*b32fbb63SXin Li      l = expected_len
82*b32fbb63SXin Li
83*b32fbb63SXin Li    for i in range(l):
84*b32fbb63SXin Li      if expected[i] != actual[i]:
85*b32fbb63SXin Li        print('ERROR: line %d is not as expected' % i)
86*b32fbb63SXin Li        print(expected[i])
87*b32fbb63SXin Li        print(actual[i])
88*b32fbb63SXin Li        offending_line_indexes.append(i)
89*b32fbb63SXin Li
90*b32fbb63SXin Li    if actual_len < expected_len:
91*b32fbb63SXin Li      print('ERROR: Missing %d lines' % (expected_len - actual_len))
92*b32fbb63SXin Li      for j in range(actual_len, expected_len):
93*b32fbb63SXin Li        print(expected[j])
94*b32fbb63SXin Li        offending_line_indexes.append(j)
95*b32fbb63SXin Li    elif actual_len > expected_len:
96*b32fbb63SXin Li      print('ERROR: Extra %d lines' % (actual_len - expected_len))
97*b32fbb63SXin Li      for k in range(expected_len, actual_len):
98*b32fbb63SXin Li        print(actual[k])
99*b32fbb63SXin Li        offending_line_indexes.append(k)
100*b32fbb63SXin Li    return offending_line_indexes
101*b32fbb63SXin Li
102*b32fbb63SXin Li
103*b32fbb63SXin Liif __name__ == '__main__':
104*b32fbb63SXin Li  unittest.main()
105