From 08cdc6aa2b9dd0e273a3c3a22893616d26342a0e Mon Sep 17 00:00:00 2001 From: Ron Martin Date: Mon, 29 Aug 2022 18:38:07 -0400 Subject: Support add, modify and remove comments on user accounts Fixes 5371 --- src/test/burn/WixTestTools/MSIExec.cs | 2 +- src/test/burn/WixTestTools/UserVerifier.cs | 41 ++++- .../ProductA/ProductA.wixproj | 2 +- .../UtilExtensionUserTests/ProductA/product.wxs | 6 +- .../ProductAddCommentToExistingUser.wixproj | 13 ++ .../ProductAddCommentToExistingUser/product.wxs | 25 +++ .../ProductCommentDelete.wixproj | 13 ++ .../ProductCommentDelete/product.wxs | 18 ++ .../ProductCommentFail/ProductCommentFail.wixproj | 13 ++ .../ProductCommentFail/product_fail.wxs | 22 +++ .../ProductFail/product_fail.wxs | 2 +- .../ProductNewUserWithComment.wixproj | 13 ++ .../ProductNewUserWithComment/product.wxs | 25 +++ .../ProductWithCommandLineParameters.wixproj | 13 ++ .../ProductWithCommandLineParameters.wxs | 21 +++ .../UtilExtensionUserTests.cs | 186 +++++++++++++++++---- 16 files changed, 371 insertions(+), 44 deletions(-) create mode 100644 src/test/msi/TestData/UtilExtensionUserTests/ProductAddCommentToExistingUser/ProductAddCommentToExistingUser.wixproj create mode 100644 src/test/msi/TestData/UtilExtensionUserTests/ProductAddCommentToExistingUser/product.wxs create mode 100644 src/test/msi/TestData/UtilExtensionUserTests/ProductCommentDelete/ProductCommentDelete.wixproj create mode 100644 src/test/msi/TestData/UtilExtensionUserTests/ProductCommentDelete/product.wxs create mode 100644 src/test/msi/TestData/UtilExtensionUserTests/ProductCommentFail/ProductCommentFail.wixproj create mode 100644 src/test/msi/TestData/UtilExtensionUserTests/ProductCommentFail/product_fail.wxs create mode 100644 src/test/msi/TestData/UtilExtensionUserTests/ProductNewUserWithComment/ProductNewUserWithComment.wixproj create mode 100644 src/test/msi/TestData/UtilExtensionUserTests/ProductNewUserWithComment/product.wxs create mode 100644 src/test/msi/TestData/UtilExtensionUserTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wixproj create mode 100644 src/test/msi/TestData/UtilExtensionUserTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wxs (limited to 'src/test') diff --git a/src/test/burn/WixTestTools/MSIExec.cs b/src/test/burn/WixTestTools/MSIExec.cs index a905ec5a..fb161495 100644 --- a/src/test/burn/WixTestTools/MSIExec.cs +++ b/src/test/burn/WixTestTools/MSIExec.cs @@ -259,7 +259,7 @@ namespace WixTestTools arguments.Append(" /a "); break; case MSIExecMode.Repair: - arguments.Append(" /f "); + arguments.Append(" /fvomusa "); break; case MSIExecMode.Cleanup: case MSIExecMode.Uninstall: diff --git a/src/test/burn/WixTestTools/UserVerifier.cs b/src/test/burn/WixTestTools/UserVerifier.cs index b5218a79..51c6c31e 100644 --- a/src/test/burn/WixTestTools/UserVerifier.cs +++ b/src/test/burn/WixTestTools/UserVerifier.cs @@ -49,7 +49,7 @@ namespace WixTestTools UserPrincipal newUser = new UserPrincipal(new PrincipalContext(ContextType.Machine)); newUser.SetPassword(password); newUser.Name = userName; - newUser.Description = "New test User"; + newUser.Description = String.Empty; newUser.UserCannotChangePassword = true; newUser.PasswordNeverExpires = false; newUser.Save(); @@ -108,6 +108,24 @@ namespace WixTestTools user.Save(); } + /// + /// Sets the user comment for a given user + /// + /// domain name for the user, empty for local users + /// the user name + /// comment to be set for the user + public static void SetUserComment(string domainName, string userName, string comment) + { + UserPrincipal user = GetUser(domainName, userName); + + Assert.False(null == user, String.Format("User '{0}' was not found under domain '{1}'.", userName, domainName)); + + var directoryEntry = user.GetUnderlyingObject() as DirectoryEntry; + Assert.False(null == directoryEntry); + directoryEntry.Properties["Description"].Value = comment; + user.Save(); + } + /// /// Adds the specified user to the specified local group /// @@ -162,7 +180,24 @@ namespace WixTestTools } /// - /// Verify that a givin user is member of a local group + /// Verifies the user comment for a given user + /// + /// domain name for the user, empty for local users + /// the user name + /// the comment to be verified + public static void VerifyUserComment(string domainName, string userName, string comment) + { + UserPrincipal user = GetUser(domainName, userName); + + Assert.False(null == user, String.Format("User '{0}' was not found under domain '{1}'.", userName, domainName)); + + var directoryEntry = user.GetUnderlyingObject() as DirectoryEntry; + Assert.False(null == directoryEntry); + Assert.True(comment == (string)(directoryEntry.Properties["Description"].Value)); + } + + /// + /// Verify that a given user is member of a local group /// /// domain name for the user, empty for local users /// the user name @@ -322,7 +357,6 @@ namespace WixTestTools missedAGroup = true; message += String.Format("Local group '{0}' was not found. \r\n", groupName); } - } Assert.False(missedAGroup, message); } @@ -346,3 +380,4 @@ namespace WixTestTools } } } + diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductA/ProductA.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductA/ProductA.wixproj index fbc6f292..3895b853 100644 --- a/src/test/msi/TestData/UtilExtensionUserTests/ProductA/ProductA.wixproj +++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductA/ProductA.wixproj @@ -1,7 +1,7 @@ - {1A1795A6-87C0-4A9A-ABD5-DF9BED697037} + {A3E0B539-63F9-4B43-9E34-F33AE1C6E06D} true diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductA/product.wxs b/src/test/msi/TestData/UtilExtensionUserTests/ProductA/product.wxs index a7bec54e..be6e16a4 100644 --- a/src/test/msi/TestData/UtilExtensionUserTests/ProductA/product.wxs +++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductA/product.wxs @@ -15,10 +15,10 @@ - + - + @@ -27,7 +27,7 @@ - + diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductAddCommentToExistingUser/ProductAddCommentToExistingUser.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductAddCommentToExistingUser/ProductAddCommentToExistingUser.wixproj new file mode 100644 index 00000000..5938e525 --- /dev/null +++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductAddCommentToExistingUser/ProductAddCommentToExistingUser.wixproj @@ -0,0 +1,13 @@ + + + + {B33D3140-4AA5-469D-9DEE-AAF8F0C626DA} + true + + + + + + + + diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductAddCommentToExistingUser/product.wxs b/src/test/msi/TestData/UtilExtensionUserTests/ProductAddCommentToExistingUser/product.wxs new file mode 100644 index 00000000..ce8c4cae --- /dev/null +++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductAddCommentToExistingUser/product.wxs @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentDelete/ProductCommentDelete.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentDelete/ProductCommentDelete.wixproj new file mode 100644 index 00000000..63bb2370 --- /dev/null +++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentDelete/ProductCommentDelete.wixproj @@ -0,0 +1,13 @@ + + + + {9E4C301E-5F36-4A86-85BE-776E067D929D} + true + + + + + + + + diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentDelete/product.wxs b/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentDelete/product.wxs new file mode 100644 index 00000000..f0fbc55e --- /dev/null +++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentDelete/product.wxs @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentFail/ProductCommentFail.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentFail/ProductCommentFail.wixproj new file mode 100644 index 00000000..66f308ae --- /dev/null +++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentFail/ProductCommentFail.wixproj @@ -0,0 +1,13 @@ + + + + {85F698E0-F542-4CB4-80A1-6630D2DEB647} + true + + + + + + + + diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentFail/product_fail.wxs b/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentFail/product_fail.wxs new file mode 100644 index 00000000..f36d5bd5 --- /dev/null +++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductCommentFail/product_fail.wxs @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductFail/product_fail.wxs b/src/test/msi/TestData/UtilExtensionUserTests/ProductFail/product_fail.wxs index c5da862c..82472d4e 100644 --- a/src/test/msi/TestData/UtilExtensionUserTests/ProductFail/product_fail.wxs +++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductFail/product_fail.wxs @@ -31,7 +31,7 @@ - + diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductNewUserWithComment/ProductNewUserWithComment.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductNewUserWithComment/ProductNewUserWithComment.wixproj new file mode 100644 index 00000000..aeac903a --- /dev/null +++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductNewUserWithComment/ProductNewUserWithComment.wixproj @@ -0,0 +1,13 @@ + + + + {549E1829-BBDE-42E1-968A-BEB8FC12BFC7} + true + + + + + + + + diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductNewUserWithComment/product.wxs b/src/test/msi/TestData/UtilExtensionUserTests/ProductNewUserWithComment/product.wxs new file mode 100644 index 00000000..dde23aab --- /dev/null +++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductNewUserWithComment/product.wxs @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wixproj b/src/test/msi/TestData/UtilExtensionUserTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wixproj new file mode 100644 index 00000000..93a56216 --- /dev/null +++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wixproj @@ -0,0 +1,13 @@ + + + + {79F2CB65-1E71-42EB-AA30-51BD70C29B23} + true + + + + + + + + diff --git a/src/test/msi/TestData/UtilExtensionUserTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wxs b/src/test/msi/TestData/UtilExtensionUserTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wxs new file mode 100644 index 00000000..564ce4f0 --- /dev/null +++ b/src/test/msi/TestData/UtilExtensionUserTests/ProductWithCommandLineParameters/ProductWithCommandLineParameters.wxs @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/src/test/msi/WixToolsetTest.MsiE2E/UtilExtensionUserTests.cs b/src/test/msi/WixToolsetTest.MsiE2E/UtilExtensionUserTests.cs index fcdfde52..30bc53e8 100644 --- a/src/test/msi/WixToolsetTest.MsiE2E/UtilExtensionUserTests.cs +++ b/src/test/msi/WixToolsetTest.MsiE2E/UtilExtensionUserTests.cs @@ -11,21 +11,14 @@ namespace WixToolsetTest.MsiE2E { 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. [RuntimeFact] public void CanInstallAndUninstallUsers() { - var arguments = new string[] - { - $"TEMPDOMAIN={Environment.GetEnvironmentVariable(TempDomain)}", - $"TEMPUSERNAME={Environment.GetEnvironmentVariable(TempUsername)}", - }; + UserVerifier.CreateLocalUser("testName3", "test123!@#"); var productA = this.CreatePackageInstaller("ProductA"); - productA.InstallProduct(MSIExec.MSIExecReturnCode.SUCCESS, arguments); + productA.InstallProduct(MSIExec.MSIExecReturnCode.SUCCESS); // Validate New User Information. UserVerifier.VerifyUserInformation(String.Empty, "testName1", true, false, false); @@ -34,62 +27,90 @@ namespace WixToolsetTest.MsiE2E 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"); + UserVerifier.VerifyUserIsMemberOf("", "testName3", "Power Users"); - productA.UninstallProduct(MSIExec.MSIExecReturnCode.SUCCESS, arguments); + productA.UninstallProduct(MSIExec.MSIExecReturnCode.SUCCESS); // 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")); + // Verify that user added to power users group is removed on uninstall. + UserVerifier.VerifyUserIsNotMemberOf("", "testName3", "Power Users"); + // clean up + UserVerifier.DeleteLocalUser("testName1"); UserVerifier.DeleteLocalUser("testName2"); - - UserVerifier.VerifyUserIsNotMemberOf(Environment.GetEnvironmentVariable(TempDomain), Environment.GetEnvironmentVariable(TempUsername), "Power Users"); + UserVerifier.DeleteLocalUser("testName3"); } // Verify the rollback action reverts all Users changes. [RuntimeFact] public void CanRollbackUsers() { - var arguments = new string[] - { - $"TEMPDOMAIN={Environment.GetEnvironmentVariable(TempDomain)}", - $"TEMPUSERNAME={Environment.GetEnvironmentVariable(TempUsername)}", - }; + UserVerifier.CreateLocalUser("testName3", "test123!@#"); 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); + productFail.InstallProduct(MSIExec.MSIExecReturnCode.ERROR_INSTALL_FAILURE); - // Verify Users marked as RemoveOnUninstall were removed. + // Verify added Users were removed on rollback. 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 user added to power users group is removed from power users group on rollback. + UserVerifier.VerifyUserIsNotMemberOf("", "testName3", "Power Users"); + + // clean up + UserVerifier.DeleteLocalUser("testName1"); + UserVerifier.DeleteLocalUser("testName2"); + UserVerifier.DeleteLocalUser("testName3"); } - // Verify that the users specified in the authoring are created as expected on repair. - [RuntimeFact(Skip = "Test demonstrates failure")] - public void CanRepairUsers() + + // Verify that command-line parameters aer not blocked by repair switches. + // Original code signalled repair mode by using "-f ", which silently + // terminated the command-line parsing, ignoring any parameters that followed. + [RuntimeFact()] + public void CanRepairUsersWithCommandLineParameters() { var arguments = new string[] { - $"TEMPDOMAIN={Environment.GetEnvironmentVariable(TempDomain)}", - $"TEMPUSERNAME={Environment.GetEnvironmentVariable(TempUsername)}", + "TESTPARAMETER1=testName1", }; + var productWithCommandLineParameters = this.CreatePackageInstaller("ProductWithCommandLineParameters"); + + // Make sure that the user doesn't exist when we start the test. + UserVerifier.DeleteLocalUser("testName1"); + + // Install + productWithCommandLineParameters.InstallProduct(MSIExec.MSIExecReturnCode.SUCCESS, arguments); + + // Repair + productWithCommandLineParameters.RepairProduct(MSIExec.MSIExecReturnCode.SUCCESS, arguments); + + // Clean up + UserVerifier.DeleteLocalUser("testName1"); + } + + + // Verify that the users specified in the authoring are created as expected on repair. + [RuntimeFact()] + public void CanRepairUsers() + { + UserVerifier.CreateLocalUser("testName3", "test123!@#"); var productA = this.CreatePackageInstaller("ProductA"); - productA.InstallProduct(MSIExec.MSIExecReturnCode.SUCCESS, arguments); + productA.InstallProduct(MSIExec.MSIExecReturnCode.SUCCESS); + // Validate New User Information. UserVerifier.DeleteLocalUser("testName1"); UserVerifier.SetUserInformation(String.Empty, "testName2", true, false, false); - productA.RepairProduct(MSIExec.MSIExecReturnCode.SUCCESS, arguments); + productA.RepairProduct(MSIExec.MSIExecReturnCode.SUCCESS); // Validate New User Information. UserVerifier.VerifyUserInformation(String.Empty, "testName1", true, false, false); @@ -98,21 +119,24 @@ namespace WixToolsetTest.MsiE2E 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"); + UserVerifier.VerifyUserIsMemberOf("", "testName3", "Power Users"); - productA.UninstallProduct(MSIExec.MSIExecReturnCode.SUCCESS, arguments); + productA.UninstallProduct(MSIExec.MSIExecReturnCode.SUCCESS); // 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")); + // Verify that user added to power users group is removed on uninstall. + UserVerifier.VerifyUserIsNotMemberOf("", "testName3", "Power Users"); + // clean up + UserVerifier.DeleteLocalUser("testName1"); UserVerifier.DeleteLocalUser("testName2"); - - UserVerifier.VerifyUserIsNotMemberOf(Environment.GetEnvironmentVariable(TempDomain), Environment.GetEnvironmentVariable(TempUsername), "Power Users"); + UserVerifier.DeleteLocalUser("testName3"); } - // Verify that Installation fails if FailIfExisits is set. + // Verify that Installation fails if FailIfExists is set. [RuntimeFact] public void FailsIfUserExists() { @@ -135,7 +159,6 @@ namespace WixToolsetTest.MsiE2E // clean up UserVerifier.DeleteLocalUser("existinguser"); } - } // Verify that a user cannot be created on a domain on which you dont have create user permission. @@ -158,5 +181,98 @@ namespace WixToolsetTest.MsiE2E productNonVitalGroup.InstallProduct(); } + + // Verify that a user can be created with a user comment + [RuntimeFact] + public void CanCreateNewUserWithComment() + { + var productNewUserWithComment = this.CreatePackageInstaller("ProductNewUserWithComment"); + + productNewUserWithComment.InstallProduct(); + UserVerifier.VerifyUserComment(String.Empty, "testName1", "testComment1"); + + // clean up + UserVerifier.DeleteLocalUser("testName1"); + } + + // Verify that a comment can be added to an existing user + [RuntimeFact] + public void CanAddCommentToExistingUser() + { + UserVerifier.CreateLocalUser("testName1", "test123!@#"); + var productAddCommentToExistingUser = this.CreatePackageInstaller("ProductAddCommentToExistingUser"); + + productAddCommentToExistingUser.InstallProduct(); + + UserVerifier.VerifyUserComment(String.Empty, "testName1", "testComment1"); + + // clean up + UserVerifier.DeleteLocalUser("testName1"); + } + + // Verify that a comment can be repaired for a new user + [RuntimeFact] + public void CanRepairCommentOfNewUser() + { + var productNewUserWithComment = this.CreatePackageInstaller("ProductNewUserWithComment"); + + productNewUserWithComment.InstallProduct(); + UserVerifier.SetUserComment(String.Empty, "testName1", ""); + + productNewUserWithComment.RepairProduct(); + UserVerifier.VerifyUserComment(String.Empty, "testName1", "testComment1"); + + // clean up + UserVerifier.DeleteLocalUser("testName1"); + } + + // Verify that a comment can be changed for an existing user + [RuntimeFact] + public void CanChangeCommentOfExistingUser() + { + UserVerifier.CreateLocalUser("testName1", "test123!@#"); + UserVerifier.SetUserComment(String.Empty, "testName1", "initialTestComment1"); + var productNewUserWithComment = this.CreatePackageInstaller("ProductNewUserWithComment"); + + productNewUserWithComment.InstallProduct(); + UserVerifier.VerifyUserComment(String.Empty, "testName1", "testComment1"); + + // clean up + UserVerifier.DeleteLocalUser("testName1"); + } + + // Verify that a comment can be rolled back for an existing user + [RuntimeFact] + public void CanRollbackCommentOfExistingUser() + { + UserVerifier.CreateLocalUser("testName1", "test123!@#"); + UserVerifier.SetUserComment(String.Empty, "testName1", "initialTestComment1"); + var productCommentFail = this.CreatePackageInstaller("ProductCommentFail"); + + productCommentFail.InstallProduct(MSIExec.MSIExecReturnCode.ERROR_INSTALL_FAILURE); + + // Verify that comment change was rolled back. + UserVerifier.VerifyUserComment(String.Empty, "testName1", "initialTestComment1"); + + // clean up + UserVerifier.DeleteLocalUser("testName1"); + } + + // Verify that a comment can be deleted for an existing user + [RuntimeFact] + public void CanDeleteCommentOfExistingUser() + { + UserVerifier.CreateLocalUser("testName1", "test123!@#"); + UserVerifier.SetUserComment(String.Empty, "testName1", "testComment1"); + var productCommentDelete = this.CreatePackageInstaller("ProductCommentDelete"); + + productCommentDelete.InstallProduct(MSIExec.MSIExecReturnCode.SUCCESS); + + // Verify that comment was removed. + UserVerifier.VerifyUserComment(String.Empty, "testName1", ""); + + // clean up + UserVerifier.DeleteLocalUser("testName1"); + } } } -- cgit v1.2.3-55-g6feb