SEBWIN-220: Extended unit test coverage for SafeExamBrowser.Configuration and SafeExamBrowser.Runtime.

This commit is contained in:
dbuechel 2018-09-04 10:58:56 +02:00
parent 8280ac3a92
commit 693829f641
17 changed files with 451 additions and 40 deletions

View file

@ -0,0 +1,157 @@
/*
* Copyright (c) 2018 ETH Zürich, Educational Development and Technology (LET)
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
using System;
using System.Reflection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using SafeExamBrowser.Contracts.Communication.Proxies;
using SafeExamBrowser.Contracts.WindowsApi;
namespace SafeExamBrowser.Configuration.UnitTests
{
[TestClass]
public class ConfigurationRepositoryTests
{
private ConfigurationRepository sut;
[TestInitialize]
public void Initialize()
{
var executablePath = Assembly.GetExecutingAssembly().Location;
sut = new ConfigurationRepository(executablePath, string.Empty, string.Empty, string.Empty);
}
[TestMethod]
public void AppConfigMustNeverBeNull()
{
Assert.IsNotNull(sut.AppConfig);
}
[TestMethod]
public void CurrentSessionIsInitiallyNull()
{
Assert.IsNull(sut.CurrentSession);
}
[TestMethod]
public void CurrentSettingsAreInitiallyNull()
{
Assert.IsNull(sut.CurrentSettings);
}
[TestMethod]
public void MustCorrectlyBuildClientConfiguration()
{
sut.LoadDefaultSettings();
sut.InitializeSessionConfiguration();
var appConfig = sut.AppConfig;
var clientConfig = sut.BuildClientConfiguration();
var session = sut.CurrentSession;
var settings = sut.CurrentSettings;
Assert.AreEqual(session.Id, clientConfig.SessionId);
Assert.AreSame(appConfig, clientConfig.AppConfig);
Assert.AreSame(settings, clientConfig.Settings);
}
[TestMethod]
public void MustCorrectlyInitializeSessionConfiguration()
{
sut.InitializeSessionConfiguration();
Assert.IsNull(sut.CurrentSession.ClientProcess);
Assert.IsNull(sut.CurrentSession.ClientProxy);
Assert.IsInstanceOfType(sut.CurrentSession.Id, typeof(Guid));
Assert.IsInstanceOfType(sut.CurrentSession.StartupToken, typeof(Guid));
}
[TestMethod]
public void MustCorrectlyUpdateAppConfig()
{
var clientAddress = sut.AppConfig.ClientAddress;
var clientId = sut.AppConfig.ClientId;
var clientLogFile = sut.AppConfig.ClientLogFile;
var runtimeAddress = sut.AppConfig.RuntimeAddress;
var runtimeId = sut.AppConfig.RuntimeId;
var runtimeLogFile = sut.AppConfig.RuntimeLogFile;
sut.InitializeSessionConfiguration();
Assert.AreNotEqual(sut.AppConfig.ClientAddress, clientAddress);
Assert.AreNotEqual(sut.AppConfig.ClientId, clientId);
Assert.AreEqual(sut.AppConfig.ClientLogFile, clientLogFile);
Assert.AreEqual(sut.AppConfig.RuntimeAddress, runtimeAddress);
Assert.AreEqual(sut.AppConfig.RuntimeId, runtimeId);
Assert.AreEqual(sut.AppConfig.RuntimeLogFile, runtimeLogFile);
}
[TestMethod]
public void MustCorrectlyUpdateSessionConfiguration()
{
var process = new Mock<IProcess>();
var proxy = new Mock<IClientProxy>();
sut.InitializeSessionConfiguration();
var firstSession = sut.CurrentSession;
sut.CurrentSession.ClientProcess = process.Object;
sut.CurrentSession.ClientProxy = proxy.Object;
sut.InitializeSessionConfiguration();
var secondSession = sut.CurrentSession;
Assert.AreSame(firstSession.ClientProcess, secondSession.ClientProcess);
Assert.AreSame(firstSession.ClientProxy, secondSession.ClientProxy);
Assert.AreNotEqual(firstSession.Id, secondSession.Id);
Assert.AreNotEqual(firstSession.StartupToken, secondSession.StartupToken);
sut.CurrentSession.ClientProcess = null;
sut.CurrentSession.ClientProxy = null;
sut.InitializeSessionConfiguration();
var thirdSession = sut.CurrentSession;
Assert.IsNull(thirdSession.ClientProcess);
Assert.IsNull(thirdSession.ClientProxy);
Assert.AreNotEqual(secondSession.Id, thirdSession.Id);
Assert.AreNotEqual(secondSession.StartupToken, thirdSession.StartupToken);
}
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void MustNotAllowNullForExecutablePath()
{
new ConfigurationRepository(null, null, null, null);
}
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void MustNotAllowNullForProgramCopyright()
{
new ConfigurationRepository(string.Empty, null, null, null);
}
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void MustNotAllowNullForProgramTitle()
{
new ConfigurationRepository(string.Empty, string.Empty, null, null);
}
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void MustNotAllowNullForProgramVersion()
{
new ConfigurationRepository(string.Empty, string.Empty, string.Empty, null);
}
}
}

View file

@ -0,0 +1,20 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle("SafeExamBrowser.Configuration.UnitTests")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SafeExamBrowser.Configuration.UnitTests")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("9cdd03e7-ed65-409f-8c07-bd6f633a0170")]
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View file

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.props" Condition="Exists('..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{9CDD03E7-ED65-409F-8C07-BD6F633A0170}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>SafeExamBrowser.Configuration.UnitTests</RootNamespace>
<AssemblyName>SafeExamBrowser.Configuration.UnitTests</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
<IsCodedUITest>False</IsCodedUITest>
<TestProjectType>UnitTest</TestProjectType>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Core.4.3.1\lib\net45\Castle.Core.dll</HintPath>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\MSTest.TestFramework.1.3.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll</HintPath>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\MSTest.TestFramework.1.3.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll</HintPath>
</Reference>
<Reference Include="Moq, Version=4.9.0.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<HintPath>..\packages\Moq.4.9.0\lib\net45\Moq.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.1\lib\netstandard1.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.1\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\netstandard1.0\System.ValueTuple.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="ConfigurationRepositoryTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SafeExamBrowser.Configuration\SafeExamBrowser.Configuration.csproj">
<Project>{c388c4dd-a159-457d-af92-89f7ad185109}</Project>
<Name>SafeExamBrowser.Configuration</Name>
</ProjectReference>
<ProjectReference Include="..\SafeExamBrowser.Contracts\SafeExamBrowser.Contracts.csproj">
<Project>{47da5933-bef8-4729-94e6-abde2db12262}</Project>
<Name>SafeExamBrowser.Contracts</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.props'))" />
<Error Condition="!Exists('..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.targets'))" />
</Target>
<Import Project="..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.targets" Condition="Exists('..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.targets')" />
</Project>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Castle.Core" version="4.3.1" targetFramework="net452" />
<package id="Moq" version="4.9.0" targetFramework="net452" />
<package id="MSTest.TestAdapter" version="1.3.2" targetFramework="net452" />
<package id="MSTest.TestFramework" version="1.3.2" targetFramework="net452" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.1" targetFramework="net452" />
<package id="System.Threading.Tasks.Extensions" version="4.5.1" targetFramework="net452" />
<package id="System.ValueTuple" version="4.5.0" targetFramework="net452" />
</packages>

View file

@ -8,7 +8,6 @@
using System;
using System.IO;
using System.Reflection;
using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.Configuration.Settings;
using SafeExamBrowser.Contracts.Logging;
@ -19,7 +18,11 @@ namespace SafeExamBrowser.Configuration
{
private const string BASE_ADDRESS = "net.pipe://localhost/safeexambrowser";
private bool firstSession = true;
private readonly string executablePath;
private readonly string programCopyright;
private readonly string programTitle;
private readonly string programVersion;
private AppConfig appConfig;
public ISessionData CurrentSession { get; private set; }
@ -39,6 +42,14 @@ namespace SafeExamBrowser.Configuration
}
}
public ConfigurationRepository(string executablePath, string programCopyright, string programTitle, string programVersion)
{
this.executablePath = executablePath ?? throw new ArgumentNullException(nameof(executablePath));
this.programCopyright = programCopyright ?? throw new ArgumentNullException(nameof(programCopyright));
this.programTitle = programTitle ?? throw new ArgumentNullException(nameof(programTitle));
this.programVersion = programVersion ?? throw new ArgumentNullException(nameof(programVersion));
}
public ClientConfiguration BuildClientConfiguration()
{
return new ClientConfiguration
@ -53,18 +64,13 @@ namespace SafeExamBrowser.Configuration
{
CurrentSession = new SessionData
{
ClientProcess = CurrentSession?.ClientProcess,
ClientProxy = CurrentSession?.ClientProxy,
Id = Guid.NewGuid(),
StartupToken = Guid.NewGuid()
};
if (!firstSession)
{
UpdateAppConfig();
}
else
{
firstSession = false;
}
UpdateAppConfig();
}
public LoadStatus LoadSettings(Uri resource, string settingsPassword = null, string adminPassword = null)
@ -101,7 +107,6 @@ namespace SafeExamBrowser.Configuration
private void InitializeAppConfig()
{
var appDataFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), nameof(SafeExamBrowser));
var executable = Assembly.GetEntryAssembly();
var startTime = DateTime.Now;
var logFolder = Path.Combine(appDataFolder, "Logs");
var logFilePrefix = startTime.ToString("yyyy-MM-dd\\_HH\\hmm\\mss\\s");
@ -113,16 +118,16 @@ namespace SafeExamBrowser.Configuration
appConfig.BrowserLogFile = Path.Combine(logFolder, $"{logFilePrefix}_Browser.log");
appConfig.ClientId = Guid.NewGuid();
appConfig.ClientAddress = $"{BASE_ADDRESS}/client/{Guid.NewGuid()}";
appConfig.ClientExecutablePath = Path.Combine(Path.GetDirectoryName(executable.Location), $"{nameof(SafeExamBrowser)}.Client.exe");
appConfig.ClientExecutablePath = Path.Combine(Path.GetDirectoryName(executablePath), $"{nameof(SafeExamBrowser)}.Client.exe");
appConfig.ClientLogFile = Path.Combine(logFolder, $"{logFilePrefix}_Client.log");
appConfig.ConfigurationFileExtension = ".seb";
appConfig.DefaultSettingsFileName = "SebClientSettings.seb";
appConfig.DownloadDirectory = Path.Combine(appDataFolder, "Downloads");
appConfig.LogLevel = LogLevel.Debug;
appConfig.ProgramCopyright = executable.GetCustomAttribute<AssemblyCopyrightAttribute>().Copyright;
appConfig.ProgramCopyright = programCopyright;
appConfig.ProgramDataFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), nameof(SafeExamBrowser));
appConfig.ProgramTitle = executable.GetCustomAttribute<AssemblyTitleAttribute>().Title;
appConfig.ProgramVersion = executable.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion;
appConfig.ProgramTitle = programTitle;
appConfig.ProgramVersion = programVersion;
appConfig.RuntimeId = Guid.NewGuid();
appConfig.RuntimeAddress = $"{BASE_ADDRESS}/runtime/{Guid.NewGuid()}";
appConfig.RuntimeLogFile = Path.Combine(logFolder, $"{logFilePrefix}_Runtime.log");

View file

@ -58,6 +58,8 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations
configuration.SetupGet(c => c.CurrentSession).Returns(session.Object);
configuration.SetupGet(c => c.AppConfig).Returns(appConfig);
proxyFactory.Setup(f => f.CreateClientProxy(It.IsAny<string>())).Returns(proxy.Object);
session.SetupGet(s => s.ClientProcess).Returns(process.Object);
session.SetupGet(s => s.ClientProxy).Returns(proxy.Object);
sut = new ClientOperation(configuration.Object, logger.Object, processFactory.Object, proxyFactory.Object, runtimeHost.Object, 0);
}
@ -125,8 +127,8 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations
result = sut.Perform();
session.VerifySet(s => s.ClientProcess = process.Object, Times.Never);
session.VerifySet(s => s.ClientProxy = proxy.Object, Times.Never);
session.VerifySet(s => s.ClientProcess = process.Object, Times.Once);
session.VerifySet(s => s.ClientProxy = proxy.Object, Times.Once);
Assert.AreEqual(OperationResult.Failed, result);
}
@ -145,8 +147,8 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations
result = sut.Perform();
session.VerifySet(s => s.ClientProcess = process.Object, Times.Never);
session.VerifySet(s => s.ClientProxy = proxy.Object, Times.Never);
session.VerifySet(s => s.ClientProcess = process.Object, Times.Once);
session.VerifySet(s => s.ClientProxy = proxy.Object, Times.Once);
Assert.AreEqual(OperationResult.Failed, result);
}

View file

@ -12,6 +12,7 @@ using Moq;
using SafeExamBrowser.Contracts.Communication.Hosts;
using SafeExamBrowser.Contracts.Communication.Proxies;
using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.Core.OperationModel;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.WindowsApi;
using SafeExamBrowser.Runtime.Operations;
@ -50,6 +51,7 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations
configuration.SetupGet(c => c.CurrentSession).Returns(session.Object);
configuration.SetupGet(c => c.AppConfig).Returns(appConfig);
proxyFactory.Setup(f => f.CreateClientProxy(It.IsAny<string>())).Returns(proxy.Object);
session.SetupGet(s => s.ClientProxy).Returns(proxy.Object);
sut = new ClientTerminationOperation(configuration.Object, logger.Object, processFactory.Object, proxyFactory.Object, runtimeHost.Object, 0);
}
@ -59,9 +61,11 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations
{
sut.Perform();
process.VerifyNoOtherCalls();
processFactory.VerifyNoOtherCalls();
proxy.VerifyNoOtherCalls();
proxyFactory.VerifyNoOtherCalls();
runtimeHost.VerifyNoOtherCalls();
}
[TestMethod]
@ -70,15 +74,71 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations
sut.Revert();
process.VerifyNoOtherCalls();
processFactory.VerifyNoOtherCalls();
proxy.VerifyNoOtherCalls();
proxyFactory.VerifyNoOtherCalls();
runtimeHost.VerifyNoOtherCalls();
}
[TestMethod]
public void TODO()
public void MustTerminateClientOnRepeat()
{
// TODO: MustStartClientOnRepeat -> Extract static fields from operation -> allows unit testing of this requirement etc.!
Assert.Fail();
var terminated = new Action(() =>
{
runtimeHost.Raise(h => h.ClientDisconnected += null);
process.Raise(p => p.Terminated += null, 0);
});
proxy.Setup(p => p.Disconnect()).Callback(terminated);
session.SetupGet(s => s.ClientProcess).Returns(process.Object);
var result = sut.Repeat();
proxy.Verify(p => p.InitiateShutdown(), Times.Once);
proxy.Verify(p => p.Disconnect(), Times.Once);
process.Verify(p => p.Kill(), Times.Never);
session.VerifySet(s => s.ClientProcess = null, Times.Once);
session.VerifySet(s => s.ClientProxy = null, Times.Once);
Assert.AreEqual(OperationResult.Success, result);
}
[TestMethod]
public void MustDoNothingIfNoClientCreated()
{
session.SetupGet(s => s.ClientProcess).Returns(null as IProcess);
var result = sut.Repeat();
session.VerifyGet(s => s.ClientProcess, Times.Once);
process.VerifyNoOtherCalls();
processFactory.VerifyNoOtherCalls();
proxy.VerifyNoOtherCalls();
proxyFactory.VerifyNoOtherCalls();
runtimeHost.VerifyNoOtherCalls();
Assert.AreEqual(OperationResult.Success, result);
}
[TestMethod]
public void MustDoNothingIfNoClientRunning()
{
process.SetupGet(p => p.HasTerminated).Returns(true);
session.SetupGet(s => s.ClientProcess).Returns(process.Object);
var result = sut.Repeat();
process.VerifyGet(p => p.HasTerminated, Times.Once);
session.VerifyGet(s => s.ClientProcess, Times.Exactly(2));
process.VerifyNoOtherCalls();
processFactory.VerifyNoOtherCalls();
proxy.VerifyNoOtherCalls();
proxyFactory.VerifyNoOtherCalls();
runtimeHost.VerifyNoOtherCalls();
Assert.AreEqual(OperationResult.Success, result);
}
}
}

View file

@ -10,13 +10,13 @@ using System;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using SafeExamBrowser.Contracts.Core.OperationModel;
using SafeExamBrowser.Contracts.Communication.Data;
using SafeExamBrowser.Contracts.Communication.Events;
using SafeExamBrowser.Contracts.Communication.Hosts;
using SafeExamBrowser.Contracts.Communication.Proxies;
using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.Configuration.Settings;
using SafeExamBrowser.Contracts.Core.OperationModel;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.UserInterface;
@ -68,7 +68,7 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations
public void MustUseCommandLineArgumentAs1stPrio()
{
var url = @"http://www.safeexambrowser.org/whatever.seb";
var location = Path.GetDirectoryName(GetType().Assembly.Location);
var location = Path.Combine(Path.GetDirectoryName(GetType().Assembly.Location), nameof(Operations));
appConfig.ProgramDataFolder = location;
appConfig.AppDataFolder = location;
@ -86,7 +86,7 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations
[TestMethod]
public void MustUseProgramDataAs2ndPrio()
{
var location = Path.GetDirectoryName(GetType().Assembly.Location);
var location = Path.Combine(Path.GetDirectoryName(GetType().Assembly.Location), nameof(Operations));
appConfig.ProgramDataFolder = location;
appConfig.AppDataFolder = $@"{location}\WRONG";
@ -104,7 +104,7 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations
[TestMethod]
public void MustUseAppDataAs3rdPrio()
{
var location = Path.GetDirectoryName(GetType().Assembly.Location);
var location = Path.Combine(Path.GetDirectoryName(GetType().Assembly.Location), nameof(Operations));
appConfig.AppDataFolder = location;
@ -130,7 +130,7 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations
[TestMethod]
public void MustAbortIfWishedByUser()
{
appConfig.ProgramDataFolder = Path.GetDirectoryName(GetType().Assembly.Location);
appConfig.ProgramDataFolder = Path.Combine(Path.GetDirectoryName(GetType().Assembly.Location), nameof(Operations));
messageBox.Setup(m => m.Show(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<MessageBoxAction>(), It.IsAny<MessageBoxIcon>())).Returns(MessageBoxResult.Yes);
repository.Setup(r => r.LoadSettings(It.IsAny<Uri>(), null, null)).Returns(LoadStatus.Success);
@ -439,7 +439,7 @@ namespace SafeExamBrowser.Runtime.UnitTests.Operations
public void MustReconfigureSuccessfullyWithCorrectUri()
{
var location = Path.GetDirectoryName(GetType().Assembly.Location);
var resource = new Uri(Path.Combine(location, "SettingsDummy.txt"));
var resource = new Uri(Path.Combine(location, nameof(Operations), "SettingsDummy.txt"));
repository.SetupGet(r => r.ReconfigurationFilePath).Returns(resource.AbsolutePath);
repository.Setup(r => r.LoadSettings(It.Is<Uri>(u => u.Equals(resource)), null, null)).Returns(LoadStatus.Success);

View file

@ -113,10 +113,10 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="SettingsDummy.txt">
<Content Include="Operations\SettingsDummy.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="WRONG\SettingsDummy.txt">
<Content Include="Operations\WRONG\SettingsDummy.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>

View file

@ -44,7 +44,7 @@ namespace SafeExamBrowser.Runtime
const int TEN_SECONDS = 10000;
var args = Environment.GetCommandLineArgs();
var configuration = new ConfigurationRepository();
var configuration = BuildConfigurationRepository();
var nativeMethods = new NativeMethods();
logger = new Logger();
@ -101,6 +101,17 @@ namespace SafeExamBrowser.Runtime
logger?.Log($"# Application terminated at {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
}
private ConfigurationRepository BuildConfigurationRepository()
{
var executable = Assembly.GetExecutingAssembly();
var programCopyright = executable.GetCustomAttribute<AssemblyCopyrightAttribute>().Copyright;
var programTitle = executable.GetCustomAttribute<AssemblyTitleAttribute>().Title;
var programVersion = executable.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion;
var repository = new ConfigurationRepository(executable.Location, programCopyright, programTitle, programVersion);
return repository;
}
private void InitializeLogging()
{
var logFileWriter = new LogFileWriter(new DefaultLogFormatter(), appConfig.RuntimeLogFile);

View file

@ -30,10 +30,20 @@ namespace SafeExamBrowser.Runtime.Operations
protected IProxyFactory proxyFactory;
protected IRuntimeHost runtimeHost;
protected static IProcess ClientProcess { get; private set; }
protected static IClientProxy ClientProxy { get; private set; }
public IProgressIndicator ProgressIndicator { protected get; set; }
protected IProcess ClientProcess
{
get { return configuration.CurrentSession.ClientProcess; }
set { configuration.CurrentSession.ClientProcess = value; }
}
protected IClientProxy ClientProxy
{
get { return configuration.CurrentSession.ClientProxy; }
set { configuration.CurrentSession.ClientProxy = value; }
}
public ClientOperation(
IConfigurationRepository configuration,
ILogger logger,
@ -132,9 +142,6 @@ namespace SafeExamBrowser.Runtime.Operations
logger.Info("Authentication of client has been successful, client is ready to operate.");
configuration.CurrentSession.ClientProcess = ClientProcess;
configuration.CurrentSession.ClientProxy = ClientProxy;
return true;
}
@ -191,8 +198,8 @@ namespace SafeExamBrowser.Runtime.Operations
if (success)
{
configuration.CurrentSession.ClientProcess = null;
configuration.CurrentSession.ClientProxy = null;
ClientProcess = null;
ClientProxy = null;
}
return success;

View file

@ -6,9 +6,9 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
using SafeExamBrowser.Contracts.Core.OperationModel;
using SafeExamBrowser.Contracts.Communication.Hosts;
using SafeExamBrowser.Contracts.Configuration;
using SafeExamBrowser.Contracts.Core.OperationModel;
using SafeExamBrowser.Contracts.I18n;
using SafeExamBrowser.Contracts.Logging;
using SafeExamBrowser.Contracts.UserInterface;
@ -58,7 +58,7 @@ namespace SafeExamBrowser.Runtime.Operations
runtimeHost.StartupToken = configuration.CurrentSession.StartupToken;
logger.Info($" -> Client-ID: {configuration.AppConfig.ClientId}");
logger.Info($" -> Runtime-ID: {configuration.AppConfig.RuntimeId} (as reference, does not change)");
logger.Info($" -> Runtime-ID: {configuration.AppConfig.RuntimeId}");
logger.Info($" -> Session-ID: {configuration.CurrentSession.Id}");
}
}

View file

@ -54,6 +54,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SafeExamBrowser.Logging", "
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SafeExamBrowser.Logging.UnitTests", "SafeExamBrowser.Logging.UnitTests\SafeExamBrowser.Logging.UnitTests.csproj", "{7F012305-1125-47CE-9C2A-146C891C0924}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SafeExamBrowser.Configuration.UnitTests", "SafeExamBrowser.Configuration.UnitTests\SafeExamBrowser.Configuration.UnitTests.csproj", "{9CDD03E7-ED65-409F-8C07-BD6F633A0170}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -222,6 +224,14 @@ Global
{7F012305-1125-47CE-9C2A-146C891C0924}.Release|Any CPU.Build.0 = Release|Any CPU
{7F012305-1125-47CE-9C2A-146C891C0924}.Release|x86.ActiveCfg = Release|x86
{7F012305-1125-47CE-9C2A-146C891C0924}.Release|x86.Build.0 = Release|x86
{9CDD03E7-ED65-409F-8C07-BD6F633A0170}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9CDD03E7-ED65-409F-8C07-BD6F633A0170}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9CDD03E7-ED65-409F-8C07-BD6F633A0170}.Debug|x86.ActiveCfg = Debug|x86
{9CDD03E7-ED65-409F-8C07-BD6F633A0170}.Debug|x86.Build.0 = Debug|x86
{9CDD03E7-ED65-409F-8C07-BD6F633A0170}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9CDD03E7-ED65-409F-8C07-BD6F633A0170}.Release|Any CPU.Build.0 = Release|Any CPU
{9CDD03E7-ED65-409F-8C07-BD6F633A0170}.Release|x86.ActiveCfg = Release|x86
{9CDD03E7-ED65-409F-8C07-BD6F633A0170}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View file

@ -8,6 +8,7 @@ build_script:
test_script:
- .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -target:"vstest.console.exe" -targetargs:"/logger:Appveyor SafeExamBrowser.Client.UnitTests\bin\%PLATFORM%\%CONFIGURATION%\SafeExamBrowser.Client.UnitTests.dll" -filter:"+[*]* -[*.UnitTests]*" -mergebyhash -output:"coverage.xml"
- .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -target:"vstest.console.exe" -targetargs:"/logger:Appveyor .\SafeExamBrowser.Communication.UnitTests\bin\%PLATFORM%\%CONFIGURATION%\SafeExamBrowser.Communication.UnitTests.dll" -filter:"+[*]* -[*.UnitTests]*" -mergebyhash -mergeoutput -output:"coverage.xml"
- .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -target:"vstest.console.exe" -targetargs:"/logger:Appveyor .\SafeExamBrowser.Configuration.UnitTests\bin\%PLATFORM%\%CONFIGURATION%\SafeExamBrowser.Configuration.UnitTests.dll" -filter:"+[*]* -[*.UnitTests]*" -mergebyhash -mergeoutput -output:"coverage.xml"
- .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -target:"vstest.console.exe" -targetargs:"/logger:Appveyor .\SafeExamBrowser.Core.UnitTests\bin\%PLATFORM%\%CONFIGURATION%\SafeExamBrowser.Core.UnitTests.dll" -filter:"+[*]* -[*.UnitTests]*" -mergebyhash -mergeoutput -output:"coverage.xml"
- .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -target:"vstest.console.exe" -targetargs:"/logger:Appveyor .\SafeExamBrowser.I18n.UnitTests\bin\%PLATFORM%\%CONFIGURATION%\SafeExamBrowser.I18n.UnitTests.dll" -filter:"+[*]* -[*.UnitTests]*" -mergebyhash -mergeoutput -output:"coverage.xml"
- .\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -target:"vstest.console.exe" -targetargs:"/logger:Appveyor .\SafeExamBrowser.Logging.UnitTests\bin\%PLATFORM%\%CONFIGURATION%\SafeExamBrowser.Logging.UnitTests.dll" -filter:"+[*]* -[*.UnitTests]*" -mergebyhash -mergeoutput -output:"coverage.xml"