diff --git a/src/EFCore/ChangeTracking/Internal/StateManagerDependencies.cs b/src/EFCore/ChangeTracking/Internal/StateManagerDependencies.cs index b8d58d85fac..fd40b2dd0d7 100644 --- a/src/EFCore/ChangeTracking/Internal/StateManagerDependencies.cs +++ b/src/EFCore/ChangeTracking/Internal/StateManagerDependencies.cs @@ -293,7 +293,7 @@ public StateManagerDependencies With([NotNull] IInternalEntityEntryNotifier inte /// /// A replacement for the current dependency of this type. /// A new parameter object with the given service replaced. - public StateManagerDependencies With([NotNull] ValueGenerationManager valueGenerationManager) + public StateManagerDependencies With([NotNull] IValueGenerationManager valueGenerationManager) => new StateManagerDependencies( InternalEntityEntryFactory, InternalEntityEntrySubscriber, diff --git a/test/EFCore.Cosmos.Tests/CosmosApiConsistencyTest.cs b/test/EFCore.Cosmos.Tests/CosmosApiConsistencyTest.cs index b6092eb2579..1c51ad333f8 100644 --- a/test/EFCore.Cosmos.Tests/CosmosApiConsistencyTest.cs +++ b/test/EFCore.Cosmos.Tests/CosmosApiConsistencyTest.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Reflection; using Microsoft.EntityFrameworkCore.Cosmos.Storage.Internal; +using Microsoft.EntityFrameworkCore.Cosmos.TestUtilities; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.Extensions.DependencyInjection; @@ -19,14 +20,19 @@ public CosmosApiConsistencyTest(CosmosApiConsistencyFixture fixture) } protected override void AddServices(ServiceCollection serviceCollection) - { - serviceCollection.AddEntityFrameworkCosmos(); - } + => serviceCollection.AddEntityFrameworkCosmos(); protected override Assembly TargetAssembly => typeof(CosmosDatabaseWrapper).Assembly; public class CosmosApiConsistencyFixture : ApiConsistencyFixtureBase { + public override bool TryGetProviderOptionsDelegate(out Action configureOptions) + { + configureOptions = b => CosmosTestHelpers.Instance.UseProviderOptions(b); + + return true; + } + public override HashSet FluentApiTypes { get; } = new HashSet { typeof(CosmosModelBuilderExtensions), diff --git a/test/EFCore.Cosmos.Tests/TestUtilities/CosmosTestHelpers.cs b/test/EFCore.Cosmos.Tests/TestUtilities/CosmosTestHelpers.cs index 336ef9d3bd3..32e465120f4 100644 --- a/test/EFCore.Cosmos.Tests/TestUtilities/CosmosTestHelpers.cs +++ b/test/EFCore.Cosmos.Tests/TestUtilities/CosmosTestHelpers.cs @@ -17,7 +17,7 @@ protected CosmosTestHelpers() public override IServiceCollection AddProviderServices(IServiceCollection services) => services.AddEntityFrameworkCosmos(); - protected override void UseProviderOptions(DbContextOptionsBuilder optionsBuilder) + public override void UseProviderOptions(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseCosmos( TestEnvironment.DefaultConnection, TestEnvironment.AuthToken, diff --git a/test/EFCore.Design.Tests/DesignApiConsistencyTest.cs b/test/EFCore.Design.Tests/DesignApiConsistencyTest.cs index 9bad045f4d0..b7b2994a8fd 100644 --- a/test/EFCore.Design.Tests/DesignApiConsistencyTest.cs +++ b/test/EFCore.Design.Tests/DesignApiConsistencyTest.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Reflection; using Microsoft.EntityFrameworkCore.Design; +using Microsoft.EntityFrameworkCore.TestUtilities; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.EntityFrameworkCore @@ -24,6 +25,13 @@ protected override void AddServices(ServiceCollection serviceCollection) public class DesignApiConsistencyFixture : ApiConsistencyFixtureBase { + public override bool TryGetProviderOptionsDelegate(out Action configureOptions) + { + configureOptions = b => InMemoryTestHelpers.Instance.UseProviderOptions(b); + + return true; + } + public override HashSet FluentApiTypes { get; } = new HashSet() { typeof(DesignTimeServiceCollectionExtensions) diff --git a/test/EFCore.InMemory.FunctionalTests/TestUtilities/InMemoryTestHelpers.cs b/test/EFCore.InMemory.FunctionalTests/TestUtilities/InMemoryTestHelpers.cs index e322a4d9838..f8e680959e4 100644 --- a/test/EFCore.InMemory.FunctionalTests/TestUtilities/InMemoryTestHelpers.cs +++ b/test/EFCore.InMemory.FunctionalTests/TestUtilities/InMemoryTestHelpers.cs @@ -18,7 +18,7 @@ protected InMemoryTestHelpers() public override IServiceCollection AddProviderServices(IServiceCollection services) => services.AddEntityFrameworkInMemoryDatabase(); - protected override void UseProviderOptions(DbContextOptionsBuilder optionsBuilder) + public override void UseProviderOptions(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseInMemoryDatabase(nameof(InMemoryTestHelpers)); public override LoggingDefinitions LoggingDefinitions { get; } = new InMemoryLoggingDefinitions(); diff --git a/test/EFCore.InMemory.Tests/InMemoryApiConsistencyTest.cs b/test/EFCore.InMemory.Tests/InMemoryApiConsistencyTest.cs index 0b2a0039f71..8b91c904255 100644 --- a/test/EFCore.InMemory.Tests/InMemoryApiConsistencyTest.cs +++ b/test/EFCore.InMemory.Tests/InMemoryApiConsistencyTest.cs @@ -6,6 +6,7 @@ using System.Reflection; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.InMemory.Storage.Internal; +using Microsoft.EntityFrameworkCore.TestUtilities; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.EntityFrameworkCore @@ -18,14 +19,19 @@ public InMemoryApiConsistencyTest(InMemoryApiConsistencyFixture fixture) } protected override void AddServices(ServiceCollection serviceCollection) - { - serviceCollection.AddEntityFrameworkInMemoryDatabase(); - } + => serviceCollection.AddEntityFrameworkInMemoryDatabase(); protected override Assembly TargetAssembly => typeof(InMemoryDatabase).Assembly; public class InMemoryApiConsistencyFixture : ApiConsistencyFixtureBase { + public override bool TryGetProviderOptionsDelegate(out Action configureOptions) + { + configureOptions = b => InMemoryTestHelpers.Instance.UseProviderOptions(b); + + return true; + } + public override HashSet FluentApiTypes { get; } = new HashSet() { typeof(InMemoryServiceCollectionExtensions), diff --git a/test/EFCore.Proxies.Tests/ProxiesApiConsistencyTest.cs b/test/EFCore.Proxies.Tests/ProxiesApiConsistencyTest.cs index eb633169900..931c34ddbf3 100644 --- a/test/EFCore.Proxies.Tests/ProxiesApiConsistencyTest.cs +++ b/test/EFCore.Proxies.Tests/ProxiesApiConsistencyTest.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using Microsoft.EntityFrameworkCore.TestUtilities; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.EntityFrameworkCore @@ -16,14 +17,19 @@ public ProxiesApiConsistencyTest(ProxiesApiConsistencyFixture fixture) } protected override void AddServices(ServiceCollection serviceCollection) - { - serviceCollection.AddEntityFrameworkProxies(); - } + => serviceCollection.AddEntityFrameworkProxies(); protected override Assembly TargetAssembly => typeof(ProxiesExtensions).Assembly; public class ProxiesApiConsistencyFixture : ApiConsistencyFixtureBase { + public override bool TryGetProviderOptionsDelegate(out Action configureOptions) + { + configureOptions = b => InMemoryTestHelpers.Instance.UseProviderOptions(b); + + return true; + } + public override HashSet FluentApiTypes { get; } = new HashSet() { typeof(ProxiesServiceCollectionExtensions) diff --git a/test/EFCore.Relational.Tests/EFCore.Relational.Tests.csproj b/test/EFCore.Relational.Tests/EFCore.Relational.Tests.csproj index 21e8f9f434e..69bd330eaa3 100644 --- a/test/EFCore.Relational.Tests/EFCore.Relational.Tests.csproj +++ b/test/EFCore.Relational.Tests/EFCore.Relational.Tests.csproj @@ -27,4 +27,8 @@ + + + + diff --git a/test/EFCore.Relational.Tests/Infrastructure/RelationalModelValidatorDependenciesTest.cs b/test/EFCore.Relational.Tests/Infrastructure/RelationalModelValidatorDependenciesTest.cs deleted file mode 100644 index ed4aa864c91..00000000000 --- a/test/EFCore.Relational.Tests/Infrastructure/RelationalModelValidatorDependenciesTest.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -// ReSharper disable InconsistentNaming -namespace Microsoft.EntityFrameworkCore.Infrastructure -{ - public class RelationalModelValidatorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Metadata/Conventions/Internal/RelationalConventionSetBuilderDependenciesTest.cs b/test/EFCore.Relational.Tests/Metadata/Conventions/Internal/RelationalConventionSetBuilderDependenciesTest.cs deleted file mode 100644 index 62eaf5c2340..00000000000 --- a/test/EFCore.Relational.Tests/Metadata/Conventions/Internal/RelationalConventionSetBuilderDependenciesTest.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.Metadata.Conventions.Infrastructure; -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -// ReSharper disable InconsistentNaming -namespace Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal -{ - public class RelationalConventionSetBuilderDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Migrations/HistoryRepositoryDependenciesTest.cs b/test/EFCore.Relational.Tests/Migrations/HistoryRepositoryDependenciesTest.cs deleted file mode 100644 index 664a38316c4..00000000000 --- a/test/EFCore.Relational.Tests/Migrations/HistoryRepositoryDependenciesTest.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -// ReSharper disable InconsistentNaming -namespace Microsoft.EntityFrameworkCore.Migrations -{ - public class HistoryRepositoryDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Migrations/MigrationsAnnotationProviderDependenciesTest.cs b/test/EFCore.Relational.Tests/Migrations/MigrationsAnnotationProviderDependenciesTest.cs deleted file mode 100644 index 07ff1c06804..00000000000 --- a/test/EFCore.Relational.Tests/Migrations/MigrationsAnnotationProviderDependenciesTest.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Migrations -{ - public class MigrationsAnnotationProviderDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Migrations/MigrationsSqlGeneratorDependenciesTest.cs b/test/EFCore.Relational.Tests/Migrations/MigrationsSqlGeneratorDependenciesTest.cs deleted file mode 100644 index e638acc54e5..00000000000 --- a/test/EFCore.Relational.Tests/Migrations/MigrationsSqlGeneratorDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Migrations -{ - public class MigrationsSqlGeneratorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/ModificationCommandBatchFactoryDependenciesTest.cs b/test/EFCore.Relational.Tests/ModificationCommandBatchFactoryDependenciesTest.cs deleted file mode 100644 index 54837bef921..00000000000 --- a/test/EFCore.Relational.Tests/ModificationCommandBatchFactoryDependenciesTest.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Microsoft.EntityFrameworkCore.Update; -using Xunit; - -namespace Microsoft.EntityFrameworkCore -{ - public class ModificationCommandBatchFactoryDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Query/QuerySqlGeneratorDependenciesTest.cs b/test/EFCore.Relational.Tests/Query/QuerySqlGeneratorDependenciesTest.cs deleted file mode 100644 index 9ad38a0db1c..00000000000 --- a/test/EFCore.Relational.Tests/Query/QuerySqlGeneratorDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Query -{ - public class QuerySqlGeneratorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Query/RelationalEvaluatableExpressionFilterDependenciesTest.cs b/test/EFCore.Relational.Tests/Query/RelationalEvaluatableExpressionFilterDependenciesTest.cs deleted file mode 100644 index bcf295391ad..00000000000 --- a/test/EFCore.Relational.Tests/Query/RelationalEvaluatableExpressionFilterDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Query -{ - public class RelationalEvaluatableExpressionFilterDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Query/RelationalQueryContextDependenciesTest.cs b/test/EFCore.Relational.Tests/Query/RelationalQueryContextDependenciesTest.cs deleted file mode 100644 index d52da4020fc..00000000000 --- a/test/EFCore.Relational.Tests/Query/RelationalQueryContextDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Query -{ - public class RelationalQueryContextDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Query/RelationalQueryTranslationPostprocessorDependenciesTest.cs b/test/EFCore.Relational.Tests/Query/RelationalQueryTranslationPostprocessorDependenciesTest.cs deleted file mode 100644 index 9b6320a8812..00000000000 --- a/test/EFCore.Relational.Tests/Query/RelationalQueryTranslationPostprocessorDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Query -{ - public class RelationalQueryTranslationPostprocessorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Query/RelationalQueryTranslationPreprocessorDependenciesTest.cs b/test/EFCore.Relational.Tests/Query/RelationalQueryTranslationPreprocessorDependenciesTest.cs deleted file mode 100644 index e3fa8fe0d12..00000000000 --- a/test/EFCore.Relational.Tests/Query/RelationalQueryTranslationPreprocessorDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Query -{ - public class RelationalQueryTranslationPreprocessorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Query/RelationalQueryableMethodTranslatingExpressionVisitorDependenciesTest.cs b/test/EFCore.Relational.Tests/Query/RelationalQueryableMethodTranslatingExpressionVisitorDependenciesTest.cs deleted file mode 100644 index 208df1b1cb0..00000000000 --- a/test/EFCore.Relational.Tests/Query/RelationalQueryableMethodTranslatingExpressionVisitorDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Query -{ - public class RelationalQueryableMethodTranslatingExpressionVisitorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Query/RelationalShapedQueryCompilingExpressionVisitorDependenciesTest.cs b/test/EFCore.Relational.Tests/Query/RelationalShapedQueryCompilingExpressionVisitorDependenciesTest.cs deleted file mode 100644 index 6ee4e6d9fb5..00000000000 --- a/test/EFCore.Relational.Tests/Query/RelationalShapedQueryCompilingExpressionVisitorDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Query -{ - public class RelationalShapedQueryCompilingExpressionVisitorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/RelationalApiConsistencyTest.cs b/test/EFCore.Relational.Tests/RelationalApiConsistencyTest.cs index e289486ffa4..e496bfcd45b 100644 --- a/test/EFCore.Relational.Tests/RelationalApiConsistencyTest.cs +++ b/test/EFCore.Relational.Tests/RelationalApiConsistencyTest.cs @@ -24,16 +24,19 @@ public RelationalApiConsistencyTest(RelationalApiConsistencyFixture fixture) { } - protected override void AddServices(ServiceCollection serviceCollection) - { - new EntityFrameworkRelationalServicesBuilder(serviceCollection).TryAddCoreServices(); - } + => new EntityFrameworkRelationalServicesBuilder(serviceCollection).TryAddCoreServices(); protected override Assembly TargetAssembly => typeof(RelationalDatabase).Assembly; public class RelationalApiConsistencyFixture : ApiConsistencyFixtureBase { + public override bool TryGetProviderOptionsDelegate(out Action configureOptions) + { + configureOptions = null; + return false; + } + private static Dictionary _metadataTypes => new Dictionary { diff --git a/test/EFCore.Relational.Tests/RelationalMemberTranslatorProviderDependenciesTest.cs b/test/EFCore.Relational.Tests/RelationalMemberTranslatorProviderDependenciesTest.cs deleted file mode 100644 index a869e28845e..00000000000 --- a/test/EFCore.Relational.Tests/RelationalMemberTranslatorProviderDependenciesTest.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.Query; -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore -{ - public class RelationalMemberTranslatorProviderDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/RelationalMethodCallTranslatorProviderDependenciesTest.cs b/test/EFCore.Relational.Tests/RelationalMethodCallTranslatorProviderDependenciesTest.cs deleted file mode 100644 index a93b095fc94..00000000000 --- a/test/EFCore.Relational.Tests/RelationalMethodCallTranslatorProviderDependenciesTest.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.Query; -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore -{ - public class RelationalMethodCallTranslatorProviderDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/RelationalSqlTranslatingExpressionVisitorDependenciesTest.cs b/test/EFCore.Relational.Tests/RelationalSqlTranslatingExpressionVisitorDependenciesTest.cs deleted file mode 100644 index 776b7b39288..00000000000 --- a/test/EFCore.Relational.Tests/RelationalSqlTranslatingExpressionVisitorDependenciesTest.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.Query; -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore -{ - public class RelationalSqlTranslatingExpressionVisitorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/SqlExpressionFactoryDependenciesTest.cs b/test/EFCore.Relational.Tests/SqlExpressionFactoryDependenciesTest.cs deleted file mode 100644 index cb0cc1a3fe9..00000000000 --- a/test/EFCore.Relational.Tests/SqlExpressionFactoryDependenciesTest.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.Query; -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore -{ - public class SqlExpressionFactoryDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Storage/ParameterNameGeneratorDependenciesTest.cs b/test/EFCore.Relational.Tests/Storage/ParameterNameGeneratorDependenciesTest.cs deleted file mode 100644 index ef07c549764..00000000000 --- a/test/EFCore.Relational.Tests/Storage/ParameterNameGeneratorDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Storage -{ - public class ParameterNameGeneratorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Storage/RelationalCommandBuilderDependenciesTest.cs b/test/EFCore.Relational.Tests/Storage/RelationalCommandBuilderDependenciesTest.cs deleted file mode 100644 index 1d1a8f1d591..00000000000 --- a/test/EFCore.Relational.Tests/Storage/RelationalCommandBuilderDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Storage -{ - public class RelationalCommandBuilderDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Storage/RelationalConnectionDependenciesTest.cs b/test/EFCore.Relational.Tests/Storage/RelationalConnectionDependenciesTest.cs deleted file mode 100644 index 2ef5191ce7d..00000000000 --- a/test/EFCore.Relational.Tests/Storage/RelationalConnectionDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Storage -{ - public class RelationalConnectionDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Storage/RelationalDatabaseCreatorDependenciesTest.cs b/test/EFCore.Relational.Tests/Storage/RelationalDatabaseCreatorDependenciesTest.cs deleted file mode 100644 index f9829d37b9e..00000000000 --- a/test/EFCore.Relational.Tests/Storage/RelationalDatabaseCreatorDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Storage -{ - public class RelationalDatabaseCreatorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Storage/RelationalDatabaseDependenciesTest.cs b/test/EFCore.Relational.Tests/Storage/RelationalDatabaseDependenciesTest.cs deleted file mode 100644 index 7c68fb584b6..00000000000 --- a/test/EFCore.Relational.Tests/Storage/RelationalDatabaseDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Storage -{ - public class RelationalDatabaseDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/Storage/RelationalSqlGenerationHelperDependenciesTest.cs b/test/EFCore.Relational.Tests/Storage/RelationalSqlGenerationHelperDependenciesTest.cs deleted file mode 100644 index 5de244e1dea..00000000000 --- a/test/EFCore.Relational.Tests/Storage/RelationalSqlGenerationHelperDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Storage -{ - public class RelationalSqlGenerationHelperDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Relational.Tests/TestUtilities/RelationalTestHelpers.cs b/test/EFCore.Relational.Tests/TestUtilities/RelationalTestHelpers.cs index 18552a9eda0..839d0ac40af 100644 --- a/test/EFCore.Relational.Tests/TestUtilities/RelationalTestHelpers.cs +++ b/test/EFCore.Relational.Tests/TestUtilities/RelationalTestHelpers.cs @@ -18,10 +18,8 @@ protected RelationalTestHelpers() public override IServiceCollection AddProviderServices(IServiceCollection services) => FakeRelationalOptionsExtension.AddEntityFrameworkRelationalDatabase(services); - protected override void UseProviderOptions(DbContextOptionsBuilder optionsBuilder) - { - optionsBuilder.UseFakeRelational(); - } + public override void UseProviderOptions(DbContextOptionsBuilder optionsBuilder) + => optionsBuilder.UseFakeRelational(); public override LoggingDefinitions LoggingDefinitions { get; } = new TestRelationalLoggingDefinitions(); } diff --git a/test/EFCore.Relational.Tests/Update/UpdateSqlGeneratorDependenciesTest.cs b/test/EFCore.Relational.Tests/Update/UpdateSqlGeneratorDependenciesTest.cs deleted file mode 100644 index 7c728fb2a64..00000000000 --- a/test/EFCore.Relational.Tests/Update/UpdateSqlGeneratorDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Update -{ - public class UpdateSqlGeneratorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - RelationalTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Specification.Tests/TestUtilities/TestHelpers.cs b/test/EFCore.Specification.Tests/TestUtilities/TestHelpers.cs index a217f19bb03..4290b58784a 100644 --- a/test/EFCore.Specification.Tests/TestUtilities/TestHelpers.cs +++ b/test/EFCore.Specification.Tests/TestUtilities/TestHelpers.cs @@ -23,69 +23,6 @@ namespace Microsoft.EntityFrameworkCore.TestUtilities { public abstract class TestHelpers { - /// - /// Tests that calling the 'With' method for each constructor-injected service creates a clone - /// of TDependencies with only that service replaced. - /// - public void TestDependenciesClone(params string[] ignoreProperties) - { - var customServices = new ServiceCollection() - .AddScoped(CreateOptions) - .AddScoped() - .AddScoped(); - - var services1 = CreateServiceProvider(customServices).CreateScope().ServiceProvider; - var services2 = CreateServiceProvider(customServices).CreateScope().ServiceProvider; - - var dependencies = services1.GetService(); - - var serviceProperties = typeof(TDependencies).GetTypeInfo() - .DeclaredProperties - .Where(p => !ignoreProperties.Contains(p.Name)) - .ToList(); - - var obsoleteTypes = serviceProperties - .Where(p => p.CustomAttributes.Any(a => a.AttributeType == typeof(ObsoleteAttribute))) - .Select(p => p.PropertyType) - .ToList(); - - serviceProperties = serviceProperties.Where(p => !obsoleteTypes.Contains(p.PropertyType)).ToList(); - - var constructor = typeof(TDependencies).GetTypeInfo().DeclaredConstructors.OrderByDescending(c => c.GetParameters().Length) - .First(); - var constructorParameters = constructor.GetParameters().Where(p => !obsoleteTypes.Contains(p.ParameterType)).ToList(); - - foreach (var serviceType in constructorParameters.Select(p => p.ParameterType)) - { - var withMethod = typeof(TDependencies).GetTypeInfo().DeclaredMethods - .Single( - m => m.CustomAttributes.All(a => a.AttributeType != typeof(ObsoleteAttribute)) - && m.Name == "With" - && m.GetParameters()[0].ParameterType == serviceType); - - var clone = withMethod.Invoke(dependencies, new[] { services2.GetService(serviceType) }); - - foreach (var property in serviceProperties) - { - if (property.PropertyType == serviceType) - { - Assert.NotSame(property.GetValue(clone), property.GetValue(dependencies)); - } - else - { - Assert.Equal(property.GetValue(clone), property.GetValue(dependencies)); - } - } - } - } - - // ReSharper disable once ClassNeverInstantiated.Local - private class FakeCurrentDbContext : ICurrentDbContext - { - // ReSharper disable once UnassignedGetOnlyAutoProperty - public DbContext Context { get; } - } - public DbContextOptions CreateOptions(IModel model, IServiceProvider serviceProvider = null) { var optionsBuilder = new DbContextOptionsBuilder() @@ -135,7 +72,7 @@ public DbContextOptionsBuilder AddProviderOptions(DbContextOptionsBuilder option return optionsBuilder; } - protected abstract void UseProviderOptions(DbContextOptionsBuilder optionsBuilder); + public abstract void UseProviderOptions(DbContextOptionsBuilder optionsBuilder); public DbContext CreateContext(IServiceProvider serviceProvider, IModel model) => new DbContext(CreateOptions(model, serviceProvider)); diff --git a/test/EFCore.SqlServer.FunctionalTests/TestUtilities/SqlServerTestHelpers.cs b/test/EFCore.SqlServer.FunctionalTests/TestUtilities/SqlServerTestHelpers.cs index 8d64bfc5b24..a132c9b3f55 100644 --- a/test/EFCore.SqlServer.FunctionalTests/TestUtilities/SqlServerTestHelpers.cs +++ b/test/EFCore.SqlServer.FunctionalTests/TestUtilities/SqlServerTestHelpers.cs @@ -19,7 +19,7 @@ protected SqlServerTestHelpers() public override IServiceCollection AddProviderServices(IServiceCollection services) => services.AddEntityFrameworkSqlServer(); - protected override void UseProviderOptions(DbContextOptionsBuilder optionsBuilder) + public override void UseProviderOptions(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseSqlServer(new SqlConnection("Database=DummyDatabase")); public override LoggingDefinitions LoggingDefinitions { get; } = new SqlServerLoggingDefinitions(); diff --git a/test/EFCore.SqlServer.Tests/SqlServerApiConsistencyTest.cs b/test/EFCore.SqlServer.Tests/SqlServerApiConsistencyTest.cs index d08afed1ed1..4af42a0cbd7 100644 --- a/test/EFCore.SqlServer.Tests/SqlServerApiConsistencyTest.cs +++ b/test/EFCore.SqlServer.Tests/SqlServerApiConsistencyTest.cs @@ -8,6 +8,7 @@ using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal; +using Microsoft.EntityFrameworkCore.TestUtilities; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.EntityFrameworkCore @@ -20,14 +21,19 @@ public SqlServerApiConsistencyTest(SqlServerApiConsistencyFixture fixture) } protected override void AddServices(ServiceCollection serviceCollection) - { - serviceCollection.AddEntityFrameworkSqlServer(); - } + => serviceCollection.AddEntityFrameworkSqlServer(); protected override Assembly TargetAssembly => typeof(SqlServerConnection).Assembly; public class SqlServerApiConsistencyFixture : ApiConsistencyFixtureBase { + public override bool TryGetProviderOptionsDelegate(out Action configureOptions) + { + configureOptions = b => SqlServerTestHelpers.Instance.UseProviderOptions(b); + + return true; + } + public override HashSet FluentApiTypes { get; } = new HashSet() { typeof(SqlServerDbContextOptionsBuilder), diff --git a/test/EFCore.SqlServer.Tests/SqlServerNTSApiConsistencyTest.cs b/test/EFCore.SqlServer.Tests/SqlServerNTSApiConsistencyTest.cs index 0036e389675..f7dd61a77de 100644 --- a/test/EFCore.SqlServer.Tests/SqlServerNTSApiConsistencyTest.cs +++ b/test/EFCore.SqlServer.Tests/SqlServerNTSApiConsistencyTest.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using Microsoft.EntityFrameworkCore.TestUtilities; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.EntityFrameworkCore @@ -16,15 +17,20 @@ public SqlServerNTSApiConsistencyTest(SqlServerNTSApiConsistencyFixture fixture) } protected override void AddServices(ServiceCollection serviceCollection) - { - serviceCollection.AddEntityFrameworkSqlServerNetTopologySuite(); - } + => serviceCollection.AddEntityFrameworkSqlServerNetTopologySuite(); protected override Assembly TargetAssembly => typeof(SqlServerNetTopologySuiteServiceCollectionExtensions).Assembly; public class SqlServerNTSApiConsistencyFixture : ApiConsistencyFixtureBase { + public override bool TryGetProviderOptionsDelegate(out Action configureOptions) + { + configureOptions = b => SqlServerTestHelpers.Instance.UseProviderOptions(b); + + return true; + } + public override HashSet FluentApiTypes { get; } = new HashSet() { typeof(SqlServerNetTopologySuiteDbContextOptionsBuilderExtensions), diff --git a/test/EFCore.Sqlite.FunctionalTests/TestUtilities/SqliteTestHelpers.cs b/test/EFCore.Sqlite.FunctionalTests/TestUtilities/SqliteTestHelpers.cs index d6f467cfc1e..a15d104031e 100644 --- a/test/EFCore.Sqlite.FunctionalTests/TestUtilities/SqliteTestHelpers.cs +++ b/test/EFCore.Sqlite.FunctionalTests/TestUtilities/SqliteTestHelpers.cs @@ -19,7 +19,7 @@ protected SqliteTestHelpers() public override IServiceCollection AddProviderServices(IServiceCollection services) => services.AddEntityFrameworkSqlite(); - protected override void UseProviderOptions(DbContextOptionsBuilder optionsBuilder) + public override void UseProviderOptions(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseSqlite(new SqliteConnection("Data Source=:memory:")); public override LoggingDefinitions LoggingDefinitions { get; } = new SqliteLoggingDefinitions(); diff --git a/test/EFCore.Sqlite.Tests/SqliteApiConsistencyTest.cs b/test/EFCore.Sqlite.Tests/SqliteApiConsistencyTest.cs index ef4fc7639d5..ed2ff7d49bb 100644 --- a/test/EFCore.Sqlite.Tests/SqliteApiConsistencyTest.cs +++ b/test/EFCore.Sqlite.Tests/SqliteApiConsistencyTest.cs @@ -6,6 +6,7 @@ using System.Reflection; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Sqlite.Storage.Internal; +using Microsoft.EntityFrameworkCore.TestUtilities; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.EntityFrameworkCore @@ -18,14 +19,19 @@ public SqliteApiConsistencyTest(SqliteApiConsistencyFixture fixture) } protected override void AddServices(ServiceCollection serviceCollection) - { - serviceCollection.AddEntityFrameworkSqlite(); - } + => serviceCollection.AddEntityFrameworkSqlite(); protected override Assembly TargetAssembly => typeof(SqliteRelationalConnection).Assembly; public class SqliteApiConsistencyFixture : ApiConsistencyFixtureBase { + public override bool TryGetProviderOptionsDelegate(out Action configureOptions) + { + configureOptions = b => SqliteTestHelpers.Instance.UseProviderOptions(b); + + return true; + } + public override HashSet FluentApiTypes { get; } = new HashSet() { typeof(SqliteServiceCollectionExtensions), diff --git a/test/EFCore.Sqlite.Tests/SqliteNTSApiConsistencyTest.cs b/test/EFCore.Sqlite.Tests/SqliteNTSApiConsistencyTest.cs index d1c4516c01b..82c38ca80dc 100644 --- a/test/EFCore.Sqlite.Tests/SqliteNTSApiConsistencyTest.cs +++ b/test/EFCore.Sqlite.Tests/SqliteNTSApiConsistencyTest.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using Microsoft.EntityFrameworkCore.TestUtilities; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.EntityFrameworkCore @@ -16,15 +17,20 @@ public SqliteNTSApiConsistencyTest(SqliteNTSApiConsistencyFixture fixture) } protected override void AddServices(ServiceCollection serviceCollection) - { - serviceCollection.AddEntityFrameworkSqliteNetTopologySuite(); - } + => serviceCollection.AddEntityFrameworkSqliteNetTopologySuite(); protected override Assembly TargetAssembly => typeof(SqliteNetTopologySuiteServiceCollectionExtensions).Assembly; public class SqliteNTSApiConsistencyFixture : ApiConsistencyFixtureBase { + public override bool TryGetProviderOptionsDelegate(out Action configureOptions) + { + configureOptions = b => SqliteTestHelpers.Instance.UseProviderOptions(b); + + return true; + } + public override HashSet FluentApiTypes { get; } = new HashSet() { typeof(SqliteNetTopologySuiteDbContextOptionsBuilderExtensions), diff --git a/test/EFCore.Tests/ApiConsistencyTest.cs b/test/EFCore.Tests/ApiConsistencyTest.cs index f230f29b6ca..66384df2a60 100644 --- a/test/EFCore.Tests/ApiConsistencyTest.cs +++ b/test/EFCore.Tests/ApiConsistencyTest.cs @@ -27,6 +27,7 @@ public ApiConsistencyTest(ApiConsistencyFixture fixture) protected override void AddServices(ServiceCollection serviceCollection) => new EntityFrameworkServicesBuilder(serviceCollection).TryAddCoreServices(); + public class ApiConsistencyFixture : ApiConsistencyFixtureBase { protected override void Initialize() @@ -36,6 +37,12 @@ protected override void Initialize() base.Initialize(); } + public override bool TryGetProviderOptionsDelegate(out Action configureOptions) + { + configureOptions = null; + return false; + } + public override HashSet FluentApiTypes { get; } = new HashSet { typeof(ModelBuilder), diff --git a/test/EFCore.Tests/ApiConsistencyTestBase.cs b/test/EFCore.Tests/ApiConsistencyTestBase.cs index f523942ba66..6cdb6581986 100644 --- a/test/EFCore.Tests/ApiConsistencyTestBase.cs +++ b/test/EFCore.Tests/ApiConsistencyTestBase.cs @@ -12,6 +12,10 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Microsoft.EntityFrameworkCore.Metadata.Conventions.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata.Internal; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.TestUtilities; using Microsoft.Extensions.DependencyInjection; using Xunit; @@ -503,6 +507,119 @@ private string ValidateConventionMethod(MethodInfo conventionMethod) return null; } + [ConditionalFact] + public virtual void Ensure_dependency_objects_are_consistent() + { + var serviceCollection = new ServiceCollection(); + + AddServices(serviceCollection); + + var dependencyServices = serviceCollection.Where( + sd => sd.ServiceType.Namespace.StartsWith("Microsoft.Entity", StringComparison.Ordinal) + && sd.ServiceType.Name.EndsWith("Dependencies", StringComparison.Ordinal) + && sd.ImplementationType == sd.ServiceType) + .ToList(); + + foreach (var service in dependencyServices) + { + TestDependenciesObject(service.ImplementationType); + } + } + + // ReSharper disable once ClassNeverInstantiated.Local + private class FakeCurrentDbContext : ICurrentDbContext + { + // ReSharper disable once UnassignedGetOnlyAutoProperty + public DbContext Context { get; } + } + + private void TestDependenciesObject(Type dependenciesType) + { + if (!TryCreateProviderServices(out var serviceCollection1)) + { + return; + } + + AddServices(serviceCollection1); + var services1 = serviceCollection1.BuildServiceProvider(); + + TryCreateProviderServices(out var serviceCollection2); + AddServices(serviceCollection2); + var services2 = serviceCollection2.BuildServiceProvider(); + + var dependencies = services1.GetService(dependenciesType); + + var serviceProperties = dependenciesType.GetTypeInfo() + .DeclaredProperties + .Where(p => !Fixture.ComputedDependencyProperties.Contains(p)) + .ToList(); + + var obsoleteTypes = serviceProperties + .Where(p => p.CustomAttributes.Any(a => a.AttributeType == typeof(ObsoleteAttribute))) + .Select(p => p.PropertyType) + .ToList(); + + serviceProperties = serviceProperties.Where(p => !obsoleteTypes.Contains(p.PropertyType)).ToList(); + + var constructor = dependenciesType.GetTypeInfo().DeclaredConstructors.OrderByDescending(c => c.GetParameters().Length).First(); + var constructorParameters = constructor.GetParameters().Where(p => !obsoleteTypes.Contains(p.ParameterType)).ToList(); + + foreach (var serviceType in constructorParameters.Select(p => p.ParameterType)) + { + var withMethod = dependenciesType.GetTypeInfo().DeclaredMethods + .FirstOrDefault( + m => m.CustomAttributes.All(a => a.AttributeType != typeof(ObsoleteAttribute)) + && m.Name == "With" + && m.GetParameters()[0].ParameterType == serviceType); + + if (withMethod == null) + { + throw new Exception( + $"Expected 'With' method for service type '{serviceType.ShortDisplayName()}' on '{dependenciesType.ShortDisplayName()}'"); + } + + var clone = withMethod.Invoke(dependencies, new[] { services2.GetService(serviceType) }); + + foreach (var property in serviceProperties) + { + if (property.PropertyType == serviceType) + { + Assert.NotSame(property.GetValue(clone), property.GetValue(dependencies)); + } + else + { + Assert.Equal(property.GetValue(clone), property.GetValue(dependencies)); + } + } + } + + bool TryCreateProviderServices(out ServiceCollection services) + { + if (!Fixture.TryGetProviderOptionsDelegate(out var optionsDelegate)) + { + services = null; + return false; + } + + services = (ServiceCollection)new ServiceCollection() + .AddScoped(p => CreateOptions(p, optionsDelegate)) + .AddScoped() + .AddScoped(); + + return true; + } + + DbContextOptions CreateOptions(IServiceProvider serviceProvider, Action optionsDelegate) + { + var optionsBuilder = new DbContextOptionsBuilder() + .UseInternalServiceProvider(serviceProvider); + + optionsDelegate(optionsBuilder); + + return optionsBuilder.Options; + } + } + [ConditionalFact] public virtual void Service_implementations_should_use_dependencies_parameter_object() { @@ -741,6 +858,8 @@ protected ApiConsistencyFixtureBase() Initialize(); } + public abstract bool TryGetProviderOptionsDelegate (out Action configureOptions); + public virtual HashSet FluentApiTypes { get; } = new HashSet(); public virtual HashSet NonVirtualMethods { get; } = new HashSet(); public virtual HashSet NotAnnotatedMethods { get; } = new HashSet(); @@ -748,6 +867,17 @@ protected ApiConsistencyFixtureBase() public virtual HashSet UnmatchedMetadataMethods { get; } = new HashSet(); public virtual HashSet MetadataMethodExceptions { get; } = new HashSet(); + public virtual HashSet ComputedDependencyProperties { get; } + = new HashSet + { + typeof(ProviderConventionSetBuilderDependencies).GetProperty(nameof(ProviderConventionSetBuilderDependencies.ContextType)), + typeof(QueryCompilationContextDependencies).GetProperty(nameof(QueryCompilationContextDependencies.ContextType)), + typeof(QueryCompilationContextDependencies).GetProperty(nameof(QueryCompilationContextDependencies.IsTracking)), + typeof(QueryContextDependencies).GetProperty(nameof(QueryContextDependencies.StateManager)), + typeof(QueryContextDependencies).GetProperty(nameof(QueryContextDependencies.QueryProvider)) + }; + + public Dictionary MetadataTypes { get; } = new Dictionary { diff --git a/test/EFCore.Tests/Infrastructure/ModelCacheKeyFactoryDependenciesTest.cs b/test/EFCore.Tests/Infrastructure/ModelCacheKeyFactoryDependenciesTest.cs deleted file mode 100644 index 9c9bb891aea..00000000000 --- a/test/EFCore.Tests/Infrastructure/ModelCacheKeyFactoryDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Infrastructure -{ - public class ModelCacheKeyFactoryDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Tests/Infrastructure/ModelCustomizerDependenciesTest.cs b/test/EFCore.Tests/Infrastructure/ModelCustomizerDependenciesTest.cs deleted file mode 100644 index 5232553b701..00000000000 --- a/test/EFCore.Tests/Infrastructure/ModelCustomizerDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Infrastructure -{ - public class ModelCustomizerDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Tests/Infrastructure/ModelValidatorDependenciesTest.cs b/test/EFCore.Tests/Infrastructure/ModelValidatorDependenciesTest.cs deleted file mode 100644 index d32229184ea..00000000000 --- a/test/EFCore.Tests/Infrastructure/ModelValidatorDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Infrastructure -{ - public class ModelValidatorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Tests/ModelSourceDependenciesTest.cs b/test/EFCore.Tests/ModelSourceDependenciesTest.cs deleted file mode 100644 index 99a6425af59..00000000000 --- a/test/EFCore.Tests/ModelSourceDependenciesTest.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore -{ - public class ModelSourceDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Tests/Query/CompiledQueryCacheKeyGeneratorDependenciesTest.cs b/test/EFCore.Tests/Query/CompiledQueryCacheKeyGeneratorDependenciesTest.cs deleted file mode 100644 index ddd60403e24..00000000000 --- a/test/EFCore.Tests/Query/CompiledQueryCacheKeyGeneratorDependenciesTest.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -// ReSharper disable InconsistentNaming -namespace Microsoft.EntityFrameworkCore.Query -{ - public class CompiledQueryCacheKeyGeneratorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Tests/Query/EntityMaterializerSourceDependenciesTest.cs b/test/EFCore.Tests/Query/EntityMaterializerSourceDependenciesTest.cs deleted file mode 100644 index 2ab71c9f696..00000000000 --- a/test/EFCore.Tests/Query/EntityMaterializerSourceDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Query -{ - public class EntityMaterializerSourceDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Tests/Query/EvaluatableExpressionFilterDependenciesTest.cs b/test/EFCore.Tests/Query/EvaluatableExpressionFilterDependenciesTest.cs deleted file mode 100644 index 63132f1bb85..00000000000 --- a/test/EFCore.Tests/Query/EvaluatableExpressionFilterDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Query -{ - public class EvaluatableExpressionFilterDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Tests/Query/QueryCompilationContextDependenciesTest.cs b/test/EFCore.Tests/Query/QueryCompilationContextDependenciesTest.cs deleted file mode 100644 index a2414682e7f..00000000000 --- a/test/EFCore.Tests/Query/QueryCompilationContextDependenciesTest.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -// ReSharper disable InconsistentNaming -namespace Microsoft.EntityFrameworkCore.Query -{ - public class QueryCompilationContextDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone( - nameof(QueryCompilationContextDependencies.IsTracking), - nameof(QueryCompilationContextDependencies.ContextType)); - } - } -} diff --git a/test/EFCore.Tests/Query/QueryContextDependenciesTest.cs b/test/EFCore.Tests/Query/QueryContextDependenciesTest.cs deleted file mode 100644 index 8b1e75803de..00000000000 --- a/test/EFCore.Tests/Query/QueryContextDependenciesTest.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Query -{ - public class QueryContextDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone( - nameof(QueryContextDependencies.StateManager), - nameof(QueryContextDependencies.QueryProvider)); - } - } -} diff --git a/test/EFCore.Tests/Query/QueryTranslationPostprocessorDependenciesDependenciesTest.cs b/test/EFCore.Tests/Query/QueryTranslationPostprocessorDependenciesDependenciesTest.cs deleted file mode 100644 index 00dd23caaff..00000000000 --- a/test/EFCore.Tests/Query/QueryTranslationPostprocessorDependenciesDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Query -{ - public class QueryTranslationPostprocessorDependenciesDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Tests/Query/QueryTranslationPreprocessorDependenciesTest.cs b/test/EFCore.Tests/Query/QueryTranslationPreprocessorDependenciesTest.cs deleted file mode 100644 index d20fd1a30c9..00000000000 --- a/test/EFCore.Tests/Query/QueryTranslationPreprocessorDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Query -{ - public class QueryTranslationPreprocessorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Tests/Query/QueryableMethodTranslatingExpressionVisitorDependenciesTest.cs b/test/EFCore.Tests/Query/QueryableMethodTranslatingExpressionVisitorDependenciesTest.cs deleted file mode 100644 index e383022195f..00000000000 --- a/test/EFCore.Tests/Query/QueryableMethodTranslatingExpressionVisitorDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Query -{ - public class QueryableMethodTranslatingExpressionVisitorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Tests/Query/ShapedQueryCompilingExpressionVisitorDependenciesTest.cs b/test/EFCore.Tests/Query/ShapedQueryCompilingExpressionVisitorDependenciesTest.cs deleted file mode 100644 index 458d00d8cb2..00000000000 --- a/test/EFCore.Tests/Query/ShapedQueryCompilingExpressionVisitorDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Query -{ - public class ShapedQueryCompilingExpressionVisitorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Tests/Storage/DatabaseDependenciesTest.cs b/test/EFCore.Tests/Storage/DatabaseDependenciesTest.cs deleted file mode 100644 index 0460d7f605f..00000000000 --- a/test/EFCore.Tests/Storage/DatabaseDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Storage -{ - public class DatabaseDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Tests/Storage/DatabaseProviderDependenciesTest.cs b/test/EFCore.Tests/Storage/DatabaseProviderDependenciesTest.cs deleted file mode 100644 index 31277bee04f..00000000000 --- a/test/EFCore.Tests/Storage/DatabaseProviderDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Storage -{ - public class DatabaseProviderDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Tests/Storage/ExecutionStrategyDependenciesTest.cs b/test/EFCore.Tests/Storage/ExecutionStrategyDependenciesTest.cs deleted file mode 100644 index ff8b125665f..00000000000 --- a/test/EFCore.Tests/Storage/ExecutionStrategyDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.Storage -{ - public class ExecutionStrategyDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Tests/ValueGeneration/ValueGeneratorCacheDependenciesTest.cs b/test/EFCore.Tests/ValueGeneration/ValueGeneratorCacheDependenciesTest.cs deleted file mode 100644 index 5c9ec4c9a8c..00000000000 --- a/test/EFCore.Tests/ValueGeneration/ValueGeneratorCacheDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.ValueGeneration -{ - public class ValueGeneratorCacheDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -} diff --git a/test/EFCore.Tests/ValueGeneration/ValueGeneratorSelectorDependenciesTest.cs b/test/EFCore.Tests/ValueGeneration/ValueGeneratorSelectorDependenciesTest.cs deleted file mode 100644 index 062e7a8fcfb..00000000000 --- a/test/EFCore.Tests/ValueGeneration/ValueGeneratorSelectorDependenciesTest.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.EntityFrameworkCore.TestUtilities; -using Xunit; - -namespace Microsoft.EntityFrameworkCore.ValueGeneration -{ - public class ValueGeneratorSelectorDependenciesTest - { - [ConditionalFact] - public void Can_use_With_methods_to_clone_and_replace_service() - { - InMemoryTestHelpers.Instance.TestDependenciesClone(); - } - } -}