From 6544f17af8951c65bd0aa29977f3b6dedc612764 Mon Sep 17 00:00:00 2001 From: Sean Kane Date: Fri, 23 Jan 2026 09:20:32 -0700 Subject: [PATCH 1/2] Add test for multi-op err with resource exhausted --- serviceerror/convert_test.go | 38 ++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/serviceerror/convert_test.go b/serviceerror/convert_test.go index ad8aa180..8edafb05 100644 --- a/serviceerror/convert_test.go +++ b/serviceerror/convert_test.go @@ -14,6 +14,7 @@ import ( "google.golang.org/protobuf/types/known/anypb" "google.golang.org/protobuf/types/known/durationpb" + enumspb "go.temporal.io/api/enums/v1" "go.temporal.io/api/errordetails/v1" "go.temporal.io/api/serviceerror" ) @@ -133,6 +134,43 @@ func TestMultiOperationExecution(t *testing.T) { }) } +func TestMultiOperationExecution_PreservesResourceExhaustedDetails(t *testing.T) { + resourceErr := &serviceerror.ResourceExhausted{ + Cause: enumspb.RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT, + Scope: enumspb.RESOURCE_EXHAUSTED_SCOPE_NAMESPACE, + Message: "rate limit exceeded", + } + multiErr := serviceerror.NewMultiOperationExecution( + "multi-op failed", + []error{ + resourceErr, + serviceerror.NewInvalidArgument("other error"), + }, + ) + + // Check round-trip conversion + st := serviceerror.ToStatus(multiErr) + reconstructed := serviceerror.FromStatus(st) + + multiOp, ok := reconstructed.(*serviceerror.MultiOperationExecution) + require.True(t, ok) + + // Get the operation errors + opErrors := multiOp.OperationErrors() + require.Len(t, opErrors, 2) + + // Verify the first error is ResourceExhausted with preserved details + reErr, ok := opErrors[0].(*serviceerror.ResourceExhausted) + require.True(t, ok) + require.Equal(t, enumspb.RESOURCE_EXHAUSTED_CAUSE_RPS_LIMIT, reErr.Cause) + require.Equal(t, enumspb.RESOURCE_EXHAUSTED_SCOPE_NAMESPACE, reErr.Scope) + require.Equal(t, "rate limit exceeded", reErr.Message) + + // Verify proto round-trip equality + reconstructedStatus := serviceerror.ToStatus(reconstructed) + require.True(t, proto.Equal(st.Proto(), reconstructedStatus.Proto())) +} + func TestMultiOperationAborted(t *testing.T) { err := serviceerror.NewMultiOperationAborted("Operation was aborted.") From 607623a2ab842dc2500512cde80e5e5bea21377b Mon Sep 17 00:00:00 2001 From: Sean Kane Date: Fri, 23 Jan 2026 11:15:06 -0700 Subject: [PATCH 2/2] validate second error --- serviceerror/convert_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/serviceerror/convert_test.go b/serviceerror/convert_test.go index 8edafb05..89c53344 100644 --- a/serviceerror/convert_test.go +++ b/serviceerror/convert_test.go @@ -166,6 +166,11 @@ func TestMultiOperationExecution_PreservesResourceExhaustedDetails(t *testing.T) require.Equal(t, enumspb.RESOURCE_EXHAUSTED_SCOPE_NAMESPACE, reErr.Scope) require.Equal(t, "rate limit exceeded", reErr.Message) + // Verify the second error is InvalidArgument with preserved details + invErr, ok := opErrors[1].(*serviceerror.InvalidArgument) + require.True(t, ok) + require.Equal(t, "other error", invErr.Message) + // Verify proto round-trip equality reconstructedStatus := serviceerror.ToStatus(reconstructed) require.True(t, proto.Equal(st.Proto(), reconstructedStatus.Proto()))