protected override void FixtureSetup()
        {
            base.FixtureSetup();
            UnifiedTestClient client = null;

            try
            {
                // this call will update Master server address
                client        = (UnifiedTestClient)this.CreateTestClient();
                client.UserId = this.Player1;

                if (this.authPolicy != AuthPolicy.AuthOnMaster || this.connectPolicy.UseNSToGetMS)
                {
                    var response = this.ConnectAndAuthenticate(client, this.NameServerAddress, null, ErrorCode.Ok);
                    this.MasterAddress = (string)response[ParameterCode.Address];
                }

                this.ConnectAndAuthenticate(client, this.MasterAddress, client.UserId, null, reuseToken: true);

                var roomName           = this.GenerateRandomString("room");
                var createGameResponse = client.CreateGame(roomName);
                this.GameServerAddress = createGameResponse.Address;
                this.ConnectAndAuthenticate(client, this.GameServerAddress);
                client.CreateGame(roomName);

                client.LeaveGame();
            }
            finally
            {
                DisposeClients(client);
            }
        }
        public void RoomFlags_DeleteNullPropsAfterStateRestoreTest()
        {
            if (!this.UsePlugins)
            {
                Assert.Ignore("This test needs plugins");
            }

            UnifiedTestClient masterClient1 = null;
            UnifiedTestClient masterClient2 = null;

            try
            {
                // create game on the game server
                string roomName = this.GenerateRandomizedRoomName(MethodBase.GetCurrentMethod().Name);

                var gameProperties = new Hashtable();
                gameProperties["P1"] = 1;
                gameProperties["P2"] = 2;
                gameProperties["L1"] = 1;
                gameProperties["L2"] = 2;
                gameProperties["L3"] = 3;

                var createGameRequest = new CreateGameRequest
                {
                    GameId         = roomName,
                    RoomFlags      = RoomOptionFlags.DeleteNullProps,
                    GameProperties = gameProperties,
                    Plugins        = new[] { "SaveLoadStateTestPlugin" },
                };

                masterClient1 = this.CreateMasterClientAndAuthenticate(Player1);
                var cgResponse = masterClient1.CreateGame(createGameRequest);

                this.ConnectAndAuthenticate(masterClient1, cgResponse.Address);

                masterClient1.CreateGame(createGameRequest);
                Thread.Sleep(100);
                masterClient1.LeaveGame();// leave game, so that game will be persisted

                Thread.Sleep(100);

                this.ConnectAndAuthenticate(masterClient1, this.MasterAddress);

                var joinRequest = new JoinGameRequest()
                {
                    GameId   = roomName,
                    JoinMode = JoinModes.RejoinOrJoin,
                    Plugins  = new[] { "SaveLoadStateTestPlugin" },
                };

                var jgResponse = masterClient1.JoinGame(joinRequest, ErrorCode.Ok);
                this.ConnectAndAuthenticate(masterClient1, jgResponse.Address);
                jgResponse = masterClient1.JoinGame(joinRequest);

                masterClient1.OpSetPropertiesOfRoom
                (
                    new Hashtable
                {
                    { "P1", null }
                }
                );

                masterClient2 = this.CreateMasterClientAndAuthenticate(Player2);
                jgResponse    = masterClient2.JoinGame(joinRequest, ErrorCode.Ok);
                this.ConnectAndAuthenticate(masterClient2, jgResponse.Address);

                jgResponse = masterClient2.JoinGame(joinRequest);

                Assert.That(jgResponse.GameProperties.Contains("P1"), Is.False);

                masterClient1.OpSetPropertiesOfRoom
                (
                    new Hashtable
                {
                    { "P2", null }
                }
                );

                var propertiesChangedEvent = masterClient2.WaitForEvent(EventCode.PropertiesChanged, this.WaitTimeout);

                var properties = (Hashtable)propertiesChangedEvent[(byte)ParameterKey.Properties];

                Assert.That(properties, Is.Not.Null);
                Assert.That(properties.Contains("P2"));
                Assert.That(properties["P2"], Is.Null);
            }
            finally
            {
                DisposeClients(masterClient1, masterClient2);
            }
        }
        public void EventCache_ActorCacheLimitExceeded()
        {
            if (this.IsOnline)
            {
                Assert.Ignore("Does not support online mode");
            }

            UnifiedTestClient client1 = null;
            UnifiedTestClient client2 = null;
            UnifiedTestClient client3 = null;

            try
            {
                var roomName = this.GenerateRandomizedRoomName(MethodBase.GetCurrentMethod().Name);

                client1 = this.CreateMasterClientAndAuthenticate(Player1);
                client3 = this.CreateMasterClientAndAuthenticate(Player3);

                var createGameResponse = client1.CreateGame(roomName, true, true, 4);

                // switch client 1 to GS
                this.ConnectAndAuthenticate(client1, createGameResponse.Address);
                this.ConnectAndAuthenticate(client3, createGameResponse.Address);

                client1.CreateGame(new CreateGameRequest()
                {
                    GameId             = roomName,
                    PlayerTTL          = -1,
                    SuppressRoomEvents = true,
                    CheckUserOnJoin    = true
                });

                client3.JoinGame(roomName);

                // exceeding limits
                for (byte i = 1; i <= 11; ++i)
                {
                    var raiseEventOp = new OperationRequest
                    {
                        OperationCode = OperationCode.RaiseEvent,
                        Parameters    = new Dictionary <byte, object>
                        {
                            { ParameterCode.Data, new Hashtable() },
                            { ParameterCode.Cache, (byte)CacheOperation.MergeCache },
                            { ParameterCode.Code, i }
                        }
                    };
                    client1.SendRequest(raiseEventOp);
                }
                client1.WaitForEvent(EventCode.PropertiesChanged);
                client1.WaitForEvent(EventCode.ErrorInfo);

                client2 = this.CreateMasterClientAndAuthenticate(Player2);
                client2.JoinGame(roomName, ErrorCode.GameClosed);

                this.ConnectAndAuthenticate(client2, createGameResponse.Address);
                client2.JoinGame(roomName, ErrorCode.GameClosed);

                client3.LeaveGame(true);
                client3.Disconnect();

                this.ConnectAndAuthenticate(client3, createGameResponse.Address);
                client3.JoinGame(new JoinGameRequest
                {
                    GameId   = roomName,
                    JoinMode = JoinModes.RejoinOnly
                }, 32739);//EventCacheExceeded
            }
            finally
            {
                DisposeClients(client1, client2, client3);
            }
        }