main
cs 177 lines 7.39 KB
Raw
1 // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3 namespace WixToolsetTest.CoreIntegration
4 {
5 using System.IO;
6 using System.Linq;
7 using WixInternal.Core.TestPackage;
8 using WixInternal.TestSupport;
9 using WixToolset.Data;
10 using Xunit;
11
12 public class RegistryFixture
13 {
14 [Fact]
15 public void PopulatesRegistryTableFromRegistryValue()
16 {
17 var folder = TestData.Get(@"TestData");
18
19 using (var fs = new DisposableFileSystem())
20 {
21 var baseFolder = fs.GetFolder();
22 var intermediateFolder = Path.Combine(baseFolder, "obj");
23 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
24
25 var result = WixRunner.Execute(new[]
26 {
27 "build",
28 Path.Combine(folder, "Registry", "RegistryValue.wxs"),
29 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
30 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
31 "-intermediateFolder", intermediateFolder,
32 "-o", msiPath
33 });
34
35 result.AssertSuccess();
36
37 Assert.True(File.Exists(msiPath));
38 var results = Query.QueryDatabase(msiPath, new[] { "Registry" });
39 WixAssert.CompareLineByLine(new[]
40 {
41 "Registry:reg04OIwIchl.9ZTjisTT6NzGSsQSM\t2\tPath\\To\\AnotherKey\tSecret\t#x\tMiscComponent",
42 "Registry:regEblTuusqFNSUQNy88zaP_UA5kIY\t2\tPath\\To\\Key\t\t1.0.1234.123\tMiscComponent",
43 }, results);
44 }
45 }
46
47 [Fact]
48 public void PopulatesRegistryTableFromRegistryValueMultiString()
49 {
50 var folder = TestData.Get(@"TestData");
51
52 using (var fs = new DisposableFileSystem())
53 {
54 var baseFolder = fs.GetFolder();
55 var intermediateFolder = Path.Combine(baseFolder, "obj");
56 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
57
58 var result = WixRunner.Execute(new[]
59 {
60 "build",
61 Path.Combine(folder, "Registry", "RegistryValueMultiString.wxs"),
62 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
63 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
64 "-intermediateFolder", intermediateFolder,
65 "-o", msiPath
66 });
67
68 result.AssertSuccess();
69
70 var results = Query.QueryDatabase(msiPath, new[] { "Registry" });
71 WixAssert.CompareLineByLine(new[]
72 {
73 "Registry:regitq_Wx9LfvJuNSc2un6gIHAzr4A\t2\tPath\\To\\AnotherKey\tSecret\t#x\tMultiStringComponent",
74 "Registry:regmeTJMpOD41igfxhTcUVZ7kNG1Mo\t2\tPath\\To\\Key\t\ta[~]b[~][~]c[~]\tMultiStringComponent",
75 }, results);
76 }
77 }
78
79 [Fact]
80 public void DuplicateRegistryValueIdsAreDetectedSmoothly()
81 {
82 var folder = TestData.Get(@"TestData");
83
84 using (var fs = new DisposableFileSystem())
85 {
86 var baseFolder = fs.GetFolder();
87 var intermediateFolder = Path.Combine(baseFolder, "obj");
88 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
89
90 var result = WixRunner.Execute(new[]
91 {
92 "build",
93 Path.Combine(folder, "Registry", "DuplicateRegistryValueIds.wxs"),
94 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
95 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
96 "-intermediateFolder", intermediateFolder,
97 "-o", msiPath
98 }, out var messages);
99
100 var errors = messages.Where(m => m.Level == MessageLevel.Error)
101 .Select(m => $"ln {m.SourceLineNumbers.LineNumber}: {m}".Replace(baseFolder, "<baseFolder>").Replace(folder, "<sourceFolder>"))
102 .ToArray();
103 WixAssert.CompareLineByLine(new[]
104 {
105 "ln 7: Duplicate Registry with identifier 'regJnkjRU9YGaMJhQOqKmivWKf_VdY' found. Access modifiers (global, library, file, section) cannot prevent these conflicts. Ensure all your identifiers of a given type (Directory, File, etc.) are unique.",
106 "ln 8: Location of symbol related to previous error.",
107 "ln 9: Location of symbol related to previous error."
108 }, errors);
109 }
110 }
111
112 [Fact]
113 public void PopulatesRegistryTableFromRemoveRegistryKey()
114 {
115 var folder = TestData.Get(@"TestData");
116
117 using (var fs = new DisposableFileSystem())
118 {
119 var baseFolder = fs.GetFolder();
120 var intermediateFolder = Path.Combine(baseFolder, "obj");
121 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
122
123 var result = WixRunner.Execute(new[]
124 {
125 "build",
126 Path.Combine(folder, "Registry", "RemoveRegistryKey.wxs"),
127 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
128 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
129 "-intermediateFolder", intermediateFolder,
130 "-o", msiPath
131 });
132
133 result.AssertSuccess();
134
135 Assert.True(File.Exists(msiPath));
136 var results = Query.QueryDatabase(msiPath, new[] { "Registry" });
137 WixAssert.CompareLineByLine(new[]
138 {
139 "Registry:RemoveAKeyName\t2\tAKeyName\t-\t\tRemoveRegistryKeyComp",
140 }, results);
141 }
142 }
143
144 [Fact]
145 public void PopulatesRegistryTableWithoutExtraBackslash()
146 {
147 var folder = TestData.Get(@"TestData");
148
149 using (var fs = new DisposableFileSystem())
150 {
151 var baseFolder = fs.GetFolder();
152 var intermediateFolder = Path.Combine(baseFolder, "obj");
153 var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
154
155 var result = WixRunner.Execute(new[]
156 {
157 "build",
158 Path.Combine(folder, "Registry", "RegistryKeyEndingWithBackslash.wxs"),
159 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
160 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
161 "-intermediateFolder", intermediateFolder,
162 "-o", msiPath
163 });
164
165 result.AssertSuccess();
166
167 Assert.True(File.Exists(msiPath));
168 var results = Query.QueryDatabase(msiPath, new[] { "Registry" });
169 WixAssert.CompareLineByLine(new[]
170 {
171 "Registry:reg1\t2\tSoftware\\WBM\\WB\t*\t\tMiscComponent",
172 "Registry:reg2\t2\tSoftware\\WBM\\WB\tInstallationPath\t[INSTALLFOLDER]\tMiscComponent",
173 }, results);
174 }
175 }
176 }
177 }