summaryrefslogtreecommitdiff
path: root/src/test/msi/WixToolsetTest.MsiE2E/UtilExtensionUserTests.cs
blob: 21491858b7f964b70fbb32983bab040ae90df945 (plain)
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
// 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.

namespace WixToolsetTest.MsiE2E
{
    using System;
    using WixTestTools;
    using Xunit;
    using Xunit.Abstractions;

    public class UtilExtensionUserTests : MsiE2ETests
    {
        public UtilExtensionUserTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { }

        const string TempDomain = "USERDOMAIN";
        const string TempUsername = "USERNAME";

        // Verify that the users specified in the authoring are created as expected.
        [Fact]
        public void CanInstallAndUninstallUsers()
        {
            var arguments = new string[]
            {
                $"TEMPDOMAIN={Environment.GetEnvironmentVariable(TempDomain)}",
                $"TEMPUSERNAME={Environment.GetEnvironmentVariable(TempUsername)}",
            };
            var productA = this.CreatePackageInstaller("ProductA");

            productA.InstallProduct(MSIExec.MSIExecReturnCode.SUCCESS, arguments);

            // Validate New User Information.
            UserVerifier.VerifyUserInformation(String.Empty, "testName1", true, false, false);
            UserVerifier.VerifyUserIsMemberOf(String.Empty, "testName1", "Administrators", "Power Users");

            UserVerifier.VerifyUserInformation(String.Empty, "testName2", true, true, true);
            UserVerifier.VerifyUserIsMemberOf(String.Empty, "testName2", "Power Users");

            UserVerifier.VerifyUserIsMemberOf(Environment.GetEnvironmentVariable(TempDomain), Environment.GetEnvironmentVariable(TempUsername), "Power Users");

            productA.UninstallProduct(MSIExec.MSIExecReturnCode.SUCCESS, arguments);

            // Verify Users marked as RemoveOnUninstall were removed.
            Assert.False(UserVerifier.UserExists(String.Empty, "testName1"), String.Format("User '{0}' was not removed on Uninstall", "testName1"));
            Assert.True(UserVerifier.UserExists(String.Empty, "testName2"), String.Format("User '{0}' was removed on Uninstall", "testName2"));

            // clean up
            UserVerifier.DeleteLocalUser("testName2");

            UserVerifier.VerifyUserIsNotMemberOf(Environment.GetEnvironmentVariable(TempDomain), Environment.GetEnvironmentVariable(TempUsername), "Power Users");
        }

        // Verify the rollback action reverts all Users changes.
        [Fact]
        public void CanRollbackUsers()
        {
            var arguments = new string[]
            {
                $"TEMPDOMAIN={Environment.GetEnvironmentVariable(TempDomain)}",
                $"TEMPUSERNAME={Environment.GetEnvironmentVariable(TempUsername)}",
            };
            var productFail = this.CreatePackageInstaller("ProductFail");

            // make sure the user accounts are deleted before we start
            UserVerifier.DeleteLocalUser("testName1");
            UserVerifier.DeleteLocalUser("testName2");
            UserVerifier.VerifyUserIsNotMemberOf(Environment.GetEnvironmentVariable(TempDomain), Environment.GetEnvironmentVariable(TempUsername), "Power Users");

            productFail.InstallProduct(MSIExec.MSIExecReturnCode.ERROR_INSTALL_FAILURE, arguments);

            // Verify Users marked as RemoveOnUninstall were removed.
            Assert.False(UserVerifier.UserExists(String.Empty, "testName1"), String.Format("User '{0}' was not removed on Rollback", "testName1"));
            Assert.False(UserVerifier.UserExists(String.Empty, "testName2"), String.Format("User '{0}' was not removed on Rollback", "testName2"));

            UserVerifier.VerifyUserIsNotMemberOf(Environment.GetEnvironmentVariable(TempDomain), Environment.GetEnvironmentVariable(TempUsername), "Power Users");
        }

        // Verify that the users specified in the authoring are created as expected on repair.
        [Fact(Skip = "Test demonstrates failure")]
        public void CanRepairUsers()
        {
            var arguments = new string[]
            {
                $"TEMPDOMAIN={Environment.GetEnvironmentVariable(TempDomain)}",
                $"TEMPUSERNAME={Environment.GetEnvironmentVariable(TempUsername)}",
            };
            var productA = this.CreatePackageInstaller("ProductA");

            productA.InstallProduct(MSIExec.MSIExecReturnCode.SUCCESS, arguments);

            UserVerifier.DeleteLocalUser("testName1");
            UserVerifier.SetUserInformation(String.Empty, "testName2", true, false, false);

            productA.RepairProduct(MSIExec.MSIExecReturnCode.SUCCESS, arguments);

            // Validate New User Information.
            UserVerifier.VerifyUserInformation(String.Empty, "testName1", true, false, false);
            UserVerifier.VerifyUserIsMemberOf(String.Empty, "testName1", "Administrators", "Power Users");

            UserVerifier.VerifyUserInformation(String.Empty, "testName2", true, true, true);
            UserVerifier.VerifyUserIsMemberOf(String.Empty, "testName2", "Power Users");

            UserVerifier.VerifyUserIsMemberOf(Environment.GetEnvironmentVariable(TempDomain), Environment.GetEnvironmentVariable(TempUsername), "Power Users");

            productA.UninstallProduct(MSIExec.MSIExecReturnCode.SUCCESS, arguments);

            // Verify Users marked as RemoveOnUninstall were removed.
            Assert.False(UserVerifier.UserExists(String.Empty, "testName1"), String.Format("User '{0}' was not removed on Uninstall", "testName1"));
            Assert.True(UserVerifier.UserExists(String.Empty, "testName2"), String.Format("User '{0}' was removed on Uninstall", "testName2"));

            // clean up
            UserVerifier.DeleteLocalUser("testName2");

            UserVerifier.VerifyUserIsNotMemberOf(Environment.GetEnvironmentVariable(TempDomain), Environment.GetEnvironmentVariable(TempUsername), "Power Users");
        }

        // Verify that Installation fails if FailIfExisits is set.
        [Fact]
        public void FailsIfUserExists()
        {
            var productFailIfExists = this.CreatePackageInstaller("ProductFailIfExists");

            // Create 'existinguser'
            UserVerifier.CreateLocalUser("existinguser", "test123!@#");

            try
            {
                productFailIfExists.InstallProduct(MSIExec.MSIExecReturnCode.ERROR_INSTALL_FAILURE);

                // Verify User still exists.
                bool userExists = UserVerifier.UserExists(String.Empty, "existinguser");

                Assert.True(userExists, String.Format("User '{0}' was removed on Rollback", "existinguser"));
            }
            finally
            {
                // clean up
                UserVerifier.DeleteLocalUser("existinguser");
            }

        }

        // Verify that a user cannot be created on a domain on which you dont have create user permission.
        [Fact]
        public void FailsIfRestrictedDomain()
        {
            var productRestrictedDomain = this.CreatePackageInstaller("ProductRestrictedDomain");

            string logFile = productRestrictedDomain.InstallProduct(MSIExec.MSIExecReturnCode.ERROR_INSTALL_FAILURE, "TEMPDOMAIN=DOESNOTEXIST");

            // Verify expected error message in the log file
            Assert.True(LogVerifier.MessageInLogFile(logFile, "ConfigureUsers:  Failed to check existence of domain: DOESNOTEXIST, user: testName1 (error code 0x800706ba) - continuing"));
        }

        // Verify that adding a user to a non-existent group does not fail the install when non-vital.
        [Fact]
        public void IgnoresMissingGroupWhenNonVital()
        {
            var productNonVitalGroup = this.CreatePackageInstaller("ProductNonVitalUserGroup");

            productNonVitalGroup.InstallProduct();
        }
    }
}