Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
a436f91
Adding new tests in python for the new options added to the executable
angelrti Jul 31, 2025
5fb6d4e
The basic check is that the sample has not 0 size
angelrti Jan 13, 2026
e295d1a
Replaced test test_ownership_receivers that relies on samples_sent by…
angelrti Jan 13, 2026
2f9979b
Removed debug message
angelrti Jan 13, 2026
c09e840
Added basic check for all tests
angelrti Jan 19, 2026
89268a4
Replaced function of test_reliability_4
angelrti Jan 22, 2026
b9de9c9
Fixed lifespan tests in a corner case when the first sample is the on…
angelrti Jan 23, 2026
0afac3c
Fixed a potential infinite loop in the FinalInstanceState tests
angelrti Jan 23, 2026
fe02fc0
Fixed disposing test
angelrti Jan 23, 2026
c40e361
Adding EOF to all expect functions
angelrti Jan 27, 2026
e002b25
Fixed large data and coherent sets test that were returning false-pos…
angelrti Jan 28, 2026
e934129
Added a way of stopping coherent_sets and ordered_access tests
angelrti Jan 30, 2026
e618576
Added more lifespan tests and improved test check functions
angelrti Feb 6, 2026
f8b6820
Removed debug message
angelrti Feb 6, 2026
a01b557
Fixed some issues
angelrti Feb 6, 2026
9634fbd
Fixing coherent sets check function
angelrti Feb 7, 2026
1b9213e
Added a way of removing bytes from publisher PTY that may block itself
angelrti Feb 7, 2026
61abd18
Merge branch 'master' into add_new_test_python_0725
angelrti Feb 16, 2026
c59da27
Fixing interoperability_report after merging master
angelrti Feb 16, 2026
b87ec79
Increasing timeout to 120mins
angelrti Feb 16, 2026
544f2d8
Move the CFT test that uses color to -c param as it is different in e…
angelrti Feb 16, 2026
f1d8061
Adding a vendor coverage of tests now that we have a way of detecting…
angelrti Feb 16, 2026
aa7dfee
Documentation updates
angelrti Feb 17, 2026
9c2c9e8
Added tests for compatibility between ordered and coherent access. Al…
angelrti Feb 18, 2026
6808dcc
Fixed ordered access test and coherent set tests. Also modified the t…
angelrti Feb 24, 2026
8915a8d
Merge branch 'master' into add_new_test_python_0725
angelrti Feb 24, 2026
4694d81
Updated the generated xlsx to show the summary in two columns
angelrti Feb 26, 2026
81881e4
Use current repo executables for testing and and added an error if a …
angelrti Feb 27, 2026
9e93e8f
Added continue-on-error in case a executable is not found
angelrti Feb 27, 2026
4c38488
Modified legend of the xlsx report
angelrti Mar 5, 2026
1eebefe
Fixing warnings with python strings
angelrti Mar 9, 2026
6f33373
Added basic check to test_size_less_than_20
angelrti Mar 23, 2026
972fa15
Changed how to calculate the color of the single-product test, now it…
angelrti Mar 23, 2026
de7a9b9
Fixing color total tests and vendor coverage
angelrti Mar 23, 2026
fe821a6
Update generate_xlsx_report.py
ClarkTucker Apr 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions .github/workflows/1_run_interoperability_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ jobs:
- name: Download shape_main executables
uses: robinraju/release-downloader@v1.10
with:
repository: omg-dds/dds-rtps
latest: true
fileName: "*"
out-file-path: zipped_executables
Expand All @@ -50,12 +49,23 @@ jobs:
- name: Install Python requirements
run: pip install --requirement requirements.txt
- name: Run Interoperability script
timeout-minutes: 60
timeout-minutes: 120
continue-on-error: true
run: |
publisher_exe=executables/${{ matrix.publisher }}*shape_main_linux
subscriber_exe=executables/${{ matrix.subscriber }}*shape_main_linux
output_file=junit_report-${{ matrix.publisher }}-${{ matrix.subscriber }}.xml
extra_args=""
# Check if publisher executable exists
if ! ls $publisher_exe 1> /dev/null 2>&1; then
echo "ERROR: Publisher executable not found: $publisher_exe"
exit 1
fi
# Check if subscriber executable exists
if ! ls $subscriber_exe 1> /dev/null 2>&1; then
echo "ERROR: Subscriber executable not found: $subscriber_exe"
exit 1
fi
if [[ "${subscriber_exe,,}" == *opendds* && "${publisher_exe,,}" == *connext_dds* ]]; then
extra_args="--periodic-announcement 5000"
fi
Expand Down
110 changes: 75 additions & 35 deletions generate_xlsx_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ def get_company_name(product:str) -> str:
return 'eProsima'
elif 'dust' in product.lower():
return 'S2E Software Systems'
elif 'hdds' in product.lower():
return 'Naskel'
else:
raise RuntimeError('Impossible to get company name: ' + product)

Expand All @@ -100,6 +102,8 @@ def get_product_name(product:str) -> str:
return 'FastDDS ' + re.search(r'([\d.]+)', product).group(1)
elif 'dust_dds' in product.lower():
return 'Dust DDS ' + re.search(r'([\d.]+)', product).group(1)
elif 'hdds' in product.lower():
return 'HDDS ' + re.search(r'([\d.]+)', product).group(1)
else:
raise RuntimeError('Impossible to get product name: ' + product)

Expand Down Expand Up @@ -404,7 +408,7 @@ def create_summary_worksheet(self, name: str = 'Summary'):
# rows.
# The tables leave the first column (value 0) as gap
self.add_data_summary_worksheet(
starting_row=9,
starting_row=13,
starting_column=1,
worksheet=summary_worksheet)
# After having all data that may have an unknown length, we call
Expand Down Expand Up @@ -752,13 +756,10 @@ def add_data_summary_worksheet(self,
'Product', self.__formats['bold_w_border'])
worksheet.write(
current_row, current_column + 2,
'Tests Passed', self.__formats['bold_w_border'])
'Single-Product Tests', self.__formats['bold_w_border'])
worksheet.write(
current_row, current_column + 3,
'Supported Tests', self.__formats['bold_w_border'])
worksheet.write(
current_row, current_column + 4,
'Supported Tests Passed', self.__formats['bold_w_border'])
'Cross Product Tests', self.__formats['bold_w_border'])

current_row += 1

Expand All @@ -774,35 +775,42 @@ def add_data_summary_worksheet(self,
current_row, current_column + 1,
product_name,
self.__formats['bold_w_border'])
# test passed
worksheet.write(
current_row, current_column + 2,
str(value.get_passed_tests()) + ' / ' +
str(value.get_total_tests()),
self.get_format_color(value.get_passed_tests(),
value.get_total_tests()))
# supported tests

# vendor coverage

# for the vendor coverage, we need to find the right data in the
# product_summary_dict, which is the one with the same product as
# publisher and subscriber
for product_key, product_value in self.__data.product_summary_dict.items():
if product_name == product_key[0] and product_name == product_key[1]:
product_coverage_supported_tests = product_value.get_supported_tests()
product_coverage_total_tests = product_value.get_total_tests()
product_coverage_passed_tests = product_value.get_passed_tests()

# vendor coverage
worksheet.write(
current_row, current_column + 2,
str(product_coverage_passed_tests) + ' / ' +
str(product_coverage_supported_tests) + ' / ' +
str(product_coverage_total_tests),
self.get_format_color(
product_coverage_passed_tests,
product_coverage_total_tests))

# total tests
worksheet.write(
current_row, current_column + 3,
str(value.get_supported_tests()) + ' / ' +
str(value.get_total_tests()),
self.__formats['result_yellow'] if value.get_unsupported_tests() > 0
else self.__formats['result_green'])
# supported tests passed
worksheet.write(
current_row, current_column + 4,
str(value.get_passed_tests()) + ' / ' +
str(value.get_supported_tests()),
self.get_format_color(value.get_passed_tests(),
value.get_supported_tests()))
str(value.get_supported_tests()) + ' / ' +
str(value.get_total_tests()),
self.get_format_color(
value.get_passed_tests(), value.get_supported_tests()))

current_row += 1


# Add 2 rows of gap for the next table
current_row += 2
worksheet.write(
current_row, current_column,
'Test Result: passed / supported / total', self.__formats['bold_w_border'])
current_row += 1
worksheet.write(
current_row, current_column,
'Publisher (row)/Subscriber (column)', self.__formats['bold_w_border'])
Expand All @@ -819,7 +827,7 @@ def add_data_summary_worksheet(self,

# Add the table passed_tests/total_tests with all combinations of product
# as publishers and as subscribers
for (publisher_name, subscriber_name), value in self.__data.product_summary_dict.items():
for (publisher_name, subscriber_name), product_value in self.__data.product_summary_dict.items():
# if the publisher hasn't been already processed yet, determine
# what is the process_row by selecting the next free row
# (current_row+1)
Expand Down Expand Up @@ -849,10 +857,10 @@ def add_data_summary_worksheet(self,
process_column = column_dict[subscriber_name]

worksheet.write(process_row, process_column,
str(value.get_passed_tests()) + ' / ' +
str(value.get_supported_tests()) + ' / ' +
str(value.get_total_tests()),
self.get_format_color(value.get_passed_tests(), value.get_supported_tests()))
str(product_value.get_passed_tests()) + ' / ' +
str(product_value.get_supported_tests()) + ' / ' +
str(product_value.get_total_tests()),
self.get_format_color(product_value.get_passed_tests(), product_value.get_supported_tests()))

def add_static_data_summary_worksheet(self,
worksheet: xlsxwriter.Workbook.worksheet_class,
Expand Down Expand Up @@ -885,10 +893,9 @@ def add_static_data_summary_worksheet(self,
worksheet.insert_image(
row=current_row, col=starting_column,
filename=dds_logo_path,
options={'x_scale': 0.4, 'y_scale': 0.4, 'decorative': True, 'object_position': 2})
options={'x_scale': 0.6, 'y_scale': 0.6, 'decorative': True, 'object_position': 2})

# Add date
current_row += 1
worksheet.write(current_row, starting_column + 1, 'Date')
date_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
worksheet.write(current_row, starting_column + 2, date_time)
Expand All @@ -903,6 +910,39 @@ def add_static_data_summary_worksheet(self,
worksheet.write(current_row, starting_column + 1,'Documentation')
worksheet.write(current_row, starting_column + 2, self.REPO_DOC)

# Add number of tests

# Find the total number of unique tests by looking for a
# (publisher, subscriber) pair where both are the same
test_count = 0
for key, value in self.__data.product_summary_dict.items():
if key[0] == key[1]:
test_count = value.get_total_tests()
break
current_row += 1
worksheet.write(current_row, starting_column + 1,'Unique tests count')
worksheet.write(current_row, starting_column + 2, test_count)

# add legend
current_row += 2
worksheet.write(current_row, starting_column + 1,
'Single-Product Tests',
self.__formats['bold'])
worksheet.write(current_row, starting_column + 2,
'Results where each product is tested only with itself')
current_row += 1
worksheet.write(current_row, starting_column + 1,
'Cross-Product Tests',
self.__formats['bold'])
worksheet.write(current_row, starting_column + 2,
'Results where each product is tested against all others (including itself)')
current_row += 1
worksheet.write(current_row, starting_column + 1,
'Format X / Y / Z',
self.__formats['bold'])
worksheet.write(current_row, starting_column + 2,
'Represents test passed / supported / total')

def add_static_data_description_worksheet(self,
worksheet: xlsxwriter.Workbook.worksheet_class,
name: str = 'Test Descriptions',
Expand Down
19 changes: 15 additions & 4 deletions interoperability_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,8 @@ def run_publisher_shape_main(
r'\[[0-9]+\]', # index = 0
'on_offered_deadline_missed()', # index = 1
re.compile('not supported', re.IGNORECASE), # index = 2
pexpect.TIMEOUT # index = 3
pexpect.TIMEOUT, # index = 3
pexpect.EOF # index = 4
],
timeout)
if index == 1:
Expand All @@ -389,7 +390,7 @@ def run_publisher_shape_main(
elif index == 2:
produced_code[produced_code_index] = ReturnCode.PUB_UNSUPPORTED_FEATURE
break
elif index == 3:
elif index == 3 or index == 4:
produced_code[produced_code_index] = ReturnCode.DATA_NOT_SENT
break
last_sample_saved.put(last_sample)
Expand All @@ -398,8 +399,18 @@ def run_publisher_shape_main(

log_message(f'Publisher {publisher_index}: Waiting for Subscribers to finish',
verbosity)
for element in subscribers_finished:
element.wait() # wait for all subscribers to finish
# Check if all subscribers finished
while True:
if all(e.is_set() for e in subscribers_finished):
break

# Drain publisher output
try:
child_pub.read_nonblocking(1024, timeout=0.1)
except pexpect.TIMEOUT:
pass
except pexpect.EOF:
break
publisher_finished.set() # set publisher as finished
# Stop process
if not stop_process(child_pub):
Expand Down
2 changes: 1 addition & 1 deletion rtps_test_utilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ def no_check(child_sub, samples_sent, last_sample_saved, timeout):

def basic_check(child_sub, samples_sent, last_sample_saved, timeout):
""" Only checks that the data is well formed and size is not zero."""
sub_string = re.search('\w\s+\w+\s+[0-9]+ [0-9]+ \[([0-9]+)\]',
sub_string = re.search(r'\w\s+\w+\s+[0-9]+ [0-9]+ \[([0-9]+)\]',
child_sub.before + child_sub.after)

if sub_string is None:
Expand Down
Loading
Loading