Inheritance: XMLSerializable
        public void EnsureJobsQueuedAfterMaxVMsRunningReached()
        {
            sut.EmulateServiceStart(null);
            DirectoryInfo tempDir = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tempdll"));
            tempDir.Create();
            string existingMaxVMSetting = ConfigurationManager.AppSettings["maxvms"];
            ConfigurationManager.AppSettings["maxvms"] = "1";
            try
            {
                List<ExecutablePackage> packages = new List<ExecutablePackage>();
                ExecutablePackage package = new ExecutablePackage("mock.xml", tempDir.FullName, "TestJobManager.dll", "TestJobManager.MockJobRunner", new SerializableDictionary<string, string>(), new SerializableDictionary<string, string>());
                packages.Add(package);
                Job j1 = new Job("nobuildpath", "MockVMConfig1", new SerializableDictionary<string, string>(), packages, new SerializableDictionary<string, string>());
                Job j2 = new Job("nobuildpath", "MockVMConfig2", new SerializableDictionary<string, string>(), packages, new SerializableDictionary<string, string>());
                MessageSendRecieve msr = new MessageSendRecieve(new DirectoryInfo(inboxPath), new DirectoryInfo(outboxPath));
                DateTime queuedJobsDateTime = DateTime.Now;
                string job2msgID = msr.QueueJob(j1);
                string job1msgID = msr.QueueJob(j2);
                //wait for job 1 to start
                Assert.True(WaitForVMAction(vmHash["MockVMName1"], VMActionType.Start, queuedJobsDateTime, TimeSpan.FromSeconds(5)));
                //make sure job 2 doesn't start/hasn't started
                Assert.False(WaitForVMAction(vmHash["MockVMName2"], VMActionType.Start, queuedJobsDateTime, TimeSpan.FromSeconds(1)));

                //send request for job 1
                AutomationMessage m = new AutomationMessage(new SimpleRequest(SimpleRequests.JobRequest));
                m.From = "MockVMName1";
                Job j = msr.WaitForJob(msr.Send(m), DEFAULT_WAIT);
                Assert.That(j, Is.Not.Null);
                //send finished for job 1
                DateTime finishedSentDateTime = DateTime.Now;
                msr.ReportJobStatus(new JobCompleted(j1, new JobResult()));

                //wait for job 2 to start
                Assert.True(WaitForVMAction(vmHash["MockVMName2"], VMActionType.Start, finishedSentDateTime, TimeSpan.FromSeconds(5)));
                //send request for job 2
                m = new AutomationMessage(new SimpleRequest(SimpleRequests.JobRequest));
                m.From = "MockVMName2";
                j = msr.WaitForJob(msr.Send(m), DEFAULT_WAIT);
                Assert.That(j, Is.Not.Null);
                //send finished for job2
                msr.ReportJobStatus(new JobCompleted(j2, new JobResult()));

                Assert.That(msr.WaitForJobCompletion(job1msgID, DEFAULT_WAIT), Is.Not.Null);
                Assert.That(msr.WaitForJobCompletion(job2msgID, DEFAULT_WAIT), Is.Not.Null);

                sut.EmulateServiceStop();

                VerifyAppLogDoesNotContain(EventLogEntryType.Warning, testStart);
                VerifyAppLogDoesNotContain(EventLogEntryType.Error, testStart);

                VerifyMockVMActionInvoked(vmHash["MockVMName1"], VMActionType.RevertToNamedSnapshot, "Snapshot1");
                VerifyMockVMActionInvoked(vmHash["MockVMName2"], VMActionType.RevertToNamedSnapshot, "Snapshot2");
            }
            finally
            {
                tempDir.Delete(true);
                ConfigurationManager.AppSettings["maxvms"] = existingMaxVMSetting;
            }
        }
 public void AddJob(Job j, JobStates state)
 {
     lock (JobsDictLock)
     {
         JobStatus js = new JobStatus();
         js.State = state;
         jobs.Add(j, js);
     }
 }
        public JobClient(ISystem localSystem)
        {
            this.system = localSystem;
            startupEntryAdded = false;
            ShutdownOnCompletion = false;
            j = null;
            baseDir = new DirectoryInfo(Path.Combine(Utilities.ExecutingAssembly.Directory.FullName, "TestDLL"));
            workerThread = new Thread(new ThreadStart(Run));

            workerThread.IsBackground = true;
        }
 public string QueueJob(Job j)
 {
     AutomationMessage m = new AutomationMessage(new JobCreate(j));
     j.OriginalMessageID = m.Id;
     return Send(m);
 }
        private JobStatus RunJob(IEnumerable<FileInfo> filesToCopy, List<ExecutablePackage> packages, SerializableDictionary<string, string> jobProperties, SerializableDictionary<string, string> isos)
        {
            if (filesToCopy == null)
            {
                filesToCopy = new List<FileInfo>();
            }
            if (packages == null)
            {
                packages = new List<ExecutablePackage>();
            }
            if (jobProperties == null)
            {
                jobProperties = new SerializableDictionary<string, string>();
            }
            if (isos == null)
            {
                isos = new SerializableDictionary<string, string>();
            }
            DirectoryInfo tempDir = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tempdll"));
            tempDir.Create();
            try
            {
                foreach (FileInfo file in filesToCopy)
                {
                    File.Copy(file.FullName, Path.Combine(tempDir.FullName, file.Name));
                }
                foreach (ExecutablePackage ep in packages)
                {
                    ep.ContentDirectory = tempDir.FullName;
                }
                Job j = new Job("test build path", "TestConfig", isos, packages, jobProperties);
                service.AddJob(j, JobStates.VMStarted);
                sut.Start();
                sut.WaitForExit();

                foreach (MockEvent evnt in mock.Events)
                {
                    System.Diagnostics.Debug.WriteLine(evnt.Time.ToString() + " " + evnt.EventType.ToString() + " " + evnt.Payload);
                }

                //wait for service to finish processing
                Thread.Sleep(1000);

                mock.VerifyEventOccured(MockEventType.UpdateStatus, "Requesting Jobs from Job Manager", false);
                mock.VerifyEventOccured(MockEventType.UpdateStatus, "Sent request with message id: ", true);
                mock.VerifyEventOccured(MockEventType.UpdateStatus, "Waiting for Job response from Job Manager", false);
                mock.VerifyEventOccured(MockEventType.UpdateStatus, "Found Job: " + j.JobID, false);
                //for (int i = 0; i < packages.Count; i++)
                //{
                //    mock.VerifyEventOccured(MockEventType.UpdateStatus, "Copying data from \"" + tempDir.FullName + "\" to \"" + Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestDLL\\" + i) + "\"", false);
                //}
                mock.VerifyEventOccured(MockEventType.UpdateStatus, "Sending Job Result", false);
                mock.VerifyEventOccured(MockEventType.UpdateStatus, "Job Result Sent", false);

                JobStatus js = service.GetJobStatus(j.JobID);
                Assert.That(js, Is.Not.Null);
                Assert.That(js.State, Is.EqualTo(JobStates.AutoFinished));
                Assert.That(js.Result, Is.Not.Null);
                Assert.That(js.Result.Logs, Is.Not.Empty);
                VerifyLogContainsString(js.Result.Logs, "Found Job: " + j.JobID);

                return js;
            }
            finally
            {
                tempDir.Delete(true);
            }
        }
        public void Run()
        {
            try
            {
                FileInfo mapNetBatchFile = new FileInfo(Path.Combine(Utilities.ExecutingAssembly.Directory.FullName, "map.bat"));
                //if the network drive is disconected, then we will be unable to get to the server inbox, in which case we should try to remap
                if (!AppConfig.ServerInbox.Exists && mapNetBatchFile.Exists)
                {
                    using (System.Diagnostics.Process p = new System.Diagnostics.Process())
                    {
                        p.StartInfo.WorkingDirectory = mapNetBatchFile.Directory.FullName;
                        p.StartInfo.FileName = mapNetBatchFile.Name;
                        p.StartInfo.CreateNoWindow = true;
                        p.StartInfo.UseShellExecute = true;
                        p.Start();
                        p.WaitForExit();
                    }
                }
                int packageToRun = 0;
                JobResult result = new JobResult();
                result.Completed = true;

                //string sendQueueName = @"FormatName:DIRECT=OS:hammerbuildvm\Private$\jobmanager";
                //string sendQueueName = @"FormatName:DIRECT=OS:ryanadams2\Private$\test2";
                //jci.LogString("Connecting to Job Manager receive queue (" + sendQueueName + ")");
                MessageSendRecieve msr = new MessageSendRecieve(AppConfig.ServerInbox, AppConfig.ServerOutbox);
                //jci.LogString("Permission = " + msr.RemoteMessageQueue.AccessMode.ToString());

                //look for an existing job to run/continue before getting a new job from the server
                FileInfo jobXML = new FileInfo(Path.Combine(Utilities.ExecutingAssembly.Directory.FullName, "job.xml"));
                if (jobXML.Exists)
                {
                    using (TextReader tr = new StreamReader(jobXML.FullName))
                    {
                        j = XMLSerializable.FromXML<Job>(tr.ReadToEnd());
                        if (j.Properties.ContainsKey("PackageToRun"))
                        {
                            packageToRun = Int32.Parse(j.Properties["PackageToRun"]);
                        }
                    }
                    try
                    {
                        //rename the job file so the next run doesn't automatically use it.  The job.xml file will be put back
                        //as part of jci.StartupOnNextRun if it is meant to be continued after a restart
                        string lastFile = jobXML.FullName + ".old";
                        if(File.Exists(lastFile))
                        {
                            File.Delete(lastFile);
                        }
                        File.Move(jobXML.FullName, lastFile);
                    }
                    catch (Exception ex)
                    {
                        //if the delete fails lets log it, but it isn't critical so let's eat the exception
                        LogString("Could not delete existing job.xml file: " + ex.ToString());
                    }
                    //look for an existing JobResult to pull in
                    FileInfo jobResultXML = new FileInfo(Path.Combine(Utilities.ExecutingAssembly.Directory.FullName, "jobresult.xml"));
                    if (jobResultXML.Exists)
                    {
                        try
                        {
                            using (TextReader tr = new StreamReader(jobResultXML.FullName))
                            {
                                result = XMLSerializable.FromXML<JobResult>(tr.ReadToEnd());
                            }
                        }
                        catch (Exception ex)
                        {
                            //log, but eat it
                            LogString(ex.ToString());
                        }
                    }
                }
                else
                {
                    LogString("Requesting Jobs from Job Manager");
                    string messageID = msr.RequestJob();
                    LogString("Sent request with message id: " + messageID);

                    LogString("Waiting for Job response from Job Manager");
                    j = msr.WaitForJob(messageID, DEFAULT_JOB_WAIT);
                    if (j == null)
                    {
                        LogString("No Jobs Available");
                        return;
                    }
                    try
                    {
                        LogString("Found Job: " + j.JobID);

                        if (baseDir.Exists)
                        {
                            baseDir.Delete(true);
                            //TODO wait for files to be deleted?
                        }
                        baseDir.Create();

                        List<string> keys = new List<string>(j.ISOs.Keys);
                        foreach (string isoName in keys)
                        {
                            FileInfo isoPath = new FileInfo(j.ISOs[isoName]);
                            string destPath = Path.Combine(Utilities.ExecutingAssembly.Directory.FullName, isoPath.Name);
                            LogString("Copying ISO from \"" + isoPath.Directory.FullName + "\" to \"" + destPath + "\"");
                            isoPath.CopyTo(destPath);
                            j.ISOs[isoName] = destPath;
                        }

                        if (j.Properties == null)
                        {
                            j.Properties = new SerializableDictionary<string, string>();
                        }
                    }
                    catch (Exception ex)
                    {
                        LogString(ex.ToString());
                        result.Completed = false;
                        ExecutionResult er = new ExecutionResult(ex.ToString(), null);
                        result.ExecutionResults.Add(er);
                        Logger.Instance.Pause();
                        result.Logs.Add(FileData.FromFile(new FileInfo(Logger.Instance.FileName)));
                        Logger.Instance.Resume();
                        LogString("Sending Job Result");
                        msr.ReportJobStatus(new JobCompleted(j, result));
                        LogString("Job Result Sent");
                        return;
                    }
                }
                if (j.Packages.Count == 0)
                {
                    Logger.Instance.Pause();
                    result.Logs.Add(FileData.FromFile(new FileInfo(Logger.Instance.FileName)));
                    Logger.Instance.Resume();
                }
                while (packageToRun < j.Packages.Count)
                {
                    runningPackageDir = new DirectoryInfo(Path.Combine(baseDir.FullName, packageToRun.ToString()));

                    ExecutablePackage ep = j.Packages[packageToRun];
                    runningPackage = ep;
                    ExecutionResult er = new ExecutionResult();
                    try
                    {
                        if (!ep.ContentDirectory.ToLower().Equals(runningPackageDir.FullName.ToLower()))
                        {
                            if (runningPackageDir.Exists)
                            {
                                runningPackageDir.Delete(true);
                            }
                            runningPackageDir.Create();

                            LogString("Copying data from \"" + ep.ContentDirectory + "\" to \"" + runningPackageDir.FullName + "\"");
                            DirectoryData.FromDirectory(new DirectoryInfo(ep.ContentDirectory)).DumpContentsToDir(runningPackageDir);
                            ep.ContentDirectory = runningPackageDir.FullName;
                        }
                        LogString("Loading external test DLL: " + ep.JobRunnerDLLName + " , " + ep.JobRunnerClassName);
                        JobRunner jr = LoadJobRunner(ep.JobRunnerClassName, Path.Combine(runningPackageDir.FullName, ep.JobRunnerDLLName));

                        LogString("Executing Execute() method on external DLL");

                        er = jr.Execute(this);
                    }
                    catch (Exception ex)
                    {
                        LogString(ex.ToString());
                        result.Completed = false;
                        er = new ExecutionResult(ex.ToString(), null);
                    }

                    Logger.Instance.Pause();
                    result.Logs.Add(FileData.FromFile(new FileInfo(Logger.Instance.FileName)));
                    Logger.Instance.Resume();

                    if (er != null)
                    {
                        result.ExecutionResults.Add(er);
                    }

                    //lets save the current job result
                    using (TextWriter tw = new StreamWriter(Path.Combine(Utilities.ExecutingAssembly.Directory.FullName, "jobresult.xml"), false))
                    {
                        tw.Write(result.ToXML());
                    }

                    if (er == null)
                    {
                        //The automation is likely not finished, the computer is likely going to reboot and
                        //we want this execution to continue after reboot so we should exit now instead of going to the next package.
                        //the executable package should have already called startuponnextrun
                        return;
                    }

                    if (!er.Success)
                    {
                        //stop on first error
                        break;
                    }

                    packageToRun++;
                    j.Properties["PackageToRun"] = packageToRun.ToString();
                    if (er.Success && er.RestartAfter)
                    {
                        StartupOnNextRun();
                        LogString("Restarting ...");
                        system.Shutdown(true);
                        return;
                    }
                }
                LogString("Sending Job Result");
                msr.ReportJobStatus(new JobCompleted(j, result));
                LogString("Job Result Sent");
                //cleanup
                if (File.Exists(Path.Combine(Utilities.ExecutingAssembly.Directory.FullName, "jobresult.xml")))
                {
                    File.Delete(Path.Combine(Utilities.ExecutingAssembly.Directory.FullName, "jobresult.xml"));
                }
                if (ShutdownOnCompletion)
                {
                    LogString("Shuting Down ...");
                    system.Shutdown(false);

                    //so, lets exit the program
                    System.Windows.Forms.Application.Exit();
                }
            }
            catch (ThreadAbortException)
            {
                //eat it, get out right away.  Program is exiting or user has stopped automation
                return;
            }
            catch (Exception e)
            {
                LogString("Exception in thread: "+e.ToString());
                return;
            }
        }
        public List<Job> CreateJobs(string pathToBuildOutput)
        {
            var jobCollection = jobCollections[0];

            Dictionary<string, List<Job>> jobsToRun = new Dictionary<string, List<Job>>();

            foreach (var jobRef in jobCollection.Job)
            {
                List<string> definedBy = new List<string>();
                definedBy.Add(jobRef.JobPath);
                var job = jobMap[jobRef.JobPath];
                SerializableDictionary<string, string> isos = new SerializableDictionary<string, string>();
                foreach (var isoRef in job.ISOs)
                {
                    definedBy.Add(isoRef.Target);
                    var iso = isoMap[isoRef.Target];
                    string isoPath = iso.Path;
                    if (iso.PathType == JobManagerInterfaces.XML.ISOPathType.BuildRelative)
                    {
                        isoPath = Path.Combine(pathToBuildOutput, isoPath);
                    }

                    isos[isoRef.Key] = isoPath;
                }

                SerializableDictionary<string, string> properties = new SerializableDictionary<string, string>();

                foreach (var property in job.Properties)
                {
                    properties[property.Key] = property.Value;
                }

                List<ExecutablePackage> packages = new List<ExecutablePackage>();
                var sequence = sequenceMap[job.ExecutableSequence];
                definedBy.Add(job.ExecutableSequence);

                foreach (string packagePath in sequence.Package)
                {
                    definedBy.Add(packagePath);
                    var package = packageMap[packagePath];
                    string dir = package.MainDirectory.Path;
                    if (package.MainDirectory.PathType == JobManagerInterfaces.XML.PathTPathType.BuildRelative)
                    {
                        dir = Path.Combine(pathToBuildOutput, dir);
                    }

                    SerializableDictionary<string, string> subDirectories = new SerializableDictionary<string, string>();

                    foreach (var subDirectory in package.AdditionalSubDirectories)
                    {
                        string name = subDirectory.Name;
                        if (String.IsNullOrEmpty(name))
                        {
                            name = Path.GetDirectoryName(subDirectory.Path);
                        }
                        if (subDirectory.PathType == JobManagerInterfaces.XML.PathTPathType.BuildRelative)
                        {
                            subDirectories[name] = Path.Combine(pathToBuildOutput, subDirectory.Path);
                        }
                        else if (subDirectory.PathType == JobManagerInterfaces.XML.PathTPathType.Absolute)
                        {
                            subDirectories[name] = subDirectory.Path;
                        }
                    }

                    SerializableDictionary<string, string> packageProperties = new SerializableDictionary<string, string>();

                    foreach (var property in package.Properties)
                    {
                        packageProperties[property.Key] = property.Value;
                    }

                    packages.Add(new ExecutablePackage(packagePath, dir, package.DLLFileName, package.JobRunnerClassName, subDirectories, packageProperties));
                }

                foreach (var configPath in job.Configurations)
                {
                    SerializableDictionary<string, string> jobProperties = new SerializableDictionary<string, string>(properties);
                    var config = configMap[configPath];
                    foreach (var property in config.Properties)
                    {
                        if (!jobProperties.ContainsKey(property.Key))
                        {
                            jobProperties[property.Key] = property.Value;
                        }
                    }
                    Job j = new Job(pathToBuildOutput, config.VM, isos, packages, jobProperties);
                    j.ConfigurationXML = configPath;
                    j.JobXML = jobRef.JobPath;
                    j.SequenceXML = job.ExecutableSequence;
                    if (!jobsToRun.ContainsKey(jobRef.JobPath))
                    {
                        jobsToRun[jobRef.JobPath] = new List<Job>();
                    }
                    jobsToRun[jobRef.JobPath].Add(j);
                }
            }

            foreach (var jobRef in jobCollection.Job)
            {
                var baseJobPath = jobRef.DependsOn;
                if (baseJobPath != null)
                {
                    foreach (Job baseJob in jobsToRun[baseJobPath])
                    {
                        foreach (Job j in jobsToRun[jobRef.JobPath])
                        {
                            j.DependsOnJobIds.Add(baseJob.JobID);
                        }
                    }
                }
            }

            List<Job> jobs = new List<Job>();

            foreach (List<Job> jobList in jobsToRun.Values)
            {
                foreach (Job j in jobList)
                {
                    jobs.Add(j);
                }
            }
            return jobs;
        }
 public JobReturn(Job j)
 {
     this.j = j;
 }
 public JobCreate(Job j)
 {
     this.j = j;
 }
 public JobCompleted(Job j, JobResult jr)
     : base()
 {
     this.Job = j;
     this.Result = jr;
 }
        public void TestRunNonExistantVMConfig()
        {
            sut.EmulateServiceStart(null);
            List<ExecutablePackage> packages = new List<ExecutablePackage>();
            Job j1 = new Job("nobuildpath", "NonExistantVMConfig", new SerializableDictionary<string, string>(), null, new SerializableDictionary<string, string>());
            MessageSendRecieve msr = new MessageSendRecieve(new DirectoryInfo(inboxPath), new DirectoryInfo(outboxPath));
            DateTime queuedJobsDateTime = DateTime.Now;
            string job1msgID = msr.QueueJob(j1);

            //wait for job completion
            JobCompleted jobCompleted = msr.WaitForJobCompletion(job1msgID, DEFAULT_WAIT);

            sut.EmulateServiceStop();

            Assert.That(jobCompleted, Is.Not.Null);
            Assert.That(jobCompleted.Job, Is.Not.Null);
            Assert.That(jobCompleted.Result, Is.Not.Null);
            Assert.That(jobCompleted.Result.Errors, Is.Not.Empty);
            VerifyStringInList(jobCompleted.Result.Errors, "Could not find a VM suitable for this configuration(NonExistantVMConfig)");

            VerifyAppLogDoesNotContain(EventLogEntryType.Warning, testStart);
            VerifyAppLogDoesNotContain(EventLogEntryType.Error, testStart);
        }
        public void TestNullPackageList()
        {
            sut.EmulateServiceStart(null);
            Job j1 = new Job("nobuildpath", "MockVMConfig1", new SerializableDictionary<string, string>(), null, new SerializableDictionary<string, string>());
            MessageSendRecieve msr = new MessageSendRecieve(new DirectoryInfo(inboxPath), new DirectoryInfo(outboxPath));
            DateTime queuedJobsDateTime = DateTime.Now;
            string job1msgID = msr.QueueJob(j1);

            //wait for job completion
            JobCompleted jobCompleted = msr.WaitForJobCompletion(job1msgID, DEFAULT_WAIT);

            sut.EmulateServiceStop();

            VerifyAppLogDoesNotContain(EventLogEntryType.Warning, testStart);
            VerifyAppLogDoesNotContain(EventLogEntryType.Error, testStart);

            Assert.That(jobCompleted, Is.Not.Null);
            Assert.That(jobCompleted.Job, Is.Not.Null);
            Assert.That(jobCompleted.Result, Is.Not.Null);
            Assert.That(jobCompleted.Result.Errors, Is.Not.Empty);
            VerifyStringInList(jobCompleted.Result.Errors, "Job does not have any packages defined");
        }
        public void TestNullISOs()
        {
            sut.EmulateServiceStart(null);
            DirectoryInfo tempDir = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tempdll"));
            tempDir.Create();
            try
            {
                List<ExecutablePackage> packages = new List<ExecutablePackage>();
                ExecutablePackage package = new ExecutablePackage("mock.xml", tempDir.FullName, "TestJobManager.dll", "TestJobManager.MockJobRunner", new SerializableDictionary<string, string>(), new SerializableDictionary<string, string>());
                packages.Add(package);

                Job j1 = new Job(null, "MockVMConfig1", null, packages, new SerializableDictionary<string, string>());
                MessageSendRecieve msr = new MessageSendRecieve(new DirectoryInfo(inboxPath), new DirectoryInfo(outboxPath));
                DateTime queuedJobsDateTime = DateTime.Now;
                string job1msgID = msr.QueueJob(j1);

                //wait for job 1 to start
                Assert.True(WaitForVMAction(vmHash["MockVMName1"], VMActionType.Start, queuedJobsDateTime, TimeSpan.FromSeconds(5)));

                //send request for job 1
                AutomationMessage m = new AutomationMessage(new SimpleRequest(SimpleRequests.JobRequest));
                m.From = "MockVMName1";
                Job j = msr.WaitForJob(msr.Send(m), DEFAULT_WAIT);
                Assert.That(j, Is.Not.Null);
                Assert.That(j.JobID, Is.EqualTo(j1.JobID));

                //send finished for job 1
                DateTime finishedSentDateTime = DateTime.Now;
                JobResult jr = new JobResult();
                jr.Completed = true;
                ExecutionResult er = new ExecutionResult();
                er.Success = true;
                jr.ExecutionResults.Add(er);
                msr.ReportJobStatus(new JobCompleted(j1, jr));

                //wait for job completion
                JobCompleted jobCompleted = msr.WaitForJobCompletion(job1msgID, DEFAULT_WAIT);

                sut.EmulateServiceStop();

                VerifyAppLogDoesNotContain(EventLogEntryType.Warning, testStart);
                VerifyAppLogDoesNotContain(EventLogEntryType.Error, testStart);

                Assert.That(jobCompleted, Is.Not.Null);
                Assert.That(jobCompleted.Job, Is.Not.Null);
                Assert.That(jobCompleted.Result, Is.Not.Null);
                Assert.That(jobCompleted.Result.Errors, Is.Empty);
                Assert.That(jobCompleted.Result.Success, Is.True);
                Assert.That(jobCompleted.Result.Completed, Is.True);
            }
            finally
            {
                tempDir.Delete(true);
            }
        }
        public void TestNullDirPathInJob()
        {
            sut.EmulateServiceStart(null);
            List<ExecutablePackage> packages = new List<ExecutablePackage>();
            ExecutablePackage package = new ExecutablePackage("mock.xml", null, "TestJobManager.dll", "TestJobManager.MockJobRunner", new SerializableDictionary<string, string>(), new SerializableDictionary<string, string>());
            packages.Add(package);
            Job j1 = new Job("nobuildpath", "MockVMConfig1", new SerializableDictionary<string, string>(), packages, new SerializableDictionary<string, string>());
            MessageSendRecieve msr = new MessageSendRecieve(new DirectoryInfo(inboxPath), new DirectoryInfo(outboxPath));
            DateTime queuedJobsDateTime = DateTime.Now;
            string job1msgID = msr.QueueJob(j1);

            //wait for job completion
            JobCompleted jobCompleted = msr.WaitForJobCompletion(job1msgID, DEFAULT_WAIT);

            sut.EmulateServiceStop();

            Assert.That(jobCompleted, Is.Not.Null);
            Assert.That(jobCompleted.Job, Is.Not.Null);
            Assert.That(jobCompleted.Result, Is.Not.Null);
            Assert.That(jobCompleted.Result.Errors, Is.Not.Empty);
            VerifyStringInList(jobCompleted.Result.Errors, "Exception: Value cannot be null.\nParameter name: path");

            VerifyAppLogDoesNotContain(EventLogEntryType.Warning, testStart);
            VerifyAppLogDoesNotContain(EventLogEntryType.Error, testStart);
        }
 public FullJob(Job j, JobStatus js)
 {
     this.Job = j;
     this.Status = js;
 }