ActivatorTests.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // Copyright (c) .NET Foundation. All rights reserved.
  2. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  3. using System;
  4. using Microsoft.AspNetCore.DataProtection.Internal;
  5. using Microsoft.Extensions.DependencyInjection;
  6. using Moq;
  7. using Xunit;
  8. namespace Microsoft.AspNetCore.DataProtection
  9. {
  10. public class ActivatorTests
  11. {
  12. [Fact]
  13. public void CreateInstance_WithServiceProvider_PrefersParameterfulCtor()
  14. {
  15. // Arrange
  16. var serviceCollection = new ServiceCollection();
  17. var services = serviceCollection.BuildServiceProvider();
  18. var activator = services.GetActivator();
  19. // Act
  20. var retVal1 = (ClassWithParameterlessCtor)activator.CreateInstance<object>(typeof(ClassWithParameterlessCtor).AssemblyQualifiedName);
  21. var retVal2 = (ClassWithServiceProviderCtor)activator.CreateInstance<object>(typeof(ClassWithServiceProviderCtor).AssemblyQualifiedName);
  22. var retVal3 = (ClassWithBothCtors)activator.CreateInstance<object>(typeof(ClassWithBothCtors).AssemblyQualifiedName);
  23. // Assert
  24. Assert.NotNull(services);
  25. Assert.NotNull(retVal1);
  26. Assert.NotNull(retVal2);
  27. Assert.Same(services, retVal2.Services);
  28. Assert.NotNull(retVal3);
  29. Assert.False(retVal3.ParameterlessCtorCalled);
  30. Assert.Same(services, retVal3.Services);
  31. }
  32. [Fact]
  33. public void CreateInstance_WithoutServiceProvider_PrefersParameterlessCtor()
  34. {
  35. // Arrange
  36. var activator = ((IServiceProvider)null).GetActivator();
  37. // Act
  38. var retVal1 = (ClassWithParameterlessCtor)activator.CreateInstance<object>(typeof(ClassWithParameterlessCtor).AssemblyQualifiedName);
  39. var retVal2 = (ClassWithServiceProviderCtor)activator.CreateInstance<object>(typeof(ClassWithServiceProviderCtor).AssemblyQualifiedName);
  40. var retVal3 = (ClassWithBothCtors)activator.CreateInstance<object>(typeof(ClassWithBothCtors).AssemblyQualifiedName);
  41. // Assert
  42. Assert.NotNull(retVal1);
  43. Assert.NotNull(retVal2);
  44. Assert.Null(retVal2.Services);
  45. Assert.NotNull(retVal3);
  46. Assert.True(retVal3.ParameterlessCtorCalled);
  47. Assert.Null(retVal3.Services);
  48. }
  49. [Fact]
  50. public void CreateInstance_TypeDoesNotImplementInterface_ThrowsInvalidCast()
  51. {
  52. // Arrange
  53. var activator = ((IServiceProvider)null).GetActivator();
  54. // Act & assert
  55. var ex = Assert.Throws<InvalidCastException>(
  56. () => activator.CreateInstance<IDisposable>(typeof(ClassWithParameterlessCtor).AssemblyQualifiedName));
  57. Assert.Equal(Resources.FormatTypeExtensions_BadCast(typeof(IDisposable).AssemblyQualifiedName, typeof(ClassWithParameterlessCtor).AssemblyQualifiedName), ex.Message);
  58. }
  59. [Fact]
  60. public void GetActivator_ServiceProviderHasActivator_ReturnsSameInstance()
  61. {
  62. // Arrange
  63. var expectedActivator = new Mock<IActivator>().Object;
  64. var serviceCollection = new ServiceCollection();
  65. serviceCollection.AddSingleton<IActivator>(expectedActivator);
  66. // Act
  67. var actualActivator = serviceCollection.BuildServiceProvider().GetActivator();
  68. // Assert
  69. Assert.Same(expectedActivator, actualActivator);
  70. }
  71. private class ClassWithParameterlessCtor
  72. {
  73. }
  74. private class ClassWithServiceProviderCtor
  75. {
  76. public readonly IServiceProvider Services;
  77. public ClassWithServiceProviderCtor(IServiceProvider services)
  78. {
  79. Services = services;
  80. }
  81. }
  82. private class ClassWithBothCtors
  83. {
  84. public readonly IServiceProvider Services;
  85. public readonly bool ParameterlessCtorCalled;
  86. public ClassWithBothCtors()
  87. {
  88. ParameterlessCtorCalled = true;
  89. Services = null;
  90. }
  91. public ClassWithBothCtors(IServiceProvider services)
  92. {
  93. ParameterlessCtorCalled = false;
  94. Services = services;
  95. }
  96. }
  97. }
  98. }