1- # Will be ignored on Python2 by conftest.py settings
2-
31import pytest
42import sys
53
4+ from multiprocessing .connection import Listener
5+
6+ from conftest import requires_cothread , ADDRESS , select_and_recv
67
78@pytest .mark .asyncio
89async def test_asyncio_ioc (asyncio_ioc ):
910 import asyncio
1011 from aioca import caget , caput , camonitor , CANothing , FORMAT_TIME
1112
12- # Start
1313 pre = asyncio_ioc .pv_prefix
14- assert (await caget (pre + ":UPTIME" )).startswith ("00:00:0" )
15- # WAVEFORM
16- await caput (pre + ":SINN" , 4 , wait = True )
17- q = asyncio .Queue ()
18- m = camonitor (pre + ":SIN" , q .put , notify_disconnect = True )
19- assert len (await asyncio .wait_for (q .get (), 1 )) == 4
20- # AO
21- ao_val = await caget (pre + ":ALARM" , format = FORMAT_TIME )
22- assert ao_val == 0
23- assert ao_val .severity == 3 # INVALID
24- assert ao_val .status == 17 # UDF
25- await caput (pre + ":ALARM" , 3 , wait = True )
26- await asyncio .sleep (0.1 )
27- ai_val = await caget (pre + ":AI" , format = FORMAT_TIME )
28- assert ai_val == 23.45
29- assert ai_val .severity == 0
30- assert ai_val .status == 0
31- await asyncio .sleep (0.8 )
32- ai_val = await caget (pre + ":AI" , format = FORMAT_TIME )
33- assert ai_val == 23.45
34- assert ai_val .severity == 3
35- assert ai_val .status == 7 # STATE_ALARM
36- # Check pvaccess works
37- from p4p .client .asyncio import Context
38- with Context ("pva" ) as ctx :
39- assert await ctx .get (pre + ":AI" ) == 23.45
40- # Wait for a bit longer for the print output to flush
41- await asyncio .sleep (2 )
14+
15+ with Listener (ADDRESS ) as listener , listener .accept () as conn :
16+
17+ select_and_recv (conn , "R" ) # "Ready"
18+
19+ # Start
20+ assert (await caget (pre + ":UPTIME" )).startswith ("00:00:0" )
21+ # WAVEFORM
22+ await caput (pre + ":SINN" , 4 , wait = True )
23+ q = asyncio .Queue ()
24+ m = camonitor (pre + ":SIN" , q .put , notify_disconnect = True )
25+ assert len (await asyncio .wait_for (q .get (), 1 )) == 4
26+ # AO
27+ ao_val = await caget (pre + ":ALARM" , format = FORMAT_TIME )
28+ assert ao_val == 0
29+ assert ao_val .severity == 3 # INVALID
30+ assert ao_val .status == 17 # UDF
31+
32+ ai_val = await caget (pre + ":AI" , format = FORMAT_TIME )
33+ assert ai_val == 23.45
34+ assert ai_val .severity == 0
35+ assert ai_val .status == 0
36+
37+ await caput (pre + ":ALARM" , 3 , wait = True )
38+
39+ # Confirm the ALARM callback has completed
40+ select_and_recv (conn , "C" ) # "Complete"
41+
42+ ai_val = await caget (pre + ":AI" , format = FORMAT_TIME )
43+ assert ai_val == 23.45
44+ assert ai_val .severity == 3
45+ assert ai_val .status == 7 # STATE_ALARM
46+ # Check pvaccess works
47+ from p4p .client .asyncio import Context
48+ with Context ("pva" ) as ctx :
49+ assert await ctx .get (pre + ":AI" ) == 23.45
50+
51+ conn .send ("D" ) # "Done"
52+ select_and_recv (conn , "D" ) # "Done"
53+
4254 # Stop
4355 out , err = asyncio_ioc .proc .communicate (b"exit\n " , timeout = 5 )
4456 out = out .decode ()
@@ -47,14 +59,19 @@ async def test_asyncio_ioc(asyncio_ioc):
4759 assert isinstance (await asyncio .wait_for (q .get (), 10 ), CANothing )
4860 m .close ()
4961 # check closed and output
50- assert "%s:SINN.VAL 1024 -> 4" % pre in out
51- assert 'update_sin_wf 4' in out
52- assert "%s:ALARM.VAL 0 -> 3" % pre in out
53- assert 'on_update %s:AO : 3.0' % pre in out
54- assert 'async update 3.0 (23.45)' in out
55- assert 'Starting iocInit' in err
56- assert 'iocRun: All initialization complete' in err
57- assert '(InteractiveConsole)' in err
62+ try :
63+ assert "%s:SINN.VAL 1024 -> 4" % pre in out
64+ assert 'update_sin_wf 4' in out
65+ assert "%s:ALARM.VAL 0 -> 3" % pre in out
66+ assert 'on_update %s:AO : 3.0' % pre in out
67+ assert 'async update 3.0 (23.45)' in out
68+ assert 'Starting iocInit' in err
69+ assert 'iocRun: All initialization complete' in err
70+ except Exception :
71+ # Useful printing for when things go wrong!
72+ print ("Out:" , out )
73+ print ("Err:" , err )
74+ raise
5875
5976
6077@pytest .mark .asyncio
@@ -64,20 +81,34 @@ async def test_asyncio_ioc(asyncio_ioc):
6481async def test_asyncio_ioc_override (asyncio_ioc_override ):
6582 from aioca import caget , caput
6683
67- # Gain bo
68- pre = asyncio_ioc_override .pv_prefix
69- assert (await caget (pre + ":GAIN" )) == 0
70- await caput (pre + ":GAIN" , "On" , wait = True )
71- assert (await caget (pre + ":GAIN" )) == 1
84+ with Listener (ADDRESS ) as listener , listener .accept () as conn :
85+
86+ select_and_recv (conn , "R" ) # "Ready"
87+
88+ # Gain bo
89+ pre = asyncio_ioc_override .pv_prefix
90+ assert (await caget (pre + ":GAIN" )) == 0
91+ await caput (pre + ":GAIN" , "On" , wait = True )
92+ assert (await caget (pre + ":GAIN" )) == 1
93+
94+ # Stop
95+ await caput (pre + ":SYSRESET" , 1 )
96+
97+ conn .send ("D" ) # "Done"
98+ select_and_recv (conn , "D" ) # "Done"
7299
73- # Stop
74- await caput (pre + ":SYSRESET" , 1 )
75100 # check closed and output
76101 out , err = asyncio_ioc_override .proc .communicate (timeout = 5 )
77102 out = out .decode ()
78103 err = err .decode ()
79104 # check closed and output
80- assert '1' in out
81- assert 'Starting iocInit' in err
82- assert 'iocRun: All initialization complete' in err
83- assert 'IOC reboot started' in err
105+ try :
106+ assert '1' in out
107+ assert 'Starting iocInit' in err
108+ assert 'iocRun: All initialization complete' in err
109+ assert 'IOC reboot started' in err
110+ except Exception :
111+ # Useful printing for when things go wrong!
112+ print ("Out:" , out )
113+ print ("Err:" , err )
114+ raise
0 commit comments