Skip to content

Commit 6c27c57

Browse files
committed
Correctly reset the C*Logix UCMM for unit tests that need a custom one
1 parent 2f0d173 commit 6c27c57

File tree

2 files changed

+41
-13
lines changed

2 files changed

+41
-13
lines changed

server/enip/logix.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,15 @@ def setup( **kwds ):
810810
setup.ucmm = None
811811

812812

813+
def setup_reset():
814+
"""Clear the C*Logix UCMM instance. In order to reset the C*Logix subsystem, you'll also have to
815+
find and destroy any of the known C*Logix support instances we create above, using
816+
device:lookup_reset().
817+
818+
"""
819+
setup.ucmm = None
820+
821+
813822
def process( addr, data, **kwds ):
814823
"""Processes an incoming parsed EtherNet/IP encapsulated request in data.request.enip.input, and
815824
produces a response with a prepared encapsulated reply, in data.response.enip.input, ready for

server/enip/udt_test.py

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,11 @@ def test_logix_remote_udt( count=1 ):
132132
"""Performance of a client executing an operations on a CIP UDT.
133133
134134
"""
135-
#logging.getLogger().setLevel( logging.NORMAL )
136-
device.lookup_reset() # Flush out any existing CIP Objects for a fresh start
135+
136+
# Flush out any existing CIP Objects for a fresh start, including UCMM
137+
device.lookup_reset()
138+
logix.setup_reset()
139+
137140
svraddr = ('localhost', 44838)
138141

139142
tagname = example_tagname
@@ -166,13 +169,14 @@ def test_logix_remote_udt( count=1 ):
166169
# Intercept all server requests, and collect requests/replies locally
167170
#
168171
server_txs = []
172+
169173
class UCMM_collector( ucmm.UCMM ):
170174
"""Collect the data (request), and its modified response. Returns the "proceed" flag (or
171175
re-raises Exception)
172176
173177
"""
174178
def request( self, data, addr=None ):
175-
#log.normal( "UCMM request: {addr!r:24} {req:s}".format( addr=addr, req=reprlib.repr( data )))
179+
#log.info( "UCMM collector: {addr!r:24} {req:s}".format( addr=addr, req=reprlib.repr( data )))
176180
req = None
177181
try:
178182
req = copy.deepcopy( data )
@@ -230,7 +234,6 @@ def request( self, data, addr=None ):
230234
kwargs = kwargs, # Allow client thread to shut enip_main server down
231235
)
232236

233-
log.normal( "test_logix_remote_udt w/ server.control in object %s", id( kwargs['server']['control'] ))
234237
try:
235238
for target in [
236239
logix_remote_udt_pylogix
@@ -240,7 +243,10 @@ def request( self, data, addr=None ):
240243
# performance measurement, we need to be running enip.main:main in the "Main" thread...
241244
kwargs['server']['control'].done = False
242245
kwargs['client'] = {}
243-
246+
log.normal( "test_logix_remote_udt w/ controls in object server: %s (txs %s, %d txs), client: %s",
247+
id( kwargs['server'] ),
248+
id( kwargs['server']['server_txs'] ), len( kwargs['server']['server_txs'] ),
249+
id( kwargs['client'] ))
244250
targetthread= threading.Thread(
245251
target = target,
246252
kwargs = targetthread_kwargs,
@@ -249,7 +255,7 @@ def request( self, data, addr=None ):
249255
targetthread.start()
250256
log.normal( "Startup of C*Logix client {client_name} complete".format( client_name=target.__name__ ))
251257

252-
# Run the server; each client will signal it to shut down when complete.
258+
# Run the server; each client will signal it to shut down when finished transacting with it.
253259
enip_main( **kwargs )
254260

255261
targetthread.join()
@@ -259,11 +265,11 @@ def request( self, data, addr=None ):
259265
# We expect that it should have received the full STRUCT tag encoding, and successfully
260266
# completed its tests.
261267
client_got = kwargs['client'].get( 'received', None )
262-
client_ok = kwargs['client'].get( 'successful', False )
268+
client_ok = kwargs['client'].get( 'successful', None )
263269
log.normal( "Client received {length}-byte: {got}".format(
264270
length=len(client_got) if client_got else "(Unknown)", got=reprlib.repr( client_got )))
265271
assert client_got == tagencoding
266-
assert client_ok
272+
assert client_ok == True
267273
finally:
268274
# In case of Exception, ensure we've shut down the server...
269275
kwargs['server']['control'].done = True
@@ -274,11 +280,15 @@ def logix_remote_udt_pylogix( count, svraddr, kwargs ):
274280
"""Pylogix access of UDT STRUCT. """
275281
tagname = example_tagname
276282

283+
time.sleep( 1 ) # Wait for server to be established
284+
277285
# We'll check our server transactions (that they're sensible), and also send back what we got...
278286
server_txs = kwargs['server']['server_txs']
279287
server_txs_beg = len( server_txs ) # in case the same server is used for many clients
280-
281-
time.sleep( 1 ) # Wait for server to be established
288+
log.normal( "logix_remote_udt_pylogix w/ controls in object server: %s (txs %s, %d txs), client: %s",
289+
id( kwargs['server'] ),
290+
id( kwargs['server']['server_txs'] ), len( kwargs['server']['server_txs'] ),
291+
id( kwargs['client'] ))
282292
try:
283293
# Try to Register a real session, followed by commands
284294
timeout = kwargs['server']['control'].timeout
@@ -310,6 +320,8 @@ def logix_remote_udt_pylogix( count, svraddr, kwargs ):
310320
# Check that server processed correct commands (first and last few), return what the client
311321
# got... We'll see the EtherNet/IP register, Forward Open, Read Tag Fragmented w/ offset 0
312322
# status 6, and high offset, status 0, forward close, EtherNet/IP unregister.
323+
kwargs['server']['control'].done = True
324+
313325
cases = [
314326
{
315327
"enip.CIP.register.options": 0,
@@ -346,17 +358,24 @@ def logix_remote_udt_pylogix( count, svraddr, kwargs ):
346358
"enip.CIP.unregister": True,
347359
}
348360
]
349-
361+
log.normal( "Testing {server_txs_cnt} Server txs vs. {cases_cnt} test cases".format(
362+
server_txs_cnt=len( server_txs ) - server_txs_beg, cases_cnt=len( cases )))
350363
for num,(addr,req,rpy) in enumerate( server_txs ):
351364
if num < server_txs_beg or server_txs_beg + 5 <= num <= len( server_txs ) - 5:
352365
continue
353-
log.detail( "req {num:3d}: {addr!r:24}: {req}".format( num=num, addr=addr, req=parser.enip_format( req )))
354-
log.normal( "rpy {num:3d}: {addr!r:24}: {rpy}".format( num=num, addr=addr, rpy=parser.enip_format( rpy )))
355366
# See if this reply matches one of our cases; delete if so
356367
for i,c in enumerate( cases ):
357368
if all( rpy.get( k ) == v for k,v in c.items() ):
358369
del cases[i]
359370
break
371+
if cases:
372+
log.warning( "Failed to find cases {cases!r}".format( cases=cases ))
373+
for num,(addr,req,rpy) in enumerate( server_txs ):
374+
if num < server_txs_beg or server_txs_beg + 5 <= num <= len( server_txs ) - 5:
375+
continue
376+
log.detail( "UDT req {num:3d}: {addr!r:24}: {req}".format( num=num, addr=addr, req=parser.enip_format( req )))
377+
log.normal( "UDT rpy {num:3d}: {addr!r:24}: {rpy}".format( num=num, addr=addr, rpy=parser.enip_format( rpy )))
378+
360379
assert cases == []
361380
kwargs['client']['successful'] = True
362381

0 commit comments

Comments
 (0)