public void Async_Dispatch_can_change_exception_thrown()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>().AsAsync();
                var mockInterceptors    = CreateMockInterceptors(
                    c =>
                {
                    Assert.True(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    Assert.False(c.IsSuppressed);
                },
                    c =>
                {
                    Assert.True(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.NotEmpty(c.Exception.Message);
                    Assert.Equal("Bang!", c.OriginalException.Message);
                    c.Exception = new Exception("Bing!");
                    Assert.False(c.IsSuppressed);
                });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                var operation = new Task <string>(() => { throw new Exception("Bang!"); });

                var interceptTask = dispatcher.DispatchAsync(
                    () => operation,
                    interceptionContext,
                    i => i.CallMeFirst(interceptionContext),
                    i => i.CallMe(interceptionContext));

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.Each(i => i.Verify(m => m.CallMe(It.IsAny <DbCommandInterceptionContext <string> >()), Times.Never()));

                operation.Start();
                Assert.Equal(
                    "Bing!",
                    Assert.Throws <AggregateException>(() => interceptTask.Wait()).InnerException.Message);

                mockInterceptors.Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Once()));
            }
            public void Async_Dispatch_dispatches_to_all_registered_interceptors_even_if_task_is_canceled()
            {
                var mockInterceptors = CreateMockInterceptors(
                    c =>
                {
                    Assert.True(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    Assert.False(c.IsSuppressed);
                },
                    c =>
                {
                    Assert.True(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    Assert.False(c.IsSuppressed);
                });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                var cancellationTokenSource = new CancellationTokenSource();
                var cancellationToken       = cancellationTokenSource.Token;
                var operation = new Task <string>(() => "0", cancellationToken);

                var interceptionContext = new DbCommandInterceptionContext <string>().AsAsync();

                var interceptTask = dispatcher.DispatchAsync(
                    () => operation,
                    interceptionContext,
                    i => i.CallMeFirst(interceptionContext),
                    i => i.CallMe(interceptionContext));

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.Each(i => i.Verify(m => m.CallMe(It.IsAny <DbCommandInterceptionContext <string> >()), Times.Never()));

                cancellationTokenSource.Cancel();
                Assert.Throws <AggregateException>(() => interceptTask.Wait());

                mockInterceptors.Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Once()));
            }
            public void Async_Dispatch_can_prevent_exception_from_being_thrown_and_return_result_instead()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>().AsAsync();
                var mockInterceptors    = CreateMockInterceptors(
                    c =>
                {
                    Assert.True(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    Assert.False(c.IsSuppressed);
                },
                    c =>
                {
                    Assert.True(c.IsAsync);
                    Assert.Null(c.OriginalResult);
                    Assert.Equal("Bang!", c.OriginalException.Message);
                    c.Exception = null;
                    c.Result    = "N";
                    Assert.False(c.IsSuppressed);
                });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                var operation = new Task <string>(() => { throw new Exception("Bang!"); });

                var interceptTask = dispatcher.DispatchAsync(
                    () => operation,
                    interceptionContext,
                    i => i.CallMeFirst(interceptionContext),
                    i => i.CallMe(interceptionContext));

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.Each(i => i.Verify(m => m.CallMe(It.IsAny <DbCommandInterceptionContext <string> >()), Times.Never()));

                operation.Start();
                interceptTask.Wait();

                Assert.Equal("N", interceptTask.Result);

                mockInterceptors.Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Once()));
            }
            public void Execution_of_async_operation_can_be_suppressed_by_setting_exception_with_everything_else_still_happening()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>().AsAsync();
                var mockInterceptors    = CreateMockInterceptors(
                    c =>
                {
                    Assert.True(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.OriginalException);
                    if (c.Exception == null)
                    {
                        c.Exception = new Exception("Bing!");
                    }
                    Assert.True(c.IsSuppressed);
                },
                    c =>
                {
                    Assert.True(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Equal("Bing!", c.Exception.Message);
                    Assert.Null(c.OriginalException);
                    Assert.True(c.IsSuppressed);
                });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                var operation = new Task <string>(() => "0");

                var interceptTask = dispatcher.DispatchAsync(
                    () => operation,
                    interceptionContext,
                    i => i.CallMeFirst(interceptionContext),
                    i => i.CallMe(interceptionContext));

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Once()));

                Assert.Equal(
                    "Bing!",
                    Assert.Throws <AggregateException>(() => interceptTask.Wait()).InnerException.Message);
            }
            public void Async_Dispatch_dispatches_to_all_registered_interceptors_and_aggregates_results_of_operations()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>().AsAsync();
                var mockInterceptors    = CreateMockInterceptors(
                    c =>
                {
                    Assert.True(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    Assert.False(c.IsSuppressed);
                },
                    c =>
                {
                    Assert.True(c.IsAsync);
                    Assert.NotEmpty(c.Result);
                    Assert.Equal("0", c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    Assert.False(c.IsSuppressed);
                });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                var operation = new Task <string>(() => "0");

                var interceptTask = dispatcher.DispatchAsync(
                    () => operation,
                    interceptionContext,
                    i => i.CallMeFirst(interceptionContext),
                    i => interceptionContext.Result = interceptionContext.Result + i.CallMe(interceptionContext));

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.Each(i => i.Verify(m => m.CallMe(It.IsAny <DbCommandInterceptionContext <string> >()), Times.Never()));

                operation.Start();
                interceptTask.Wait();

                Assert.Equal("0123", interceptTask.Result);

                mockInterceptors.Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Once()));
            }
            public void Async_Dispatch_executes_operation_and_returns_result_if_no_dispatchers_registered()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>().AsAsync();
                var dispatcher          = new InternalDispatcher <IFakeInterceptor1>();
                var operation           = new Task <string>(() => "0");

                var interceptTask = dispatcher.DispatchAsync(
                    () => operation,
                    interceptionContext,
                    i => i.CallMeFirst(interceptionContext),
                    i => interceptionContext.Result = interceptionContext.Result + i.CallMe(interceptionContext));

                operation.Start();
                interceptTask.Wait();

                Assert.Equal("0", operation.Result);
                Assert.Equal("0", interceptTask.Result);
            }
            public void Execution_of_async_operation_can_be_suppressed_explicitly_with_everything_else_still_happening()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>().AsAsync();
                var mockInterceptors    = CreateMockInterceptors(
                    c =>
                {
                    Assert.True(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.OriginalException);
                    Assert.Null(c.OriginalException);
                    c.SuppressExecution();
                    Assert.True(c.IsSuppressed);
                },
                    c =>
                {
                    Assert.True(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.OriginalException);
                    Assert.Null(c.OriginalException);
                    Assert.True(c.IsSuppressed);
                });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                var operation = new Task <string>(() => "0");

                var interceptTask = dispatcher.DispatchAsync(
                    () => operation,
                    interceptionContext,
                    i => i.CallMeFirst(interceptionContext),
                    i => i.CallMe(interceptionContext));

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Once()));

                interceptTask.Wait();

                Assert.Null(interceptTask.Result);
            }
Example #8
0
        /// <summary>
        ///     Sends <see cref="IDbCommandInterceptor.ReaderExecuting" /> and
        ///     <see cref="IDbCommandInterceptor.ReaderExecuted" /> to any  <see cref="IDbCommandInterceptor" />
        ///     interceptors that are registered on <see cref="Interception" /> before/after making a
        ///     call to <see cref="DbCommand.ExecuteReaderAsync(CommandBehavior, CancellationToken)" />.
        /// </summary>
        /// <remarks>
        ///     Note that the result of executing the command is returned by this method. The result is not available
        ///     in the interception context passed into this method since the interception context is cloned before
        ///     being passed to interceptors.
        /// </remarks>
        /// <param name="command">The command on which the operation will be executed.</param>
        /// <param name="cancellationToken">The cancellation token for the asynchronous operation.</param>
        /// <param name="interceptionContext">Optional information about the context of the call being made.</param>
        /// <returns>The result of the operation, which may have been modified by interceptors.</returns>
        public virtual Task <DbDataReader> AsyncReader(
            DbCommand command, CancellationToken cancellationToken, DbCommandBaseInterceptionContext interceptionContext)
        {
            Check.NotNull(command, "command");
            Check.NotNull(interceptionContext, "interceptionContext");

            var clonedInterceptionContext = new DbCommandInterceptionContext <DbDataReader>(interceptionContext);

            if (!clonedInterceptionContext.IsAsync)
            {
                clonedInterceptionContext = clonedInterceptionContext.AsAsync();
            }

            return(InternalDispatcher.DispatchAsync(
                       () => command.ExecuteReaderAsync(clonedInterceptionContext.CommandBehavior, cancellationToken),
                       clonedInterceptionContext,
                       i => i.ReaderExecuting(command, clonedInterceptionContext),
                       i => i.ReaderExecuted(command, clonedInterceptionContext)));
        }
Example #9
0
        /// <summary>
        ///     Sends <see cref="IDbCommandInterceptor.ScalarExecuting" /> and
        ///     <see cref="IDbCommandInterceptor.ScalarExecuted" /> to any  <see cref="IDbCommandInterceptor" />
        ///     interceptors that are registered on <see cref="Interception" /> before/after making a
        ///     call to <see cref="DbCommand.ExecuteScalarAsync(CancellationToken)" />.
        /// </summary>
        /// <remarks>
        ///     Note that the result of executing the command is returned by this method. The result is not available
        ///     in the interception context passed into this method since the interception context is cloned before
        ///     being passed to interceptors.
        /// </remarks>
        /// <param name="command">The command on which the operation will be executed.</param>
        /// <param name="cancellationToken">The cancellation token for the asynchronous operation.</param>
        /// <param name="interceptionContext">Optional information about the context of the call being made.</param>
        /// <returns>The result of the operation, which may have been modified by interceptors.</returns>
        public virtual Task <object> AsyncScalar(
            DbCommand command, CancellationToken cancellationToken, DbCommandBaseInterceptionContext interceptionContext)
        {
            Check.NotNull(command, "command");
            Check.NotNull(interceptionContext, "interceptionContext");

            var clonedInterceptionContext = new DbCommandInterceptionContext <object>(interceptionContext);

            if (!clonedInterceptionContext.IsAsync)
            {
                clonedInterceptionContext = clonedInterceptionContext.AsAsync();
            }

            return(InternalDispatcher.DispatchAsync(
                       () => command.ExecuteScalarAsync(cancellationToken),
                       clonedInterceptionContext,
                       i => i.ScalarExecuting(command, clonedInterceptionContext),
                       i => i.ScalarExecuted(command, clonedInterceptionContext)));
        }
            public void Execution_of_operation_can_be_suppressed_by_setting_result_with_everything_else_still_happening()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>();
                var mockInterceptors    = CreateMockInterceptors(
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    if (c.Result == null)
                    {
                        c.Result = "N";
                    }
                    Assert.True(c.IsSuppressed);
                },
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.NotEmpty(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    Assert.True(c.IsSuppressed);
                });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                Assert.Equal(
                    "N123",
                    dispatcher.Dispatch(
                        (Func <string>)(() => { throw new Exception("Bang!"); }),
                        interceptionContext,
                        i => i.CallMeFirst(interceptionContext),
                        i => interceptionContext.Result = interceptionContext.Result + i.CallMe(interceptionContext)));

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Once()));
            }
            public void Operation_Dispatch_can_change_exception_thrown()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>();
                var mockInterceptors    = CreateMockInterceptors(
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    Assert.False(c.IsSuppressed);
                },
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.NotEmpty(c.Exception.Message);
                    Assert.Equal("Bang!", c.OriginalException.Message);
                    c.Exception = new Exception("Bing!");
                    Assert.False(c.IsSuppressed);
                });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                var exception = Assert.Throws <Exception>(
                    () => dispatcher.Dispatch(
                        (Func <string>)(() => { throw new Exception("Bang!"); }),
                        interceptionContext,
                        i => i.CallMeFirst(interceptionContext),
                        i => i.CallMe(interceptionContext)));

                Assert.Equal("Bing!", exception.Message);

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Once()));
            }
            public void Interceptors_for_only_the_matching_interface_type_can_be_added_and_removed()
            {
                var mockInterceptor1 = new Mock <IFakeInterceptor1>();
                var mockInterceptor2 = new Mock <IFakeInterceptor2>();

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                dispatcher.Add(mockInterceptor1.Object);
                dispatcher.Add(mockInterceptor2.Object);

                dispatcher.Dispatch(i => i.CallMe(new DbCommandInterceptionContext <string>()));

                mockInterceptor1.Verify(m => m.CallMe(It.IsAny <DbCommandInterceptionContext <string> >()), Times.Once());
                mockInterceptor2.Verify(m => m.CallMe(It.IsAny <DbCommandInterceptionContext <string> >()), Times.Never());

                dispatcher.Remove(mockInterceptor1.Object);
                dispatcher.Remove(mockInterceptor2.Object);

                dispatcher.Dispatch(i => i.CallMe(new DbCommandInterceptionContext <string>()));

                mockInterceptor1.Verify(m => m.CallMe(It.IsAny <DbCommandInterceptionContext <string> >()), Times.Once());
                mockInterceptor2.Verify(m => m.CallMe(It.IsAny <DbCommandInterceptionContext <string> >()), Times.Never());
            }
            public void Operation_Dispatch_is_aborted_if_Executed_interceptor_throws_exception()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>();
                var mockInterceptors    = CreateMockInterceptors(
                    c => { },
                    c => { throw new Exception("Ba-da-bing!"); });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                Assert.Equal(
                    "Ba-da-bing!",
                    Assert.Throws <Exception>(
                        () => dispatcher.Dispatch(
                            () => "N",
                            interceptionContext,
                            i => i.CallMeFirst(interceptionContext),
                            i => i.CallMe(interceptionContext))).Message);

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.First().Verify(m => m.CallMe(interceptionContext), Times.Once());
                mockInterceptors.Skip(1).Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Never()));
            }