xref: /aosp_15_r20/development/tools/compare_cts_reports/test_parse_cts_report.py (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1#!/usr/bin/python3
2#
3# Copyright (C) 2023 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License"); you may not
6# use this file except in compliance with the License. You may obtain a copy of
7# 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, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14# License for the specific language governing permissions and limitations under
15# the License.
16#
17
18import filecmp
19import os
20import tempfile
21import unittest
22
23import constant
24import parse_cts_report
25
26
27class TestParse(unittest.TestCase):
28
29  def test_set(self):
30    info = {}
31    report = parse_cts_report.CtsReport(info)
32    test_item = ('module', 'abi', 'class', 'test')
33
34    report.set_test_status(*test_item, 'IGNORED')
35    report.set_test_status(*test_item, 'fail')
36
37    self.assertEqual(report.get_test_status(*test_item), 'IGNORED')
38
39    report.set_test_status(*test_item, 'pass')
40
41    self.assertEqual(report.get_test_status(*test_item), 'pass')
42
43  def test_select_abi(self):
44    report_file = 'testdata/test_result_multiple_abis.xml'
45    report_all_abi = parse_cts_report.parse_report_file(report_file)
46    report_selected_abi = parse_cts_report.parse_report_file(report_file,
47                                                             ['arm64-v8a'])
48    test_item_arm = ('module', 'armeabi-v7a', 'class', 'test')
49    test_item_arm64 = ('module', 'arm64-v8a', 'class', 'test')
50    self.assertEqual(report_all_abi.get_test_status(*test_item_arm), 'pass')
51    self.assertEqual(report_all_abi.get_test_status(*test_item_arm64), 'pass')
52    self.assertEqual(report_selected_abi.get_test_status(*test_item_arm),
53                     constant.NO_DATA)
54    self.assertEqual(report_selected_abi.get_test_status(*test_item_arm64),
55                     'pass')
56
57  def test_parse_xml(self):
58    report_file = 'testdata/test_result_1.xml'
59    report = parse_cts_report.parse_report_file(report_file)
60
61    self.check_ctsreport(report)
62
63  def test_parse_zip(self):
64    report_file = 'testdata/report.zip'
65    report = parse_cts_report.parse_report_file(report_file)
66
67    self.check_ctsreport(report)
68
69  def check_ctsreport(self, report):
70    self.assertEqual(
71        report.get_test_status('module_1', 'arm64-v8a', 'testcase_1', 'test_1'),
72        'pass',
73    )
74    self.assertEqual(
75        report.get_test_status('module_1', 'arm64-v8a', 'testcase_1', 'test_2'),
76        'fail',
77    )
78    self.assertEqual(
79        report.get_test_status('module_2', 'arm64-v8a', 'testcase_2', 'test_3'),
80        'pass',
81    )
82    self.assertEqual(
83        report.get_test_status('module_2', 'arm64-v8a', 'testcase_3', 'test_4'),
84        'ASSUMPTION_FAILURE',
85    )
86    self.assertEqual(
87        report.get_test_status('module_2', 'arm64-v8a', 'testcase_3', 'test_5'),
88        'fail',
89    )
90    self.assertEqual(
91        report.get_test_status('module_2', 'arm64-v8a', 'testcase_4', 'test_6'),
92        'IGNORED',
93    )
94    self.assertEqual(
95        report.get_test_status('module_2', 'arm64-v8a', 'testcase_4', 'test_7'),
96        'fail',
97    )
98    self.assertEqual(
99        report.get_test_status('module_2', 'arm64-v8a', 'testcase_4', 'test_8'),
100        'TEST_STATUS_UNSPECIFIED',
101    )
102    self.assertEqual(
103        report.get_test_status('module_3', 'arm64-v8a', 'testcase_5', 'test_9'),
104        'pass',
105    )
106    self.assertEqual(
107        report.get_test_status(
108            'module_3', 'arm64-v8a', 'testcase_5', 'test_10'
109        ),
110        'TEST_ERROR',
111    )
112
113    self.assertEqual(report.info['build_model'], 'this_model')
114    self.assertEqual(report.info['build_id'], '1412')
115    self.assertEqual(report.info['build_fingerprint'], 'this_build_fingerprint')
116    self.assertEqual(report.info['build_device'], 'this_device')
117    self.assertEqual(report.info['build_version_sdk'], '34')
118    self.assertEqual(report.info['build_version_security_patch'], '2023-06-05')
119    self.assertEqual(report.info['build_board'], 'this_board')
120    self.assertEqual(report.info['build_type'], 'userdebug')
121    self.assertEqual(report.info['build_version_release'], '14')
122    self.assertEqual(report.info['suite_name'], 'CTS')
123    self.assertEqual(report.info['suite_version'], '14_r1')
124    self.assertEqual(report.info['suite_plan'], 'cts')
125    self.assertEqual(report.info['suite_build_number'], '1234567')
126
127    module_summaries = report.module_summaries
128    summary = module_summaries['module_1']['arm64-v8a']
129    self.assertEqual(summary.counter['pass'], 1)
130    self.assertEqual(summary.counter['fail'], 1)
131
132    summary = module_summaries['module_2']['arm64-v8a']
133    self.assertEqual(summary.counter['pass'], 1)
134    self.assertEqual(summary.counter['IGNORED'], 1)
135    self.assertEqual(
136        summary.counter['ASSUMPTION_FAILURE'],
137        1,
138    )
139    self.assertEqual(summary.counter['fail'], 2)
140    self.assertEqual(
141        summary.counter['TEST_STATUS_UNSPECIFIED'],
142        1,
143    )
144
145    summary = module_summaries['module_3']['arm64-v8a']
146    self.assertEqual(summary.counter['pass'], 1)
147    self.assertEqual(summary.counter['TEST_ERROR'], 1)
148
149  def test_output(self):
150    report_file = 'testdata/test_result_1.xml'
151    report = parse_cts_report.parse_report_file(report_file)
152
153    with tempfile.TemporaryDirectory() as temp_dir:
154      report.output_files(temp_dir)
155
156      parsed_info_path = os.path.join(temp_dir, 'info.json')
157      parsed_result_path = os.path.join(temp_dir, 'result.csv')
158      parsed_summary_path = os.path.join(temp_dir, 'summary.csv')
159
160      self.assertTrue(
161          filecmp.cmp('testdata/output/info_1.json', parsed_info_path)
162      )
163      self.assertTrue(
164          filecmp.cmp('testdata/output/result_1.csv', parsed_result_path)
165      )
166      self.assertTrue(
167          filecmp.cmp('testdata/output/summary_1.csv', parsed_summary_path)
168      )
169
170
171if __name__ == '__main__':
172  unittest.main()
173