diff --git a/modules/test/base/base.Dockerfile b/modules/test/base/base.Dockerfile index 7a82301a7..6a13b42e0 100644 --- a/modules/test/base/base.Dockerfile +++ b/modules/test/base/base.Dockerfile @@ -84,9 +84,29 @@ ENV PATH="/opt/venv/bin:$PATH" ENV REPORT_TEMPLATE_PATH=/testrun/resources # Jinja base template ENV BASE_TEMPLATE_FILE=module_report_base.jinja2 +# Jinja preview template +ENV BASE_TEMPLATE_PREVIEW_FILE=module_report_base_preview.jinja2 +# Jinja base template +ENV BASE_TEMPLATE_STYLED_FILE=module_report_styled.jinja2 +# Styles +ENV CSS_FILE=test_report_styles.css +# ICON +ENV LOGO_FILE=testrun.png # Copy base template COPY resources/report/$BASE_TEMPLATE_FILE $REPORT_TEMPLATE_PATH/ +# Copy base preview template +COPY resources/report/$BASE_TEMPLATE_PREVIEW_FILE $REPORT_TEMPLATE_PATH/ + +# Copy base template (with styles) +COPY resources/report/$BASE_TEMPLATE_STYLED_FILE $REPORT_TEMPLATE_PATH/ + +# Copy styles +COPY resources/report/$CSS_FILE $REPORT_TEMPLATE_PATH/ + +# Copy icon +COPY resources/report/$LOGO_FILE $REPORT_TEMPLATE_PATH/ + # Start the test module ENTRYPOINT [ "/testrun/bin/start" ] \ No newline at end of file diff --git a/modules/test/base/python/src/test_module.py b/modules/test/base/python/src/test_module.py index 8030d7757..7e376fa64 100644 --- a/modules/test/base/python/src/test_module.py +++ b/modules/test/base/python/src/test_module.py @@ -12,12 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. """Base class for all core test module functions""" + +import base64 import json import logger import os import util from datetime import datetime import traceback +from jinja2 import Environment, FileSystemLoader, BaseLoader from common.statuses import TestResult @@ -44,6 +47,12 @@ def __init__(self, self._device_test_pack = json.loads(os.environ.get('DEVICE_TEST_PACK', '')) self._report_template_folder = os.environ.get('REPORT_TEMPLATE_PATH') self._base_template_file=os.environ.get('BASE_TEMPLATE_FILE') + self._base_template_file_preview=os.environ.get( + 'BASE_TEMPLATE_PREVIEW_FILE' + ) + self._base_template_styled_file=os.environ.get('BASE_TEMPLATE_STYLED_FILE') + self._css_file=os.environ.get('CSS_FILE') + self._logo_file=os.environ.get('LOGO_FILE') self._log_level = os.environ.get('LOG_LEVEL', None) self._add_logger(log_name=log_name) self._config = self._read_config( @@ -229,3 +238,38 @@ def _get_device_ipv4(self): if text: return text.split('\n')[0] return None + + def _render_styled_report(self, jinja_report, result_path): + # Report styles + with open(os.path.join(self._report_template_folder, + self._css_file), + 'r', + encoding='UTF-8' + ) as style_file: + styles = style_file.read() + + # Load Testrun logo to base64 + with open(os.path.join(self._report_template_folder, + self._logo_file), 'rb') as f: + logo = base64.b64encode(f.read()).decode('utf-8') + + loader=FileSystemLoader(self._report_template_folder) + template = Environment( + loader=loader, + trim_blocks=True, + lstrip_blocks=True + ).get_template(self._base_template_styled_file) + + module_template = Environment(loader=BaseLoader() + ).from_string(jinja_report).render( + title = 'Testrun report', + logo=logo, + ) + + report_jinja_styled = template.render( + template=module_template, + styles=styles + ) + # Write the styled content to a file + with open(result_path, 'w', encoding='utf-8') as file: + file.write(report_jinja_styled) diff --git a/modules/test/tls/python/src/tls_module.py b/modules/test/tls/python/src/tls_module.py index cc71bac12..ab578f5b8 100644 --- a/modules/test/tls/python/src/tls_module.py +++ b/modules/test/tls/python/src/tls_module.py @@ -31,6 +31,7 @@ LOG_NAME = 'test_tls' MODULE_REPORT_FILE_NAME = 'tls_report.j2.html' +MODULE_REPORT_STYLED_FILE_NAME = 'tls_report_styled.jinja2' STARTUP_CAPTURE_FILE = '/runtime/device/startup.pcap' MONITOR_CAPTURE_FILE = '/runtime/device/monitor.pcap' TLS_CAPTURE_FILE = '/runtime/output/tls.pcap' @@ -93,12 +94,14 @@ def generate_module_report(self): self.tls_capture_file ] certificates = self.extract_certificates_from_pcap(pcap_files, - self._device_mac) + self._device_mac) + + if len(certificates) > 0: # pylint: disable=W0612 for cert_num, ((ip_address, port), - cert) in enumerate(certificates.items()): + cert) in enumerate(certificates.items()): pages[cert_num] = {} # Extract certificate data @@ -168,28 +171,45 @@ def generate_module_report(self): ] report_jinja = '' + report_jinja_preview = '' if pages: for num,page in pages.items(): module_header_repr = module_header if num == 0 else None cert_ext=page['cert_ext'] if 'cert_ext' in page else None page_html = template.render( - base_template=self._base_template_file, - module_header=module_header_repr, - summary_headers=summary_headers, - summary_data=page['summary_data'], - cert_info_data=page['cert_info_data'], - subject_data=page['subject_data'], - cert_table_headers=cert_table_headers, - cert_ext=cert_ext, - ountbound_headers=outbound_headers, - ) + base_template=self._base_template_file, + module_header=module_header_repr, + summary_headers=summary_headers, + summary_data=page['summary_data'], + cert_info_data=page['cert_info_data'], + subject_data=page['subject_data'], + cert_table_headers=cert_table_headers, + cert_ext=cert_ext, + ountbound_headers=outbound_headers, + ) report_jinja += page_html + page_html = template.render( + base_template=self._base_template_file_preview, + module_header=module_header_repr, + summary_headers=summary_headers, + summary_data=page['summary_data'], + cert_info_data=page['cert_info_data'], + subject_data=page['subject_data'], + cert_table_headers=cert_table_headers, + cert_ext=cert_ext, + ountbound_headers=outbound_headers, + ) + report_jinja_preview += page_html else: report_jinja = template.render( - base_template=self._base_template_file, - module_header = module_header, - ) + base_template=self._base_template_file, + module_header = module_header, + ) + report_jinja_preview = template.render( + base_template=self._base_template_file_preview, + module_header = module_header, + ) outbound_conns = self._tls_util.get_all_outbound_connections( device_mac=self._device_mac, capture_files=pcap_files) @@ -209,10 +229,22 @@ def generate_module_report(self): ountbound_headers=outbound_headers, outbound_conns=outbound_conns_chunk ) + out_page_preview = template.render( + base_template=self._base_template_file_preview, + ountbound_headers=outbound_headers, + outbound_conns=outbound_conns_chunk + ) + report_jinja += out_page + report_jinja_preview += out_page_preview LOGGER.debug('Module report:\n' + report_jinja) + # Generate styled report for a preview + jinja_path_styled = os.path.join( + self._results_dir, MODULE_REPORT_STYLED_FILE_NAME) + self._render_styled_report(report_jinja_preview, jinja_path_styled) + # Use os.path.join to create the complete file path jinja_path = os.path.join(self._results_dir, MODULE_REPORT_FILE_NAME) @@ -221,6 +253,7 @@ def generate_module_report(self): file.write(report_jinja) LOGGER.info('Module report generated at: ' + str(jinja_path)) + return jinja_path def format_extension_value(self, value): diff --git a/resources/report/module_report_base_preview.jinja2 b/resources/report/module_report_base_preview.jinja2 new file mode 100644 index 000000000..ffec8fc88 --- /dev/null +++ b/resources/report/module_report_base_preview.jinja2 @@ -0,0 +1,41 @@ +{% raw %} +
+
+ Testrun +
+{% endraw %} +
+ {% if module_header %} +

{{ module_header }}

+ {% if summary_headers %} + + {% endif %} + {% elif summary_headers %} +
+ {% endif %} + {% if summary_headers %} + + + {% for header in summary_headers %} + + {% endfor %} + + + + + {% for cell in summary_data %} + + {% endfor %} + + +
{{ header }}
{{ cell }}
+ {% endif %} + {% block content %}{% endblock content %} +
+{% raw %} + +
+
+{% endraw %} \ No newline at end of file diff --git a/resources/report/module_report_styled.jinja2 b/resources/report/module_report_styled.jinja2 new file mode 100644 index 000000000..fb39692ac --- /dev/null +++ b/resources/report/module_report_styled.jinja2 @@ -0,0 +1,12 @@ + + + + + + Testrun Report + + + + {{ template }} + + \ No newline at end of file diff --git a/resources/report/test_report_styles.css b/resources/report/test_report_styles.css index e8f1e4ef1..d6ebf2552 100644 --- a/resources/report/test_report_styles.css +++ b/resources/report/test_report_styles.css @@ -555,6 +555,8 @@ background-repeat: no-repeat !important; background-size: 14px; background-position: center; + padding: 0; + margin: 0; } .result-test-required-result { @@ -564,11 +566,10 @@ } .result-test-required-result-text { + display: inline-block; + vertical-align: middle; line-height: 14px; - flex-grow: 0; - flex-shrink: 0; - flex-basis: max-content; - padding-left: 8px; + padding-left: 6pt; } .result-test-required-result-informational, .result-test-required-result-recommended {