コード例 #1
0
        public void ShutDownShouldNotBlockDequeueWhenThereAreWorkItemsInTheQueue()
        {
            ManualResetEvent manualResetEvent = new ManualResetEvent(false);
            const int        workItemWaiterTimeOutInMilliSeconds = 1000;
            WorkItemQueue    workItemQueue = new WorkItemQueue(workItemWaiterTimeOutInMilliSeconds);

            IWorkItem workItem = Substitute.For <IWorkItem>();

            workItemQueue.Enqueue(workItem);

            new Thread(
                () =>
            {
                manualResetEvent.Set();
                manualResetEvent.Reset();
                manualResetEvent.WaitOne(300);

                IWorkItem dequeuedWorkItem = workItemQueue.Dequeue();

                Assert.AreEqual(workItem, dequeuedWorkItem);
            }).Start();

            manualResetEvent.WaitOne(300);

            workItemQueue.ShutDown();

            manualResetEvent.Set();
        }
コード例 #2
0
        public void Test_RefreshWorkItemStatus_UntilFail()
        {
            DummyLogger   mockedLogger = new DummyLogger();
            WorkItemQueue queue        = new WorkItemQueue(10, mockedLogger);

            WorkItemProgress progress = new WorkItemProgress();
            LookupWorkItem   workItem = new LookupWorkItem(progress);

            progress.Progress = Progress.NotStarted;

            queue.AddWorkItem(workItem);
            Assert.AreEqual(1, queue.PendingItemsNum);
            Assert.AreEqual(1, mockedLogger.AddLogged);

            queue.Refresh();
            Assert.AreEqual(Progress.Running, progress.Progress);
            Assert.AreEqual(0, queue.PendingItemsNum);
            Assert.AreEqual(1, queue.ActiveItemsNum);
            Assert.AreEqual(1, queue.RunningItemsNum);

            queue.Refresh();
            queue.Refresh();
            Assert.AreEqual(0, queue.PendingItemsNum);
            Assert.AreEqual(1, queue.ActiveItemsNum);
            Assert.AreEqual(1, queue.RunningItemsNum);
            Assert.AreEqual(0, mockedLogger.CompletedLogged);

            progress.Progress = Progress.Failed;
            queue.Refresh();
            Assert.AreEqual(0, queue.ActiveItemsNum);
            Assert.AreEqual(0, mockedLogger.CompletedLogged);
            Assert.AreEqual(1, mockedLogger.FailedLogged);
        }
コード例 #3
0
        public void ShutDownShouldNotWaitMoreThanWaiterTimeOutWhenThereIsNoWorkItemsInTheQueue()
        {
            AutoResetEvent autoResetEvent = new AutoResetEvent(false);
            const int      workItemWaiterTimeOutInMilliSeconds = 1000;
            WorkItemQueue  workItemQueue = new WorkItemQueue(workItemWaiterTimeOutInMilliSeconds);

            new Thread(
                () =>
            {
                Thread.Sleep(100);

                autoResetEvent.Set();

                IWorkItem workItem = workItemQueue.Dequeue();

                autoResetEvent.Set();

                Assert.AreEqual(null, workItem);
            }).Start();

            autoResetEvent.WaitOne(500);

            Stopwatch stopwatch = Stopwatch.StartNew();

            workItemQueue.ShutDown();
            autoResetEvent.WaitOne(workItemWaiterTimeOutInMilliSeconds + 100);
            stopwatch.Stop();

            Assert.Less(stopwatch.ElapsedMilliseconds, workItemWaiterTimeOutInMilliSeconds);
        }
コード例 #4
0
        public void EnqueueTrySignalMethodShouldBeCalledWhenWaitingStackIsNotEmpty()
        {
            IWorkItemWaiterEntry      workItemWaiterEntry      = Substitute.For <IWorkItemWaiterEntry>();
            IWorkItemWaiterEntryStack workItemWaiterEntryStack = Substitute.For <IWorkItemWaiterEntryStack>();

            int count = 1;

            workItemWaiterEntryStack.Count.Returns(x => count);
            workItemWaiterEntryStack.Pop().Returns(
                x =>
            {
                if (count == 1)
                {
                    count = 0;
                    return(workItemWaiterEntry);
                }

                return(null);
            });

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, workItemWaiterEntryStack);

            IWorkItem workItem = Substitute.For <IWorkItem>();

            workItemQueue.Enqueue(workItem);

            workItemWaiterEntry.Received(1).TrySignal(workItem);
        }
コード例 #5
0
        public void EnqueueShouldThrowExceptionWhenItIsCalledAfterShutDown()
        {
            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 300);

            workItemQueue.ShutDown();

            Assert.Throws <LaboThreadingException>(() => workItemQueue.Enqueue(Substitute.For <IWorkItem>()));
        }
コード例 #6
0
        internal async override Task InitializeAsync()
        {
            this.BackupMappingStore = await BackupMappingStore.CreateOrGetBackupMappingStore(this.StatefulService).ConfigureAwait(false);

            this.BackupPolicyStore = await BackupPolicyStore.CreateOrGetBackupPolicyStore(this.StatefulService).ConfigureAwait(false);

            this.WorkItemQueue = await WorkItemQueue.CreateOrGetWorkItemQueue(this.StatefulService).ConfigureAwait(false);
        }
コード例 #7
0
        private async Task UpdateSecretsAsync(string thumbprintFromManifest, string x509StoreNameFromManifest, CancellationToken cancellationToken)
        {
            BackupRestoreTrace.TraceSource.WriteInfo(TraceType, String.Format("Updating secrets using the new thumbprint {0}", thumbprintFromManifest));
            using (var transaction = this.StateManager.CreateTransaction())
            {
                try
                {
                    var policyStore = await BackupPolicyStore.CreateOrGetBackupPolicyStore(this);

                    var workItemQueue = await WorkItemQueue.CreateOrGetWorkItemQueue(this);

                    var policies = await policyStore.GetValuesAsync(Common.Constants.StoreTimeOut, cancellationToken, transaction);

                    foreach (var policy in policies)
                    {
                        cancellationToken.ThrowIfCancellationRequested();
                        var updatedStorage = this.UpdateSecretInStorage(policy.Storage, thumbprintFromManifest, x509StoreNameFromManifest, cancellationToken);
                        var newPolicy      = policy.ToBuilder()
                                             .WithBackupStorage(updatedStorage)
                                             .UpdateUniqueId()
                                             .Build();

                        if (!await policyStore.UpdateValueAsync(policy.Name, policy, newPolicy, Common.Constants.StoreTimeOut, cancellationToken, transaction))
                        {
                            throw new InvalidOperationException(String.Format("Failed to update secret for policy with name {0}", newPolicy.Name));
                        }

                        if (newPolicy.BackupEnabledSet.Count > 0)
                        {
                            await workItemQueue.AddWorkItem(
                                new UpdateEnablementWorkItem(newPolicy.BackupEnabledSet.ToList(),
                                                             new WorkItemInfo
                            {
                                WorkItemType = WorkItemPropogationType.UpdateBackupPolicy,
                                BackupPolicyUpdateGuid = newPolicy.UniqueId
                            }), Common.Constants.StoreTimeOut, cancellationToken, transaction);
                        }
                    }

                    // Update the config store
                    var configStore = await ConfigStore.CreateOrGetConfigStore(this);

                    await configStore.UpdateValueAsync(Common.Constants.SecretUpdateInProgress, String.Empty, Common.Constants.StoreTimeOut, cancellationToken, transaction);

                    await configStore.UpdateValueAsync(Common.Constants.EncryptionCertThumbprintKey, thumbprintFromManifest, Common.Constants.StoreTimeOut, cancellationToken, transaction);

                    await transaction.CommitAsync();

                    BackupRestoreTrace.TraceSource.WriteInfo(TraceType, "All secrets updated with manifest {0}", thumbprintFromManifest);
                    FabricEvents.Events.BRSSecretsUpdated(TraceType, thumbprintFromManifest);
                }
                catch (Exception ex)
                {
                    BackupRestoreTrace.TraceSource.WriteExceptionAsWarning(TraceType, ex, "Exception encountered while updating secrets");
                    throw;
                }
            }
        }
コード例 #8
0
        public void DefaultConstructorShouldSetTheDefaultWorkerThreadIdleTimeout()
        {
            WorkerThreadPool workerThreadPool = new WorkerThreadPool();
            WorkItemQueue    workItemQueue    = (WorkItemQueue)workerThreadPool.WorkItemQueue;

            Assert.AreEqual(WorkerThreadPool.DEFAULT_WORKER_THREAD_IDLE_TIMEOUT, workItemQueue.WorkItemWaiterTimeOutInMilliSeconds);

            workerThreadPool.Shutdown(true, 500);
        }
コード例 #9
0
        public void DequeueShouldReturnQueuedWorkItemWhenQueueIsNotEmpty()
        {
            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000);

            IWorkItem workItemFirst = Substitute.For <IWorkItem>();
            IWorkItem workItemLast  = Substitute.For <IWorkItem>();

            workItemQueue.Enqueue(workItemFirst);
            workItemQueue.Enqueue(workItemLast);

            Assert.AreEqual(workItemFirst, workItemQueue.Dequeue());
            Assert.AreEqual(workItemLast, workItemQueue.Dequeue());
        }
コード例 #10
0
        internal override async Task <HttpResponseMessage> RunAsync(TimeSpan timeout, CancellationToken cancellationToken)
        {
            this.ThrowInvalidArgumentIfNull(this.backupPolicy);
            if (string.IsNullOrEmpty(this.backupPolicyName))
            {
                throw new ArgumentException();
            }

            var workItemQueue = await WorkItemQueue.CreateOrGetWorkItemQueue(this.StatefulService);

            var modelBackupPolicy = BackupPolicyModel.FromBackupPolicyView(this.backupPolicy);
            var policyBuilder     = modelBackupPolicy.ToBuilder()
                                    .WithName(this.backupPolicyName);
            RetentionManager retentionManager = await RetentionManager.CreateOrGetRetentionManager(this.StatefulService);

            using (var transaction = this.StatefulService.StateManager.CreateTransaction())
            {
                var existingBackupPolicy = await this.BackupPolicyStore.GetValueWithUpdateLockModeAsync(this.backupPolicyName, timeout, cancellationToken, transaction);

                if (existingBackupPolicy == null)
                {
                    throw new FabricException(StringResources.BackupPolicyDoesNotExist, FabricErrorCode.BackupPolicyDoesNotExist);
                }

                var existingEnablementSet = existingBackupPolicy.BackupEnabledSet;
                policyBuilder.WithBackupEnabledSet(existingEnablementSet);

                var updatedBackupPolicy = policyBuilder.Build();

                await this.BackupPolicyStore.UpdateValueAsync(this.backupPolicyName, existingBackupPolicy, updatedBackupPolicy, timeout, cancellationToken, transaction);

                if (existingEnablementSet.Count > 0)
                {
                    await
                    workItemQueue.AddWorkItem(
                        new UpdateEnablementWorkItem(existingEnablementSet.ToList(),
                                                     new WorkItemInfo {
                        WorkItemType = WorkItemPropogationType.UpdateBackupPolicy,
                        BackupPolicyUpdateGuid = updatedBackupPolicy.UniqueId
                    } ), timeout, cancellationToken, transaction);
                }

                await retentionManager.UpdatePolicyAsync(this.backupPolicyName, timeout, cancellationToken, transaction);

                await transaction.CommitAsync();
            }


            return(new HttpResponseMessage(HttpStatusCode.OK));
        }
コード例 #11
0
    public async Task RestoreOperationResultAsync(RestoreOperationResult operationResult, TimeSpan timeout,
                                                  CancellationToken cancellationToken)
    {
        BackupRestoreTrace.TraceSource.WriteInfo(TraceType, "RestoreOperationResultAsync invoked for partition {0}, ErrorCode {1}, message {2}",
                                                 operationResult.PartitionId, operationResult.ErrorCode, operationResult.Message);

        var restoreStore = await RestoreStore.CreateOrGetRestoreStatusStore(this.statefulService);

        var workItemQueue = await WorkItemQueue.CreateOrGetWorkItemQueue(this.statefulService);

        string brsServiceUri = await UtilityHelper.GetCustomServiceUri(operationResult.ServiceName, timeout, cancellationToken);

        var fabricUri = UtilityHelper.GetBackupMappingKey(brsServiceUri, operationResult.PartitionId.ToString());

        WorkItem pushPolicyAfterRestore = new SendToServiceNodeWorkItem(brsServiceUri, operationResult.PartitionId.ToString(), new WorkItemInfo()
        {
            WorkItemType = WorkItemPropogationType.UpdatePolicyAfterRestore,
        });
        await UtilityHelper.InvokeWithRetry(async() =>
        {
            BackupRestoreTrace.TraceSource.WriteInfo(TraceType, "Trying to Update the Restore request for partition {0}", operationResult.PartitionId);
            using (ITransaction transaction = this.statefulService.StateManager.CreateTransaction())
            {
                var restoreStatus = await restoreStore.GetValueWithUpdateLockModeAsync(fabricUri, timeout, cancellationToken, transaction);
                if ((restoreStatus != null) &&
                    (restoreStatus.RestoreStatusState == RestoreState.RestoreInProgress ||
                     restoreStatus.RestoreStatusState == RestoreState.Accepted) &&
                    (restoreStatus.RestoreRequestGuid.Equals(operationResult.OperationId)))
                //TODO: Add check for each request by Guid
                {
                    var updatedRestoreStatus = restoreStatus.ToBuilder()
                                               .WithState(operationResult.ErrorCode != 0 ? RestoreState.Failure : RestoreState.Success)
                                               .WithErrorCode(operationResult.ErrorCode)
                                               .WithMessage(operationResult.Message)
                                               .WithTimeStampUtc(operationResult.TimeStampUtc)
                                               .Build();

                    await restoreStore.UpdateValueAsync(fabricUri, updatedRestoreStatus, timeout, cancellationToken, transaction);
                    await workItemQueue.AddWorkItem(pushPolicyAfterRestore, timeout, cancellationToken, transaction);
                    await transaction.CommitAsync();
                    BackupRestoreTrace.TraceSource.WriteInfo(TraceType, "Updated the Restore request for partition {0}", operationResult.PartitionId);
                }
                else
                {
                    transaction.Abort();
                }
            }
        });
    }
コード例 #12
0
        public void EnqueueShouldAddWorkItemsToQueueWhenThereAreNoWaiters()
        {
            IWorkItem workItem = Substitute.For<IWorkItem>();

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 100);
            IList<Task> tasks = new List<Task>
                                    {
                                        Task.Factory.StartNew(() => workItemQueue.Enqueue(workItem)),
                                        Task.Factory.StartNew(() => workItemQueue.Enqueue(workItem)),
                                        Task.Factory.StartNew(() => workItemQueue.Enqueue(workItem))
                                    };
            Task.WaitAll(tasks.ToArray());

            Assert.AreEqual(3, workItemQueue.Count);
        }
コード例 #13
0
        public void EnqueueTrySignalMethodShouldNotBeCalledWhenWaitingStackIsEmpty()
        {
            IWorkItemWaiterEntry      workItemWaiterEntry      = Substitute.For <IWorkItemWaiterEntry>();
            IWorkItemWaiterEntryStack workItemWaiterEntryStack = Substitute.For <IWorkItemWaiterEntryStack>();

            workItemWaiterEntryStack.Count.Returns(0);

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, workItemWaiterEntryStack);

            IWorkItem workItem = Substitute.For <IWorkItem>();

            workItemQueue.Enqueue(workItem);

            workItemWaiterEntry.DidNotReceiveWithAnyArgs().TrySignal(workItem);
        }
コード例 #14
0
        public void EnqueueShouldNotAddWorkItemToQueueWhenWaiterIsSignaled()
        {
            IWorkItem workItem = Substitute.For<IWorkItem>();

            IWorkItemWaiterEntry workItemWaiterEntry = Substitute.For<IWorkItemWaiterEntry>();
            workItemWaiterEntry.TrySignal(workItem).Returns(true);

            IWorkItemWaiterEntryStack workItemWaiterEntryStack = Substitute.For<IWorkItemWaiterEntryStack>();
            workItemWaiterEntryStack.Count.Returns(1);
            workItemWaiterEntryStack.Pop().Returns(workItemWaiterEntry);

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, workItemWaiterEntryStack);
            workItemQueue.Enqueue(workItem);

            Assert.AreEqual(0, workItemQueue.Count);
        }
コード例 #15
0
        public void EnqueueShouldAddWorkItemsToQueueWhenThereAreNoWaiters()
        {
            IWorkItem workItem = Substitute.For <IWorkItem>();

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 100);
            IList <Task>  tasks         = new List <Task>
            {
                Task.Factory.StartNew(() => workItemQueue.Enqueue(workItem)),
                Task.Factory.StartNew(() => workItemQueue.Enqueue(workItem)),
                Task.Factory.StartNew(() => workItemQueue.Enqueue(workItem))
            };

            Task.WaitAll(tasks.ToArray());

            Assert.AreEqual(3, workItemQueue.Count);
        }
コード例 #16
0
        public void EnqueueShouldAddWorkItemToQueueWhenAllWaitersTimedOut()
        {
            Stack<IWorkItemWaiterEntry> workItemWaiterEntries = new Stack<IWorkItemWaiterEntry>();
            workItemWaiterEntries.Push(CreateNotSignalableWorkItemWaiterEntry());
            workItemWaiterEntries.Push(CreateNotSignalableWorkItemWaiterEntry());

            IWorkItemWaiterEntryStack workItemWaiterEntryStack = Substitute.For<IWorkItemWaiterEntryStack>();
            workItemWaiterEntryStack.Count.Returns(x => workItemWaiterEntries.Count);
            workItemWaiterEntryStack.Pop().Returns(x => workItemWaiterEntries.Pop());

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, workItemWaiterEntryStack);

            IWorkItem workItem = Substitute.For<IWorkItem>();
            workItemQueue.Enqueue(workItem);

            Assert.AreEqual(1, workItemQueue.Count);
        }
コード例 #17
0
    /// <summary>
    /// Initializes a new instance of the BASS player controller.
    /// </summary>
    /// <param name="player">BASS player instance which contains this controller instance.</param>
    /// <param name="playerMainDirectory">Directory where the BASS player is located. Plugins will be searched relative
    /// to this directory.</param>
    public Controller(BassPlayer player, string playerMainDirectory)
    {
      Log.Debug("Initializing BASS controller");
      _player = player;

      _bassLibraryManager = BassLibraryManager.Get(Path.Combine(playerMainDirectory, InternalSettings.PluginsPath));

      _playbackProcessor = new PlaybackProcessor(this);
      _outputDeviceManager = new OutputDeviceManager(this);

      _mainThreadTerminated = false;

      _workItemQueue = new WorkItemQueue();

      _playerThread = new Thread(PlayerThreadMain) {Name = "BassPlay"};
      _playerThread.Start();

      SetVolume_Async(100);
    }
コード例 #18
0
        public void EnqueueShouldNotAddWorkItemToQueueWhenWaiterIsSignaled()
        {
            IWorkItem workItem = Substitute.For <IWorkItem>();

            IWorkItemWaiterEntry workItemWaiterEntry = Substitute.For <IWorkItemWaiterEntry>();

            workItemWaiterEntry.TrySignal(workItem).Returns(true);

            IWorkItemWaiterEntryStack workItemWaiterEntryStack = Substitute.For <IWorkItemWaiterEntryStack>();

            workItemWaiterEntryStack.Count.Returns(1);
            workItemWaiterEntryStack.Pop().Returns(workItemWaiterEntry);

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, workItemWaiterEntryStack);

            workItemQueue.Enqueue(workItem);

            Assert.AreEqual(0, workItemQueue.Count);
        }
コード例 #19
0
        public void DequeueShouldReturnQueuedWorkItemWhenTheWaiterIsNotTimedOut()
        {
            IWorkItem workItem = Substitute.For <IWorkItem>();

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000);

            new Thread(
                () =>
            {
                Thread.Sleep(200);

                workItemQueue.Enqueue(workItem);
            }).Start();


            Assert.AreEqual(workItem, workItemQueue.Dequeue());
            Assert.AreEqual(0, workItemQueue.Count);
            Assert.AreEqual(0, workItemQueue.WorkItemWaiterEntryStack.Count);
        }
コード例 #20
0
        public void EnqueueShouldAddWorkItemToQueueWhenAllWaitersTimedOut()
        {
            Stack <IWorkItemWaiterEntry> workItemWaiterEntries = new Stack <IWorkItemWaiterEntry>();

            workItemWaiterEntries.Push(CreateNotSignalableWorkItemWaiterEntry());
            workItemWaiterEntries.Push(CreateNotSignalableWorkItemWaiterEntry());

            IWorkItemWaiterEntryStack workItemWaiterEntryStack = Substitute.For <IWorkItemWaiterEntryStack>();

            workItemWaiterEntryStack.Count.Returns(x => workItemWaiterEntries.Count);
            workItemWaiterEntryStack.Pop().Returns(x => workItemWaiterEntries.Pop());

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, workItemWaiterEntryStack);

            IWorkItem workItem = Substitute.For <IWorkItem>();

            workItemQueue.Enqueue(workItem);

            Assert.AreEqual(1, workItemQueue.Count);
        }
コード例 #21
0
        /// <summary>
        /// Initializes a new instance of the BASS player controller.
        /// </summary>
        /// <param name="player">BASS player instance which contains this controller instance.</param>
        public Controller(BassPlayer player)
        {
            Log.Debug("Initializing BASS controller");
            _player = player;

            _bassLibraryManager = BassLibraryManager.Get();

            _playbackProcessor   = new PlaybackProcessor(this);
            _outputDeviceManager = new OutputDeviceManager(this);

            _mainThreadTerminated = false;

            _workItemQueue = new WorkItemQueue();

            _playerThread = new Thread(PlayerThreadMain)
            {
                Name = "BassPlay"
            };
            _playerThread.Start();

            SetVolume_Async(100);
        }
コード例 #22
0
        public void DequeueShouldReturnNullWhenTheWaiterIsTimedOut()
        {
            IWorkItem workItem = Substitute.For <IWorkItem>();

            AutoResetEvent autoResetEvent = new AutoResetEvent(false);
            WorkItemQueue  workItemQueue  = new WorkItemQueue(1 * 300);

            new Thread(
                () =>
            {
                Thread.Sleep(1000);

                workItemQueue.Enqueue(workItem);
                autoResetEvent.Set();
            }).Start();

            Assert.AreEqual(null, workItemQueue.Dequeue());

            autoResetEvent.WaitOne();

            Assert.AreEqual(1, workItemQueue.Count);
            Assert.AreEqual(0, workItemQueue.WorkItemWaiterEntryStack.Count);
        }
コード例 #23
0
        public void EnqueueTrySignalMethodShouldNotBeCalledWhenWaitingStackIsEmpty()
        {
            IWorkItemWaiterEntry workItemWaiterEntry = Substitute.For<IWorkItemWaiterEntry>();
            IWorkItemWaiterEntryStack workItemWaiterEntryStack = Substitute.For<IWorkItemWaiterEntryStack>();
            workItemWaiterEntryStack.Count.Returns(0);

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, workItemWaiterEntryStack);

            IWorkItem workItem = Substitute.For<IWorkItem>();
            workItemQueue.Enqueue(workItem);

            workItemWaiterEntry.DidNotReceiveWithAnyArgs().TrySignal(workItem);
        }
コード例 #24
0
        public void EnqueueTrySignalMethodShouldBeCalledWhenWaitingStackIsNotEmpty()
        {
            IWorkItemWaiterEntry workItemWaiterEntry = Substitute.For<IWorkItemWaiterEntry>();
            IWorkItemWaiterEntryStack workItemWaiterEntryStack = Substitute.For<IWorkItemWaiterEntryStack>();
           
            int count = 1;
            workItemWaiterEntryStack.Count.Returns(x => count);
            workItemWaiterEntryStack.Pop().Returns(
                x =>
                    {
                        if (count == 1)
                        {
                            count = 0;
                            return workItemWaiterEntry;
                        }

                        return null;
                    });

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, workItemWaiterEntryStack);

            IWorkItem workItem = Substitute.For<IWorkItem>();            
            workItemQueue.Enqueue(workItem);

            workItemWaiterEntry.Received(1).TrySignal(workItem);
        }
コード例 #25
0
        public void ShutDownShouldNotBlockDequeueWhenThereAreWorkItemsInTheQueue()
        {
            ManualResetEvent manualResetEvent = new ManualResetEvent(false);
            const int workItemWaiterTimeOutInMilliSeconds = 1000;
            WorkItemQueue workItemQueue = new WorkItemQueue(workItemWaiterTimeOutInMilliSeconds);

            IWorkItem workItem = Substitute.For<IWorkItem>();
            workItemQueue.Enqueue(workItem);
            
            new Thread(
                () =>
                {
                    manualResetEvent.Set();
                    manualResetEvent.Reset();
                    manualResetEvent.WaitOne(300);

                    IWorkItem dequeuedWorkItem = workItemQueue.Dequeue();

                    Assert.AreEqual(workItem, dequeuedWorkItem);
                }).Start();

            manualResetEvent.WaitOne(300);

            workItemQueue.ShutDown();

            manualResetEvent.Set();
        }
コード例 #26
0
        public void EnqueueShouldThrowExceptionWhenWorkItemIsEmpty()
        {
            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, Substitute.For<IWorkItemWaiterEntryStack>());

            Assert.Throws<ArgumentNullException>(() => workItemQueue.Enqueue(null));
        }
コード例 #27
0
 public void EnqueueShouldThrowExceptionWhenItIsCalledAfterShutDown()
 {
     WorkItemQueue workItemQueue = new WorkItemQueue(1 * 300);
     workItemQueue.ShutDown();
     
     Assert.Throws<LaboThreadingException>(() => workItemQueue.Enqueue(Substitute.For<IWorkItem>()));
 }
コード例 #28
0
        public void DisposeShouldNotExplode()
        {
            WorkItemQueue workItemQueue = new WorkItemQueue(300);

            Assert.DoesNotThrow(() => workItemQueue.Dispose());
        }
コード例 #29
0
ファイル: Controller.cs プロジェクト: chekiI/MediaPortal-2
    /// <summary>
    /// Initializes a new instance of the BASS player controller.
    /// </summary>
    /// <param name="player">BASS player instance which contains this controller instance.</param>
    /// <param name="playerMainDirectory">Directory where the BASS player is located. Plugins will be searched relative
    /// to this directory.</param>
    public Controller(BassPlayer player, string playerMainDirectory)
    {
      Log.Debug("Initializing BASS controller");
      _player = player;

      _bassLibraryManager = BassLibraryManager.Get(Path.Combine(playerMainDirectory, InternalSettings.PluginsPath));

      _playbackProcessor = new PlaybackProcessor(this);
      _outputDeviceManager = new OutputDeviceManager(this);

      _mainThreadTerminated = false;

      _workItemQueue = new WorkItemQueue();

      _playerThread = new Thread(PlayerThreadMain) {Name = "BassPlay"};
      _playerThread.Start();

      SetVolume_Async(100);
    }
コード例 #30
0
        public void DequeueShouldReturnQueuedWorkItemWhenQueueIsNotEmpty()
        {
            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000);

            IWorkItem workItemFirst = Substitute.For<IWorkItem>();
            IWorkItem workItemLast = Substitute.For<IWorkItem>();

            workItemQueue.Enqueue(workItemFirst);
            workItemQueue.Enqueue(workItemLast);

            Assert.AreEqual(workItemFirst, workItemQueue.Dequeue());
            Assert.AreEqual(workItemLast, workItemQueue.Dequeue());
        }
コード例 #31
0
 public void DisposeShouldNotExplode()
 {
     WorkItemQueue workItemQueue = new WorkItemQueue(300);
     Assert.DoesNotThrow(() => workItemQueue.Dispose());
 }
コード例 #32
0
        public void ShutDownShouldNotWaitMoreThanWaiterTimeOutWhenThereIsNoWorkItemsInTheQueue()
        {
            AutoResetEvent autoResetEvent = new AutoResetEvent(false);
            const int workItemWaiterTimeOutInMilliSeconds = 1000;
            WorkItemQueue workItemQueue = new WorkItemQueue(workItemWaiterTimeOutInMilliSeconds);
            new Thread(
                () =>
                {
                    Thread.Sleep(100);

                    autoResetEvent.Set();

                    IWorkItem workItem = workItemQueue.Dequeue();
                   
                    autoResetEvent.Set();

                    Assert.AreEqual(null, workItem);
                }).Start();

            autoResetEvent.WaitOne(500);

            Stopwatch stopwatch = Stopwatch.StartNew();
            workItemQueue.ShutDown();
            autoResetEvent.WaitOne(workItemWaiterTimeOutInMilliSeconds + 100);
            stopwatch.Stop();

            Assert.Less(stopwatch.ElapsedMilliseconds, workItemWaiterTimeOutInMilliSeconds);
        }
コード例 #33
0
        public void DequeueShouldReturnQueuedWorkItemWhenTheWaiterIsNotTimedOut()
        {
            IWorkItem workItem = Substitute.For<IWorkItem>();

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000);
            new Thread(
                () =>
                    {
                        Thread.Sleep(200);

                        workItemQueue.Enqueue(workItem);
                    }).Start();
            

            Assert.AreEqual(workItem, workItemQueue.Dequeue());
            Assert.AreEqual(0, workItemQueue.Count);
            Assert.AreEqual(0, workItemQueue.WorkItemWaiterEntryStack.Count);
        }
コード例 #34
0
        public void DequeueShouldReturnNullWhenTheWaiterIsTimedOut()
        {
            IWorkItem workItem = Substitute.For<IWorkItem>();

            AutoResetEvent autoResetEvent = new AutoResetEvent(false);
            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 300);
            new Thread(
                () =>
                    {
                        Thread.Sleep(1000);

                        workItemQueue.Enqueue(workItem);
                        autoResetEvent.Set();
                    }).Start();

            Assert.AreEqual(null, workItemQueue.Dequeue());

            autoResetEvent.WaitOne();

            Assert.AreEqual(1, workItemQueue.Count);
            Assert.AreEqual(0, workItemQueue.WorkItemWaiterEntryStack.Count);
        }
コード例 #35
0
        public void EnqueueShouldThrowExceptionWhenWorkItemIsEmpty()
        {
            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, Substitute.For <IWorkItemWaiterEntryStack>());

            Assert.Throws <ArgumentNullException>(() => workItemQueue.Enqueue(null));
        }
コード例 #36
0
        async Task <AzureStorageOrchestrationService> EnsureTaskHubAsync(
            string testName,
            bool testDeletion,
            bool deleteBeforeCreate = true,
            string workerId         = "test")
        {
            string storageConnectionString = TestHelpers.GetTestStorageAccountConnectionString();
            var    storageAccount          = CloudStorageAccount.Parse(storageConnectionString);

            string taskHubName = testName;
            var    settings    = new AzureStorageOrchestrationServiceSettings
            {
                TaskHubName             = taskHubName,
                StorageConnectionString = storageConnectionString,
                WorkerId = workerId,
            };

            Trace.TraceInformation($"Task Hub name: {taskHubName}");

            var service = new AzureStorageOrchestrationService(settings);

            if (deleteBeforeCreate)
            {
                await service.CreateAsync();
            }
            else
            {
                await service.CreateIfNotExistsAsync();
            }

            // Control queues
            Assert.IsNotNull(service.AllControlQueues, "Control queue collection was not initialized.");
            ControlQueue[] controlQueues = service.AllControlQueues.ToArray();
            Assert.AreEqual(4, controlQueues.Length, "Expected to see the default four control queues created.");
            foreach (ControlQueue queue in controlQueues)
            {
                Assert.IsTrue(await queue.InnerQueue.ExistsAsync(), $"Queue {queue.Name} was not created.");
            }

            // Work-item queue
            WorkItemQueue workItemQueue = service.WorkItemQueue;

            Assert.IsNotNull(workItemQueue, "Work-item queue client was not initialized.");
            Assert.IsTrue(await workItemQueue.InnerQueue.ExistsAsync(), $"Queue {workItemQueue.Name} was not created.");

            // TrackingStore
            ITrackingStore trackingStore = service.TrackingStore;

            Assert.IsNotNull(trackingStore, "Tracking Store was not initialized.");

            try
            {
                Assert.IsTrue(trackingStore.ExistsAsync().Result, $"Tracking Store was not created.");
            }
            catch (NotSupportedException)
            { }

            string             expectedContainerName = taskHubName.ToLowerInvariant() + "-leases";
            CloudBlobContainer taskHubContainer      = storageAccount.CreateCloudBlobClient().GetContainerReference(expectedContainerName);

            Assert.IsTrue(await taskHubContainer.ExistsAsync(), $"Task hub blob container {expectedContainerName} was not created.");

            // Task Hub config blob
            CloudBlob infoBlob = taskHubContainer.GetBlobReference("taskhub.json");

            Assert.IsTrue(await infoBlob.ExistsAsync(), $"The blob {infoBlob.Name} was not created.");

            // Task Hub lease container
            CloudBlobDirectory leaseDirectory = taskHubContainer.GetDirectoryReference("default");

            IListBlobItem[] leaseBlobs = (await this.ListBlobsAsync(leaseDirectory)).ToArray();
            Assert.AreEqual(controlQueues.Length, leaseBlobs.Length, "Expected to see the same number of control queues and lease blobs.");

            foreach (IListBlobItem blobItem in leaseBlobs)
            {
                string path = blobItem.Uri.AbsolutePath;
                Assert.IsTrue(
                    controlQueues.Where(q => path.Contains(q.Name)).Any(),
                    $"Could not find any known control queue name in the lease name {path}");
            }

            if (testDeletion)
            {
                await service.DeleteAsync();

                foreach (ControlQueue queue in controlQueues)
                {
                    Assert.IsFalse(await queue.InnerQueue.ExistsAsync(), $"Queue {queue.Name} was not deleted.");
                }

                Assert.IsFalse(await workItemQueue.InnerQueue.ExistsAsync(), $"Queue {workItemQueue.Name} was not deleted.");

                try
                {
                    Assert.IsFalse(trackingStore.ExistsAsync().Result, $"Tracking Store was not deleted.");
                }
                catch (NotSupportedException)
                { }

                Assert.IsFalse(await taskHubContainer.ExistsAsync(), $"Task hub blob container {taskHubContainer.Name} was not deleted.");
            }

            return(service);
        }
コード例 #37
0
ファイル: Controller.cs プロジェクト: davinx/MediaPortal-2
    /// <summary>
    /// Initializes a new instance of the BASS player controller.
    /// </summary>
    /// <param name="player">BASS player instance which contains this controller instance.</param>
    public Controller(BassPlayer player)
    {
      Log.Debug("Initializing BASS controller");
      _player = player;

      _bassLibraryManager = BassLibraryManager.Get();

      _playbackProcessor = new PlaybackProcessor(this);
      _outputDeviceManager = new OutputDeviceManager(this);

      _mainThreadTerminated = false;

      _workItemQueue = new WorkItemQueue();

      _playerThread = new Thread(PlayerThreadMain) {Name = "BassPlay"};
      _playerThread.Start();

      SetVolume_Async(100);
    }