Пример #1
0
        public async Task TestShouldSaveChatConnectionAndRetrieveFromRedis()
        {
            // arrange
            var chatRoomConnection = TestingScenarioBuilder.BuildChatRoomConnectionPoolWithFourUsers();
            var chatRoomId         = Guid.NewGuid();
            var redis = ServiceProvider.GetRequiredService <RedisContext>();

            // act
            await redis.SetKey(chatRoomId, chatRoomConnection, TimeSpan.FromMinutes(1));

            // assert
            var persistedChatRoomConnectionPool = await redis.GetKey <ChatRoomConnectionPool>(chatRoomId);

            Assert.Equal(6, persistedChatRoomConnectionPool.ActiveConnectionsLimit);
            Assert.Equal(4, persistedChatRoomConnectionPool.TotalActiveConnections);
            Assert.Equal(2, persistedChatRoomConnectionPool.ServerInstances.Count());

            // first server instance
            Assert.Equal(chatRoomConnection.ServerInstances.ElementAt(0).ServerInstanceId.ToString(),
                         persistedChatRoomConnectionPool.ServerInstances.ElementAt(0).ServerInstanceId.ToString());
            Assert.Equal(chatRoomConnection.ServerInstances.ElementAt(0).ConnectedUsers.First().UserId,
                         persistedChatRoomConnectionPool.ServerInstances.ElementAt(0).ConnectedUsers.First().UserId);
            Assert.Equal("connection 1", chatRoomConnection.ServerInstances.ElementAt(0).ConnectedUsers.First().ConnectionId);
            Assert.Equal("connection 2", chatRoomConnection.ServerInstances.ElementAt(0).ConnectedUsers.ElementAt(1).ConnectionId);

            // second server instance hosting the chat room
            Assert.Equal(chatRoomConnection.ServerInstances.ElementAt(1).ServerInstanceId.ToString(),
                         persistedChatRoomConnectionPool.ServerInstances.ElementAt(1).ServerInstanceId.ToString());
            Assert.Equal(chatRoomConnection.ServerInstances.ElementAt(1).ConnectedUsers.First().UserId,
                         persistedChatRoomConnectionPool.ServerInstances.ElementAt(1).ConnectedUsers.First().UserId);
            Assert.Equal("connection 3", chatRoomConnection.ServerInstances.ElementAt(1).ConnectedUsers.First().ConnectionId);
            Assert.Equal("connection 4", chatRoomConnection.ServerInstances.ElementAt(1).ConnectedUsers.ElementAt(1).ConnectionId);
        }
Пример #2
0
        public async Task TestChatRoomShouldGetConnectionPoolOfChatRoomForFirstTime()
        {
            // arrange
            var chatRoomService = ServiceProvider.GetRequiredService <IChatRoomService>();

            var(chatRoom, _) = TestingScenarioBuilder.BuildScenarioWithChatRoomAndUser("Chat 1", 4, "IGP", DB);

            // act
            var chatActiveConnectionPool = await chatRoomService.GetChatRoomConnectionPool(chatRoom.Name);

            // assert
            Assert.Equal(chatRoom.Id, chatActiveConnectionPool.ChatRoomId);
            Assert.Equal(4, chatRoom.ActiveConnectionsLimit);
            Assert.Equal(0, chatActiveConnectionPool.TotalActiveConnections);  // no connections for the first time
            Assert.Empty(chatActiveConnectionPool.ServerInstances);
        }
Пример #3
0
        public void TestChatRoomLogicShouldAddNewUserToAChatRoomWithEmptyConnectionPool()
        {
            // arrange
            var connectionId        = "fakeId";
            var chatRoomId          = Guid.NewGuid();
            var instanceId          = Guid.NewGuid();
            var firstUserId         = Guid.NewGuid();
            var emptyConnectionPool = TestingScenarioBuilder.BuildChatRoomConnectionPoolEmpty(chatRoomId);

            // act: FIRST user wants to connect to the room
            var updatedConnectionPool = ChatRoomLogic.IncrementChatRoomConnectionPool(firstUserId, instanceId, connectionId, emptyConnectionPool);  // 0 connections

            // assert
            Assert.Equal(1, updatedConnectionPool.TotalActiveConnections);                                                      // 1 connection after
            Assert.Equal(firstUserId, updatedConnectionPool.ServerInstances.ElementAt(0).ConnectedUsers.First().UserId);        // user has been appended
            Assert.Equal(connectionId, updatedConnectionPool.ServerInstances.ElementAt(0).ConnectedUsers.First().ConnectionId); // user has been appended
        }
Пример #4
0
        public async Task TestShouldMakeRequestToGameRoomAndGetHttp200(string url)
        {
            // arrange
            var testingScenarioBuilder = new TestingScenarioBuilder(DbContext);
            await testingScenarioBuilder.BuildScenarioWithThreeRooms();

            // act
            var response = await Client.GetAsync(url);

            var responseAsString = await response.Content.ReadAsStringAsync();

            var responseAsJson = JArray.Parse(responseAsString); // JObject if response is not an array

            // assert
            Assert.Equal(3, responseAsJson.Count);
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
        }
Пример #5
0
        public async Task TestShouldRetunNullFromRedisWhenKeyIsNotFound()
        {
            // arrange
            var chatRoomConnection = TestingScenarioBuilder.BuildChatRoomConnectionPoolWithFourUsers();
            var redis = ServiceProvider.GetRequiredService <RedisContext>();

            // act
            await redis.SetKey("someKey", chatRoomConnection, null);

            // assert
            var nonExistentChatRoom = await redis.GetKey <ChatRoomConnectionPool>("anotherKey");

            var existentChatRoom = await redis.GetKey <ChatRoomConnectionPool>("someKey");

            Assert.Null(nonExistentChatRoom);
            Assert.NotNull(existentChatRoom);
            Assert.Equal(chatRoomConnection.ChatRoomId, existentChatRoom.ChatRoomId);
        }
Пример #6
0
        public void TestChatRoomLogicShouldRemoveUserFromAnExistingChatRoomConnectionPool()
        {
            // arrange
            var chatRoomId            = Guid.NewGuid();
            var instanceId1           = Guid.NewGuid();
            var instanceId2           = Guid.NewGuid();
            var initialConnectionPool = TestingScenarioBuilder
                                        .BuildChatRoomConnectionPoolTwoInstances(chatRoomId, 6, instanceId1, instanceId2);

            // act: remove user with connection 1 from room  -- starts with 4 users
            var updatedConnectionPool = ChatRoomLogic.DecrementChatRoomConnectionPool(instanceId1, "connection 1", initialConnectionPool);

            // assert
            var remainingConnectedUser = updatedConnectionPool.ServerInstances.First().ConnectedUsers.First();

            Assert.Equal(3, updatedConnectionPool.TotalActiveConnections);               // 3 users after one is removed
            Assert.Single(updatedConnectionPool.ServerInstances.First().ConnectedUsers); // only 1 connection on instanceId1
            Assert.Equal("connection 2", remainingConnectedUser.ConnectionId);
        }
Пример #7
0
        public void TestChatRoomLogicShouldAddNewUserToExistingChatRoomConnectionPool()
        {
            // arrange
            var connectionId          = "fakeId";
            var chatRoomId            = Guid.NewGuid();
            var instanceId1           = Guid.NewGuid();
            var instanceId2           = Guid.NewGuid();
            var newUserId             = Guid.NewGuid();
            var initialConnectionPool = TestingScenarioBuilder
                                        .BuildChatRoomConnectionPoolTwoInstances(chatRoomId, 6, instanceId1, instanceId2);

            // act: new user that wants to connect to the room being on instance 2
            var updatedConnectionPool = ChatRoomLogic.IncrementChatRoomConnectionPool(newUserId, instanceId2, connectionId, initialConnectionPool);  // 4 connections

            // assert
            Assert.Equal(5, updatedConnectionPool.TotalActiveConnections);                                                           // 5 connections after
            Assert.Equal(newUserId, updatedConnectionPool.ServerInstances.ElementAt(1).ConnectedUsers.ElementAt(2).UserId);          // user has been appended
            Assert.Equal(connectionId, updatedConnectionPool.ServerInstances.ElementAt(1).ConnectedUsers.ElementAt(2).ConnectionId); // user has been appended
        }
Пример #8
0
        public async Task TestChatRoomShouldGetPreviousConnectionPoolOfChatRoom()
        {
            // arrange
            var chatRoomService = ServiceProvider.GetRequiredService <IChatRoomService>();

            var(chatRoom, _, chatActiveConnectionPool) = await TestingScenarioBuilder
                                                         .BuildScenarioWithChatRoomAndUserWithPreviousConnectionPool("Chat 1", 4, "IGP", DB, Redis);

            // act
            var createdChatActiveConnectionPool = await chatRoomService.GetChatRoomConnectionPool(chatRoom.Name);

            // assert
            Assert.Equal(chatRoom.Id, createdChatActiveConnectionPool.ChatRoomId);
            Assert.Equal(4, chatRoom.ActiveConnectionsLimit);
            Assert.Equal(4, createdChatActiveConnectionPool.TotalActiveConnections);  // 4 active connections
            Assert.Equal(2, createdChatActiveConnectionPool.ServerInstances.Count());
            Assert.Equal(2, createdChatActiveConnectionPool.ServerInstances.ElementAt(1).ConnectedUsers.Count());
            Assert.Equal(chatActiveConnectionPool.ServerInstances.ElementAt(1).ServerInstanceId,
                         createdChatActiveConnectionPool.ServerInstances.ElementAt(1).ServerInstanceId);
        }
Пример #9
0
        public async Task TestPlayerShouldLeaveRoom(string url)
        {
            // arrange
            var testingScenarioBuilder = new TestingScenarioBuilder(DbContext);

            var(gameRoom, player, _) = await testingScenarioBuilder.BuildScenarioWithAPlayerInRoom(isInRoom : true);  // deconstruction

            var gameRoomPlayer = await DbContext.GameRoomPlayers.FindAsync(gameRoom.Id, player.Id);

            Assert.True(gameRoomPlayer.IsInRoom);  // player IS in the room

            var postData = JsonConvert.SerializeObject(new
            {
                PlayerId = player.Id
            });
            var payload = new StringContent(postData, Encoding.UTF8, "application/json");

            // act
            var gameRoomUrl  = url + $"/{gameRoom.Id}/leave";
            var postResponse = await Client.PostAsync(gameRoomUrl, payload);

            // assert
            var gameRoomPlayerFromDb = await DbContext.GameRoomPlayers.FirstAsync();

            var postResponseAsJson = JObject.Parse(await postResponse.Content.ReadAsStringAsync());

            // assert - response
            Assert.Equal(HttpStatusCode.OK, postResponse.StatusCode);
            Assert.Equal(gameRoom.Id.ToString(), postResponseAsJson["gameRoomId"]);
            Assert.Equal(player.Id.ToString(), postResponseAsJson["playerId"]);
            Assert.False((bool)postResponseAsJson["isInRoom"]);

            // assert - database
            Assert.Equal(1, await DbContext.GameRoomPlayers.CountAsync());
            Assert.Equal(gameRoomPlayerFromDb.GameRoomId, gameRoom.Id);
            Assert.Equal(gameRoomPlayerFromDb.PlayerId, player.Id);
            Assert.False(gameRoomPlayerFromDb.IsHost);
            Assert.False(gameRoomPlayerFromDb.IsBanned);
            Assert.False(gameRoomPlayerFromDb.IsInRoom);  // player IS NOT in the room anymore -- he has just left!
        }
Пример #10
0
        public async Task TestPlayerShouldJoinRoomWithoutBeingHost(string url)
        {
            // arrange
            var testingScenarioBuilder = new TestingScenarioBuilder(DbContext);

            var(rooms, players) = await testingScenarioBuilder.BuildScenarioWithThreeRoomsAndThreePlayers();   // deconstruction

            var gameRoomOne = rooms[0];
            var playerOne   = players[0];

            var postData = JsonConvert.SerializeObject(new
            {
                PlayerId = playerOne.Id
            });
            var payload = new StringContent(postData, Encoding.UTF8, "application/json");

            // act
            var gameRoomUrl  = url + $"/{gameRoomOne.Id}/join";
            var postResponse = await Client.PostAsync(gameRoomUrl, payload);

            // assert
            var gameRoomPlayer = await DbContext.GameRoomPlayers.FirstAsync();

            var postResponseAsJson = JObject.Parse(await postResponse.Content.ReadAsStringAsync());

            // assert - response
            Assert.Equal(HttpStatusCode.OK, postResponse.StatusCode);
            Assert.Equal(gameRoomOne.Id.ToString(), postResponseAsJson["gameRoomId"]);
            Assert.Equal(playerOne.Id.ToString(), postResponseAsJson["playerId"]);
            Assert.True((bool)postResponseAsJson["isInRoom"]);

            // assert - database
            Assert.Equal(1, await DbContext.GameRoomPlayers.CountAsync());
            Assert.Equal(gameRoomPlayer.GameRoomId, gameRoomOne.Id);
            Assert.Equal(gameRoomPlayer.PlayerId, playerOne.Id);
            Assert.False(gameRoomPlayer.IsHost);
            Assert.False(gameRoomPlayer.IsBanned);
            Assert.True(gameRoomPlayer.IsInRoom);  // in room, but not host
        }
Пример #11
0
        public void TestShouldSerializerConnectionObject()
        {
            // arrange
            var chatRoomId             = Guid.NewGuid();
            var serverInstanceId1      = Guid.NewGuid();
            var serverInstanceId2      = Guid.NewGuid();
            var chatRoomConnectionPool = TestingScenarioBuilder
                                         .BuildChatRoomConnectionPoolTwoInstances(chatRoomId, 6, serverInstanceId1, serverInstanceId2);

            // act -- serializes a complex object using the app settings
            var serializedChatRoomConnectionPoolStr = JsonConvert.SerializeObject(chatRoomConnectionPool);

            // assert - guarantees camelCase and not PascalCase on the jsons
            var jsonChatRoomConnection = JObject.Parse(serializedChatRoomConnectionPoolStr);
            var serverInstances        = (JArray)jsonChatRoomConnection["serverInstances"];

            Assert.Equal(chatRoomId.ToString(), jsonChatRoomConnection["chatRoomId"]);
            Assert.Equal(4, jsonChatRoomConnection["totalActiveConnections"].Value <int>());
            Assert.Equal(2, serverInstances.Count);
            Assert.Equal(serverInstanceId1.ToString(),
                         jsonChatRoomConnection["serverInstances"][0]["serverInstanceId"].Value <string>());
            Assert.Equal(serverInstanceId2.ToString(),
                         jsonChatRoomConnection["serverInstances"][1]["serverInstanceId"].Value <string>());
        }