コード例 #1
0
        public void GetTimeSpanByZoneId_Empty()
        {
            var tSpan    = "10:55:00";
            var resolver = new DateTimeResolver(tSpan);
            var ts       = resolver.GetTimeSpanByZoneId(string.Empty);

            Assert.AreEqual(TimeSpan.Zero, ts);
        }
コード例 #2
0
        public void GetTimeSpanByZoneId()
        {
            var tSpan    = "10:55:00";
            var resolver = new DateTimeResolver(tSpan);
            var ts       = resolver.GetTimeSpanByZoneId("China Standard Time");

            Assert.AreEqual(TimeSpan.FromHours(8), ts);
        }
コード例 #3
0
        public void GetDateTime_UserTZoneZero()
        {
            var resolver = new DateTimeResolver(string.Empty);

            var utc = new DateTime(2000, 1, 1, 0, 0, 0);
            var dt  = resolver.ToTimeZone(utc);

            Assert.IsTrue(dt == DateTime.Parse("2000/1/1 0:00:00"));
        }
コード例 #4
0
        public void TestGetUtcTimeFromUserTZone()
        {
            var tSpan    = "10:55:00";
            var resolver = new DateTimeResolver(tSpan);

            var dt  = resolver.GetUtcTimeFromUserTZone(DateTime.Parse("2000/1/1 10:55:00"));
            var utc = new DateTime(2000, 1, 1, 0, 0, 0);

            Assert.IsTrue(dt == utc);
        }
コード例 #5
0
        public void TestGetDateTimeWithUserTZone()
        {
            var tSpan    = "02:51:00";
            var resolver = new DateTimeResolver(tSpan);

            var utc = new DateTime(2000, 1, 1, 0, 0, 0);
            var dt  = resolver.GetDateTimeWithUserTZone(utc);

            Assert.IsTrue(dt == DateTime.Parse("2000/1/1 2:51:00"));
        }
コード例 #6
0
        public void GetUtcTimeFromUserTZoneStd()
        {
            var tSpan    = "8:00:00";
            var resolver = new DateTimeResolver(tSpan);

            var dt  = resolver.ToUtc(DateTime.Parse("2000/1/1 8:00:00"));
            var utc = new DateTime(2000, 1, 1, 0, 0, 0);

            Assert.IsTrue(dt == utc);
        }
コード例 #7
0
        public void InvalidTimeSpanFormat()
        {
            var resolver = new DateTimeResolver("996ICU");
            var utc      = new DateTime(2000, 1, 1, 0, 0, 0);

            Assert.Throws <FormatException>(() =>
            {
                resolver.ToTimeZone(utc);
            });
        }
コード例 #8
0
        public void GetNow_UserTZone()
        {
            var tSpan    = "8:00:00";
            var resolver = new DateTimeResolver(tSpan);
            var utc      = DateTime.UtcNow;
            var dt       = resolver.NowOfTimeZone;

            Assert.AreEqual(utc.AddHours(8).Date, dt.Date);
            Assert.AreEqual(utc.AddHours(8).Hour, dt.Hour);
            Assert.AreEqual(utc.AddHours(8).Minute, dt.Minute);
        }
コード例 #9
0
        /// <summary>
        /// Signals to start a new execution at the next available slot.
        /// </summary>
        protected void QueueExecution()
        {
            lock (_syncExecution)
            {
                if (!this.IsLoaded || this.IsStopped)
                {
                    throw new InvalidOperationException("Cannot execute. Service app is not loaded or has stopped.");
                }

                bool createContext = false;

                switch (this.ExecutionMode)
                {
                case ExecutionMode.Default:
                case ExecutionMode.Idempotent:
                    if (!this._executionContexts.Any() || this._executionContexts.All(c => c.Failed))
                    {
                        createContext = true;
                    }

                    break;

                case ExecutionMode.Inline:
                    createContext = true;
                    break;

                case ExecutionMode.Concurrent:
                    if (Settings.MaxConcurrentExecutions == 0 || this._executionContexts.Count(c => c.IsExecuting) <= Settings.MaxConcurrentExecutions)
                    {
                        createContext = true;
                    }

                    break;

                default:
                    throw new NotImplementedException("Execution mode not yet implemented");
                }

                if (createContext)
                {
                    var context = new ServiceAppContext()
                    {
                        Failed     = false,
                        QueuedTime = DateTimeResolver.Resolve(),
                        Guid       = Guid.NewGuid().ToString(),
                        Name       = this.DisplayName
                    };

                    this._executionContexts.Add(context);
                }
            }
        }
コード例 #10
0
        public void TestGetUtcTimeFromUserTZone()
        {
            var tSpan = "10:55:00";

            _blogConfigMock.Setup(m => m.GeneralSettings).Returns(new GeneralSettings
            {
                TimeZoneUtcOffset = tSpan
            });

            var resolver = new DateTimeResolver(_blogConfigMock.Object);

            var dt  = resolver.GetUtcTimeFromUserTZone(DateTime.Parse("2000/1/1 10:55:00"));
            var utc = new DateTime(2000, 1, 1, 0, 0, 0);

            Assert.IsTrue(dt == utc);
        }
コード例 #11
0
        /// <summary>
        /// Handles the 'tick' event of the executionTimer.
        /// </summary>
        /// <param name="state">The state.</param>
        private void ExecutionTimer_Tick(object state)
        {
            if (this.IsStopped)
            {
                _executionTimer.Change(Timeout.Infinite, Timeout.Infinite);
                return;
            }

            ServiceAppContext currentContext = null;

            switch (this.ExecutionMode)
            {
            case Execution.ExecutionMode.Default:
            case Execution.ExecutionMode.Idempotent:
            case Execution.ExecutionMode.Concurrent:
                currentContext = this._executionContexts.FirstOrDefault(c => c.CanExecute);
                break;

            case Execution.ExecutionMode.Inline:
                currentContext = this._executionContexts.FirstOrDefault(c => c.CanExecute && !this.IsExecuting);
                break;

            default:
                throw new NotImplementedException("Execution mode not yet implemented");
            }

            if (currentContext != null)
            {
                Task executionTask = Task.Run(() =>
                {
                    Messages.WriteState(Enums.State.Executing);
                    Messages.WriteDebug("Starting exection for {0}. Time: {1}", this.DisplayName, currentContext.StartTime);
                    currentContext.StartTime = DateTimeResolver.Resolve();
                    Messages.WritePerformance(currentContext);
                    try
                    {
                        this.Execute(ref currentContext);
                        Messages.WriteState(Enums.State.Idle);
                    }
                    catch (Exception e)
                    {
                        currentContext.Failed        = true;
                        currentContext.CustomMessage = e.Message;
                        this.HandleException(e, false);
                        Messages.WriteState(Enums.State.Failed);
                    }
                    finally
                    {
                        currentContext.EndTime = DateTimeResolver.Resolve();
                        Messages.WriteDebug("Ended exection for {0}. Duration: {1}", this.DisplayName, currentContext.Duration);
                        Messages.WritePerformance(currentContext);
                    }

                    this._executionContexts.Remove(currentContext);
                });

                currentContext.Handle = executionTask;
            }

            this.CleanUpServiceAppContexts();
            this.CheckParentProcessAlive();
        }