From 73b5c0690f07d666bc765ad0e959d02d26b828a8 Mon Sep 17 00:00:00 2001 From: Laurents Meyer Date: Sun, 15 Oct 2023 19:17:31 +0200 Subject: [PATCH] Fix tests resulting in opposite provider type exceptions. --- .../ExecutionStrategyTest.cs | 9 +++++++-- .../ModelBuilding101JetTest.cs | 3 ++- .../Query/SimpleQueryJetTest.cs | 6 +++++- .../TestUtilities/SqlExceptionFactory.cs | 17 ++++++++++++++-- .../TestUtilities/TestJetConnection.cs | 10 ++++++++-- .../TestRelationalCommandBuilderFactory.cs | 20 ++++++++++++------- .../TestRelationalTransaction.cs | 8 +++++++- 7 files changed, 57 insertions(+), 16 deletions(-) diff --git a/test/EFCore.Jet.FunctionalTests/ExecutionStrategyTest.cs b/test/EFCore.Jet.FunctionalTests/ExecutionStrategyTest.cs index 4800507..ad02973 100644 --- a/test/EFCore.Jet.FunctionalTests/ExecutionStrategyTest.cs +++ b/test/EFCore.Jet.FunctionalTests/ExecutionStrategyTest.cs @@ -3,9 +3,12 @@ using System; using System.Collections.Generic; using System.Data; +using System.Data.Odbc; +using System.Data.OleDb; using System.Linq; using System.Threading; using System.Threading.Tasks; +using EntityFrameworkCore.Jet.Data; using EntityFrameworkCore.Jet.FunctionalTests.TestUtilities; using EntityFrameworkCore.Jet.Infrastructure; using Microsoft.EntityFrameworkCore.Diagnostics; @@ -104,8 +107,10 @@ namespace EntityFrameworkCore.Jet.FunctionalTests execute(new TestJetRetryingExecutionStrategy(context), context); context.ChangeTracker.AcceptAllChanges(); - var retryMessage = - "System.Data.OleDb.OleDbException : Bang!"; + var retryMessage = (TestEnvironment.DataAccessProviderType == DataAccessProviderType.OleDb + ? typeof(OleDbException) + : typeof(OdbcException)).FullName + " : Bang!";; + if (realFailure) { var logEntry = Fixture.TestSqlLoggerFactory.Log.Single(l => l.Id == CoreEventId.ExecutionStrategyRetrying); diff --git a/test/EFCore.Jet.FunctionalTests/ModelBuilding101JetTest.cs b/test/EFCore.Jet.FunctionalTests/ModelBuilding101JetTest.cs index d284b55..3f364cf 100644 --- a/test/EFCore.Jet.FunctionalTests/ModelBuilding101JetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/ModelBuilding101JetTest.cs @@ -1,3 +1,4 @@ +using EntityFrameworkCore.Jet.FunctionalTests.TestUtilities; using Microsoft.EntityFrameworkCore; namespace EntityFrameworkCore.Jet.FunctionalTests; @@ -5,5 +6,5 @@ namespace EntityFrameworkCore.Jet.FunctionalTests; public class ModelBuilding101JetTest : ModelBuilding101RelationalTestBase { protected override DbContextOptionsBuilder ConfigureContext(DbContextOptionsBuilder optionsBuilder) - => optionsBuilder.UseJet(); + => optionsBuilder.UseJet(TestEnvironment.DefaultConnection); // TODO: Use TestEnvironment.DataAccessProviderFactory/...Type instead. } diff --git a/test/EFCore.Jet.FunctionalTests/Query/SimpleQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/SimpleQueryJetTest.cs index c28e6c5..6ffc823 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/SimpleQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/SimpleQueryJetTest.cs @@ -537,8 +537,12 @@ WHERE `t`.`Species` LIKE 'F%' { var contextFactory = await InitializeAsync(); using var context = contextFactory.CreateContext(); + + var parameter = TestEnvironment.DataAccessProviderFactory.CreateParameter(); + parameter.Value = 1; + var query = context.DemoEntities - .FromSqlRaw("SELECT * FROM DemoEntities WHERE Id = {0}", new OleDbParameter { Value = 1 }) + .FromSqlRaw("SELECT * FROM DemoEntities WHERE Id = {0}", parameter) .Select(e => e.Id); var query2 = context.DemoEntities diff --git a/test/EFCore.Jet.FunctionalTests/TestUtilities/SqlExceptionFactory.cs b/test/EFCore.Jet.FunctionalTests/TestUtilities/SqlExceptionFactory.cs index feaa1f6..56fec6a 100644 --- a/test/EFCore.Jet.FunctionalTests/TestUtilities/SqlExceptionFactory.cs +++ b/test/EFCore.Jet.FunctionalTests/TestUtilities/SqlExceptionFactory.cs @@ -1,16 +1,16 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Data.Odbc; using System.Linq; using System.Reflection; -using EntityFrameworkCore.Jet.Data; using System.Data.OleDb; namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities { public static class OleDbExceptionFactory { - public static OleDbException CreateOleDbException(int number, Guid? connectionId = null) + public static OleDbException CreateException(int number, Guid? connectionId = null) { var exceptionCtors = typeof(OleDbException) .GetTypeInfo() @@ -20,4 +20,17 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities .Invoke(new object[] { "Bang!", number, null }); } } + + public static class OdbcExceptionFactory + { + public static OdbcException CreateException(int number, Guid? connectionId = null) + { + var exceptionCtors = typeof(OdbcException) + .GetTypeInfo() + .DeclaredConstructors; + + return (OdbcException)exceptionCtors.First(c => c.GetParameters().Length == 3) + .Invoke(new object[] { "Bang!", number, null }); + } + } } diff --git a/test/EFCore.Jet.FunctionalTests/TestUtilities/TestJetConnection.cs b/test/EFCore.Jet.FunctionalTests/TestUtilities/TestJetConnection.cs index bb144bf..76b7f1b 100644 --- a/test/EFCore.Jet.FunctionalTests/TestUtilities/TestJetConnection.cs +++ b/test/EFCore.Jet.FunctionalTests/TestUtilities/TestJetConnection.cs @@ -1,11 +1,12 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.Data; using System.Data.Common; -using EntityFrameworkCore.Jet.Data; using System.Threading; using System.Threading.Tasks; +using EntityFrameworkCore.Jet.Data; using EntityFrameworkCore.Jet.Storage.Internal; using Microsoft.EntityFrameworkCore.Storage; @@ -13,9 +14,14 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities { public class TestJetConnection : JetRelationalConnection { + private readonly Func _createExceptionFunc; + public TestJetConnection(RelationalConnectionDependencies dependencies) : base(dependencies) { + _createExceptionFunc = TestEnvironment.DataAccessProviderType == DataAccessProviderType.OleDb + ? number => OleDbExceptionFactory.CreateException(number) + : number => OdbcExceptionFactory.CreateException(number); } public int ErrorNumber { get; set; } = -2; @@ -56,7 +62,7 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities if (fail.HasValue) { - throw OleDbExceptionFactory.CreateOleDbException(ErrorNumber); + throw _createExceptionFunc(ErrorNumber); } } } diff --git a/test/EFCore.Jet.FunctionalTests/TestUtilities/TestRelationalCommandBuilderFactory.cs b/test/EFCore.Jet.FunctionalTests/TestUtilities/TestRelationalCommandBuilderFactory.cs index d1b2315..99fee8a 100644 --- a/test/EFCore.Jet.FunctionalTests/TestUtilities/TestRelationalCommandBuilderFactory.cs +++ b/test/EFCore.Jet.FunctionalTests/TestUtilities/TestRelationalCommandBuilderFactory.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Data.Common; using System.Threading; using System.Threading.Tasks; +using EntityFrameworkCore.Jet.Data; using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Storage; @@ -98,6 +99,7 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities private class TestRelationalCommand : IRelationalCommand { private readonly RelationalCommand _realRelationalCommand; + private readonly Func _createExceptionFunc; public TestRelationalCommand( RelationalCommandBuilderDependencies dependencies, @@ -105,6 +107,10 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities IReadOnlyList parameters) { _realRelationalCommand = new RelationalCommand(dependencies, commandText, parameters); + + _createExceptionFunc = TestEnvironment.DataAccessProviderType == DataAccessProviderType.OleDb + ? number => OleDbExceptionFactory.CreateException(number) + : number => OdbcExceptionFactory.CreateException(number); } public string CommandText => _realRelationalCommand.CommandText; @@ -120,7 +126,7 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities if (errorNumber.HasValue) { connection.DbConnection.Close(); - throw OleDbExceptionFactory.CreateOleDbException(errorNumber.Value); + throw _createExceptionFunc(errorNumber.Value); } return result; @@ -137,7 +143,7 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities if (errorNumber.HasValue) { connection.DbConnection.Close(); - throw OleDbExceptionFactory.CreateOleDbException(errorNumber.Value); + throw _createExceptionFunc(errorNumber.Value); } return result; @@ -152,7 +158,7 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities if (errorNumber.HasValue) { connection.DbConnection.Close(); - throw OleDbExceptionFactory.CreateOleDbException(errorNumber.Value); + throw _createExceptionFunc(errorNumber.Value); } return result; @@ -169,7 +175,7 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities if (errorNumber.HasValue) { connection.DbConnection.Close(); - throw OleDbExceptionFactory.CreateOleDbException(errorNumber.Value); + throw _createExceptionFunc(errorNumber.Value); } return result; @@ -185,7 +191,7 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities { connection.DbConnection.Close(); result.Dispose(); // Normally, in non-test case, reader is disposed by using in caller code - throw OleDbExceptionFactory.CreateOleDbException(errorNumber.Value); + throw _createExceptionFunc(errorNumber.Value); } return result; @@ -203,7 +209,7 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities { connection.DbConnection.Close(); result.Dispose(); // Normally, in non-test case, reader is disposed by using in caller code - throw OleDbExceptionFactory.CreateOleDbException(errorNumber.Value); + throw _createExceptionFunc(errorNumber.Value); } return result; @@ -232,7 +238,7 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities if (fail.Value) { testConnection.DbConnection.Close(); - throw OleDbExceptionFactory.CreateOleDbException(testConnection.ErrorNumber); + throw _createExceptionFunc(testConnection.ErrorNumber); } errorNumber = testConnection.ErrorNumber; diff --git a/test/EFCore.Jet.FunctionalTests/TestUtilities/TestRelationalTransaction.cs b/test/EFCore.Jet.FunctionalTests/TestUtilities/TestRelationalTransaction.cs index e5e9801..414aedb 100644 --- a/test/EFCore.Jet.FunctionalTests/TestUtilities/TestRelationalTransaction.cs +++ b/test/EFCore.Jet.FunctionalTests/TestUtilities/TestRelationalTransaction.cs @@ -2,6 +2,7 @@ using System; using System.Data.Common; +using EntityFrameworkCore.Jet.Data; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.EntityFrameworkCore.Storage; @@ -29,6 +30,7 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities public class TestRelationalTransaction : RelationalTransaction { private readonly TestJetConnection _testConnection; + private readonly Func _createExceptionFunc; public TestRelationalTransaction( IRelationalConnection connection, @@ -39,6 +41,10 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities : base(connection, transaction, new Guid(), logger, transactionOwned, sqlGenerationHelper) { _testConnection = (TestJetConnection)connection; + + _createExceptionFunc = TestEnvironment.DataAccessProviderType == DataAccessProviderType.OleDb + ? OleDbExceptionFactory.CreateException + : OdbcExceptionFactory.CreateException; } public override void Commit() @@ -58,7 +64,7 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities } _testConnection.DbConnection.Close(); - throw OleDbExceptionFactory.CreateOleDbException(_testConnection.ErrorNumber, _testConnection.ConnectionId); + throw _createExceptionFunc(_testConnection.ErrorNumber, _testConnection.ConnectionId); } }