コード例 #1
0
 private static bool IsMethodSkipped(ResolvedInjectionConfiguration resolvedConfiguration, string skippedMethodFullName)
 {
     return(resolvedConfiguration
            .InjecteeAssemblies
            .SelectMany(assembly => assembly.InjecteeMethods)
            .All(method => method.GetFullSimpleName() != skippedMethodFullName));
 }
コード例 #2
0
 private static bool IsTypeSkipped(ResolvedInjectionConfiguration resolvedConfiguration, string skippedTypeFullName)
 {
     return(resolvedConfiguration
            .InjecteeAssemblies
            .SelectMany(assembly => assembly.InjecteeMethods)
            .All(method => method.DeclaringType.FullName != skippedTypeFullName));
 }
コード例 #3
0
        protected static void ExecuteSimpleInjection(InjectionConfiguration configuration)
        {
            ResolvedInjectionConfiguration resolvedConfiguration =
                ResolvedInjectionConfigurationLoader.LoadFromInjectionConfiguration(configuration);

            IntegrationTestsHelper.ExecuteInjection(resolvedConfiguration);
            IntegrationTestsHelper.WriteModifiedAssembliesIfRequested(resolvedConfiguration);
        }
コード例 #4
0
 public static void WriteModifiedAssembliesIfRequested(ResolvedInjectionConfiguration resolvedConfiguration)
 {
     if (TestContext.CurrentContext.Test.Properties.Get(nameof(SaveModifiedAssembliesAttribute).RemoveAttribute()) is bool saveModifiedAssemblies && saveModifiedAssemblies)
     {
         foreach (ResolvedInjecteeAssembly injecteeAssembly in resolvedConfiguration.InjecteeAssemblies)
         {
             injecteeAssembly.AssemblyDefinition.Write(injecteeAssembly.AssemblyDefinition.MainModule.FullyQualifiedName);
         }
     }
 }
コード例 #5
0
        public void IgnoreTypeAndChildTypesTest()
        {
            ResolvedInjectionConfiguration resolvedConfiguration =
                ExecuteSimpleIgnoreTypeTest(
                    typeof(TestInjectee).FullName,
                    IgnoredMemberReferenceFlags.SkipTypes |
                    IgnoredMemberReferenceFlags.MatchAncestors
                    );

            Assert.True(IsTypeSkipped(resolvedConfiguration, typeof(ChildTestInjectee).FullName));
        }
コード例 #6
0
        private ResolvedInjectionConfiguration ExecuteSimpleIgnoreTypeTest(
            string ignoredTypeFullName,
            IgnoredMemberReferenceFlags ignoreFlags =
            IgnoredMemberReferenceFlags.SkipTypes
            )
        {
            ResolvedInjectionConfiguration resolvedConfiguration = ExecuteSimpleIgnoreTest(ignoredTypeFullName, ignoreFlags);

            Assert.True(IsTypeSkipped(resolvedConfiguration, ignoredTypeFullName));

            return(resolvedConfiguration);
        }
コード例 #7
0
        protected static ResolvedInjectionConfiguration ExecuteSimpleTest(
            InjectionConfiguration configuration,
            string[] injecteeMethodNames,
            bool assertFirstMethodMatch = true)
        {
            ResolvedInjectionConfiguration resolvedConfiguration =
                IntegrationTestsHelper.GetBasicResolvedInjectionConfiguration(configuration, injecteeMethodNames);

            ExecuteSimpleTest(resolvedConfiguration, assertFirstMethodMatch);

            return(resolvedConfiguration);
        }
コード例 #8
0
        public void IgnoreVirtualMethodTest()
        {
            string methodName      = $"{typeof(TestInjectee).FullName}.{nameof(TestInjectee.VirtualSingleStatement)}";
            string methodNameChild = $"{typeof(ChildTestInjectee).FullName}.{nameof(TestInjectee.VirtualSingleStatement)}";
            ResolvedInjectionConfiguration configuration =
                ExecuteSimpleIgnoreTest(
                    methodName,
                    IgnoredMemberReferenceFlags.SkipMethods
                    );

            Assert.True(IsMethodSkipped(configuration, methodName));
            Assert.False(IsMethodSkipped(configuration, methodNameChild));
        }
コード例 #9
0
        public void IgnoreVirtualPropertyTest()
        {
            string propertyName      = $"{typeof(TestInjectee).FullName}.{nameof(TestInjectee.VirtualSingleStatementProperty)}";
            string propertyNameChild = $"{typeof(ChildTestInjectee).FullName}.{nameof(TestInjectee.VirtualSingleStatementProperty)}";
            ResolvedInjectionConfiguration configuration =
                ExecuteSimpleIgnoreTest(
                    propertyName,
                    IgnoredMemberReferenceFlags.SkipProperties
                    );

            Assert.True(IsPropertySkipped(configuration, propertyName));
            Assert.False(IsPropertySkipped(configuration, propertyNameChild));
        }
コード例 #10
0
        private ResolvedInjectionConfiguration ExecuteIgnoreTest(
            params IIgnoredMemberReference[] ignoredMemberReferences
            )
        {
            InjectionConfiguration configuration = GetInjectionConfiguration(ignoredMemberReferences.ToList());

            // Strip includes
            configuration = StripIncludesFromConfiguration(configuration);

            ResolvedInjectionConfiguration resolvedConfiguration =
                ResolvedInjectionConfigurationLoader.LoadFromInjectionConfiguration(configuration);

            ExecuteSimpleTest(resolvedConfiguration, false);
            return(resolvedConfiguration);
        }
コード例 #11
0
        public void IgnoreTypeByRegexTest()
        {
            ResolvedInjectionConfiguration resolvedConfiguration =
                ExecuteIgnoreTest(
                    new IgnoredMemberReference(
                        "Injecte[ed]",
                        IgnoredMemberReferenceFlags.SkipTypes |
                        IgnoredMemberReferenceFlags.IsRegex |
                        IgnoredMemberReferenceFlags.MatchAncestors
                        )
                    );

            Assert.True(IsTypeSkipped(resolvedConfiguration, typeof(TestInjectee).FullName));
            Assert.True(IsTypeSkipped(resolvedConfiguration, typeof(ChildTestInjectee).FullName));
            Assert.True(IsTypeSkipped(resolvedConfiguration, typeof(StructTestInjectee).FullName));
        }
コード例 #12
0
        private ResolvedInjectionConfiguration ExecuteSimpleIgnoreTest(
            string ignoredMethodFullName,
            IgnoredMemberReferenceFlags ignoreFlags = IgnoredMemberReferenceFlags.SkipMethods
            )
        {
            IIgnoredMemberReference[] ignoredMemberReferences =
            {
                new IgnoredMemberReference(
                    ignoredMethodFullName,
                    ignoreFlags
                    ),
            };

            ResolvedInjectionConfiguration resolvedConfiguration = ExecuteIgnoreTest(ignoredMemberReferences);

            return(resolvedConfiguration);
        }
コード例 #13
0
        protected static void ExecuteSimpleTest(ResolvedInjectionConfiguration resolvedConfiguration, bool assertFirstMethodMatch = true)
        {
            IntegrationTestsHelper.ExecuteInjection(resolvedConfiguration);
            IntegrationTestsHelper.WriteModifiedAssembliesIfRequested(resolvedConfiguration);

            if (assertFirstMethodMatch)
            {
                bool validReferenceOutput           = TestContext.CurrentContext.Test.Properties.Get(nameof(ValidReferenceOutputAttribute).RemoveAttribute()) is bool tmp1 && tmp1;
                bool forceRegenerateReferenceOutput = TestContext.CurrentContext.Test.Properties.Get(nameof(ForceRegenerateReferenceOutputAttribute).RemoveAttribute()) is bool tmp2 && tmp2;
                if (validReferenceOutput && !forceRegenerateReferenceOutput)
                {
                    IntegrationTestsHelper.AssertFirstMethod(resolvedConfiguration);
                }
                else
                {
                    IntegrationTestsHelper.WriteReferenceOutputFile(resolvedConfiguration);
                    Console.WriteLine(IntegrationTestsHelper.GetFormattedReferenceOutputFile());
                    Assert.Fail("Reference output not validated");
                }
            }
        }
コード例 #14
0
        private static bool IsPropertySkipped(ResolvedInjectionConfiguration resolvedConfiguration, string skippedPropertyFullName)
        {
            IEnumerable <PropertyDefinition> allProperties =
                resolvedConfiguration
                .InjecteeAssemblies
                .SelectMany(assembly => assembly.AssemblyDefinition.MainModule.GetAllTypes().SelectMany(type => type.Properties));

            PropertyDefinition skippedProperty =
                allProperties
                .First(property => property.GetFullSimpleName() == skippedPropertyFullName);

            if (skippedProperty.GetMethod != null && !IsMethodSkipped(resolvedConfiguration, skippedProperty.GetMethod.GetFullSimpleName()))
            {
                return(false);
            }

            if (skippedProperty.SetMethod != null && !IsMethodSkipped(resolvedConfiguration, skippedProperty.SetMethod.GetFullSimpleName()))
            {
                return(false);
            }

            return(true);
        }
コード例 #15
0
        private void ExecuteInjection()
        {
#if !DEBUG
            try {
#endif
            string serializedInjectorConfiguration;
            if (_commandLineOptions.ReadConfigurationFromStandardInput)
            {
                serializedInjectorConfiguration = Console.In.ReadToEnd();
            }
            else
            {
                if (!File.Exists(_commandLineOptions.ConfigurationFilePath))
                {
                    throw new MethodInlineInjectorException(
                              "Injection configuration file doesn't exists",
                              new FileNotFoundException(_commandLineOptions.ConfigurationFilePath)
                              );
                }

                serializedInjectorConfiguration = File.ReadAllText(_commandLineOptions.ConfigurationFilePath);
            }

            Log.Debug($"Input configuration:{Environment.NewLine}{serializedInjectorConfiguration}");

            if (String.IsNullOrWhiteSpace(serializedInjectorConfiguration))
            {
                throw new MethodInlineInjectorException("Injector configuration is empty");
            }

            Log.Info("Parsing configuration file");
            ValidateConfiguration(serializedInjectorConfiguration);
            InjectionConfiguration injectionConfiguration =
                SimpleXmlSerializationUtility.XmlDeserializeFromString <InjectionConfiguration>(serializedInjectorConfiguration);

            Log.Info("Resolving configuration file");
            ResolvedInjectionConfiguration resolvedInjectionConfiguration =
                ResolvedInjectionConfigurationLoader.LoadFromInjectionConfiguration(injectionConfiguration);

            Log.Info("Starting injection");
            MethodInlineInjector assemblyMethodInjector = new MethodInlineInjector(resolvedInjectionConfiguration);

            int injectedMethodCount = 0;
            assemblyMethodInjector.BeforeMethodInjected += tuple => injectedMethodCount++;
            assemblyMethodInjector.Inject();

            Log.InfoFormat("Injected {0} methods", injectedMethodCount);

            Log.Info("Writing modified assemblies");
            foreach (ResolvedInjecteeAssembly injecteeAssembly in resolvedInjectionConfiguration.InjecteeAssemblies)
            {
                string path = injecteeAssembly.AssemblyDefinition.MainModule.FullyQualifiedName;
                Log.DebugFormat("Writing assembly {0} to '{1}'", injecteeAssembly.AssemblyDefinition.FullName, path);
                injecteeAssembly.AssemblyDefinition.Write(path);
            }
#if !DEBUG
        }

        catch (MethodInlineInjectorException e) {
            string message = "Fatal error: " + e;
            if (e.InnerException != null)
            {
                message += Environment.NewLine;
                message += "Error details: ";
                message += e.InnerException;
            }
            Log.Fatal(message);
            Environment.ExitCode = 1;
        }
#endif
        }
コード例 #16
0
 public static void WriteReferenceOutputFile(ResolvedInjectionConfiguration resolvedInjectionConfiguration)
 {
     WriteReferenceOutputFile(resolvedInjectionConfiguration.InjecteeAssemblies[0].InjecteeMethods[0]);
 }
コード例 #17
0
 public static void AssertFirstMethod(ResolvedInjectionConfiguration resolvedInjectionConfiguration)
 {
     AssertMethod(resolvedInjectionConfiguration.InjecteeAssemblies[0].InjecteeMethods[0]);
 }
コード例 #18
0
        public static void ExecuteInjection(ResolvedInjectionConfiguration resolvedInjectionConfiguration)
        {
            MethodInlineInjector assemblyMethodInjector = new MethodInlineInjector(resolvedInjectionConfiguration);

            assemblyMethodInjector.Inject();
        }