public async Task DeletePhotoCacheEventFired()
        {
            var completeInfo = new TaskCompleteInfo(TaskType.ClearCache, "wdavidsen", true);

            _photoData.Setup(m => m.DeletePhotos());
            _fileSystemService.Setup(m => m.DeleteDirectoryFiles(It.IsAny <string>(), It.IsAny <bool>()));

            await _photoService.DeletePhotoCache(completeInfo.ContextUserName);

            var queueEvents = new Mock <IQueueEvents>();

            queueEvents.SetupGet(m => m.ItemProcessed).Returns((info) =>
            {
                Assert.Equal(completeInfo.Type, info.Type);
                Assert.Equal(completeInfo.Success, info.Success);
                Assert.Equal(completeInfo.ContextUserName, info.ContextUserName);
            });

            try
            {
                var token    = new CancellationTokenSource().Token;
                var workItem = await _backgroundQueue.DequeueAsync(token);
                await workItem(token, queueEvents.Object);
            }
            catch (TaskCanceledException) { }
        }
        public async Task QueueMobileResizeEventFired()
        {
            var filePath     = Path.Combine("MobileUploads", DateTime.Now.ToString("yyyy-MM"), "birthday.jpg");
            var cacheDir     = Path.Combine("homePhotos", "cache");
            var checksum     = "abc123";
            var completeInfo = new TaskCompleteInfo(TaskType.ProcessMobilePhoto, "wdavidsen", true);

            _fileSystemService.Setup(m => m.GetChecksum(It.IsAny <string>())).Returns(checksum);
            _fileSystemService.Setup(m => m.GetDirectoryTags(It.IsAny <string>())).Returns(new List <string> {
                "Tag1", "Tag2"
            });
            _photoService.Setup(m => m.GetPhotoByChecksum(It.IsAny <string>())).ReturnsAsync(default(Photo));

            _dynamicConfig.SetupGet(o => o.CacheFolder).Returns(cacheDir);
            _dynamicConfig.SetupGet(o => o.LargeImageSize).Returns(800);
            _dynamicConfig.SetupGet(o => o.ThumbnailSize).Returns(200);
            _dynamicConfig.SetupGet(o => o.MobileUploadsFolder).Returns("MobileUploads");

            var cachePath = await _imageService.QueueMobileResize(completeInfo.ContextUserName, filePath);

            var queueEvents = new Mock <IQueueEvents>();

            queueEvents.SetupGet(m => m.ItemProcessed).Returns((info) =>
            {
                Assert.Equal(completeInfo.Type, info.Type);
                Assert.Equal(completeInfo.Success, info.Success);
                Assert.Equal(completeInfo.ContextUserName, info.ContextUserName);
                Assert.NotNull(info.Data);
                Assert.Equal(filePath, info.Data.ToString());
            });

            try
            {
                var token    = new CancellationTokenSource().Token;
                var workItem = await _backgroundQueue.DequeueAsync(token);
                await workItem(token, queueEvents.Object);
            }
            catch (TaskCanceledException) { }
        }
        public async Task DeletePhotoCache()
        {
            var completeInfo = new TaskCompleteInfo(TaskType.ClearCache, "wdavidsen", true);

            _photoData.Setup(m => m.DeletePhotos());
            _fileSystemService.Setup(m => m.DeleteDirectoryFiles(It.IsAny <string>(), It.IsAny <bool>()));

            await _photoService.DeletePhotoCache(completeInfo.ContextUserName);

            try
            {
                var token    = new CancellationTokenSource().Token;
                var workItem = await _backgroundQueue.DequeueAsync(token);
                await workItem(token, new QueueEvents { ItemProcessed = (info) => { } });
            }
            catch (TaskCanceledException) { }

            _photoData.Verify(m => m.DeletePhotos(),
                              Times.Once);
            _fileSystemService.Verify(m => m.DeleteDirectoryFiles(It.IsAny <string>(), It.IsAny <bool>()),
                                      Times.Once);
        }
        public async Task DeletePhotoCacheHandlesException()
        {
            var completeInfo = new TaskCompleteInfo(TaskType.ClearCache, "wdavidsen", false);

            _photoData.Setup(m => m.DeletePhotos());

            _fileSystemService.Setup(m => m.DeleteDirectoryFiles(It.IsAny <string>(), It.IsAny <bool>()))
            .Throws(new Exception("Some error"));

            /* _logger.Setup(m => m.Log<FormattedLogValues>(LogLevel.Error, 0, It.IsAny<string>(), It.IsAny<Exception>(), It.IsAny<Func<FormattedLogValues, Exception, string>>())); */

            await _photoService.DeletePhotoCache(completeInfo.ContextUserName);

            var queueEvents = new Mock <IQueueEvents>();

            queueEvents.SetupGet(m => m.ItemProcessed).Returns((info) =>
            {
                Assert.Equal(completeInfo.Type, info.Type);
                Assert.Equal(completeInfo.Success, info.Success);
                Assert.Equal(completeInfo.ContextUserName, info.ContextUserName);
            });

            try
            {
                var token    = new CancellationTokenSource().Token;
                var workItem = await _backgroundQueue.DequeueAsync(token);
                await workItem(token, queueEvents.Object);
            }
            catch (TaskCanceledException) { }

            _photoData.Verify(m => m.DeletePhotos(),
                              Times.Once);
            _fileSystemService.Verify(m => m.DeleteDirectoryFiles(It.IsAny <string>(), It.IsAny <bool>()),
                                      Times.Once);

            /* _logger.Verify(m => m.Log(It.IsAny<LogLevel>(), 0, It.IsAny<PhotoService>(), It.IsAny<Exception>(), It.IsAny<Func<PhotoService, Exception, string>>()),
             *  Times.Once); */
        }
        public void OnItemProcessed(TaskCompleteInfo info)
        {
            switch (info.Type)
            {
            case TaskType.ClearCache:
                _notificationHub.Clients.All.SendAdminsMessage(
                    info.Success.Value ? "success" : "error",
                    info.Success.Value ? "Photo cache cleared" : "Failed to clear photo cache");
                break;

            case TaskType.ProcessMobilePhoto:
                _uploadTracker.RemoveUpload((string)info.Data);

                var timer = new Timer((state) => {
                    if (_uploadTracker.IsProcessingDone(info.ContextUserName))
                    {
                        var uploadCount = _uploadTracker.GetUploadCount(info.ContextUserName);
                        _notificationHub.Clients.All.SendEveryoneMessage("info", $"{info.ContextUserName} uploaded {uploadCount} photos");
                    }
                }, null, 1000 * 2, 0);

                break;
            }
        }
Beispiel #6
0
        public void ProcessThread(object state)
        {
            while (!_cancel.IsCancellationRequested)
            {
                TaskInfo task = null;
                lock (_queue)
                {
                    if (_queue.Count > 0)
                    {
                        task = _queue.Dequeue();
                    }
                }

                if (task == null)
                {
                    WaitHandle.WaitAny(new WaitHandle[] { _taskAdded, _cancel.Token.WaitHandle });
                    continue;
                }

                if (_cancel.IsCancellationRequested)
                {
                    return;
                }

                _runningCount++;
                try
                {
                    DateTime?runAgainOnError = DateTime.Now.AddHours(1);

                    SchedulerItem item = _repository.GetSchedulerItem(task.SchedulerItemGuid);

                    TaskCompleteInfo completeInfo = new TaskCompleteInfo();
                    completeInfo.Id            = task.Id;
                    completeInfo.StartDateTime = DateTime.Now;
                    if (item != null)
                    {
                        SchedulerItemActionContext context = new SchedulerItemActionContext(
                            item, completeInfo.StartDateTime, task.DataXml, (ex) => _logger.LogError(ex, sourceId: task.SchedulerItemGuid));

                        Stopwatch stopwatch = Stopwatch.StartNew();
                        try
                        {
#if DEBUG
                            //System.Windows.MessageBox.Show("TaskExecutor. Attach Debugger Now.");
#endif

                            StringBuilder result = new StringBuilder();

                            foreach (SchedulerItemAction action in item.Actions)
                            {
                                string text = action.Execute(context);
                                if (!string.IsNullOrEmpty(text))
                                {
                                    if (result.Length > 0)
                                    {
                                        result.AppendLine();
                                    }
                                    result.Append(text);
                                }
                            }
                            foreach (SchedulerItemEvent @event in item.Events)
                            {
                                @event.OnExecuted(context);
                            }

                            completeInfo.Result = result.ToString();
                            completeInfo.NextExecuteDateTime = context.NextExecuteDateTime;
                            completeInfo.NextExecuteDataXml  = context.NextExecuteDataXml;
                            completeInfo.DeleteSchedulerItem = context.DeleteSchedulerItem;
                        }
                        catch (Exception e)
                        {
                            _logger.LogError(e, sourceId: task.SchedulerItemGuid);
                            completeInfo.Result              = e.Message;
                            completeInfo.IsError             = true;
                            completeInfo.NextExecuteDateTime = runAgainOnError;
                            completeInfo.NextExecuteDataXml  = task.DataXml;
                        }
                        finally
                        {
                            stopwatch.Stop();
                            completeInfo.Duration = stopwatch.Elapsed;
                        }
                    }

                    if (_cancel.IsCancellationRequested)
                    {
                        return;
                    }

                    _repository.OnTaskComplete(completeInfo);
                }
                catch (Exception e)
                {
                    _logger.LogError(e, sourceId: task.SchedulerItemGuid);
                }
                finally
                {
                    _runningCount--;
                }
            }
        }