public override void RestoreHistory(JobRunner jobRunner)
        {
            RestoreCount++;

            jobRunner.LastResult = LastResult;
            jobRunner.LastRunStartTime = LastRunTime;
            jobRunner.LastStatus = LastStatus;
        }
        public override void SaveHistory(JobRunner jobRunner)
        {
            SaveCount++;

            LastResult = jobRunner.LastResult;
            LastRunTime = jobRunner.LastRunStartTime;
            LastStatus = jobRunner.LastStatus;
        }
        public void StartMultiThreaded()
        {

            Type jobType = typeof(SleepJob);
            JobLockProvider jobLockProvider = new StaticLockProvider();
            var jobConfiguration = new JobConfiguration
            {
                Name = "SleepJob",
                Description = "Test Sleep Job with xml history",
                Interval = TimeSpan.FromSeconds(5),
                Type = typeof(SleepJob).AssemblyQualifiedName,
                JobLockProvider = typeof(StaticLockProvider).AssemblyQualifiedName,
            };

            jobConfiguration.Arguments.Add("sleep", 10);

            var log = new StringBuilder();
            var j = new JobRunner(jobConfiguration, jobType, jobLockProvider, null);
            JobManager.Current.JobStarting += (t, e) => log.AppendLine(e.ToString() + ":" + Thread.CurrentThread.ManagedThreadId);

            Thread t1 = new Thread(j.Start);
            Thread t2 = new Thread(j.Start);
            Thread t3 = new Thread(j.Start);
            Thread t4 = new Thread(j.Start);

            t1.Start();
            t2.Start();
            Thread.Sleep(TimeSpan.FromSeconds(5));
            t3.Start();
            t4.Start();

            // wait for job
            Thread.Sleep(TimeSpan.FromSeconds(45));

            string l = log.ToString();
            Assert.IsNotNull(l);

        }
        public void StartWithTimeOfDayLaterThenStart()
        {

            Type jobType = typeof(SleepJob);
            JobLockProvider jobLockProvider = new StaticLockProvider();
            JobHistoryProvider jobHistoryProvider = new StaticHistoryProvider
                                                        {
                                                            LastResult = string.Empty,
                                                            LastRunTime = DateTime.Now,
                                                            LastStatus = JobStatus.None
                                                        };

            // run time 1 hour ago
            DateTime runTime = DateTime.Now.Subtract(TimeSpan.FromHours(1));

            var jobConfiguration = new JobConfiguration
                                       {
                                           Name = "SleepJob",
                                           Description = "Test Sleep Job with xml history",
                                           Interval = runTime.TimeOfDay,
                                           IsTimeOfDay = true,
                                           Type = typeof(SleepJob).AssemblyQualifiedName,
                                           JobLockProvider = typeof(StaticLockProvider).AssemblyQualifiedName,
                                           JobHistoryProvider = typeof(StaticHistoryProvider).AssemblyQualifiedName
                                       };

            var j = new JobRunner(jobConfiguration, jobType, jobLockProvider, jobHistoryProvider);

            Assert.IsNotNull(j);
            j.Start();

            DateTime nextRun = runTime.AddDays(1);

            Assert.AreEqual(nextRun.Date, j.NextRunTime.Date);
            Assert.AreEqual(nextRun.Hour, j.NextRunTime.Hour);
            Assert.AreEqual(nextRun.Minute, j.NextRunTime.Minute);
        }
        private void AddJobs(IEnumerable<IJobConfiguration> jobs, JobProvider provider)
        {
            if (jobs == null)
                return;

            foreach (var jobConfiguration in jobs)
            {
                Type jobType = Type.GetType(jobConfiguration.Type, false, true);
                if (jobType == null)
                    throw new ConfigurationErrorsException(
                        string.Format("Could not load type '{0}' for job '{1}'.", 
                            jobConfiguration.Type, jobConfiguration.Name));

                JobLockProvider jobLockProvider = _defaultJobLockProvider;

                if (!string.IsNullOrEmpty(jobConfiguration.JobLockProvider))
                {
                    // first try getting from provider collection
                    jobLockProvider = _jobLockProviders[jobConfiguration.JobLockProvider];
                    if (jobLockProvider == null)
                    {
                        // next, try loading type
                        Type lockType = Type.GetType(jobConfiguration.JobLockProvider, false, true);
                        if (lockType == null)
                            throw new ConfigurationErrorsException(
                                string.Format("Could not load job lock type '{0}' for job '{1}'.", 
                                    jobConfiguration.JobLockProvider, jobConfiguration.Name));

                        jobLockProvider = Activator.CreateInstance(lockType) as JobLockProvider;
                    }

                    // if not found in provider collection or couldn't create type.
                    if (jobLockProvider == null)
                        throw new ConfigurationErrorsException(
                            string.Format("Could not find job lock provider '{0}' for job '{1}'.", jobConfiguration.JobLockProvider, jobConfiguration.Name));
                }

                JobHistoryProvider jobHistoryProvider = null;
                if (!string.IsNullOrEmpty(jobConfiguration.JobHistoryProvider))
                {
                    Type historyType = Type.GetType(jobConfiguration.JobHistoryProvider, false, true);
                    if (historyType == null)
                        throw new ConfigurationErrorsException(
                            string.Format("Could not load job history type '{0}' for job '{1}'.", jobConfiguration.JobHistoryProvider, jobConfiguration.Name));

                    jobHistoryProvider = Activator.CreateInstance(historyType) as JobHistoryProvider;                    
                }

                var j = new JobRunner(jobConfiguration, jobType, jobLockProvider, jobHistoryProvider);
                _jobs.Add(j);

                // keep track of jobs for providers so they can be sync'd later
                if (provider == null)
                    continue;

                JobCollection providerJobs;
                if (!_providerJobs.TryGetValue(provider, out providerJobs))
                {
                    providerJobs = new JobCollection();
                    _providerJobs.Add(provider, providerJobs);
                }
                providerJobs.Add(j);
            }

        }
        public void StartWithTimeOfDayOlderThenOneDay()
        {

            Type jobType = typeof(SleepJob);
            StaticLockProvider jobLockProvider = new StaticLockProvider();
            StaticHistoryProvider jobHistoryProvider = new StaticHistoryProvider
            {
                LastResult = string.Empty,
                LastRunTime = DateTime.Now.Subtract(TimeSpan.FromDays(2)), // 2 days ago
                LastStatus = JobStatus.None
            };

            // run time 1 hour ago
            DateTime runTime = DateTime.Now.Subtract(TimeSpan.FromHours(1));

            var jobConfiguration = new JobConfiguration
            {
                Name = "SleepJob",
                Description = "Test Sleep Job with xml history",
                Interval = runTime.TimeOfDay,
                IsTimeOfDay = true,
                Type = typeof(SleepJob).AssemblyQualifiedName,
                JobLockProvider = typeof(StaticLockProvider).AssemblyQualifiedName,
                JobHistoryProvider = typeof(StaticHistoryProvider).AssemblyQualifiedName
            };

            var j = new JobRunner(jobConfiguration, jobType, jobLockProvider, jobHistoryProvider);

            Assert.IsNotNull(j);
            Assert.AreEqual(1, jobHistoryProvider.RestoreCount);
            Assert.AreEqual(JobStatus.None, j.LastStatus);

            j.Start();

            // wait 30 sec, then test
            Thread.Sleep(TimeSpan.FromSeconds(30));

            Assert.AreEqual(1, jobHistoryProvider.SaveCount);
            Assert.AreEqual(JobStatus.Completed, j.LastStatus);

            // should set next run time to tomorrow
            DateTime nextRun = runTime.AddDays(1);

            Assert.AreEqual(nextRun.Date, j.NextRunTime.Date);
            Assert.AreEqual(nextRun.Hour, j.NextRunTime.Hour);
            Assert.AreEqual(nextRun.Minute, j.NextRunTime.Minute);

        }
 /// <summary>
 /// Saves the history to the provider.
 /// </summary>
 /// <param name="jobRunner">The job to save the history on.</param>
 public abstract void SaveHistory(JobRunner jobRunner);
 /// <summary>
 /// Restores the latest job history from the provider.
 /// </summary>
 /// <param name="jobRunner">The job to restore the history to.</param>
 public abstract void RestoreHistory(JobRunner jobRunner);