using System; using System.IO; using System.IO.Compression; using System.Threading; using Mono.Cecil; using NUnit.Framework; namespace OpenTap.Package.UnitTests { [TestFixture] public class PdbFixupTest { [Test] public void OpenTapSymbolsFixed() { var xml = $@" "; var packageFile = Path.GetTempFileName(); File.WriteAllText(packageFile, xml); var outFile = Path.GetTempFileName(); var files = new string[] { "OpenTap.Package", "OpenTap.Plugins.BasicSteps", "OpenTap.Cli" }; var create = new PackageCreateAction() { Install = false, OutputPaths = new[] { outFile }, PackageXmlFile = packageFile }; Assert.AreEqual(0, create.Execute(CancellationToken.None), "Failed to create package."); var outDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); Directory.CreateDirectory(outDir); using (var fs = File.OpenRead(outFile)) { using (var archive = new ZipArchive(fs)) { archive.ExtractToDirectory(outDir); } } try { foreach (var file in files) { var @base = Path.Combine(outDir, file); var rawAssembly = File.ReadAllBytes(@base + ".dll"); var rawSymbols = File.ReadAllBytes(@base + ".pdb"); var asmStream = new MemoryStream(rawAssembly); asmStream.Seek(0, SeekOrigin.Begin); var symbolStream = new MemoryStream(rawSymbols); symbolStream.Seek(0, SeekOrigin.Begin); void load() { // This will throw if the symbols don't match AssemblyDefinition.ReadAssembly(asmStream, new ReaderParameters() { InMemory = true, ReadSymbols = true, SymbolStream = symbolStream, ReadingMode = ReadingMode.Immediate }); } try { load(); } catch { Assert.Fail("Debugging symbols did not match!"); } } } finally { File.Delete(packageFile); File.Delete(outFile); Directory.Delete(outDir, true); } } } }