@@ -60,6 +60,54 @@ def __getattr__(self, name):
60
60
return getattr (self .__wrapped , name )
61
61
62
62
63
+ class Exporter :
64
+ def __init__ (self , config , cwd ):
65
+ self .cwd = str (cwd )
66
+ self .config = config
67
+ self .spawn = None
68
+ self .reader = None
69
+
70
+ def start (self ):
71
+ assert self .spawn is None
72
+ assert self .reader is None
73
+
74
+ self .spawn = pexpect .spawn (
75
+ f'{ sys .executable } -m labgrid.remote.exporter --name testhost { self .config } ' ,
76
+ logfile = Prefixer (sys .stdout .buffer , 'exporter' ),
77
+ cwd = self .cwd )
78
+ try :
79
+ self .spawn .expect ('exporter name: testhost' )
80
+ self .spawn .expect ('connected to exporter' )
81
+ except Exception as e :
82
+ raise Exception (f"exporter startup failed with { self .spawn .before } " ) from e
83
+
84
+ self .reader = threading .Thread (
85
+ target = keep_reading ,
86
+ name = f'exporter-reader-{ self .pid } ' ,
87
+ args = (self .spawn ,), daemon = True )
88
+ self .reader .start ()
89
+
90
+ def stop (self ):
91
+ logging .info ("stopping exporter pid=%s" , self .spawn .pid )
92
+ self .spawn .close (force = True )
93
+ assert not self .spawn .isalive ()
94
+ self .reader .join ()
95
+
96
+ self .spawn = None
97
+ self .reader = None
98
+
99
+ def isalive (self ):
100
+ return self .spawn .isalive ()
101
+
102
+ @property
103
+ def exitstatus (self ):
104
+ return self .spawn .exitstatus
105
+
106
+ @property
107
+ def pid (self ):
108
+ return self .spawn .pid
109
+
110
+
63
111
@pytest .fixture (scope = 'function' )
64
112
def target ():
65
113
return Target ('Test' )
@@ -123,16 +171,9 @@ def coordinator(tmpdir):
123
171
reader .join ()
124
172
125
173
@pytest .fixture (scope = 'function' )
126
- def exporter (tmpdir , coordinator , start_exporter ):
127
- yield start_exporter ()
128
-
129
-
130
- @pytest .fixture (scope = 'function' )
131
- def start_exporter (tmpdir , coordinator ):
132
- spawns = []
133
- readers = []
134
-
135
- p = tmpdir .join ("exports.yaml" )
174
+ def exporter (tmpdir , coordinator ):
175
+ config = "exports.yaml"
176
+ p = tmpdir .join (config )
136
177
p .write (
137
178
"""
138
179
Testport:
@@ -152,32 +193,12 @@ def start_exporter(tmpdir, coordinator):
152
193
"""
153
194
)
154
195
155
- def _start_exporter ():
156
- spawn = pexpect .spawn (
157
- f'{ sys .executable } -m labgrid.remote.exporter --name testhost exports.yaml' ,
158
- logfile = Prefixer (sys .stdout .buffer , 'exporter' ),
159
- cwd = str (tmpdir ))
160
- try :
161
- spawn .expect ('exporter name: testhost' )
162
- spawn .expect ('connected to exporter' )
163
- except :
164
- print (f"exporter startup failed with { spawn .before } " )
165
- raise
166
- reader = threading .Thread (target = keep_reading , name = f'exporter-reader-{ spawn .pid } ' , args = (spawn ,), daemon = True )
167
- reader .start ()
168
-
169
- spawns .append (spawn )
170
- readers .append (reader )
171
-
172
- return spawn
173
-
174
- yield _start_exporter
175
-
176
- for spawn , reader in zip (spawns , readers ):
177
- print (f"stopping exporter pid={ spawn .pid } " )
178
- spawn .close (force = True )
179
- assert not spawn .isalive ()
180
- reader .join ()
196
+ exporter = Exporter (config , tmpdir )
197
+ exporter .start ()
198
+
199
+ yield exporter
200
+
201
+ exporter .stop ()
181
202
182
203
def pytest_addoption (parser ):
183
204
parser .addoption ("--sigrok-usb" , action = "store_true" ,
0 commit comments