@@ -33,6 +33,8 @@ import (
33
33
"github.com/stretchr/testify/suite"
34
34
"github.com/uber-go/tally"
35
35
"go.uber.org/mock/gomock"
36
+ "go.uber.org/zap"
37
+ "go.uber.org/zap/zaptest/observer"
36
38
37
39
"github.com/uber/cadence/common"
38
40
"github.com/uber/cadence/common/backoff"
@@ -3600,6 +3602,153 @@ func TestCloseTransactionAsMutation(t *testing.T) {
3600
3602
}
3601
3603
}
3602
3604
3605
+ func Test__logDuplicatedActivityEvents (t * testing.T ) {
3606
+ testCases := []struct {
3607
+ name string
3608
+ buildHistory func (msb * mutableStateBuilder ) []* types.HistoryEvent
3609
+ assertions func (* testing.T , * observer.ObservedLogs )
3610
+ }{
3611
+ {
3612
+ name : "no duplicates" ,
3613
+ buildHistory : func (msb * mutableStateBuilder ) []* types.HistoryEvent {
3614
+ event1 := msb .CreateNewHistoryEvent (types .EventTypeActivityTaskStarted )
3615
+ event1 .ActivityTaskStartedEventAttributes = & types.ActivityTaskStartedEventAttributes {
3616
+ ScheduledEventID : 1 ,
3617
+ Attempt : 1 ,
3618
+ }
3619
+ event2 := msb .CreateNewHistoryEvent (types .EventTypeActivityTaskCompleted )
3620
+ event2 .ActivityTaskCompletedEventAttributes = & types.ActivityTaskCompletedEventAttributes {
3621
+ ScheduledEventID : 1 ,
3622
+ }
3623
+
3624
+ return []* types.HistoryEvent {event1 , event2 }
3625
+ },
3626
+ assertions : func (t * testing.T , logs * observer.ObservedLogs ) {
3627
+ assert .Equal (t , 0 , logs .FilterMessage ("Duplicate activity task event found" ).Len ())
3628
+ },
3629
+ },
3630
+ {
3631
+ name : "started event duplicated" ,
3632
+ buildHistory : func (msb * mutableStateBuilder ) []* types.HistoryEvent {
3633
+ event1 := msb .CreateNewHistoryEvent (types .EventTypeActivityTaskStarted )
3634
+ event1 .ActivityTaskStartedEventAttributes = & types.ActivityTaskStartedEventAttributes {
3635
+ ScheduledEventID : 1 ,
3636
+ Attempt : 1 ,
3637
+ }
3638
+ event2 := msb .CreateNewHistoryEvent (types .EventTypeActivityTaskStarted )
3639
+ event2 .ActivityTaskStartedEventAttributes = & types.ActivityTaskStartedEventAttributes {
3640
+ ScheduledEventID : 1 ,
3641
+ Attempt : 1 ,
3642
+ }
3643
+
3644
+ return []* types.HistoryEvent {event1 , event2 }
3645
+ },
3646
+ assertions : func (t * testing.T , logs * observer.ObservedLogs ) {
3647
+ assert .Equal (t , 1 , logs .FilterMessage ("Duplicate activity task event found" ).Len ())
3648
+ },
3649
+ },
3650
+ {
3651
+ name : "completed event duplicated" ,
3652
+ buildHistory : func (msb * mutableStateBuilder ) []* types.HistoryEvent {
3653
+ event1 := msb .CreateNewHistoryEvent (types .EventTypeActivityTaskCompleted )
3654
+ event1 .ActivityTaskCompletedEventAttributes = & types.ActivityTaskCompletedEventAttributes {
3655
+ ScheduledEventID : 1 ,
3656
+ }
3657
+ event2 := msb .CreateNewHistoryEvent (types .EventTypeActivityTaskCompleted )
3658
+ event2 .ActivityTaskCompletedEventAttributes = & types.ActivityTaskCompletedEventAttributes {
3659
+ ScheduledEventID : 1 ,
3660
+ }
3661
+
3662
+ return []* types.HistoryEvent {event1 , event2 }
3663
+ },
3664
+ assertions : func (t * testing.T , logs * observer.ObservedLogs ) {
3665
+ assert .Equal (t , 1 , logs .FilterMessage ("Duplicate activity task event found" ).Len ())
3666
+ },
3667
+ },
3668
+ {
3669
+ name : "canceled event duplicated" ,
3670
+ buildHistory : func (msb * mutableStateBuilder ) []* types.HistoryEvent {
3671
+ event1 := msb .CreateNewHistoryEvent (types .EventTypeActivityTaskCanceled )
3672
+ event1 .ActivityTaskCanceledEventAttributes = & types.ActivityTaskCanceledEventAttributes {
3673
+ ScheduledEventID : 1 ,
3674
+ }
3675
+ event2 := msb .CreateNewHistoryEvent (types .EventTypeActivityTaskCanceled )
3676
+ event2 .ActivityTaskCanceledEventAttributes = & types.ActivityTaskCanceledEventAttributes {
3677
+ ScheduledEventID : 1 ,
3678
+ }
3679
+
3680
+ return []* types.HistoryEvent {event1 , event2 }
3681
+ },
3682
+ assertions : func (t * testing.T , logs * observer.ObservedLogs ) {
3683
+ assert .Equal (t , 1 , logs .FilterMessage ("Duplicate activity task event found" ).Len ())
3684
+ },
3685
+ },
3686
+ {
3687
+ name : "failed event duplicated" ,
3688
+ buildHistory : func (msb * mutableStateBuilder ) []* types.HistoryEvent {
3689
+ event1 := msb .CreateNewHistoryEvent (types .EventTypeActivityTaskFailed )
3690
+ event1 .ActivityTaskFailedEventAttributes = & types.ActivityTaskFailedEventAttributes {
3691
+ ScheduledEventID : 1 ,
3692
+ }
3693
+ event2 := msb .CreateNewHistoryEvent (types .EventTypeActivityTaskFailed )
3694
+ event2 .ActivityTaskFailedEventAttributes = & types.ActivityTaskFailedEventAttributes {
3695
+ ScheduledEventID : 1 ,
3696
+ }
3697
+
3698
+ return []* types.HistoryEvent {event1 , event2 }
3699
+ },
3700
+ assertions : func (t * testing.T , logs * observer.ObservedLogs ) {
3701
+ assert .Equal (t , 1 , logs .FilterMessage ("Duplicate activity task event found" ).Len ())
3702
+ },
3703
+ },
3704
+ {
3705
+ name : "timed out event duplicated" ,
3706
+ buildHistory : func (msb * mutableStateBuilder ) []* types.HistoryEvent {
3707
+ event1 := msb .CreateNewHistoryEvent (types .EventTypeActivityTaskTimedOut )
3708
+ event1 .ActivityTaskTimedOutEventAttributes = & types.ActivityTaskTimedOutEventAttributes {
3709
+ ScheduledEventID : 1 ,
3710
+ }
3711
+ event2 := msb .CreateNewHistoryEvent (types .EventTypeActivityTaskTimedOut )
3712
+ event2 .ActivityTaskTimedOutEventAttributes = & types.ActivityTaskTimedOutEventAttributes {
3713
+ ScheduledEventID : 1 ,
3714
+ }
3715
+
3716
+ return []* types.HistoryEvent {event1 , event2 }
3717
+ },
3718
+ assertions : func (t * testing.T , logs * observer.ObservedLogs ) {
3719
+ assert .Equal (t , 1 , logs .FilterMessage ("Duplicate activity task event found" ).Len ())
3720
+ },
3721
+ },
3722
+ }
3723
+
3724
+ for _ , tc := range testCases {
3725
+ t .Run (tc .name , func (t * testing.T ) {
3726
+ ctrl := gomock .NewController (t )
3727
+ defer ctrl .Finish ()
3728
+
3729
+ core , observedLogs := observer .New (zap .ErrorLevel )
3730
+
3731
+ mockCache := events .NewMockCache (ctrl )
3732
+ shardContext := shard .NewMockContext (ctrl )
3733
+ mockDomainCache := cache .NewMockDomainCache (ctrl )
3734
+
3735
+ msb := createMSBWithMocks (mockCache , shardContext , mockDomainCache )
3736
+
3737
+ msb .logger = log .NewLogger (zap .New (core ))
3738
+
3739
+ msb .executionInfo .DomainID = "some-domain-id"
3740
+ msb .executionInfo .WorkflowID = "some-workflow-id"
3741
+ msb .executionInfo .RunID = "some-run-id"
3742
+
3743
+ msb .hBuilder .history = tc .buildHistory (msb )
3744
+
3745
+ msb .logDuplicatedActivityEvents ()
3746
+
3747
+ tc .assertions (t , observedLogs )
3748
+ })
3749
+ }
3750
+ }
3751
+
3603
3752
func createMSBWithMocks (mockCache * events.MockCache , shardContext * shardCtx.MockContext , mockDomainCache * cache.MockDomainCache ) * mutableStateBuilder {
3604
3753
// the MSB constructor calls a bunch of endpoints on the mocks, so
3605
3754
// put them in here as a set of fixed expectations so the actual mocking
0 commit comments