public static MmApplication GetMm(ushort mmPort, ushort gamePort, GameApplication gameApplication, int maximumPlayers = 2, int mmTime = 10000, int ddosConnectionsLevel = 300, int ddosConnectionCheckInterval = 5000)
        {
            var socketFactory = new LiteNetSockFactory();
            var serializer    = new BinarySerializer();
            var serverLogger  = new ConsoleLogger("M ", LogLevel.Error | LogLevel.Info | LogLevel.Debug);

            var config = new ApplicationConfig
            {
                PublicDomainNameOrAddress = "127.0.0.1",
                ListenPorts = new List <ushort> {
                    mmPort
                },
                BindToPortHttp               = 7002,
                MaxPacketSize                = 300,
                BasePacketBufferSize         = 64,
                SendTickTimeMs               = 20,
                SocketTickTimeMs             = 10,
                SocketType                   = SocketType.BareSocket,
                ReceiveTickTimeMs            = 20,
                IsConnectionDdosProtectionOn = false
            };
            var roomPropertiesProvider = new FakeRoomPropertiesProvider3(250, maximumPlayers, mmTime);
            var taskSchedulerFactory   = new TaskSchedulerFactory(serverLogger);
            var requestSender          = new FakeSenderWithGameApplication(gameApplication, new Dictionary <byte, object> {
                { PropertyCode.RoomProperties.GameMode, (byte)GameMode.SinglePlayer }
            }, CreateRoomDelegate, UpdateRoomDelegate);

            var _mmPacketSender = new PacketBatchSender(taskSchedulerFactory, config, serverLogger);

            var _playerManager = new PlayersManager(Mock.Of <IMmMetrics>(), serverLogger);

            //_serverProvider = new MatchMakerServerInfoProvider(requestSender, taskSchedulerFactory, config, _serverLogger, _statsProvider);
            var _serverProvider = new FakeMatchMakerServerInfoProvider(requestSender, "127.0.0.1", $"{gamePort}");
            var roomApiProvider = new DefaultRoomApiProvider(requestSender, serverLogger);
            var _mmRoomManager  =
                new MM.Managers.RoomManager(_serverProvider, serverLogger, taskSchedulerFactory, roomApiProvider);

            var sender          = GetSHamanMessageSender(serializer, _mmPacketSender, config, serverLogger);
            var _mmGroupManager = new MatchMakingGroupManager(serverLogger, taskSchedulerFactory, _playerManager,
                                                              sender, Mock.Of <IMmMetrics>(), _mmRoomManager, roomPropertiesProvider, config);

            var matchMaker = new MatchMaker(_playerManager, _mmGroupManager);

            //
            // var _measures = new Dictionary<byte, object>();
            // _measures.Add(FakePropertyCodes.PlayerProperties.Level, 1);
            // matchMaker.AddMatchMakingGroup(_measures);
            matchMaker.AddRequiredProperty(FakePropertyCodes.PlayerProperties.Level);

            var senderFactory            = new ShamanMessageSenderFactory(serializer, config);
            var protectionManagerConfig  = new ConnectionDdosProtectionConfig(ddosConnectionsLevel, ddosConnectionCheckInterval, 5000, 60000);
            var connectionDdosProtection = new ConnectDdosProtection(protectionManagerConfig, taskSchedulerFactory, serverLogger);
            var protectionManager        = new ProtectionManager(connectionDdosProtection, protectionManagerConfig, serverLogger);

            //setup mm server
            return(new MmApplication(serverLogger, config, serializer, socketFactory, matchMaker,
                                     requestSender, taskSchedulerFactory, _mmPacketSender, senderFactory, _serverProvider, _mmRoomManager,
                                     _mmGroupManager, _playerManager, Mock.Of <IMmMetrics>(), protectionManager));
        }