From 51ce4131a62003a57be70213ece67b3576f8be8c Mon Sep 17 00:00:00 2001 From: Bologna Date: Wed, 1 May 2024 16:14:39 -0300 Subject: [PATCH 1/5] Update player count on forward player event --- .../events/events_forwarder_service.go | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/internal/core/services/events/events_forwarder_service.go b/internal/core/services/events/events_forwarder_service.go index 85af87665..3b084aa1f 100644 --- a/internal/core/services/events/events_forwarder_service.go +++ b/internal/core/services/events/events_forwarder_service.go @@ -27,11 +27,9 @@ import ( "encoding/json" "errors" "fmt" - - "github.com/topfreegames/maestro/internal/core/logs" - "github.com/topfreegames/maestro/internal/core/entities" "github.com/topfreegames/maestro/internal/core/entities/game_room" + "github.com/topfreegames/maestro/internal/core/logs" "github.com/topfreegames/maestro/internal/core/entities/forwarder" @@ -222,6 +220,8 @@ func (es *EventsForwarderService) forwardPlayerEvent( es.logger.Error(fmt.Sprintf("Failed to forward player events for room %s and scheduler %s", event.RoomID, event.SchedulerID), zap.Error(err)) return err } + + es.updatePlayerState(ctx, event, playerAttributes) reportPlayerEventForwardingSuccess(scheduler.Game, event.SchedulerID) return nil } @@ -327,3 +327,25 @@ func (es *EventsForwarderService) isRoomInUnreliableState(event *events.Event) b return false } + +func (es *EventsForwarderService) updatePlayerState(ctx context.Context, event *events.Event, playerAttributes events.PlayerEventAttributes) { + room, err := es.roomStorage.GetRoom(ctx, event.SchedulerID, event.RoomID) + if err != nil { + es.logger.Error(fmt.Sprintf("Failed to get room %s from storage", event.RoomID), zap.Error(err)) + return + } + + players := room.Metadata["players"].(int) + + switch playerAttributes.EventType { + case events.PlayerJoin: + room.Metadata["players"] = players + 1 + case events.PlayerLeft: + room.Metadata["players"] = players - 1 + } + + err = es.roomStorage.UpdateRoom(ctx, room) + if err != nil { + es.logger.Error(fmt.Sprintf("Failed to update room %s in storage", event.RoomID), zap.Error(err)) + } +} From 26d5646bc5b54a5624f9af83af052507d69fae9e Mon Sep 17 00:00:00 2001 From: Bologna Date: Thu, 2 May 2024 10:22:20 -0300 Subject: [PATCH 2/5] Add test use cases --- .../events/events_forwarder_service.go | 13 +- .../events/events_forwarder_service_test.go | 116 +++++++++++++++++- 2 files changed, 127 insertions(+), 2 deletions(-) diff --git a/internal/core/services/events/events_forwarder_service.go b/internal/core/services/events/events_forwarder_service.go index 3b084aa1f..88a59bd58 100644 --- a/internal/core/services/events/events_forwarder_service.go +++ b/internal/core/services/events/events_forwarder_service.go @@ -335,7 +335,18 @@ func (es *EventsForwarderService) updatePlayerState(ctx context.Context, event * return } - players := room.Metadata["players"].(int) + if room.IsValidationRoom { + return + } + + if room.Metadata == nil { + room.Metadata = make(map[string]interface{}) + } + + var players int + if key, ok := room.Metadata["players"]; ok { + players = key.(int) + } switch playerAttributes.EventType { case events.PlayerJoin: diff --git a/internal/core/services/events/events_forwarder_service_test.go b/internal/core/services/events/events_forwarder_service_test.go index 682893a52..f0d0467dd 100644 --- a/internal/core/services/events/events_forwarder_service_test.go +++ b/internal/core/services/events/events_forwarder_service_test.go @@ -172,7 +172,76 @@ func TestEventsForwarderService_ProduceEvent(t *testing.T) { }) t.Run("should succeed when event is PlayerEvent", func(t *testing.T) { - eventsForwarderService, config, eventsForwarder, schedulerStorage, _, instanceStorage, schedulerCache := testSetup(t) + eventsForwarderService, config, eventsForwarder, schedulerStorage, roomStorage, instanceStorage, schedulerCache := testSetup(t) + + event := &events.Event{ + Name: events.PlayerEvent, + SchedulerID: expectedScheduler.Name, + RoomID: "room", + Attributes: map[string]interface{}{ + "eventType": "playerLeft", + "playerId": "player", + }, + } + + room := &game_room.GameRoom{ + ID: event.RoomID, + SchedulerID: event.SchedulerID, + IsValidationRoom: false, + } + + schedulerCache.EXPECT().GetScheduler(context.Background(), event.SchedulerID).Return(nil, nil) + schedulerStorage.EXPECT().GetScheduler(context.Background(), event.SchedulerID).Return(expectedScheduler, nil) + instanceStorage.EXPECT().GetInstance(context.Background(), event.SchedulerID, event.RoomID).Return(expectedGameRoomInstance, nil).Times(0) + schedulerCache.EXPECT().SetScheduler(context.Background(), expectedScheduler, config.SchedulerCacheTtl).Return(nil) + eventsForwarder.EXPECT().ForwardPlayerEvent(context.Background(), gomock.Any(), gomock.Any()).Return(nil) + roomStorage.EXPECT().GetRoom(gomock.Any(), event.SchedulerID, event.RoomID).Return(room, nil) + roomStorage.EXPECT().UpdateRoom(gomock.Any(), gomock.Any()).Return(nil) + + err := eventsForwarderService.ProduceEvent(context.Background(), event) + require.NoError(t, err) + require.Empty(t, event.Attributes["ports"]) + }) + + t.Run("should increase player count for PlayerEvent", func(t *testing.T) { + eventsForwarderService, config, eventsForwarder, schedulerStorage, roomStorage, instanceStorage, schedulerCache := testSetup(t) + + event := &events.Event{ + Name: events.PlayerEvent, + SchedulerID: expectedScheduler.Name, + RoomID: "room", + Attributes: map[string]interface{}{ + "eventType": "playerJoin", + "playerId": "player", + }, + } + + room := &game_room.GameRoom{ + ID: event.RoomID, + SchedulerID: event.SchedulerID, + IsValidationRoom: false, + Metadata: map[string]interface{}{ + "players": 5, + }, + } + + schedulerCache.EXPECT().GetScheduler(context.Background(), event.SchedulerID).Return(nil, nil) + schedulerStorage.EXPECT().GetScheduler(context.Background(), event.SchedulerID).Return(expectedScheduler, nil) + instanceStorage.EXPECT().GetInstance(context.Background(), event.SchedulerID, event.RoomID).Return(expectedGameRoomInstance, nil).Times(0) + schedulerCache.EXPECT().SetScheduler(context.Background(), expectedScheduler, config.SchedulerCacheTtl).Return(nil) + eventsForwarder.EXPECT().ForwardPlayerEvent(context.Background(), gomock.Any(), gomock.Any()).Return(nil) + roomStorage.EXPECT().GetRoom(gomock.Any(), event.SchedulerID, event.RoomID).Return(room, nil) + + room.Metadata["players"] = 6 + roomStorage.EXPECT().UpdateRoom(gomock.Any(), room).Return(nil) + + err := eventsForwarderService.ProduceEvent(context.Background(), event) + require.NoError(t, err) + require.Empty(t, event.Attributes["ports"]) + }) + + t.Run("should decrease player count for PlayerEvent", func(t *testing.T) { + eventsForwarderService, config, eventsForwarder, schedulerStorage, roomStorage, instanceStorage, schedulerCache := testSetup(t) event := &events.Event{ Name: events.PlayerEvent, @@ -184,11 +253,56 @@ func TestEventsForwarderService_ProduceEvent(t *testing.T) { }, } + room := &game_room.GameRoom{ + ID: event.RoomID, + SchedulerID: event.SchedulerID, + IsValidationRoom: true, + } + schedulerCache.EXPECT().GetScheduler(context.Background(), event.SchedulerID).Return(nil, nil) schedulerStorage.EXPECT().GetScheduler(context.Background(), event.SchedulerID).Return(expectedScheduler, nil) instanceStorage.EXPECT().GetInstance(context.Background(), event.SchedulerID, event.RoomID).Return(expectedGameRoomInstance, nil).Times(0) schedulerCache.EXPECT().SetScheduler(context.Background(), expectedScheduler, config.SchedulerCacheTtl).Return(nil) eventsForwarder.EXPECT().ForwardPlayerEvent(context.Background(), gomock.Any(), gomock.Any()).Return(nil) + roomStorage.EXPECT().GetRoom(gomock.Any(), event.SchedulerID, event.RoomID).Return(room, nil) + roomStorage.EXPECT().UpdateRoom(gomock.Any(), room).MaxTimes(0) + + err := eventsForwarderService.ProduceEvent(context.Background(), event) + require.NoError(t, err) + require.Empty(t, event.Attributes["ports"]) + }) + + t.Run("should ignore player state update for PlayerEvent", func(t *testing.T) { + eventsForwarderService, config, eventsForwarder, schedulerStorage, roomStorage, instanceStorage, schedulerCache := testSetup(t) + + event := &events.Event{ + Name: events.PlayerEvent, + SchedulerID: expectedScheduler.Name, + RoomID: "room", + Attributes: map[string]interface{}{ + "eventType": "playerLeft", + "playerId": "player", + }, + } + + room := &game_room.GameRoom{ + ID: event.RoomID, + SchedulerID: event.SchedulerID, + IsValidationRoom: false, + Metadata: map[string]interface{}{ + "players": 5, + }, + } + + schedulerCache.EXPECT().GetScheduler(context.Background(), event.SchedulerID).Return(nil, nil) + schedulerStorage.EXPECT().GetScheduler(context.Background(), event.SchedulerID).Return(expectedScheduler, nil) + instanceStorage.EXPECT().GetInstance(context.Background(), event.SchedulerID, event.RoomID).Return(expectedGameRoomInstance, nil).Times(0) + schedulerCache.EXPECT().SetScheduler(context.Background(), expectedScheduler, config.SchedulerCacheTtl).Return(nil) + eventsForwarder.EXPECT().ForwardPlayerEvent(context.Background(), gomock.Any(), gomock.Any()).Return(nil) + roomStorage.EXPECT().GetRoom(gomock.Any(), event.SchedulerID, event.RoomID).Return(room, nil) + + room.Metadata["players"] = 4 + roomStorage.EXPECT().UpdateRoom(gomock.Any(), room).Return(nil) err := eventsForwarderService.ProduceEvent(context.Background(), event) require.NoError(t, err) From 8b03916acfa59bcb696e84b9d0b194d90b71c4a4 Mon Sep 17 00:00:00 2001 From: Bologna Date: Thu, 2 May 2024 10:29:44 -0300 Subject: [PATCH 3/5] Fix typo on tests --- .../events/events_forwarder_service_test.go | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/internal/core/services/events/events_forwarder_service_test.go b/internal/core/services/events/events_forwarder_service_test.go index f0d0467dd..f6a3bf87f 100644 --- a/internal/core/services/events/events_forwarder_service_test.go +++ b/internal/core/services/events/events_forwarder_service_test.go @@ -203,7 +203,7 @@ func TestEventsForwarderService_ProduceEvent(t *testing.T) { require.Empty(t, event.Attributes["ports"]) }) - t.Run("should increase player count for PlayerEvent", func(t *testing.T) { + t.Run("should increase room player count when event is PlayerEvent and event type is playerJoin", func(t *testing.T) { eventsForwarderService, config, eventsForwarder, schedulerStorage, roomStorage, instanceStorage, schedulerCache := testSetup(t) event := &events.Event{ @@ -240,7 +240,7 @@ func TestEventsForwarderService_ProduceEvent(t *testing.T) { require.Empty(t, event.Attributes["ports"]) }) - t.Run("should decrease player count for PlayerEvent", func(t *testing.T) { + t.Run("should decrease room player count when event is PlayerEvent and event type is playerLeft", func(t *testing.T) { eventsForwarderService, config, eventsForwarder, schedulerStorage, roomStorage, instanceStorage, schedulerCache := testSetup(t) event := &events.Event{ @@ -256,7 +256,10 @@ func TestEventsForwarderService_ProduceEvent(t *testing.T) { room := &game_room.GameRoom{ ID: event.RoomID, SchedulerID: event.SchedulerID, - IsValidationRoom: true, + IsValidationRoom: false, + Metadata: map[string]interface{}{ + "players": 5, + }, } schedulerCache.EXPECT().GetScheduler(context.Background(), event.SchedulerID).Return(nil, nil) @@ -265,14 +268,16 @@ func TestEventsForwarderService_ProduceEvent(t *testing.T) { schedulerCache.EXPECT().SetScheduler(context.Background(), expectedScheduler, config.SchedulerCacheTtl).Return(nil) eventsForwarder.EXPECT().ForwardPlayerEvent(context.Background(), gomock.Any(), gomock.Any()).Return(nil) roomStorage.EXPECT().GetRoom(gomock.Any(), event.SchedulerID, event.RoomID).Return(room, nil) - roomStorage.EXPECT().UpdateRoom(gomock.Any(), room).MaxTimes(0) + + room.Metadata["players"] = 4 + roomStorage.EXPECT().UpdateRoom(gomock.Any(), room).Return(nil) err := eventsForwarderService.ProduceEvent(context.Background(), event) require.NoError(t, err) require.Empty(t, event.Attributes["ports"]) }) - t.Run("should ignore player state update for PlayerEvent", func(t *testing.T) { + t.Run("should not update room player count when event is PlayerEvent and room is validationRoom", func(t *testing.T) { eventsForwarderService, config, eventsForwarder, schedulerStorage, roomStorage, instanceStorage, schedulerCache := testSetup(t) event := &events.Event{ @@ -288,10 +293,7 @@ func TestEventsForwarderService_ProduceEvent(t *testing.T) { room := &game_room.GameRoom{ ID: event.RoomID, SchedulerID: event.SchedulerID, - IsValidationRoom: false, - Metadata: map[string]interface{}{ - "players": 5, - }, + IsValidationRoom: true, } schedulerCache.EXPECT().GetScheduler(context.Background(), event.SchedulerID).Return(nil, nil) @@ -300,9 +302,7 @@ func TestEventsForwarderService_ProduceEvent(t *testing.T) { schedulerCache.EXPECT().SetScheduler(context.Background(), expectedScheduler, config.SchedulerCacheTtl).Return(nil) eventsForwarder.EXPECT().ForwardPlayerEvent(context.Background(), gomock.Any(), gomock.Any()).Return(nil) roomStorage.EXPECT().GetRoom(gomock.Any(), event.SchedulerID, event.RoomID).Return(room, nil) - - room.Metadata["players"] = 4 - roomStorage.EXPECT().UpdateRoom(gomock.Any(), room).Return(nil) + roomStorage.EXPECT().UpdateRoom(gomock.Any(), room).MaxTimes(0) err := eventsForwarderService.ProduceEvent(context.Background(), event) require.NoError(t, err) From 0c97ff86d2c6324d87b90bc0915c014a6a59a847 Mon Sep 17 00:00:00 2001 From: Bologna Date: Thu, 2 May 2024 11:59:35 -0300 Subject: [PATCH 4/5] Fix goimports --- internal/core/services/events/events_forwarder_service.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/core/services/events/events_forwarder_service.go b/internal/core/services/events/events_forwarder_service.go index 88a59bd58..35c9279cf 100644 --- a/internal/core/services/events/events_forwarder_service.go +++ b/internal/core/services/events/events_forwarder_service.go @@ -27,6 +27,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/topfreegames/maestro/internal/core/entities" "github.com/topfreegames/maestro/internal/core/entities/game_room" "github.com/topfreegames/maestro/internal/core/logs" From 8a5db9a22342dd64b4619836f268f126fc1d3105 Mon Sep 17 00:00:00 2001 From: Bologna Date: Thu, 2 May 2024 12:01:16 -0300 Subject: [PATCH 5/5] Fix goimports --- internal/core/services/events/events_forwarder_service.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/core/services/events/events_forwarder_service.go b/internal/core/services/events/events_forwarder_service.go index 35c9279cf..3c0bf31c6 100644 --- a/internal/core/services/events/events_forwarder_service.go +++ b/internal/core/services/events/events_forwarder_service.go @@ -28,9 +28,10 @@ import ( "errors" "fmt" + "github.com/topfreegames/maestro/internal/core/logs" + "github.com/topfreegames/maestro/internal/core/entities" "github.com/topfreegames/maestro/internal/core/entities/game_room" - "github.com/topfreegames/maestro/internal/core/logs" "github.com/topfreegames/maestro/internal/core/entities/forwarder"