aboutsummaryrefslogtreecommitdiff
path: root/src/WixTestTools/PackageInstaller.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/WixTestTools/PackageInstaller.cs')
-rw-r--r--src/WixTestTools/PackageInstaller.cs90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/WixTestTools/PackageInstaller.cs b/src/WixTestTools/PackageInstaller.cs
new file mode 100644
index 00000000..86376b9f
--- /dev/null
+++ b/src/WixTestTools/PackageInstaller.cs
@@ -0,0 +1,90 @@
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
3namespace WixTestTools
4{
5 using System;
6 using System.IO;
7 using static WixTestTools.MSIExec;
8
9 public partial class PackageInstaller : IDisposable
10 {
11 public PackageInstaller(WixTestContext testContext, string filename)
12 {
13 this.Package = Path.Combine(testContext.TestDataFolder, $"{filename}.msi");
14 this.PackagePdb = Path.Combine(testContext.TestDataFolder, $"{filename}.wixpdb");
15 this.TestContext = testContext;
16 }
17
18 public string Package { get; }
19
20 private WixTestContext TestContext { get; }
21
22 public string TestGroupName => this.TestContext.TestGroupName;
23
24 public string TestName => this.TestContext.TestName;
25
26 /// <summary>
27 /// Installs a .msi file
28 /// </summary>
29 /// <param name="expectedExitCode">Expected exit code</param>
30 /// <param name="otherArguments">Other arguments to pass to MSIExec.</param>
31 /// <returns>MSIExec log File</returns>
32 public string InstallProduct(MSIExecReturnCode expectedExitCode = MSIExecReturnCode.SUCCESS, params string[] otherArguments)
33 {
34 return this.RunMSIExec(MSIExecMode.Install, otherArguments, expectedExitCode);
35 }
36
37 /// <summary>
38 /// Uninstalls a .msi file
39 /// </summary>
40 /// <param name="expectedExitCode">Expected exit code</param>
41 /// <param name="otherArguments">Other arguments to pass to MSIExec.</param>
42 /// <returns>MSIExec log File</returns>
43 public string UninstallProduct(MSIExecReturnCode expectedExitCode = MSIExecReturnCode.SUCCESS, params string[] otherArguments)
44 {
45 return this.RunMSIExec(MSIExecMode.Uninstall, otherArguments, expectedExitCode);
46 }
47
48 /// <summary>
49 /// Repairs a .msi file
50 /// </summary>
51 /// <param name="expectedExitCode">Expected exit code</param>
52 /// <param name="otherArguments">Other arguments to pass to msiexe.exe.</param>
53 /// <returns>MSIExec log File</returns>
54 public string RepairProduct(MSIExecReturnCode expectedExitCode = MSIExecReturnCode.SUCCESS, params string[] otherArguments)
55 {
56 return this.RunMSIExec(MSIExecMode.Repair, otherArguments, expectedExitCode);
57 }
58
59 /// <summary>
60 /// Executes MSIExec on a .msi file
61 /// </summary>
62 /// <param name="mode">Mode of execution for MSIExec</param>
63 /// <param name="otherArguments">Other arguments to pass to MSIExec.</param>
64 /// <param name="expectedExitCode">Expected exit code</param>
65 /// <returns>MSIExec exit code</returns>
66 private string RunMSIExec(MSIExecMode mode, string[] otherArguments, MSIExecReturnCode expectedExitCode, bool assertOnError = true)
67 {
68 // Generate the log file name.
69 var logFile = Path.Combine(Path.GetTempPath(), String.Format("{0}_{1}_{2:yyyyMMddhhmmss}_{4}_{3}.log", this.TestGroupName, this.TestName, DateTime.UtcNow, Path.GetFileNameWithoutExtension(this.Package), mode));
70
71 var msiexec = new MSIExec
72 {
73 Product = this.Package,
74 ExecutionMode = mode,
75 OtherArguments = null != otherArguments ? String.Join(" ", otherArguments) : null,
76 ExpectedExitCode = expectedExitCode,
77 LogFile = logFile,
78 };
79
80 msiexec.Run(assertOnError);
81 return msiexec.LogFile;
82 }
83
84 public void Dispose()
85 {
86 string[] args = { "IGNOREDEPENDENCIES=ALL", "WIXFAILWHENDEFERRED=0" };
87 this.RunMSIExec(MSIExecMode.Cleanup, args, MSIExecReturnCode.SUCCESS, assertOnError: false);
88 }
89 }
90}