# HG changeset patch # User Edouard Tisserant <edouard.tisserant@gmail.com> # Date 1665486408 -7200 # Node ID 176e1f218c61b568303cc9a2056b2abeb468d5e7 # Parent 921f620577e8e586232ca5a9f142e1aab3c75838 Tests: add opc-ua encrypted test diff -r 921f620577e8 -r 176e1f218c61 tests/cli_tests/opcua_test_encrypted.bash --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/cli_tests/opcua_test_encrypted.bash Tue Oct 11 13:06:48 2022 +0200 @@ -0,0 +1,96 @@ +#!/bin/bash + +rm -f ./SRVOK ./PLCOK + + +yes "" | openssl req -x509 -newkey rsa:2048 -keyout my_private_key.pem -out my_cert.pem \ + -days 355 -nodes -addext "subjectAltName = URI:urn:example.org:FreeOpcUa:python-opcua" +openssl x509 -outform der -in my_cert.pem -out my_cert.der + +# Run server +$BEREMIZPYTHONPATH - > >( + echo "Start SRV loop" + while read line; do + # Wait for server to print modified value + echo "SRV>> $line" + if [[ "$line" == 3.4 ]]; then + echo "PLC could write value" + touch ./SRVOK + fi + done + echo "End SRV loop" +) << EOF & + +import sys +import time + +from opcua import ua, Server + +server = Server() +server.set_endpoint("opc.tcp://127.0.0.1:4840/freeopcua/server/") + +server.set_security_policy([ua.SecurityPolicyType.Basic256Sha256_SignAndEncrypt]) +server.load_certificate("my_cert.der") +server.load_private_key("my_private_key.pem") + +uri = "http://beremiz.github.io" +idx = server.register_namespace(uri) + +objects = server.get_objects_node() + +testobj = objects.add_object(idx, "TestObject") +testvarout = testobj.add_variable(idx, "TestOut", 1.2) +testvar = testobj.add_variable(idx, "TestIn", 5.6) +testvar.set_writable() + +server.start() + +try: + while True: + time.sleep(1) + print testvar.get_value() + sys.stdout.flush() +finally: + server.stop() +EOF +SERVER_PID=$! + +cp my_cert.der my_private_key.pem \ + $BEREMIZPATH/tests/projects/opcua_client_encrypted/project_files + +# Start PLC with opcua test +setsid $BEREMIZPYTHONPATH $BEREMIZPATH/Beremiz_cli.py -k \ + --project-home $BEREMIZPATH/tests/projects/opcua_client_encrypted build transfer run > >( +echo "Start PLC loop" +while read line; do + # Wait for PLC runtime to output expected value on stdout + echo "PLC>> $line" + if [[ "$line" == 1.2 ]]; then + echo "PLC could read value" + touch ./PLCOK + fi +done +echo "End PLC loop" +) & +PLC_PID=$! + +echo all subprocess started, start polling results +res=110 # default to ETIMEDOUT +c=45 +while ((c--)); do + if [[ -a ./SRVOK && -a ./PLCOK ]]; then + echo got results. + res=0 # OK success + break + else + echo waiting.... $c + sleep 1 + fi +done + +# Kill PLC and subprocess +echo will kill PLC:$PLC_PID and SERVER:$SERVER_PID +pkill -s $PLC_PID +kill $SERVER_PID + +exit $res diff -r 921f620577e8 -r 176e1f218c61 tests/projects/opcua_client_encrypted/beremiz.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/projects/opcua_client_encrypted/beremiz.xml Tue Oct 11 13:06:48 2022 +0200 @@ -0,0 +1,4 @@ +<?xml version='1.0' encoding='utf-8'?> +<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://"> + <TargetType/> +</BeremizRoot> diff -r 921f620577e8 -r 176e1f218c61 tests/projects/opcua_client_encrypted/opcua_0@opcua/baseconfnode.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/projects/opcua_client_encrypted/opcua_0@opcua/baseconfnode.xml Tue Oct 11 13:06:48 2022 +0200 @@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="opcua_0"/> diff -r 921f620577e8 -r 176e1f218c61 tests/projects/opcua_client_encrypted/opcua_0@opcua/confnode.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/projects/opcua_client_encrypted/opcua_0@opcua/confnode.xml Tue Oct 11 13:06:48 2022 +0200 @@ -0,0 +1,9 @@ +<?xml version='1.0' encoding='utf-8'?> +<OPCUAClient xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <AuthType> + <x509 Certificate="my_cert.der" PrivateKey="my_private_key.pem"> + <Policy/> + <Mode/> + </x509> + </AuthType> +</OPCUAClient> diff -r 921f620577e8 -r 176e1f218c61 tests/projects/opcua_client_encrypted/opcua_0@opcua/selected.csv --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/projects/opcua_client_encrypted/opcua_0@opcua/selected.csv Tue Oct 11 13:06:48 2022 +0200 @@ -0,0 +1,2 @@ +input,TestOut,2,int,2,Double,0 +output,TestIn,2,int,3,Double,0 diff -r 921f620577e8 -r 176e1f218c61 tests/projects/opcua_client_encrypted/plc.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/projects/opcua_client_encrypted/plc.xml Tue Oct 11 13:06:48 2022 +0200 @@ -0,0 +1,208 @@ +<?xml version='1.0' encoding='utf-8'?> +<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201"> + <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2022-07-16T10:46:25"/> + <contentHeader name="Unnamed" modificationDateTime="2022-09-15T20:56:16"> + <coordinateInfo> + <fbd> + <scaling x="5" y="5"/> + </fbd> + <ld> + <scaling x="0" y="0"/> + </ld> + <sfc> + <scaling x="0" y="0"/> + </sfc> + </coordinateInfo> + </contentHeader> + <types> + <dataTypes/> + <pous> + <pou name="program0" pouType="program"> + <interface> + <localVars> + <variable name="LocalVar0" address="%IL0.0"> + <type> + <LREAL/> + </type> + </variable> + <variable name="LocalVar1" address="%QL0.0"> + <type> + <LREAL/> + </type> + </variable> + </localVars> + <localVars> + <variable name="python_poll0"> + <type> + <derived name="python_poll"/> + </type> + </variable> + </localVars> + </interface> + <body> + <FBD> + <inVariable localId="1" executionOrderId="0" height="25" width="85" negated="false"> + <position x="160" y="190"/> + <connectionPointOut> + <relPosition x="85" y="10"/> + </connectionPointOut> + <expression>LocalVar0</expression> + </inVariable> + <outVariable localId="2" executionOrderId="0" height="24" width="82" negated="false"> + <position x="238" y="49"/> + <connectionPointIn> + <relPosition x="0" y="11"/> + <connection refLocalId="9"> + <position x="238" y="60"/> + <position x="204" y="60"/> + </connection> + </connectionPointIn> + <expression>LocalVar1</expression> + </outVariable> + <block localId="4" typeName="python_poll" instanceName="python_poll0" executionOrderId="0" height="60" width="98"> + <position x="658" y="101"/> + <inputVariables> + <variable formalParameter="TRIG"> + <connectionPointIn> + <relPosition x="0" y="29"/> + <connection refLocalId="7"> + <position x="658" y="130"/> + <position x="623" y="130"/> + </connection> + </connectionPointIn> + </variable> + <variable formalParameter="CODE"> + <connectionPointIn> + <relPosition x="0" y="49"/> + <connection refLocalId="6" formalParameter="OUT"> + <position x="658" y="150"/> + <position x="560" y="150"/> + </connection> + </connectionPointIn> + </variable> + </inputVariables> + <inOutVariables/> + <outputVariables> + <variable formalParameter="ACK"> + <connectionPointOut> + <relPosition x="98" y="29"/> + </connectionPointOut> + </variable> + <variable formalParameter="RESULT"> + <connectionPointOut> + <relPosition x="98" y="49"/> + </connectionPointOut> + </variable> + </outputVariables> + </block> + <block localId="5" typeName="LREAL_TO_STRING" executionOrderId="0" height="40" width="130"> + <position x="280" y="170"/> + <inputVariables> + <variable formalParameter="IN"> + <connectionPointIn> + <relPosition x="0" y="30"/> + <connection refLocalId="1"> + <position x="280" y="200"/> + <position x="255" y="200"/> + <position x="255" y="200"/> + <position x="300" y="200"/> + <position x="300" y="200"/> + <position x="245" y="200"/> + </connection> + </connectionPointIn> + </variable> + </inputVariables> + <inOutVariables/> + <outputVariables> + <variable formalParameter="OUT"> + <connectionPointOut> + <relPosition x="130" y="30"/> + </connectionPointOut> + </variable> + </outputVariables> + </block> + <block localId="6" typeName="CONCAT" executionOrderId="0" height="165" width="63"> + <position x="497" y="108"/> + <inputVariables> + <variable formalParameter="IN1"> + <connectionPointIn> + <relPosition x="0" y="42"/> + <connection refLocalId="3"> + <position x="497" y="150"/> + <position x="330" y="150"/> + </connection> + </connectionPointIn> + </variable> + <variable formalParameter="IN2"> + <connectionPointIn> + <relPosition x="0" y="92"/> + <connection refLocalId="5" formalParameter="OUT"> + <position x="497" y="200"/> + <position x="410" y="200"/> + </connection> + </connectionPointIn> + </variable> + <variable formalParameter="IN3"> + <connectionPointIn> + <relPosition x="0" y="142"/> + <connection refLocalId="8"> + <position x="497" y="250"/> + <position x="225" y="250"/> + </connection> + </connectionPointIn> + </variable> + </inputVariables> + <inOutVariables/> + <outputVariables> + <variable formalParameter="OUT"> + <connectionPointOut> + <relPosition x="63" y="42"/> + </connectionPointOut> + </variable> + </outputVariables> + </block> + <inVariable localId="7" executionOrderId="0" height="24" width="44" negated="false"> + <position x="579" y="116"/> + <connectionPointOut> + <relPosition x="44" y="14"/> + </connectionPointOut> + <expression>TRUE</expression> + </inVariable> + <inVariable localId="3" executionOrderId="0" height="25" width="180" negated="false"> + <position x="160" y="140"/> + <connectionPointOut> + <relPosition x="180" y="10"/> + </connectionPointOut> + <expression>'pfunc("'</expression> + </inVariable> + <inVariable localId="8" executionOrderId="0" height="25" width="230" negated="false"> + <position x="165" y="240"/> + <connectionPointOut> + <relPosition x="230" y="10"/> + </connectionPointOut> + <expression>'\n")'</expression> + </inVariable> + <inVariable localId="9" executionOrderId="0" height="29" width="45" negated="false"> + <position x="159" y="47"/> + <connectionPointOut> + <relPosition x="45" y="13"/> + </connectionPointOut> + <expression>3.4</expression> + </inVariable> + </FBD> + </body> + </pou> + </pous> + </types> + <instances> + <configurations> + <configuration name="config"> + <resource name="resource1"> + <task name="task0" priority="0" interval="T#100ms"> + <pouInstance name="instance0" typeName="program0"/> + </task> + </resource> + </configuration> + </configurations> + </instances> +</project> diff -r 921f620577e8 -r 176e1f218c61 tests/projects/opcua_client_encrypted/py_ext_0@py_ext/baseconfnode.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/projects/opcua_client_encrypted/py_ext_0@py_ext/baseconfnode.xml Tue Oct 11 13:06:48 2022 +0200 @@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="1" Name="py_ext_0"/> diff -r 921f620577e8 -r 176e1f218c61 tests/projects/opcua_client_encrypted/py_ext_0@py_ext/pyfile.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/projects/opcua_client_encrypted/py_ext_0@py_ext/pyfile.xml Tue Oct 11 13:06:48 2022 +0200 @@ -0,0 +1,36 @@ +<?xml version='1.0' encoding='utf-8'?> +<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <variables/> + <globals> + <xhtml:p><![CDATA[ +import sys +def pfunc(arg): + sys.stdout.write(arg) + sys.stdout.flush() + +pfunc("globals section\n") + +]]></xhtml:p> + </globals> + <init> + <xhtml:p><![CDATA[ +pfunc("init section\n") +]]></xhtml:p> + </init> + <cleanup> + <xhtml:p><![CDATA[ +pfunc("cleanup section\n") +]]></xhtml:p> + </cleanup> + <start> + <xhtml:p><![CDATA[ +pfunc("start section\n") +]]></xhtml:p> + </start> + <stop> + <xhtml:p><![CDATA[ +pfunc("stop section\n") + +]]></xhtml:p> + </stop> +</PyFile>