Exemple #1
0
    public void Should_verify_current_assembly()
    {
        var verify = PeVerifier.Verify(assemblyPath, GetIgnoreCodes(), out var output);

        Assert.True(verify);
        Assert.NotNull(output);
    }
        protected void AssertRunPeVerify(ModuleWeaver weaver)
        {
            Action action = () =>
            {
                var runIlSpy = false;
                try
                {
                    PeVerifier.Verify(Weave.DllPath);
                }
                catch (Exception)
                {
                    runIlSpy = true;
                    throw;
                }
                finally
                {
                    if (runIlSpy || IlSpy.AlwaysRunIlSpy)
                    {
                        var methodName = weaver?.MethodFilters.Single();
                        IlSpy.ShowMethod(methodName, Weave.DllPath);
                        IlSpy.ShowMethod(methodName, Source.DllPath);
                        Thread.Sleep(TimeSpan.FromSeconds(2)); // wait until ILSpy is started because weaved dll will be deleted when unittests exits -> TryCleanupWeavedFiles()
                    }
                }
            };

            action.Should().NotThrow();
        }
Exemple #3
0
 public void Should_verify_current_assembly()
 {
     var verify = PeVerifier.Verify(GetAssemblyPath(), Enumerable.Empty<string>(), out var output);
     Assert.True(verify);
     Assert.NotNull(output);
     Assert.NotEmpty(output);
 }
Exemple #4
0
    bool InnerVerify()
    {
        if (!File.Exists(TargetPath))
        {
            Logger.LogInfo($"  Cannot verify assembly, file '{TargetPath}' does not exist");
            return(true);
        }

        if (!ReadShouldVerifyAssembly(out var ignoreCodes))
        {
            Logger.LogInfo("  Skipped Verifying assembly since it is disabled in configuration");
            return(true);
        }

        if (!PeVerifier.FoundPeVerify)
        {
            Logger.LogInfo("  Skipped Verifying assembly since could not find peverify.exe.");
            return(true);
        }

        Logger.LogInfo("  Verifying assembly");
        ignoreCodes.Add("0x80070002");
        if (PeVerifier.Verify(TargetPath, ignoreCodes, out var output))
        {
            return(true);
        }

        Logger.LogError($"PEVerify of the assembly failed.\n{output}");
        return(false);
    }
Exemple #5
0
        private void RunPeVerify()
        {
            Action action = () =>
            {
                var runIlSpy = false;
                try
                {
                    PeVerifier.Verify(WeavedAssemblyPath);
                }
                catch (Exception)
                {
                    runIlSpy = true;
                    throw;
                }
                finally
                {
                    if (runIlSpy || IlSpy.AlwaysRunIlSpy)
                    {
                        RunIlSpy();
                    }
                }
            };

            action.Should().NotThrow();
        }
Exemple #6
0
        public void Setup()
        {
            var weavingTask = new ModuleWeaver
            {
                ClassNames = new List <string> {
                    BaseClassName
                },
                AllowNonPublic = ProcessNonPublicToo
            };

            var asm         = Assembly.GetAssembly(typeof(InjectionTests));
            var subjectPath = Path.Combine(Path.GetDirectoryName(asm.Location), TestLibraryName);

            // run pe verify separately to prevent 'Unable to resolve token.(Error: 0x80131869)' errors with weavingTask
            var valid = PeVerifier.Verify(subjectPath,
                                          subjectPath,
                                          PEVerifyIgnoreCodes,
                                          out var beforeOutput,
                                          out var afterOutput);

            Assert.IsTrue(valid);

            testResult        = weavingTask.ExecuteTestRun(subjectPath, runPeVerify: false);
            processedAssembly = testResult.Assembly;

            TestContext.Out.WriteLine($"Run tests for {BaseClassName}, {nameof(ProcessNonPublicToo)}={ProcessNonPublicToo}");
        }
Exemple #7
0
        private void RunPeVerify(IEnumerable <string> ignoreErrorCodes)
        {
            Action action = () =>
            {
                var runIlSpy = false;
                try
                {
                    PeVerifier.Verify(WeavedAssemblyPath, ignoreErrorCodes);
                }
                catch (Exception)
                {
                    runIlSpy = true;
                    throw;
                }
                finally
                {
                    if (runIlSpy || IlSpy.AlwaysRunIlSpy)
                    {
                        RunIlSpy();
                    }
                }
            };

            action.Should().NotThrow();
        }
Exemple #8
0
 public void Same_assembly_should_not_throw()
 {
     var assemblyPath = GetAssemblyPath().ToLowerInvariant();
     var newAssemblyPath = assemblyPath.Replace(".dll", "2.dll");
     File.Copy(assemblyPath, newAssemblyPath, true);
     PeVerifier.ThrowIfDifferent(assemblyPath, newAssemblyPath);
     File.Delete(newAssemblyPath);
 }
Exemple #9
0
    public void Same_assembly_should_not_throw()
    {
        Directory.CreateDirectory("temp");
        var newAssemblyPath = Path.GetFullPath("temp/temp.dll");

        File.Copy(assemblyPath, newAssemblyPath, true);
        PeVerifier.ThrowIfDifferent(assemblyPath, newAssemblyPath,
                                    ignoreCodes: GetIgnoreCodes());
        File.Delete(newAssemblyPath);
    }
Exemple #10
0
    public void TrimLineNumbers()
    {
        var text = PeVerifier.TrimLineNumbers(@"
[IL]: Error: [C:\Code\net452\AssemblyToProcess.dll : UnsafeClass::MethodWithAmp][offset 0x00000002][found Native Int][expected unmanaged pointer] Unexpected type on the stack.
[IL]: Error: [C:\Code\net452\AssemblyToProcess.dll : UnsafeClass::get_NullProperty][offset 0x00000006][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack.
[IL]: Error: [C:\Code\net452\AssemblyToProcess.dll : UnsafeClass::set_NullProperty][offset 0x00000001] Unmanaged pointers are not a verifiable type.
3 Error(s) Verifying C:\Code\Fody\net452\AssemblyToProcess.dll");

        Approvals.Verify(text);
    }
Exemple #11
0
    public void Invalid_assembly_should_throw()
    {
        var assemblyPath = GetAssemblyPath().ToLowerInvariant();
        var newAssemblyPath = assemblyPath.Replace(".dll", "2.dll");
        File.Copy(assemblyPath, newAssemblyPath, true);
        using (var moduleDefinition = ModuleDefinition.ReadModule(assemblyPath))
        {
            moduleDefinition.AssemblyReferences.Clear();
            moduleDefinition.Write(newAssemblyPath);
        }

        Assert.Throws<Exception>(() => PeVerifier.ThrowIfDifferent(assemblyPath, newAssemblyPath));
        File.Delete(newAssemblyPath);
    }
Exemple #12
0
    public void Invalid_assembly_should_throw()
    {
        Directory.CreateDirectory("temp");
        var newAssemblyPath = Path.GetFullPath("temp/temp.dll");

        File.Copy(assemblyPath, newAssemblyPath, true);
        using (var moduleDefinition = ModuleDefinition.ReadModule(assemblyPath))
        {
            moduleDefinition.AssemblyReferences.Clear();
            moduleDefinition.Write(newAssemblyPath);
        }

        Assert.Throws <Exception>(() => PeVerifier.ThrowIfDifferent(assemblyPath, newAssemblyPath));
        File.Delete(newAssemblyPath);
    }
Exemple #13
0
    bool InnerVerify()
    {
        if (!File.Exists(TargetPath))
        {
            Logger.LogInfo($"  Cannot verify assembly, file '{TargetPath}' does not exist");
            return(true);
        }

        if (!ReadShouldVerifyAssembly(out var ignoreCodes))
        {
            Logger.LogInfo("  Skipped Verifying assembly since it is disabled in configuration");
            return(true);
        }

        if (!PeVerifier.FoundPeVerify)
        {
            Logger.LogInfo("  Skipped Verifying assembly since could not find peverify.exe.");
            return(true);
        }

        var stopwatch = Stopwatch.StartNew();

        try
        {
            Logger.LogInfo("  Verifying assembly");
            ignoreCodes.Add("0x80070002");
            if (PeVerifier.Verify(TargetPath, ignoreCodes, out var output))
            {
                return(true);
            }

            Logger.LogError($"PEVerify of the assembly failed.\n{output}");
            return(false);
        }
        finally
        {
            Logger.LogInfo($"  Finished verification in {stopwatch.ElapsedMilliseconds}ms.");
        }
    }
Exemple #14
0
        public void PeVerify()
        {
            var weaver = AssemblyWeaver.Instance;

            PeVerifier.ThrowIfDifferent(weaver.BeforeAssemblyPath, weaver.AfterAssemblyPath);
        }
Exemple #15
0
        public static TestResult ExecuteVandelayTestRun(
            this BaseModuleWeaver weaver,
            string assemblyPath,
            bool runPeVerify = true,
            Action <ModuleDefinition> afterExecuteCallback  = null,
            Action <ModuleDefinition> beforeExecuteCallback = null,
            string assemblyName = null,
            IEnumerable <string> ignoreCodes = null,
            bool purgeTempDir = true,
            StrongNameKeyPair strongNameKeyPair = null)
        {
            assemblyPath = Path.Combine(CodeBaseLocation.CurrentDirectory, assemblyPath);
            var fodyTempDir = Path.Combine(Path.GetDirectoryName(assemblyPath), "fodytemp");

            Directory.CreateDirectory(fodyTempDir);

            if (purgeTempDir)
            {
                var info = new DirectoryInfo(fodyTempDir);

                foreach (var file in info.GetFiles())
                {
                    file.Delete();
                }

                foreach (var directory in info.GetDirectories())
                {
                    directory.Delete(true);
                }
            }

            string targetFileName;

            if (assemblyName == null)
            {
                assemblyName   = Path.GetFileNameWithoutExtension(assemblyPath);
                targetFileName = Path.GetFileName(assemblyPath);
            }
            else
            {
                targetFileName = assemblyName + ".dll";
            }

            var targetAssemblyPath = Path.Combine(fodyTempDir, targetFileName);

            using (var assemblyResolver = new TestAssemblyResolver())
            {
                var typeCache = CacheTypes(weaver, assemblyResolver.Resolve);

                var testStatus = new TestResult();

                var addMessageInfo = typeof(TestResult).GetMethod("AddMessage",
                                                                  BindingFlags.NonPublic | BindingFlags.Instance);
                Debug.Assert(addMessageInfo != null, $"{nameof(addMessageInfo)} != null");
                var addMessage = addMessageInfo
                                 .CreateDelegate <Action <string, MessageImportance> >(testStatus);

                var addWarningInfo = typeof(TestResult).GetMethod("AddWarning",
                                                                  BindingFlags.NonPublic | BindingFlags.Instance);
                Debug.Assert(addWarningInfo != null, $"{nameof(addWarningInfo)} != null");
                var addWarning = addWarningInfo
                                 .CreateDelegate <Action <string, SequencePoint> >(testStatus);

                var addErrorInfo = typeof(TestResult).GetMethod("AddError",
                                                                BindingFlags.NonPublic | BindingFlags.Instance);
                Debug.Assert(addErrorInfo != null, $"{nameof(addErrorInfo)} != null");
                var addError = addErrorInfo
                               .CreateDelegate <Action <string, SequencePoint> >(testStatus);

                weaver.LogDebug         = text => addMessage(text, MessageImportanceDefaults.Debug);
                weaver.LogInfo          = text => addMessage(text, MessageImportanceDefaults.Info);
                weaver.LogMessage       = (text, messageImportance) => addMessage(text, messageImportance);
                weaver.LogWarning       = text => addWarning(text, null);
                weaver.LogWarningPoint  = (text, sequencePoint) => addWarning(text, sequencePoint);
                weaver.LogError         = text => addError(text, null);
                weaver.LogErrorPoint    = (text, sequencePoint) => addError(text, sequencePoint);
                weaver.AssemblyFilePath = assemblyPath;
                weaver.FindType         = typeCache.FindType;
                weaver.TryFindType      = typeCache.TryFindType;
                weaver.ResolveAssembly  = assemblyResolver.Resolve;

                var readerProviderType = typeof(BaseModuleWeaver).Assembly
                                         .GetType("SymbolReaderProvider", true);
                var readerProvider = (ISymbolReaderProvider)Activator.CreateInstance(readerProviderType);

                var readerParameters = new ReaderParameters
                {
                    AssemblyResolver     = assemblyResolver,
                    SymbolReaderProvider = readerProvider,
                    ReadWrite            = false,
                    ReadSymbols          = true,
                };

                using (var module = ModuleDefinition.ReadModule(assemblyPath, readerParameters))
                {
                    module.Assembly.Name.Name = assemblyName;
                    weaver.ModuleDefinition   = module;
                    weaver.TypeSystem         = new TypeSystem(typeCache.FindType, module);
                    beforeExecuteCallback?.Invoke(module);

                    weaver.Execute();

                    var referenceCleanerType = typeof(BaseModuleWeaver).Assembly
                                               .GetType("ReferenceCleaner", true);
                    var cleanReferencesInfo = referenceCleanerType.GetMethod("CleanReferences");
                    Debug.Assert(cleanReferencesInfo != null, nameof(cleanReferencesInfo) + " != null");
                    var cleaner = cleanReferencesInfo
                                  .CreateDelegate <Action <ModuleDefinition, BaseModuleWeaver, Action <string> > >();
                    cleaner(module, weaver, weaver.LogDebug);

                    afterExecuteCallback?.Invoke(module);

                    var writerParameters = new WriterParameters
                    {
                        StrongNameKeyPair = strongNameKeyPair,
                        WriteSymbols      = true
                    };

                    module.Write(targetAssemblyPath, writerParameters);
                }

                if (runPeVerify && IsWindows())
                {
                    var ignoreList = ignoreCodes == null ? new List <string>() : ignoreCodes.ToList();

                    PeVerifier.ThrowIfDifferent(assemblyPath, targetAssemblyPath, ignoreList,
                                                Path.GetDirectoryName(assemblyPath));
                }

#if NETSTANDARD
                AppDomain.CurrentDomain.AssemblyResolve += (_, args) =>
                {
                    var tempAssemblyPath = Path.Combine(fodyTempDir, new AssemblyName(args.Name).Name + ".dll");
                    return(!File.Exists(tempAssemblyPath) ? null : Assembly.LoadFrom(tempAssemblyPath));
                };
#endif

                typeof(TestResult).GetMethod("set_Assembly",
                                             BindingFlags.NonPublic | BindingFlags.Instance)
                .Invoke(testStatus, new object[]
                {
                    Assembly.Load(AssemblyName.GetAssemblyName(targetAssemblyPath))
                });
                typeof(TestResult).GetMethod("set_AssemblyPath",
                                             BindingFlags.NonPublic | BindingFlags.Instance)
                .Invoke(testStatus, new object[]
                {
                    targetAssemblyPath
                });
                return(testStatus);
            }
        }
Exemple #16
0
        private void RunPeVerify()
        {
            Action action = () => PeVerifier.Verify(WeavedAssemblyPath);

            action.ShouldNotThrow();
        }
        private void RunPeVerify()
        {
            var result = PeVerifier.Verify(WeavedAssemblyPath);

            result.Should().Be(0, "PeVerifier failed!");
        }