public void Start_ServiceAppProcessCanStartSucessfully() { ILog log = Substitute.For <ILog>(); bool monitorMethodCalled = false; IProcessWrapperFactory procFactory = Substitute.For <IProcessWrapperFactory>(); procFactory.CreateProcess().Returns(new FakeStandardProcess()); var serviceApp = new ServiceApp { Name = "Test", AppVersion = new Version() }; ServiceAppProcess appProcToTest = new ServiceAppProcess(serviceApp, log, procFactory); appProcToTest.MonitorProcessCallback = () => { monitorMethodCalled = true; }; Task t = appProcToTest.Start(); bool success = t.Wait(500); if (!success) { Assert.Fail("Start() took too long to finish"); } log.DidNotReceive().Error(Arg.Any <object>(), Arg.Any <Exception>()); log.DidNotReceive().Warn(Arg.Any <object>(), Arg.Any <Exception>()); Assert.IsTrue(monitorMethodCalled, "MonitorProcessCallback() not called."); }
public void ProcessError_LoggingWorksWithUnrecognizedExceptionObject() { ILog log = Substitute.For <ILog>(); IProcessWrapperFactory procFactory = Substitute.For <IProcessWrapperFactory>(); procFactory.CreateProcess().Returns(new FakeStandardProcess()); var serviceApp = new ServiceApp { Name = "Test", AppVersion = new Version() }; ServiceAppProcess appProcToTest = new ServiceAppProcess(serviceApp, log, procFactory); Exception testException = new InvalidOperationException("test"); string exceptionMessage = string.Format(@"{{ error: {{ details: {{ type: ""{0}"", message: ""{1}"", source: ""{2}"", stackTrace: ""{3}"" }}, exception: ""xxxxx"" }} }}", testException.GetType().ToString(), testException.Message, testException.Source, testException.StackTrace); bool shouldExit = appProcToTest.ProcessMessage(exceptionMessage); log.Received().Warn(Arg.Any <string>()); Assert.IsFalse(shouldExit, "Process message was not meant to return true"); }
public void Constructor_ServiceAppProcessConstructorHasNoSurprises() { IProcessWrapperFactory procFactory = Substitute.For <IProcessWrapperFactory>(); procFactory.CreateProcess().Returns(new FakeStandardProcess()); ServiceAppProcess appProcToTest = new ServiceAppProcess( new ServiceApp { Name = "Test" }, Substitute.For <ILog>(), procFactory); }
public void ProcessMessage_DebugIsLogged() { ILog log = Substitute.For <ILog>(); IProcessWrapperFactory procFactory = Substitute.For <IProcessWrapperFactory>(); procFactory.CreateProcess().Returns(new FakeStandardProcess()); var serviceApp = new ServiceApp { Name = "Test", AppVersion = new Version() }; ServiceAppProcess appProcToTest = new ServiceAppProcess(serviceApp, log, procFactory); bool shouldExit = appProcToTest.ProcessMessage("{debug:\"test\"}"); log.Received().Debug("From Test: test"); Assert.IsFalse(shouldExit, "Process message was not meant to return true"); }
/// <summary> /// Creates the Process which will run the service app. /// </summary> private void CreateProcess() { _process = _processFactory.CreateProcess(); int sacsProcessId = Process.GetCurrentProcess().Id; ProcessStartInfo startInfo = new ProcessStartInfo(ServiceApp.AppFilePath); startInfo.WorkingDirectory = Path.GetDirectoryName(ServiceApp.AppFilePath); startInfo.UseShellExecute = false; startInfo.CreateNoWindow = true; startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.ErrorDialog = false; startInfo.RedirectStandardInput = true; startInfo.RedirectStandardOutput = true; startInfo.RedirectStandardError = true; if (ApplicationSettings.Current.EnableCustomUserLogins) { _process.ArgumentObject["name"] = ServiceApp.Name; _process.ArgumentObject["owner"] = sacsProcessId; if (!string.IsNullOrWhiteSpace(ServiceApp.Parameters)) { _process.ArgumentObject["parameters"] = ServiceApp.Parameters; } } else { // keeping this older feature until testing is complete. var arguments = new { name = ServiceApp.Name, action = "hide", owner = sacsProcessId, parameters = ServiceApp.Parameters }; startInfo.Arguments = JsonConvert.SerializeObject(arguments); } if (!string.IsNullOrWhiteSpace(ServiceApp.Username)) { startInfo.Domain = UserUtilities.GetDomain(ServiceApp.Username); startInfo.UserName = UserUtilities.GetUserName(ServiceApp.Username); } _process.StartInfo = startInfo; }