using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using Remotely.Server.Hubs; using Remotely.Server.Models; using Remotely.Server.Services; using Remotely.Shared.Models; using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Remotely.Tests { [TestClass] public class AgentHubTests { private TestData _testData; public IDataService DataService { get; private set; } [TestMethod] [DoNotParallelize] public async Task DeviceCameOnline_BannedByName() { var circuitManager = new Mock(); var circuitConnection = new Mock(); circuitManager.Setup(x => x.Connections).Returns(new[] { circuitConnection.Object }); circuitConnection.Setup(x => x.User).Returns(_testData.Admin1); var appConfig = new Mock(); var viewerHub = new Mock>(); var expiringTokenService = new Mock(); appConfig.Setup(x => x.BannedDevices).Returns(new string[] { _testData.Device1.DeviceName }); var hub = new AgentHub(DataService, appConfig.Object, viewerHub.Object, circuitManager.Object, expiringTokenService.Object); var hubClients = new Mock(); var caller = new Mock(); hubClients.Setup(x => x.Caller).Returns(caller.Object); hub.Clients = hubClients.Object; Assert.IsFalse(await hub.DeviceCameOnline(_testData.Device1)); hubClients.Verify(x => x.Caller, Times.Once); caller.Verify(x => x.SendCoreAsync("UninstallAgent", It.IsAny(), It.IsAny()), Times.Once); } [TestMethod] [DoNotParallelize] public async Task DeviceCameOnline_BannedById() { var circuitManager = new Mock(); var circuitConnection = new Mock(); circuitManager.Setup(x => x.Connections).Returns(new[] { circuitConnection.Object }); circuitConnection.Setup(x => x.User).Returns(_testData.Admin1); var appConfig = new Mock(); var viewerHub = new Mock>(); var expiringTokenService = new Mock(); appConfig.Setup(x => x.BannedDevices).Returns(new string[] { _testData.Device1.ID }); var hub = new AgentHub(DataService, appConfig.Object, viewerHub.Object, circuitManager.Object, expiringTokenService.Object); var hubClients = new Mock(); var caller = new Mock(); hubClients.Setup(x => x.Caller).Returns(caller.Object); hub.Clients = hubClients.Object; Assert.IsFalse(await hub.DeviceCameOnline(_testData.Device1)); hubClients.Verify(x => x.Caller, Times.Once); caller.Verify(x => x.SendCoreAsync("UninstallAgent", It.IsAny(), It.IsAny()), Times.Once); } [TestMethod] [DoNotParallelize] public async Task DeviceCameOnline_NotBanned() { var appConfig = new Mock(); var circuitManager = new Mock(); var circuitConnection = new Mock(); circuitManager.Setup(x => x.Connections).Returns(new[] { circuitConnection.Object }); circuitConnection.Setup(x => x.User).Returns(_testData.Admin1); var browserHubClients = new Mock(); var expiringTokenService = new Mock(); var viewerHub = new Mock>(); appConfig.Setup(x => x.BannedDevices).Returns(Array.Empty()); var hub = new AgentHub(DataService, appConfig.Object, viewerHub.Object, circuitManager.Object, expiringTokenService.Object) { Context = new CallerContext() }; var agentHubClients = new Mock(); var agentHubCaller = new Mock(); var agentClientsProxy = new Mock(); agentHubClients.Setup(x => x.Caller).Returns(agentHubCaller.Object); agentHubClients.Setup(x => x.Clients(It.IsAny>())).Returns(agentClientsProxy.Object); hub.Clients = agentHubClients.Object; var result = await hub.DeviceCameOnline(_testData.Device1); Assert.IsTrue(result); agentHubClients.Verify(x => x.Caller, Times.Never); agentHubCaller.Verify(x => x.SendCoreAsync("UninstallAgent", It.IsAny(), It.IsAny()), Times.Never); circuitConnection.Verify(x => x.InvokeCircuitEvent( CircuitEventName.DeviceUpdate, It.Is(x => x.ID == _testData.Device1.ID)), Times.Once); } [TestCleanup] public void TestCleanup() { _testData.ClearData(); } [TestInitialize] public void TestInit() { _testData = new TestData(); DataService = IoCActivator.ServiceProvider.GetRequiredService(); } private class CallerContext : HubCallerContext { public override string ConnectionId => "test-id"; public override string UserIdentifier => null; public override ClaimsPrincipal User => null; public override IDictionary Items { get; } = new Dictionary(); public override IFeatureCollection Features { get; } = new FeatureCollection(); public override CancellationToken ConnectionAborted => CancellationToken.None; public override void Abort() { } } } }