z4kn4fein / stashbox-extensions-dependencyinjection

Stashbox Integration for ASP.NET Core, .NET Generic Host and ServiceCollection based applications.
https://z4kn4fein.github.io/stashbox
MIT License
17 stars 2 forks source link

Failing spec tests for constrained generics #3

Closed jbogard closed 5 years ago

jbogard commented 5 years ago

I've opened a PR for adding support to constrained generics to the base DI package:

https://github.com/aspnet/Extensions/pull/536

With this in place, I've had to skip some tests that now fail some constrained generic specs:

https://github.com/aspnet/Extensions/pull/536/files#diff-38ee0d32417bbdf7da2b4438bf87deceR10

Full stack trace for test failures:

Failed   Microsoft.Extensions.DependencyInjection.Specification.StashBoxDependencyInjectionSpecificationTests.PublicNoArgCtorConstrainedOpenGenericServicesCanBeResolved
Error Message:
 System.ArgumentException : GenericArguments[0], 'Microsoft.Extensions.DependencyInjection.Specification.Fakes.ClassWithPrivateCtor', on 'Microsoft.Extensions.DependencyInjection.Specification.Fakes.ClassWithNewConstraint`1[T]' violates the constraint of type 'T'.
---- System.TypeLoadException : GenericArguments[0], 'Microsoft.Extensions.DependencyInjection.Specification.Fakes.ClassWithPrivateCtor', on 'Microsoft.Extensions.DependencyInjection.Specification.Fakes.ClassWithNewConstraint`1[T]' violates the constraint of type parameter 'T'.
Stack Trace:
   at System.RuntimeType.ValidateGenericArguments(MemberInfo definition, RuntimeType[] genericArguments, Exception e)
   at System.RuntimeType.MakeGenericType(Type[] instantiation)
   at Stashbox.BuildUp.GenericTypeObjectBuilder.GetExpressionInternal(IContainerContext containerContext, IServiceRegistration serviceRegistration, ResolutionContext resolutionContext, Type resolveType)
   at Stashbox.BuildUp.ObjectBuilderBase.BuildDisposalTrackingAndFinalizerExpression(IContainerContext containerContext, IServiceRegistration serviceRegistration, ResolutionContext resolutionContext, Type resolveType)
   at Stashbox.BuildUp.ObjectBuilderBase.GetExpression(IContainerContext containerContext, IServiceRegistration serviceRegistration, ResolutionContext resolutionContext, Type resolveType)
   at Stashbox.Registration.ServiceRegistration.GetExpression(IContainerContext containerContext, ResolutionContext resolutionContext, Type resolveType)
   at Stashbox.Resolution.ResolutionStrategy.BuildResolutionExpressions(IContainerContext containerContext, ResolutionContext resolutionContext, TypeInformation typeInformation)
   at Stashbox.BuildUp.Resolution.EnumerableResolver.GetExpression(IContainerContext containerContext, TypeInformation typeInfo, ResolutionContext resolutionContext)
   at Stashbox.Resolution.ResolverSelector.GetResolverExpression(IContainerContext containerContext, TypeInformation typeInfo, ResolutionContext resolutionContext)
   at Stashbox.ResolutionScope.Activate(ResolutionContext resolutionContext, Type type, Int32 hash, Object name)
   at Stashbox.ResolutionScope.Resolve(Type typeFrom, Boolean nullResultAllowed, Object[] dependencyOverrides)
   at Stashbox.Extensions.Dependencyinjection.StashboxServiceProvider.GetRequiredService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) in C:\dev\aspnet-extensions\src\DependencyInjection\DI.Abstractions\src\ServiceProviderServiceExtensions.cs:line 53
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) in C:\dev\aspnet-extensions\src\DependencyInjection\DI.Abstractions\src\ServiceProviderServiceExtensions.cs:line 79
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetServices[T](IServiceProvider provider) in C:\dev\aspnet-extensions\src\DependencyInjection\DI.Abstractions\src\ServiceProviderServiceExtensions.cs:line 95
   at Microsoft.Extensions.DependencyInjection.Specification.DependencyInjectionSpecificationTests.PublicNoArgCtorConstrainedOpenGenericServicesCanBeResolved() in C:\dev\aspnet-extensions\src\DependencyInjection\DI.Specification.Tests\src\DependencyInjectionSpecificationTests.cs:line 618
----- Inner Stack Trace -----
   at System.RuntimeTypeHandle.Instantiate(RuntimeTypeHandle handle, IntPtr* pInst, Int32 numGenericArgs, ObjectHandleOnStack type)
   at System.RuntimeTypeHandle.Instantiate(Type[] inst)
   at System.RuntimeType.MakeGenericType(Type[] instantiation)
[xUnit.net 00:00:03.10]     Microsoft.Extensions.DependencyInjection.Specification.StashBoxDependencyInjectionSpecificationTests.SelfReferencingConstrainedOpenGenericServicesCanBeResolved [FAIL]
Failed   Microsoft.Extensions.DependencyInjection.Specification.StashBoxDependencyInjectionSpecificationTests.SelfReferencingConstrainedOpenGenericServicesCanBeResolved
Error Message:
 Assert.Equal() Failure
Expected: 2
Actual:   1
Stack Trace:
   at Microsoft.Extensions.DependencyInjection.Specification.DependencyInjectionSpecificationTests.SelfReferencingConstrainedOpenGenericServicesCanBeResolved() in C:\dev\aspnet-extensions\src\DependencyInjection\DI.Specification.Tests\src\DependencyInjectionSpecificationTests.cs:line 695
[xUnit.net 00:00:03.31]     Microsoft.Extensions.DependencyInjection.Specification.StashBoxDependencyInjectionSpecificationTests.ClassConstrainedOpenGenericServicesCanBeResolved [FAIL]
Failed   Microsoft.Extensions.DependencyInjection.Specification.StashBoxDependencyInjectionSpecificationTests.ClassConstrainedOpenGenericServicesCanBeResolved
Error Message:
 System.ArgumentException : GenericArguments[0], 'System.Int32', on 'Microsoft.Extensions.DependencyInjection.Specification.Fakes.ClassWithClassConstraint`1[T]' violates the constraint of type 'T'.
---- System.TypeLoadException : GenericArguments[0], 'System.Int32', on 'Microsoft.Extensions.DependencyInjection.Specification.Fakes.ClassWithClassConstraint`1[T]' violates the constraint of type parameter 'T'.
Stack Trace:
   at System.RuntimeType.ValidateGenericArguments(MemberInfo definition, RuntimeType[] genericArguments, Exception e)
   at System.RuntimeType.MakeGenericType(Type[] instantiation)
   at Stashbox.BuildUp.GenericTypeObjectBuilder.GetExpressionInternal(IContainerContext containerContext, IServiceRegistration serviceRegistration, ResolutionContext resolutionContext, Type resolveType)
   at Stashbox.BuildUp.ObjectBuilderBase.BuildDisposalTrackingAndFinalizerExpression(IContainerContext containerContext, IServiceRegistration serviceRegistration, ResolutionContext resolutionContext, Type resolveType)
   at Stashbox.BuildUp.ObjectBuilderBase.GetExpression(IContainerContext containerContext, IServiceRegistration serviceRegistration, ResolutionContext resolutionContext, Type resolveType)
   at Stashbox.Registration.ServiceRegistration.GetExpression(IContainerContext containerContext, ResolutionContext resolutionContext, Type resolveType)
   at Stashbox.Resolution.ResolutionStrategy.BuildResolutionExpressions(IContainerContext containerContext, ResolutionContext resolutionContext, TypeInformation typeInformation)
   at Stashbox.BuildUp.Resolution.EnumerableResolver.GetExpression(IContainerContext containerContext, TypeInformation typeInfo, ResolutionContext resolutionContext)
   at Stashbox.Resolution.ResolverSelector.GetResolverExpression(IContainerContext containerContext, TypeInformation typeInfo, ResolutionContext resolutionContext)
   at Stashbox.ResolutionScope.Activate(ResolutionContext resolutionContext, Type type, Int32 hash, Object name)
   at Stashbox.ResolutionScope.Resolve(Type typeFrom, Boolean nullResultAllowed, Object[] dependencyOverrides)
   at Stashbox.Extensions.Dependencyinjection.StashboxServiceProvider.GetRequiredService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) in C:\dev\aspnet-extensions\src\DependencyInjection\DI.Abstractions\src\ServiceProviderServiceExtensions.cs:line 53
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) in C:\dev\aspnet-extensions\src\DependencyInjection\DI.Abstractions\src\ServiceProviderServiceExtensions.cs:line 79
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetServices[T](IServiceProvider provider) in C:\dev\aspnet-extensions\src\DependencyInjection\DI.Abstractions\src\ServiceProviderServiceExtensions.cs:line 95
   at Microsoft.Extensions.DependencyInjection.Specification.DependencyInjectionSpecificationTests.ClassConstrainedOpenGenericServicesCanBeResolved() in C:\dev\aspnet-extensions\src\DependencyInjection\DI.Specification.Tests\src\DependencyInjectionSpecificationTests.cs:line 634
----- Inner Stack Trace -----
   at System.RuntimeTypeHandle.Instantiate(RuntimeTypeHandle handle, IntPtr* pInst, Int32 numGenericArgs, ObjectHandleOnStack type)
   at System.RuntimeTypeHandle.Instantiate(Type[] inst)
   at System.RuntimeType.MakeGenericType(Type[] instantiation)

This is more of a heads up, since the base DI container doesn't support constrained open generics yet. I don't know if the failures above are part of this package or the base Stashbox package

z4kn4fein commented 5 years ago

Hi, Thank you for pointing this out, i'll check where the issue is and create a fix with the next release.

z4kn4fein commented 5 years ago

Hi, I fixed the issues above and pushed a pre-release package with the related changes to my pre-release feed. Could you please check and confirm that the failing tests are passing now at your side as well? Thanks!

z4kn4fein commented 5 years ago

Fixed in v2.6.5