mirror of
https://github.com/open62541/open62541.git
synced 2025-06-03 04:00:21 +00:00

* CI: Added support for arguments in the examples workflow * Fixed memory leaks in examples. Add ApplicationUri * Arguments and server/client for all examples. Small fixes * outsource/blacklist some examples. Fix memory leak in example. * Remove Shlex. Remove false UA_Client_delete * Removed raw examples from ci. Fix leak in client.c and mqtt_publish * Fix memory leak in mqtt subscriber
181 lines
8.2 KiB
Python
181 lines
8.2 KiB
Python
import os
|
|
import subprocess
|
|
import time
|
|
from collections import defaultdict
|
|
|
|
example_args = {
|
|
"client_encryption":"opc.tcp://localhost:4840 client_cert.der client_key.der server_cert.der",
|
|
"access_control_client_encrypt":"opc.tcp://localhost:4840 client_cert.der client_key.der server_cert.der",
|
|
"client_event_filter":"opc.tcp://localhost:4840",
|
|
"client_connect":"-username user1 -password password -cert client_cert.der -key client_key.der opc.tcp://localhost:4840",
|
|
"pubsub_nodeset_rt_publisher":"-i lo",
|
|
"pubsub_nodeset_rt_subscriber":"-i lo",
|
|
"pubsub_TSN_loopback":"-i lo",
|
|
"pubsub_TSN_loopback_single_thread":"-i lo",
|
|
"pubsub_TSN_publisher":"-i lo",
|
|
"pubsub_TSN_publisher_multiple_thread":"-i lo",
|
|
"server_encryption":"server_cert.der server_key.der client_cert.der",
|
|
"server_loglevel":"--loglevel=1",
|
|
"ci_server":"4840 server_cert.der server_key.der client_cert.der"
|
|
}
|
|
|
|
server_needed_examples = {
|
|
"access_control_client":"ci_server 4840 server_cert.der server_key.der client_cert.der",
|
|
"access_control_client_encrypt":"ci_server 4840 server_cert.der server_key.der client_cert.der",
|
|
"client":"ci_server 4840 server_cert.der server_key.der client_cert.der",
|
|
"client_async":"ci_server 4840 server_cert.der server_key.der client_cert.der",
|
|
"client_connect":"ci_server 4840 server_cert.der server_key.der client_cert.der",
|
|
"client_connect_loop":"ci_server 4840 server_cert.der server_key.der client_cert.der",
|
|
"client_encryption":"server_encryption server_cert.der server_key.der client_cert.der",
|
|
"client_event_filter":"ci_server 4840 server_cert.der server_key.der client_cert.der",
|
|
"client_historical":"tutorial_server_historicaldata",
|
|
"client_method_async":"ci_server 4840 server_cert.der server_key.der client_cert.der",
|
|
"client_subscription_loop":"ci_server 4840 server_cert.der server_key.der client_cert.der",
|
|
"custom_datatype_client":"custom_datatype_server",
|
|
"discovery_client_find_servers":"discovery_server_lds",
|
|
"discovery_server_register":"discovery_server_lds",
|
|
"pubsub_publish_encrypted":"pubsub_subscribe_encrypted",
|
|
"pubsub_publish_encrypted_sks":"server_pubsub_central_sks server_cert.der server_key.der --enableUnencrypted --enableAnonymous",
|
|
"pubsub_subscribe_encrypted":"pubsub_publish_encrypted",
|
|
"pubsub_subscribe_encrypted_sks":"server_pubsub_central_sks server_cert.der server_key.der --enableUnencrypted --enableAnonymous",
|
|
"pubsub_subscribe_standalone_dataset":"tutorial_pubsub_publish",
|
|
"server_pubsub_publish_rt_level":"server_pubsub_subscribe_rt_level",
|
|
"server_pubsub_rt_information_model":"server_pubsub_subscribe_rt_level",
|
|
"server_pubsub_subscribe_custom_monitoring":"server_pubsub_publish_on_demand",
|
|
"server_pubsub_subscribe_rt_level":"server_pubsub_publish_rt_level",
|
|
"tutorial_client_events":"tutorial_server_events",
|
|
"tutorial_client_firststeps":"tutorial_server_firststeps",
|
|
"tutorial_pubsub_connection":"tutorial_pubsub_subscribe",
|
|
"tutorial_pubsub_mqtt_subscrib":"tutorial_pubsub_mqtt_publish",
|
|
"tutorial_pubsub_publish":"tutorial_pubsub_subscribe",
|
|
"tutorial_pubsub_subscribe":"tutorial_pubsub_publish",
|
|
"tutorial_server_reverseconnect":"ci_server 4841 client_cert.der client_key.der server_cert.der"
|
|
}
|
|
|
|
client_needed_examples = {
|
|
"ci_server":"client",
|
|
"server_ctt":"client",
|
|
"server_inheritance":"client",
|
|
"server_instantiation":"client",
|
|
"server_loglevel":"client",
|
|
"server_mainloop":"client",
|
|
"server_nodeset":"client",
|
|
"server_nodeset_loader":"client",
|
|
"server_nodeset_plcopen":"client",
|
|
"server_nodeset_powerlink":"client",
|
|
"server_settimestamp":"client",
|
|
"server_testnodeset":"client",
|
|
"tutorial_server_monitoreditems":"client",
|
|
"tutorial_server_variabletype":"client",
|
|
"tutorial_server_object":"client",
|
|
"tutorial_server_variable":"client",
|
|
"access_control_server":"access_control_client",
|
|
"custom_datatype_server":"custom_datatype_client",
|
|
"discovery_server_lds":"discovery_client_find_servers",
|
|
"server_encryption":"client_encryption opc.tcp://localhost:4840 client_cert.der client_key.der server_cert.der",
|
|
"server_events_random":"tutorial_client_events opc.tcp://localhost:4840",
|
|
"server_pubsub_central_sks":"pubsub_publish_encrypted_sks",
|
|
"tutorial_server_alarms_conditions":"tutorial_client_events opc.tcp://localhost:4840",
|
|
"tutorial_server_datasource":"tutorial_client_events opc.tcp://localhost:4840",
|
|
"tutorial_server_firststeps":"tutorial_client_firststeps",
|
|
"tutorial_server_historicaldata":"client_historical",
|
|
"tutorial_server_historicaldata_circular":"client_historical",
|
|
"tutorial_server_method":"client_method_async",
|
|
"tutorial_server_method_async":"client_method_async"
|
|
}
|
|
|
|
blacklist = {
|
|
"pubsub_TSN_loopback":1,
|
|
"pubsub_TSN_loopback_single_thread":1,
|
|
"pubsub_TSN_publisher":1,
|
|
"pubsub_TSN_publisher_multiple_thread":1,
|
|
"pubsub_nodeset_rt_publisher":1,
|
|
"pubsub_nodeset_rt_subscriber":1,
|
|
"access_control_client_encrypt":1,
|
|
"client_encryption":1,
|
|
"client_historical":1,
|
|
"client_subscription_loop":1,
|
|
"client_method_async":1
|
|
}
|
|
|
|
# Run each example with valgrind.
|
|
# Wait 10 seconds and send the SIGINT signal.
|
|
# Wait for the process to terminate and collect the exit status.
|
|
# Abort when the exit status is non-null.
|
|
|
|
os.chdir("../build")
|
|
current_dir = os.getcwd()
|
|
print(f"Current directory: {current_dir}")
|
|
example_dir = os.path.join(current_dir, "bin", "examples")
|
|
examples = os.listdir(example_dir)
|
|
|
|
# skipping examples that are in the blacklist
|
|
for example in examples:
|
|
if example in blacklist:
|
|
print(f"Skipping {example}")
|
|
continue
|
|
|
|
# get the arguments for the example
|
|
args = example_args.get(example)
|
|
cmd = ["valgrind", "--errors-for-leak-kinds=all", "--leak-check=full", "--error-exitcode=1", "./bin/examples/"+example]
|
|
if args:
|
|
args_list = args.split()
|
|
cmd += args_list
|
|
print(f"Args for {example}: {cmd} ")
|
|
|
|
# check if the example needs a server or client to be running
|
|
server_needed = server_needed_examples.get(example)
|
|
client_needed = client_needed_examples.get(example)
|
|
|
|
#start the server if needed
|
|
server_process = None
|
|
if server_needed:
|
|
server_cmd = server_needed.split()
|
|
server_cmd[0] = "./bin/examples/" + server_cmd[0]
|
|
print(f"Starting server {server_cmd} from {os.getcwd()}")
|
|
server_process = subprocess.Popen(server_cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
time.sleep(10)
|
|
|
|
# start the example
|
|
process = subprocess.Popen(cmd)
|
|
time.sleep(10)
|
|
|
|
# start the client if needed
|
|
client_process = None
|
|
if client_needed:
|
|
client_cmd = client_needed.split()
|
|
client_cmd[0] = "./bin/examples/" + client_cmd[0]
|
|
print(f"Starting client {client_cmd}")
|
|
client_process = subprocess.Popen(client_cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
|
|
# wait 20 seconds and send the SIGINT signal
|
|
time.sleep(20)
|
|
print(f"Sending SIGINT to {process.pid}")
|
|
process.send_signal(subprocess.signal.SIGINT)
|
|
|
|
tries = 0
|
|
while process.poll() is None:
|
|
time.sleep(20)
|
|
process.send_signal(subprocess.signal.SIGINT)
|
|
if tries > 5:
|
|
print(f"Process {process.pid} is still running after 5 tries. Terminating process.")
|
|
process.kill()
|
|
tries += 1
|
|
|
|
# save the exit code
|
|
exit_code = process.wait()
|
|
if exit_code != 0:
|
|
print(f"Processing {example} failed with exit code {exit_code}")
|
|
exit(exit_code)
|
|
|
|
# terminate the server and client
|
|
if server_process:
|
|
print(f"Sending SIGKILL to server {server_process.pid}")
|
|
server_process.kill()
|
|
server_process.wait()
|
|
|
|
if client_process:
|
|
print(f"Sending SIGKILL to client {client_process.pid}")
|
|
client_process.kill()
|
|
client_process.wait()
|