diff --git a/src/WinGetUtilInterop.UnitTests/ManifestUnitTest/V1ManifestReadTest.cs b/src/WinGetUtilInterop.UnitTests/ManifestUnitTest/V1ManifestReadTest.cs index 9ab1c2a995..1fbbfe5051 100644 --- a/src/WinGetUtilInterop.UnitTests/ManifestUnitTest/V1ManifestReadTest.cs +++ b/src/WinGetUtilInterop.UnitTests/ManifestUnitTest/V1ManifestReadTest.cs @@ -33,6 +33,7 @@ private enum TestManifestVersion { V100, V110, + V160, } /// @@ -51,6 +52,11 @@ public void ReadV1ManifestsAndVerifyContents() Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "TestCollateral", ManifestStrings.V110ManifestMerged)); this.ValidateManifestFields(v110manifest, TestManifestVersion.V110); + + Manifest v160manifest = Manifest.CreateManifestFromPath( + Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "TestCollateral", ManifestStrings.V160ManifestMerged)); + + this.ValidateManifestFields(v160manifest, TestManifestVersion.V160); } /// @@ -126,6 +132,7 @@ private void ValidateManifestFields(Manifest manifest, TestManifestVersion manif Assert.Equal("Windows.Desktop", manifest.Platform[0]); Assert.Equal("Windows.Universal", manifest.Platform[1]); Assert.Equal("10.0.0.0", manifest.MinimumOSVersion); + Assert.Equal("zip", manifest.InstallerType); Assert.Equal("machine", manifest.Scope); Assert.Equal(3, manifest.InstallModes.Count); @@ -193,9 +200,9 @@ private void ValidateManifestFields(Manifest manifest, TestManifestVersion manif Assert.Equal("exe", manifest.AppsAndFeaturesEntries[0].InstallerType); Assert.Single(manifest.Markets.AllowedMarkets); Assert.Equal("US", manifest.Markets.AllowedMarkets[0]); - Assert.Single(manifest.ExpectedReturnCodes); - Assert.Equal(10, manifest.ExpectedReturnCodes[0].InstallerReturnCode); - Assert.Equal("packageInUse", manifest.ExpectedReturnCodes[0].ReturnResponse); + Assert.Equal(2, manifest.ExpectedReturnCodes.Count); + Assert.Equal(2, manifest.ExpectedReturnCodes[0].InstallerReturnCode); + Assert.Equal("contactSupport", manifest.ExpectedReturnCodes[0].ReturnResponse); } Assert.Equal(2, manifest.Installers.Count); @@ -303,6 +310,26 @@ private void ValidateManifestFields(Manifest manifest, TestManifestVersion manif Assert.Equal("Text", localization1.Agreements[0].Agreement); Assert.Equal("https://AgreementUrl.net", localization1.Agreements[0].AgreementUrl); } + + if (manifestVersion >= TestManifestVersion.V160) + { + Assert.Equal("msi", manifest.NestedInstallerType); + Assert.Single(manifest.NestedInstallerFiles); + + InstallerNestedInstallerFile installerNestedInstallerFile = manifest.NestedInstallerFiles[0]; + Assert.Equal("RelativeFilePath", installerNestedInstallerFile.RelativeFilePath); + Assert.Equal("PortableCommandAlias", installerNestedInstallerFile.PortableCommandAlias); + + InstallerInstallationMetadata installerInstallationMetadata = manifest.InstallationMetadata; + Assert.Equal("%ProgramFiles%\\TestApp", installerInstallationMetadata.DefaultInstallLocation); + Assert.Single(installerInstallationMetadata.Files); + + ManifestInstallerFile installerFile = installerInstallationMetadata.Files[0]; + Assert.Equal("main.exe", installerFile.RelativeFilePath); + Assert.Equal("DisplayName", installerFile.DisplayName); + Assert.Equal("/arg", installerFile.InvocationParameter); + Assert.Equal("69D84CA8899800A5575CE31798293CD4FEBAB1D734A07C2E51E56A28E0DF8C82", installerFile.FileSha256); + } } /// @@ -320,6 +347,11 @@ internal class ManifestStrings /// public const string V110ManifestMerged = "V1_1ManifestMerged.yaml"; + /// + /// Merged v1.1 manifest. + /// + public const string V160ManifestMerged = "V1_6ManifestMerged.yaml"; + /// /// Merged v1 manifest without localization. /// diff --git a/src/WinGetUtilInterop.UnitTests/TestCollateral/V1_1ManifestMerged.yaml b/src/WinGetUtilInterop.UnitTests/TestCollateral/V1_1ManifestMerged.yaml index f646efa6e9..de6888aa7b 100644 --- a/src/WinGetUtilInterop.UnitTests/TestCollateral/V1_1ManifestMerged.yaml +++ b/src/WinGetUtilInterop.UnitTests/TestCollateral/V1_1ManifestMerged.yaml @@ -30,8 +30,11 @@ Dependencies: Description: The MSIX SDK project is an effort to enable developers ElevationRequirement: elevatesSelf ExpectedReturnCodes: -- InstallerReturnCode: 10 - ReturnResponse: packageInUse +- InstallerReturnCode: 2 + ReturnResponse: contactSupport +- InstallerReturnCode: 3 + ReturnResponse: custom + ReturnResponseUrl: https://defaultReturnResponseUrl.com FileExtensions: - appx - msix diff --git a/src/WinGetUtilInterop.UnitTests/TestCollateral/V1_6ManifestMerged.yaml b/src/WinGetUtilInterop.UnitTests/TestCollateral/V1_6ManifestMerged.yaml new file mode 100644 index 0000000000..dda831944c --- /dev/null +++ b/src/WinGetUtilInterop.UnitTests/TestCollateral/V1_6ManifestMerged.yaml @@ -0,0 +1,222 @@ +PackageIdentifier: microsoft.msixsdk +PackageVersion: 1.7.32 +PackageLocale: en-US +Publisher: Microsoft +PublisherUrl: https://www.microsoft.com +PublisherSupportUrl: https://www.microsoft.com/support +PrivacyUrl: https://www.microsoft.com/privacy +Author: Microsoft +PackageName: MSIX SDK +PackageUrl: https://www.microsoft.com/msixsdk/home +License: MIT License +LicenseUrl: https://www.microsoft.com/msixsdk/license +Copyright: Copyright Microsoft Corporation +CopyrightUrl: https://www.microsoft.com/msixsdk/copyright +ShortDescription: This is MSIX SDK +Description: The MSIX SDK project is an effort to enable developers +Moniker: msixsdk +Tags: + - "appxsdk" + - "msixsdk" +ReleaseNotes: Default release notes +ReleaseNotesUrl: https://DefaultReleaseNotes.net +PurchaseUrl: https://DefaultPurchaseUrl.com +InstallationNotes: Default installation notes +Documentations: + - DocumentLabel: Default document label + DocumentUrl: https://DefaultDocumentUrl.com +Icons: + - IconUrl: https://testIcon + IconFileType: ico + IconResolution: custom + IconTheme: default + IconSha256: 69D84CA8899800A5575CE31798293CD4FEBAB1D734A07C2E51E56A28E0DF8123 +Agreements: + - AgreementLabel: DefaultLabel + Agreement: DefaultText + AgreementUrl: https://DefaultAgreementUrl.net +InstallerLocale: en-US +Platform: + - Windows.Desktop + - Windows.Universal +MinimumOSVersion: 10.0.0.0 +InstallerType: zip +Scope: machine +InstallModes: + - interactive + - silent + - silentWithProgress +InstallerSwitches: + Custom: /custom + SilentWithProgress: /silentwithprogress + Silent: /silence + Interactive: /interactive + Log: /log= + InstallLocation: /dir= + Upgrade: /upgrade +InstallerSuccessCodes: + - 1 + - 0x80070005 +UpgradeBehavior: uninstallPrevious +Commands: + - makemsix + - makeappx +Protocols: + - protocol1 + - protocol2 +FileExtensions: + - appx + - msix + - appxbundle + - msixbundle +Dependencies: + WindowsFeatures: + - IIS + WindowsLibraries: + - VC Runtime + PackageDependencies: + - PackageIdentifier: Microsoft.MsixSdkDep + MinimumVersion: 1.0.0 + ExternalDependencies: + - Outside dependencies +Capabilities: + - internetClient +RestrictedCapabilities: + - runFullTrust +PackageFamilyName: Microsoft.DesktopAppInstaller_8wekyb3d8bbwe +ProductCode: "{Foo}" +ReleaseDate: 2021-01-01 +InstallerAbortsTerminal: true +InstallLocationRequired: true +RequireExplicitUpgrade: true +DisplayInstallWarnings: true +ElevationRequirement: elevatesSelf +UnsupportedOSArchitectures: + - arm +AppsAndFeaturesEntries: + - DisplayName: DisplayName + DisplayVersion: DisplayVersion + Publisher: Publisher + ProductCode: ProductCode + UpgradeCode: UpgradeCode + InstallerType: exe +Markets: + AllowedMarkets: + - US +ExpectedReturnCodes: + - InstallerReturnCode: 2 + ReturnResponse: contactSupport + - InstallerReturnCode: 3 + ReturnResponse: custom + ReturnResponseUrl: https://defaultReturnResponseUrl.com +UnsupportedArguments: + - log +NestedInstallerType: msi +NestedInstallerFiles: + - RelativeFilePath: RelativeFilePath + PortableCommandAlias: PortableCommandAlias +InstallationMetadata: + DefaultInstallLocation: "%ProgramFiles%\\TestApp" + Files: + - RelativeFilePath: "main.exe" + FileSha256: 69D84CA8899800A5575CE31798293CD4FEBAB1D734A07C2E51E56A28E0DF8C82 + FileType: launch + InvocationParameter: "/arg" + DisplayName: "DisplayName" +DownloadCommandProhibited: true +Localization: +- Agreements: + - Agreement: Text + AgreementLabel: Label + AgreementUrl: https://AgreementUrl.net + Author: Microsoft UK + Copyright: Copyright Microsoft Corporation UK + CopyrightUrl: https://www.microsoft.com/msixsdk/copyright/UK + Description: The MSIX SDK project is an effort to enable developers UK + License: MIT License UK + LicenseUrl: https://www.microsoft.com/msixsdk/license/UK + PackageLocale: en-GB + PackageName: MSIX SDK UK + PackageUrl: https://www.microsoft.com/msixsdk/home/UK + PrivacyUrl: https://www.microsoft.com/privacy/UK + Publisher: Microsoft UK + PublisherSupportUrl: https://www.microsoft.com/support/UK + PublisherUrl: https://www.microsoft.com/UK + ReleaseNotes: Release notes + ReleaseNotesUrl: https://ReleaseNotes.net + ShortDescription: This is MSIX SDK UK + Tags: + - appxsdkUK + - msixsdkUK +Installers: + - Architecture: x86 + InstallerLocale: en-GB + Platform: + - Windows.Desktop + MinimumOSVersion: 10.0.1.0 + InstallerType: msix + InstallerUrl: https://www.microsoft.com/msixsdk/msixsdkx86.msix + InstallerSha256: 69D84CA8899800A5575CE31798293CD4FEBAB1D734A07C2E51E56A28E0DF8C82 + SignatureSha256: 69D84CA8899800A5575CE31798293CD4FEBAB1D734A07C2E51E56A28E0DF8C82 + Scope: user + InstallModes: + - interactive + InstallerSwitches: + Custom: /c + SilentWithProgress: /sp + Silent: /s + Interactive: /i + Log: /l= + InstallLocation: /d= + Upgrade: /u + UpgradeBehavior: install + Commands: + - makemsixPreview + - makeappxPreview + Protocols: + - protocol1preview + - protocol2preview + FileExtensions: + - appxbundle + - msixbundle + - appx + - msix + Dependencies: + WindowsFeatures: + - PreviewIIS + WindowsLibraries: + - Preview VC Runtime + PackageDependencies: + - PackageIdentifier: Microsoft.MsixSdkDepPreview + MinimumVersion: 1.0.0 + ExternalDependencies: + - Preview Outside dependencies + PackageFamilyName: Microsoft.DesktopAppInstallerPreview_8wekyb3d8bbwe + Capabilities: + - internetClientPreview + RestrictedCapabilities: + - runFullTrustPreview + ReleaseDate: 2021-02-02 + InstallerAbortsTerminal: false + InstallLocationRequired: false + RequireExplicitUpgrade: false + DisplayInstallWarnings: false + ElevationRequirement: elevationRequired + UnsupportedArguments: + - location + UnsupportedOSArchitectures: + - arm64 + Markets: + ExcludedMarkets: + - "US" + ExpectedReturnCodes: + - InstallerReturnCode: 2 + ReturnResponse: contactSupport + DownloadCommandProhibited: false + - Architecture: x64 + InstallerSha256: 69D84CA8899800A5575CE31798293CD4FEBAB1D734A07C2E51E56A28E0DF8C82 + InstallerUrl: https://www.microsoft.com/msixsdk/msixsdkx64.exe + InstallerType: exe + ProductCode: '{Bar}' + ManifestType: singleton +ManifestVersion: 1.6.0 \ No newline at end of file diff --git a/src/WinGetUtilInterop.UnitTests/WinGetUtilInterop.UnitTests.csproj b/src/WinGetUtilInterop.UnitTests/WinGetUtilInterop.UnitTests.csproj index 553cbbc531..bd43371368 100644 --- a/src/WinGetUtilInterop.UnitTests/WinGetUtilInterop.UnitTests.csproj +++ b/src/WinGetUtilInterop.UnitTests/WinGetUtilInterop.UnitTests.csproj @@ -63,6 +63,9 @@ Always + + Always + PreserveNewest diff --git a/src/WinGetUtilInterop/Manifest/V1/Manifest.cs b/src/WinGetUtilInterop/Manifest/V1/Manifest.cs index dd7e7066a7..66966a6724 100644 --- a/src/WinGetUtilInterop/Manifest/V1/Manifest.cs +++ b/src/WinGetUtilInterop/Manifest/V1/Manifest.cs @@ -137,12 +137,32 @@ public class Manifest /// Gets or sets the release notes in default locale. /// public string ReleaseNotes { get; set; } + + /// + /// Gets or sets the manifest documentation. + /// + public ManifestDocumentation Documentation { get; set; } + + /// + /// Gets or sets the manifest icon information. + /// + public ManifestIcon Icon { get; set; } /// /// Gets or sets the release notes url in default locale. /// public string ReleaseNotesUrl { get; set; } + /// + /// Gets or sets the purchase url of the package. + /// + public string PurchaseUrl { get; set; } + + /// + /// Gets or sets the installation notes. + /// + public string InstallationNotes { get; set; } + // Installer fields /// @@ -317,6 +337,11 @@ public class Manifest /// public List Localization { get; set; } + /// + /// Gets or sets a value indicating whether the installer is prohibited from being downloaded for offline installation. + /// + public bool DownloadCommandProhibited { get; set; } + /// /// Deserialize a stream reader into a Manifest object. /// diff --git a/src/WinGetUtilInterop/Manifest/V1/ManifestDocumentation.cs b/src/WinGetUtilInterop/Manifest/V1/ManifestDocumentation.cs new file mode 100644 index 0000000000..ef0c2ccee4 --- /dev/null +++ b/src/WinGetUtilInterop/Manifest/V1/ManifestDocumentation.cs @@ -0,0 +1,26 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// ----------------------------------------------------------------------- + +namespace Microsoft.WinGetUtil.Models.V1 +{ + using System; + using System.Collections.Generic; + using System.Text; + + public class ManifestDocumentation + { + /// + /// Gets or sets the document label. + /// + public string DocumentLabel { get; set; } + + /// + /// Gets or sets the document url. + /// + public string DocumentUrl { get; set; } + + } +} diff --git a/src/WinGetUtilInterop/Manifest/V1/ManifestIcon.cs b/src/WinGetUtilInterop/Manifest/V1/ManifestIcon.cs new file mode 100644 index 0000000000..53eed758ff --- /dev/null +++ b/src/WinGetUtilInterop/Manifest/V1/ManifestIcon.cs @@ -0,0 +1,40 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// ----------------------------------------------------------------------- + +namespace Microsoft.WinGetUtil.Models.V1 +{ + using System; + using System.Collections.Generic; + using System.Text; + + public class ManifestIcon + { + /// + /// Gets or sets the icon url. + /// + public string IconUrl { get; set; } + + /// + /// Gets or sets the icon file type. + /// + public string IconFileType { get; set; } + + /// + /// Gets or sets the icon resolution. + /// + public string IconResolution { get; set; } + + /// + /// Gets or sets the icon theme. + /// + public string IconTheme { get; set; } + + /// + /// Gets or sets the icon sha256. + /// + public string IconSha56 { get; set; } + } +} diff --git a/src/WinGetUtilInterop/Manifest/V1/ManifestInstaller.cs b/src/WinGetUtilInterop/Manifest/V1/ManifestInstaller.cs index d8ce4d1aa5..7c5536a9c5 100644 --- a/src/WinGetUtilInterop/Manifest/V1/ManifestInstaller.cs +++ b/src/WinGetUtilInterop/Manifest/V1/ManifestInstaller.cs @@ -199,6 +199,11 @@ public class ManifestInstaller /// public bool DisplayInstallWarnings { get; set; } + /// + /// Gets or sets a value indicating whether the installer is prohibited from being downloaded for offline installation. + /// + public bool DownloadCommandProhibited { get; set; } + /// /// Returns a List of strings containing the URIs contained within this installer. /// @@ -256,7 +261,12 @@ public bool Equals(ManifestInstaller other) (this.InstallerLocale == other.InstallerLocale) && (this.Scope == other.Scope) && (this.InstallerType == other.InstallerType) && - (this.Switches == other.Switches); + (this.Switches == other.Switches) && + (this.InstallationMetadata == other.InstallationMetadata) && + (this.NestedInstallerType == other.NestedInstallerType) && + (this.NestedInstallerFiles == other.NestedInstallerFiles) && + (this.ExcludedMarkets == other.ExcludedMarkets) && + (this.DisplayInstallWarnings == other.DisplayInstallWarnings); } ///