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 %}
+
+
+{% endraw %}
+
+ {% if module_header %}
+
{{ module_header }}
+ {% if summary_headers %}
+
+ {% endif %}
+ {% elif summary_headers %}
+
+ {% endif %}
+ {% if summary_headers %}
+
+
+ {% for header in summary_headers %}
+ | {{ header }} |
+ {% endfor %}
+
+
+
+
+ {% for cell in summary_data %}
+ | {{ cell }} |
+ {% endfor %}
+
+
+
+ {% 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 {