1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
namespace System.Data.Entity.SqlServer
{
using System.Data.Entity.Core;
using System.Data.Entity.Infrastructure;
using System.Threading.Tasks;
using Xunit;
public class DefaultSqlExecutionStrategyTests
{
[Fact]
public void SupportsExistingTransactions_returns_true()
{
Assert.True(new DefaultSqlExecutionStrategy().SupportsExistingTransactions);
}
[Fact]
public void Execute_Action_doesnt_retry_on_transient_exceptions()
{
Execute_doesnt_retry_on_transient_exceptions((e, a) => e.Execute(() => { a(); }));
}
[Fact]
public void Execute_Func_doesnt_retry_on_transient_exceptions()
{
Execute_doesnt_retry_on_transient_exceptions((e, a) => e.Execute(a));
}
private void Execute_doesnt_retry_on_transient_exceptions(Action<IExecutionStrategy, Func<int>> execute)
{
var executionStrategy = new DefaultSqlExecutionStrategy();
var executionCount = 0;
var exception = Assert.Throws<EntityException>(
() =>
execute(
executionStrategy,
() =>
{
executionCount++;
throw new TimeoutException();
}));
Assert.IsType<TimeoutException>(exception.InnerException);
exception.ValidateMessage(
TestBase.EntityFrameworkSqlServerAssembly,
"TransientExceptionDetected", "System.Data.Entity.SqlServer.Properties.Resources.SqlServer");
Assert.Equal(1, executionCount);
}
[Fact]
public void Execute_Action_doesnt_retry_on_nontransient_exceptions()
{
Execute_doesnt_retry_on_nontransient_exceptions((e, a) => e.Execute(() => { a(); }));
}
[Fact]
public void Execute_Func_doesnt_retry_on_nontransient_exceptions()
{
Execute_doesnt_retry_on_nontransient_exceptions((e, a) => e.Execute(a));
}
private void Execute_doesnt_retry_on_nontransient_exceptions(Action<IExecutionStrategy, Func<int>> execute)
{
var executionStrategy = new DefaultSqlExecutionStrategy();
var executionCount = 0;
Assert.Throws<ArgumentException>(
() =>
execute(
executionStrategy,
() =>
{
executionCount++;
throw new ArgumentException();
}));
Assert.Equal(1, executionCount);
}
#if !NET40
[Fact]
public void ExecuteAsync_Action_doesnt_retry_on_transient_exceptions()
{
ExecuteAsync_doesnt_retry_on_transient_exceptions((e, f) => e.ExecuteAsync(() => (Task)f()));
}
[Fact]
public void ExecuteAsync_Func_doesnt_retry_on_transient_exceptions()
{
ExecuteAsync_doesnt_retry_on_transient_exceptions((e, f) => e.ExecuteAsync(f));
}
private void ExecuteAsync_doesnt_retry_on_transient_exceptions(Func<IExecutionStrategy, Func<Task<int>>, Task> executeAsync)
{
var executionStrategy = new DefaultSqlExecutionStrategy();
var executionCount = 0;
var exception = Assert.Throws<EntityException>(
() =>
ExceptionHelpers.UnwrapAggregateExceptions(
() =>
executeAsync(
executionStrategy,
() =>
{
executionCount++;
throw new TimeoutException();
}).Wait()));
Assert.IsType<TimeoutException>(exception.InnerException);
exception.ValidateMessage(
TestBase.EntityFrameworkSqlServerAssembly,
"TransientExceptionDetected", "System.Data.Entity.SqlServer.Properties.Resources.SqlServer");
Assert.Equal(1, executionCount);
}
[Fact]
public void ExecuteAsync_Action_doesnt_retry_on_nontransient_exceptions()
{
ExecuteAsync_doesnt_retry_on_nontransient_exceptions((e, f) => e.ExecuteAsync(() => (Task)f()));
}
[Fact]
public void ExecuteAsync_Func_doesnt_retry_on_nontransient_exceptions()
{
ExecuteAsync_doesnt_retry_on_nontransient_exceptions((e, f) => e.ExecuteAsync(f));
}
private void ExecuteAsync_doesnt_retry_on_nontransient_exceptions(Func<IExecutionStrategy, Func<Task<int>>, Task> executeAsync)
{
var executionStrategy = new DefaultSqlExecutionStrategy();
var executionCount = 0;
Assert.Throws<ArgumentException>(
() =>
ExceptionHelpers.UnwrapAggregateExceptions(
() =>
executeAsync(
executionStrategy,
() =>
{
executionCount++;
throw new ArgumentException();
}).Wait()));
Assert.Equal(1, executionCount);
}
#endif
}
}
|