main
cs 200 lines 8.06 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.Converters
4 {
5 using System;
6 using System.IO;
7 using System.Linq;
8 using WixInternal.TestSupport;
9 using WixToolset.Converters;
10 using WixToolset.Core;
11 using WixInternal.Core.TestPackage;
12 using WixToolsetTest.Converters.Mocks;
13 using Xunit;
14
15 public class ConverterIntegrationFixture
16 {
17 [Fact]
18 public void CanConvertPermissionExFile()
19 {
20 const string beforeFileName = "v3.wxs";
21 const string afterFileName = "v4_expected.wxs";
22 var folder = TestData.Get(@"TestData\PermissionEx");
23
24 using (var fs = new DisposableFileSystem())
25 {
26 var baseFolder = fs.GetFolder(true);
27 var targetFile = Path.Combine(baseFolder, beforeFileName);
28 File.Copy(Path.Combine(folder, beforeFileName), Path.Combine(baseFolder, beforeFileName));
29
30 var messaging = new MockMessaging();
31 var converter = new WixConverter(messaging, 4);
32 var errors = converter.ConvertFile(targetFile, true);
33
34 Assert.Equal(8, errors);
35
36 var expected = File.ReadAllText(Path.Combine(folder, afterFileName)).Replace("\r\n", "\n");
37 var actual = File.ReadAllText(targetFile).Replace("\r\n", "\n");
38 WixAssert.StringEqual(expected, actual);
39
40 EnsureFixed(targetFile);
41 }
42 }
43
44 [Fact]
45 public void CanConvertSingleFile()
46 {
47 const string beforeFileName = "SingleFile.wxs";
48 const string afterFileName = "ConvertedSingleFile.wxs";
49 var folder = TestData.Get(@"TestData\SingleFile");
50
51 using (var fs = new DisposableFileSystem())
52 {
53 var baseFolder = fs.GetFolder(true);
54 var targetFile = Path.Combine(baseFolder, beforeFileName);
55 File.Copy(Path.Combine(folder, beforeFileName), Path.Combine(baseFolder, beforeFileName));
56
57 var messaging = new MockMessaging();
58 var converter = new WixConverter(messaging, 4);
59 var errors = converter.ConvertFile(targetFile, true);
60
61 Assert.Equal(9, errors);
62
63 var expected = File.ReadAllText(Path.Combine(folder, afterFileName)).Replace("\r\n", "\n");
64 var actual = File.ReadAllText(targetFile).Replace("\r\n", "\n");
65 WixAssert.StringEqual(expected, actual);
66
67 EnsureFixed(targetFile);
68 }
69 }
70
71 [Fact]
72 public void CanDetectReadOnlyOutputFile()
73 {
74 const string beforeFileName = "SingleFile.wxs";
75 var folder = TestData.Get(@"TestData\SingleFile");
76
77 using (var fs = new DisposableFileSystem())
78 {
79 var baseFolder = fs.GetFolder(true);
80 var targetFile = Path.Combine(baseFolder, beforeFileName);
81 File.Copy(Path.Combine(folder, beforeFileName), Path.Combine(baseFolder, beforeFileName));
82
83 var info = new FileInfo(targetFile);
84 info.IsReadOnly = true;
85
86 var messaging = new MockMessaging();
87 var converter = new WixConverter(messaging, 4);
88 var convertedCount = converter.ConvertFile(targetFile, true);
89
90 var errors = messaging.Messages.Where(m => m.Level == WixToolset.Data.MessageLevel.Error).Select(m => m.ToString()).ToArray();
91 WixAssert.CompareLineByLine(new[]
92 {
93 "Could not write to file. (UnauthorizedAccessException)"
94 }, errors);
95 Assert.Equal(10, convertedCount);
96 }
97 }
98
99 [Fact]
100 public void RetainsPreprocessorInstructions()
101 {
102 const string beforeFileName = "Preprocessor.wxs";
103 const string afterFileName = "ConvertedPreprocessor.wxs";
104 var folder = TestData.Get(@"TestData\Preprocessor");
105
106 using (var fs = new DisposableFileSystem())
107 {
108 var baseFolder = fs.GetFolder(true);
109 var targetFile = Path.Combine(baseFolder, beforeFileName);
110 File.Copy(Path.Combine(folder, beforeFileName), Path.Combine(baseFolder, beforeFileName));
111
112 var settingsFile = Path.Combine(folder, "wixcop.settings.xml");
113
114 var result = RunConversion(targetFile, settingsFile: settingsFile);
115 Assert.Equal(9, result.ExitCode);
116
117 var expected = File.ReadAllText(Path.Combine(folder, afterFileName)).Replace("\r\n", "\n");
118 var actual = File.ReadAllText(targetFile).Replace("\r\n", "\n");
119 WixAssert.StringEqual(expected, actual);
120
121 EnsureFixed(targetFile);
122 }
123 }
124
125 [Fact]
126 public void CanConvertQtExec()
127 {
128 const string beforeFileName = "v3.wxs";
129 const string afterFileName = "v4_expected.wxs";
130 var folder = TestData.Get(@"TestData\QtExec");
131
132 using (var fs = new DisposableFileSystem())
133 {
134 var baseFolder = fs.GetFolder(true);
135 var targetFile = Path.Combine(baseFolder, beforeFileName);
136 File.Copy(Path.Combine(folder, beforeFileName), Path.Combine(baseFolder, beforeFileName));
137
138 var result = RunConversion(targetFile);
139 Assert.Equal(13, result.ExitCode);
140
141 var expected = File.ReadAllText(Path.Combine(folder, afterFileName)).Replace("\r\n", "\n");
142 var actual = File.ReadAllText(targetFile).Replace("\r\n", "\n");
143 WixAssert.StringEqual(expected, actual);
144
145 EnsureFixed(targetFile);
146 }
147 }
148
149 [Fact]
150 public void DetectUnconvertableQtExecCmdTimeout()
151 {
152 const string beforeFileName = "v3.wxs";
153 const string afterFileName = "v4_expected.wxs";
154 var folder = TestData.Get(@"TestData\QtExec.bad");
155
156 using (var fs = new DisposableFileSystem())
157 {
158 var baseFolder = fs.GetFolder(true);
159 var targetFile = Path.Combine(baseFolder, beforeFileName);
160 File.Copy(Path.Combine(folder, beforeFileName), Path.Combine(baseFolder, beforeFileName));
161
162 var result = RunConversion(targetFile);
163
164 Assert.Equal(13, result.ExitCode);
165 Assert.Single(result.Messages.Where(message => message.ToString().EndsWith("(QtExecCmdTimeoutAmbiguous)")));
166
167 var expected = File.ReadAllText(Path.Combine(folder, afterFileName)).Replace("\r\n", "\n");
168 var actual = File.ReadAllText(targetFile).Replace("\r\n", "\n");
169 WixAssert.StringEqual(expected, actual);
170
171 // still fails because QtExecCmdTimeoutAmbiguous is unfixable
172 var result2 = RunConversion(targetFile);
173 Assert.Equal(1, result2.ExitCode);
174 }
175 }
176
177 private static WixRunnerResult RunConversion(string targetFile, bool fixErrors = true, string settingsFile = null)
178 {
179 var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider().AddConverter();
180
181 var exitCode = WixRunner.Execute(new[]
182 {
183 "convert",
184 fixErrors ? null : "--dry-run",
185 String.IsNullOrEmpty(settingsFile) ? null : "-set1" + settingsFile,
186 targetFile
187 }, serviceProvider, out var messages);
188
189 return new WixRunnerResult { ExitCode = exitCode.Result, Messages = messages.ToArray() };
190 }
191
192 private static void EnsureFixed(string targetFile)
193 {
194 var messaging2 = new MockMessaging();
195 var converter2 = new WixConverter(messaging2, 4);
196 var errors2 = converter2.ConvertFile(targetFile, true);
197 Assert.Equal(0, errors2);
198 }
199 }
200 }