@@ -93,7 +93,19 @@ func (s *Scenario) Run(ctx context.Context, t *testing.T) error {
9393				defer  cancel ()
9494			}
9595
96- 			res , rterr  :=  s .runSpec (specCtx , rt , to , idx , spec )
96+ 			var  res  * api.Result 
97+ 			ch  :=  make (chan  runSpecRes , 1 )
98+ 
99+ 			go  s .runSpec (specCtx , ch , rt , to , idx , spec )
100+ 
101+ 			select  {
102+ 			case  <- specCtx .Done ():
103+ 				t .Fatalf ("assertion failed: timeout exceeded (%s)" , to .After )
104+ 				break 
105+ 			case  runres  :=  <- ch :
106+ 				res  =  runres .r 
107+ 				rterr  =  runres .err 
108+ 			}
97109			if  rterr  !=  nil  {
98110				break 
99111			}
@@ -115,14 +127,20 @@ func (s *Scenario) Run(ctx context.Context, t *testing.T) error {
115127	return  rterr 
116128}
117129
130+ type  runSpecRes  struct  {
131+ 	r    * api.Result 
132+ 	err  error 
133+ }
134+ 
118135// runSpec executes an individual test spec 
119136func  (s  * Scenario ) runSpec (
120137	ctx  context.Context ,
138+ 	ch  chan  runSpecRes ,
121139	retry  * api.Retry ,
122140	timeout  * api.Timeout ,
123141	idx  int ,
124142	spec  api.Evaluable ,
125- ) ( * api. Result ,  error )  {
143+ ) {
126144	sb  :=  spec .Base ()
127145	specTraceMsg  :=  strconv .Itoa (idx )
128146	if  sb .Name  !=  ""  {
@@ -136,13 +154,15 @@ func (s *Scenario) runSpec(
136154		// Just evaluate the test spec once 
137155		res , err  :=  spec .Eval (ctx )
138156		if  err  !=  nil  {
139- 			return  nil , err 
157+ 			ch  <-  runSpecRes {nil , err }
158+ 			return 
140159		}
141160		debug .Println (
142161			ctx , "run: single-shot (no retries) ok: %v" ,
143162			! res .Failed (),
144163		)
145- 		return  res , nil 
164+ 		ch  <-  runSpecRes {res , nil }
165+ 		return 
146166	}
147167
148168	// retry the action and test the assertions until they succeed, 
@@ -187,7 +207,8 @@ func (s *Scenario) runSpec(
187207
188208		res , err  =  spec .Eval (ctx )
189209		if  err  !=  nil  {
190- 			return  nil , err 
210+ 			ch  <-  runSpecRes {nil , err }
211+ 			return 
191212		}
192213		success  =  ! res .Failed ()
193214		debug .Println (
@@ -200,13 +221,13 @@ func (s *Scenario) runSpec(
200221		}
201222		for  _ , f  :=  range  res .Failures () {
202223			debug .Println (
203- 				ctx , "run: attempt %d after %s  failure: %s" ,
204- 				attempts , after ,  f ,
224+ 				ctx , "run: attempt %d failure: %s" ,
225+ 				attempts , f ,
205226			)
206227		}
207228		attempts ++ 
208229	}
209- 	return   res , nil 
230+ 	ch   <-   runSpecRes { res , nil } 
210231}
211232
212233// getTimeout returns the timeout configuration for the test spec. We check for 
0 commit comments