@@ -172,6 +172,7 @@ func TestConfidentialModule_Execute(t *testing.T) {
172172 {Key : "API_KEY" },
173173 {Key : "SIGNING_KEY" , Namespace : "custom-ns" },
174174 },
175+ nil ,
175176 lggr ,
176177 )
177178
@@ -205,6 +206,7 @@ func TestConfidentialModule_Execute(t *testing.T) {
205206 []byte ("hash" ),
206207 "wf-1" , "owner" , "name" , "tag" ,
207208 []SecretIdentifier {{Key : "SECRET_A" }}, // no namespace
209+ nil ,
208210 lggr ,
209211 )
210212
@@ -225,7 +227,7 @@ func TestConfidentialModule_Execute(t *testing.T) {
225227 Return (nil , errors .New ("capability not found" )).Once ()
226228
227229 mod := NewConfidentialModule (
228- capReg , "" , nil , "wf" , "owner" , "name" , "tag" , nil , lggr ,
230+ capReg , "" , nil , "wf" , "owner" , "name" , "tag" , nil , nil , lggr ,
229231 )
230232
231233 _ , err := mod .Execute (ctx , execReq , & stubExecutionHelper {})
@@ -243,7 +245,7 @@ func TestConfidentialModule_Execute(t *testing.T) {
243245 Return (capabilities.CapabilityResponse {}, errors .New ("enclave unavailable" )).Once ()
244246
245247 mod := NewConfidentialModule (
246- capReg , "" , nil , "wf" , "owner" , "name" , "tag" , nil , lggr ,
248+ capReg , "" , nil , "wf" , "owner" , "name" , "tag" , nil , nil , lggr ,
247249 )
248250
249251 _ , err := mod .Execute (ctx , execReq , & stubExecutionHelper {})
@@ -261,7 +263,7 @@ func TestConfidentialModule_Execute(t *testing.T) {
261263 Return (capabilities.CapabilityResponse {Payload : nil }, nil ).Once ()
262264
263265 mod := NewConfidentialModule (
264- capReg , "" , nil , "wf" , "owner" , "name" , "tag" , nil , lggr ,
266+ capReg , "" , nil , "wf" , "owner" , "name" , "tag" , nil , nil , lggr ,
265267 )
266268
267269 _ , err := mod .Execute (ctx , execReq , & stubExecutionHelper {})
@@ -296,6 +298,7 @@ func TestConfidentialModule_Execute(t *testing.T) {
296298 {Key : "K1" , Namespace : "ns1" },
297299 {Key : "K2" },
298300 },
301+ nil ,
299302 lggr ,
300303 )
301304
@@ -333,6 +336,100 @@ func TestConfidentialModule_Execute(t *testing.T) {
333336 })
334337}
335338
339+ func TestConfidentialModule_BinaryURLResolver (t * testing.T ) {
340+ ctx := context .Background ()
341+ lggr := logger .Nop ()
342+
343+ execReq := & sdkpb.ExecuteRequest {Config : []byte ("cfg" )}
344+
345+ expectedResult := & sdkpb.ExecutionResult {
346+ Result : & sdkpb.ExecutionResult_Value {
347+ Value : valuespb .NewStringValue ("ok" ),
348+ },
349+ }
350+ resultBytes , err := proto .Marshal (expectedResult )
351+ require .NoError (t , err )
352+ confResp := & confworkflowtypes.ConfidentialWorkflowResponse {ExecutionResult : resultBytes }
353+ respPayload , err := anypb .New (confResp )
354+ require .NoError (t , err )
355+
356+ t .Run ("resolver replaces binary URL" , func (t * testing.T ) {
357+ capReg := regmocks .NewCapabilitiesRegistry (t )
358+ execCap := capmocks .NewExecutableCapability (t )
359+
360+ capReg .EXPECT ().GetExecutable (matches .AnyContext , confidentialWorkflowsCapabilityID ).
361+ Return (execCap , nil ).Once ()
362+
363+ var capturedReq capabilities.CapabilityRequest
364+ execCap .EXPECT ().Execute (matches .AnyContext , mock .Anything ).
365+ Run (func (_ context.Context , req capabilities.CapabilityRequest ) {
366+ capturedReq = req
367+ }).
368+ Return (capabilities.CapabilityResponse {Payload : respPayload }, nil ).Once ()
369+
370+ resolver := func (_ context.Context , wfID string ) (string , error ) {
371+ return "https://presigned.example.com/" + wfID + "?token=abc" , nil
372+ }
373+
374+ mod := NewConfidentialModule (
375+ capReg , "https://storage.example.com/raw" , []byte ("hash" ),
376+ "wf-1" , "owner" , "name" , "tag" , nil , resolver , lggr ,
377+ )
378+
379+ _ , err := mod .Execute (ctx , execReq , & stubExecutionHelper {executionID : "exec-1" })
380+ require .NoError (t , err )
381+
382+ var confReq confworkflowtypes.ConfidentialWorkflowRequest
383+ require .NoError (t , capturedReq .Payload .UnmarshalTo (& confReq ))
384+ assert .Equal (t , "https://presigned.example.com/wf-1?token=abc" , confReq .Execution .BinaryUrl )
385+ })
386+
387+ t .Run ("nil resolver uses raw URL" , func (t * testing.T ) {
388+ capReg := regmocks .NewCapabilitiesRegistry (t )
389+ execCap := capmocks .NewExecutableCapability (t )
390+
391+ capReg .EXPECT ().GetExecutable (matches .AnyContext , confidentialWorkflowsCapabilityID ).
392+ Return (execCap , nil ).Once ()
393+
394+ var capturedReq capabilities.CapabilityRequest
395+ execCap .EXPECT ().Execute (matches .AnyContext , mock .Anything ).
396+ Run (func (_ context.Context , req capabilities.CapabilityRequest ) {
397+ capturedReq = req
398+ }).
399+ Return (capabilities.CapabilityResponse {Payload : respPayload }, nil ).Once ()
400+
401+ mod := NewConfidentialModule (
402+ capReg , "https://storage.example.com/raw" , []byte ("hash" ),
403+ "wf-1" , "owner" , "name" , "tag" , nil , nil , lggr ,
404+ )
405+
406+ _ , err := mod .Execute (ctx , execReq , & stubExecutionHelper {executionID : "exec-1" })
407+ require .NoError (t , err )
408+
409+ var confReq confworkflowtypes.ConfidentialWorkflowRequest
410+ require .NoError (t , capturedReq .Payload .UnmarshalTo (& confReq ))
411+ assert .Equal (t , "https://storage.example.com/raw" , confReq .Execution .BinaryUrl )
412+ })
413+
414+ t .Run ("resolver error propagates" , func (t * testing.T ) {
415+ capReg := regmocks .NewCapabilitiesRegistry (t )
416+
417+ resolver := func (_ context.Context , _ string ) (string , error ) {
418+ return "" , errors .New ("storage service unavailable" )
419+ }
420+
421+ mod := NewConfidentialModule (
422+ capReg , "https://storage.example.com/raw" , []byte ("hash" ),
423+ "wf-1" , "owner" , "name" , "tag" , nil , resolver , lggr ,
424+ )
425+
426+ _ , err := mod .Execute (ctx , execReq , & stubExecutionHelper {executionID : "exec-1" })
427+ require .Error (t , err )
428+ assert .Contains (t , err .Error (), "failed to resolve binary URL" )
429+ assert .Contains (t , err .Error (), "storage service unavailable" )
430+ })
431+ }
432+
336433func TestConfidentialModule_InterfaceMethods (t * testing.T ) {
337434 mod := & ConfidentialModule {}
338435
0 commit comments