@@ -91,6 +91,60 @@ func EndToEndBackendTest(t *testing.T, setup func() backend.Backend, teardown fu
91
91
require .ErrorContains (t , err , "converting activity inputs: mismatched argument count: expected 2, got 1" )
92
92
},
93
93
},
94
+ {
95
+ name : "SubWorkflow_PropagateCancellation" ,
96
+ f : func (t * testing.T , ctx context.Context , c client.Client , w worker.Worker ) {
97
+ canceled := 0
98
+
99
+ swf := func (ctx workflow.Context , i int ) (int , error ) {
100
+ err := workflow .Sleep (ctx , time .Second * 10 )
101
+ if err != nil {
102
+ if err != workflow .Canceled {
103
+ return 0 , err
104
+ }
105
+ }
106
+
107
+ if ctx .Err () != nil && ctx .Err () == workflow .Canceled {
108
+ canceled ++
109
+ }
110
+
111
+ return i * 2 , nil
112
+ }
113
+ wf := func (ctx workflow.Context ) (int , error ) {
114
+ swfs := make ([]workflow.Future [int ], 0 )
115
+
116
+ swfs = append (swfs , workflow .CreateSubWorkflowInstance [int ](ctx , workflow .DefaultSubWorkflowOptions , swf , 1 ))
117
+ swfs = append (swfs , workflow .CreateSubWorkflowInstance [int ](ctx , workflow .DefaultSubWorkflowOptions , swf , 2 ))
118
+
119
+ r := 0
120
+
121
+ for _ , f := range swfs {
122
+ sr , err := f .Get (ctx )
123
+ if err != nil && err != workflow .Canceled {
124
+ return 0 , err
125
+ }
126
+
127
+ r = r + sr
128
+ }
129
+
130
+ if ctx .Err () != nil && ctx .Err () == workflow .Canceled {
131
+ canceled ++
132
+ }
133
+
134
+ return r , nil
135
+ }
136
+ register (t , ctx , w , []interface {}{wf , swf }, nil )
137
+
138
+ instance := runWorkflow (t , ctx , c , wf )
139
+ require .NoError (t , c .CancelWorkflowInstance (ctx , instance ))
140
+
141
+ r , err := client .GetWorkflowResult [int ](ctx , c , instance , time .Second * 5 )
142
+ require .NoError (t , err )
143
+ require .Equal (t , 6 , r )
144
+
145
+ require .Equal (t , 3 , canceled )
146
+ },
147
+ },
94
148
}
95
149
96
150
for _ , tt := range tests {
0 commit comments