/// <summary>
        ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
        ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
        ///     any release. You should only use it directly in your code with extreme caution and knowing that
        ///     doing so can result in application failures when updating to a new Entity Framework Core release.
        /// </summary>
        public RelationalScaffoldingModelFactory(
            [NotNull] IOperationReporter reporter,
            [NotNull] ICandidateNamingService candidateNamingService,
            [NotNull] IPluralizer pluralizer,
            [NotNull] ICSharpUtilities cSharpUtilities,
            [NotNull] IScaffoldingTypeMapper scaffoldingTypeMapper,
            [NotNull] LoggingDefinitions loggingDefinitions)
        {
            Check.NotNull(reporter, nameof(reporter));
            Check.NotNull(candidateNamingService, nameof(candidateNamingService));
            Check.NotNull(pluralizer, nameof(pluralizer));
            Check.NotNull(cSharpUtilities, nameof(cSharpUtilities));
            Check.NotNull(scaffoldingTypeMapper, nameof(scaffoldingTypeMapper));
            Check.NotNull(loggingDefinitions, nameof(loggingDefinitions));

            _reporter = reporter;
            _candidateNamingService = candidateNamingService;
            _pluralizer             = pluralizer;
            _cSharpUtilities        = cSharpUtilities;
            _scaffoldingTypeMapper  = scaffoldingTypeMapper;
            _loggingDefinitions     = loggingDefinitions;
        }
        public ColumnRemovingScaffoldingModelFactory([NotNull] IOperationReporter reporter, [NotNull] ICandidateNamingService candidateNamingService, [NotNull] IPluralizer pluralizer, [NotNull] ICSharpUtilities cSharpUtilities, [NotNull] IScaffoldingTypeMapper scaffoldingTypeMapper, [NotNull] LoggingDefinitions loggingDefinitions, List <SerializationTableModel> tables, DatabaseType databaseType) :
            base(reporter, candidateNamingService, pluralizer, cSharpUtilities, scaffoldingTypeMapper, loggingDefinitions)
#endif
        {
            _tables       = tables;
            _databaseType = databaseType;
        }
예제 #3
0
        public void TestEventLogging(
            Type eventIdType,
            Type loggerExtensionType,
            Type[] loggerMethodTypes,
            LoggingDefinitions loggerDefinitions,
            IDictionary <Type, Func <object> > fakeFactories,
            Action <ServiceCollection> serviceCollectionBuilder,
            Dictionary <string, IList <string> > eventMappings = null)
        {
            var testLoggerFactory = new TestLoggerFactory(loggerDefinitions);
            var testLogger        = testLoggerFactory.Logger;
            var testDiagnostics   = new TestDiagnosticSource();
            var contextLogger     = new TestDbContextLogger();

            var serviceCollection = new ServiceCollection();

            serviceCollection.TryAdd(new ServiceDescriptor(typeof(LoggingDefinitions), loggerDefinitions));
            serviceCollection.TryAdd(new ServiceDescriptor(typeof(ILoggerFactory), testLoggerFactory));
            serviceCollection.TryAdd(new ServiceDescriptor(typeof(DiagnosticSource), testDiagnostics));
            serviceCollection.TryAdd(new ServiceDescriptor(typeof(IDbContextLogger), contextLogger));
            serviceCollection.TryAdd(new ServiceDescriptor(typeof(IDbContextOptions), new DbContextOptionsBuilder().Options));
            serviceCollectionBuilder(serviceCollection);
            using var serviceProvider = serviceCollection.BuildServiceProvider();
            using var serviceScope    = serviceProvider.CreateScope();
            var scopeServiceProvider = serviceScope.ServiceProvider;

            var eventIdFields = eventIdType.GetTypeInfo()
                                .DeclaredFields
                                .Where(p => p.FieldType == typeof(EventId) && p.GetCustomAttribute <ObsoleteAttribute>() == null)
                                .ToList();

            foreach (var eventIdField in eventIdFields)
            {
                var eventName = eventIdField.Name;
                if (eventMappings == null ||
                    !eventMappings.TryGetValue(eventName, out var mappedNames))
                {
                    mappedNames = new List <string> {
                        eventName
                    };
                }

                foreach (var mappedName in mappedNames)
                {
                    var loggerMethod = loggerMethodTypes
                                       .Append(loggerExtensionType)
                                       .Select(t => t.GetMethod(mappedName))
                                       .FirstOrDefault(m => m is not null);

                    Assert.True(loggerMethod is not null, $"Couldn't find logger method {mappedName}");

                    var isExtensionMethod = loggerMethod.IsStatic;
                    var loggerParameters  = loggerMethod.GetParameters();

                    var category = isExtensionMethod
                        ? loggerParameters[0].ParameterType.GenericTypeArguments[0]
                        : loggerMethod.DeclaringType !.GetInterfaces()
                                   .Single(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IDiagnosticsLogger <>))
                                   .GetGenericArguments()[0];

                    if (category.ContainsGenericParameters)
                    {
                        category     = typeof(DbLoggerCategory.Infrastructure);
                        loggerMethod = loggerMethod.MakeGenericMethod(category);
                    }

                    var eventId = (EventId)eventIdField.GetValue(null);

                    Assert.InRange(eventId.Id, CoreEventId.CoreBaseId, ushort.MaxValue);

                    var categoryName = Activator.CreateInstance(category).ToString();
                    Assert.Equal(categoryName + "." + eventName, eventId.Name);

                    var diagnosticLogger = scopeServiceProvider.GetRequiredService(
                        isExtensionMethod
                            ? typeof(IDiagnosticsLogger <>).MakeGenericType(category)
                            : loggerMethod.DeclaringType);

                    var args = new object[loggerParameters.Length];
                    var i    = 0;
                    if (isExtensionMethod)
                    {
                        args[i++] = diagnosticLogger;
                    }

                    for (; i < args.Length; i++)
                    {
                        var type = loggerParameters[i].ParameterType;

                        if (fakeFactories.TryGetValue(type, out var factory))
                        {
                            args[i] = factory();
                        }
                        else
                        {
                            try
                            {
                                args[i] = Activator.CreateInstance(type);
                            }
                            catch (Exception)
                            {
                                Assert.True(
                                    false,
                                    "Need to add fake test factory for type "
                                    + type.DisplayName()
                                    + " in class "
                                    + eventIdType.Name
                                    + "Test");
                            }
                        }
                    }

                    foreach (var enableFor in new[] { "Foo", eventId.Name })
                    {
                        testDiagnostics.EnableFor = enableFor;

                        var logged = false;
                        foreach (LogLevel logLevel in Enum.GetValues(typeof(LogLevel)))
                        {
                            testLogger.EnabledFor           = logLevel;
                            testLogger.LoggedAt             = null;
                            testDiagnostics.LoggedEventName = null;

                            loggerMethod.Invoke(isExtensionMethod ? null : diagnosticLogger, args);

                            if (testLoggerFactory.LoggedAt != null)
                            {
                                Assert.Equal(logLevel, testLoggerFactory.LoggedAt);
                                logged = true;

                                if (categoryName != DbLoggerCategory.Scaffolding.Name)
                                {
                                    Assert.Equal(logLevel, contextLogger.LoggedAt);
                                    Assert.Equal(eventId, contextLogger.LoggedEvent);
                                }
                            }

                            if (enableFor == eventId.Name &&
                                categoryName != DbLoggerCategory.Scaffolding.Name)
                            {
                                Assert.Equal(eventId.Name, testDiagnostics.LoggedEventName);
                                if (testDiagnostics.LoggedMessage != null)
                                {
                                    Assert.Equal(testLogger.Message, testDiagnostics.LoggedMessage);
                                }
                            }
                            else
                            {
                                Assert.Null(testDiagnostics.LoggedEventName);
                            }
                        }

                        Assert.True(logged, "Failed for " + eventId.Name);
                    }
                }
            }
        }
예제 #4
0
 public TestLogger(LoggingDefinitions definitions)
     : base(definitions)
 {
 }
예제 #5
0
 public TestLoggerFactory(LoggingDefinitions definitions)
 => Logger = new TestLogger(definitions);
예제 #6
0
 public TestLogger(LoggingDefinitions definitions)
 {
     Definitions = definitions;
 }
 public ColumnRemovingScaffoldingModelFactory([NotNull] IOperationReporter reporter, [NotNull] ICandidateNamingService candidateNamingService, [NotNull] IPluralizer pluralizer, [NotNull] ICSharpUtilities cSharpUtilities, [NotNull] IScaffoldingTypeMapper scaffoldingTypeMapper, [NotNull] LoggingDefinitions loggingDefinitions, [NotNull] IModelRuntimeInitializer modelRuntimeInitializer, List <SerializationTableModel> tables, DatabaseType databaseType, bool ignoreManyToMany) :
     base(reporter, candidateNamingService, pluralizer, cSharpUtilities, scaffoldingTypeMapper, loggingDefinitions, modelRuntimeInitializer)