diff --git a/SafeExamBrowser.Applications.Contracts/ApplicationInfo.cs b/SafeExamBrowser.Applications.Contracts/ApplicationInfo.cs index 58572d10..aa4a32b0 100644 --- a/SafeExamBrowser.Applications.Contracts/ApplicationInfo.cs +++ b/SafeExamBrowser.Applications.Contracts/ApplicationInfo.cs @@ -15,6 +15,11 @@ namespace SafeExamBrowser.Applications.Contracts /// public class ApplicationInfo { + /// + /// Indicates whether the application should be automatically started. + /// + public bool AutoStart { get; set; } + /// /// The name of the application. /// diff --git a/SafeExamBrowser.Applications/ApplicationFactory.cs b/SafeExamBrowser.Applications/ApplicationFactory.cs index 8e061650..99b6db3c 100644 --- a/SafeExamBrowser.Applications/ApplicationFactory.cs +++ b/SafeExamBrowser.Applications/ApplicationFactory.cs @@ -64,7 +64,7 @@ namespace SafeExamBrowser.Applications private IApplication BuildApplication(string executablePath, WhitelistApplication settings) { var icon = new IconResource { Type = IconResourceType.Embedded, Uri = new Uri(executablePath) }; - var info = new ApplicationInfo { Icon = icon, Name = settings.DisplayName, Tooltip = settings.Description ?? settings.DisplayName }; + var info = new ApplicationInfo { AutoStart = settings.AutoStart, Icon = icon, Name = settings.DisplayName, Tooltip = settings.Description ?? settings.DisplayName }; var application = new ExternalApplication(executablePath, info, logger.CloneFor(settings.DisplayName), processFactory); return application; diff --git a/SafeExamBrowser.Client.UnitTests/ClientControllerTests.cs b/SafeExamBrowser.Client.UnitTests/ClientControllerTests.cs index cbbe9da5..bdb48d94 100644 --- a/SafeExamBrowser.Client.UnitTests/ClientControllerTests.cs +++ b/SafeExamBrowser.Client.UnitTests/ClientControllerTests.cs @@ -9,6 +9,7 @@ using System; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; +using SafeExamBrowser.Applications.Contracts; using SafeExamBrowser.Browser.Contracts; using SafeExamBrowser.Browser.Contracts.Events; using SafeExamBrowser.Communication.Contracts.Data; @@ -624,6 +625,28 @@ namespace SafeExamBrowser.Client.UnitTests taskbar.Verify(t => t.Show(), Times.Never); } + [TestMethod] + public void Startup_MustAutoStartApplications() + { + var application1 = new Mock(); + var application2 = new Mock(); + var application3 = new Mock(); + + application1.SetupGet(a => a.Info).Returns(new ApplicationInfo { AutoStart = true }); + application2.SetupGet(a => a.Info).Returns(new ApplicationInfo { AutoStart = false }); + application3.SetupGet(a => a.Info).Returns(new ApplicationInfo { AutoStart = true }); + context.Applications.Add(application1.Object); + context.Applications.Add(application2.Object); + context.Applications.Add(application3.Object); + operationSequence.Setup(o => o.TryPerform()).Returns(OperationResult.Success); + + sut.TryStart(); + + application1.Verify(a => a.Start(), Times.Once); + application2.Verify(a => a.Start(), Times.Never); + application3.Verify(a => a.Start(), Times.Once); + } + [TestMethod] public void TerminationActivator_MustCorrectlyInitiateShutdown() { diff --git a/SafeExamBrowser.Client.UnitTests/Operations/BrowserOperationTests.cs b/SafeExamBrowser.Client.UnitTests/Operations/BrowserOperationTests.cs index 3eb4668c..a24d6384 100644 --- a/SafeExamBrowser.Client.UnitTests/Operations/BrowserOperationTests.cs +++ b/SafeExamBrowser.Client.UnitTests/Operations/BrowserOperationTests.cs @@ -11,6 +11,7 @@ using Moq; using SafeExamBrowser.Browser.Contracts; using SafeExamBrowser.Client.Operations; using SafeExamBrowser.Logging.Contracts; +using SafeExamBrowser.Settings; using SafeExamBrowser.UserInterface.Contracts; using SafeExamBrowser.UserInterface.Contracts.Shell; @@ -23,6 +24,7 @@ namespace SafeExamBrowser.Client.UnitTests.Operations private Mock browser; private ClientContext context; private Mock logger; + private AppSettings settings; private Mock taskbar; private Mock taskView; private Mock uiFactory; @@ -36,11 +38,13 @@ namespace SafeExamBrowser.Client.UnitTests.Operations browser = new Mock(); context = new ClientContext(); logger = new Mock(); + settings = new AppSettings(); taskbar = new Mock(); taskView = new Mock(); uiFactory = new Mock(); context.Browser = browser.Object; + context.Settings = settings; sut = new BrowserOperation(actionCenter.Object, context, logger.Object, taskbar.Object, taskView.Object, uiFactory.Object); } @@ -48,6 +52,9 @@ namespace SafeExamBrowser.Client.UnitTests.Operations [TestMethod] public void MustPeformCorrectly() { + settings.ActionCenter.EnableActionCenter = true; + settings.Taskbar.EnableTaskbar = true; + sut.Perform(); browser.Verify(c => c.Initialize(), Times.Once); @@ -66,6 +73,7 @@ namespace SafeExamBrowser.Client.UnitTests.Operations public void TODO() { // TODO: Test initialization of task view! + Assert.Fail("TODO"); } } } diff --git a/SafeExamBrowser.Client.UnitTests/Operations/ShellOperationTests.cs b/SafeExamBrowser.Client.UnitTests/Operations/ShellOperationTests.cs index a24e02d9..f36f4dec 100644 --- a/SafeExamBrowser.Client.UnitTests/Operations/ShellOperationTests.cs +++ b/SafeExamBrowser.Client.UnitTests/Operations/ShellOperationTests.cs @@ -172,9 +172,9 @@ namespace SafeExamBrowser.Client.UnitTests.Operations } [TestMethod] - public void Perform_MustInitializeTaskView() + public void TODO() { - // Only start activator if ALT+TAB enabled! + // TODO: Only start activator if ALT+TAB enabled! -> Perform_MustInitializeTaskView Assert.Fail("TODO"); } diff --git a/SafeExamBrowser.Client/ClientController.cs b/SafeExamBrowser.Client/ClientController.cs index cc41bec7..f26ecd93 100644 --- a/SafeExamBrowser.Client/ClientController.cs +++ b/SafeExamBrowser.Client/ClientController.cs @@ -105,7 +105,7 @@ namespace SafeExamBrowser.Client { RegisterEvents(); ShowShell(); - StartBrowser(); + AutoStartApplications(); var communication = runtime.InformClientReady(); @@ -239,10 +239,19 @@ namespace SafeExamBrowser.Client } } - private void StartBrowser() + private void AutoStartApplications() { logger.Info("Starting browser application..."); Browser.Start(); + + foreach (var application in context.Applications) + { + if (application.Info.AutoStart) + { + logger.Info($"Auto-starting '{application.Info.Name}'..."); + application.Start(); + } + } } private void ApplicationMonitor_ExplorerStarted()