コード例 #1
0
        public void OnlyHighPriorityJobsWillBeGivenTheLastWfsNode()
        {
            var wfsPluginMock = CreateWfsMock("1");

            wfsPluginMock.SetupGet(p => p.Busy).Returns(false);
            wfsPluginMock.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);
            var planner = new SimplePlanner(new List <IPlugin> {
                wfsPluginMock.Object
            }, JobRepository, Logging, _callBackService.Object);
            var jobMedium = CreateNewWfsJob();

            jobMedium.Priority = Priority.medium;
            JobRepository.Add(jobMedium);
            planner.Calculate();

            // Medium prio job will be started with only one wfs node
            Assert.That(JobRepository.WaitingJobs().Count(), Is.EqualTo(0));
            Assert.That(JobRepository.ActiveJobs().Count(), Is.EqualTo(1));
            JobRepository.Reset();
            jobMedium          = CreateNewWfsJob();
            jobMedium.Priority = Priority.medium;
            JobRepository.Add(jobMedium);
            var jobHigh = CreateNewWfsJob();

            jobHigh.Priority = Priority.high;

            JobRepository.Add(jobHigh);
            planner.Calculate();

            // High prio job will start with one wfs node
            Assert.That(JobRepository.ActiveJobs().First().Urn, Is.EqualTo(jobHigh.Urn));
            Assert.That(JobRepository.WaitingJobs().First().Urn, Is.EqualTo(jobMedium.Urn));

            JobRepository.ActiveJobs().First().Plan.GetCurrentTask().State = ExecutionState.Done;
            JobRepository.ActiveJobs().First().Plan.MoveToNextTask();

            JobRepository.Reset();
            var wfsPluginMock2 = CreateWfsMock("2");

            wfsPluginMock2.SetupGet(p => p.Busy).Returns(false);
            wfsPluginMock2.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);
            planner = new SimplePlanner(new List <IPlugin> {
                wfsPluginMock.Object, wfsPluginMock2.Object
            }, JobRepository, Logging, _callBackService.Object);

            var jobMedium2 = CreateNewWfsJob();

            jobMedium2.Priority = Priority.medium;
            JobRepository.Add(jobMedium2);
            planner.Calculate();

            // Medium prio job will start with two wfs nodes
            Assert.That(JobRepository.ActiveJobs().First().Urn, Is.EqualTo(jobMedium2.Urn));
            Assert.That(JobRepository.WaitingJobs().Count(), Is.EqualTo(0));
        }
コード例 #2
0
        public void PlanAJobWithMuxingTest()
        {
            var wfsPluginMock = CreateWfsMock("1");

            wfsPluginMock.SetupGet(p => p.Busy).Returns(false);
            wfsPluginMock.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);
            var ffmpegPluginMock = CreateFFMpegMock("1");

            ffmpegPluginMock.SetupGet(p => p.Busy).Returns(false);
            ffmpegPluginMock.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);
            var planner = new SimplePlanner(new List <IPlugin> {
                wfsPluginMock.Object, ffmpegPluginMock.Object
            }, JobRepository, Logging, _callBackService.Object);
            var audioJob = CreateNewAudioMuxJob();

            JobRepository.Add(audioJob);
            Assert.That(JobRepository.WaitingJobs().Count(), Is.EqualTo(1));
            Assert.That(JobRepository.ActiveJobs().Count(), Is.EqualTo(0));
            planner.Calculate();
            ffmpegPluginMock.Verify(x => x.CheckAndEstimate(It.IsAny <ExecutionTask>()), Times.Exactly(1), "ffmpeg plugin should only be called once for muxing");
            wfsPluginMock.Verify(x => x.CheckAndEstimate(It.IsAny <ExecutionTask>()), Times.Exactly(1), "Wfs plugin should only be called once for transcoding");
            Assert.That(JobRepository.WaitingJobs().Count(), Is.EqualTo(0));
            Assert.That(JobRepository.ActiveJobs().Count(), Is.EqualTo(1));
            var dbMuxJob = JobRepository.ActiveJobs().First();

            Assert.That(dbMuxJob.Plan.Tasks.Count(), Is.EqualTo(2));
            Assert.That(dbMuxJob.Plan.Tasks[0].PluginUrn, Is.EqualTo(ffmpegPluginMock.Object.Urn));
            Assert.That(dbMuxJob.Plan.Tasks[1].PluginUrn, Is.EqualTo(wfsPluginMock.Object.Urn));
        }
コード例 #3
0
        public void PlanTwoJobsWithMultipleTranscodingPluginsTest()
        {
            var wfsPluginMock = CreateWfsMock("1");

            wfsPluginMock.SetupGet(p => p.Busy).Returns(false);
            wfsPluginMock.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);
            var ffmpegPluginMock = CreateFFMpegMock("1");

            ffmpegPluginMock.SetupGet(p => p.Busy).Returns(false);
            ffmpegPluginMock.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);
            var planner = new SimplePlanner(new List <IPlugin> {
                wfsPluginMock.Object, ffmpegPluginMock.Object
            }, JobRepository, Logging, _callBackService.Object);
            var audioJob = CreateNewFFMpegJob();
            var videoJob = CreateNewWfsJob();

            JobRepository.Add(audioJob);
            JobRepository.Add(videoJob);
            Assert.That(JobRepository.WaitingJobs().Count(), Is.EqualTo(2));
            Assert.That(JobRepository.ActiveJobs().Count(), Is.EqualTo(0));
            planner.Calculate();
            ffmpegPluginMock.Verify(x => x.CheckAndEstimate(It.IsAny <ExecutionTask>()), Times.Once(), "ffmpeg plugin should only be called once");
            wfsPluginMock.Verify(x => x.CheckAndEstimate(It.IsAny <ExecutionTask>()), Times.Once(), "Wfs plugin should only be called once");
            Assert.That(JobRepository.WaitingJobs().Count(), Is.EqualTo(0));
            Assert.That(JobRepository.ActiveJobs().Count(), Is.EqualTo(2));
            var dbAudioJob = JobRepository.ActiveJobs().First(j =>
                                                              j.Plan.Tasks.First().PluginUrn == ffmpegPluginMock.Object.Urn);
            var dbVideoJob = JobRepository.ActiveJobs().First(j =>
                                                              j.Plan.Tasks.First().PluginUrn == wfsPluginMock.Object.Urn);

            Assert.That(dbAudioJob.Urn, Is.EqualTo(audioJob.Urn));
            Assert.That(dbVideoJob.Urn, Is.EqualTo(videoJob.Urn));
        }
コード例 #4
0
        public void CalculateDoesNotReserveTheLastFFmpegPluginForHighPriorityOnly()
        {
            var wfsPluginMock = CreateFFMpegMock("1");

            wfsPluginMock.SetupGet(p => p.Busy).Returns(false);
            wfsPluginMock.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);

            var wfsPluginMock2 = CreateFFMpegMock("2");

            wfsPluginMock2.SetupGet(p => p.Busy).Returns(false);
            wfsPluginMock2.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);
            var planner = new SimplePlanner(new List <IPlugin> {
                wfsPluginMock.Object, wfsPluginMock2.Object
            }, JobRepository, Logging, _callBackService.Object);

            var jobMedium = CreateNewFFMpegJob();

            jobMedium.Priority = Priority.medium;
            JobRepository.Add(jobMedium);

            var jobLow = CreateNewFFMpegJob();

            jobLow.Priority = Priority.low;
            JobRepository.Add(jobLow);
            planner.Calculate();

            Assert.That(JobRepository.WaitingJobs().Count(), Is.EqualTo(0));
            Assert.That(JobRepository.ActiveJobs().Count(), Is.EqualTo(2));
        }
コード例 #5
0
        public void PlannerUsesRenamePluginIfDestinationEssenceFilenameIsPresent()
        {
            var wfsPluginMock = CreateWfsMock("1");

            wfsPluginMock.SetupGet(p => p.Busy).Returns(false);
            wfsPluginMock.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);
            var fileRenamerPluginMock = CreateFileRenamerMock("1");

            fileRenamerPluginMock.SetupGet(p => p.Busy).Returns(false);
            fileRenamerPluginMock.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);

            var planner = new SimplePlanner(new List <IPlugin> {
                wfsPluginMock.Object, fileRenamerPluginMock.Object
            }, JobRepository, Logging, _callBackService.Object);
            var job = CreateNewWfsJob();

            job.Destination.Files = new List <EssenceFile> {
                EssenceFile.Template("NewName_%index%.%ext%")
            };
            var jobUrn = job.Urn;

            JobRepository.Add(job);
            planner.Calculate();
            Assert.That(JobRepository.Get(jobUrn).Plan.Tasks.Count, Is.EqualTo(2));
            Assert.That(JobRepository.Get(jobUrn).Plan.Tasks[1].PluginUrn, Is.EqualTo(fileRenamerPluginMock.Object.Urn));
        }
コード例 #6
0
        public void MaxFiveMinutesJobsWillBeTreatedAsHighPriorityJobsAndBeGivenTheLastWfsNode()
        {
            var wfsPluginMock = CreateWfsMock("1");

            wfsPluginMock.SetupGet(p => p.Busy).Returns(false);
            wfsPluginMock.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);
            var wfsPluginMock2 = CreateWfsMock("2");

            wfsPluginMock2.SetupGet(p => p.Busy).Returns(false);
            wfsPluginMock2.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);
            var planner = new SimplePlanner(new List <IPlugin> {
                wfsPluginMock.Object, wfsPluginMock2.Object
            }, JobRepository, Logging, _callBackService.Object);

            var jobHighPrio = CreateNewWfsJob();

            jobHighPrio.Priority = Priority.high;
            JobRepository.Add(jobHighPrio);

            var jobMediumPrioLong = CreateNewWfsJob();

            jobMediumPrioLong.Priority        = Priority.medium;
            jobMediumPrioLong.Source.Duration = 300001;
            JobRepository.Add(jobMediumPrioLong);
            planner.Calculate();

            // Medium prio long job (more than 5 min) will not start if one node left
            Assert.That(JobRepository.WaitingJobs().First().Urn, Is.EqualTo(jobMediumPrioLong.Urn));

            JobRepository.Reset();
            var jobMediumPrioShort = CreateNewWfsJob();

            jobMediumPrioShort.Priority        = Priority.medium;
            jobMediumPrioShort.Source.Duration = 30000;
            JobRepository.Add(jobMediumPrioShort);
            JobRepository.Add(jobHighPrio);
            planner.Calculate();

            // Medium prio short job (less than 5 min) will start if one node left
            Assert.That(JobRepository.WaitingJobs().Count(), Is.EqualTo(0));
            Assert.That(JobRepository.ActiveJobs().Select(t => t.Urn == jobMediumPrioShort.Urn), Is.Not.Null);
        }
コード例 #7
0
        public void PlanAnAudioJobWhileMuxingTest()
        {
            var wfsPluginMock = CreateWfsMock("1");

            wfsPluginMock.SetupGet(p => p.Busy).Returns(false);
            wfsPluginMock.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);
            var ffmpegPluginMock = CreateFFMpegMock("1");

            ffmpegPluginMock.SetupGet(p => p.Busy).Returns(false);
            ffmpegPluginMock.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);
            var planner = new SimplePlanner(new List <IPlugin> {
                wfsPluginMock.Object, ffmpegPluginMock.Object
            }, JobRepository, Logging, _callBackService.Object);

            //Plan the mux job
            var muxJob = CreateNewAudioMuxJob();

            JobRepository.Add(muxJob);
            planner.Calculate();

            //Advance muxjob progress to wfs, leaving the ffmpeg plugin free
            var dbMuxJob = JobRepository.ActiveJobs().First();

            dbMuxJob.Plan.Tasks[0].State = ExecutionState.Done;
            dbMuxJob.Plan.Tasks[1].State = ExecutionState.Running;
            JobRepository.Update(dbMuxJob);

            //Plan the audio trancoding job
            var audioJob = CreateNewFFMpegJob();

            JobRepository.Add(audioJob);
            planner.Calculate();

            //Check both jobs are running
            Assert.That(JobRepository.WaitingJobs().Count(), Is.EqualTo(0));
            Assert.That(JobRepository.ActiveJobs().Count(), Is.EqualTo(2));
        }
コード例 #8
0
        public void PlanOneJobTest()
        {
            var wfsPluginMock = CreateWfsMock("1");

            wfsPluginMock.SetupGet(p => p.Busy).Returns(false);
            wfsPluginMock.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);
            var planner = new SimplePlanner(new List <IPlugin> {
                wfsPluginMock.Object
            }, JobRepository, Logging, _callBackService.Object);
            var job    = CreateNewWfsJob();
            var jobUrn = job.Urn;

            JobRepository.Add(job);
            Assert.That(JobRepository.WaitingJobs().Count(), Is.EqualTo(1));
            Assert.That(JobRepository.ActiveJobs().Count(), Is.EqualTo(0));
            planner.Calculate();
            Assert.That(JobRepository.WaitingJobs().Count(), Is.EqualTo(0));
            Assert.That(JobRepository.ActiveJobs().Count(), Is.EqualTo(1));
            Assert.That(JobRepository.ActiveJobs().First().Urn, Is.EqualTo(jobUrn));
        }
コード例 #9
0
        public void PrioritySortTest()
        {
            var jobDue1DayLow = CreateNewWfsJob(dueDate: TimeProvider.GetUtcNow().AddDays(1));

            jobDue1DayLow.Priority = Priority.low;
            JobRepository.Add(jobDue1DayLow);
            var jobDue1DayHigh = CreateNewWfsJob(dueDate: TimeProvider.GetUtcNow().AddDays(1));

            jobDue1DayHigh.Priority = Priority.high;
            JobRepository.Add(jobDue1DayHigh);
            var jobDueNowDayLow = CreateNewWfsJob();

            jobDueNowDayLow.Priority = Priority.low;
            JobRepository.Add(jobDueNowDayLow);
            var jobDueNowDayHigh = CreateNewWfsJob();

            jobDueNowDayHigh.Priority = Priority.high;
            JobRepository.Add(jobDueNowDayHigh);
            Assert.That(JobRepository.WaitingJobs().Count(), Is.EqualTo(4));

            var wfsPluginMock  = CreateWfsMock("1");
            var wfsPluginMock2 = CreateWfsMock("2");

            wfsPluginMock.SetupGet(p => p.Busy).Returns(false);
            wfsPluginMock.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);
            wfsPluginMock2.SetupGet(p => p.Busy).Returns(false);
            wfsPluginMock2.Setup(p => p.CheckAndEstimate(It.IsAny <ExecutionTask>())).Returns(true);
            var planner = new SimplePlanner(new List <IPlugin> {
                wfsPluginMock.Object, wfsPluginMock2.Object
            }, JobRepository, Logging, _callBackService.Object);

            planner.Calculate();
            var activeJob = JobRepository.ActiveJobs().First(m => m.Id == jobDueNowDayHigh.Id);

            Assert.That(activeJob.Urn, Is.EqualTo(jobDueNowDayHigh.Urn));
            activeJob.Plan.GetCurrentTask().State = ExecutionState.Done;
            activeJob.Plan.MoveToNextTask();
            JobRepository.Update(activeJob);

            planner.Calculate();
            activeJob = JobRepository.ActiveJobs().First(m => m.Id == jobDue1DayHigh.Id);
            Assert.That(activeJob.Urn, Is.EqualTo(jobDue1DayHigh.Urn));
            activeJob.Plan.GetCurrentTask().State = ExecutionState.Done;
            activeJob.Plan.MoveToNextTask();
            JobRepository.Update(activeJob);

            planner.Calculate();
            activeJob = JobRepository.ActiveJobs().First(m => m.Id == jobDueNowDayLow.Id);
            Assert.That(activeJob.Urn, Is.EqualTo(jobDueNowDayLow.Urn));
            activeJob.Plan.GetCurrentTask().State = ExecutionState.Done;
            activeJob.Plan.MoveToNextTask();
            JobRepository.Update(activeJob);

            planner.Calculate();
            activeJob = JobRepository.ActiveJobs().First(m => m.Id == jobDue1DayLow.Id);
            Assert.That(activeJob.Urn, Is.EqualTo(jobDue1DayLow.Urn));
            activeJob.Plan.GetCurrentTask().State = ExecutionState.Done;
            activeJob.Plan.MoveToNextTask();
            JobRepository.Update(activeJob);

            Assert.That(JobRepository.WaitingJobs(), Is.Empty);
            Assert.That(JobRepository.ActiveJobs(), Is.Empty);
            Assert.That(JobRepository.DoneJobs().Count(), Is.EqualTo(4));
        }