From 3221757bb210b23e4c8d859d20aa20b43c0df582 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Sun, 28 Mar 2021 14:51:21 -0500 Subject: Port the update bundle tests from old repo. --- src/TestBA/TestBA.cs | 11 +- src/TestData/Templates/PackagePerUser.wxs | 3 +- .../UpdateBundleTests/BundleAv1/BundleA.props | 10 + .../UpdateBundleTests/BundleAv1/BundleAv1.wixproj | 12 + .../UpdateBundleTests/BundleAv1/BundleAv1.wxs | 10 + .../UpdateBundleTests/BundleAv2/BundleAv2.wixproj | 15 ++ .../UpdateBundleTests/BundleAv2/BundleAv2.wxs | 10 + .../UpdateBundleTests/BundleBv1/Bundle.wxs | 42 ++++ .../UpdateBundleTests/BundleBv1/BundleB.props | 7 + .../UpdateBundleTests/BundleBv1/BundleBv1.wixproj | 18 ++ .../UpdateBundleTests/BundleBv1/BundleBv1.wxs | 10 + .../UpdateBundleTests/BundleBv1/FeedBv1.0.xml | 32 +++ .../UpdateBundleTests/BundleBv1/FeedBv2.0.xml | 51 +++++ .../UpdateBundleTests/BundleBv2/BundleBv2.wixproj | 18 ++ .../UpdateBundleTests/BundleBv2/BundleBv2.wxs | 10 + .../UpdateBundleTests/PackageAv1/PackageA.props | 9 + .../PackageAv1/PackageAv1.wixproj | 4 + .../PackageAv2/PackageAv2.wixproj | 7 + .../UpdateBundleTests/PackageBv1/PackageB.props | 9 + .../PackageBv1/PackageBv1.wixproj | 4 + .../PackageBv2/PackageBv2.wixproj | 7 + src/Wix.Build.targets | 3 +- src/WixToolsetTest.BurnE2E/BurnE2ETests.cs | 7 + src/WixToolsetTest.BurnE2E/IWebServer.cs | 20 ++ src/WixToolsetTest.BurnE2E/TestBAController.cs | 6 + src/WixToolsetTest.BurnE2E/UpdateBundleTests.cs | 245 +++++++++++++++++++++ .../WebServer/CoreOwinWebServer.cs | 69 ++++++ .../WixToolsetTest.BurnE2E.csproj | 3 +- 28 files changed, 640 insertions(+), 12 deletions(-) create mode 100644 src/TestData/UpdateBundleTests/BundleAv1/BundleA.props create mode 100644 src/TestData/UpdateBundleTests/BundleAv1/BundleAv1.wixproj create mode 100644 src/TestData/UpdateBundleTests/BundleAv1/BundleAv1.wxs create mode 100644 src/TestData/UpdateBundleTests/BundleAv2/BundleAv2.wixproj create mode 100644 src/TestData/UpdateBundleTests/BundleAv2/BundleAv2.wxs create mode 100644 src/TestData/UpdateBundleTests/BundleBv1/Bundle.wxs create mode 100644 src/TestData/UpdateBundleTests/BundleBv1/BundleB.props create mode 100644 src/TestData/UpdateBundleTests/BundleBv1/BundleBv1.wixproj create mode 100644 src/TestData/UpdateBundleTests/BundleBv1/BundleBv1.wxs create mode 100644 src/TestData/UpdateBundleTests/BundleBv1/FeedBv1.0.xml create mode 100644 src/TestData/UpdateBundleTests/BundleBv1/FeedBv2.0.xml create mode 100644 src/TestData/UpdateBundleTests/BundleBv2/BundleBv2.wixproj create mode 100644 src/TestData/UpdateBundleTests/BundleBv2/BundleBv2.wxs create mode 100644 src/TestData/UpdateBundleTests/PackageAv1/PackageA.props create mode 100644 src/TestData/UpdateBundleTests/PackageAv1/PackageAv1.wixproj create mode 100644 src/TestData/UpdateBundleTests/PackageAv2/PackageAv2.wixproj create mode 100644 src/TestData/UpdateBundleTests/PackageBv1/PackageB.props create mode 100644 src/TestData/UpdateBundleTests/PackageBv1/PackageBv1.wixproj create mode 100644 src/TestData/UpdateBundleTests/PackageBv2/PackageBv2.wixproj create mode 100644 src/WixToolsetTest.BurnE2E/IWebServer.cs create mode 100644 src/WixToolsetTest.BurnE2E/UpdateBundleTests.cs create mode 100644 src/WixToolsetTest.BurnE2E/WebServer/CoreOwinWebServer.cs diff --git a/src/TestBA/TestBA.cs b/src/TestBA/TestBA.cs index f86a5807..18b1fd0c 100644 --- a/src/TestBA/TestBA.cs +++ b/src/TestBA/TestBA.cs @@ -178,20 +178,15 @@ namespace WixToolset.Test.BA { // The list of updates is sorted in descending version, so the first callback should be the largest update available. // This update should be either larger than ours (so we are out of date), the same as ours (so we are current) - // or smaller than ours (we have a private build). If we really wanted to, we could leave the e.StopProcessingUpdates alone and - // enumerate all of the updates. + // or smaller than ours (we have a private build). + // Enumerate all of the updates anyway in case something's broken. this.Log(String.Format("Potential update v{0} from '{1}'; current version: v{2}", e.Version, e.UpdateLocation, this.Version)); - if (this.Engine.CompareVersions(e.Version, this.Version) > 0) + if (!this.UpdateAvailable && this.Engine.CompareVersions(e.Version, this.Version) > 0) { this.Log(String.Format("Selected update v{0}", e.Version)); this.Engine.SetUpdate(null, e.UpdateLocation, e.Size, UpdateHashType.None, null); this.UpdateAvailable = true; } - else - { - this.UpdateAvailable = false; - } - e.StopProcessingUpdates = true; } protected override void OnDetectUpdateComplete(DetectUpdateCompleteEventArgs e) diff --git a/src/TestData/Templates/PackagePerUser.wxs b/src/TestData/Templates/PackagePerUser.wxs index e985966c..25133fb4 100644 --- a/src/TestData/Templates/PackagePerUser.wxs +++ b/src/TestData/Templates/PackagePerUser.wxs @@ -36,8 +36,7 @@ - - + diff --git a/src/TestData/UpdateBundleTests/BundleAv1/BundleA.props b/src/TestData/UpdateBundleTests/BundleAv1/BundleA.props new file mode 100644 index 00000000..19b37770 --- /dev/null +++ b/src/TestData/UpdateBundleTests/BundleAv1/BundleA.props @@ -0,0 +1,10 @@ + + + + Bundle + {AF745E41-CEAC-4C9F-83D8-663BAB1AF5CC} + + + + + diff --git a/src/TestData/UpdateBundleTests/BundleAv1/BundleAv1.wixproj b/src/TestData/UpdateBundleTests/BundleAv1/BundleAv1.wixproj new file mode 100644 index 00000000..69d0408f --- /dev/null +++ b/src/TestData/UpdateBundleTests/BundleAv1/BundleAv1.wixproj @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TestData/UpdateBundleTests/BundleAv1/BundleAv1.wxs b/src/TestData/UpdateBundleTests/BundleAv1/BundleAv1.wxs new file mode 100644 index 00000000..7bf16212 --- /dev/null +++ b/src/TestData/UpdateBundleTests/BundleAv1/BundleAv1.wxs @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/TestData/UpdateBundleTests/BundleAv2/BundleAv2.wixproj b/src/TestData/UpdateBundleTests/BundleAv2/BundleAv2.wixproj new file mode 100644 index 00000000..78e773db --- /dev/null +++ b/src/TestData/UpdateBundleTests/BundleAv2/BundleAv2.wixproj @@ -0,0 +1,15 @@ + + + + + 2.0.0.0 + + + + + + + + + + \ No newline at end of file diff --git a/src/TestData/UpdateBundleTests/BundleAv2/BundleAv2.wxs b/src/TestData/UpdateBundleTests/BundleAv2/BundleAv2.wxs new file mode 100644 index 00000000..5cbee5a8 --- /dev/null +++ b/src/TestData/UpdateBundleTests/BundleAv2/BundleAv2.wxs @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/TestData/UpdateBundleTests/BundleBv1/Bundle.wxs b/src/TestData/UpdateBundleTests/BundleBv1/Bundle.wxs new file mode 100644 index 00000000..906121f4 --- /dev/null +++ b/src/TestData/UpdateBundleTests/BundleBv1/Bundle.wxs @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/TestData/UpdateBundleTests/BundleBv1/BundleB.props b/src/TestData/UpdateBundleTests/BundleBv1/BundleB.props new file mode 100644 index 00000000..8a275612 --- /dev/null +++ b/src/TestData/UpdateBundleTests/BundleBv1/BundleB.props @@ -0,0 +1,7 @@ + + + + Bundle + {BF325BA5-5012-47C7-828C-577B6979CB28} + + diff --git a/src/TestData/UpdateBundleTests/BundleBv1/BundleBv1.wixproj b/src/TestData/UpdateBundleTests/BundleBv1/BundleBv1.wixproj new file mode 100644 index 00000000..ca40fbdd --- /dev/null +++ b/src/TestData/UpdateBundleTests/BundleBv1/BundleBv1.wixproj @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TestData/UpdateBundleTests/BundleBv1/BundleBv1.wxs b/src/TestData/UpdateBundleTests/BundleBv1/BundleBv1.wxs new file mode 100644 index 00000000..00d927ec --- /dev/null +++ b/src/TestData/UpdateBundleTests/BundleBv1/BundleBv1.wxs @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/TestData/UpdateBundleTests/BundleBv1/FeedBv1.0.xml b/src/TestData/UpdateBundleTests/BundleBv1/FeedBv1.0.xml new file mode 100644 index 00000000..743548be --- /dev/null +++ b/src/TestData/UpdateBundleTests/BundleBv1/FeedBv1.0.xml @@ -0,0 +1,32 @@ + + + + + + BundleB v1.0 + Bundle Subtitle. + 1116353B-7C6E-4C29-BFA1-D4A972CD421D + 2014-07-14T12:39:00.000Z + http://localhost:9999/e2e/BundleB/feed + + manual build + + Bundle v1.0 + v1.0 + + Bundle_Author + http://mycompany.com/software + Bundle_Author@mycompany.com + + + + + <p>Change list:</p><ul> + <li>Initial release.</li> + </ul> + + + 1.0.0.0 + 2014-07-14T12:39:00.000Z + + diff --git a/src/TestData/UpdateBundleTests/BundleBv1/FeedBv2.0.xml b/src/TestData/UpdateBundleTests/BundleBv1/FeedBv2.0.xml new file mode 100644 index 00000000..c8e3f6ea --- /dev/null +++ b/src/TestData/UpdateBundleTests/BundleBv1/FeedBv2.0.xml @@ -0,0 +1,51 @@ + + + + + + BundleB v2.0 + Bundle Subtitle. + 1116353B-7C6E-4C29-BFA1-D4A972CD421D + 2014-07-14T12:39:00.000Z + http://localhost:9999/e2e/BundleB/feed + + manual build + + Bundle v2.0 + v2.0 + + Bundle_Author + http://mycompany.com/software + Bundle_Author@mycompany.com + + + + + <p>Change list:</p><ul> + <li>Updated release.</li> + </ul> + + + 2.0.0.0 + 2014-11-10T12:39:00.000Z + + + Bundle v1.0 + v1.0 + + Bundle_Author + http://mycompany.com/software + Bundle_Author@mycompany.com + + + + + <p>Change list:</p><ul> + <li>Initial release.</li> + </ul> + + + 1.0.0.0 + 2014-11-09T12:39:00.000Z + + diff --git a/src/TestData/UpdateBundleTests/BundleBv2/BundleBv2.wixproj b/src/TestData/UpdateBundleTests/BundleBv2/BundleBv2.wixproj new file mode 100644 index 00000000..cc2aec76 --- /dev/null +++ b/src/TestData/UpdateBundleTests/BundleBv2/BundleBv2.wixproj @@ -0,0 +1,18 @@ + + + + + 2.0.0.0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TestData/UpdateBundleTests/BundleBv2/BundleBv2.wxs b/src/TestData/UpdateBundleTests/BundleBv2/BundleBv2.wxs new file mode 100644 index 00000000..2043b084 --- /dev/null +++ b/src/TestData/UpdateBundleTests/BundleBv2/BundleBv2.wxs @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/TestData/UpdateBundleTests/PackageAv1/PackageA.props b/src/TestData/UpdateBundleTests/PackageAv1/PackageA.props new file mode 100644 index 00000000..bc734540 --- /dev/null +++ b/src/TestData/UpdateBundleTests/PackageAv1/PackageA.props @@ -0,0 +1,9 @@ + + + + {AB55C215-3268-4005-9657-6B0567F0A4B1} + + + + + \ No newline at end of file diff --git a/src/TestData/UpdateBundleTests/PackageAv1/PackageAv1.wixproj b/src/TestData/UpdateBundleTests/PackageAv1/PackageAv1.wixproj new file mode 100644 index 00000000..45d3b2c8 --- /dev/null +++ b/src/TestData/UpdateBundleTests/PackageAv1/PackageAv1.wixproj @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/TestData/UpdateBundleTests/PackageAv2/PackageAv2.wixproj b/src/TestData/UpdateBundleTests/PackageAv2/PackageAv2.wixproj new file mode 100644 index 00000000..b419f663 --- /dev/null +++ b/src/TestData/UpdateBundleTests/PackageAv2/PackageAv2.wixproj @@ -0,0 +1,7 @@ + + + + + 2.0.0.0 + + \ No newline at end of file diff --git a/src/TestData/UpdateBundleTests/PackageBv1/PackageB.props b/src/TestData/UpdateBundleTests/PackageBv1/PackageB.props new file mode 100644 index 00000000..e677cb7e --- /dev/null +++ b/src/TestData/UpdateBundleTests/PackageBv1/PackageB.props @@ -0,0 +1,9 @@ + + + + {6B971C9E-2FB0-4BF7-8D77-D2DF71FD9A14} + + + + + \ No newline at end of file diff --git a/src/TestData/UpdateBundleTests/PackageBv1/PackageBv1.wixproj b/src/TestData/UpdateBundleTests/PackageBv1/PackageBv1.wixproj new file mode 100644 index 00000000..7b6f83a3 --- /dev/null +++ b/src/TestData/UpdateBundleTests/PackageBv1/PackageBv1.wixproj @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/TestData/UpdateBundleTests/PackageBv2/PackageBv2.wixproj b/src/TestData/UpdateBundleTests/PackageBv2/PackageBv2.wixproj new file mode 100644 index 00000000..126d0f53 --- /dev/null +++ b/src/TestData/UpdateBundleTests/PackageBv2/PackageBv2.wixproj @@ -0,0 +1,7 @@ + + + + + 2.0.0.0 + + \ No newline at end of file diff --git a/src/Wix.Build.targets b/src/Wix.Build.targets index 20a9bf66..17a46e2a 100644 --- a/src/Wix.Build.targets +++ b/src/Wix.Build.targets @@ -4,7 +4,8 @@ $(MSBuildProjectName) $(MSBuildProjectName) - TestGroupName=$(TestGroupName);PackageName=$(PackageName);BundleName=$(BundleName);$(DefineConstants) + http://localhost:9999/e2e/ + TestGroupName=$(TestGroupName);PackageName=$(PackageName);BundleName=$(BundleName);WebServerBaseUrl=$(WebServerBaseUrl);$(DefineConstants) BA=$(BA);$(DefineConstants) CabPrefix=$(CabPrefix);$(DefineConstants) SoftwareTag=1;$(DefineConstants) diff --git a/src/WixToolsetTest.BurnE2E/BurnE2ETests.cs b/src/WixToolsetTest.BurnE2E/BurnE2ETests.cs index c9294f73..392b675d 100644 --- a/src/WixToolsetTest.BurnE2E/BurnE2ETests.cs +++ b/src/WixToolsetTest.BurnE2E/BurnE2ETests.cs @@ -36,6 +36,13 @@ namespace WixToolsetTest.BurnE2E return controller; } + protected IWebServer CreateWebServer() + { + var webServer = new CoreOwinWebServer(); + this.Installers.Push(webServer); + return webServer; + } + public void Dispose() { while (this.Installers.TryPop(out var installer)) diff --git a/src/WixToolsetTest.BurnE2E/IWebServer.cs b/src/WixToolsetTest.BurnE2E/IWebServer.cs new file mode 100644 index 00000000..3bb8a23e --- /dev/null +++ b/src/WixToolsetTest.BurnE2E/IWebServer.cs @@ -0,0 +1,20 @@ +// 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.BurnE2E +{ + using System; + using System.Collections.Generic; + + public interface IWebServer : IDisposable + { + /// + /// Registers a collection of relative URLs (the key) with its absolute path to the file (the value). + /// + void AddFiles(Dictionary physicalPathsByRelativeUrl); + + /// + /// Starts the web server on a new thread. + /// + void Start(); + } +} \ No newline at end of file diff --git a/src/WixToolsetTest.BurnE2E/TestBAController.cs b/src/WixToolsetTest.BurnE2E/TestBAController.cs index 8e3053b3..103b603b 100644 --- a/src/WixToolsetTest.BurnE2E/TestBAController.cs +++ b/src/WixToolsetTest.BurnE2E/TestBAController.cs @@ -155,6 +155,12 @@ namespace WixToolsetTest.BurnE2E Registry.LocalMachine.DeleteSubKey(key); } + public void SetVerifyArguments(string verifyArguments) + { + this.SetBurnTestValue("VerifyArguments", verifyArguments); + + } + private void SetPackageState(string packageId, string name, string value) { var key = String.Format(@"{0}\{1}", this.TestBaseRegKeyPath, packageId ?? String.Empty); diff --git a/src/WixToolsetTest.BurnE2E/UpdateBundleTests.cs b/src/WixToolsetTest.BurnE2E/UpdateBundleTests.cs new file mode 100644 index 00000000..9fcd428b --- /dev/null +++ b/src/WixToolsetTest.BurnE2E/UpdateBundleTests.cs @@ -0,0 +1,245 @@ +// 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.BurnE2E +{ + using System; + using System.Collections.Generic; + using System.Diagnostics; + using System.IO; + using Xunit; + using Xunit.Abstractions; + + public class UpdateBundleTests : BurnE2ETests + { + public UpdateBundleTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { } + + [Fact] + public void CanLaunchUpdateBundleFromLocalSourceInsteadOfInstall() + { + var packageAv1 = this.CreatePackageInstaller("PackageAv1"); + var packageAv2 = this.CreatePackageInstaller("PackageAv2"); + var bundleAv1 = this.CreateBundleInstaller("BundleAv1"); + var bundleAv2 = this.CreateBundleInstaller("BundleAv2"); + + var updateBundleSwitch = String.Concat("\"", "-updatebundle:", bundleAv2.Bundle, "\""); + + packageAv1.VerifyInstalled(false); + packageAv2.VerifyInstalled(false); + + // Install the v2 bundle by getting v1 to launch it as an update bundle. + bundleAv1.Install(arguments: updateBundleSwitch); + bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache(); + bundleAv2.VerifyRegisteredAndInPackageCache(); + + packageAv1.VerifyInstalled(false); + packageAv2.VerifyInstalled(true); + + bundleAv2.Uninstall(); + bundleAv2.VerifyUnregisteredAndRemovedFromPackageCache(); + packageAv2.VerifyInstalled(false); + } + + [Fact] + public void CanLaunchUpdateBundleFromLocalSourceInsteadOfModify() + { + var packageAv1 = this.CreatePackageInstaller("PackageAv1"); + var packageAv2 = this.CreatePackageInstaller("PackageAv2"); + var bundleAv1 = this.CreateBundleInstaller("BundleAv1"); + var bundleAv2 = this.CreateBundleInstaller("BundleAv2"); + + var updateBundleSwitch = String.Concat("\"", "-updatebundle:", bundleAv2.Bundle, "\""); + + packageAv1.VerifyInstalled(false); + packageAv2.VerifyInstalled(false); + + bundleAv1.Install(); + bundleAv1.VerifyRegisteredAndInPackageCache(); + + packageAv1.VerifyInstalled(true); + packageAv2.VerifyInstalled(false); + + // Install the v2 bundle by getting v1 to launch it as an update bundle. + bundleAv1.Modify(arguments: updateBundleSwitch); + bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache(); + bundleAv2.VerifyRegisteredAndInPackageCache(); + + packageAv1.VerifyInstalled(false); + packageAv2.VerifyInstalled(true); + + bundleAv2.Uninstall(); + bundleAv2.VerifyUnregisteredAndRemovedFromPackageCache(); + packageAv2.VerifyInstalled(false); + } + + [Fact] + public void ForwardsArgumentsToUpdateBundle() + { + var packageAv1 = this.CreatePackageInstaller("PackageAv1"); + var packageAv2 = this.CreatePackageInstaller("PackageAv2"); + var bundleAv1 = this.CreateBundleInstaller("BundleAv1"); + var bundleAv2 = this.CreateBundleInstaller("BundleAv2"); + var testBAController = this.CreateTestBAController(); + + const string verifyArguments = "these arguments should exist"; + var updateBundleSwitch = String.Concat("\"", "-updatebundle:", bundleAv2.Bundle, "\" ", verifyArguments); + + testBAController.SetVerifyArguments(verifyArguments); + + packageAv1.VerifyInstalled(false); + packageAv2.VerifyInstalled(false); + + // Install the v2 bundle by getting v1 to launch it as an update bundle. + bundleAv1.Install(arguments: updateBundleSwitch); + bundleAv1.VerifyUnregisteredAndRemovedFromPackageCache(); + bundleAv2.VerifyRegisteredAndInPackageCache(); + + packageAv1.VerifyInstalled(false); + packageAv2.VerifyInstalled(true); + + // Attempt to uninstall bundleA2 without the verify arguments passed and expect failure code. + bundleAv2.Uninstall(expectedExitCode: -1); + + // Remove the required arguments and uninstall again. + testBAController.SetVerifyArguments(null); + bundleAv2.Uninstall(); + bundleAv2.VerifyUnregisteredAndRemovedFromPackageCache(); + packageAv2.VerifyInstalled(false); + } + + // Installs bundle Bv1.0 then tries to update to latest version during modify (but no server exists). + [Fact] + public void CanCheckUpdateServerDuringModifyAndDoNothingWhenServerIsntResponsive() + { + var packageB = this.CreatePackageInstaller("PackageBv1"); + var bundleB = this.CreateBundleInstaller("BundleBv1"); + + packageB.VerifyInstalled(false); + + bundleB.Install(); + bundleB.VerifyRegisteredAndInPackageCache(); + + packageB.VerifyInstalled(true); + + // Run the v1 bundle requesting an update bundle. + bundleB.Modify(arguments: "-checkupdate"); + bundleB.VerifyRegisteredAndInPackageCache(); + + // Verify nothing changed. + packageB.VerifyInstalled(true); + + bundleB.Uninstall(); + bundleB.VerifyUnregisteredAndRemovedFromPackageCache(); + packageB.VerifyInstalled(false); + } + + // Installs bundle Bv1.0 then tries to update to latest version during modify (server exists, no feed). + [Fact] + public void CanCheckUpdateServerDuringModifyAndDoNothingWhenFeedIsMissing() + { + var packageB = this.CreatePackageInstaller("PackageBv1"); + var bundleB = this.CreateBundleInstaller("BundleBv1"); + var webServer = this.CreateWebServer(); + + webServer.Start(); + + packageB.VerifyInstalled(false); + + bundleB.Install(); + bundleB.VerifyRegisteredAndInPackageCache(); + + packageB.VerifyInstalled(true); + + // Run the v1 bundle requesting an update bundle. + bundleB.Modify(arguments: "-checkupdate"); + bundleB.VerifyRegisteredAndInPackageCache(); + + // Verify nothing changed. + packageB.VerifyInstalled(true); + + bundleB.Uninstall(); + bundleB.VerifyUnregisteredAndRemovedFromPackageCache(); + packageB.VerifyInstalled(false); + } + + // Installs bundle Bv1.0 then tries to update to latest version during modify (server exists, v1.0 feed). + [Fact] + public void CanCheckUpdateServerDuringModifyAndDoNothingWhenAlreadyLatestVersion() + { + var packageB = this.CreatePackageInstaller("PackageBv1"); + var bundleB = this.CreateBundleInstaller("BundleBv1"); + var webServer = this.CreateWebServer(); + + webServer.AddFiles(new Dictionary + { + { "/BundleB/feed", Path.Combine(this.TestContext.TestDataFolder, "FeedBv1.0.xml") }, + }); + webServer.Start(); + + packageB.VerifyInstalled(false); + + bundleB.Install(); + bundleB.VerifyRegisteredAndInPackageCache(); + + packageB.VerifyInstalled(true); + + // Run the v1 bundle requesting an update bundle. + bundleB.Modify(arguments: "-checkupdate"); + bundleB.VerifyRegisteredAndInPackageCache(); + + // Verify nothing changed. + packageB.VerifyInstalled(true); + + bundleB.Uninstall(); + bundleB.VerifyUnregisteredAndRemovedFromPackageCache(); + packageB.VerifyInstalled(false); + } + + // Installs bundle Bv1.0 then does an update to bundle Bv2.0 during modify (server exists, v2.0 feed). + [Fact] + public void CanLaunchUpdateBundleFromDownloadInsteadOfModify() + { + var packageBv1 = this.CreatePackageInstaller("PackageBv1"); + var packageBv2 = this.CreatePackageInstaller("PackageBv2"); + var bundleBv1 = this.CreateBundleInstaller("BundleBv1"); + var bundleBv2 = this.CreateBundleInstaller("BundleBv2"); + var webServer = this.CreateWebServer(); + + webServer.AddFiles(new Dictionary + { + { "/BundleB/feed", Path.Combine(this.TestContext.TestDataFolder, "FeedBv2.0.xml") }, + { "/BundleB/2.0/BundleB.exe", bundleBv2.Bundle }, + }); + webServer.Start(); + + packageBv1.VerifyInstalled(false); + packageBv2.VerifyInstalled(false); + + bundleBv1.Install(); + bundleBv1.VerifyRegisteredAndInPackageCache(); + + packageBv1.VerifyInstalled(true); + packageBv2.VerifyInstalled(false); + + // Run the v1 bundle requesting an update bundle. + bundleBv1.Modify(arguments: "-checkupdate"); + + // The modify -> update is asynchronous, so we need to wait until the real BundleB is done + var childBundles = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(bundleBv2.Bundle)); + foreach (var childBundle in childBundles) + { + childBundle.WaitForExit(); + } + + bundleBv1.VerifyUnregisteredAndRemovedFromPackageCache(); + bundleBv2.VerifyRegisteredAndInPackageCache(); + + packageBv1.VerifyInstalled(false); + packageBv2.VerifyInstalled(true); + + bundleBv2.Uninstall(); + bundleBv2.VerifyUnregisteredAndRemovedFromPackageCache(); + packageBv1.VerifyInstalled(false); + packageBv2.VerifyInstalled(false); + } + } +} diff --git a/src/WixToolsetTest.BurnE2E/WebServer/CoreOwinWebServer.cs b/src/WixToolsetTest.BurnE2E/WebServer/CoreOwinWebServer.cs new file mode 100644 index 00000000..66db226c --- /dev/null +++ b/src/WixToolsetTest.BurnE2E/WebServer/CoreOwinWebServer.cs @@ -0,0 +1,69 @@ +// 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.BurnE2E +{ + using System; + using System.Collections.Generic; + using System.IO; + using Microsoft.AspNetCore.Builder; + using Microsoft.AspNetCore.Hosting; + using Microsoft.Extensions.FileProviders; + using Microsoft.Extensions.FileProviders.Physical; + using Microsoft.Extensions.Hosting; + using Microsoft.Extensions.Primitives; + + public class CoreOwinWebServer : IWebServer, IFileProvider + { + private Dictionary PhysicalPathsByRelativeUrl { get; } = new Dictionary(); + + private IHost WebHost { get; set; } + + public void AddFiles(Dictionary physicalPathsByRelativeUrl) + { + foreach (var kvp in physicalPathsByRelativeUrl) + { + this.PhysicalPathsByRelativeUrl.Add(kvp.Key, kvp.Value); + } + } + + public void Start() + { + this.WebHost = Host.CreateDefaultBuilder() + .ConfigureWebHostDefaults(webBuilder => + { + // Use localhost instead of * to avoid firewall issues. + webBuilder.UseUrls("http://localhost:9999"); + webBuilder.Configure(appBuilder => + { + appBuilder.UseStaticFiles(new StaticFileOptions + { + FileProvider = this, + RequestPath = "/e2e", + ServeUnknownFileTypes = true, + }); + }); + }) + .Build(); + this.WebHost.Start(); + } + + public void Dispose() + { + this.WebHost?.StopAsync(TimeSpan.FromSeconds(5)).GetAwaiter().GetResult(); + } + + public IDirectoryContents GetDirectoryContents(string subpath) => throw new NotImplementedException(); + + public IFileInfo GetFileInfo(string subpath) + { + if (this.PhysicalPathsByRelativeUrl.TryGetValue(subpath, out var filepath)) + { + return new PhysicalFileInfo(new FileInfo(filepath)); + } + + return new NotFoundFileInfo(subpath); + } + + public IChangeToken Watch(string filter) => throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/src/WixToolsetTest.BurnE2E/WixToolsetTest.BurnE2E.csproj b/src/WixToolsetTest.BurnE2E/WixToolsetTest.BurnE2E.csproj index 170f5c73..75fdc9b3 100644 --- a/src/WixToolsetTest.BurnE2E/WixToolsetTest.BurnE2E.csproj +++ b/src/WixToolsetTest.BurnE2E/WixToolsetTest.BurnE2E.csproj @@ -13,10 +13,11 @@ - + + -- cgit v1.2.3-55-g6feb