55 "errors"
66 "fmt"
77 "testing"
8+ "time"
89)
910
1011/** Test serialization and deserialization
@@ -13,6 +14,7 @@ import (
1314[x] Workflow inputs/outputs
1415[x] Step inputs/outputs
1516[x] Direct handlers, polling handler, list workflows results, get step infos
17+ [x] Set/get event with user defined types
1618*/
1719
1820var (
@@ -289,3 +291,180 @@ func TestWorkflowEncoding(t *testing.T) {
289291 }
290292 })
291293}
294+
295+ type UserDefinedEventData struct {
296+ ID int `json:"id"`
297+ Name string `json:"name"`
298+ Details struct {
299+ Description string `json:"description"`
300+ Tags []string `json:"tags"`
301+ } `json:"details"`
302+ }
303+
304+ func setEventUserDefinedTypeWorkflow (ctx context.Context , input string ) (string , error ) {
305+ eventData := UserDefinedEventData {
306+ ID : 42 ,
307+ Name : "test-event" ,
308+ Details : struct {
309+ Description string `json:"description"`
310+ Tags []string `json:"tags"`
311+ }{
312+ Description : "This is a test event with user-defined data" ,
313+ Tags : []string {"test" , "user-defined" , "serialization" },
314+ },
315+ }
316+
317+ err := SetEvent (ctx , WorkflowSetEventInput [UserDefinedEventData ]{Key : input , Message : eventData })
318+ if err != nil {
319+ return "" , err
320+ }
321+ return "user-defined-event-set" , nil
322+ }
323+
324+ var setEventUserDefinedTypeWf = WithWorkflow (setEventUserDefinedTypeWorkflow )
325+
326+ func TestSetEventSerialize (t * testing.T ) {
327+ setupDBOS (t )
328+
329+ t .Run ("SetEventUserDefinedType" , func (t * testing.T ) {
330+ // Start a workflow that sets an event with a user-defined type
331+ setHandle , err := setEventUserDefinedTypeWf (context .Background (), "user-defined-key" )
332+ if err != nil {
333+ t .Fatalf ("failed to start workflow with user-defined event type: %v" , err )
334+ }
335+
336+ // Wait for the workflow to complete
337+ result , err := setHandle .GetResult (context .Background ())
338+ if err != nil {
339+ t .Fatalf ("failed to get result from user-defined event workflow: %v" , err )
340+ }
341+ if result != "user-defined-event-set" {
342+ t .Fatalf ("expected result to be 'user-defined-event-set', got '%s'" , result )
343+ }
344+
345+ // Retrieve the event to verify it was properly serialized and can be deserialized
346+ retrievedEvent , err := GetEvent [UserDefinedEventData ](context .Background (), WorkflowGetEventInput {
347+ TargetWorkflowID : setHandle .GetWorkflowID (),
348+ Key : "user-defined-key" ,
349+ Timeout : 3 * time .Second ,
350+ })
351+ if err != nil {
352+ t .Fatalf ("failed to get user-defined event: %v" , err )
353+ }
354+
355+ // Verify the retrieved data matches what we set
356+ if retrievedEvent .ID != 42 {
357+ t .Fatalf ("expected ID to be 42, got %d" , retrievedEvent .ID )
358+ }
359+ if retrievedEvent .Name != "test-event" {
360+ t .Fatalf ("expected Name to be 'test-event', got '%s'" , retrievedEvent .Name )
361+ }
362+ if retrievedEvent .Details .Description != "This is a test event with user-defined data" {
363+ t .Fatalf ("expected Description to be 'This is a test event with user-defined data', got '%s'" , retrievedEvent .Details .Description )
364+ }
365+ if len (retrievedEvent .Details .Tags ) != 3 {
366+ t .Fatalf ("expected 3 tags, got %d" , len (retrievedEvent .Details .Tags ))
367+ }
368+ expectedTags := []string {"test" , "user-defined" , "serialization" }
369+ for i , tag := range retrievedEvent .Details .Tags {
370+ if tag != expectedTags [i ] {
371+ t .Fatalf ("expected tag %d to be '%s', got '%s'" , i , expectedTags [i ], tag )
372+ }
373+ }
374+ })
375+ }
376+
377+
378+ func sendUserDefinedTypeWorkflow (ctx context.Context , destinationID string ) (string , error ) {
379+ // Create an instance of our user-defined type inside the workflow
380+ sendData := UserDefinedEventData {
381+ ID : 42 ,
382+ Name : "test-send-message" ,
383+ Details : struct {
384+ Description string `json:"description"`
385+ Tags []string `json:"tags"`
386+ }{
387+ Description : "This is a test send message with user-defined data" ,
388+ Tags : []string {"test" , "user-defined" , "serialization" , "send" },
389+ },
390+ }
391+
392+ // Send should automatically register this type with gob
393+ // Note the explicit type parameter since compiler cannot infer UserDefinedEventData from string input
394+ err := Send (ctx , WorkflowSendInput [UserDefinedEventData ]{
395+ DestinationID : destinationID ,
396+ Topic : "user-defined-topic" ,
397+ Message : sendData ,
398+ })
399+ if err != nil {
400+ return "" , err
401+ }
402+ return "user-defined-message-sent" , nil
403+ }
404+
405+ func recvUserDefinedTypeWorkflow (ctx context.Context , input string ) (UserDefinedEventData , error ) {
406+ // Receive the user-defined type message
407+ result , err := Recv [UserDefinedEventData ](ctx , WorkflowRecvInput {
408+ Topic : "user-defined-topic" ,
409+ Timeout : 3 * time .Second ,
410+ })
411+ return result , err
412+ }
413+
414+ var sendUserDefinedTypeWf = WithWorkflow (sendUserDefinedTypeWorkflow )
415+ var recvUserDefinedTypeWf = WithWorkflow (recvUserDefinedTypeWorkflow )
416+
417+ func TestSendSerialize (t * testing.T ) {
418+ setupDBOS (t )
419+
420+ t .Run ("SendUserDefinedType" , func (t * testing.T ) {
421+ // Start a receiver workflow first
422+ recvHandle , err := recvUserDefinedTypeWf (context .Background (), "recv-input" )
423+ if err != nil {
424+ t .Fatalf ("failed to start receive workflow: %v" , err )
425+ }
426+
427+ // Start a sender workflow that sends a message with a user-defined type
428+ sendHandle , err := sendUserDefinedTypeWf (context .Background (), recvHandle .GetWorkflowID ())
429+ if err != nil {
430+ t .Fatalf ("failed to start workflow with user-defined send type: %v" , err )
431+ }
432+
433+ // Wait for the sender workflow to complete
434+ sendResult , err := sendHandle .GetResult (context .Background ())
435+ if err != nil {
436+ t .Fatalf ("failed to get result from user-defined send workflow: %v" , err )
437+ }
438+ if sendResult != "user-defined-message-sent" {
439+ t .Fatalf ("expected result to be 'user-defined-message-sent', got '%s'" , sendResult )
440+ }
441+
442+ // Wait for the receiver workflow to complete and get the message
443+ receivedData , err := recvHandle .GetResult (context .Background ())
444+ if err != nil {
445+ t .Fatalf ("failed to get result from receive workflow: %v" , err )
446+ }
447+
448+ // Verify the received data matches what we sent
449+ if receivedData .ID != 42 {
450+ t .Fatalf ("expected ID to be 42, got %d" , receivedData .ID )
451+ }
452+ if receivedData .Name != "test-send-message" {
453+ t .Fatalf ("expected Name to be 'test-send-message', got '%s'" , receivedData .Name )
454+ }
455+ if receivedData .Details .Description != "This is a test send message with user-defined data" {
456+ t .Fatalf ("expected Description to be 'This is a test send message with user-defined data', got '%s'" , receivedData .Details .Description )
457+ }
458+
459+ // Verify tags
460+ expectedTags := []string {"test" , "user-defined" , "serialization" , "send" }
461+ if len (receivedData .Details .Tags ) != len (expectedTags ) {
462+ t .Fatalf ("expected %d tags, got %d" , len (expectedTags ), len (receivedData .Details .Tags ))
463+ }
464+ for i , tag := range receivedData .Details .Tags {
465+ if tag != expectedTags [i ] {
466+ t .Fatalf ("expected tag %d to be '%s', got '%s'" , i , expectedTags [i ], tag )
467+ }
468+ }
469+ })
470+ }
0 commit comments