예제 #1
0
        private async Task AssertRetryThenSuccessAsync(OperationBase op, Exception exp)
        {
            var retryOrchestrator = CreateRetryOrchestrator();

            var bucketMock = new Mock <BucketBase>("fake", new ClusterContext(), new Mock <IScopeFactory>().Object,
                                                   retryOrchestrator, new Mock <ILogger>().Object, new Mock <IRedactor>().Object,
                                                   new Mock <IBootstrapperFactory>().Object, NullRequestTracer.Instance);
            var handleOperationCompletedMethod = op.GetType().GetMethod("HandleOperationCompleted", (BindingFlags.Instance | BindingFlags.NonPublic));

            bucketMock.Setup(x => x.SendAsync(op, It.IsAny <CancellationToken>())).Callback((IOperation op, CancellationToken ct) =>
            {
                if (op.Completed.IsCompleted)
                {
                    Assert.True(false, "operation result should be reset before retry");
                }
                // complete the operation (ResponseStatus does not matter for this test)
                handleOperationCompletedMethod.Invoke(op, new object[] { null, ResponseStatus.TemporaryFailure });
                if (op.Attempts == 1)
                {
                    throw exp;
                }
            }).Returns(op.Completed);

            var tokenSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(2500));

            try
            {
                await retryOrchestrator.RetryAsync(bucketMock.Object, op, tokenSource.Token).ConfigureAwait(false);
            }
            catch (Exception e)
            {
                Assert.True(false, "Expected operation to succeed after retry");
            }
            Assert.True(op.Attempts > 1);
        }
예제 #2
0
        public void ExecuteOp(OperationBase op)
        {
            if (LastSavedOp > UndoStack.Count)
            {
                LastSavedOp = -1;
            }
            RedoStack.Clear();
            UndoStack.Push(op);
            op.Execute();
            Unsaved = true;

            ApplicationSettings.Instance.SystemLog.Add($"Execute Operation: {op.GetType().Name} with parameter {op.Parameter}.");
        }
예제 #3
0
        private void OnOperationPropertyChanged(OperationBase oldOperation, OperationBase newOperation)
        {
            if (oldOperation != null)
            {
                oldOperation.Completed -= OnOperationCompleted;
                this.IsBusy = false;
            }

            if (newOperation != null)
            {
                newOperation.Completed += OnOperationCompleted;
                SetOperationMessage(newOperation.GetType());
                this.IsBusy = true;
            }
        }
예제 #4
0
        internal void HookOperationEvent(OperationBase operation)
        {
            var opEvents = operation.GetType().GetEvents(BindingFlags.Instance | BindingFlags.Public);

            foreach (var opEvent in opEvents)
            {
                if (_eventNames.Contains(opEvent.Name))
                {
                    try
                    {
                        var mi = GetType().GetMethod(nameof(HandleOperationEvent), BindingFlags.NonPublic | BindingFlags.Instance);
                        if (mi != null)
                        {
                            var handler = Delegate.CreateDelegate(opEvent.EventHandlerType, this, mi);
                            opEvent.AddEventHandler(operation, handler);
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                }
            }
        }
예제 #5
0
 private void VerifyOperationSucceeded(OperationBase operation)
 {
     Assert.IsFalse(operation.HasError, string.Format("Operation of type {0} contains error {1}", operation.GetType(), operation.Error));
 }