blob: ba11ae1b38602decf632be83cec15150080b6c5d [file] [log] [blame]
George Keishinge7e91712021-09-03 11:28:44 -05001#!/usr/bin/env python3
George Keishing13bdbff2018-05-31 02:52:22 -05002
3r"""
4Use robot framework API to extract test data from test suites.
George Keishing8e865482025-03-14 21:59:52 +05305Refer to https://robot-framework.readthedocs.io/en/latest/autodoc/robot.running.html
George Keishing13bdbff2018-05-31 02:52:22 -05006"""
7
George Keishing37c58c82022-12-08 07:42:54 -06008import os
Patrick Williams20f38712022-12-08 06:18:26 -06009import sys
10
George Keishing8e865482025-03-14 21:59:52 +053011from robot.api import SuiteVisitor, TestSuiteBuilder
Patrick Williams20f38712022-12-08 06:18:26 -060012
George Keishing37c58c82022-12-08 07:42:54 -060013sys.path.append(os.path.join(os.path.dirname(__file__), "../lib"))
14
Patrick Williams20f38712022-12-08 06:18:26 -060015from gen_arg import * # NOQA
16from gen_print import * # NOQA
17from gen_valid import * # NOQA
George Keishing13bdbff2018-05-31 02:52:22 -050018
19# Set exit_on_error for gen_valid functions.
20set_exit_on_error(True)
21
Patrick Williams20f38712022-12-08 06:18:26 -060022valid_options = ["name", "tags", "doc", "all"]
George Keishing13bdbff2018-05-31 02:52:22 -050023
24parser = argparse.ArgumentParser(
Patrick Williams20f38712022-12-08 06:18:26 -060025 usage="%(prog)s [OPTIONS]",
26 description=(
27 ";%(prog)s will print test suite information to stdout. This "
28 " information consists of any and/or all of the following: "
29 " the suite name, test case names, tag names and doc"
30 " strings. Example for generated test case names "
31 " tests/test_basic_poweron.robot "
32 " Verify Front And Rear LED At Standby Power On Test"
33 " Check For Application Failures "
34 " Verify Uptime Average Against Threshold Test SSH"
35 " And IPMI Connections"
36 ),
George Keishing13bdbff2018-05-31 02:52:22 -050037 formatter_class=argparse.ArgumentDefaultsHelpFormatter,
Patrick Williams20f38712022-12-08 06:18:26 -060038 prefix_chars="-+",
39)
George Keishing13bdbff2018-05-31 02:52:22 -050040
41parser.add_argument(
Patrick Williams20f38712022-12-08 06:18:26 -060042 "--source_path", "-s", help="The robot test file or directory path."
43)
George Keishing13bdbff2018-05-31 02:52:22 -050044
45parser.add_argument(
Patrick Williams20f38712022-12-08 06:18:26 -060046 "--option",
47 "-o",
George Keishing13bdbff2018-05-31 02:52:22 -050048 default="name",
Patrick Williams20f38712022-12-08 06:18:26 -060049 help="Test case attribute name. This may be any one of the following:\n"
50 + sprint_var(valid_options),
51)
George Keishing13bdbff2018-05-31 02:52:22 -050052
53# Populate stock_list with options we want.
54stock_list = [("test_mode", 0), ("quiet", 0), ("debug", 0)]
55
56
George Keishing8e865482025-03-14 21:59:52 +053057class TestPrint(SuiteVisitor):
58
59 def __init__(self, option):
60 self.option = option
61
62 def visit_test(self, test):
63 r"""
64 Print the test data from suite test object from option specified.
65 """
66 if self.option == "name":
67 print(test.name)
68 elif self.option == "tags":
69 print(test.tags)
70 elif self.option == "doc":
71 print(test.doc)
72 elif self.option == "all":
73 print(test.name)
74 print(test.tags)
75 print(test.doc)
76
77
Patrick Williams20f38712022-12-08 06:18:26 -060078def exit_function(signal_number=0, frame=None):
George Keishing13bdbff2018-05-31 02:52:22 -050079 r"""
80 Execute whenever the program ends normally or with the signals that we
81 catch (i.e. TERM, INT).
82 """
83
84 dprint_executing()
85
86 dprint_var(signal_number)
87
88 qprint_pgm_footer()
89
90
Patrick Williams20f38712022-12-08 06:18:26 -060091def signal_handler(signal_number, frame):
George Keishing13bdbff2018-05-31 02:52:22 -050092 r"""
93 Handle signals. Without a function to catch a SIGTERM or SIGINT, the
94 program would terminate immediately with return code 143 and without
95 calling the exit_function.
96 """
97
98 # Our convention is to set up exit_function with atexit.register() so
99 # there is no need to explicitly call exit_function from here.
100
101 dprint_executing()
102
103 # Calling exit prevents us from returning to the code that was running
104 # when the signal was received.
105 exit(0)
106
107
108def validate_parms():
109 r"""
110 Validate program parameters, etc. Return True or False (i.e. pass/fail)
111 accordingly.
112 """
113
114 valid_path(source_path)
115
116 valid_value(option, valid_values=valid_options)
117
118 gen_post_validation(exit_function, signal_handler)
119
120
121def parse_test_suites(source_path, option):
122 r"""
123 Parse the robot files and extract test data output.
124
125 Description of argument(s):
126 source_path The path to a robot file or a directory of robot files.
127 option Test case attribute instances such as "name",
128 "tags" or "doc".
129 """
130 if os.path.isfile(source_path):
131 file_paths = [source_path]
132 else:
Patrick Williams20f38712022-12-08 06:18:26 -0600133 file_paths = [
134 os.path.join(path, file)
135 for (path, dirs, files) in os.walk(source_path)
136 for file in files
137 ]
George Keishing13bdbff2018-05-31 02:52:22 -0500138
139 for file_path in file_paths:
George Keishingbfa859a2020-04-02 00:38:24 -0500140 print(file_path)
George Keishing13bdbff2018-05-31 02:52:22 -0500141 if "__init__.robot" in file_path:
142 continue
George Keishing8e865482025-03-14 21:59:52 +0530143 test_suite_obj = TestSuiteBuilder().build(file_path)
George Keishing13bdbff2018-05-31 02:52:22 -0500144 parse_test_file(test_suite_obj, option)
145
146
147def parse_test_file(test_suite_obj, option):
148 r"""
149 Extract test information from test suite object and print it to stdout in
150 the following format:
151
152 <Test Case name>
153 <Test Tags name>
154 <Test Documentation>
155
156 Description of argument(s):
157 test_suite_obj Test data suite object.
158 option Test case attribute instances such as "name",
159 "tags" or "doc".
160 """
161
George Keishing8e865482025-03-14 21:59:52 +0530162 test_suite_obj.visit(TestPrint(option))
George Keishing13bdbff2018-05-31 02:52:22 -0500163
164
165def main():
George Keishing13bdbff2018-05-31 02:52:22 -0500166 gen_get_options(parser, stock_list)
167
168 validate_parms()
169
170 qprint_pgm_header()
171
172 parse_test_suites(source_path, option)
173
174 return True
175
176
177# Main
178main()