/* * Copyright (c) 2023 Proton AG * * This file is part of ProtonVPN. * * ProtonVPN is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ProtonVPN is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ProtonVPN. If not, see . */ using System; using System.Threading; using System.Threading.Tasks; using System.Windows; using Caliburn.Micro; using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; using NSubstitute; using ProtonVPN.Logging.Contracts; using ProtonVPN.Common.Legacy.Threading; using ProtonVPN.Core.Servers; using ProtonVPN.Core.Settings; using ProtonVPN.Core.Windows; namespace ProtonVPN.Core.Tests.Servers { [TestClass] public class ServerLoadUpdaterTest { private ServerManager _serverManager; private IScheduler _scheduler; private IEventAggregator _eventAggregator; private IMainWindowState _mainWindowState; private IApiServers _apiServers; private ISingleActionFactory _singleActionFactory; private ILastServerLoadTimeProvider _lastServerLoadTimeProvider; private readonly SyncSingleTask _task = new(); [TestInitialize] public void Initialize() { IUserStorage userStorage = Substitute.For(); IAppSettings appSettings = Substitute.For(); ILogger logger = Substitute.For(); _serverManager = Substitute.For(userStorage, appSettings, logger); _scheduler = Substitute.For(); _eventAggregator = Substitute.For(); _mainWindowState = Substitute.For(); _apiServers = Substitute.For(); _singleActionFactory = Substitute.For(); _lastServerLoadTimeProvider = Substitute.For(); } [TestCleanup] public void Cleanup() { _serverManager = null; _scheduler = null; _eventAggregator = null; _mainWindowState = null; _apiServers = null; _singleActionFactory = null; _lastServerLoadTimeProvider = null; } [TestMethod] public async Task ItShouldStartUpdatingServerLoads() { // Arrange ServerLoadUpdater sut = GetServerLoadUpdater(DateTime.Now.Subtract(TimeSpan.FromHours(1))); // Act await sut.HandleAsync(new WindowStateMessage(true, WindowState.Normal), new CancellationTokenSource().Token); // Assert _task.Started.Should().BeTrue(); } [TestMethod] public async Task ItShouldNotStartUpdatingServerLoads() { // Arrange ServerLoadUpdater sut = GetServerLoadUpdater(DateTime.Now); // Act await sut.HandleAsync(new WindowStateMessage(true, WindowState.Normal), new CancellationTokenSource().Token); // Assert _task.Started.Should().BeFalse(); } private ServerLoadUpdater GetServerLoadUpdater(DateTime lastCheck) { var interval = TimeSpan.FromSeconds(10); _lastServerLoadTimeProvider.LastChecked().Returns(lastCheck); _singleActionFactory.GetSingleAction(Arg.Any>()).Returns(_task); return new ServerLoadUpdater( interval, _serverManager, _scheduler, _eventAggregator, _mainWindowState, _apiServers, _singleActionFactory, _lastServerLoadTimeProvider); } } internal class SyncSingleTask : ISingleAction { public bool Started; public event EventHandler Completed; public Task Task { get; } public bool IsRunning { get; } public Task Run() { Started = true; return Task.CompletedTask; } public void Cancel() => throw new NotImplementedException(); } }