public virtual async Task <PeerToPeerSessionState> StartNewGameAsync(PeerToPeerSessionState session)
        {
            PeerToPeerGameState game = PeerToPeerGameState.CreateNew();

            session.GameId = game.GameId;

            game = await _storage.AddP2PGameAsync(game);

            return(await _storage.UpdateP2PSessionAsync(session));
        }
        public async Task StartNewGameAsync()
        {
            PeerToPeerGameService  svc     = new PeerToPeerGameService(_storage.Object);
            PeerToPeerGameState    game    = PeerToPeerGameState.CreateNew();
            PeerToPeerSessionState session = new PeerToPeerSessionState();

            _storage.Setup(p => p.UpdateP2PSessionAsync(It.IsAny <PeerToPeerSessionState>())).ReturnsAsync(session);

            PeerToPeerSessionState res = await svc.StartNewGameAsync(session);

            _storage.Verify(p => p.AddP2PGameAsync(It.IsAny <PeerToPeerGameState>()), Times.Once);
            _storage.Verify(p => p.UpdateP2PSessionAsync(It.IsAny <PeerToPeerSessionState>()), Times.Once);

            Assert.IsNotNull(res);
        }
        public virtual async Task <PeerToPeerSessionState> StopGameAsync(PeerToPeerSessionState session)
        {
            PeerToPeerGameState game = await FindActiveP2PGameAsync(session.GameId);

            if (game == null)
            {
                return(null);
            }

            game.DateEnd = DateTime.Now;
            await _storage.UpdateP2PGameAsync(game);

            session.PreviousGames.Add(session.GameId);
            session.GameId = null;

            return(await _storage.UpdateP2PSessionAsync(session));
        }
        /// <summary>
        /// Cleanup old objects from memory storage
        /// </summary>
        /// <returns></returns>
        public Task Cleanup()
        {
            DateTime now = DateTime.Now;

            if (_games.Count > 500)
            {
                foreach (string key in _games.Keys)
                {
                    GameState g  = _games[key];
                    TimeSpan  ts = now - g.LastUpdated;
                    if (ts.TotalHours >= HoursToLive)
                    {
                        _games.TryRemove(key, out _);
                    }
                }
            }

            if (_p2pGames.Count > 500)
            {
                foreach (string key in _p2pGames.Keys)
                {
                    PeerToPeerGameState g  = _p2pGames[key];
                    TimeSpan            ts = now - g.LastUpdated;
                    if (ts.TotalHours >= HoursToLive)
                    {
                        _p2pGames.TryRemove(key, out _);
                    }
                }
            }

            if (_p2pSessions.Count > 500)
            {
                foreach (string key in _p2pSessions.Keys)
                {
                    PeerToPeerSessionState g = _p2pSessions[key];
                    TimeSpan ts = now - g.LastUpdated;
                    if (ts.TotalHours >= HoursToLive)
                    {
                        _p2pSessions.TryRemove(key, out _);
                    }
                }
            }

            return(Task.FromResult(0));
        }
        public async Task CleanupTest()
        {
            InMemoryStaticStorage s = new InMemoryStaticStorage
            {
                HoursToLive = 0
            };


            //clean results of older runs
            await s.Cleanup();

            for (int i = 0; i < 1000; i++)
            {
                var game = PeerToPeerGameState.CreateNew();
                await s.AddP2PGameAsync(game);
            }

            for (int i = 0; i < 1000; i++)
            {
                var session = new PeerToPeerSessionState()
                {
                    Code = i.ToString(),
                };
                await s.AddP2PSessionAsync(session);
            }

            for (int i = 0; i < 1000; i++)
            {
                var game = new GameState
                {
                    GameId = Guid.NewGuid().ToString()
                };
                await s.AddGameAsync(game);
            }

            await s.Cleanup();

            Assert.AreEqual(0, s.PeerToPeerGamesCount);
            Assert.AreEqual(0, s.PeerToPeerSessionsCount);
            Assert.AreEqual(0, s.GamesCount);
        }
        public virtual async Task <PeerToPeerGameState> FindActiveP2PGameAsync(string gameId)
        {
            PeerToPeerGameState g = await _storage.FindActiveP2PGameAsync(gameId);

            return(g);
        }
 public Task <PeerToPeerGameState> UpdateP2PGameAsync(PeerToPeerGameState game)
 {
     //TODO: Implement
     throw new NotImplementedException();
 }
 public Task <PeerToPeerGameState> UpdateP2PGameAsync(PeerToPeerGameState game)
 {
     game.LastUpdated = DateTime.Now;
     game             = _p2pGames.AddOrUpdate(game.GameId, game, (key, val) => game);
     return(Task.FromResult(game));
 }
 public Task <PeerToPeerGameState> AddP2PGameAsync(PeerToPeerGameState game)
 {
     game.LastUpdated = DateTime.Now;
     game             = _p2pGames.GetOrAdd(game.GameId, game);
     return(Task.FromResult(game));
 }