chr
2026-04-05 fe750b791d5b517cc4e9bc8e99a9a75139a0cfba
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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 = $@"<?xml version=""1.0"" encoding=""UTF-8""?>
<Package Name=""TestPackage""   Version=""1.0.0"" OS=""{OperatingSystem.Current}"" Architecture=""x64"">
    <Files>
        <File Path=""OpenTap.dll"">
            <SetAssemblyInfo Attributes=""Version"" />
        </File>
        <File Path=""OpenTap.Package.dll"">
            <SetAssemblyInfo Attributes=""Version"" />
        </File>
        <File Path=""OpenTap.Plugins.BasicSteps.dll"">
            <SetAssemblyInfo Attributes=""Version"" />
        </File>
        <File Path=""OpenTap.Cli.dll"">
            <SetAssemblyInfo Attributes=""Version"" />
        </File>
        <File Path=""tap.pdb""/>
        <File Path=""OpenTap.Package.pdb""/>
        <File Path=""OpenTap.Plugins.BasicSteps.pdb""/>
        <File Path=""OpenTap.Cli.pdb""/>
    </Files>
</Package>
";
            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);
            }
        }
    }
}