diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 56f4a644..253dd39a 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -72,7 +72,7 @@ jobs: - uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.0.x' + dotnet-version: '10.0.x' - name: Restore dependencies run: dotnet restore src/PackageUploader.sln /p:EnableWindowsTargeting=true diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index f7f3f1be..13b59b6c 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -19,7 +19,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 8.0.x + dotnet-version: 10.0.x - name: Restore dependencies run: dotnet restore working-directory: ./src diff --git a/README.md b/README.md index 4309fac8..2dd50d39 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ This ReadMe covers the following: The Package Uploader solution has two main projects. -The first project is Package Uploader, a .NET 8.0-based cross-platform app and library that you can use to programmatically interact with Partner Center. +The first project is Package Uploader, a .NET 10.0-based cross-platform app and library that you can use to programmatically interact with Partner Center. Package Uploader has a command-line tool and a dynamic-link library (DLL) that you can integrate into your build pipelines or other development workflows. @@ -148,10 +148,10 @@ Alternately, the executables (both the GUI and CMD tools) are also available fro Furthermore, you can also build it. -1. [Download the .NET 8 SDK](https://dotnet.microsoft.com/en-us/download) or the latest version. +1. [Download the .NET 10 SDK](https://dotnet.microsoft.com/en-us/download) or the latest version. 2. Open PowerShell, and then browse to the folder where you downloaded Package Uploader. 3. Browse to the `src` folder, and then run `./publish.win-x64.ps1`. -4. When it's built, PackageUploader.exe is in the `src\PackageUploader.Application\bin\Release\net8.0\win-x64\publish` directory. +4. When it's built, PackageUploader.exe is in the `src\PackageUploader.Application\bin\Release\net10.0\win-x64\publish` directory. @@ -241,7 +241,7 @@ For full documentation on each property of each operation, see the [operations d ## Example GetProduct operation -**NOTE:** When using a certificate, you need to include a few more values in the aadAuthInfo section. `certificateStore` represents the certificate location in the store on the machine. For information about other supported values, see [StoreName Enum (System.Security.Cryptography.X509Certificates)](https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.x509certificates.storename?view=net-8.0).
`certificateLocation` can be set to `LocalMachine` or `CurrentUser`. +**NOTE:** When using a certificate, you need to include a few more values in the aadAuthInfo section. `certificateStore` represents the certificate location in the store on the machine. For information about other supported values, see [StoreName Enum (System.Security.Cryptography.X509Certificates)](https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.x509certificates.storename?view=net-10.0).
`certificateLocation` can be set to `LocalMachine` or `CurrentUser`. ### Example GetProduct configuration file using certificate authorization @@ -276,7 +276,7 @@ Product: { ### Example UploadXvcPackage configuration file using certificate authentication -**NOTE:** When using a certificate, you need to include a few more values in the aadAuthInfo section. `certificateStore` represents the certificate location in the store on the machine. For information about other supported values, see [StoreName Enum (System.Security.Cryptography.X509Certificates)](https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.x509certificates.storename?view=net-8.0).
`certificateLocation` can be set to `LocalMachine` or `CurrentUser`. +**NOTE:** When using a certificate, you need to include a few more values in the aadAuthInfo section. `certificateStore` represents the certificate location in the store on the machine. For information about other supported values, see [StoreName Enum (System.Security.Cryptography.X509Certificates)](https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.x509certificates.storename?view=net-10.0).
`certificateLocation` can be set to `LocalMachine` or `CurrentUser`. ```json { diff --git a/docs/compact-mode-implementation.md b/docs/compact-mode-implementation.md index 0f7e0230..a369cd1d 100644 --- a/docs/compact-mode-implementation.md +++ b/docs/compact-mode-implementation.md @@ -88,7 +88,7 @@ cd D:\PackageUploader\src dotnet restore PackageUploader.UI/PackageUploader.UI.csproj -r win-x64 dotnet build PackageUploader.UI/PackageUploader.UI.csproj -c Debug -r win-x64 -# Exe: src\PackageUploader.UI\bin\Debug\net8.0-windows\win-x64\XboxGamePackageManager.exe +# Exe: src\PackageUploader.UI\bin\Debug\net10.0-windows\win-x64\XboxGamePackageManager.exe ``` **Note:** Requires Azure Artifacts Credential Provider for the `XboxPackageUploaderFeed` NuGet source. Install with: diff --git a/src/PackageUploader.Application.Test/CommandLineHelperTest.cs b/src/PackageUploader.Application.Test/CommandLineHelperTest.cs new file mode 100644 index 00000000..1e2ef63c --- /dev/null +++ b/src/PackageUploader.Application.Test/CommandLineHelperTest.cs @@ -0,0 +1,56 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using PackageUploader.ClientApi; +using System.CommandLine; + +namespace PackageUploader.Application.Test +{ + [TestClass] + public class CommandLineHelperTest + { + [TestMethod] + [Description("Verifies that the ConfigFileOption is marked as required")] + public void ConfigFileOption_IsRequired() + { + // Assert + Assert.IsTrue(CommandLineHelper.ConfigFileOption.Required); + } + + [TestMethod] + [Description("Verifies that the BuildCommandLine method correctly builds a command line with all the expected commands")] + public void BuildCommandLine_BuildsCommandLineWithAllCommands() + { + // Act + var commandLineBuilder = CommandLineHelper.BuildRootCommand(); + var rootCommand = commandLineBuilder; + + // Assert + Assert.IsNotNull(rootCommand); + + // Verify command names (7 commands) + var commandNames = rootCommand.Subcommands.Select(c => c.Name).ToList(); + Assert.Contains("GetProduct", commandNames); + Assert.Contains("UploadUwpPackage", commandNames); + Assert.Contains("UploadXvcPackage", commandNames); + Assert.Contains("RemovePackages", commandNames); + Assert.Contains("ImportPackages", commandNames); + Assert.Contains("PublishPackages", commandNames); + Assert.Contains("GetPackages", commandNames); + + // Verify global options + Assert.Contains(CommandLineHelper.VerboseOption, rootCommand.Options); + Assert.Contains(CommandLineHelper.LogFileOption, rootCommand.Options); + Assert.AreEqual("Application that enables game developers to upload Xbox and PC game packages to Partner Center", rootCommand.Description); + } + + [TestMethod] + [Description("Verifies default authentication method is AppSecret")] + public void AuthenticationMethodOption_DefaultIsAppSecret() + { + // Assert - Use our custom extension method + Assert.AreEqual(IngestionExtensions.AuthenticationMethod.AppSecret, + CommandLineHelper.AuthenticationMethodOption.GetDefaultValue()); + } + } +} \ No newline at end of file diff --git a/src/PackageUploader.Application.Test/Config/BaseOperationConfigTest.cs b/src/PackageUploader.Application.Test/Config/BaseOperationConfigTest.cs new file mode 100644 index 00000000..de7ebdbc --- /dev/null +++ b/src/PackageUploader.Application.Test/Config/BaseOperationConfigTest.cs @@ -0,0 +1,94 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace PackageUploader.Application.Test.Config; + +[TestClass] +public class BaseOperationConfigTest +{ + [TestMethod] + public void Validate_WrongOperationName_ReturnsError() + { + var config = new TestGetProductOperationConfig + { + OperationName = "WrongName", + ProductId = "product-123" + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.MemberNames.Contains("OperationName"), results); + } + + [TestMethod] + public void Validate_CorrectOperationName_NoOperationNameError() + { + var config = new TestGetProductOperationConfig + { + OperationName = "GetProduct", + ProductId = "product-123" + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.DoesNotContain(r => r.MemberNames.Contains("OperationName"), results); + } + + [TestMethod] + public void Validate_NeitherProductIdNorBigId_ReturnsError() + { + var config = new TestGetProductOperationConfig + { + OperationName = "GetProduct", + ProductId = null, + BigId = null + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.MemberNames.Contains("ProductId") && r.MemberNames.Contains("BigId"), results); + } + + [TestMethod] + public void Validate_BothProductIdAndBigId_ReturnsError() + { + var config = new TestGetProductOperationConfig + { + OperationName = "GetProduct", + ProductId = "product-123", + BigId = "big-123" + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.ErrorMessage!.Contains("Only one"), results); + } + + [TestMethod] + public void Validate_OnlyProductId_NoIdError() + { + var config = new TestGetProductOperationConfig + { + OperationName = "GetProduct", + ProductId = "product-123" + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.DoesNotContain(r => r.MemberNames.Contains("ProductId") || r.MemberNames.Contains("BigId"), results); + } + + [TestMethod] + public void Validate_OnlyBigId_NoIdError() + { + var config = new TestGetProductOperationConfig + { + OperationName = "GetProduct", + BigId = "big-123" + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.DoesNotContain(r => r.MemberNames.Contains("ProductId") || r.MemberNames.Contains("BigId"), results); + } +} diff --git a/src/PackageUploader.Application.Test/Config/GetPackagesOperationConfigTest.cs b/src/PackageUploader.Application.Test/Config/GetPackagesOperationConfigTest.cs new file mode 100644 index 00000000..378504a8 --- /dev/null +++ b/src/PackageUploader.Application.Test/Config/GetPackagesOperationConfigTest.cs @@ -0,0 +1,56 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace PackageUploader.Application.Test.Config; + +[TestClass] +public class GetPackagesOperationConfigTest +{ + [TestMethod] + public void Validate_BlankMarketGroupName_DefaultsToDefault() + { + var config = new TestGetPackagesOperationConfig + { + OperationName = "GetPackages", + ProductId = "product-123", + BranchFriendlyName = "main", + MarketGroupName = " " + }; + + ConfigTestHelper.ValidateConfig(config); + + Assert.AreEqual("default", config.MarketGroupName); + } + + [TestMethod] + public void Validate_NullMarketGroupName_DefaultsToDefault() + { + var config = new TestGetPackagesOperationConfig + { + OperationName = "GetPackages", + ProductId = "product-123", + BranchFriendlyName = "main", + MarketGroupName = null + }; + + ConfigTestHelper.ValidateConfig(config); + + Assert.AreEqual("default", config.MarketGroupName); + } + + [TestMethod] + public void Validate_NonBlankMarketGroupName_Preserved() + { + var config = new TestGetPackagesOperationConfig + { + OperationName = "GetPackages", + ProductId = "product-123", + BranchFriendlyName = "main", + MarketGroupName = "custom-group" + }; + + ConfigTestHelper.ValidateConfig(config); + + Assert.AreEqual("custom-group", config.MarketGroupName); + } +} diff --git a/src/PackageUploader.Application.Test/Config/ImportPackagesOperationConfigTest.cs b/src/PackageUploader.Application.Test/Config/ImportPackagesOperationConfigTest.cs new file mode 100644 index 00000000..b77a7c65 --- /dev/null +++ b/src/PackageUploader.Application.Test/Config/ImportPackagesOperationConfigTest.cs @@ -0,0 +1,96 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using PackageUploader.ClientApi.Models; + +namespace PackageUploader.Application.Test.Config; + +[TestClass] +public class ImportPackagesOperationConfigTest +{ + [TestMethod] + public void Validate_NeitherDestinationBranchNorFlight_ReturnsError() + { + var config = new TestImportPackagesOperationConfig + { + OperationName = "ImportPackages", + ProductId = "product-123", + BranchFriendlyName = "main", + DestinationBranchFriendlyName = null, + DestinationFlightName = null + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.MemberNames.Contains("DestinationBranchFriendlyName"), results); + } + + [TestMethod] + public void Validate_BothDestinationBranchAndFlight_ReturnsError() + { + var config = new TestImportPackagesOperationConfig + { + OperationName = "ImportPackages", + ProductId = "product-123", + BranchFriendlyName = "main", + DestinationBranchFriendlyName = "dest-branch", + DestinationFlightName = "dest-flight" + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.ErrorMessage!.Contains("Only one"), results); + } + + [TestMethod] + public void Validate_OnlyDestinationBranch_NoDestinationError() + { + var config = new TestImportPackagesOperationConfig + { + OperationName = "ImportPackages", + ProductId = "product-123", + BranchFriendlyName = "main", + DestinationBranchFriendlyName = "dest-branch" + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.DoesNotContain(r => r.MemberNames.Contains("DestinationBranchFriendlyName") || r.MemberNames.Contains("DestinationFlightName"), results); + } + + [TestMethod] + public void Validate_PreDownloadDateWithoutAvailabilityDate_ReturnsError() + { + var config = new TestImportPackagesOperationConfig + { + OperationName = "ImportPackages", + ProductId = "product-123", + BranchFriendlyName = "main", + DestinationBranchFriendlyName = "dest-branch", + PreDownloadDate = new GamePackageDate { IsEnabled = true, EffectiveDate = DateTime.UtcNow.AddDays(1) }, + AvailabilityDate = null + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.ErrorMessage!.Contains("needs AvailabilityDate"), results); + } + + [TestMethod] + public void Validate_PreDownloadDateAfterAvailabilityDate_ReturnsError() + { + var config = new TestImportPackagesOperationConfig + { + OperationName = "ImportPackages", + ProductId = "product-123", + BranchFriendlyName = "main", + DestinationBranchFriendlyName = "dest-branch", + AvailabilityDate = new GamePackageDate { IsEnabled = true, EffectiveDate = DateTime.UtcNow.AddDays(1) }, + PreDownloadDate = new GamePackageDate { IsEnabled = true, EffectiveDate = DateTime.UtcNow.AddDays(5) } + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.ErrorMessage!.Contains("needs to be before"), results); + } +} diff --git a/src/PackageUploader.Application.Test/Config/PackageBranchOperationConfigTest.cs b/src/PackageUploader.Application.Test/Config/PackageBranchOperationConfigTest.cs new file mode 100644 index 00000000..86473325 --- /dev/null +++ b/src/PackageUploader.Application.Test/Config/PackageBranchOperationConfigTest.cs @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace PackageUploader.Application.Test.Config; + +[TestClass] +public class PackageBranchOperationConfigTest +{ + [TestMethod] + public void Validate_NeitherBranchNorFlight_ReturnsError() + { + var config = new TestGetPackagesOperationConfig + { + OperationName = "GetPackages", + ProductId = "product-123", + BranchFriendlyName = null, + FlightName = null + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.MemberNames.Contains("BranchFriendlyName") && r.MemberNames.Contains("FlightName"), results); + } + + [TestMethod] + public void Validate_BothBranchAndFlight_ReturnsError() + { + var config = new TestGetPackagesOperationConfig + { + OperationName = "GetPackages", + ProductId = "product-123", + BranchFriendlyName = "main", + FlightName = "flight-1" + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.ErrorMessage!.Contains("Only one"), results); + } + + [TestMethod] + public void Validate_OnlyBranch_NoBranchError() + { + var config = new TestGetPackagesOperationConfig + { + OperationName = "GetPackages", + ProductId = "product-123", + BranchFriendlyName = "main" + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.DoesNotContain(r => r.MemberNames.Contains("BranchFriendlyName") || r.MemberNames.Contains("FlightName"), results); + } + + [TestMethod] + public void Validate_OnlyFlight_NoFlightError() + { + var config = new TestGetPackagesOperationConfig + { + OperationName = "GetPackages", + ProductId = "product-123", + FlightName = "flight-1" + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.DoesNotContain(r => r.MemberNames.Contains("BranchFriendlyName") || r.MemberNames.Contains("FlightName"), results); + } +} diff --git a/src/PackageUploader.Application.Test/Config/PublishPackagesOperationConfigTest.cs b/src/PackageUploader.Application.Test/Config/PublishPackagesOperationConfigTest.cs new file mode 100644 index 00000000..315bf591 --- /dev/null +++ b/src/PackageUploader.Application.Test/Config/PublishPackagesOperationConfigTest.cs @@ -0,0 +1,113 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using PackageUploader.Application.Config; + +namespace PackageUploader.Application.Test.Config; + +[TestClass] +public class PublishPackagesOperationConfigTest +{ + [TestMethod] + public void Validate_FlightNameOnly_NoPublishError() + { + var config = new PublishPackagesOperationConfig + { + OperationName = "PublishPackages", + ProductId = "product-123", + FlightName = "flight-1", + BranchFriendlyName = null, + DestinationSandboxName = null + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.DoesNotContain(r => r.MemberNames.Contains("DestinationSandboxName"), results); + } + + [TestMethod] + public void Validate_BranchAndSandbox_NoPublishError() + { + var config = new PublishPackagesOperationConfig + { + OperationName = "PublishPackages", + ProductId = "product-123", + FlightName = null, + BranchFriendlyName = "main", + DestinationSandboxName = "XDKS.1" + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.DoesNotContain(r => + r.MemberNames.Contains("FlightName") && + r.MemberNames.Contains("BranchFriendlyName") && + r.MemberNames.Contains("DestinationSandboxName"), results); + } + + [TestMethod] + public void Validate_NeitherFlightNorBranchSandbox_ReturnsError() + { + var config = new PublishPackagesOperationConfig + { + OperationName = "PublishPackages", + ProductId = "product-123", + FlightName = null, + BranchFriendlyName = null, + DestinationSandboxName = null + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.MemberNames.Contains("FlightName"), results); + } + + [TestMethod] + public void Validate_FlightAndBranchAndSandbox_ReturnsError() + { + var config = new PublishPackagesOperationConfig + { + OperationName = "PublishPackages", + ProductId = "product-123", + FlightName = "flight-1", + BranchFriendlyName = "main", + DestinationSandboxName = "XDKS.1" + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.MemberNames.Contains("FlightName"), results); + } + + [TestMethod] + public void Validate_DestinationSandboxRetail_ReturnsError() + { + var config = new PublishPackagesOperationConfig + { + OperationName = "PublishPackages", + ProductId = "product-123", + BranchFriendlyName = "main", + DestinationSandboxName = "RETAIL" + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.ErrorMessage!.Contains("RETAIL"), results); + } + + [TestMethod] + public void Validate_DestinationSandboxRetailCaseInsensitive_ReturnsError() + { + var config = new PublishPackagesOperationConfig + { + OperationName = "PublishPackages", + ProductId = "product-123", + BranchFriendlyName = "main", + DestinationSandboxName = "retail" + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.ErrorMessage!.Contains("RETAIL"), results); + } +} diff --git a/src/PackageUploader.Application.Test/Config/TestConfigHelpers.cs b/src/PackageUploader.Application.Test/Config/TestConfigHelpers.cs new file mode 100644 index 00000000..65ad0f25 --- /dev/null +++ b/src/PackageUploader.Application.Test/Config/TestConfigHelpers.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using PackageUploader.Application.Config; +using System.ComponentModel.DataAnnotations; + +namespace PackageUploader.Application.Test.Config; + +internal class TestGetProductOperationConfig : GetProductOperationConfig; + +internal class TestGetPackagesOperationConfig : GetPackagesOperationConfig; + +internal class TestRemovePackagesOperationConfig : RemovePackagesOperationConfig; + +internal class TestUploadUwpPackageOperationConfig : UploadUwpPackageOperationConfig; + +internal class TestUploadXvcPackageOperationConfig : UploadXvcPackageOperationConfig; + +internal class TestImportPackagesOperationConfig : ImportPackagesOperationConfig; + +internal static class ConfigTestHelper +{ + public static List ValidateConfig(IValidatableObject config) + { + var results = new List(); + results.AddRange(config.Validate(new ValidationContext(config))); + return results; + } +} diff --git a/src/PackageUploader.Application.Test/Config/UploadPackageOperationConfigTest.cs b/src/PackageUploader.Application.Test/Config/UploadPackageOperationConfigTest.cs new file mode 100644 index 00000000..7305a2cc --- /dev/null +++ b/src/PackageUploader.Application.Test/Config/UploadPackageOperationConfigTest.cs @@ -0,0 +1,61 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using PackageUploader.ClientApi.Models; + +namespace PackageUploader.Application.Test.Config; + +[TestClass] +public class UploadPackageOperationConfigTest +{ + [TestMethod] + public void Validate_AvailabilityDateEnabledWithoutEffectiveDate_ReturnsError() + { + var config = new TestUploadUwpPackageOperationConfig + { + OperationName = "UploadUwpPackage", + ProductId = "product-123", + BranchFriendlyName = "main", + PackageFilePath = "test.msixvc", + AvailabilityDate = new GamePackageDate { IsEnabled = true, EffectiveDate = null } + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.MemberNames.Contains("AvailabilityDate"), results); + } + + [TestMethod] + public void Validate_AvailabilityDateEnabledWithEffectiveDate_NoAvailabilityError() + { + var config = new TestUploadUwpPackageOperationConfig + { + OperationName = "UploadUwpPackage", + ProductId = "product-123", + BranchFriendlyName = "main", + PackageFilePath = "test.msixvc", + AvailabilityDate = new GamePackageDate { IsEnabled = true, EffectiveDate = DateTime.UtcNow.AddDays(1) } + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.DoesNotContain(r => r.MemberNames.Contains("AvailabilityDate"), results); + } + + [TestMethod] + public void Validate_BlankMarketGroupName_DefaultsToDefault() + { + var config = new TestUploadUwpPackageOperationConfig + { + OperationName = "UploadUwpPackage", + ProductId = "product-123", + BranchFriendlyName = "main", + PackageFilePath = "test.msixvc", + MarketGroupName = "" + }; + + ConfigTestHelper.ValidateConfig(config); + + Assert.AreEqual("default", config.MarketGroupName); + } +} diff --git a/src/PackageUploader.Application.Test/Config/UploadUwpPackageOperationConfigTest.cs b/src/PackageUploader.Application.Test/Config/UploadUwpPackageOperationConfigTest.cs new file mode 100644 index 00000000..c9b0deab --- /dev/null +++ b/src/PackageUploader.Application.Test/Config/UploadUwpPackageOperationConfigTest.cs @@ -0,0 +1,61 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using PackageUploader.ClientApi.Models; + +namespace PackageUploader.Application.Test.Config; + +[TestClass] +public class UploadUwpPackageOperationConfigTest +{ + [TestMethod] + public void Validate_MandatoryDateEnabledWithoutEffectiveDate_ReturnsError() + { + var config = new TestUploadUwpPackageOperationConfig + { + OperationName = "UploadUwpPackage", + ProductId = "product-123", + BranchFriendlyName = "main", + PackageFilePath = "test.msixvc", + MandatoryDate = new GamePackageDate { IsEnabled = true, EffectiveDate = null } + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.MemberNames.Contains("MandatoryDate"), results); + } + + [TestMethod] + public void Validate_MandatoryDateEnabledWithEffectiveDate_NoMandatoryError() + { + var config = new TestUploadUwpPackageOperationConfig + { + OperationName = "UploadUwpPackage", + ProductId = "product-123", + BranchFriendlyName = "main", + PackageFilePath = "test.msixvc", + MandatoryDate = new GamePackageDate { IsEnabled = true, EffectiveDate = DateTime.UtcNow.AddDays(1) } + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.DoesNotContain(r => r.MemberNames.Contains("MandatoryDate"), results); + } + + [TestMethod] + public void Validate_MandatoryDateDisabled_NoMandatoryError() + { + var config = new TestUploadUwpPackageOperationConfig + { + OperationName = "UploadUwpPackage", + ProductId = "product-123", + BranchFriendlyName = "main", + PackageFilePath = "test.msixvc", + MandatoryDate = new GamePackageDate { IsEnabled = false } + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.DoesNotContain(static r => r.MemberNames.Contains("MandatoryDate"), results); + } +} diff --git a/src/PackageUploader.Application.Test/Config/UploadXvcPackageOperationConfigTest.cs b/src/PackageUploader.Application.Test/Config/UploadXvcPackageOperationConfigTest.cs new file mode 100644 index 00000000..0665119d --- /dev/null +++ b/src/PackageUploader.Application.Test/Config/UploadXvcPackageOperationConfigTest.cs @@ -0,0 +1,86 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using PackageUploader.ClientApi.Models; + +namespace PackageUploader.Application.Test.Config; + +[TestClass] +public class UploadXvcPackageOperationConfigTest +{ + [TestMethod] + public void Validate_PreDownloadDateEnabledWithoutEffectiveDate_ReturnsError() + { + var config = new TestUploadXvcPackageOperationConfig + { + OperationName = "UploadXvcPackage", + ProductId = "product-123", + BranchFriendlyName = "main", + PackageFilePath = "test.msixvc", + GameAssets = new GameAssets { EkbFilePath = "ekb", SubValFilePath = "sub" }, + AvailabilityDate = new GamePackageDate { IsEnabled = true, EffectiveDate = DateTime.UtcNow.AddDays(2) }, + PreDownloadDate = new GamePackageDate { IsEnabled = true, EffectiveDate = null } + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.MemberNames.Contains("PreDownloadDate"), results); + } + + [TestMethod] + public void Validate_PreDownloadDateWithoutAvailabilityDate_ReturnsError() + { + var config = new TestUploadXvcPackageOperationConfig + { + OperationName = "UploadXvcPackage", + ProductId = "product-123", + BranchFriendlyName = "main", + PackageFilePath = "test.msixvc", + GameAssets = new GameAssets { EkbFilePath = "ekb", SubValFilePath = "sub" }, + PreDownloadDate = new GamePackageDate { IsEnabled = true, EffectiveDate = DateTime.UtcNow.AddDays(1) }, + AvailabilityDate = null + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.ErrorMessage!.Contains("needs AvailabilityDate"), results); + } + + [TestMethod] + public void Validate_PreDownloadDateAfterAvailabilityDate_ReturnsError() + { + var config = new TestUploadXvcPackageOperationConfig + { + OperationName = "UploadXvcPackage", + ProductId = "product-123", + BranchFriendlyName = "main", + PackageFilePath = "test.msixvc", + GameAssets = new GameAssets { EkbFilePath = "ekb", SubValFilePath = "sub" }, + AvailabilityDate = new GamePackageDate { IsEnabled = true, EffectiveDate = DateTime.UtcNow.AddDays(1) }, + PreDownloadDate = new GamePackageDate { IsEnabled = true, EffectiveDate = DateTime.UtcNow.AddDays(5) } + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.Contains(r => r.ErrorMessage!.Contains("needs to be before"), results); + } + + [TestMethod] + public void Validate_PreDownloadDateBeforeAvailabilityDate_NoPreDownloadError() + { + var config = new TestUploadXvcPackageOperationConfig + { + OperationName = "UploadXvcPackage", + ProductId = "product-123", + BranchFriendlyName = "main", + PackageFilePath = "test.msixvc", + GameAssets = new GameAssets { EkbFilePath = "ekb", SubValFilePath = "sub" }, + AvailabilityDate = new GamePackageDate { IsEnabled = true, EffectiveDate = DateTime.UtcNow.AddDays(5) }, + PreDownloadDate = new GamePackageDate { IsEnabled = true, EffectiveDate = DateTime.UtcNow.AddDays(1) } + }; + + var results = ConfigTestHelper.ValidateConfig(config); + + Assert.DoesNotContain(r => r.MemberNames.Contains("PreDownloadDate"), results); + } +} diff --git a/src/PackageUploader.Application.Test/Extensions/PackageUploaderExtensionsTest.cs b/src/PackageUploader.Application.Test/Extensions/PackageUploaderExtensionsTest.cs new file mode 100644 index 00000000..30989477 --- /dev/null +++ b/src/PackageUploader.Application.Test/Extensions/PackageUploaderExtensionsTest.cs @@ -0,0 +1,235 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using Moq; +using PackageUploader.Application.Extensions; +using PackageUploader.Application.Test.Config; +using PackageUploader.ClientApi; +using PackageUploader.ClientApi.Client.Ingestion.Models; + +namespace PackageUploader.Application.Test.Extensions; + +[TestClass] +public class PackageUploaderExtensionsTest +{ + private readonly Mock _serviceMock = new(); + private readonly CancellationToken _ct = CancellationToken.None; + + private static GameProduct CreateGameProduct(string productId = "prod-1", string bigId = "big-1", string productName = "Test") + { + var product = (GameProduct)System.Runtime.CompilerServices.RuntimeHelpers.GetUninitializedObject(typeof(GameProduct)); + typeof(GameProduct).GetProperty("ProductId")!.SetValue(product, productId); + typeof(GameProduct).GetProperty("BigId")!.SetValue(product, bigId); + typeof(GameProduct).GetProperty("ProductName")!.SetValue(product, productName); + return product; + } + + private static GamePackageBranch CreateGamePackageBranch(string name = "main") + { + var branch = (GamePackageBranch)System.Runtime.CompilerServices.RuntimeHelpers.GetUninitializedObject(typeof(GamePackageBranch)); + typeof(GamePackageBranch).GetProperty("Name")!.SetValue(branch, name); + return branch; + } + + private static GamePackageFlight CreateGamePackageFlight(string name = "flight-1") + { + var flight = (GamePackageFlight)System.Runtime.CompilerServices.RuntimeHelpers.GetUninitializedObject(typeof(GamePackageFlight)); + typeof(GamePackageFlight).GetProperty("Name")!.SetValue(flight, name); + return flight; + } + + #region GetProductAsync + + [TestMethod] + public async Task GetProductAsync_WithBigId_CallsGetProductByBigId() + { + var testProduct = CreateGameProduct(); + var config = new TestGetProductOperationConfig + { + OperationName = "GetProduct", + BigId = "big-123" + }; + _serviceMock.Setup(s => s.GetProductByBigIdAsync("big-123", _ct)).ReturnsAsync(testProduct); + + var result = await _serviceMock.Object.GetProductAsync(config, _ct); + + Assert.AreEqual(testProduct, result); + _serviceMock.Verify(s => s.GetProductByBigIdAsync("big-123", _ct), Times.Once); + } + + [TestMethod] + public async Task GetProductAsync_WithProductId_CallsGetProductByProductId() + { + var testProduct = CreateGameProduct(); + var config = new TestGetProductOperationConfig + { + OperationName = "GetProduct", + ProductId = "prod-123" + }; + _serviceMock.Setup(s => s.GetProductByProductIdAsync("prod-123", _ct)).ReturnsAsync(testProduct); + + var result = await _serviceMock.Object.GetProductAsync(config, _ct); + + Assert.AreEqual(testProduct, result); + _serviceMock.Verify(s => s.GetProductByProductIdAsync("prod-123", _ct), Times.Once); + } + + [TestMethod] + public async Task GetProductAsync_BigIdPrioritizedOverProductId() + { + var testProduct = CreateGameProduct(); + var config = new TestGetProductOperationConfig + { + OperationName = "GetProduct", + BigId = "big-123", + ProductId = "prod-123" + }; + _serviceMock.Setup(s => s.GetProductByBigIdAsync("big-123", _ct)).ReturnsAsync(testProduct); + + await _serviceMock.Object.GetProductAsync(config, _ct); + + _serviceMock.Verify(s => s.GetProductByBigIdAsync("big-123", _ct), Times.Once); + _serviceMock.Verify(s => s.GetProductByProductIdAsync(It.IsAny(), It.IsAny()), Times.Never); + } + + [TestMethod] + public async Task GetProductAsync_NeitherIdSet_ThrowsException() + { + var config = new TestGetProductOperationConfig { OperationName = "GetProduct" }; + + await Assert.ThrowsExactlyAsync(() => _serviceMock.Object.GetProductAsync(config, _ct)); + } + + [TestMethod] + public async Task GetProductAsync_NullService_ThrowsArgumentNullException() + { + var config = new TestGetProductOperationConfig { OperationName = "GetProduct", ProductId = "prod-1" }; + + await Assert.ThrowsExactlyAsync(() => + PackageUploaderExtensions.GetProductAsync(null!, config, _ct)); + } + + [TestMethod] + public async Task GetProductAsync_NullConfig_ThrowsArgumentNullException() + { + await Assert.ThrowsExactlyAsync(() => + _serviceMock.Object.GetProductAsync(null!, _ct)); + } + + #endregion + + #region GetGamePackageBranch + + [TestMethod] + public async Task GetGamePackageBranch_WithBranch_CallsGetByFriendlyName() + { + var testProduct = CreateGameProduct(); + var config = new TestGetPackagesOperationConfig + { + OperationName = "GetPackages", + ProductId = "prod-1", + BranchFriendlyName = "main" + }; + var branch = CreateGamePackageBranch("main"); + _serviceMock.Setup(s => s.GetPackageBranchByFriendlyNameAsync(testProduct, "main", _ct)) + .ReturnsAsync(branch); + + var result = await _serviceMock.Object.GetGamePackageBranch(testProduct, config, _ct); + + Assert.AreEqual(branch, result); + } + + [TestMethod] + public async Task GetGamePackageBranch_WithFlight_CallsGetByFlightName() + { + var testProduct = CreateGameProduct(); + var config = new TestGetPackagesOperationConfig + { + OperationName = "GetPackages", + ProductId = "prod-1", + FlightName = "flight-1" + }; + var flight = CreateGamePackageFlight("flight-1"); + _serviceMock.Setup(s => s.GetPackageFlightByFlightNameAsync(testProduct, "flight-1", _ct)) + .ReturnsAsync(flight); + + var result = await _serviceMock.Object.GetGamePackageBranch(testProduct, config, _ct); + + Assert.AreEqual(flight, result); + } + + [TestMethod] + public async Task GetGamePackageBranch_NeitherSet_ThrowsException() + { + var testProduct = CreateGameProduct(); + var config = new TestGetPackagesOperationConfig + { + OperationName = "GetPackages", + ProductId = "prod-1" + }; + + await Assert.ThrowsExactlyAsync(() => + _serviceMock.Object.GetGamePackageBranch(testProduct, config, _ct)); + } + + #endregion + + #region GetDestinationGamePackageBranch + + [TestMethod] + public async Task GetDestinationGamePackageBranch_WithDestBranch_CallsGetByFriendlyName() + { + var testProduct = CreateGameProduct(); + var config = new TestImportPackagesOperationConfig + { + OperationName = "ImportPackages", + ProductId = "prod-1", + BranchFriendlyName = "main", + DestinationBranchFriendlyName = "dest-branch" + }; + var branch = CreateGamePackageBranch("dest-branch"); + _serviceMock.Setup(s => s.GetPackageBranchByFriendlyNameAsync(testProduct, "dest-branch", _ct)) + .ReturnsAsync(branch); + + var result = await _serviceMock.Object.GetDestinationGamePackageBranch(testProduct, config, _ct); + + Assert.AreEqual(branch, result); + } + + [TestMethod] + public async Task GetDestinationGamePackageBranch_WithDestFlight_CallsGetByFlightName() + { + var testProduct = CreateGameProduct(); + var config = new TestImportPackagesOperationConfig + { + OperationName = "ImportPackages", + ProductId = "prod-1", + BranchFriendlyName = "main", + DestinationFlightName = "dest-flight" + }; + var flight = CreateGamePackageFlight("dest-flight"); + _serviceMock.Setup(s => s.GetPackageFlightByFlightNameAsync(testProduct, "dest-flight", _ct)) + .ReturnsAsync(flight); + + var result = await _serviceMock.Object.GetDestinationGamePackageBranch(testProduct, config, _ct); + + Assert.AreEqual(flight, result); + } + + [TestMethod] + public async Task GetDestinationGamePackageBranch_NeitherSet_ThrowsException() + { + var testProduct = CreateGameProduct(); + var config = new TestImportPackagesOperationConfig + { + OperationName = "ImportPackages", + ProductId = "prod-1", + BranchFriendlyName = "main" + }; + + await Assert.ThrowsExactlyAsync(() => + _serviceMock.Object.GetDestinationGamePackageBranch(testProduct, config, _ct)); + } + + #endregion +} diff --git a/src/PackageUploader.Application.Test/ParameterHelperIntegrationTest.cs b/src/PackageUploader.Application.Test/HostExtensionsIntegrationTest.cs similarity index 74% rename from src/PackageUploader.Application.Test/ParameterHelperIntegrationTest.cs rename to src/PackageUploader.Application.Test/HostExtensionsIntegrationTest.cs index 2469d10e..29924119 100644 --- a/src/PackageUploader.Application.Test/ParameterHelperIntegrationTest.cs +++ b/src/PackageUploader.Application.Test/HostExtensionsIntegrationTest.cs @@ -3,24 +3,24 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using PackageUploader.Application.Extensions; using PackageUploader.ClientApi.Client.Ingestion.TokenProvider; using PackageUploader.ClientApi.Client.Ingestion.TokenProvider.Config; using PackageUploader.ClientApi.Client.Ingestion.TokenProvider.Models; -using System.CommandLine.Invocation; -using System.CommandLine.Parsing; +using System.CommandLine; using System.Text.Json; namespace PackageUploader.Application.Test { [TestClass] - public class ParameterHelperIntegrationTest + public class HostExtensionsIntegrationTest { private string? _tempJsonFilePath; - private IConfigurationRoot? _configuration; - private Parser? _parser; + private ConfigurationManager? _configuration; + private RootCommand? _rootCommand; [TestInitialize] public void Initialize() @@ -45,8 +45,8 @@ public void Initialize() File.WriteAllText(_tempJsonFilePath, JsonSerializer.Serialize(configJson)); - // Set up parser - _parser = ParameterHelper.BuildCommandLine().Build(); + // Set up root command + _rootCommand = CommandLineHelper.BuildRootCommand(); } [TestCleanup] @@ -67,12 +67,13 @@ public void Parse_WithoutConfigFile_Fails() var args = new[] { "GetProduct" }; // Act - Assert.IsNotNull(_parser); - var result = _parser.Parse(args); + Assert.IsNotNull(_rootCommand); + var result = _rootCommand.Parse(args); // Assert - Assert.AreEqual(1, result.Errors.Count); - Assert.IsTrue(result.Errors[0].Message.Contains("Option '-c' is required.")); + Assert.HasCount(1, result.Errors); + Assert.IsTrue(result.Errors[0].Message.Contains("--ConfigFile") || result.Errors[0].Message.Contains("-c"), + $"Expected error about ConfigFile option, got: {result.Errors[0].Message}"); } [TestMethod] @@ -80,19 +81,14 @@ public void Parse_WithoutConfigFile_Fails() public void CommandLineParameter_OverridesConfigValue() { // Arrange - var configBuilder = new ConfigurationBuilder(); var args = new[] { "GetProduct", "--ConfigFile", _tempJsonFilePath!, "--ProductId", "override-product-id" }; - Assert.IsNotNull(_parser); - var result = _parser.Parse(args); - - // Mock the invocation context to get the option value - InvocationContext invocationContext = new(result); - var configFile = invocationContext.GetOptionValue(ParameterHelper.ConfigFileOption); - var authMethod = invocationContext.GetOptionValue(ParameterHelper.AuthenticationMethodOption); + Assert.IsNotNull(_rootCommand); + var result = _rootCommand.Parse(args); // Act - ParameterHelper.ConfigureParameters(configFile, authMethod, configBuilder, args); - _configuration = configBuilder.Build(); + var hostBuilder = Host.CreateEmptyApplicationBuilder(null); + hostBuilder.ConfigureAppConfiguration(result); + _configuration = hostBuilder.Configuration; // Assert Assert.AreEqual("override-product-id", _configuration["ProductId"]); @@ -134,7 +130,7 @@ public void AppSecret_RequiresClientSecret() Assert.IsTrue(string.IsNullOrEmpty(authInfo.ClientSecret)); // Act and Assert - verify exception is thrown due to missing ClientSecret - Assert.ThrowsException(() => + Assert.Throws(() => { var tokenProvider = new AzureApplicationSecretAccessTokenProvider( serviceProvider.GetRequiredService>(), @@ -191,18 +187,13 @@ public void Browser_AcceptsTenantId() "--Authentication", "Browser", "--TenantId", "my-tenant-id" }; - var configBuilder = new ConfigurationBuilder(); - Assert.IsNotNull(_parser); - var result = _parser.Parse(args); - - // Mock the invocation context to get the option value - InvocationContext invocationContext = new(result); - var configFile = invocationContext.GetOptionValue(ParameterHelper.ConfigFileOption); - var authMethod = invocationContext.GetOptionValue(ParameterHelper.AuthenticationMethodOption); + Assert.IsNotNull(_rootCommand); + var result = _rootCommand.Parse(args); // Act - ParameterHelper.ConfigureParameters(configFile, authMethod, configBuilder, args); - _configuration = configBuilder.Build(); + var hostBuilder = Host.CreateEmptyApplicationBuilder(null); + hostBuilder.ConfigureAppConfiguration(result); + _configuration = hostBuilder.Configuration; // Assert Assert.AreEqual("my-tenant-id", _configuration[$"{BrowserAuthInfo.ConfigName}:{nameof(BrowserAuthInfo.TenantId)}"]); @@ -219,18 +210,13 @@ public void CacheableBrowser_AcceptsTenantId() "--Authentication", "CacheableBrowser", "--TenantId", "my-cached-tenant-id" }; - var configBuilder = new ConfigurationBuilder(); - Assert.IsNotNull(_parser); - var result = _parser.Parse(args); - - // Mock the invocation context to get the option value - InvocationContext invocationContext = new(result); - var configFile = invocationContext.GetOptionValue(ParameterHelper.ConfigFileOption); - var authMethod = invocationContext.GetOptionValue(ParameterHelper.AuthenticationMethodOption); + Assert.IsNotNull(_rootCommand); + var result = _rootCommand.Parse(args); // Act - ParameterHelper.ConfigureParameters(configFile, authMethod, configBuilder, args); - _configuration = configBuilder.Build(); + var hostBuilder = Host.CreateEmptyApplicationBuilder(null); + hostBuilder.ConfigureAppConfiguration(result); + _configuration = hostBuilder.Configuration; // Assert Assert.AreEqual("my-cached-tenant-id", _configuration[$"{BrowserAuthInfo.ConfigName}:{nameof(BrowserAuthInfo.TenantId)}"]); @@ -261,18 +247,13 @@ public void ConfigFileValues_AreExtractedCorrectly() "--Authentication", "AppSecret" }; - var configBuilder = new ConfigurationBuilder(); - Assert.IsNotNull(_parser); - var result = _parser.Parse(args); - - // Mock the invocation context to get the option value - InvocationContext invocationContext = new(result); - var configFile = invocationContext.GetOptionValue(ParameterHelper.ConfigFileOption); - var authMethod = invocationContext.GetOptionValue(ParameterHelper.AuthenticationMethodOption); + Assert.IsNotNull(_rootCommand); + var result = _rootCommand.Parse(args); // Act - ParameterHelper.ConfigureParameters(configFile, authMethod, configBuilder, args); - _configuration = configBuilder.Build(); + var hostBuilder = Host.CreateEmptyApplicationBuilder(null); + hostBuilder.ConfigureAppConfiguration(result); + _configuration = hostBuilder.Configuration; // Assert Assert.AreEqual("product-from-config", _configuration["ProductId"]); @@ -298,18 +279,13 @@ public void AllCommandLineOptions_AreBoundCorrectly() "--Verbose" }; - var configBuilder = new ConfigurationBuilder(); - Assert.IsNotNull(_parser); - var result = _parser.Parse(args); - - // Mock the invocation context to get the option value - InvocationContext invocationContext = new(result); - var configFile = invocationContext.GetOptionValue(ParameterHelper.ConfigFileOption); - var authMethod = invocationContext.GetOptionValue(ParameterHelper.AuthenticationMethodOption); + Assert.IsNotNull(_rootCommand); + var result = _rootCommand.Parse(args); // Act - ParameterHelper.ConfigureParameters(configFile, authMethod, configBuilder, args); - _configuration = configBuilder.Build(); + var hostBuilder = Host.CreateEmptyApplicationBuilder(null); + hostBuilder.ConfigureAppConfiguration(result); + _configuration = hostBuilder.Configuration; // Assert Assert.AreEqual("product-from-cmd", _configuration["ProductId"]); diff --git a/src/PackageUploader.Application.Test/HostExtensionsTest.cs b/src/PackageUploader.Application.Test/HostExtensionsTest.cs new file mode 100644 index 00000000..a6f7e9a4 --- /dev/null +++ b/src/PackageUploader.Application.Test/HostExtensionsTest.cs @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using PackageUploader.Application.Extensions; +using System.CommandLine; + +namespace PackageUploader.Application.Test +{ + [TestClass] + public class HostExtensionsTest + { + [TestMethod] + [Description("Tests that AddAliasesToSwitchMappings correctly adds all option aliases")] + public void AddAliasesToSwitchMappings_AddsAllOptionAliases() + { + // Arrange + var option = new Option("--TestOption") { Description = "Test option description", Aliases = { "-t" } }; + var switchMappings = new Dictionary(); + var configPath = "TestConfig:TestValue"; + + // Act + option.AddAliasesToSwitchMappings(switchMappings, configPath); + + // Assert + Assert.HasCount(2, switchMappings, "Should have added name and alias"); + Assert.IsTrue(switchMappings.ContainsKey("-t"), "Short alias should be in dictionary"); + Assert.IsTrue(switchMappings.ContainsKey("--TestOption"), "Name should be in dictionary"); + Assert.AreEqual(configPath, switchMappings["-t"], "Short alias should map to config path"); + Assert.AreEqual(configPath, switchMappings["--TestOption"], "Long alias should map to config path"); + } + + [TestMethod] + [Description("Tests that AddAliasesToSwitchMappings works when no aliases are present")] + public void AddAliasesToSwitchMappings_WithEmptyAliases_DoesNotAddEntries() + { + // Assert + Assert.Throws(() => new Option(""), "Option must have a valid name"); + } + } +} diff --git a/src/PackageUploader.Application.Test/Models/ProductTest.cs b/src/PackageUploader.Application.Test/Models/ProductTest.cs new file mode 100644 index 00000000..04ddc074 --- /dev/null +++ b/src/PackageUploader.Application.Test/Models/ProductTest.cs @@ -0,0 +1,95 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using Moq; +using PackageUploader.Application.Models; +using PackageUploader.ClientApi.Client.Ingestion.Models; + +namespace PackageUploader.Application.Test.Models; + +[TestClass] +public class ProductTest +{ + private static GameProduct CreateGameProduct(string productId = "prod-1", string bigId = "big-1", string productName = "TestGame") + { + var product = (GameProduct)System.Runtime.CompilerServices.RuntimeHelpers.GetUninitializedObject(typeof(GameProduct)); + typeof(GameProduct).GetProperty("ProductId")!.SetValue(product, productId); + typeof(GameProduct).GetProperty("BigId")!.SetValue(product, bigId); + typeof(GameProduct).GetProperty("ProductName")!.SetValue(product, productName); + return product; + } + + [TestMethod] + public void Constructor_SortsBranchesAndFlights() + { + var gameProduct = CreateGameProduct(); + + var branch1 = new Mock(); + branch1.Setup(b => b.Name).Returns("main"); + branch1.Setup(b => b.BranchType).Returns(GamePackageBranchType.Branch); + + var flight1 = new Mock(); + flight1.Setup(b => b.Name).Returns("flight-alpha"); + flight1.Setup(b => b.BranchType).Returns(GamePackageBranchType.Flight); + + var branch2 = new Mock(); + branch2.Setup(b => b.Name).Returns("preview"); + branch2.Setup(b => b.BranchType).Returns(GamePackageBranchType.Branch); + + var branches = new List { branch1.Object, flight1.Object, branch2.Object }; + + var product = new Product(gameProduct, branches); + + Assert.AreEqual("prod-1", product.ProductId); + Assert.AreEqual("big-1", product.BigId); + Assert.AreEqual("TestGame", product.ProductName); + +#pragma warning disable CA1861 // Avoid constant arrays as arguments + CollectionAssert.AreEqual(new[] { "main", "preview" }, (List)product.BranchFriendlyNames); + CollectionAssert.AreEqual(new[] { "flight-alpha" }, (List)product.FlightNames); +#pragma warning restore CA1861 // Avoid constant arrays as arguments + } + + [TestMethod] + public void Constructor_NoBranches_EmptyLists() + { + var gameProduct = CreateGameProduct(); + + var product = new Product(gameProduct, []); + + Assert.IsEmpty(product.BranchFriendlyNames); + Assert.IsEmpty(product.FlightNames); + } + + [TestMethod] + public void ToJson_ValidProduct_ReturnsValidJson() + { + var gameProduct = CreateGameProduct(); + var product = new Product(gameProduct, []); + + var json = product.ToJson(); + + Assert.Contains("prod-1", json); + Assert.Contains("big-1", json); + Assert.Contains("TestGame", json); + } + + [TestMethod] + public void Constructor_AllFlights_NoBranches() + { + var gameProduct = CreateGameProduct(); + + var flight1 = new Mock(); + flight1.Setup(b => b.Name).Returns("flight-1"); + flight1.Setup(b => b.BranchType).Returns(GamePackageBranchType.Flight); + + var flight2 = new Mock(); + flight2.Setup(b => b.Name).Returns("flight-2"); + flight2.Setup(b => b.BranchType).Returns(GamePackageBranchType.Flight); + + var product = new Product(gameProduct, [flight1.Object, flight2.Object]); + + Assert.IsEmpty(product.BranchFriendlyNames); + Assert.HasCount(2, product.FlightNames); + } +} diff --git a/src/PackageUploader.Application.Test/Operations/OperationTest.cs b/src/PackageUploader.Application.Test/Operations/OperationTest.cs new file mode 100644 index 00000000..53e7d406 --- /dev/null +++ b/src/PackageUploader.Application.Test/Operations/OperationTest.cs @@ -0,0 +1,67 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using Microsoft.Extensions.Logging; +using Moq; +using PackageUploader.Application.Operations; + +namespace PackageUploader.Application.Test.Operations; + +internal class TestOperation(ILogger logger, Func processAction) : Operation(logger) +{ + protected override Task ProcessAsync(CancellationToken ct) => processAction(ct); +} + +[TestClass] +public class OperationTest +{ + private readonly Mock _loggerMock = new(); + + [TestMethod] + public async Task RunAsync_Success_ReturnsZero() + { + var operation = new TestOperation(_loggerMock.Object, _ => Task.CompletedTask); + + var result = await operation.RunAsync(CancellationToken.None); + + Assert.AreEqual(0, result); + } + + [TestMethod] + public async Task RunAsync_ExceptionThrown_ReturnsThree() + { + var operation = new TestOperation(_loggerMock.Object, _ => throw new InvalidOperationException("test error")); + + var result = await operation.RunAsync(CancellationToken.None); + + Assert.AreEqual(3, result); + } + + [TestMethod] + public async Task RunAsync_CancellationRequested_ReturnsOne() + { + using var cts = new CancellationTokenSource(); + var operation = new TestOperation(_loggerMock.Object, ct => + { + cts.Cancel(); + ct.ThrowIfCancellationRequested(); + return Task.CompletedTask; + }); + + var result = await operation.RunAsync(cts.Token); + + Assert.AreEqual(1, result); + } + + [TestMethod] + public async Task RunAsync_ExceptionWithCancellation_ReturnsOne() + { + using var cts = new CancellationTokenSource(); + cts.Cancel(); + var operation = new TestOperation(_loggerMock.Object, _ => throw new OperationCanceledException()); + + var result = await operation.RunAsync(cts.Token); + + Assert.AreEqual(1, result); + } +} diff --git a/src/PackageUploader.Application.Test/PackageUploader.Application.Test.csproj b/src/PackageUploader.Application.Test/PackageUploader.Application.Test.csproj index 169075a7..f8ff5492 100644 --- a/src/PackageUploader.Application.Test/PackageUploader.Application.Test.csproj +++ b/src/PackageUploader.Application.Test/PackageUploader.Application.Test.csproj @@ -1,20 +1,21 @@ - + - net8.0 - 12.0 + net10.0 + false enable enable + true + true + true - - - - - - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/PackageUploader.Application.Test/ParameterHelperTest.cs b/src/PackageUploader.Application.Test/ParameterHelperTest.cs deleted file mode 100644 index 519e04ca..00000000 --- a/src/PackageUploader.Application.Test/ParameterHelperTest.cs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using Microsoft.Extensions.Configuration; -using Moq; -using PackageUploader.Application.Test.Extensions; -using PackageUploader.ClientApi; -using System.CommandLine; - -namespace PackageUploader.Application.Test -{ - [TestClass] - public class ParameterHelperTest - { - [TestMethod] - [Description("Verifies that the ConfigFileOption is marked as required")] - public void ConfigFileOption_IsRequired() - { - // Assert - Assert.IsTrue(ParameterHelper.ConfigFileOption.IsRequired); - } - - [TestMethod] - [Description("Verifies that the BuildCommandLine method correctly builds a command line with all the expected commands")] - public void BuildCommandLine_BuildsCommandLineWithAllCommands() - { - // Act - var commandLineBuilder = ParameterHelper.BuildCommandLine(); - var rootCommand = commandLineBuilder.Command as RootCommand; - - // Assert - Assert.IsNotNull(rootCommand); - - // Expect 9 children (7 commands and 2 global options) - Assert.AreEqual(9, rootCommand.Children.Count()); - - // Verify command names - var commandNames = rootCommand.Children.OfType().Select(c => c.Name).ToList(); - Assert.IsTrue(commandNames.Contains("GetProduct")); - Assert.IsTrue(commandNames.Contains("UploadUwpPackage")); - Assert.IsTrue(commandNames.Contains("UploadXvcPackage")); - Assert.IsTrue(commandNames.Contains("RemovePackages")); - Assert.IsTrue(commandNames.Contains("ImportPackages")); - Assert.IsTrue(commandNames.Contains("PublishPackages")); - Assert.IsTrue(commandNames.Contains("GetPackages")); - - // Verify global options - Assert.IsTrue(rootCommand.Options.Contains(ParameterHelper.VerboseOption)); - Assert.IsTrue(rootCommand.Options.Contains(ParameterHelper.LogFileOption)); - Assert.AreEqual("Application that enables game developers to upload Xbox and PC game packages to Partner Center", rootCommand.Description); - } - - [TestMethod] - [Description("Verifies default authentication method is AppSecret")] - public void AuthenticationMethodOption_DefaultIsAppSecret() - { - // Assert - Use our custom extension method - Assert.AreEqual(IngestionExtensions.AuthenticationMethod.AppSecret, - ParameterHelper.AuthenticationMethodOption.GetDefaultValue()); - } - } -} \ No newline at end of file diff --git a/src/PackageUploader.Application.Test/ProgramExtensionsTest.cs b/src/PackageUploader.Application.Test/ProgramExtensionsTest.cs deleted file mode 100644 index 616d821a..00000000 --- a/src/PackageUploader.Application.Test/ProgramExtensionsTest.cs +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using PackageUploader.Application.Extensions; -using System.CommandLine; - -namespace PackageUploader.Application.Test -{ - [TestClass] - public class ProgramExtensionsTest - { - [TestMethod] - [Description("Tests that AddAliasesToSwitchMappings correctly adds all option aliases")] - public void AddAliasesToSwitchMappings_AddsAllOptionAliases() - { - // Arrange - var option = new Option(["-t", "--TestOption"], "Test option description"); - var switchMappings = new Dictionary(); - var configPath = "TestConfig:TestValue"; - - // Act - option.AddAliasesToSwitchMappings(switchMappings, configPath); - - // Assert - Assert.AreEqual(2, switchMappings.Count, "Should have added 2 aliases"); - Assert.IsTrue(switchMappings.ContainsKey("-t"), "Short alias should be in dictionary"); - Assert.IsTrue(switchMappings.ContainsKey("--TestOption"), "Long alias should be in dictionary"); - Assert.AreEqual(configPath, switchMappings["-t"], "Short alias should map to config path"); - Assert.AreEqual(configPath, switchMappings["--TestOption"], "Long alias should map to config path"); - } - - [TestMethod] - [ExpectedException(typeof(ArgumentException), "Option must have at least one alias")] - [Description("Tests that AddAliasesToSwitchMappings works when no aliases are present")] - public void AddAliasesToSwitchMappings_WithEmptyAliases_DoesNotAddEntries() - { - // Arrange - // Create option with an empty array of aliases - var option = new Option([], "Empty aliases option"); - var switchMappings = new Dictionary(); - var configPath = "TestConfig:TestValue"; - - // Act - option.AddAliasesToSwitchMappings(switchMappings, configPath); - - // Assert - Assert.AreEqual(0, switchMappings.Count, "Should not have added any entries"); - } - - [TestMethod] - [Description("Tests that Required extension method correctly sets IsRequired")] - public void Required_SetsIsRequiredProperty() - { - // Arrange - var option = new Option(["-t", "--TestOption"], "Test option description"); - - // Act - var result = option.Required(); - - // Assert - Assert.IsTrue(result.IsRequired, "Option should be marked as required"); - Assert.AreEqual(option, result, "Should return the same option instance"); - - // Test setting to false - result = option.Required(false); - Assert.IsFalse(result.IsRequired, "Option should be marked as not required"); - } - } -} \ No newline at end of file diff --git a/src/PackageUploader.Application.Test/packages.lock.json b/src/PackageUploader.Application.Test/packages.lock.json new file mode 100644 index 00000000..afb65ea9 --- /dev/null +++ b/src/PackageUploader.Application.Test/packages.lock.json @@ -0,0 +1,617 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "coverlet.collector": { + "type": "Direct", + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "WFejCcOUR6k8UYyDnnR6Gk+obFYMsWrZuNqPJnsVFGVhpPSN0y20D4qbdKJnXinYGx9PQ397Hf9TnU1NBST8vA==" + }, + "Microsoft.Testing.Extensions.CodeCoverage": { + "type": "Direct", + "requested": "[18.5.2, )", + "resolved": "18.5.2", + "contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==", + "dependencies": { + "Microsoft.DiaSymReader": "2.2.3", + "Microsoft.Extensions.DependencyModel": "8.0.2", + "Microsoft.Testing.Platform": "2.1.0" + } + }, + "Microsoft.Testing.Extensions.TrxReport": { + "type": "Direct", + "requested": "[2.2.1, )", + "resolved": "2.2.1", + "contentHash": "FWaktPQHSiZh/+2ft2PHH/4bLlg8BKlrbLiil8mRcpoP0oHzKpgBfmN3QepGlAbxG0yDrZGN8tuPy77FYdEaMw==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.2.1", + "Microsoft.Testing.Platform": "2.2.1" + } + }, + "Moq": { + "type": "Direct", + "requested": "[4.20.72, )", + "resolved": "4.20.72", + "contentHash": "EA55cjyNn8eTNWrgrdZJH5QLFp2L43oxl1tlkoYUKIE9pRwL784OWiTXeCV5ApS+AMYEAlt7Fo03A2XfouvHmQ==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, + "MSTest.TestAdapter": { + "type": "Direct", + "requested": "[4.2.1, )", + "resolved": "4.2.1", + "contentHash": "lZRgNzaQnffK4XLjM/og4Eoqp/3IkpcyJQQcyKXkPdkzCT3+ghpwHa9zG1xYhQDbUFoc54M+/waLwh31K9stDQ==", + "dependencies": { + "MSTest.TestFramework": "4.2.1", + "Microsoft.Testing.Extensions.VSTestBridge": "2.2.1", + "Microsoft.Testing.Platform.MSBuild": "2.2.1" + } + }, + "MSTest.TestFramework": { + "type": "Direct", + "requested": "[4.2.1, )", + "resolved": "4.2.1", + "contentHash": "I4/RbS2TpGZ56CE98+jPbrGlcerYtw2LvPVKzQGvyQQcJDekPy2Kd+fnThXYn+geJ1sW+vA9B7++rFNxvKcWxA==", + "dependencies": { + "MSTest.Analyzers": "4.2.1" + } + }, + "Azure.Core": { + "type": "Transitive", + "resolved": "1.54.0", + "contentHash": "m6hHbx1q9+GCBZ5A9ykzFylPdTwscX2APH7PlnqV+yu+DH3RRtuIDJMRqdU17cMyinv0hCPofpegoyQ6qWPW7g==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.3", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.3", + "Microsoft.Identity.Client": "4.83.1", + "Microsoft.Identity.Client.Extensions.Msal": "4.83.1", + "System.ClientModel": "1.10.0", + "System.Memory.Data": "10.0.3" + } + }, + "Azure.Identity": { + "type": "Transitive", + "resolved": "1.21.0", + "contentHash": "GeFv8sGwRKvDKwI2WFy8r0mhmlxEVZg24Sit2NogTjiSO8RVjllWM65OT6e1sKjOvG8V74y7hAbaELUUPjZQSw==", + "dependencies": { + "Azure.Core": "1.53.0" + } + }, + "Azure.Storage.Blobs": { + "type": "Transitive", + "resolved": "12.27.0", + "contentHash": "zI5rg1tTtnA8T2g2/21l+1iIUdDjpEQQ0FI1BabJVEQJ1JUyTQKrc41eNabAHs0SBHprl6pu/6OqIMK9Ve+4tQ==", + "dependencies": { + "Azure.Core": "1.50.0", + "Azure.Storage.Common": "12.26.0" + } + }, + "Azure.Storage.Common": { + "type": "Transitive", + "resolved": "12.26.0", + "contentHash": "XaT6CDcSshZb7KaCTwc6m4EouZbLBg7ciOEpsJSdJCvkNsZJQCvPKw7V5TtXno19AA1NpwtsZriYque8mzbQVg==", + "dependencies": { + "Azure.Core": "1.50.0", + "System.IO.Hashing": "10.0.1" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "TV62UsrJZPX6gbt3c4WrtXh7bmaDIcMqf9uft1cc4L6gJXOU07hDGEh+bFQh/L2Az0R1WVOkiT66lFqS6G2NmA==" + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "2.2.3", + "contentHash": "bhwzJfzyiJM0nXJyNB7Y9OfsEXyxLdDBHG99soIp5JjnPydwkOaBdRCtRtWgQh3noSLi2cSIZ/wpbHNNE9knxQ==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "wZbGh7J8R1vXN525O6d8dlcDTxhRTnd5MyW4LdfP5S0tSnTwTCseYSrq6g0Mxh7W9xn8P/2xPuf0D/m6k2dy2w==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "t56nEgvECcyLPojZIUFWJknQQDAbgfTf9J+QMYJE1YYvVgz69vN6B/AKL8Grvj3Lcnp8kTpNqwmwFhb3YLJmtQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.7" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "8bS1qIaRivny+WX+49pmeJ6iAylbtX8C0DLEcCQWZjdxQvLqaMssXiGD9P/6pYElrHbK5/nAHmjbQ8STqdMYeg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7" + } + }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "3lNjglxfFxOzI9zG+3HSg/YSGqo//8Fqw6u6iuIamZb4JCorbA3JLaeWOpfKTAPi2UJwaispOXWx14dUqcGz4A==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "TWto3imA+mJMLZI+5sbgLiFFoOFNFkizQYNaC5jTuiHKn3diwm1RN7mWDOEZN9kG2bixw7IvgpvtUG5/teSRzA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "qbZLvLsoTdArSloEnSxs21P781YUmwVmHc5NJPQD/ezAreQ7884z+6QfAZVKi86WAZtzx83jK2uC4itxOM44gQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", + "Microsoft.Extensions.FileProviders.Physical": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "64dimvyyKk0dbUbrLg/YCv4ugJ4sVz2aXLwfvZwR1EC4tJqW9ru/oVRcXwoJRa2lQGXtYtlpk4maWOeIb48tQw==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.FileExtensions": "10.0.7", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7" + } + }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "YqVIICoIdl0016wkeO2WQS+uEbEXbUhMLKdC5rZNl1X3nu59F+nwaAHdHjq/4OK+Cx31DYmNUSFh+MUot8qSDw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Json": "10.0.7", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", + "Microsoft.Extensions.FileProviders.Physical": "10.0.7" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "91F/o3emPV/+xY/ip3s2LqDNF14kjttlVtq0BXgg6p4MnCzeSZxnUJm+t6WRrtD3JdGo88/oX+z7OwK4y8PZuw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "Z6mfFEaFcwCfSboxJwOLfu7/31npCY9q70WUamHW/vRQhDvBKOT4Vf9YkZj5J6hLvJpb0oDEYfHunQZj0xxvKw==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" + }, + "Microsoft.Extensions.Diagnostics": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "l+smp1qPlU0OUXD0OGfdp7OUFrbdq7ZaP5T7m2WpfZ4RFKD7iG73BAT7tjSMxNmbSXkhAn1jYHOAqzYG1r9sNg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.7", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.7" + } + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "uJ9JP677y+uy+C0vtaSfi7XXgFAdz8DhU3M9lwwIXDfQKcyQ0yxM9DVYa0NXDtdVTYA2eBUtVFZ8LY0GCdeE/w==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "teioDgVpi8L186wUfrXQV1YuBt6lCSPmFZiMZo53+FZxHFjOV+f4GXo4LXgJ273Mku9//AdXWVjk9J7eJP6inw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.7" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "zhgWg/i0ECj5v0jLFBSZHplvc5ygCI91DR4nne+BP4XAKF5ycz0pEKnFiTw8C1jCABJEZsnBZh6pXAvn71kFmw==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", + "Microsoft.Extensions.FileSystemGlobbing": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "NTUspqB+vH9g4wAD6KPOBx01xqYuKXR/cHXm449zpbq1GqfjdAxBmg7eJXrNsPw7SKwIdT2cJ05GxYVvc+lvsA==" + }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "M/vBpfWcschvS2EUeq7cHfscsxabiGTptXwV7GeSueovGiSoNjyo1j5PMcWuOAAQrRW3nRqxZk8NeumrmpzUBg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Binder": "10.0.7", + "Microsoft.Extensions.Configuration.CommandLine": "10.0.7", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "10.0.7", + "Microsoft.Extensions.Configuration.FileExtensions": "10.0.7", + "Microsoft.Extensions.Configuration.Json": "10.0.7", + "Microsoft.Extensions.Configuration.UserSecrets": "10.0.7", + "Microsoft.Extensions.DependencyInjection": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Diagnostics": "10.0.7", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", + "Microsoft.Extensions.FileProviders.Physical": "10.0.7", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging.Configuration": "10.0.7", + "Microsoft.Extensions.Logging.Console": "10.0.7", + "Microsoft.Extensions.Logging.Debug": "10.0.7", + "Microsoft.Extensions.Logging.EventLog": "10.0.7", + "Microsoft.Extensions.Logging.EventSource": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "5s8d6qC6EA8UOI4wR/+zlsq7SXttJMRb9d7zvVZ7+bE3CQEfVtC9ITUDCommm87R1zzj6WJBbCnztuIJXnP3DA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.7", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7" + } + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "1wbd+RPhRo3hJKNJhdGEO5ls0LGe55Ho4BUjlFtRUrWxDVVBd7g0Ydq9fbNy86pmvx/j7AGcSPo7YNCo1IRI6Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Diagnostics": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" + } + }, + "Microsoft.Extensions.Http.Polly": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "pcUsPoqMHvOp+QJsLA/Hlg/W+IBnAoUXKEBc7FqMcY0sUez15DOKXtbEo81TvHL9xwjWQcF3ZMayNpcvpI7Bqg==", + "dependencies": { + "Microsoft.Extensions.Http": "10.0.7", + "Polly": "7.2.4", + "Polly.Extensions.Http": "3.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "hOeRIQ63GkgiYCB/MIFp+LQs8aXpJXpB55t6Aj37ab7t2/6WeFcPXxYM9hdy/o5tffzwf8mhqzLJP6mjGYCxjw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "tIEcQ2gvERrH2KiCjdsVcHGhXt9lIsuDStfOIeZWr7/fP8IXhGiYfx0/80PNI7WPO2IYuFtlZLSlnTS8+/Mchw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" + } + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "7BBnoGF37USiu7j434put9mDp7EjdlNDIZsR4vHfC1FbLZeLqiWjgJbeEtF0p59Ryqt8AtraHawf0ZKbe5jibg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Binder": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.7" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "DA++Es6v6W0HfrOrw+K8WyN6jNnZHp640PDdEvl8yfeVmgflKdn6vSSFvufNUSOuY+M2ZaSUgfY+jUKtNpXcCw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging.Configuration": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "Y6DSt/JZApunYWKqTtqbdsR6iqAvHx3D0tavbNJ1rnC24MUpF+3XO/VKgFi+9PFqMyvQ2GHBBGb8H3cLSw7rDg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "1C8eTuxF6BLncNSJ1HCfmaBcjpUSqQDPlBVdYTlet9oldHTPpNh9iatxSJLs8TOqdp/FOpH+nSLdBve7fu9mTQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "System.Diagnostics.EventLog": "10.0.7" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "YWfndnDX1jVMGCN8d5T+rO+BO8sDw6BkYlUk0BYui+WP7+HhlWx8QLdA4yUDjrkGVb3AQxIWWEPVKw5Nnfj5GQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "00SHUGTh2jSMvIr6x9Xwd2nE+B5/qFCO/9hDwUDhJsjYRDlADmaBZ7tqehXzBDsfjHSXJzuRHJzPYPPjphBQ7Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "IT7f+EMXZtkjatEcF+o6aOw/7OE4etRrMiDGEWH/iiTu2R3uhC4NEQJCfHiibtX45U3sIQ5Fh6tbb1qaOz3YAg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Binder": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" + } + }, + "Microsoft.Extensions.Options.DataAnnotations": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "KWepqdSD4PxhFvVh3mckkvJ03u3q/VChkr6nT3nf5mm2XBk8ojxt2E4It0RMblb3GE7hJ0zQzFzxGKL0d6TfXA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "D5M0Jr551iTgwkZMN9rm0pSkgNLj5quUWQUmQPMZh7k/bnvZTnXRGfE2KuvXf1EEjt/ofD9yw9IumpgdP9QCnw==" + }, + "Microsoft.Identity.Client": { + "type": "Transitive", + "resolved": "4.83.1", + "contentHash": "jOLIrZ3cynoqHLLO1cXplFFabrhrMEYs/EuKHvmCyrOm1axqiVFT6nCSnHxk7w5+d2BeQfCdM12Yf/0X7OeS1g==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.14.0" + } + }, + "Microsoft.Identity.Client.Extensions.Msal": { + "type": "Transitive", + "resolved": "4.83.1", + "contentHash": "I3k4J4Hj4KbLEFanjeUzzDOVecukETaTgEkJ7h2pP/Yazs6SLp6TVUTo/Eo+ptPXMwvc+iX7rBFtMSUrA7R+Mg==", + "dependencies": { + "Microsoft.Identity.Client": "4.83.1", + "System.Security.Cryptography.ProtectedData": "4.5.0" + } + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "8.14.0", + "contentHash": "iwbCpSjD3ehfTwBhtSNEtKPK0ICun6ov7Ibx6ISNA9bfwIyzI2Siwyi9eJFCJBwxowK9xcA1mj+jBWiigeqgcQ==" + }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "7zB8BjffOyvqfHF26rFVPuK0w1fCf5+j1tLuhHIr76CqxXkGb+fMJtq6YNOV+m6qPytExHMXxluk3RgJ+dSIqw==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "2.2.1" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "RD6D1Jx6cKDA5IHd1H2q8ylIuQG3PD+gdULI0JC8CvsRtaypFzTFpB5xDPuQi8o6kAkcM04cBhAiJPxZboNH2Q==", + "dependencies": { + "Microsoft.Testing.Platform": "2.2.1" + } + }, + "Microsoft.Testing.Extensions.VSTestBridge": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "D8AGlkNtlTQPe3zf4SLnHBMr13lerMe0RuHSoRfnRatcuX/T7YbRtgn39rWBjKhXsNio0WXKrPKv3gfWE2I46w==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "18.3.0", + "Microsoft.Testing.Extensions.Telemetry": "2.2.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.2.1", + "Microsoft.Testing.Platform": "2.2.1" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "9bbPuls/b6/vUFzxbSjJLZlJHyKBfOZE5kjIY+ITI2ASqlFPJhR83BdLydJeQOCLEZhEbrEcz5xtt1B69nwSVg==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "CSJOcZHfKlTyPbS0CTJk6iEnU4gJC+eUA5z72UBnMDRdgVHYOmB8k9Y7jT233gZjnCOQiYFg3acQHRfu2H62nw==", + "dependencies": { + "Microsoft.Testing.Platform": "2.2.1" + } + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "18.3.0", + "contentHash": "AEIEX2aWdPO9XbtR96eBaJxmXRD9vaI9uQ1T/JbPEKlTAZwYx0ZrMzKyULMdh/HH9Sg03kXCoN7LszQ90o6nPQ==" + }, + "MSTest.Analyzers": { + "type": "Transitive", + "resolved": "4.2.1", + "contentHash": "1i9jgE/42KGGyZ4s0MdrYM/Uu/dRYhbRfYQifcO0AZ6vw4sBXRjoQGQRGNSm771AYgPAmoGl0u4sJc2lMET6HQ==" + }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + }, + "Polly.Contrib.WaitAndRetry": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "1MUQLiSo4KDkQe6nzQRhIU05lm9jlexX5BVsbuw0SL82ynZ+GzAHQxJVDPVBboxV37Po3SG077aX8DuSy8TkaA==" + }, + "Polly.Extensions.Http": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "drrG+hB3pYFY7w1c3BD+lSGYvH2oIclH8GRSehgfyP5kjnFnHKQuuBhuHLv+PWyFuaTDyk/vfRpnxOzd11+J8g==", + "dependencies": { + "Polly": "7.1.0" + } + }, + "System.ClientModel": { + "type": "Transitive", + "resolved": "1.10.0", + "contentHash": "lBEWs54F5Y5pZ9hC+8z4S/X76957ex+DPk7WecRHlbIHtrPfbRMMlOgI3iDn4Jpb3bSxvBnKaaHoD59auFjlBA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.3", + "Microsoft.Extensions.Logging.Abstractions": "10.0.3", + "System.Memory.Data": "10.0.3" + } + }, + "System.CommandLine": { + "type": "Transitive", + "resolved": "2.0.7", + "contentHash": "ih4yNLLF2Ebz85xJJBaPeddLa4d1AekYId7Y1g8oSsEaBHHd/CtyeBJ+tDvQadqeXz7i591K5ry/td+4aaHnQA==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "10.0.7", + "contentHash": "WbmDLeTPYhEzXhvYVioTVn/D1XX6bovyny9n5p8Zxtf03+eY385RB818teZm6n+fA63iZNvng0/Np4tLuhkMhQ==" + }, + "System.Interactive.Async": { + "type": "Transitive", + "resolved": "7.0.1", + "contentHash": "oL1iox7sAJL8i+muGzVMQjDB0axQgOoT5CkwYdap8cQJMkWDWMRErNqhOcZkn31+aKr/uCfgMEdhUARCU4G7gg==" + }, + "System.IO.Hashing": { + "type": "Transitive", + "resolved": "10.0.1", + "contentHash": "Dy6ULPb2S0GmNndjKrEIpfibNsc8+FTOoZnqygtFDuyun8vWboQbfMpQtKUXpgTxokR5E4zFHETpNnGfeWY6NA==" + }, + "System.Linq.Async": { + "type": "Transitive", + "resolved": "7.0.1", + "contentHash": "gwQtBHVY/WgqWgAYSe4JspXR+f1FvMbVIW4ixsJpGV/Kj8Nun3zp1ajIdvCWfmac8ektJGVLiJ/OR8JU9nZnMg==", + "dependencies": { + "System.Interactive.Async": "7.0.1" + } + }, + "System.Memory.Data": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "MaGhRfGunmrj/nHjtsi9XkhlYJ/ERGWrbA+BiSKNtGnAjc9XlG5EhAvak6VRcX5LYzPF6pBO8nJ613dTgzabig==" + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "wLBKzFnDCxP12VL9ANydSYhk59fC4cvOr9ypYQLPnAj48NQIhqnjdD2yhP8yEKyBJEjERWS9DisKL7rX5eU25Q==" + }, + "PackageUploader": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Configuration.Binder": "[10.0.7, )", + "Microsoft.Extensions.Configuration.Json": "[10.0.7, )", + "Microsoft.Extensions.Hosting": "[10.0.7, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.7, )", + "PackageUploader.ClientApi": "[1.0.0, )", + "PackageUploader.FileLogger": "[1.0.0, )", + "System.CommandLine": "[2.0.7, )" + } + }, + "packageuploader.clientapi": { + "type": "Project", + "dependencies": { + "Azure.Core": "[1.54.0, )", + "Azure.Identity": "[1.21.0, )", + "Azure.Storage.Blobs": "[12.27.0, )", + "Microsoft.Extensions.Configuration.Binder": "[10.0.7, )", + "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.7, )", + "Microsoft.Extensions.Http": "[10.0.7, )", + "Microsoft.Extensions.Http.Polly": "[10.0.7, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.7, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.7, )", + "Polly.Contrib.WaitAndRetry": "[1.1.1, )", + "System.Linq.Async": "[7.0.1, )" + } + }, + "packageuploader.filelogger": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Logging": "[10.0.7, )", + "Microsoft.Extensions.Logging.Configuration": "[10.0.7, )" + } + } + } + } +} \ No newline at end of file diff --git a/src/PackageUploader.Application/ParameterHelper.cs b/src/PackageUploader.Application/CommandLineHelper.cs similarity index 50% rename from src/PackageUploader.Application/ParameterHelper.cs rename to src/PackageUploader.Application/CommandLineHelper.cs index 7b69093b..5271801f 100644 --- a/src/PackageUploader.Application/ParameterHelper.cs +++ b/src/PackageUploader.Application/CommandLineHelper.cs @@ -1,37 +1,31 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -using Microsoft.Extensions.Configuration; -using PackageUploader.Application.Config; -using PackageUploader.Application.Extensions; using PackageUploader.Application.Operations; using PackageUploader.ClientApi; -using PackageUploader.ClientApi.Client.Ingestion.TokenProvider.Models; -using System.Collections.Generic; using System.CommandLine; -using System.CommandLine.Builder; using System.IO; namespace PackageUploader.Application { - internal class ParameterHelper + internal static class CommandLineHelper { // Options - internal static readonly Option DataOption = new(["-d", "--Data"], "Do not log on console and only return data"); - internal static readonly Option VerboseOption = new(["-v", "--Verbose"], "Log verbose messages such as http calls"); - internal static readonly Option LogFileOption = new(["-l", "--LogFile"], "The location of the log file"); - internal static readonly Option ClientSecretOption = new(["-s", "--ClientSecret"], "The client secret of the AAD app (only for AppSecret)"); - internal static readonly Option TenantIdOption = new(["-t", "--TenantId"], "The Azure tenant ID to use for authentication (primarily for Browser authentication)"); - internal static readonly Option ConfigFileOption = new Option(["-c", "--ConfigFile"], "The location of the config file").Required(); - internal static readonly Option AuthenticationMethodOption = new(["-a", "--Authentication"], () => IngestionExtensions.AuthenticationMethod.AppSecret, "The authentication method"); - internal static readonly Option ProductIdOption = new(["-p", "--ProductId"], "Product ID, replaces config value productId if present"); - internal static readonly Option BigIdOption = new(["-b", "--BigId"], "Big ID, replaces config value bigId if present"); - internal static readonly Option BranchFriendlyNameOption = new(["-bf", "--BranchFriendlyName"], "Branch Friendly Name, replaces config value branchFriendlyName if present"); - internal static readonly Option FlightNameOption = new(["-f", "--FlightName"], "Flight Name, replaces config value flightName if present"); - internal static readonly Option MarketGroupNameOption = new(["-m", "--MarketGroupName"], "Market Group Name, replaces config value marketGroupName if present"); - internal static readonly Option DestinationSandboxName = new(["-ds", "--DestinationSandboxName"], "Destination Sandbox Name, replaces config value destinationSandboxName if present"); + internal static readonly Option DataOption = new("--Data", "-d") { Description = "Do not log on console and only return data" }; + internal static readonly Option VerboseOption = new("--Verbose", "-v") { Description = "Log verbose messages such as http calls", Recursive = true }; + internal static readonly Option LogFileOption = new("--LogFile", "-l") { Description = "The location of the log file", Recursive = true }; + internal static readonly Option ClientSecretOption = new("--ClientSecret", "-s") { Description = "The client secret of the AAD app (only for AppSecret)" }; + internal static readonly Option TenantIdOption = new("--TenantId", "-t") { Description = "The Azure tenant ID to use for authentication (primarily for Browser authentication)" }; + internal static readonly Option ConfigFileOption = new("--ConfigFile", "-c") { Description = "The location of the config file", Required = true }; + internal static readonly Option AuthenticationMethodOption = new("--Authentication", "-a") { Description = "The authentication method", DefaultValueFactory = _ => IngestionExtensions.AuthenticationMethod.AppSecret }; + internal static readonly Option ProductIdOption = new("--ProductId", "-p") { Description = "Product ID, replaces config value productId if present" }; + internal static readonly Option BigIdOption = new("--BigId", "-b") { Description = "Big ID, replaces config value bigId if present" }; + internal static readonly Option BranchFriendlyNameOption = new("--BranchFriendlyName", "-bf") { Description = "Branch Friendly Name, replaces config value branchFriendlyName if present" }; + internal static readonly Option FlightNameOption = new("--FlightName", "-f") { Description = "Flight Name, replaces config value flightName if present" }; + internal static readonly Option MarketGroupNameOption = new("--MarketGroupName", "-m") { Description = "Market Group Name, replaces config value marketGroupName if present" }; + internal static readonly Option DestinationSandboxName = new("--DestinationSandboxName", "-ds") { Description = "Destination Sandbox Name, replaces config value destinationSandboxName if present" }; - internal static CommandLineBuilder BuildCommandLine() + internal static RootCommand BuildRootCommand() { var rootCommand = new RootCommand { @@ -64,42 +58,16 @@ internal static CommandLineBuilder BuildCommandLine() ConfigFileOption, ClientSecretOption, TenantIdOption, AuthenticationMethodOption, DataOption, ProductIdOption, BigIdOption, BranchFriendlyNameOption, FlightNameOption, MarketGroupNameOption }.AddOperationHandler(), }; - rootCommand.AddGlobalOption(VerboseOption); - rootCommand.AddGlobalOption(LogFileOption); + rootCommand.Options.Add(VerboseOption); + rootCommand.Options.Add(LogFileOption); rootCommand.Description = "Application that enables game developers to upload Xbox and PC game packages to Partner Center"; - return new CommandLineBuilder(rootCommand); + return rootCommand; } - internal static void ConfigureParameters(FileInfo configFile, IngestionExtensions.AuthenticationMethod authenticationMethod, IConfigurationBuilder builder, string[] args) + public static Command AddOperationHandler(this Command command) where T : Operation { - if (configFile is not null) - { - builder.AddJsonFile(configFile.FullName, false, false); - } - - var switchMappings = new Dictionary(); - ProductIdOption.AddAliasesToSwitchMappings(switchMappings, $"{nameof(BaseOperationConfig.ProductId)}"); - BigIdOption.AddAliasesToSwitchMappings(switchMappings, $"{nameof(BaseOperationConfig.BigId)}"); - BranchFriendlyNameOption.AddAliasesToSwitchMappings(switchMappings, $"{nameof(PackageBranchOperationConfig.BranchFriendlyName)}"); - FlightNameOption.AddAliasesToSwitchMappings(switchMappings, $"{nameof(PackageBranchOperationConfig.FlightName)}"); - MarketGroupNameOption.AddAliasesToSwitchMappings(switchMappings, "MarketGroupName"); - DestinationSandboxName.AddAliasesToSwitchMappings(switchMappings, "DestinationSandboxName"); - - // Configure auth options based on the authentication method - if (authenticationMethod is IngestionExtensions.AuthenticationMethod.AppSecret) - { - // Add client secret mapping for AppSecret auth (AadAuthInfo, NOT ClientSecretAuthInfo) - ClientSecretOption.AddAliasesToSwitchMappings(switchMappings, $"{AadAuthInfo.ConfigName}:{nameof(AzureApplicationSecretAuthInfo.ClientSecret)}"); - } - - // Add tenant ID mapping for browser authentication methods - if (authenticationMethod is IngestionExtensions.AuthenticationMethod.Browser or - IngestionExtensions.AuthenticationMethod.CacheableBrowser) - { - TenantIdOption.AddAliasesToSwitchMappings(switchMappings, $"{BrowserAuthInfo.ConfigName}:{nameof(BrowserAuthInfo.TenantId)}"); - } - - builder.AddCommandLine(args, switchMappings); + command.Action = new OperationInvoker(); + return command; } } } \ No newline at end of file diff --git a/src/PackageUploader.Application/DataOutputOptions.cs b/src/PackageUploader.Application/DataOutputOptions.cs new file mode 100644 index 00000000..b1134e8b --- /dev/null +++ b/src/PackageUploader.Application/DataOutputOptions.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace PackageUploader.Application; + +internal record DataOutputOptions(bool IsData); diff --git a/src/PackageUploader.Application/Extensions/HostExtensions.cs b/src/PackageUploader.Application/Extensions/HostExtensions.cs new file mode 100644 index 00000000..4e4c9c22 --- /dev/null +++ b/src/PackageUploader.Application/Extensions/HostExtensions.cs @@ -0,0 +1,160 @@ +// Copyright(c) Microsoft Corporation. +// Licensed under the MIT License. + +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using PackageUploader.Application.Config; +using PackageUploader.Application.Operations; +using PackageUploader.ClientApi; +using PackageUploader.ClientApi.Client.Ingestion.TokenProvider.Models; +using PackageUploader.FileLogger; +using System; +using System.Collections.Generic; +using System.CommandLine; +using System.IO; +using System.Linq; + +namespace PackageUploader.Application.Extensions +{ + internal static class HostExtensions + { + public static HostApplicationBuilder CreateHostApplicationBuilder(this ParseResult parseResult) + { + return Host.CreateEmptyApplicationBuilder(null) + .ConfigureAppConfiguration(parseResult) + .ConfigureLogging(parseResult) + .ConfigureServices(parseResult); + } + + internal static HostApplicationBuilder ConfigureLogging(this HostApplicationBuilder hostAppBuilder, ParseResult parseResult) + { + const string LogTimestampFormat = "yyyy-MM-dd HH:mm:ss.fff "; + + var isData = parseResult.GetValue(CommandLineHelper.DataOption); +# if DEBUG + hostAppBuilder.Logging.AddDebug(); +#endif + hostAppBuilder.Logging.SetMinimumLevel(LogLevel.Error); + hostAppBuilder.Logging.AddFilter("PackageUploader", + isData ? LogLevel.Error : + parseResult.GetValue(CommandLineHelper.VerboseOption) ? LogLevel.Trace : LogLevel.Information); + hostAppBuilder.Logging.AddFilter("PackageUploader", LogLevel.Trace); + hostAppBuilder.Logging.AddSimpleFile(options => + { + options.SingleLine = true; + options.TimestampFormat = LogTimestampFormat; + }, file => + { + var logFile = parseResult.GetValue(CommandLineHelper.LogFileOption); + file.Path = logFile?.FullName ?? Path.Combine(Path.GetTempPath(), $"PackageUploader_{DateTime.Now:yyyyMMddHHmmss}.log"); + file.Append = true; + }); + if (isData) + { + hostAppBuilder.Logging.AddConsole(options => options.LogToStandardErrorThreshold = LogLevel.Error); + } + hostAppBuilder.Logging.AddSimpleConsole(options => + { + options.SingleLine = true; + options.TimestampFormat = LogTimestampFormat; + }); + + return hostAppBuilder; + } + + internal static HostApplicationBuilder ConfigureServices(this HostApplicationBuilder hostAppBuilder, ParseResult parseResult) + { + var isData = parseResult.GetValue(CommandLineHelper.DataOption); + + hostAppBuilder.Services.AddLogging(); + hostAppBuilder.Services.AddSingleton(new DataOutputOptions(isData)); + hostAppBuilder.Services.AddPackageUploaderService(parseResult.GetValue(CommandLineHelper.AuthenticationMethodOption)); + + hostAppBuilder.Services + .AddScoped() + .AddSingleton, GetProductOperationValidator>() + .AddOptions().Bind(hostAppBuilder.Configuration); + + hostAppBuilder.Services + .AddScoped() + .AddSingleton, GetPackagesOperationValidator>() + .AddOptions().Bind(hostAppBuilder.Configuration); + + hostAppBuilder.Services + .AddScoped() + .AddSingleton, UploadUwpPackageOperationValidator>() + .AddOptions().Bind(hostAppBuilder.Configuration); + + hostAppBuilder.Services + .AddScoped() + .AddSingleton, UploadXvcPackageOperationValidator>() + .AddOptions().Bind(hostAppBuilder.Configuration); + + hostAppBuilder.Services + .AddScoped() + .AddSingleton, RemovePackagesOperationValidator>() + .AddOptions().Bind(hostAppBuilder.Configuration); + + hostAppBuilder.Services + .AddScoped() + .AddSingleton, ImportPackagesOperationValidator>() + .AddOptions().Bind(hostAppBuilder.Configuration); + + hostAppBuilder.Services + .AddScoped() + .AddSingleton, PublishPackagesOperationValidator>() + .AddOptions().Bind(hostAppBuilder.Configuration); + + return hostAppBuilder; + } + + internal static HostApplicationBuilder ConfigureAppConfiguration(this HostApplicationBuilder hostAppBuilder, ParseResult parseResult) + { + var configFile = parseResult.GetValue(CommandLineHelper.ConfigFileOption); + var authenticationMethod = parseResult.GetValue(CommandLineHelper.AuthenticationMethodOption); + + if (configFile is not null) + { + hostAppBuilder.Configuration.AddJsonFile(configFile.FullName, false, false); + } + + var switchMappings = new Dictionary(); + CommandLineHelper.ProductIdOption.AddAliasesToSwitchMappings(switchMappings, $"{nameof(BaseOperationConfig.ProductId)}"); + CommandLineHelper.BigIdOption.AddAliasesToSwitchMappings(switchMappings, $"{nameof(BaseOperationConfig.BigId)}"); + CommandLineHelper.BranchFriendlyNameOption.AddAliasesToSwitchMappings(switchMappings, $"{nameof(PackageBranchOperationConfig.BranchFriendlyName)}"); + CommandLineHelper.FlightNameOption.AddAliasesToSwitchMappings(switchMappings, $"{nameof(PackageBranchOperationConfig.FlightName)}"); + CommandLineHelper.MarketGroupNameOption.AddAliasesToSwitchMappings(switchMappings, "MarketGroupName"); + CommandLineHelper.DestinationSandboxName.AddAliasesToSwitchMappings(switchMappings, "DestinationSandboxName"); + + // Configure auth options based on the authentication method + if (authenticationMethod is IngestionExtensions.AuthenticationMethod.AppSecret) + { + // Add client secret mapping for AppSecret auth (AadAuthInfo, NOT ClientSecretAuthInfo) + CommandLineHelper.ClientSecretOption.AddAliasesToSwitchMappings(switchMappings, $"{AadAuthInfo.ConfigName}:{nameof(AzureApplicationSecretAuthInfo.ClientSecret)}"); + } + else if (authenticationMethod is IngestionExtensions.AuthenticationMethod.Browser + or IngestionExtensions.AuthenticationMethod.CacheableBrowser) + { + // Add tenant ID mapping for browser authentication methods + CommandLineHelper.TenantIdOption.AddAliasesToSwitchMappings(switchMappings, $"{BrowserAuthInfo.ConfigName}:{nameof(BrowserAuthInfo.TenantId)}"); + } + + var rawArgs = parseResult.Tokens.Select(t => t.Value).ToArray(); + hostAppBuilder.Configuration.AddCommandLine(rawArgs, switchMappings); + + return hostAppBuilder; + } + + internal static void AddAliasesToSwitchMappings(this Option option, Dictionary switchMappings, string configPath) + { + switchMappings[option.Name] = configPath; + foreach (var alias in option.Aliases) + { + switchMappings[alias] = configPath; + } + } + } +} diff --git a/src/PackageUploader.Application/Extensions/ProgramExtensions.cs b/src/PackageUploader.Application/Extensions/ProgramExtensions.cs deleted file mode 100644 index 0ded7b85..00000000 --- a/src/PackageUploader.Application/Extensions/ProgramExtensions.cs +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using PackageUploader.Application.Config; -using PackageUploader.Application.Operations; -using System; -using System.Collections.Generic; -using System.CommandLine; -using System.CommandLine.Invocation; -using System.CommandLine.NamingConventionBinder; -using System.Reflection; -using System.Threading; -using System.Threading.Tasks; - -namespace PackageUploader.Application.Extensions; - -internal static class ProgramExtensions -{ - public static Command AddOperationHandler(this Command command) where T : Operation - { - command.Handler = CommandHandler.Create(async (IHost host, CancellationToken ct) => await RunAsyncOperation(host, ct).ConfigureAwait(false)); - return command; - } - - private static async Task RunAsyncOperation(IHost host, CancellationToken ct) where T : Operation - { - var logger = host.Services.GetRequiredService>(); - try - { - var version = GetVersion(); - logger.LogInformation("PackageUploader v.{version} is starting.", version); - return await host.Services.GetRequiredService().RunAsync(ct).ConfigureAwait(false); - } - catch (Exception e) - { - logger.LogError("{errorMessage}", e.Message); - logger.LogTrace(e, "Exception thrown."); - return 2; - } - } - - private static string GetVersion() - { - var assembly = Assembly.GetEntryAssembly() ?? Assembly.GetExecutingAssembly(); - var assemblyVersionAttribute = assembly.GetCustomAttribute(); - - if (assemblyVersionAttribute is not null) - { - return assemblyVersionAttribute.InformationalVersion; - } - return assembly.GetName().Version?.ToString() ?? string.Empty; - } - - public static T GetOptionValue(this InvocationContext invocationContext, Option option) - { - return invocationContext.ParseResult.GetValueForOption(option); - } - - public static void AddAliasesToSwitchMappings(this Option option, Dictionary switchMappings, string configPath) - { - foreach (var alias in option.Aliases) - { - switchMappings[alias] = configPath; - } - } - - public static Option Required(this Option option, bool required = true) - { - option.IsRequired = required; - return option; - } - - public static IServiceCollection AddOperations(this IServiceCollection services, HostBuilderContext context) - { - services - .AddScoped() - .AddSingleton, GetProductOperationValidator>() - .AddOptions().Bind(context.Configuration); - - services - .AddScoped() - .AddSingleton, GetPackagesOperationValidator>() - .AddOptions().Bind(context.Configuration); - - services - .AddScoped() - .AddSingleton, UploadUwpPackageOperationValidator>() - .AddOptions().Bind(context.Configuration); - - services - .AddScoped() - .AddSingleton, UploadXvcPackageOperationValidator>() - .AddOptions().Bind(context.Configuration); - - services - .AddScoped() - .AddSingleton, RemovePackagesOperationValidator>() - .AddOptions().Bind(context.Configuration); - - services - .AddScoped() - .AddSingleton, ImportPackagesOperationValidator>() - .AddOptions().Bind(context.Configuration); - - services - .AddScoped() - .AddSingleton, PublishPackagesOperationValidator>() - .AddOptions().Bind(context.Configuration); - - return services; - } -} \ No newline at end of file diff --git a/src/PackageUploader.Application/OperationInvoker.cs b/src/PackageUploader.Application/OperationInvoker.cs new file mode 100644 index 00000000..4d1c18be --- /dev/null +++ b/src/PackageUploader.Application/OperationInvoker.cs @@ -0,0 +1,58 @@ +// Copyright(c) Microsoft Corporation. +// Licensed under the MIT License. + +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using PackageUploader.Application.Extensions; +using PackageUploader.Application.Operations; +using System; +using System.CommandLine; +using System.CommandLine.Invocation; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; + +namespace PackageUploader.Application +{ + internal class OperationInvoker : AsynchronousCommandLineAction where T : Operation + { + public override async Task InvokeAsync(ParseResult parseResult, CancellationToken ct) + { + var hostAppBuilder = parseResult.CreateHostApplicationBuilder(); + using var host = hostAppBuilder.Build(); + + var logger = host.Services.GetRequiredService>>(); + var exitCode = 0; + try + { + if (logger.IsEnabled(LogLevel.Information)) + { + var version = GetVersion(); + logger.LogInformation("PackageUploader v.{version} is starting.", version); + } + exitCode = await host.Services.GetRequiredService().RunAsync(ct).ConfigureAwait(false); + } + catch (Exception e) + { + logger.LogError("{errorMessage}", e.Message); + logger.LogTrace(e, "Exception thrown."); + exitCode = 2; + } + + Environment.ExitCode = exitCode; + return exitCode; + } + + private static string GetVersion() + { + var assembly = Assembly.GetEntryAssembly() ?? Assembly.GetExecutingAssembly(); + var assemblyVersionAttribute = assembly.GetCustomAttribute(); + + if (assemblyVersionAttribute is not null) + { + return assemblyVersionAttribute.InformationalVersion; + } + return assembly.GetName().Version?.ToString() ?? string.Empty; + } + } +} diff --git a/src/PackageUploader.Application/Operations/GetPackagesOperation.cs b/src/PackageUploader.Application/Operations/GetPackagesOperation.cs index 6ccee732..38af5a8e 100644 --- a/src/PackageUploader.Application/Operations/GetPackagesOperation.cs +++ b/src/PackageUploader.Application/Operations/GetPackagesOperation.cs @@ -9,7 +9,6 @@ using PackageUploader.ClientApi; using System; using System.Collections.Generic; -using System.CommandLine.Invocation; using System.Linq; using System.Text.Json; using System.Threading; @@ -17,11 +16,11 @@ namespace PackageUploader.Application.Operations; -internal class GetPackagesOperation(IPackageUploaderService storeBrokerService, ILogger logger, IOptions config, InvocationContext invocationContext) : Operation(logger) +internal class GetPackagesOperation(IPackageUploaderService storeBrokerService, ILogger logger, IOptions config, DataOutputOptions dataOutputOptions) : Operation(logger) { private readonly IPackageUploaderService _storeBrokerService = storeBrokerService ?? throw new ArgumentNullException(nameof(storeBrokerService)); private readonly ILogger _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - private readonly bool _isData = invocationContext.GetOptionValue(ParameterHelper.DataOption); + private readonly bool _isData = dataOutputOptions.IsData; private readonly GetPackagesOperationConfig _config = config?.Value ?? throw new ArgumentNullException(nameof(config)); protected override async Task ProcessAsync(CancellationToken ct) diff --git a/src/PackageUploader.Application/Operations/GetProductOperation.cs b/src/PackageUploader.Application/Operations/GetProductOperation.cs index 91c6a212..4a93df14 100644 --- a/src/PackageUploader.Application/Operations/GetProductOperation.cs +++ b/src/PackageUploader.Application/Operations/GetProductOperation.cs @@ -8,17 +8,16 @@ using PackageUploader.Application.Models; using PackageUploader.ClientApi; using System; -using System.CommandLine.Invocation; using System.Threading; using System.Threading.Tasks; namespace PackageUploader.Application.Operations; -internal class GetProductOperation(IPackageUploaderService storeBrokerService, ILogger logger, IOptions config, InvocationContext invocationContext) : Operation(logger) +internal class GetProductOperation(IPackageUploaderService storeBrokerService, ILogger logger, IOptions config, DataOutputOptions dataOutputOptions) : Operation(logger) { private readonly IPackageUploaderService _storeBrokerService = storeBrokerService ?? throw new ArgumentNullException(nameof(storeBrokerService)); private readonly ILogger _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - private readonly bool _isData = invocationContext.GetOptionValue(ParameterHelper.DataOption); + private readonly bool _isData = dataOutputOptions.IsData; private readonly GetProductOperationConfig _config = config?.Value ?? throw new ArgumentNullException(nameof(config)); protected override async Task ProcessAsync(CancellationToken ct) diff --git a/src/PackageUploader.Application/PackageUploader.Application.csproj b/src/PackageUploader.Application/PackageUploader.Application.csproj index 65d80e46..cadc64fd 100644 --- a/src/PackageUploader.Application/PackageUploader.Application.csproj +++ b/src/PackageUploader.Application/PackageUploader.Application.csproj @@ -4,14 +4,15 @@ PackageUploader © Microsoft Corporation Exe - net8.0 + net10.0 win-x64;linux-x64 true false - none + embedded true true - + Application that enables game developers to upload Xbox and PC game packages to Partner Center + true Guard @@ -25,11 +26,11 @@ - - - - - + + + + + diff --git a/src/PackageUploader.Application/Program.cs b/src/PackageUploader.Application/Program.cs index b072d3db..e8281490 100644 --- a/src/PackageUploader.Application/Program.cs +++ b/src/PackageUploader.Application/Program.cs @@ -1,93 +1,19 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using PackageUploader.Application.Extensions; -using PackageUploader.ClientApi; -using PackageUploader.FileLogger; -using System; -using System.CommandLine; -using System.CommandLine.Builder; -using System.CommandLine.Hosting; -using System.CommandLine.Parsing; -using System.IO; using System.Threading.Tasks; namespace PackageUploader.Application; internal class Program { - private const string LogTimestampFormat = "yyyy-MM-dd HH:mm:ss.fff "; + internal static string[] RawArgs; private static async Task Main(string[] args) { - return await BuildCommandLine() - .UseHost(hostBuilder => hostBuilder - .ConfigureLogging(ConfigureLogging) - .ConfigureServices(ConfigureServices) - .ConfigureAppConfiguration((context, builder) => ConfigureAppConfiguration(context, builder, args)) - ) - .UseDefaults() - .Build() - .InvokeAsync(args) - .ConfigureAwait(false); - } - - private static void ConfigureLogging(HostBuilderContext context, ILoggingBuilder logging) - { - var invocationContext = context.GetInvocationContext(); - var isData = invocationContext.GetOptionValue(ParameterHelper.DataOption); - logging.ClearProviders(); - logging.SetMinimumLevel(LogLevel.Error); - logging.AddFilter("PackageUploader", - isData ? LogLevel.Error : - invocationContext.GetOptionValue(ParameterHelper.VerboseOption) ? LogLevel.Trace : LogLevel.Information); - logging.AddFilter("PackageUploader", LogLevel.Trace); - logging.AddSimpleFile(options => - { - options.SingleLine = true; - options.TimestampFormat = LogTimestampFormat; - }, file => - { - var logFile = invocationContext.GetOptionValue(ParameterHelper.LogFileOption); - file.Path = logFile?.FullName ?? Path.Combine(Path.GetTempPath(), $"PackageUploader_{DateTime.Now:yyyyMMddHHmmss}.log"); - file.Append = true; - }); - if (isData) - { - logging.AddConsole(options => options.LogToStandardErrorThreshold = LogLevel.Error); - } - logging.AddSimpleConsole(options => - { - options.SingleLine = true; - options.TimestampFormat = LogTimestampFormat; - }); - } - - private static void ConfigureServices(HostBuilderContext context, IServiceCollection services) - { - var invocationContext = context.GetInvocationContext(); - - services.AddLogging(); - services.AddPackageUploaderService(invocationContext.GetOptionValue(ParameterHelper.AuthenticationMethodOption)); - services.AddOperations(context); - } - - private static void ConfigureAppConfiguration(HostBuilderContext context, IConfigurationBuilder builder, string[] args) - { - var invocationContext = context.GetInvocationContext(); - - var configFile = invocationContext.GetOptionValue(ParameterHelper.ConfigFileOption); - var authenticationMethod = invocationContext.GetOptionValue(ParameterHelper.AuthenticationMethodOption); - - ParameterHelper.ConfigureParameters(configFile, authenticationMethod, builder, args); - } - - private static CommandLineBuilder BuildCommandLine() - { - return ParameterHelper.BuildCommandLine(); + RawArgs = args; + var rootCommand = CommandLineHelper.BuildRootCommand(); + var parseResult = rootCommand.Parse(args); + return await parseResult.InvokeAsync().ConfigureAwait(false); } } \ No newline at end of file diff --git a/src/PackageUploader.Application/packages.lock.json b/src/PackageUploader.Application/packages.lock.json index ef77f702..f1f61491 100644 --- a/src/PackageUploader.Application/packages.lock.json +++ b/src/PackageUploader.Application/packages.lock.json @@ -1,414 +1,406 @@ { "version": 1, "dependencies": { - "net8.0": { + "net10.0": { "Microsoft.DotNet.ILCompiler": { "type": "Direct", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "09sjUN6lE2os7s3qZDKsZQvng84wquilKCMY+cWD993evNSW9kII9Gm6j+xI0bT/x0CNDdhkHDyAbB47ObF8Bw==" + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "2H7j1NltkQx04sPWBkUtFrZNBtro7vwsxRtdThP0oDj6Sn3ouGHCQlxATZ4Me2aJE67+KiXMX2V1IHDjt1uIpw==" }, "Microsoft.Extensions.Configuration.Binder": { "type": "Direct", - "requested": "[9.0.5, )", - "resolved": "9.0.5", - "contentHash": "7pQ4Tkyofm8DFWFhqn9ZmG8qSAC2VitWleATj5qob9V9KtoxCVdwRtmiVl/ha3WAgjkEfW++JLWXox9MJwMgkg==", + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "8bS1qIaRivny+WX+49pmeJ6iAylbtX8C0DLEcCQWZjdxQvLqaMssXiGD9P/6pYElrHbK5/nAHmjbQ8STqdMYeg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Configuration.Json": { "type": "Direct", - "requested": "[9.0.5, )", - "resolved": "9.0.5", - "contentHash": "LiWV+Sn5yvoQEd/vihGwkR3CZ4ekMrqP5OQiYOlbzMBfBa6JHBWBsTO5ta6dMYO9ADMiv9K6GBKJSF9DrP29sw==", + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "64dimvyyKk0dbUbrLg/YCv4ugJ4sVz2aXLwfvZwR1EC4tJqW9ru/oVRcXwoJRa2lQGXtYtlpk4maWOeIb48tQw==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Configuration.FileExtensions": "9.0.5", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.5", - "System.Text.Json": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.FileExtensions": "10.0.7", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Hosting": { "type": "Direct", - "requested": "[9.0.5, )", - "resolved": "9.0.5", - "contentHash": "PoTG6ptucJyxrrALQgRE5lwUMaSc3PK5vtEXuazEJ6mDQ9xRFmxElZCe81duH/TNH7+X/CVDVIZu6Ji2OQW4zQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Configuration.Binder": "9.0.5", - "Microsoft.Extensions.Configuration.CommandLine": "9.0.5", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "9.0.5", - "Microsoft.Extensions.Configuration.FileExtensions": "9.0.5", - "Microsoft.Extensions.Configuration.Json": "9.0.5", - "Microsoft.Extensions.Configuration.UserSecrets": "9.0.5", - "Microsoft.Extensions.DependencyInjection": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Diagnostics": "9.0.5", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.5", - "Microsoft.Extensions.FileProviders.Physical": "9.0.5", - "Microsoft.Extensions.Hosting.Abstractions": "9.0.5", - "Microsoft.Extensions.Logging": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Logging.Configuration": "9.0.5", - "Microsoft.Extensions.Logging.Console": "9.0.5", - "Microsoft.Extensions.Logging.Debug": "9.0.5", - "Microsoft.Extensions.Logging.EventLog": "9.0.5", - "Microsoft.Extensions.Logging.EventSource": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "M/vBpfWcschvS2EUeq7cHfscsxabiGTptXwV7GeSueovGiSoNjyo1j5PMcWuOAAQrRW3nRqxZk8NeumrmpzUBg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Binder": "10.0.7", + "Microsoft.Extensions.Configuration.CommandLine": "10.0.7", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "10.0.7", + "Microsoft.Extensions.Configuration.FileExtensions": "10.0.7", + "Microsoft.Extensions.Configuration.Json": "10.0.7", + "Microsoft.Extensions.Configuration.UserSecrets": "10.0.7", + "Microsoft.Extensions.DependencyInjection": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Diagnostics": "10.0.7", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", + "Microsoft.Extensions.FileProviders.Physical": "10.0.7", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging.Configuration": "10.0.7", + "Microsoft.Extensions.Logging.Console": "10.0.7", + "Microsoft.Extensions.Logging.Debug": "10.0.7", + "Microsoft.Extensions.Logging.EventLog": "10.0.7", + "Microsoft.Extensions.Logging.EventSource": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.Options.DataAnnotations": { "type": "Direct", - "requested": "[9.0.5, )", - "resolved": "9.0.5", - "contentHash": "3e1vlYqezeCEhjvx5z45zEfbwNNpOCRWo/hzd8Ittt93f3a4n/xz7JSOdf/Hg0v1/mo+wE0JADrl4k+KZ3f9uA==", + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "KWepqdSD4PxhFvVh3mckkvJ03u3q/VChkr6nT3nf5mm2XBk8ojxt2E4It0RMblb3GE7hJ0zQzFzxGKL0d6TfXA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.18, )", - "resolved": "8.0.18", - "contentHash": "OiXqr2YIBEV9dsAWEtasK470ALyJ0VxJ9k4MotOxlWV6HeEgrJKYMW4HHj1OCCXvqE0/A25wEKPkpfiBARgDZA==" + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "AA/yhzFHNtQZXLdqjzujPy25G8EWwGWsAnxOE2zYSBoT/8QHP6ketN3CToD3DFreO653ipUwnKHo22B8AlBMCw==" }, - "System.CommandLine.Hosting": { + "System.CommandLine": { "type": "Direct", - "requested": "[0.4.0-alpha.22272.1, )", - "resolved": "0.4.0-alpha.22272.1", - "contentHash": "x9JhHxBLxlKyCIZADFYC8q16L9yGHdTakrLFjHabwR7Tk0761aTexiGgMTIS744HGuhc8pk9MoLUzsr/TlRfMQ==", - "dependencies": { - "Microsoft.Extensions.Hosting": "6.0.0", - "System.CommandLine": "2.0.0-beta4.22272.1", - "System.CommandLine.NamingConventionBinder": "2.0.0-beta4.22272.1" - } + "requested": "[2.0.7, )", + "resolved": "2.0.7", + "contentHash": "ih4yNLLF2Ebz85xJJBaPeddLa4d1AekYId7Y1g8oSsEaBHHd/CtyeBJ+tDvQadqeXz7i591K5ry/td+4aaHnQA==" }, "Azure.Core": { "type": "Transitive", - "resolved": "1.46.1", - "contentHash": "iE5DPOlGsN5kCkF4gN+vasN1RihO0Ypie92oQ5tohQYiokmnrrhLnee+3zcE8n7vB6ZAzhPTfUGAEXX/qHGkYA==", + "resolved": "1.54.0", + "contentHash": "m6hHbx1q9+GCBZ5A9ykzFylPdTwscX2APH7PlnqV+yu+DH3RRtuIDJMRqdU17cMyinv0hCPofpegoyQ6qWPW7g==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "System.ClientModel": "1.4.1", - "System.Memory.Data": "6.0.1" + "Microsoft.Bcl.AsyncInterfaces": "10.0.3", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.3", + "Microsoft.Identity.Client": "4.83.1", + "Microsoft.Identity.Client.Extensions.Msal": "4.83.1", + "System.ClientModel": "1.10.0", + "System.Memory.Data": "10.0.3" } }, "Azure.Identity": { "type": "Transitive", - "resolved": "1.14.0", - "contentHash": "xQ6mpNhifb8W/KG2BclhbJWAupvE3JF8lPEBF8t59Q5sc1yN0Ci+dvS0qXtc6m9auxwYpmc8rhOmK541dcGwmA==", + "resolved": "1.21.0", + "contentHash": "GeFv8sGwRKvDKwI2WFy8r0mhmlxEVZg24Sit2NogTjiSO8RVjllWM65OT6e1sKjOvG8V74y7hAbaELUUPjZQSw==", "dependencies": { - "Azure.Core": "1.46.1", - "Microsoft.Identity.Client": "4.71.1", - "Microsoft.Identity.Client.Extensions.Msal": "4.71.1", - "System.Memory": "4.5.5" + "Azure.Core": "1.53.0" } }, "Azure.Storage.Blobs": { "type": "Transitive", - "resolved": "12.24.1", - "contentHash": "479Z9ps9yl9XyhU45bbU2CU4e2B23S6FJiSiL9LpfZHU6eNXXD9Jb6rYdwY+qqmm852RhqICXBpX3Sql4DLBew==", + "resolved": "12.27.0", + "contentHash": "zI5rg1tTtnA8T2g2/21l+1iIUdDjpEQQ0FI1BabJVEQJ1JUyTQKrc41eNabAHs0SBHprl6pu/6OqIMK9Ve+4tQ==", "dependencies": { - "Azure.Storage.Common": "12.23.0" + "Azure.Core": "1.50.0", + "Azure.Storage.Common": "12.26.0" } }, "Azure.Storage.Common": { "type": "Transitive", - "resolved": "12.23.0", - "contentHash": "X/pe1LS3lC6s6MSL7A6FzRfnB6P72rNBt5oSuyan6Q4Jxr+KiN9Ufwqo32YLHOVfPcB8ESZZ4rBDketn+J37Rw==", + "resolved": "12.26.0", + "contentHash": "XaT6CDcSshZb7KaCTwc6m4EouZbLBg7ciOEpsJSdJCvkNsZJQCvPKw7V5TtXno19AA1NpwtsZriYque8mzbQVg==", "dependencies": { - "Azure.Core": "1.44.1", - "System.IO.Hashing": "6.0.0" + "Azure.Core": "1.50.0", + "System.IO.Hashing": "10.0.1" } }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" + "resolved": "10.0.3", + "contentHash": "TV62UsrJZPX6gbt3c4WrtXh7bmaDIcMqf9uft1cc4L6gJXOU07hDGEh+bFQh/L2Az0R1WVOkiT66lFqS6G2NmA==" }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "uYXLg2Gt8KUH5nT3u+TBpg9VrRcN5+2zPmIjqEHR4kOoBwsbtMDncEJw9HiLvZqGgIo2TR4oraibAoy5hXn2bQ==", + "resolved": "10.0.7", + "contentHash": "wZbGh7J8R1vXN525O6d8dlcDTxhRTnd5MyW4LdfP5S0tSnTwTCseYSrq6g0Mxh7W9xn8P/2xPuf0D/m6k2dy2w==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "ew0G6gIznnyAkbIa67wXspkDFcVektjN3xaDAfBDIPbWph+rbuGaaohFxUSGw28ht7wdcWtTtElKnzfkcDDbOQ==", + "resolved": "10.0.7", + "contentHash": "t56nEgvECcyLPojZIUFWJknQQDAbgfTf9J+QMYJE1YYvVgz69vN6B/AKL8Grvj3Lcnp8kTpNqwmwFhb3YLJmtQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Configuration.CommandLine": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "BloAPG22eV+F4CpGKg0lHeXsLxbsGeId4mNpNsUc250j79pcJL3OWVRgmyIUBP5eF74lYJlaOVF+54MRBAQV3A==", + "resolved": "10.0.7", + "contentHash": "3lNjglxfFxOzI9zG+3HSg/YSGqo//8Fqw6u6iuIamZb4JCorbA3JLaeWOpfKTAPi2UJwaispOXWx14dUqcGz4A==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Configuration.EnvironmentVariables": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "kfLv3nbn3tt42g/YfPMJGW6SJRt4DLIvSu5njrZv622kBGVOXBMwyoqFLvR/tULzn0mwICJu6GORdUJ+INpexg==", + "resolved": "10.0.7", + "contentHash": "TWto3imA+mJMLZI+5sbgLiFFoOFNFkizQYNaC5jTuiHKn3diwm1RN7mWDOEZN9kG2bixw7IvgpvtUG5/teSRzA==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "ifrA7POOJ7EeoEJhC8r03WufBsEV4zgnTLQURHh1QIS/vU6ff/60z8M4tD3i2csdFPREEc1nGbiOZhi7Q5aMfw==", + "resolved": "10.0.7", + "contentHash": "qbZLvLsoTdArSloEnSxs21P781YUmwVmHc5NJPQD/ezAreQ7884z+6QfAZVKi86WAZtzx83jK2uC4itxOM44gQ==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.5", - "Microsoft.Extensions.FileProviders.Physical": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", + "Microsoft.Extensions.FileProviders.Physical": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Configuration.UserSecrets": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "DONkv4TzvCUps55pu+667HasjhW5WoKndDPt9AvnF3qnYfgh+OXN01cDdH0h9cfXUXluzAZfGhqh/Uwt14aikg==", + "resolved": "10.0.7", + "contentHash": "YqVIICoIdl0016wkeO2WQS+uEbEXbUhMLKdC5rZNl1X3nu59F+nwaAHdHjq/4OK+Cx31DYmNUSFh+MUot8qSDw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Configuration.Json": "9.0.5", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.5", - "Microsoft.Extensions.FileProviders.Physical": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Json": "10.0.7", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", + "Microsoft.Extensions.FileProviders.Physical": "10.0.7" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "N1Mn0T/tUBPoLL+Fzsp+VCEtneUhhxc1//Dx3BeuQ8AX+XrMlYCfnp2zgpEXnTCB7053CLdiqVWPZ7mEX6MPjg==", + "resolved": "10.0.7", + "contentHash": "91F/o3emPV/+xY/ip3s2LqDNF14kjttlVtq0BXgg6p4MnCzeSZxnUJm+t6WRrtD3JdGo88/oX+z7OwK4y8PZuw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "cjnRtsEAzU73aN6W7vkWy8Phj5t3Xm78HSqgrbh/O4Q9SK/yN73wZVa21QQY6amSLQRQ/M8N+koGnY6PuvKQsw==" + "resolved": "10.0.7", + "contentHash": "Z6mfFEaFcwCfSboxJwOLfu7/31npCY9q70WUamHW/vRQhDvBKOT4Vf9YkZj5J6hLvJpb0oDEYfHunQZj0xxvKw==" }, "Microsoft.Extensions.Diagnostics": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "fRiUjmhm9e4vMp6WEO9MgWNxVtWSr4Pcgh1W4DyJIr8bRANlZz9JU7uicf7ShzMspDxo/9Ejo9zJ6qQZY0IhVw==", + "resolved": "10.0.7", + "contentHash": "l+smp1qPlU0OUXD0OGfdp7OUFrbdq7ZaP5T7m2WpfZ4RFKD7iG73BAT7tjSMxNmbSXkhAn1jYHOAqzYG1r9sNg==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.5", - "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.5", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.7", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.7" } }, "Microsoft.Extensions.Diagnostics.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "6YfTcULCYREMTqtk+s3UiszsFV2xN2FXtxdQpurmQJY9Cp/QGiM4MTKfJKUo7AzdLuzjOKKMWjQITmvtK7AsUg==", + "resolved": "10.0.7", + "contentHash": "uJ9JP677y+uy+C0vtaSfi7XXgFAdz8DhU3M9lwwIXDfQKcyQ0yxM9DVYa0NXDtdVTYA2eBUtVFZ8LY0GCdeE/w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "System.Diagnostics.DiagnosticSource": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "LLm+e8lvD+jOI+blHRSxPqywPaohOTNcVzQv548R1UpkEiNB2D+zf3RrqxBdB1LDPicRMTnfiaKJovxF8oX1bQ==", + "resolved": "10.0.7", + "contentHash": "teioDgVpi8L186wUfrXQV1YuBt6lCSPmFZiMZo53+FZxHFjOV+f4GXo4LXgJ273Mku9//AdXWVjk9J7eJP6inw==", "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.FileProviders.Physical": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "cMQqvK0rclKzAm2crSFe9JiimR+wzt6eaoRxa8/mYFkqekY4JEP8eShVZs4NPsKV2HQFHfDgwfFSsWUrUgqbKA==", + "resolved": "10.0.7", + "contentHash": "zhgWg/i0ECj5v0jLFBSZHplvc5ygCI91DR4nne+BP4XAKF5ycz0pEKnFiTw8C1jCABJEZsnBZh6pXAvn71kFmw==", "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.5", - "Microsoft.Extensions.FileSystemGlobbing": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", + "Microsoft.Extensions.FileSystemGlobbing": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "TWJZJGIyUncH4Ah+Sy9X5mPJeoz02lRlFx9VWaFo4b4o0tkA1dk2u6HRHrfEC2L6N4IC+vFzfRWol1egyQqLtg==" + "resolved": "10.0.7", + "contentHash": "NTUspqB+vH9g4wAD6KPOBx01xqYuKXR/cHXm449zpbq1GqfjdAxBmg7eJXrNsPw7SKwIdT2cJ05GxYVvc+lvsA==" }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "3GA/dxqkP6yFe18qYRgtKYuN2onC8NfhlpNN21jptkVKk7olqBTkdT49oL0pSEz2SptRsux7LocCU7+alGnEag==", + "resolved": "10.0.7", + "contentHash": "5s8d6qC6EA8UOI4wR/+zlsq7SXttJMRb9d7zvVZ7+bE3CQEfVtC9ITUDCommm87R1zzj6WJBbCnztuIJXnP3DA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.5", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.7", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Http": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "6vbo3XjyEc+w/kv/Dkfv9NA7iSdIdX5dlU9Shk3wJJ0fiZpCVzVW5FJtNoIePX5hS0ENNpHPClq/qtq06yM4FQ==", + "resolved": "10.0.7", + "contentHash": "1wbd+RPhRo3hJKNJhdGEO5ls0LGe55Ho4BUjlFtRUrWxDVVBd7g0Ydq9fbNy86pmvx/j7AGcSPo7YNCo1IRI6Q==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Diagnostics": "9.0.5", - "Microsoft.Extensions.Logging": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Diagnostics": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.Http.Polly": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "VCFPTik1LjPuUiS3vHy65UUzffm7MKGG6tBTFOrDklGDT36BsB9srrW+otYVT7nw6a/NbE8SM4kKsPzuRWxLRA==", + "resolved": "10.0.7", + "contentHash": "pcUsPoqMHvOp+QJsLA/Hlg/W+IBnAoUXKEBc7FqMcY0sUez15DOKXtbEo81TvHL9xwjWQcF3ZMayNpcvpI7Bqg==", "dependencies": { - "Microsoft.Extensions.Http": "9.0.5", + "Microsoft.Extensions.Http": "10.0.7", "Polly": "7.2.4", "Polly.Extensions.Http": "3.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "rQU61lrgvpE/UgcAd4E56HPxUIkX/VUQCxWmwDTLLVeuwRDYTL0q/FLGfAW17cGTKyCh7ywYAEnY3sTEvURsfg==", + "resolved": "10.0.7", + "contentHash": "hOeRIQ63GkgiYCB/MIFp+LQs8aXpJXpB55t6Aj37ab7t2/6WeFcPXxYM9hdy/o5tffzwf8mhqzLJP6mjGYCxjw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" + "Microsoft.Extensions.DependencyInjection": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "pP1PADCrIxMYJXxFmTVbAgEU7GVpjK5i0/tyfU9DiE0oXQy3JWQaOVgCkrCiePLgS8b5sghM3Fau3EeHiVWbCg==", + "resolved": "10.0.7", + "contentHash": "tIEcQ2gvERrH2KiCjdsVcHGhXt9lIsuDStfOIeZWr7/fP8IXhGiYfx0/80PNI7WPO2IYuFtlZLSlnTS8+/Mchw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "System.Diagnostics.DiagnosticSource": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "WgYTJ1/dxdzqaYYMrgC6cZXJVmaoxUmWgsvR9Kg5ZARpy0LMw7fZIZMIiVuaxhItwwFIW0ruhAN+Er2/oVZgmQ==", + "resolved": "10.0.7", + "contentHash": "7BBnoGF37USiu7j434put9mDp7EjdlNDIZsR4vHfC1FbLZeLqiWjgJbeEtF0p59Ryqt8AtraHawf0ZKbe5jibg==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Configuration.Binder": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Logging": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Binder": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.7" } }, "Microsoft.Extensions.Logging.Console": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "0BqgvX5y34GOrsJeAypny53OoBnXjyjQCpanrpm7dZawKv5KFk7Tqbu7LFVsRu2T0tLpQ2YHMciMiAWtp+o/Bw==", + "resolved": "10.0.7", + "contentHash": "DA++Es6v6W0HfrOrw+K8WyN6jNnZHp640PDdEvl8yfeVmgflKdn6vSSFvufNUSOuY+M2ZaSUgfY+jUKtNpXcCw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Logging": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Logging.Configuration": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "System.Text.Json": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging.Configuration": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.Logging.Debug": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "IyosWdl/NM2LP72zlavSpkZyd1SczzJ+8J4LImlKWF8w/JEbqJuSJey79Wd1lJGsDj7Cik8y4CD1T2mXMIhEVA==", + "resolved": "10.0.7", + "contentHash": "Y6DSt/JZApunYWKqTtqbdsR6iqAvHx3D0tavbNJ1rnC24MUpF+3XO/VKgFi+9PFqMyvQ2GHBBGb8H3cLSw7rDg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Logging": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Logging.EventLog": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "KF+lvi5ZwNd5Oy5V6l0580cQjTi59boF6X4wp+2ozvUGTC4zBBsaDSVicR86pTWsDivmo9UeSlB+QgheGzrpJQ==", + "resolved": "10.0.7", + "contentHash": "1C8eTuxF6BLncNSJ1HCfmaBcjpUSqQDPlBVdYTlet9oldHTPpNh9iatxSJLs8TOqdp/FOpH+nSLdBve7fu9mTQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Logging": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "System.Diagnostics.EventLog": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "System.Diagnostics.EventLog": "10.0.7" } }, "Microsoft.Extensions.Logging.EventSource": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "H4PVv6aDt4jNyZi7MN746GtHPNRjGdH7OrueDViQDBAw/b4incGYEPbUKUACa9HED0vfI4PPaQrzz1Hz5Odh3g==", + "resolved": "10.0.7", + "contentHash": "YWfndnDX1jVMGCN8d5T+rO+BO8sDw6BkYlUk0BYui+WP7+HhlWx8QLdA4yUDjrkGVb3AQxIWWEPVKw5Nnfj5GQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Logging": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5", - "System.Text.Json": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "vPdJQU8YLOUSSK8NL0RmwcXJr2E0w8xH559PGQl4JYsglgilZr9LZnqV2zdgk+XR05+kuvhBEZKoDVd46o7NqA==", + "resolved": "10.0.7", + "contentHash": "00SHUGTh2jSMvIr6x9Xwd2nE+B5/qFCO/9hDwUDhJsjYRDlADmaBZ7tqehXzBDsfjHSXJzuRHJzPYPPjphBQ7Q==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "CJbAVdovKPFh2FoKxesu20odRVSbL/vtvzzObnG+5u38sOfzRS2Ncy25id0TjYUGQzMhNnJUHgTUzTMDl/3c9g==", + "resolved": "10.0.7", + "contentHash": "IT7f+EMXZtkjatEcF+o6aOw/7OE4etRrMiDGEWH/iiTu2R3uhC4NEQJCfHiibtX45U3sIQ5Fh6tbb1qaOz3YAg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Configuration.Binder": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Binder": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "b4OAv1qE1C9aM+ShWJu3rlo/WjDwa/I30aIPXqDWSKXTtKl1Wwh6BZn+glH5HndGVVn3C6ZAPQj5nv7/7HJNBQ==" + "resolved": "10.0.7", + "contentHash": "D5M0Jr551iTgwkZMN9rm0pSkgNLj5quUWQUmQPMZh7k/bnvZTnXRGfE2KuvXf1EEjt/ofD9yw9IumpgdP9QCnw==" }, "Microsoft.Identity.Client": { "type": "Transitive", - "resolved": "4.71.1", - "contentHash": "SgvSBcMRvmEEyV10pcvxNVUbwYoShmj/9pxXFVr3AFjE26IUzuwYLtLgt58xkEnT0xJBjfObaXxcol3BMtmEAg==", + "resolved": "4.83.1", + "contentHash": "jOLIrZ3cynoqHLLO1cXplFFabrhrMEYs/EuKHvmCyrOm1axqiVFT6nCSnHxk7w5+d2BeQfCdM12Yf/0X7OeS1g==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.35.0", - "System.Diagnostics.DiagnosticSource": "6.0.1" + "Microsoft.IdentityModel.Abstractions": "8.14.0" } }, "Microsoft.Identity.Client.Extensions.Msal": { "type": "Transitive", - "resolved": "4.71.1", - "contentHash": "PGOHaoQhKBKnXy1kfW+Gu9/rxStKsqR+UZKeVv4XAsATdzmfj9y9kkUOftIjVFvxP3oh2Sk7v65ylS0K/qYADA==", + "resolved": "4.83.1", + "contentHash": "I3k4J4Hj4KbLEFanjeUzzDOVecukETaTgEkJ7h2pP/Yazs6SLp6TVUTo/Eo+ptPXMwvc+iX7rBFtMSUrA7R+Mg==", "dependencies": { - "Microsoft.Identity.Client": "4.71.1", + "Microsoft.Identity.Client": "4.83.1", "System.Security.Cryptography.ProtectedData": "4.5.0" } }, "Microsoft.IdentityModel.Abstractions": { "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "xuR8E4Rd96M41CnUSCiOJ2DBh+z+zQSmyrYHdYhD6K4fXBcQGVnRCFQ0efROUYpP+p0zC1BLKr0JRpVuujTZSg==" + "resolved": "8.14.0", + "contentHash": "iwbCpSjD3ehfTwBhtSNEtKPK0ICun6ov7Ibx6ISNA9bfwIyzI2Siwyi9eJFCJBwxowK9xcA1mj+jBWiigeqgcQ==" }, "Polly": { "type": "Transitive", @@ -430,169 +422,122 @@ }, "System.ClientModel": { "type": "Transitive", - "resolved": "1.4.1", - "contentHash": "MY7eFGKp+Hu7Ciub8wigQ0odGrkml4eTjUy8d5Bu2eGAVvm8Qskkq+YuXiiS5wMJGq7iSvqseV4skd5WxTUdDA==", + "resolved": "1.10.0", + "contentHash": "lBEWs54F5Y5pZ9hC+8z4S/X76957ex+DPk7WecRHlbIHtrPfbRMMlOgI3iDn4Jpb3bSxvBnKaaHoD59auFjlBA==", "dependencies": { - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "System.Memory.Data": "6.0.1" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.3", + "Microsoft.Extensions.Logging.Abstractions": "10.0.3", + "System.Memory.Data": "10.0.3" } }, - "System.CommandLine": { - "type": "Transitive", - "resolved": "2.0.0-beta4.22272.1", - "contentHash": "1uqED/q2H0kKoLJ4+hI2iPSBSEdTuhfCYADeJrAqERmiGQ2NNacYKRNEQ+gFbU4glgVyK8rxI+ZOe1onEtr/Pg==" - }, - "System.CommandLine.NamingConventionBinder": { - "type": "Transitive", - "resolved": "2.0.0-beta4.22272.1", - "contentHash": "ux2eUA/syF+JtlpMDc/Lsd6PBIBuwjH3AvHnestoh5uD0WKT5b+wkQxDWVCqp9qgVjMBTLNhX19ZYFtenunt9A==", - "dependencies": { - "System.CommandLine": "2.0.0-beta4.22272.1" - } - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "WoI5or8kY2VxFdDmsaRZ5yaYvvb+4MCyy66eXo79Cy1uMa7qXeGIlYmZx7R9Zy5S4xZjmqvkk2V8L6/vDwAAEA==" - }, "System.Diagnostics.EventLog": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "nhtTvAgKTD7f6t0bkOb4/hNv0PShb8GHs5Fhn7PvYhwhyWiVyVBvL2vTGH0Hlw5jOZQmWkzQxjY6M/h4tl8M6Q==" + "resolved": "10.0.7", + "contentHash": "WbmDLeTPYhEzXhvYVioTVn/D1XX6bovyny9n5p8Zxtf03+eY385RB818teZm6n+fA63iZNvng0/Np4tLuhkMhQ==" }, - "System.IO.Hashing": { + "System.Interactive.Async": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Rfm2jYCaUeGysFEZjDe7j1R4x6Z6BzumS/vUT5a1AA/AWJuGX71PoGB0RmpyX3VmrGqVnAwtfMn39OHR8Y/5+g==" + "resolved": "7.0.1", + "contentHash": "oL1iox7sAJL8i+muGzVMQjDB0axQgOoT5CkwYdap8cQJMkWDWMRErNqhOcZkn31+aKr/uCfgMEdhUARCU4G7gg==" }, - "System.IO.Pipelines": { + "System.IO.Hashing": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "5WXo+3MGcnYn54+1ojf+kRzKq1Q6sDUnovujNJ2ky1nl1/kP3+PMil9LPbFvZ2mkhvAGmQcY07G2sfHat/v0Fw==" + "resolved": "10.0.1", + "contentHash": "Dy6ULPb2S0GmNndjKrEIpfibNsc8+FTOoZnqygtFDuyun8vWboQbfMpQtKUXpgTxokR5E4zFHETpNnGfeWY6NA==" }, "System.Linq.Async": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", + "resolved": "7.0.1", + "contentHash": "gwQtBHVY/WgqWgAYSe4JspXR+f1FvMbVIW4ixsJpGV/Kj8Nun3zp1ajIdvCWfmac8ektJGVLiJ/OR8JU9nZnMg==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + "System.Interactive.Async": "7.0.1" } }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" - }, "System.Memory.Data": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "yliDgLh9S9Mcy5hBIdZmX6yphYIW3NH+3HN1kV1m7V1e0s7LNTw/tHNjJP4U9nSMEgl3w1TzYv/KA1Tg9NYy6w==" + "resolved": "10.0.3", + "contentHash": "MaGhRfGunmrj/nHjtsi9XkhlYJ/ERGWrbA+BiSKNtGnAjc9XlG5EhAvak6VRcX5LYzPF6pBO8nJ613dTgzabig==" }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "wLBKzFnDCxP12VL9ANydSYhk59fC4cvOr9ypYQLPnAj48NQIhqnjdD2yhP8yEKyBJEjERWS9DisKL7rX5eU25Q==" }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "HJPmqP2FsE+WVUUlTsZ4IFRSyzw40yz0ubiTnsaqm+Xo5fFZhVRvx6Zn8tLXj92/6pbre6OA4QL2A2vnCSKxJA==" - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "rnP61ZfloTgPQPe7ecr36loNiGX3g1PocxlKHdY/FUpDSsExKkTxpMAlB4X35wNEPr1X7mkYZuQvW3Lhxmu7KA==", - "dependencies": { - "System.IO.Pipelines": "9.0.5", - "System.Text.Encodings.Web": "9.0.5" - } - }, "packageuploader.clientapi": { "type": "Project", "dependencies": { - "Azure.Core": "[1.46.1, )", - "Azure.Identity": "[1.14.0, )", - "Azure.Storage.Blobs": "[12.24.1, )", - "Microsoft.Extensions.Configuration.Binder": "[9.0.5, )", - "Microsoft.Extensions.DependencyInjection.Abstractions": "[9.0.5, )", - "Microsoft.Extensions.Http": "[9.0.5, )", - "Microsoft.Extensions.Http.Polly": "[9.0.5, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[9.0.5, )", - "Microsoft.Extensions.Options.DataAnnotations": "[9.0.5, )", + "Azure.Core": "[1.54.0, )", + "Azure.Identity": "[1.21.0, )", + "Azure.Storage.Blobs": "[12.27.0, )", + "Microsoft.Extensions.Configuration.Binder": "[10.0.7, )", + "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.7, )", + "Microsoft.Extensions.Http": "[10.0.7, )", + "Microsoft.Extensions.Http.Polly": "[10.0.7, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.7, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.7, )", "Polly.Contrib.WaitAndRetry": "[1.1.1, )", - "System.Linq.Async": "[6.0.1, )", - "System.Text.Json": "[9.0.5, )" + "System.Linq.Async": "[7.0.1, )" } }, "packageuploader.filelogger": { "type": "Project", "dependencies": { - "Microsoft.Extensions.Logging": "[9.0.5, )", - "Microsoft.Extensions.Logging.Configuration": "[9.0.5, )", - "System.Text.Json": "[9.0.5, )" + "Microsoft.Extensions.Logging": "[10.0.7, )", + "Microsoft.Extensions.Logging.Configuration": "[10.0.7, )" } } }, - "net8.0/linux-x64": { + "net10.0/linux-x64": { "Microsoft.DotNet.ILCompiler": { "type": "Direct", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "09sjUN6lE2os7s3qZDKsZQvng84wquilKCMY+cWD993evNSW9kII9Gm6j+xI0bT/x0CNDdhkHDyAbB47ObF8Bw==", + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "2H7j1NltkQx04sPWBkUtFrZNBtro7vwsxRtdThP0oDj6Sn3ouGHCQlxATZ4Me2aJE67+KiXMX2V1IHDjt1uIpw==", "dependencies": { - "runtime.linux-x64.Microsoft.DotNet.ILCompiler": "8.0.17" + "runtime.linux-x64.Microsoft.DotNet.ILCompiler": "10.0.7" } }, "runtime.linux-x64.Microsoft.DotNet.ILCompiler": { "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "agBzgKp9qjC8jem23ik2fpYbYZWroAYcG7y6SOL8wOdB2uacBS5ERLQvc0enGaRmP5mJoCLqDkq9WFWvrHDhfw==" + "resolved": "10.0.7", + "contentHash": "bz+Di9NJXvaWTvoma5Pf9JrgFj6MGkbPo9dlWRo+jOHXDEme511jeWVEBWoPdoDe6BjDWRngGi9P9EUBCCgzgw==" }, "System.Diagnostics.EventLog": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "nhtTvAgKTD7f6t0bkOb4/hNv0PShb8GHs5Fhn7PvYhwhyWiVyVBvL2vTGH0Hlw5jOZQmWkzQxjY6M/h4tl8M6Q==" + "resolved": "10.0.7", + "contentHash": "WbmDLeTPYhEzXhvYVioTVn/D1XX6bovyny9n5p8Zxtf03+eY385RB818teZm6n+fA63iZNvng0/Np4tLuhkMhQ==" }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "wLBKzFnDCxP12VL9ANydSYhk59fC4cvOr9ypYQLPnAj48NQIhqnjdD2yhP8yEKyBJEjERWS9DisKL7rX5eU25Q==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "HJPmqP2FsE+WVUUlTsZ4IFRSyzw40yz0ubiTnsaqm+Xo5fFZhVRvx6Zn8tLXj92/6pbre6OA4QL2A2vnCSKxJA==" } }, - "net8.0/win-x64": { + "net10.0/win-x64": { "Microsoft.DotNet.ILCompiler": { "type": "Direct", - "requested": "[8.0.17, )", - "resolved": "8.0.17", - "contentHash": "09sjUN6lE2os7s3qZDKsZQvng84wquilKCMY+cWD993evNSW9kII9Gm6j+xI0bT/x0CNDdhkHDyAbB47ObF8Bw==", + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "2H7j1NltkQx04sPWBkUtFrZNBtro7vwsxRtdThP0oDj6Sn3ouGHCQlxATZ4Me2aJE67+KiXMX2V1IHDjt1uIpw==", "dependencies": { - "runtime.win-x64.Microsoft.DotNet.ILCompiler": "8.0.17" + "runtime.win-x64.Microsoft.DotNet.ILCompiler": "10.0.7" } }, "runtime.win-x64.Microsoft.DotNet.ILCompiler": { "type": "Transitive", - "resolved": "8.0.17", - "contentHash": "yIP2Mt0aAjyrfppVh3QQ67uFRy/G6lhcibhnunJABz3ulnOFM0U9x4V76IHf+0BrTTN/aIVw9gwUD6tbJXmJZg==" + "resolved": "10.0.7", + "contentHash": "pdlgAPDgcAMCi1XMrgKTPcovBzM0IG9j8LbsIyXS8XXXIrPRyygByqJPJnPtTPDIHxXsLmd3tlMEDULglbBdKA==" }, "System.Diagnostics.EventLog": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "nhtTvAgKTD7f6t0bkOb4/hNv0PShb8GHs5Fhn7PvYhwhyWiVyVBvL2vTGH0Hlw5jOZQmWkzQxjY6M/h4tl8M6Q==" + "resolved": "10.0.7", + "contentHash": "WbmDLeTPYhEzXhvYVioTVn/D1XX6bovyny9n5p8Zxtf03+eY385RB818teZm6n+fA63iZNvng0/Np4tLuhkMhQ==" }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "wLBKzFnDCxP12VL9ANydSYhk59fC4cvOr9ypYQLPnAj48NQIhqnjdD2yhP8yEKyBJEjERWS9DisKL7rX5eU25Q==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "HJPmqP2FsE+WVUUlTsZ4IFRSyzw40yz0ubiTnsaqm+Xo5fFZhVRvx6Zn8tLXj92/6pbre6OA4QL2A2vnCSKxJA==" } } } diff --git a/src/PackageUploader.ClientApi.Test/PackageUploader.ClientApi.Test.csproj b/src/PackageUploader.ClientApi.Test/PackageUploader.ClientApi.Test.csproj index 99c496eb..94306daa 100644 --- a/src/PackageUploader.ClientApi.Test/PackageUploader.ClientApi.Test.csproj +++ b/src/PackageUploader.ClientApi.Test/PackageUploader.ClientApi.Test.csproj @@ -1,17 +1,17 @@ - + - net8.0 + net10.0 false + enable true + true + true - - - - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/PackageUploader.ClientApi.Test/PackageUploaderServiceTest.cs b/src/PackageUploader.ClientApi.Test/PackageUploaderServiceTest.cs index 3a218886..c285b535 100644 --- a/src/PackageUploader.ClientApi.Test/PackageUploaderServiceTest.cs +++ b/src/PackageUploader.ClientApi.Test/PackageUploaderServiceTest.cs @@ -1,182 +1,182 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using PackageUploader.ClientApi.Client.Ingestion; -using PackageUploader.ClientApi.Client.Ingestion.Exceptions; -using PackageUploader.ClientApi.Client.Ingestion.Models; -using PackageUploader.ClientApi.Client.Xfus.Uploader; -using Microsoft.Extensions.Logging.Abstractions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; -using System; -using System.Net; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; -using PackageUploader.ClientApi.Client.Ingestion.Client; -using PackageUploader.ClientApi.Client.Ingestion.Models.Internal; -using System.Collections.Generic; -using Microsoft.Extensions.Logging; -using Moq.Protected; -using System.Net.Http.Json; -using PackageUploader.ClientApi.Client.Ingestion.Mappers; - -namespace PackageUploader.ClientApi.Test; - -[TestClass] -public class PackageUploaderServiceTest -{ - private const string TestBigId = "TestBigId"; - private const string TestProductId = "TestProductId"; - - private const string TestMovedPackageId = "TestMovedPackageId"; - private const string TestMovedPackageToId = "TestMovedPackageToId"; - - private const string TestUnauthorizedBigId = "TestUnauthorizedBigId"; - private const string TestUnauthorizedProductId = "TestUnauthorizedProductId"; - - private GameProduct _testProduct; - private PackageUploaderService _packageUploaderService; - private IngestionRedirectPackage _redirectPackage; - private IngestionGamePackage _movedPackage; - private IngestionHttpClient _ingestionClient; - - [TestInitialize] - public void Initialize() - { - _testProduct = new GameProduct - { - BigId = TestBigId, - ProductId = TestProductId, - }; - - _redirectPackage = new IngestionRedirectPackage - { - Id = TestMovedPackageId, - ToId = TestMovedPackageToId, - ProcessingState = GamePackageState.Processed.ToString() - }; - _movedPackage = new IngestionGamePackage - { - Id = TestMovedPackageToId, - State = GamePackageState.Processed.ToString(), - }; - - var logger = new NullLogger(); - - var ingestionClient = new Mock(); - ingestionClient.Setup(p => p.GetGameProductByLongIdAsync(TestProductId, It.IsAny())) - .ReturnsAsync(_testProduct); - ingestionClient.Setup(p => p.GetGameProductByBigIdAsync(TestBigId, It.IsAny())) - .ReturnsAsync(_testProduct); - - ingestionClient.Setup(p => p.GetGameProductByLongIdAsync(TestUnauthorizedProductId, It.IsAny())) - .ThrowsAsync(new HttpRequestException(string.Empty, null, HttpStatusCode.Unauthorized)); - ingestionClient.Setup(p => p.GetGameProductByBigIdAsync(TestUnauthorizedBigId, It.IsAny())) - .ThrowsAsync(new HttpRequestException(string.Empty, null, HttpStatusCode.Unauthorized)); - - ingestionClient.Setup(p => p.GetGameProductByLongIdAsync(It.IsNotIn(TestProductId, TestUnauthorizedProductId), It.IsAny())) - .ThrowsAsync(new ProductNotFoundException(string.Empty)); - ingestionClient.Setup(p => p.GetGameProductByBigIdAsync(It.IsNotIn(TestBigId, TestUnauthorizedBigId), It.IsAny())) - .ThrowsAsync(new ProductNotFoundException(string.Empty)); - - var xfusUploader = new Mock(); - - _packageUploaderService = new PackageUploaderService(ingestionClient.Object, xfusUploader.Object, logger); - - var httpClient = new Mock(); - // Helpful References: - // https://stackoverflow.com/questions/36425008/mocking-httpclient-in-unit-tests - //https://stackoverflow.com/questions/60094386/moq-verify-on-a-mocked-httpclienthandler-cant-access-the-content-object-becau - httpClient.Setup(p => p.SendAsync(It.Is(m => m.RequestUri.ToString().Contains($"products/{TestProductId}/packages/{TestMovedPackageId}")), - It.IsAny())) - .ReturnsAsync(() => new HttpResponseMessage(HttpStatusCode.MovedPermanently) { Content = JsonContent.Create(_redirectPackage) }); +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using PackageUploader.ClientApi.Client.Ingestion; +using PackageUploader.ClientApi.Client.Ingestion.Exceptions; +using PackageUploader.ClientApi.Client.Ingestion.Models; +using PackageUploader.ClientApi.Client.Xfus.Uploader; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using System; +using System.Net; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using PackageUploader.ClientApi.Client.Ingestion.Client; +using PackageUploader.ClientApi.Client.Ingestion.Models.Internal; +using System.Collections.Generic; +using Microsoft.Extensions.Logging; +using Moq.Protected; +using System.Net.Http.Json; +using PackageUploader.ClientApi.Client.Ingestion.Mappers; + +namespace PackageUploader.ClientApi.Test; + +[TestClass] +public class PackageUploaderServiceTest +{ + private const string TestBigId = "TestBigId"; + private const string TestProductId = "TestProductId"; + + private const string TestMovedPackageId = "TestMovedPackageId"; + private const string TestMovedPackageToId = "TestMovedPackageToId"; + + private const string TestUnauthorizedBigId = "TestUnauthorizedBigId"; + private const string TestUnauthorizedProductId = "TestUnauthorizedProductId"; + + private GameProduct _testProduct; + private PackageUploaderService _packageUploaderService; + private IngestionRedirectPackage _redirectPackage; + private IngestionGamePackage _movedPackage; + private IngestionHttpClient _ingestionClient; + + [TestInitialize] + public void Initialize() + { + _testProduct = new GameProduct + { + BigId = TestBigId, + ProductId = TestProductId, + }; + + _redirectPackage = new IngestionRedirectPackage + { + Id = TestMovedPackageId, + ToId = TestMovedPackageToId, + ProcessingState = GamePackageState.Processed.ToString() + }; + _movedPackage = new IngestionGamePackage + { + Id = TestMovedPackageToId, + State = GamePackageState.Processed.ToString(), + }; + + var logger = new NullLogger(); + + var ingestionClient = new Mock(); + ingestionClient.Setup(p => p.GetGameProductByLongIdAsync(TestProductId, It.IsAny())) + .ReturnsAsync(_testProduct); + ingestionClient.Setup(p => p.GetGameProductByBigIdAsync(TestBigId, It.IsAny())) + .ReturnsAsync(_testProduct); + + ingestionClient.Setup(p => p.GetGameProductByLongIdAsync(TestUnauthorizedProductId, It.IsAny())) + .ThrowsAsync(new HttpRequestException(string.Empty, null, HttpStatusCode.Unauthorized)); + ingestionClient.Setup(p => p.GetGameProductByBigIdAsync(TestUnauthorizedBigId, It.IsAny())) + .ThrowsAsync(new HttpRequestException(string.Empty, null, HttpStatusCode.Unauthorized)); + + ingestionClient.Setup(p => p.GetGameProductByLongIdAsync(It.IsNotIn(TestProductId, TestUnauthorizedProductId), It.IsAny())) + .ThrowsAsync(new ProductNotFoundException(string.Empty)); + ingestionClient.Setup(p => p.GetGameProductByBigIdAsync(It.IsNotIn(TestBigId, TestUnauthorizedBigId), It.IsAny())) + .ThrowsAsync(new ProductNotFoundException(string.Empty)); + + var xfusUploader = new Mock(); + + _packageUploaderService = new PackageUploaderService(ingestionClient.Object, xfusUploader.Object, logger); + + var httpClient = new Mock(); + // Helpful References: + // https://stackoverflow.com/questions/36425008/mocking-httpclient-in-unit-tests + //https://stackoverflow.com/questions/60094386/moq-verify-on-a-mocked-httpclienthandler-cant-access-the-content-object-becau + httpClient.Setup(p => p.SendAsync(It.Is(m => m.RequestUri.ToString().Contains($"products/{TestProductId}/packages/{TestMovedPackageId}")), + It.IsAny())) + .ReturnsAsync(() => new HttpResponseMessage(HttpStatusCode.MovedPermanently) { Content = JsonContent.Create(_redirectPackage) }); httpClient.Setup(p => p.SendAsync(It.Is(m => m.RequestUri.ToString().Contains($"products/{TestProductId}/packages/{TestMovedPackageToId}")), It.IsAny())) .ReturnsAsync(() => new HttpResponseMessage(HttpStatusCode.OK) { Content = JsonContent.Create(_movedPackage) }); var loggerIngestionClient = new NullLogger(); _ingestionClient = new IngestionHttpClient(loggerIngestionClient, httpClient.Object, null); - } - - [TestMethod] - public async Task GetProductByProductIdTest() - { - var productResult = await _packageUploaderService.GetProductByProductIdAsync(TestProductId, CancellationToken.None); - - Assert.IsNotNull(productResult); - Assert.AreEqual(TestProductId, productResult.ProductId); - } - - [TestMethod] - public async Task GetProductByBigIdTest() - { - var productResult = await _packageUploaderService.GetProductByBigIdAsync(TestBigId, CancellationToken.None); - - Assert.IsNotNull(productResult); - Assert.AreEqual(TestBigId, productResult.BigId); - } - - [TestMethod] - public async Task GetProductByProductIdNullTest() - { - await Assert.ThrowsExceptionAsync(() => _packageUploaderService.GetProductByProductIdAsync(null, CancellationToken.None)); - } - - [TestMethod] - public async Task GetProductByBigIdNullTest() - { - await Assert.ThrowsExceptionAsync(() => _packageUploaderService.GetProductByBigIdAsync(null, CancellationToken.None)); - } - - [TestMethod] - [DataRow("")] - [DataRow(" ")] - [DataRow(" ")] - public async Task GetProductByProductIdEmptyTest(string productId) - { - await Assert.ThrowsExceptionAsync(() => _packageUploaderService.GetProductByProductIdAsync(productId, CancellationToken.None)); - } - - [TestMethod] - [DataRow("")] - [DataRow(" ")] - [DataRow(" ")] - public async Task GetProductByBigIdEmptyTest(string bigId) - { - await Assert.ThrowsExceptionAsync(() => _packageUploaderService.GetProductByBigIdAsync(bigId, CancellationToken.None)); - } - - [TestMethod] - public async Task GetProductByProductIdNotFoundTest() - { - await Assert.ThrowsExceptionAsync(() => _packageUploaderService.GetProductByBigIdAsync("ProductIdNotFound", CancellationToken.None)); - } - - [TestMethod] - public async Task GetProductByBigIdNotFoundTest() - { - await Assert.ThrowsExceptionAsync(() => _packageUploaderService.GetProductByBigIdAsync("BigIdNotFound", CancellationToken.None)); - } - - [TestMethod] - public async Task GetProductByProductIdUnauthorizedTest() - { - await Assert.ThrowsExceptionAsync(() => _packageUploaderService.GetProductByProductIdAsync(TestUnauthorizedProductId, CancellationToken.None)); - } - - [TestMethod] - public async Task GetProductByBigIdUnauthorizedTest() - { - await Assert.ThrowsExceptionAsync(() => _packageUploaderService.GetProductByBigIdAsync(TestUnauthorizedBigId, CancellationToken.None)); - } - - [TestMethod] - public async Task GetPackageByIdAsyncRedirectTest() - { - var packageResult = await _ingestionClient.GetPackageByIdAsync(TestProductId, TestMovedPackageId, CancellationToken.None); - Assert.IsNotNull(packageResult); - Assert.AreEqual(TestMovedPackageToId, packageResult.Id); - Assert.AreEqual(_movedPackage.State, packageResult.State.ToString()); - } + } + + [TestMethod] + public async Task GetProductByProductIdTest() + { + var productResult = await _packageUploaderService.GetProductByProductIdAsync(TestProductId, CancellationToken.None); + + Assert.IsNotNull(productResult); + Assert.AreEqual(TestProductId, productResult.ProductId); + } + + [TestMethod] + public async Task GetProductByBigIdTest() + { + var productResult = await _packageUploaderService.GetProductByBigIdAsync(TestBigId, CancellationToken.None); + + Assert.IsNotNull(productResult); + Assert.AreEqual(TestBigId, productResult.BigId); + } + + [TestMethod] + public async Task GetProductByProductIdNullTest() + { + await Assert.ThrowsAsync(() => _packageUploaderService.GetProductByProductIdAsync(null, CancellationToken.None)); + } + + [TestMethod] + public async Task GetProductByBigIdNullTest() + { + await Assert.ThrowsAsync(() => _packageUploaderService.GetProductByBigIdAsync(null, CancellationToken.None)); + } + + [TestMethod] + [DataRow("")] + [DataRow(" ")] + [DataRow(" ")] + public async Task GetProductByProductIdEmptyTest(string productId) + { + await Assert.ThrowsAsync(() => _packageUploaderService.GetProductByProductIdAsync(productId, CancellationToken.None)); + } + + [TestMethod] + [DataRow("")] + [DataRow(" ")] + [DataRow(" ")] + public async Task GetProductByBigIdEmptyTest(string bigId) + { + await Assert.ThrowsAsync(() => _packageUploaderService.GetProductByBigIdAsync(bigId, CancellationToken.None)); + } + + [TestMethod] + public async Task GetProductByProductIdNotFoundTest() + { + await Assert.ThrowsAsync(() => _packageUploaderService.GetProductByBigIdAsync("ProductIdNotFound", CancellationToken.None)); + } + + [TestMethod] + public async Task GetProductByBigIdNotFoundTest() + { + await Assert.ThrowsAsync(() => _packageUploaderService.GetProductByBigIdAsync("BigIdNotFound", CancellationToken.None)); + } + + [TestMethod] + public async Task GetProductByProductIdUnauthorizedTest() + { + await Assert.ThrowsAsync(() => _packageUploaderService.GetProductByProductIdAsync(TestUnauthorizedProductId, CancellationToken.None)); + } + + [TestMethod] + public async Task GetProductByBigIdUnauthorizedTest() + { + await Assert.ThrowsAsync(() => _packageUploaderService.GetProductByBigIdAsync(TestUnauthorizedBigId, CancellationToken.None)); + } + + [TestMethod] + public async Task GetPackageByIdAsyncRedirectTest() + { + var packageResult = await _ingestionClient.GetPackageByIdAsync(TestProductId, TestMovedPackageId, CancellationToken.None); + Assert.IsNotNull(packageResult); + Assert.AreEqual(TestMovedPackageToId, packageResult.Id); + Assert.AreEqual(_movedPackage.State, packageResult.State.ToString()); + } } \ No newline at end of file diff --git a/src/PackageUploader.ClientApi.Test/packages.lock.json b/src/PackageUploader.ClientApi.Test/packages.lock.json index 13403cc8..b16213a9 100644 --- a/src/PackageUploader.ClientApi.Test/packages.lock.json +++ b/src/PackageUploader.ClientApi.Test/packages.lock.json @@ -1,21 +1,32 @@ { "version": 1, "dependencies": { - "net8.0": { + "net10.0": { "coverlet.collector": { "type": "Direct", - "requested": "[6.0.4, )", - "resolved": "6.0.4", - "contentHash": "lkhqpF8Pu2Y7IiN7OntbsTtdbpR1syMsm2F3IgX6ootA4ffRqWL5jF7XipHuZQTdVuWG/gVAAcf8mjk8Tz0xPg==" + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "WFejCcOUR6k8UYyDnnR6Gk+obFYMsWrZuNqPJnsVFGVhpPSN0y20D4qbdKJnXinYGx9PQ397Hf9TnU1NBST8vA==" }, - "Microsoft.NET.Test.Sdk": { + "Microsoft.Testing.Extensions.CodeCoverage": { "type": "Direct", - "requested": "[17.14.1, )", - "resolved": "17.14.1", - "contentHash": "HJKqKOE+vshXra2aEHpi2TlxYX7Z9VFYkr+E5rwEvHC8eIXiyO+K9kNm8vmNom3e2rA56WqxU+/N9NJlLGXsJQ==", + "requested": "[18.5.2, )", + "resolved": "18.5.2", + "contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==", "dependencies": { - "Microsoft.CodeCoverage": "17.14.1", - "Microsoft.TestPlatform.TestHost": "17.14.1" + "Microsoft.DiaSymReader": "2.2.3", + "Microsoft.Extensions.DependencyModel": "8.0.2", + "Microsoft.Testing.Platform": "2.1.0" + } + }, + "Microsoft.Testing.Extensions.TrxReport": { + "type": "Direct", + "requested": "[2.2.1, )", + "resolved": "2.2.1", + "contentHash": "FWaktPQHSiZh/+2ft2PHH/4bLlg8BKlrbLiil8mRcpoP0oHzKpgBfmN3QepGlAbxG0yDrZGN8tuPy77FYdEaMw==", + "dependencies": { + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.2.1", + "Microsoft.Testing.Platform": "2.2.1" } }, "Moq": { @@ -29,59 +40,62 @@ }, "MSTest.TestAdapter": { "type": "Direct", - "requested": "[3.9.1, )", - "resolved": "3.9.1", - "contentHash": "8WcUiZ28vHHU8ABVIFFZ9sZgmMcr7pg7YyAEOZ3XPaiqv4WZEybQsNIFFj+I1Z4R1pwbk42P2m2SfMByAVSBdw==", + "requested": "[4.2.1, )", + "resolved": "4.2.1", + "contentHash": "lZRgNzaQnffK4XLjM/og4Eoqp/3IkpcyJQQcyKXkPdkzCT3+ghpwHa9zG1xYhQDbUFoc54M+/waLwh31K9stDQ==", "dependencies": { - "Microsoft.Testing.Extensions.VSTestBridge": "1.7.1", - "Microsoft.Testing.Platform.MSBuild": "1.7.1" + "MSTest.TestFramework": "4.2.1", + "Microsoft.Testing.Extensions.VSTestBridge": "2.2.1", + "Microsoft.Testing.Platform.MSBuild": "2.2.1" } }, "MSTest.TestFramework": { "type": "Direct", - "requested": "[3.9.1, )", - "resolved": "3.9.1", - "contentHash": "qfcisTxYznujPUTmjIiezRxsCi3oLOAFSUBLQoo2g05nsZL/0ik0w9iy+92+ivS3cX7U1IGTacA13BtYYbdF7g==", + "requested": "[4.2.1, )", + "resolved": "4.2.1", + "contentHash": "I4/RbS2TpGZ56CE98+jPbrGlcerYtw2LvPVKzQGvyQQcJDekPy2Kd+fnThXYn+geJ1sW+vA9B7++rFNxvKcWxA==", "dependencies": { - "MSTest.Analyzers": "3.9.1" + "MSTest.Analyzers": "4.2.1" } }, "Azure.Core": { "type": "Transitive", - "resolved": "1.46.1", - "contentHash": "iE5DPOlGsN5kCkF4gN+vasN1RihO0Ypie92oQ5tohQYiokmnrrhLnee+3zcE8n7vB6ZAzhPTfUGAEXX/qHGkYA==", + "resolved": "1.54.0", + "contentHash": "m6hHbx1q9+GCBZ5A9ykzFylPdTwscX2APH7PlnqV+yu+DH3RRtuIDJMRqdU17cMyinv0hCPofpegoyQ6qWPW7g==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "System.ClientModel": "1.4.1", - "System.Memory.Data": "6.0.1" + "Microsoft.Bcl.AsyncInterfaces": "10.0.3", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.3", + "Microsoft.Identity.Client": "4.83.1", + "Microsoft.Identity.Client.Extensions.Msal": "4.83.1", + "System.ClientModel": "1.10.0", + "System.Memory.Data": "10.0.3" } }, "Azure.Identity": { "type": "Transitive", - "resolved": "1.14.0", - "contentHash": "xQ6mpNhifb8W/KG2BclhbJWAupvE3JF8lPEBF8t59Q5sc1yN0Ci+dvS0qXtc6m9auxwYpmc8rhOmK541dcGwmA==", + "resolved": "1.21.0", + "contentHash": "GeFv8sGwRKvDKwI2WFy8r0mhmlxEVZg24Sit2NogTjiSO8RVjllWM65OT6e1sKjOvG8V74y7hAbaELUUPjZQSw==", "dependencies": { - "Azure.Core": "1.46.1", - "Microsoft.Identity.Client": "4.71.1", - "Microsoft.Identity.Client.Extensions.Msal": "4.71.1", - "System.Memory": "4.5.5" + "Azure.Core": "1.53.0" } }, "Azure.Storage.Blobs": { "type": "Transitive", - "resolved": "12.24.1", - "contentHash": "479Z9ps9yl9XyhU45bbU2CU4e2B23S6FJiSiL9LpfZHU6eNXXD9Jb6rYdwY+qqmm852RhqICXBpX3Sql4DLBew==", + "resolved": "12.27.0", + "contentHash": "zI5rg1tTtnA8T2g2/21l+1iIUdDjpEQQ0FI1BabJVEQJ1JUyTQKrc41eNabAHs0SBHprl6pu/6OqIMK9Ve+4tQ==", "dependencies": { - "Azure.Storage.Common": "12.23.0" + "Azure.Core": "1.50.0", + "Azure.Storage.Common": "12.26.0" } }, "Azure.Storage.Common": { "type": "Transitive", - "resolved": "12.23.0", - "contentHash": "X/pe1LS3lC6s6MSL7A6FzRfnB6P72rNBt5oSuyan6Q4Jxr+KiN9Ufwqo32YLHOVfPcB8ESZZ4rBDketn+J37Rw==", + "resolved": "12.26.0", + "contentHash": "XaT6CDcSshZb7KaCTwc6m4EouZbLBg7ciOEpsJSdJCvkNsZJQCvPKw7V5TtXno19AA1NpwtsZriYque8mzbQVg==", "dependencies": { - "Azure.Core": "1.44.1", - "System.IO.Hashing": "6.0.0" + "Azure.Core": "1.50.0", + "System.IO.Hashing": "10.0.1" } }, "Castle.Core": { @@ -95,252 +109,249 @@ "Microsoft.ApplicationInsights": { "type": "Transitive", "resolved": "2.23.0", - "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "5.0.0" - } + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" + "resolved": "10.0.3", + "contentHash": "TV62UsrJZPX6gbt3c4WrtXh7bmaDIcMqf9uft1cc4L6gJXOU07hDGEh+bFQh/L2Az0R1WVOkiT66lFqS6G2NmA==" }, - "Microsoft.CodeCoverage": { + "Microsoft.DiaSymReader": { "type": "Transitive", - "resolved": "17.14.1", - "contentHash": "pmTrhfFIoplzFVbhVwUquT+77CbGH+h4/3mBpdmIlYtBi9nAB+kKI6dN3A/nV4DFi3wLLx/BlHIPK+MkbQ6Tpg==" + "resolved": "2.2.3", + "contentHash": "bhwzJfzyiJM0nXJyNB7Y9OfsEXyxLdDBHG99soIp5JjnPydwkOaBdRCtRtWgQh3noSLi2cSIZ/wpbHNNE9knxQ==" }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "uYXLg2Gt8KUH5nT3u+TBpg9VrRcN5+2zPmIjqEHR4kOoBwsbtMDncEJw9HiLvZqGgIo2TR4oraibAoy5hXn2bQ==", + "resolved": "10.0.7", + "contentHash": "wZbGh7J8R1vXN525O6d8dlcDTxhRTnd5MyW4LdfP5S0tSnTwTCseYSrq6g0Mxh7W9xn8P/2xPuf0D/m6k2dy2w==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "ew0G6gIznnyAkbIa67wXspkDFcVektjN3xaDAfBDIPbWph+rbuGaaohFxUSGw28ht7wdcWtTtElKnzfkcDDbOQ==", + "resolved": "10.0.7", + "contentHash": "t56nEgvECcyLPojZIUFWJknQQDAbgfTf9J+QMYJE1YYvVgz69vN6B/AKL8Grvj3Lcnp8kTpNqwmwFhb3YLJmtQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "7pQ4Tkyofm8DFWFhqn9ZmG8qSAC2VitWleATj5qob9V9KtoxCVdwRtmiVl/ha3WAgjkEfW++JLWXox9MJwMgkg==", + "resolved": "10.0.7", + "contentHash": "8bS1qIaRivny+WX+49pmeJ6iAylbtX8C0DLEcCQWZjdxQvLqaMssXiGD9P/6pYElrHbK5/nAHmjbQ8STqdMYeg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "N1Mn0T/tUBPoLL+Fzsp+VCEtneUhhxc1//Dx3BeuQ8AX+XrMlYCfnp2zgpEXnTCB7053CLdiqVWPZ7mEX6MPjg==", + "resolved": "10.0.7", + "contentHash": "91F/o3emPV/+xY/ip3s2LqDNF14kjttlVtq0BXgg6p4MnCzeSZxnUJm+t6WRrtD3JdGo88/oX+z7OwK4y8PZuw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "cjnRtsEAzU73aN6W7vkWy8Phj5t3Xm78HSqgrbh/O4Q9SK/yN73wZVa21QQY6amSLQRQ/M8N+koGnY6PuvKQsw==" + "resolved": "10.0.7", + "contentHash": "Z6mfFEaFcwCfSboxJwOLfu7/31npCY9q70WUamHW/vRQhDvBKOT4Vf9YkZj5J6hLvJpb0oDEYfHunQZj0xxvKw==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" }, "Microsoft.Extensions.Diagnostics": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "fRiUjmhm9e4vMp6WEO9MgWNxVtWSr4Pcgh1W4DyJIr8bRANlZz9JU7uicf7ShzMspDxo/9Ejo9zJ6qQZY0IhVw==", + "resolved": "10.0.7", + "contentHash": "l+smp1qPlU0OUXD0OGfdp7OUFrbdq7ZaP5T7m2WpfZ4RFKD7iG73BAT7tjSMxNmbSXkhAn1jYHOAqzYG1r9sNg==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.5", - "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.5", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.7", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.7" } }, "Microsoft.Extensions.Diagnostics.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "6YfTcULCYREMTqtk+s3UiszsFV2xN2FXtxdQpurmQJY9Cp/QGiM4MTKfJKUo7AzdLuzjOKKMWjQITmvtK7AsUg==", + "resolved": "10.0.7", + "contentHash": "uJ9JP677y+uy+C0vtaSfi7XXgFAdz8DhU3M9lwwIXDfQKcyQ0yxM9DVYa0NXDtdVTYA2eBUtVFZ8LY0GCdeE/w==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "4TD9AXDRsipTmaemwnjt/DM5Ri0de2JzHQhvZ4woBTjUtL4XrPNsMrOk5oiLJAx1gTrE6pOIhxv+lEde5F6CZA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "System.Diagnostics.DiagnosticSource": "9.0.5" + "Microsoft.Extensions.Primitives": "10.0.3" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "GdMpC10Jf6poxSvUJ4lgYpJ5F/kJeaAoJmrPufjBoPYyCTKKY5Dyl0rZA+LBNvFqTq1cZa/lhlptlUhNvU6xrg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.3", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.3", + "Microsoft.Extensions.Logging.Abstractions": "10.0.3" } }, "Microsoft.Extensions.Http": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "6vbo3XjyEc+w/kv/Dkfv9NA7iSdIdX5dlU9Shk3wJJ0fiZpCVzVW5FJtNoIePX5hS0ENNpHPClq/qtq06yM4FQ==", + "resolved": "10.0.7", + "contentHash": "1wbd+RPhRo3hJKNJhdGEO5ls0LGe55Ho4BUjlFtRUrWxDVVBd7g0Ydq9fbNy86pmvx/j7AGcSPo7YNCo1IRI6Q==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Diagnostics": "9.0.5", - "Microsoft.Extensions.Logging": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Diagnostics": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.Http.Polly": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "VCFPTik1LjPuUiS3vHy65UUzffm7MKGG6tBTFOrDklGDT36BsB9srrW+otYVT7nw6a/NbE8SM4kKsPzuRWxLRA==", + "resolved": "10.0.7", + "contentHash": "pcUsPoqMHvOp+QJsLA/Hlg/W+IBnAoUXKEBc7FqMcY0sUez15DOKXtbEo81TvHL9xwjWQcF3ZMayNpcvpI7Bqg==", "dependencies": { - "Microsoft.Extensions.Http": "9.0.5", + "Microsoft.Extensions.Http": "10.0.7", "Polly": "7.2.4", "Polly.Extensions.Http": "3.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "rQU61lrgvpE/UgcAd4E56HPxUIkX/VUQCxWmwDTLLVeuwRDYTL0q/FLGfAW17cGTKyCh7ywYAEnY3sTEvURsfg==", + "resolved": "10.0.7", + "contentHash": "hOeRIQ63GkgiYCB/MIFp+LQs8aXpJXpB55t6Aj37ab7t2/6WeFcPXxYM9hdy/o5tffzwf8mhqzLJP6mjGYCxjw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" + "Microsoft.Extensions.DependencyInjection": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "pP1PADCrIxMYJXxFmTVbAgEU7GVpjK5i0/tyfU9DiE0oXQy3JWQaOVgCkrCiePLgS8b5sghM3Fau3EeHiVWbCg==", + "resolved": "10.0.7", + "contentHash": "tIEcQ2gvERrH2KiCjdsVcHGhXt9lIsuDStfOIeZWr7/fP8IXhGiYfx0/80PNI7WPO2IYuFtlZLSlnTS8+/Mchw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "System.Diagnostics.DiagnosticSource": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "vPdJQU8YLOUSSK8NL0RmwcXJr2E0w8xH559PGQl4JYsglgilZr9LZnqV2zdgk+XR05+kuvhBEZKoDVd46o7NqA==", + "resolved": "10.0.7", + "contentHash": "00SHUGTh2jSMvIr6x9Xwd2nE+B5/qFCO/9hDwUDhJsjYRDlADmaBZ7tqehXzBDsfjHSXJzuRHJzPYPPjphBQ7Q==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "CJbAVdovKPFh2FoKxesu20odRVSbL/vtvzzObnG+5u38sOfzRS2Ncy25id0TjYUGQzMhNnJUHgTUzTMDl/3c9g==", + "resolved": "10.0.7", + "contentHash": "IT7f+EMXZtkjatEcF+o6aOw/7OE4etRrMiDGEWH/iiTu2R3uhC4NEQJCfHiibtX45U3sIQ5Fh6tbb1qaOz3YAg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Configuration.Binder": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Binder": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Options.DataAnnotations": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "3e1vlYqezeCEhjvx5z45zEfbwNNpOCRWo/hzd8Ittt93f3a4n/xz7JSOdf/Hg0v1/mo+wE0JADrl4k+KZ3f9uA==", + "resolved": "10.0.7", + "contentHash": "KWepqdSD4PxhFvVh3mckkvJ03u3q/VChkr6nT3nf5mm2XBk8ojxt2E4It0RMblb3GE7hJ0zQzFzxGKL0d6TfXA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "b4OAv1qE1C9aM+ShWJu3rlo/WjDwa/I30aIPXqDWSKXTtKl1Wwh6BZn+glH5HndGVVn3C6ZAPQj5nv7/7HJNBQ==" + "resolved": "10.0.7", + "contentHash": "D5M0Jr551iTgwkZMN9rm0pSkgNLj5quUWQUmQPMZh7k/bnvZTnXRGfE2KuvXf1EEjt/ofD9yw9IumpgdP9QCnw==" }, "Microsoft.Identity.Client": { "type": "Transitive", - "resolved": "4.71.1", - "contentHash": "SgvSBcMRvmEEyV10pcvxNVUbwYoShmj/9pxXFVr3AFjE26IUzuwYLtLgt58xkEnT0xJBjfObaXxcol3BMtmEAg==", + "resolved": "4.83.1", + "contentHash": "jOLIrZ3cynoqHLLO1cXplFFabrhrMEYs/EuKHvmCyrOm1axqiVFT6nCSnHxk7w5+d2BeQfCdM12Yf/0X7OeS1g==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.35.0", - "System.Diagnostics.DiagnosticSource": "6.0.1" + "Microsoft.IdentityModel.Abstractions": "8.14.0" } }, "Microsoft.Identity.Client.Extensions.Msal": { "type": "Transitive", - "resolved": "4.71.1", - "contentHash": "PGOHaoQhKBKnXy1kfW+Gu9/rxStKsqR+UZKeVv4XAsATdzmfj9y9kkUOftIjVFvxP3oh2Sk7v65ylS0K/qYADA==", + "resolved": "4.83.1", + "contentHash": "I3k4J4Hj4KbLEFanjeUzzDOVecukETaTgEkJ7h2pP/Yazs6SLp6TVUTo/Eo+ptPXMwvc+iX7rBFtMSUrA7R+Mg==", "dependencies": { - "Microsoft.Identity.Client": "4.71.1", + "Microsoft.Identity.Client": "4.83.1", "System.Security.Cryptography.ProtectedData": "4.5.0" } }, "Microsoft.IdentityModel.Abstractions": { "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "xuR8E4Rd96M41CnUSCiOJ2DBh+z+zQSmyrYHdYhD6K4fXBcQGVnRCFQ0efROUYpP+p0zC1BLKr0JRpVuujTZSg==" + "resolved": "8.14.0", + "contentHash": "iwbCpSjD3ehfTwBhtSNEtKPK0ICun6ov7Ibx6ISNA9bfwIyzI2Siwyi9eJFCJBwxowK9xcA1mj+jBWiigeqgcQ==" }, "Microsoft.Testing.Extensions.Telemetry": { "type": "Transitive", - "resolved": "1.7.1", - "contentHash": "k3A85bTVUwOyDZEVNkQnF2QxBaSyeaN/3BFCCeqQM7xpsn31yE4XthHBxHKK29bR0a3UCFVNs11ei53W7/flRw==", + "resolved": "2.2.1", + "contentHash": "7zB8BjffOyvqfHF26rFVPuK0w1fCf5+j1tLuhHIr76CqxXkGb+fMJtq6YNOV+m6qPytExHMXxluk3RgJ+dSIqw==", "dependencies": { "Microsoft.ApplicationInsights": "2.23.0", - "Microsoft.Testing.Platform": "1.7.1" + "Microsoft.Testing.Platform": "2.2.1" } }, "Microsoft.Testing.Extensions.TrxReport.Abstractions": { "type": "Transitive", - "resolved": "1.7.1", - "contentHash": "nOveCYpJlbCjFzzv8SQjuFAjGPCDrnvD3pWV4QvhHtEio3ixwH1CHY+vKJwFoM05twqDmIFWcdT0QQF7ZwIuFg==", + "resolved": "2.2.1", + "contentHash": "RD6D1Jx6cKDA5IHd1H2q8ylIuQG3PD+gdULI0JC8CvsRtaypFzTFpB5xDPuQi8o6kAkcM04cBhAiJPxZboNH2Q==", "dependencies": { - "Microsoft.Testing.Platform": "1.7.1" + "Microsoft.Testing.Platform": "2.2.1" } }, "Microsoft.Testing.Extensions.VSTestBridge": { "type": "Transitive", - "resolved": "1.7.1", - "contentHash": "V/HKxhVbuHrspAF9UfJmI5a2WdgliAkTMJIIz0ie+Ber+BRBsSOps/6jzG7BvuttiJr1Q++DPbMzukDQ5HCLGw==", + "resolved": "2.2.1", + "contentHash": "D8AGlkNtlTQPe3zf4SLnHBMr13lerMe0RuHSoRfnRatcuX/T7YbRtgn39rWBjKhXsNio0WXKrPKv3gfWE2I46w==", "dependencies": { - "Microsoft.TestPlatform.AdapterUtilities": "17.13.0", - "Microsoft.TestPlatform.ObjectModel": "17.13.0", - "Microsoft.Testing.Extensions.Telemetry": "1.7.1", - "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.7.1", - "Microsoft.Testing.Platform": "1.7.1" + "Microsoft.TestPlatform.ObjectModel": "18.3.0", + "Microsoft.Testing.Extensions.Telemetry": "2.2.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.2.1", + "Microsoft.Testing.Platform": "2.2.1" } }, "Microsoft.Testing.Platform": { "type": "Transitive", - "resolved": "1.7.1", - "contentHash": "3JTnSCETm2pduIwEchrbJj6HSpZ3UB5vMFDL1xKDZ3+vTsG0ANSv67IRu5gAgCUqIjwUudojH6NgjKPfJoHF/w==" + "resolved": "2.2.1", + "contentHash": "9bbPuls/b6/vUFzxbSjJLZlJHyKBfOZE5kjIY+ITI2ASqlFPJhR83BdLydJeQOCLEZhEbrEcz5xtt1B69nwSVg==" }, "Microsoft.Testing.Platform.MSBuild": { "type": "Transitive", - "resolved": "1.7.1", - "contentHash": "xaB2mfSwKO630XEPv8kyeoyBu6I0mkox1/RH88gNR9dVeQcrZJJXLMUDdqn7zKb0iZNw/zpDMj0sCYuvPqexVg==", + "resolved": "2.2.1", + "contentHash": "CSJOcZHfKlTyPbS0CTJk6iEnU4gJC+eUA5z72UBnMDRdgVHYOmB8k9Y7jT233gZjnCOQiYFg3acQHRfu2H62nw==", "dependencies": { - "Microsoft.Testing.Platform": "1.7.1" + "Microsoft.Testing.Platform": "2.2.1" } }, - "Microsoft.TestPlatform.AdapterUtilities": { - "type": "Transitive", - "resolved": "17.13.0", - "contentHash": "bFZ3uAhosdXjyXKURDQy37fPosCJQwedB5DG/SzsXL1QXsrfsIYty2kQMqCRRUqm8sBZBRHWRp4BT9SmpWXcKQ==" - }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.14.1", - "contentHash": "xTP1W6Mi6SWmuxd3a+jj9G9UoC850WGwZUps1Wah9r1ZxgXhdJfj1QqDLJkFjHDCvN42qDL2Ps5KjQYWUU0zcQ==", - "dependencies": { - "System.Reflection.Metadata": "8.0.0" - } - }, - "Microsoft.TestPlatform.TestHost": { - "type": "Transitive", - "resolved": "17.14.1", - "contentHash": "d78LPzGKkJwsJXAQwsbJJ7LE7D1wB+rAyhHHAaODF+RDSQ0NgMjDFkSA1Djw18VrxO76GlKAjRUhl+H8NL8Z+Q==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.14.1", - "Newtonsoft.Json": "13.0.3" - } + "resolved": "18.3.0", + "contentHash": "AEIEX2aWdPO9XbtR96eBaJxmXRD9vaI9uQ1T/JbPEKlTAZwYx0ZrMzKyULMdh/HH9Sg03kXCoN7LszQ90o6nPQ==" }, "MSTest.Analyzers": { "type": "Transitive", - "resolved": "3.9.1", - "contentHash": "q7DIC3IpH5uOReVPvc9AbHUU9BuijecP0/n4J7JWqSlXafkXofCtcY6cbfhNBdLqspep2liDH+W43LFEqUu9Qw==" - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + "resolved": "4.2.1", + "contentHash": "1i9jgE/42KGGyZ4s0MdrYM/Uu/dRYhbRfYQifcO0AZ6vw4sBXRjoQGQRGNSm771AYgPAmoGl0u4sJc2lMET6HQ==" }, "Polly": { "type": "Transitive", @@ -362,98 +373,62 @@ }, "System.ClientModel": { "type": "Transitive", - "resolved": "1.4.1", - "contentHash": "MY7eFGKp+Hu7Ciub8wigQ0odGrkml4eTjUy8d5Bu2eGAVvm8Qskkq+YuXiiS5wMJGq7iSvqseV4skd5WxTUdDA==", + "resolved": "1.10.0", + "contentHash": "lBEWs54F5Y5pZ9hC+8z4S/X76957ex+DPk7WecRHlbIHtrPfbRMMlOgI3iDn4Jpb3bSxvBnKaaHoD59auFjlBA==", "dependencies": { - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "System.Memory.Data": "6.0.1" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.3", + "Microsoft.Extensions.Logging.Abstractions": "10.0.3", + "System.Memory.Data": "10.0.3" } }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "WoI5or8kY2VxFdDmsaRZ5yaYvvb+4MCyy66eXo79Cy1uMa7qXeGIlYmZx7R9Zy5S4xZjmqvkk2V8L6/vDwAAEA==" - }, "System.Diagnostics.EventLog": { "type": "Transitive", "resolved": "6.0.0", "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" }, - "System.IO.Hashing": { + "System.Interactive.Async": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Rfm2jYCaUeGysFEZjDe7j1R4x6Z6BzumS/vUT5a1AA/AWJuGX71PoGB0RmpyX3VmrGqVnAwtfMn39OHR8Y/5+g==" + "resolved": "7.0.1", + "contentHash": "oL1iox7sAJL8i+muGzVMQjDB0axQgOoT5CkwYdap8cQJMkWDWMRErNqhOcZkn31+aKr/uCfgMEdhUARCU4G7gg==" }, - "System.IO.Pipelines": { + "System.IO.Hashing": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "5WXo+3MGcnYn54+1ojf+kRzKq1Q6sDUnovujNJ2ky1nl1/kP3+PMil9LPbFvZ2mkhvAGmQcY07G2sfHat/v0Fw==" + "resolved": "10.0.1", + "contentHash": "Dy6ULPb2S0GmNndjKrEIpfibNsc8+FTOoZnqygtFDuyun8vWboQbfMpQtKUXpgTxokR5E4zFHETpNnGfeWY6NA==" }, "System.Linq.Async": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", + "resolved": "7.0.1", + "contentHash": "gwQtBHVY/WgqWgAYSe4JspXR+f1FvMbVIW4ixsJpGV/Kj8Nun3zp1ajIdvCWfmac8ektJGVLiJ/OR8JU9nZnMg==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + "System.Interactive.Async": "7.0.1" } }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" - }, "System.Memory.Data": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "yliDgLh9S9Mcy5hBIdZmX6yphYIW3NH+3HN1kV1m7V1e0s7LNTw/tHNjJP4U9nSMEgl3w1TzYv/KA1Tg9NYy6w==" - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0" - } + "resolved": "10.0.3", + "contentHash": "MaGhRfGunmrj/nHjtsi9XkhlYJ/ERGWrbA+BiSKNtGnAjc9XlG5EhAvak6VRcX5LYzPF6pBO8nJ613dTgzabig==" }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "wLBKzFnDCxP12VL9ANydSYhk59fC4cvOr9ypYQLPnAj48NQIhqnjdD2yhP8yEKyBJEjERWS9DisKL7rX5eU25Q==" }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "HJPmqP2FsE+WVUUlTsZ4IFRSyzw40yz0ubiTnsaqm+Xo5fFZhVRvx6Zn8tLXj92/6pbre6OA4QL2A2vnCSKxJA==" - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "rnP61ZfloTgPQPe7ecr36loNiGX3g1PocxlKHdY/FUpDSsExKkTxpMAlB4X35wNEPr1X7mkYZuQvW3Lhxmu7KA==", - "dependencies": { - "System.IO.Pipelines": "9.0.5", - "System.Text.Encodings.Web": "9.0.5" - } - }, "packageuploader.clientapi": { "type": "Project", "dependencies": { - "Azure.Core": "[1.46.1, )", - "Azure.Identity": "[1.14.0, )", - "Azure.Storage.Blobs": "[12.24.1, )", - "Microsoft.Extensions.Configuration.Binder": "[9.0.5, )", - "Microsoft.Extensions.DependencyInjection.Abstractions": "[9.0.5, )", - "Microsoft.Extensions.Http": "[9.0.5, )", - "Microsoft.Extensions.Http.Polly": "[9.0.5, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[9.0.5, )", - "Microsoft.Extensions.Options.DataAnnotations": "[9.0.5, )", + "Azure.Core": "[1.54.0, )", + "Azure.Identity": "[1.21.0, )", + "Azure.Storage.Blobs": "[12.27.0, )", + "Microsoft.Extensions.Configuration.Binder": "[10.0.7, )", + "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.7, )", + "Microsoft.Extensions.Http": "[10.0.7, )", + "Microsoft.Extensions.Http.Polly": "[10.0.7, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.7, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.7, )", "Polly.Contrib.WaitAndRetry": "[1.1.1, )", - "System.Linq.Async": "[6.0.1, )", - "System.Text.Json": "[9.0.5, )" + "System.Linq.Async": "[7.0.1, )" } } } diff --git a/src/PackageUploader.ClientApi/Client/Ingestion/Models/Internal/IngestionRedirectPackage.cs b/src/PackageUploader.ClientApi/Client/Ingestion/Models/Internal/IngestionRedirectPackage.cs index a2a72ecf..689d245c 100644 --- a/src/PackageUploader.ClientApi/Client/Ingestion/Models/Internal/IngestionRedirectPackage.cs +++ b/src/PackageUploader.ClientApi/Client/Ingestion/Models/Internal/IngestionRedirectPackage.cs @@ -1,8 +1,7 @@ -using System; +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace PackageUploader.ClientApi.Client.Ingestion.Models.Internal { diff --git a/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/AzureTenantService.cs b/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/AzureTenantService.cs index d16a423c..c0bd38e8 100644 --- a/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/AzureTenantService.cs +++ b/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/AzureTenantService.cs @@ -2,7 +2,6 @@ // Licensed under the MIT License. using Azure.Core; -using Azure.Identity; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using PackageUploader.ClientApi.Client.Ingestion.TokenProvider.Config; diff --git a/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/CachableInteractiveBrowserCredentialAccessToken.cs b/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/CachableInteractiveBrowserCredentialAccessToken.cs index f472b0b0..945bab3e 100644 --- a/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/CachableInteractiveBrowserCredentialAccessToken.cs +++ b/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/CachableInteractiveBrowserCredentialAccessToken.cs @@ -1,4 +1,7 @@ -using Azure.Identity; +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using Azure.Identity; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Microsoft.Identity.Client.Extensions.Msal; diff --git a/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/ClientCertificateCredentialAccessTokenProvider.cs b/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/ClientCertificateCredentialAccessTokenProvider.cs index 081d9e0c..d3a2f615 100644 --- a/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/ClientCertificateCredentialAccessTokenProvider.cs +++ b/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/ClientCertificateCredentialAccessTokenProvider.cs @@ -44,14 +44,11 @@ public async Task GetTokenAsync(CancellationToken ct) if (!string.IsNullOrEmpty(_clientCertificateAuthInfo.CertificatePassword)) { - certificate = new X509Certificate2( - _clientCertificateAuthInfo.CertificatePath, - _clientCertificateAuthInfo.CertificatePassword, - X509KeyStorageFlags.DefaultKeySet); + certificate = X509CertificateLoader.LoadPkcs12FromFile(_clientCertificateAuthInfo.CertificatePath, _clientCertificateAuthInfo.CertificatePassword); } else { - certificate = new X509Certificate2(_clientCertificateAuthInfo.CertificatePath); + certificate = X509CertificateLoader.LoadPkcs12FromFile(_clientCertificateAuthInfo.CertificatePath, null); } var azureCredentialOptions = SetTokenCredentialOptions(new ClientCertificateCredentialOptions()); diff --git a/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/ManagedIdentityCredentialAccessTokenProvider.cs b/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/ManagedIdentityCredentialAccessTokenProvider.cs index e1b542f3..7063ff1b 100644 --- a/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/ManagedIdentityCredentialAccessTokenProvider.cs +++ b/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/ManagedIdentityCredentialAccessTokenProvider.cs @@ -23,8 +23,9 @@ public ManagedIdentityCredentialAccessTokenProvider(IOptions GetTokenAsync(CancellationToken ct) { - var azureCredentialOptions = SetTokenCredentialOptions(new ManagedIdentityCredentialOptions()); - var azureCredential = new ManagedIdentityCredential(_managedIdentityAuthInfo.ClientId, azureCredentialOptions); + var managedIdentity = ManagedIdentityId.FromUserAssignedClientId(_managedIdentityAuthInfo.ClientId); + var azureCredentialOptions = SetTokenCredentialOptions(new ManagedIdentityCredentialOptions(managedIdentity)); + var azureCredential = new ManagedIdentityCredential(azureCredentialOptions); return await GetIngestionAccessTokenAsync(azureCredential, ct).ConfigureAwait(false); } diff --git a/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/ManagedIdentityFederatedCredentialAccessTokenProvider.cs b/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/ManagedIdentityFederatedCredentialAccessTokenProvider.cs index 50d3cc98..1620037d 100644 --- a/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/ManagedIdentityFederatedCredentialAccessTokenProvider.cs +++ b/src/PackageUploader.ClientApi/Client/Ingestion/TokenProvider/ManagedIdentityFederatedCredentialAccessTokenProvider.cs @@ -24,8 +24,9 @@ public ManagedIdentityFederatedCredentialAccessTokenProvider(IOptions GetTokenAsync(CancellationToken ct) { - var miCredentialOptions = SetTokenCredentialOptions(new ManagedIdentityCredentialOptions()); - var miCredential = new ManagedIdentityCredential(_managedIdentityFederatedAuthInfo.ClientId, miCredentialOptions); + var managedIdentity = ManagedIdentityId.FromUserAssignedClientId(_managedIdentityFederatedAuthInfo.ClientId); + var miCredentialOptions = SetTokenCredentialOptions(new ManagedIdentityCredentialOptions(managedIdentity)); + var miCredential = new ManagedIdentityCredential(miCredentialOptions); var tokenRequestContext = new TokenRequestContext(["api://AzureADTokenExchange/.default"]); var azureCredentialOptions = SetTokenCredentialOptions(new ClientAssertionCredentialOptions()); diff --git a/src/PackageUploader.ClientApi/PackageUploader.ClientApi.csproj b/src/PackageUploader.ClientApi/PackageUploader.ClientApi.csproj index b8342a01..2f4da55e 100644 --- a/src/PackageUploader.ClientApi/PackageUploader.ClientApi.csproj +++ b/src/PackageUploader.ClientApi/PackageUploader.ClientApi.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 © Microsoft Corporation embedded true @@ -13,18 +13,17 @@ - - - - - - - - - + + + + + + + + + - - + diff --git a/src/PackageUploader.ClientApi/packages.lock.json b/src/PackageUploader.ClientApi/packages.lock.json index b6597cac..c8129d23 100644 --- a/src/PackageUploader.ClientApi/packages.lock.json +++ b/src/PackageUploader.ClientApi/packages.lock.json @@ -1,107 +1,110 @@ { "version": 1, "dependencies": { - "net8.0": { + "net10.0": { "Azure.Core": { "type": "Direct", - "requested": "[1.46.1, )", - "resolved": "1.46.1", - "contentHash": "iE5DPOlGsN5kCkF4gN+vasN1RihO0Ypie92oQ5tohQYiokmnrrhLnee+3zcE8n7vB6ZAzhPTfUGAEXX/qHGkYA==", + "requested": "[1.54.0, )", + "resolved": "1.54.0", + "contentHash": "m6hHbx1q9+GCBZ5A9ykzFylPdTwscX2APH7PlnqV+yu+DH3RRtuIDJMRqdU17cMyinv0hCPofpegoyQ6qWPW7g==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "System.ClientModel": "1.4.1", - "System.Memory.Data": "6.0.1" + "Microsoft.Bcl.AsyncInterfaces": "10.0.3", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.3", + "Microsoft.Identity.Client": "4.83.1", + "Microsoft.Identity.Client.Extensions.Msal": "4.83.1", + "System.ClientModel": "1.10.0", + "System.Memory.Data": "10.0.3" } }, "Azure.Identity": { "type": "Direct", - "requested": "[1.14.0, )", - "resolved": "1.14.0", - "contentHash": "xQ6mpNhifb8W/KG2BclhbJWAupvE3JF8lPEBF8t59Q5sc1yN0Ci+dvS0qXtc6m9auxwYpmc8rhOmK541dcGwmA==", + "requested": "[1.21.0, )", + "resolved": "1.21.0", + "contentHash": "GeFv8sGwRKvDKwI2WFy8r0mhmlxEVZg24Sit2NogTjiSO8RVjllWM65OT6e1sKjOvG8V74y7hAbaELUUPjZQSw==", "dependencies": { - "Azure.Core": "1.46.1", - "Microsoft.Identity.Client": "4.71.1", - "Microsoft.Identity.Client.Extensions.Msal": "4.71.1", - "System.Memory": "4.5.5" + "Azure.Core": "1.53.0" } }, "Azure.Storage.Blobs": { "type": "Direct", - "requested": "[12.24.1, )", - "resolved": "12.24.1", - "contentHash": "479Z9ps9yl9XyhU45bbU2CU4e2B23S6FJiSiL9LpfZHU6eNXXD9Jb6rYdwY+qqmm852RhqICXBpX3Sql4DLBew==", + "requested": "[12.27.0, )", + "resolved": "12.27.0", + "contentHash": "zI5rg1tTtnA8T2g2/21l+1iIUdDjpEQQ0FI1BabJVEQJ1JUyTQKrc41eNabAHs0SBHprl6pu/6OqIMK9Ve+4tQ==", "dependencies": { - "Azure.Storage.Common": "12.23.0" + "Azure.Core": "1.50.0", + "Azure.Storage.Common": "12.26.0" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Direct", - "requested": "[9.0.5, )", - "resolved": "9.0.5", - "contentHash": "7pQ4Tkyofm8DFWFhqn9ZmG8qSAC2VitWleATj5qob9V9KtoxCVdwRtmiVl/ha3WAgjkEfW++JLWXox9MJwMgkg==", + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "8bS1qIaRivny+WX+49pmeJ6iAylbtX8C0DLEcCQWZjdxQvLqaMssXiGD9P/6pYElrHbK5/nAHmjbQ8STqdMYeg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Direct", - "requested": "[9.0.5, )", - "resolved": "9.0.5", - "contentHash": "cjnRtsEAzU73aN6W7vkWy8Phj5t3Xm78HSqgrbh/O4Q9SK/yN73wZVa21QQY6amSLQRQ/M8N+koGnY6PuvKQsw==" + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "Z6mfFEaFcwCfSboxJwOLfu7/31npCY9q70WUamHW/vRQhDvBKOT4Vf9YkZj5J6hLvJpb0oDEYfHunQZj0xxvKw==" }, "Microsoft.Extensions.Http": { "type": "Direct", - "requested": "[9.0.5, )", - "resolved": "9.0.5", - "contentHash": "6vbo3XjyEc+w/kv/Dkfv9NA7iSdIdX5dlU9Shk3wJJ0fiZpCVzVW5FJtNoIePX5hS0ENNpHPClq/qtq06yM4FQ==", + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "1wbd+RPhRo3hJKNJhdGEO5ls0LGe55Ho4BUjlFtRUrWxDVVBd7g0Ydq9fbNy86pmvx/j7AGcSPo7YNCo1IRI6Q==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Diagnostics": "9.0.5", - "Microsoft.Extensions.Logging": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Diagnostics": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[9.0.5, )", - "resolved": "9.0.5", - "contentHash": "VCFPTik1LjPuUiS3vHy65UUzffm7MKGG6tBTFOrDklGDT36BsB9srrW+otYVT7nw6a/NbE8SM4kKsPzuRWxLRA==", + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "pcUsPoqMHvOp+QJsLA/Hlg/W+IBnAoUXKEBc7FqMcY0sUez15DOKXtbEo81TvHL9xwjWQcF3ZMayNpcvpI7Bqg==", "dependencies": { - "Microsoft.Extensions.Http": "9.0.5", + "Microsoft.Extensions.Http": "10.0.7", "Polly": "7.2.4", "Polly.Extensions.Http": "3.0.0" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Direct", - "requested": "[9.0.5, )", - "resolved": "9.0.5", - "contentHash": "CJbAVdovKPFh2FoKxesu20odRVSbL/vtvzzObnG+5u38sOfzRS2Ncy25id0TjYUGQzMhNnJUHgTUzTMDl/3c9g==", + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "IT7f+EMXZtkjatEcF+o6aOw/7OE4etRrMiDGEWH/iiTu2R3uhC4NEQJCfHiibtX45U3sIQ5Fh6tbb1qaOz3YAg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Configuration.Binder": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Binder": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Options.DataAnnotations": { "type": "Direct", - "requested": "[9.0.5, )", - "resolved": "9.0.5", - "contentHash": "3e1vlYqezeCEhjvx5z45zEfbwNNpOCRWo/hzd8Ittt93f3a4n/xz7JSOdf/Hg0v1/mo+wE0JADrl4k+KZ3f9uA==", + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "KWepqdSD4PxhFvVh3mckkvJ03u3q/VChkr6nT3nf5mm2XBk8ojxt2E4It0RMblb3GE7hJ0zQzFzxGKL0d6TfXA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.25, )", - "resolved": "8.0.25", - "contentHash": "sqX4nmBft05ivqKvUT4nxaN8rT3apCLt9SWFkfRrQPwra1zPwFknQAw1lleuMCKOCLvVmOWwrC2iPSm9RiXZUg==" + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "AA/yhzFHNtQZXLdqjzujPy25G8EWwGWsAnxOE2zYSBoT/8QHP6ketN3CToD3DFreO653ipUwnKHo22B8AlBMCw==" }, "Polly.Contrib.WaitAndRetry": { "type": "Direct", @@ -111,137 +114,144 @@ }, "System.Linq.Async": { "type": "Direct", - "requested": "[6.0.1, )", - "resolved": "6.0.1", - "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", + "requested": "[7.0.1, )", + "resolved": "7.0.1", + "contentHash": "gwQtBHVY/WgqWgAYSe4JspXR+f1FvMbVIW4ixsJpGV/Kj8Nun3zp1ajIdvCWfmac8ektJGVLiJ/OR8JU9nZnMg==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0" - } - }, - "System.Text.Json": { - "type": "Direct", - "requested": "[9.0.5, )", - "resolved": "9.0.5", - "contentHash": "rnP61ZfloTgPQPe7ecr36loNiGX3g1PocxlKHdY/FUpDSsExKkTxpMAlB4X35wNEPr1X7mkYZuQvW3Lhxmu7KA==", - "dependencies": { - "System.IO.Pipelines": "9.0.5", - "System.Text.Encodings.Web": "9.0.5" + "System.Interactive.Async": "7.0.1" } }, "Azure.Storage.Common": { "type": "Transitive", - "resolved": "12.23.0", - "contentHash": "X/pe1LS3lC6s6MSL7A6FzRfnB6P72rNBt5oSuyan6Q4Jxr+KiN9Ufwqo32YLHOVfPcB8ESZZ4rBDketn+J37Rw==", + "resolved": "12.26.0", + "contentHash": "XaT6CDcSshZb7KaCTwc6m4EouZbLBg7ciOEpsJSdJCvkNsZJQCvPKw7V5TtXno19AA1NpwtsZriYque8mzbQVg==", "dependencies": { - "Azure.Core": "1.44.1", - "System.IO.Hashing": "6.0.0" + "Azure.Core": "1.50.0", + "System.IO.Hashing": "10.0.1" } }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" + "resolved": "10.0.3", + "contentHash": "TV62UsrJZPX6gbt3c4WrtXh7bmaDIcMqf9uft1cc4L6gJXOU07hDGEh+bFQh/L2Az0R1WVOkiT66lFqS6G2NmA==" }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "uYXLg2Gt8KUH5nT3u+TBpg9VrRcN5+2zPmIjqEHR4kOoBwsbtMDncEJw9HiLvZqGgIo2TR4oraibAoy5hXn2bQ==", + "resolved": "10.0.7", + "contentHash": "wZbGh7J8R1vXN525O6d8dlcDTxhRTnd5MyW4LdfP5S0tSnTwTCseYSrq6g0Mxh7W9xn8P/2xPuf0D/m6k2dy2w==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "ew0G6gIznnyAkbIa67wXspkDFcVektjN3xaDAfBDIPbWph+rbuGaaohFxUSGw28ht7wdcWtTtElKnzfkcDDbOQ==", + "resolved": "10.0.7", + "contentHash": "t56nEgvECcyLPojZIUFWJknQQDAbgfTf9J+QMYJE1YYvVgz69vN6B/AKL8Grvj3Lcnp8kTpNqwmwFhb3YLJmtQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "N1Mn0T/tUBPoLL+Fzsp+VCEtneUhhxc1//Dx3BeuQ8AX+XrMlYCfnp2zgpEXnTCB7053CLdiqVWPZ7mEX6MPjg==", + "resolved": "10.0.7", + "contentHash": "91F/o3emPV/+xY/ip3s2LqDNF14kjttlVtq0BXgg6p4MnCzeSZxnUJm+t6WRrtD3JdGo88/oX+z7OwK4y8PZuw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Diagnostics": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "fRiUjmhm9e4vMp6WEO9MgWNxVtWSr4Pcgh1W4DyJIr8bRANlZz9JU7uicf7ShzMspDxo/9Ejo9zJ6qQZY0IhVw==", + "resolved": "10.0.7", + "contentHash": "l+smp1qPlU0OUXD0OGfdp7OUFrbdq7ZaP5T7m2WpfZ4RFKD7iG73BAT7tjSMxNmbSXkhAn1jYHOAqzYG1r9sNg==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.5", - "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.5", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.7", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.7" } }, "Microsoft.Extensions.Diagnostics.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "6YfTcULCYREMTqtk+s3UiszsFV2xN2FXtxdQpurmQJY9Cp/QGiM4MTKfJKUo7AzdLuzjOKKMWjQITmvtK7AsUg==", + "resolved": "10.0.7", + "contentHash": "uJ9JP677y+uy+C0vtaSfi7XXgFAdz8DhU3M9lwwIXDfQKcyQ0yxM9DVYa0NXDtdVTYA2eBUtVFZ8LY0GCdeE/w==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "4TD9AXDRsipTmaemwnjt/DM5Ri0de2JzHQhvZ4woBTjUtL4XrPNsMrOk5oiLJAx1gTrE6pOIhxv+lEde5F6CZA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.3" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "10.0.3", + "contentHash": "GdMpC10Jf6poxSvUJ4lgYpJ5F/kJeaAoJmrPufjBoPYyCTKKY5Dyl0rZA+LBNvFqTq1cZa/lhlptlUhNvU6xrg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "System.Diagnostics.DiagnosticSource": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.3", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.3", + "Microsoft.Extensions.Logging.Abstractions": "10.0.3" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "rQU61lrgvpE/UgcAd4E56HPxUIkX/VUQCxWmwDTLLVeuwRDYTL0q/FLGfAW17cGTKyCh7ywYAEnY3sTEvURsfg==", + "resolved": "10.0.7", + "contentHash": "hOeRIQ63GkgiYCB/MIFp+LQs8aXpJXpB55t6Aj37ab7t2/6WeFcPXxYM9hdy/o5tffzwf8mhqzLJP6mjGYCxjw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" + "Microsoft.Extensions.DependencyInjection": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "pP1PADCrIxMYJXxFmTVbAgEU7GVpjK5i0/tyfU9DiE0oXQy3JWQaOVgCkrCiePLgS8b5sghM3Fau3EeHiVWbCg==", + "resolved": "10.0.7", + "contentHash": "tIEcQ2gvERrH2KiCjdsVcHGhXt9lIsuDStfOIeZWr7/fP8IXhGiYfx0/80PNI7WPO2IYuFtlZLSlnTS8+/Mchw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "System.Diagnostics.DiagnosticSource": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "vPdJQU8YLOUSSK8NL0RmwcXJr2E0w8xH559PGQl4JYsglgilZr9LZnqV2zdgk+XR05+kuvhBEZKoDVd46o7NqA==", + "resolved": "10.0.7", + "contentHash": "00SHUGTh2jSMvIr6x9Xwd2nE+B5/qFCO/9hDwUDhJsjYRDlADmaBZ7tqehXzBDsfjHSXJzuRHJzPYPPjphBQ7Q==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "b4OAv1qE1C9aM+ShWJu3rlo/WjDwa/I30aIPXqDWSKXTtKl1Wwh6BZn+glH5HndGVVn3C6ZAPQj5nv7/7HJNBQ==" + "resolved": "10.0.7", + "contentHash": "D5M0Jr551iTgwkZMN9rm0pSkgNLj5quUWQUmQPMZh7k/bnvZTnXRGfE2KuvXf1EEjt/ofD9yw9IumpgdP9QCnw==" }, "Microsoft.Identity.Client": { "type": "Transitive", - "resolved": "4.71.1", - "contentHash": "SgvSBcMRvmEEyV10pcvxNVUbwYoShmj/9pxXFVr3AFjE26IUzuwYLtLgt58xkEnT0xJBjfObaXxcol3BMtmEAg==", + "resolved": "4.83.1", + "contentHash": "jOLIrZ3cynoqHLLO1cXplFFabrhrMEYs/EuKHvmCyrOm1axqiVFT6nCSnHxk7w5+d2BeQfCdM12Yf/0X7OeS1g==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.35.0", - "System.Diagnostics.DiagnosticSource": "6.0.1" + "Microsoft.IdentityModel.Abstractions": "8.14.0" } }, "Microsoft.Identity.Client.Extensions.Msal": { "type": "Transitive", - "resolved": "4.71.1", - "contentHash": "PGOHaoQhKBKnXy1kfW+Gu9/rxStKsqR+UZKeVv4XAsATdzmfj9y9kkUOftIjVFvxP3oh2Sk7v65ylS0K/qYADA==", + "resolved": "4.83.1", + "contentHash": "I3k4J4Hj4KbLEFanjeUzzDOVecukETaTgEkJ7h2pP/Yazs6SLp6TVUTo/Eo+ptPXMwvc+iX7rBFtMSUrA7R+Mg==", "dependencies": { - "Microsoft.Identity.Client": "4.71.1", + "Microsoft.Identity.Client": "4.83.1", "System.Security.Cryptography.ProtectedData": "4.5.0" } }, "Microsoft.IdentityModel.Abstractions": { "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "xuR8E4Rd96M41CnUSCiOJ2DBh+z+zQSmyrYHdYhD6K4fXBcQGVnRCFQ0efROUYpP+p0zC1BLKr0JRpVuujTZSg==" + "resolved": "8.14.0", + "contentHash": "iwbCpSjD3ehfTwBhtSNEtKPK0ICun6ov7Ibx6ISNA9bfwIyzI2Siwyi9eJFCJBwxowK9xcA1mj+jBWiigeqgcQ==" }, "Polly": { "type": "Transitive", @@ -258,47 +268,34 @@ }, "System.ClientModel": { "type": "Transitive", - "resolved": "1.4.1", - "contentHash": "MY7eFGKp+Hu7Ciub8wigQ0odGrkml4eTjUy8d5Bu2eGAVvm8Qskkq+YuXiiS5wMJGq7iSvqseV4skd5WxTUdDA==", + "resolved": "1.10.0", + "contentHash": "lBEWs54F5Y5pZ9hC+8z4S/X76957ex+DPk7WecRHlbIHtrPfbRMMlOgI3iDn4Jpb3bSxvBnKaaHoD59auFjlBA==", "dependencies": { - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "System.Memory.Data": "6.0.1" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.3", + "Microsoft.Extensions.Logging.Abstractions": "10.0.3", + "System.Memory.Data": "10.0.3" } }, - "System.Diagnostics.DiagnosticSource": { + "System.Interactive.Async": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "WoI5or8kY2VxFdDmsaRZ5yaYvvb+4MCyy66eXo79Cy1uMa7qXeGIlYmZx7R9Zy5S4xZjmqvkk2V8L6/vDwAAEA==" + "resolved": "7.0.1", + "contentHash": "oL1iox7sAJL8i+muGzVMQjDB0axQgOoT5CkwYdap8cQJMkWDWMRErNqhOcZkn31+aKr/uCfgMEdhUARCU4G7gg==" }, "System.IO.Hashing": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Rfm2jYCaUeGysFEZjDe7j1R4x6Z6BzumS/vUT5a1AA/AWJuGX71PoGB0RmpyX3VmrGqVnAwtfMn39OHR8Y/5+g==" - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "5WXo+3MGcnYn54+1ojf+kRzKq1Q6sDUnovujNJ2ky1nl1/kP3+PMil9LPbFvZ2mkhvAGmQcY07G2sfHat/v0Fw==" - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + "resolved": "10.0.1", + "contentHash": "Dy6ULPb2S0GmNndjKrEIpfibNsc8+FTOoZnqygtFDuyun8vWboQbfMpQtKUXpgTxokR5E4zFHETpNnGfeWY6NA==" }, "System.Memory.Data": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "yliDgLh9S9Mcy5hBIdZmX6yphYIW3NH+3HN1kV1m7V1e0s7LNTw/tHNjJP4U9nSMEgl3w1TzYv/KA1Tg9NYy6w==" + "resolved": "10.0.3", + "contentHash": "MaGhRfGunmrj/nHjtsi9XkhlYJ/ERGWrbA+BiSKNtGnAjc9XlG5EhAvak6VRcX5LYzPF6pBO8nJ613dTgzabig==" }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "wLBKzFnDCxP12VL9ANydSYhk59fC4cvOr9ypYQLPnAj48NQIhqnjdD2yhP8yEKyBJEjERWS9DisKL7rX5eU25Q==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "HJPmqP2FsE+WVUUlTsZ4IFRSyzw40yz0ubiTnsaqm+Xo5fFZhVRvx6Zn8tLXj92/6pbre6OA4QL2A2vnCSKxJA==" } } } diff --git a/src/PackageUploader.FileLogger/PackageUploader.FileLogger.csproj b/src/PackageUploader.FileLogger/PackageUploader.FileLogger.csproj index 020ae99b..dec9b2d3 100644 --- a/src/PackageUploader.FileLogger/PackageUploader.FileLogger.csproj +++ b/src/PackageUploader.FileLogger/PackageUploader.FileLogger.csproj @@ -1,7 +1,7 @@  - net8.0 + net10.0 embedded true true @@ -12,9 +12,8 @@ - - - + + diff --git a/src/PackageUploader.FileLogger/packages.lock.json b/src/PackageUploader.FileLogger/packages.lock.json index 37e8ff39..801582f9 100644 --- a/src/PackageUploader.FileLogger/packages.lock.json +++ b/src/PackageUploader.FileLogger/packages.lock.json @@ -1,137 +1,112 @@ { "version": 1, "dependencies": { - "net8.0": { + "net10.0": { "Microsoft.Extensions.Logging": { "type": "Direct", - "requested": "[9.0.5, )", - "resolved": "9.0.5", - "contentHash": "rQU61lrgvpE/UgcAd4E56HPxUIkX/VUQCxWmwDTLLVeuwRDYTL0q/FLGfAW17cGTKyCh7ywYAEnY3sTEvURsfg==", + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "hOeRIQ63GkgiYCB/MIFp+LQs8aXpJXpB55t6Aj37ab7t2/6WeFcPXxYM9hdy/o5tffzwf8mhqzLJP6mjGYCxjw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" + "Microsoft.Extensions.DependencyInjection": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Direct", - "requested": "[9.0.5, )", - "resolved": "9.0.5", - "contentHash": "WgYTJ1/dxdzqaYYMrgC6cZXJVmaoxUmWgsvR9Kg5ZARpy0LMw7fZIZMIiVuaxhItwwFIW0ruhAN+Er2/oVZgmQ==", + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "7BBnoGF37USiu7j434put9mDp7EjdlNDIZsR4vHfC1FbLZeLqiWjgJbeEtF0p59Ryqt8AtraHawf0ZKbe5jibg==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Configuration.Binder": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Logging": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Binder": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.7" } }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.25, )", - "resolved": "8.0.25", - "contentHash": "sqX4nmBft05ivqKvUT4nxaN8rT3apCLt9SWFkfRrQPwra1zPwFknQAw1lleuMCKOCLvVmOWwrC2iPSm9RiXZUg==" - }, - "System.Text.Json": { - "type": "Direct", - "requested": "[9.0.5, )", - "resolved": "9.0.5", - "contentHash": "rnP61ZfloTgPQPe7ecr36loNiGX3g1PocxlKHdY/FUpDSsExKkTxpMAlB4X35wNEPr1X7mkYZuQvW3Lhxmu7KA==", - "dependencies": { - "System.IO.Pipelines": "9.0.5", - "System.Text.Encodings.Web": "9.0.5" - } + "requested": "[10.0.7, )", + "resolved": "10.0.7", + "contentHash": "AA/yhzFHNtQZXLdqjzujPy25G8EWwGWsAnxOE2zYSBoT/8QHP6ketN3CToD3DFreO653ipUwnKHo22B8AlBMCw==" }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "uYXLg2Gt8KUH5nT3u+TBpg9VrRcN5+2zPmIjqEHR4kOoBwsbtMDncEJw9HiLvZqGgIo2TR4oraibAoy5hXn2bQ==", + "resolved": "10.0.7", + "contentHash": "wZbGh7J8R1vXN525O6d8dlcDTxhRTnd5MyW4LdfP5S0tSnTwTCseYSrq6g0Mxh7W9xn8P/2xPuf0D/m6k2dy2w==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "ew0G6gIznnyAkbIa67wXspkDFcVektjN3xaDAfBDIPbWph+rbuGaaohFxUSGw28ht7wdcWtTtElKnzfkcDDbOQ==", + "resolved": "10.0.7", + "contentHash": "t56nEgvECcyLPojZIUFWJknQQDAbgfTf9J+QMYJE1YYvVgz69vN6B/AKL8Grvj3Lcnp8kTpNqwmwFhb3YLJmtQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "7pQ4Tkyofm8DFWFhqn9ZmG8qSAC2VitWleATj5qob9V9KtoxCVdwRtmiVl/ha3WAgjkEfW++JLWXox9MJwMgkg==", + "resolved": "10.0.7", + "contentHash": "8bS1qIaRivny+WX+49pmeJ6iAylbtX8C0DLEcCQWZjdxQvLqaMssXiGD9P/6pYElrHbK5/nAHmjbQ8STqdMYeg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "N1Mn0T/tUBPoLL+Fzsp+VCEtneUhhxc1//Dx3BeuQ8AX+XrMlYCfnp2zgpEXnTCB7053CLdiqVWPZ7mEX6MPjg==", + "resolved": "10.0.7", + "contentHash": "91F/o3emPV/+xY/ip3s2LqDNF14kjttlVtq0BXgg6p4MnCzeSZxnUJm+t6WRrtD3JdGo88/oX+z7OwK4y8PZuw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "cjnRtsEAzU73aN6W7vkWy8Phj5t3Xm78HSqgrbh/O4Q9SK/yN73wZVa21QQY6amSLQRQ/M8N+koGnY6PuvKQsw==" + "resolved": "10.0.7", + "contentHash": "Z6mfFEaFcwCfSboxJwOLfu7/31npCY9q70WUamHW/vRQhDvBKOT4Vf9YkZj5J6hLvJpb0oDEYfHunQZj0xxvKw==" }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "pP1PADCrIxMYJXxFmTVbAgEU7GVpjK5i0/tyfU9DiE0oXQy3JWQaOVgCkrCiePLgS8b5sghM3Fau3EeHiVWbCg==", + "resolved": "10.0.7", + "contentHash": "tIEcQ2gvERrH2KiCjdsVcHGhXt9lIsuDStfOIeZWr7/fP8IXhGiYfx0/80PNI7WPO2IYuFtlZLSlnTS8+/Mchw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "System.Diagnostics.DiagnosticSource": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "vPdJQU8YLOUSSK8NL0RmwcXJr2E0w8xH559PGQl4JYsglgilZr9LZnqV2zdgk+XR05+kuvhBEZKoDVd46o7NqA==", + "resolved": "10.0.7", + "contentHash": "00SHUGTh2jSMvIr6x9Xwd2nE+B5/qFCO/9hDwUDhJsjYRDlADmaBZ7tqehXzBDsfjHSXJzuRHJzPYPPjphBQ7Q==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "CJbAVdovKPFh2FoKxesu20odRVSbL/vtvzzObnG+5u38sOfzRS2Ncy25id0TjYUGQzMhNnJUHgTUzTMDl/3c9g==", + "resolved": "10.0.7", + "contentHash": "IT7f+EMXZtkjatEcF+o6aOw/7OE4etRrMiDGEWH/iiTu2R3uhC4NEQJCfHiibtX45U3sIQ5Fh6tbb1qaOz3YAg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Configuration.Binder": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Binder": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "b4OAv1qE1C9aM+ShWJu3rlo/WjDwa/I30aIPXqDWSKXTtKl1Wwh6BZn+glH5HndGVVn3C6ZAPQj5nv7/7HJNBQ==" - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "WoI5or8kY2VxFdDmsaRZ5yaYvvb+4MCyy66eXo79Cy1uMa7qXeGIlYmZx7R9Zy5S4xZjmqvkk2V8L6/vDwAAEA==" - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "5WXo+3MGcnYn54+1ojf+kRzKq1Q6sDUnovujNJ2ky1nl1/kP3+PMil9LPbFvZ2mkhvAGmQcY07G2sfHat/v0Fw==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "HJPmqP2FsE+WVUUlTsZ4IFRSyzw40yz0ubiTnsaqm+Xo5fFZhVRvx6Zn8tLXj92/6pbre6OA4QL2A2vnCSKxJA==" + "resolved": "10.0.7", + "contentHash": "D5M0Jr551iTgwkZMN9rm0pSkgNLj5quUWQUmQPMZh7k/bnvZTnXRGfE2KuvXf1EEjt/ofD9yw9IumpgdP9QCnw==" } } } diff --git a/src/PackageUploader.UI.Test/Converters/BoolToColorConverterTest.cs b/src/PackageUploader.UI.Test/Converters/BoolToColorConverterTest.cs index 2b9126b6..0e94fcb2 100644 --- a/src/PackageUploader.UI.Test/Converters/BoolToColorConverterTest.cs +++ b/src/PackageUploader.UI.Test/Converters/BoolToColorConverterTest.cs @@ -89,13 +89,14 @@ public void TestConvertEnoughColorsNotBool() } [TestMethod] - [ExpectedException(typeof(NotImplementedException))] public void ConvertBackTest() { - - var input = true; - var expectedOutput = "SomeColor"; + Assert.ThrowsExactly(() => + { + var input = true; + var expectedOutput = "SomeColor"; - var result = _converter.ConvertBack(input, typeof(string), expectedOutput, null); + var result = _converter.ConvertBack(input, typeof(string), expectedOutput, null); + }); } } diff --git a/src/PackageUploader.UI.Test/Converters/BooleanAndConverterTest.cs b/src/PackageUploader.UI.Test/Converters/BooleanAndConverterTest.cs index 6c1a1a3b..3c6661bd 100644 --- a/src/PackageUploader.UI.Test/Converters/BooleanAndConverterTest.cs +++ b/src/PackageUploader.UI.Test/Converters/BooleanAndConverterTest.cs @@ -61,10 +61,12 @@ public void TestBoolValuesRequired() } [TestMethod] - [ExpectedException(typeof(System.NotImplementedException))] public void TestMethod2() { - var converter = new BooleanAndConverter(); - converter.ConvertBack(null, null, null, null); + Assert.ThrowsExactly(() => + { + var converter = new BooleanAndConverter(); + converter.ConvertBack(null, null, null, null); + }); } } diff --git a/src/PackageUploader.UI.Test/Converters/PackageUploadingProgressStageToVisibilityConverterTest.cs b/src/PackageUploader.UI.Test/Converters/PackageUploadingProgressStageToVisibilityConverterTest.cs index 4a3ecf6b..4c824c83 100644 --- a/src/PackageUploader.UI.Test/Converters/PackageUploadingProgressStageToVisibilityConverterTest.cs +++ b/src/PackageUploader.UI.Test/Converters/PackageUploadingProgressStageToVisibilityConverterTest.cs @@ -117,9 +117,11 @@ public void TestConvertStageStringValidDouble() } [TestMethod] - [ExpectedException(typeof(NotImplementedException))] public void ConvertBack() { - _converter.ConvertBack(null, null, null, null); + Assert.ThrowsExactly(() => + { + _converter.ConvertBack(null, null, null, null); + }); } } diff --git a/src/PackageUploader.UI.Test/Converters/ProgressToVisibilityConverterTest.cs b/src/PackageUploader.UI.Test/Converters/ProgressToVisibilityConverterTest.cs index 1c1335c0..d73c0fe8 100644 --- a/src/PackageUploader.UI.Test/Converters/ProgressToVisibilityConverterTest.cs +++ b/src/PackageUploader.UI.Test/Converters/ProgressToVisibilityConverterTest.cs @@ -79,10 +79,12 @@ public void TestConvertIntTwoValueValidNotInRange() } [TestMethod] - [ExpectedException(typeof(NotImplementedException))] public void TestConvertBack() { - // Act - _converter.ConvertBack(null, null, null, null); + Assert.ThrowsExactly(() => + { + // Act + _converter.ConvertBack(null, null, null, null); + }); } } diff --git a/src/PackageUploader.UI.Test/Converters/StringNotEmptyConverterTest.cs b/src/PackageUploader.UI.Test/Converters/StringNotEmptyConverterTest.cs index 54c574b3..3bc09d67 100644 --- a/src/PackageUploader.UI.Test/Converters/StringNotEmptyConverterTest.cs +++ b/src/PackageUploader.UI.Test/Converters/StringNotEmptyConverterTest.cs @@ -42,10 +42,12 @@ public void TestConvertString() } [TestMethod] - [ExpectedException(typeof(NotImplementedException))] public void TestConvertBack() { - // Act - _converter.ConvertBack(null, null, null, null); + Assert.ThrowsExactly(() => + { + // Act + _converter.ConvertBack(null, null, null, null); + }); } } diff --git a/src/PackageUploader.UI.Test/Converters/StringNotEmptyToVisibilityConverterTest.cs b/src/PackageUploader.UI.Test/Converters/StringNotEmptyToVisibilityConverterTest.cs index e284ba38..9806facf 100644 --- a/src/PackageUploader.UI.Test/Converters/StringNotEmptyToVisibilityConverterTest.cs +++ b/src/PackageUploader.UI.Test/Converters/StringNotEmptyToVisibilityConverterTest.cs @@ -137,10 +137,12 @@ public void TestConvertStringInverted_String_GoodInvert_StringTrue_Visible_Empty [TestMethod] - [ExpectedException(typeof(NotImplementedException))] public void TestConvertBack() { - // Act - _converter.ConvertBack(null, null, null, null); + Assert.ThrowsExactly(() => + { + // Act + _converter.ConvertBack(null, null, null, null); + }); } } diff --git a/src/PackageUploader.UI.Test/Model/PartialGameConfigModelTest.cs b/src/PackageUploader.UI.Test/Model/PartialGameConfigModelTest.cs index 3c4174c2..40273d16 100644 --- a/src/PackageUploader.UI.Test/Model/PartialGameConfigModelTest.cs +++ b/src/PackageUploader.UI.Test/Model/PartialGameConfigModelTest.cs @@ -90,12 +90,14 @@ public string getGoodConfigPath() } [TestMethod] - [ExpectedException(typeof(InvalidDataException))] public void TestInvalidConstructor() { - _ = new PartialGameConfigModel(null); - _ = new PartialGameConfigModel(""); - _ = new PartialGameConfigModel("C:\\nonexistent\\path\\to\\MicrosoftGame.config"); + Assert.ThrowsExactly(() => + { + _ = new PartialGameConfigModel(null); + _ = new PartialGameConfigModel(""); + _ = new PartialGameConfigModel("C:\\nonexistent\\path\\to\\MicrosoftGame.config"); + }); } [TestMethod] diff --git a/src/PackageUploader.UI.Test/Model/ValidatorResultsTest.cs b/src/PackageUploader.UI.Test/Model/ValidatorResultsTest.cs index 78362018..2393ef83 100644 --- a/src/PackageUploader.UI.Test/Model/ValidatorResultsTest.cs +++ b/src/PackageUploader.UI.Test/Model/ValidatorResultsTest.cs @@ -228,25 +228,31 @@ public void TestValidatorComponentToolsCheckParse() Assert.AreEqual(xcapiVersion, component.XCAPI_Version); } - [ExpectedException(typeof(InvalidDataException))] [TestMethod] public void TestValidatorResultsParseFailNoSuchFile() { - _validator.Parse("helloWorld"); + Assert.ThrowsExactly(() => + { + _validator.Parse("helloWorld"); + }); } - [ExpectedException(typeof(InvalidDataException))] [TestMethod] public void TestValidatorResultsParseFailNull() { - _validator.Parse(null); + Assert.ThrowsExactly(() => + { + _validator.Parse(null); + }); } - [ExpectedException(typeof(InvalidDataException))] [TestMethod] public void TestValidatorResultsParseFailEmptyString() { - _validator.Parse(""); + Assert.ThrowsExactly(() => + { + _validator.Parse(""); + }); } [TestMethod] diff --git a/src/PackageUploader.UI.Test/PackageUploader.UI.Test.csproj b/src/PackageUploader.UI.Test/PackageUploader.UI.Test.csproj index cc4bbed1..08e2daf4 100644 --- a/src/PackageUploader.UI.Test/PackageUploader.UI.Test.csproj +++ b/src/PackageUploader.UI.Test/PackageUploader.UI.Test.csproj @@ -1,26 +1,26 @@ - + - net8.0-windows - false - true + net10.0-windows + false + true win-x64 enable + true + true - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + - - diff --git a/src/PackageUploader.UI.Test/Utility/DragDropHelperTest.cs b/src/PackageUploader.UI.Test/Utility/DragDropHelperTest.cs index bbc0ec9b..b1c34921 100644 --- a/src/PackageUploader.UI.Test/Utility/DragDropHelperTest.cs +++ b/src/PackageUploader.UI.Test/Utility/DragDropHelperTest.cs @@ -61,7 +61,7 @@ public void RegisterTextBoxDragDropTest_Action_AcceptFolders() false, null); dragEventArgs.RoutedEvent = System.Windows.UIElement.PreviewDragOverEvent; textBoxMoq.Object.RaiseEvent(dragEventArgs); - Assert.AreEqual(dragEventArgs.Effects, System.Windows.DragDropEffects.None); + Assert.AreEqual(System.Windows.DragDropEffects.None, dragEventArgs.Effects); Assert.IsTrue(dragEventArgs.Handled); @@ -71,7 +71,7 @@ public void RegisterTextBoxDragDropTest_Action_AcceptFolders() true, new string[] {""}); dragEventArgs.RoutedEvent = System.Windows.UIElement.PreviewDragOverEvent; textBoxMoq.Object.RaiseEvent(dragEventArgs); - Assert.AreEqual(dragEventArgs.Effects, System.Windows.DragDropEffects.Copy); + Assert.AreEqual(System.Windows.DragDropEffects.Copy, dragEventArgs.Effects); Assert.IsTrue(dragEventArgs.Handled); @@ -127,7 +127,7 @@ public void RegisterTextBoxDragDropTest_Action_DontAcceptFolders() false, null); dragEventArgs.RoutedEvent = System.Windows.UIElement.PreviewDragOverEvent; textBoxMoq.Object.RaiseEvent(dragEventArgs); - Assert.AreEqual(dragEventArgs.Effects, System.Windows.DragDropEffects.None); + Assert.AreEqual(System.Windows.DragDropEffects.None, dragEventArgs.Effects); Assert.IsTrue(dragEventArgs.Handled); @@ -137,7 +137,7 @@ public void RegisterTextBoxDragDropTest_Action_DontAcceptFolders() true, new string[] { "" }); dragEventArgs.RoutedEvent = System.Windows.UIElement.PreviewDragOverEvent; textBoxMoq.Object.RaiseEvent(dragEventArgs); - Assert.AreEqual(dragEventArgs.Effects, System.Windows.DragDropEffects.Copy); + Assert.AreEqual(System.Windows.DragDropEffects.Copy, dragEventArgs.Effects); Assert.IsTrue(dragEventArgs.Handled); @@ -193,7 +193,7 @@ public void RegisterTextBoxDragDropTest_Command_AcceptFolders_PreviewDragOver_No false, null); dragEventArgs.RoutedEvent = System.Windows.UIElement.PreviewDragOverEvent; textBoxMoq.Object.RaiseEvent(dragEventArgs); - Assert.AreEqual(dragEventArgs.Effects, System.Windows.DragDropEffects.None); + Assert.AreEqual(System.Windows.DragDropEffects.None, dragEventArgs.Effects); Assert.IsTrue(dragEventArgs.Handled); } [WpfTestMethod] @@ -217,7 +217,7 @@ public void RegisterTextBoxDragDropTest_Command_AcceptFolders_PreviewDragOver_Da true, new string[] { "" }); dragEventArgs.RoutedEvent = System.Windows.UIElement.PreviewDragOverEvent; textBoxMoq.Object.RaiseEvent(dragEventArgs); - Assert.AreEqual(dragEventArgs.Effects, System.Windows.DragDropEffects.Copy); + Assert.AreEqual(System.Windows.DragDropEffects.Copy, dragEventArgs.Effects); Assert.IsTrue(dragEventArgs.Handled); } [WpfTestMethod] @@ -347,7 +347,7 @@ public void RegisterTextBoxDragDropTest_Command_DontAcceptFolders_PreviewDragOve false, null); dragEventArgs.RoutedEvent = System.Windows.UIElement.PreviewDragOverEvent; textBoxMoq.Object.RaiseEvent(dragEventArgs); - Assert.AreEqual(dragEventArgs.Effects, System.Windows.DragDropEffects.None); + Assert.AreEqual(System.Windows.DragDropEffects.None, dragEventArgs.Effects); Assert.IsTrue(dragEventArgs.Handled); } [WpfTestMethod] @@ -371,7 +371,7 @@ public void RegisterTextBoxDragDropTest_Command_DontAcceptFolders_PreviewDragOve true, new string[] { "" }); dragEventArgs.RoutedEvent = System.Windows.UIElement.PreviewDragOverEvent; textBoxMoq.Object.RaiseEvent(dragEventArgs); - Assert.AreEqual(dragEventArgs.Effects, System.Windows.DragDropEffects.Copy); + Assert.AreEqual(System.Windows.DragDropEffects.Copy, dragEventArgs.Effects); Assert.IsTrue(dragEventArgs.Handled); } [WpfTestMethod] diff --git a/src/PackageUploader.UI.Test/Utility/WindowsServiceTest.cs b/src/PackageUploader.UI.Test/Utility/WindowsServiceTest.cs index 8b31a1a4..1f55602f 100644 --- a/src/PackageUploader.UI.Test/Utility/WindowsServiceTest.cs +++ b/src/PackageUploader.UI.Test/Utility/WindowsServiceTest.cs @@ -41,19 +41,23 @@ public void Constructor_WithValidParameters_CreatesInstance() } [WpfTestMethod] - [ExpectedException(typeof(ArgumentNullException))] public void Constructor_WithNullContentControl_ThrowsArgumentNullException() { - // Act - _ = new WindowService(null, _mockServiceProvider.Object); + Assert.ThrowsExactly(() => + { + // Act + _ = new WindowService(null, _mockServiceProvider.Object); + }); } [WpfTestMethod] - [ExpectedException(typeof(ArgumentNullException))] // That's pretty cool public void Constructor_WithNullServiceProvider_ThrowsArgumentNullException() { - // Act - _ = new WindowService(_mockContentControl.Object, null); + Assert.ThrowsExactly(() => + { + // Act + _ = new WindowService(_mockContentControl.Object, null); + }); } #endregion @@ -76,11 +80,13 @@ public void NavigateToGeneric_WithValidType_SetsContentControl() #region NavigateTo(Type) Tests [WpfTestMethod] - [ExpectedException(typeof(ArgumentException))] public void NavigateToType_WithNonUIElementType_ThrowsArgumentException() { - // Act - _windowService.NavigateTo(typeof(NonUIElementClass)); + Assert.ThrowsExactly(() => + { + // Act + _windowService.NavigateTo(typeof(NonUIElementClass)); + }); } [WpfTestMethod] @@ -118,7 +124,6 @@ public void NavigateToType_WhenServiceProviderReturnsNull_FallsBackToActivator() } [WpfTestMethod] - [ExpectedException(typeof(InvalidOperationException))] public void NavigateToType_WhenBothResolutionMethodsFail_ThrowsInvalidOperationException() { // Arrange @@ -126,8 +131,11 @@ public void NavigateToType_WhenBothResolutionMethodsFail_ThrowsInvalidOperationE .Setup(sp => sp.GetService(typeof(NoParameterlessConstructorControl))) .Returns(null); - // Act - _windowService.NavigateTo(typeof(NoParameterlessConstructorControl)); + Assert.ThrowsExactly(() => + { + // Act + _windowService.NavigateTo(typeof(NoParameterlessConstructorControl)); + }); } #endregion @@ -135,11 +143,13 @@ public void NavigateToType_WhenBothResolutionMethodsFail_ThrowsInvalidOperationE #region ShowDialog Tests [WpfTestMethod] - [ExpectedException(typeof(InvalidOperationException))] public void ShowDialog_WithNonWindowType_ThrowsInvalidOperationException() { - // Act - _windowService.ShowDialog(); + Assert.ThrowsExactly(() => + { + // Act + _windowService.ShowDialog(); + }); } /*[WpfTestMethod] @@ -214,7 +224,6 @@ public void ShowDialog_WhenServiceProviderReturnsNull_FallsBackToActivator() }*/ [WpfTestMethod] - [ExpectedException(typeof(InvalidOperationException))] public void ShowDialog_WhenBothResolutionMethodsFail_ThrowsInvalidOperationException() { // Arrange @@ -222,8 +231,11 @@ public void ShowDialog_WhenBothResolutionMethodsFail_ThrowsInvalidOperationExcep .Setup(sp => sp.GetService(typeof(NoParameterlessWindow))) .Returns(null); - // Act - _windowService.ShowDialog(); + Assert.ThrowsExactly(() => + { + // Act + _windowService.ShowDialog(); + }); } #endregion diff --git a/src/PackageUploader.UI.Test/ViewModel/ExtractIdInformationFromValidatorLogTest.cs b/src/PackageUploader.UI.Test/ViewModel/ExtractIdInformationFromValidatorLogTest.cs index f7a40536..277e1fd5 100644 --- a/src/PackageUploader.UI.Test/ViewModel/ExtractIdInformationFromValidatorLogTest.cs +++ b/src/PackageUploader.UI.Test/ViewModel/ExtractIdInformationFromValidatorLogTest.cs @@ -149,47 +149,50 @@ public void ExtractIdInformationFromValidatorLog_ValidXml_ExtractsCorrectValues( } [TestMethod] - [ExpectedException(typeof(FileNotFoundException))] public void ExtractIdInformationFromValidatorLog_MissingFile_ThrowsException() { - // Arrange - var expectedBuildId = Guid.NewGuid(); - string validXml = $@" + Assert.ThrowsExactly(() => + { + // Arrange + var expectedBuildId = Guid.NewGuid(); + string validXml = $@" {expectedBuildId} "; - using var viewModel = new TestableValidatorLogViewModel( - _packageModelProvider, - _mockPackageUploaderService.Object, - _mockWindowService.Object, - _uploadingProgressPercentageProvider, - _errorModelProvider, - validXml); - // Delete the file to simulate missing file scenario - if (File.Exists(viewModel.TestSubValFilePath)) - { - File.Delete(viewModel.TestSubValFilePath); - } + using var viewModel = new TestableValidatorLogViewModel( + _packageModelProvider, + _mockPackageUploaderService.Object, + _mockWindowService.Object, + _uploadingProgressPercentageProvider, + _errorModelProvider, + validXml); + // Delete the file to simulate missing file scenario + if (File.Exists(viewModel.TestSubValFilePath)) + { + File.Delete(viewModel.TestSubValFilePath); + } - // Act - Should throw FileNotFoundException - viewModel.TestExtractIdInformationFromValidatorLog( - expectedBuildId, - out string type, - out string titleId, - out string storeId, - out string logoFilename); + // Act - Should throw FileNotFoundException + viewModel.TestExtractIdInformationFromValidatorLog( + expectedBuildId, + out string type, + out string titleId, + out string storeId, + out string logoFilename); + }); } [TestMethod] - [ExpectedException(typeof(Exception))] public void ExtractIdInformationFromValidatorLog_MismatchedBuildId_ThrowsException() { - // Arrange - var actualBuildId = Guid.NewGuid(); - var differentBuildId = Guid.NewGuid(); // Different from the one in the XML + Assert.ThrowsExactly(() => + { + // Arrange + var actualBuildId = Guid.NewGuid(); + var differentBuildId = Guid.NewGuid(); // Different from the one in the XML - string validXml = $@" + string validXml = $@" {actualBuildId} MSIXVC @@ -202,20 +205,21 @@ public void ExtractIdInformationFromValidatorLog_MismatchedBuildId_ThrowsExcepti "; - using var viewModel = new TestableValidatorLogViewModel( - _packageModelProvider, - _mockPackageUploaderService.Object, - _mockWindowService.Object, - _uploadingProgressPercentageProvider, - _errorModelProvider, - validXml); - // Act - Should throw exception due to build ID mismatch - viewModel.TestExtractIdInformationFromValidatorLog( - differentBuildId, // Different from XML - out string type, - out string titleId, - out string storeId, - out string logoFilename); + using var viewModel = new TestableValidatorLogViewModel( + _packageModelProvider, + _mockPackageUploaderService.Object, + _mockWindowService.Object, + _uploadingProgressPercentageProvider, + _errorModelProvider, + validXml); + // Act - Should throw exception due to build ID mismatch + viewModel.TestExtractIdInformationFromValidatorLog( + differentBuildId, // Different from XML + out string type, + out string titleId, + out string storeId, + out string logoFilename); + }); } [TestMethod] diff --git a/src/PackageUploader.UI.Test/ViewModel/MainPageViewModelTest.cs b/src/PackageUploader.UI.Test/ViewModel/MainPageViewModelTest.cs index 1f771bae..0d50166f 100644 --- a/src/PackageUploader.UI.Test/ViewModel/MainPageViewModelTest.cs +++ b/src/PackageUploader.UI.Test/ViewModel/MainPageViewModelTest.cs @@ -109,7 +109,7 @@ public void TestShowTenantSelectionCommand() _mainPageViewModel.ShowTenantSelectionCommand.Execute(null); Assert.IsTrue(_mainPageViewModel.ShowTenantSelection); - Assert.AreEqual(_mainPageViewModel.AvailableTenants.Count, 1); + Assert.AreEqual(1, _mainPageViewModel.AvailableTenants.Count); _authenticationService.VerifySet(x => x.Tenant = tenant2, Times.Once); } @@ -125,7 +125,7 @@ public void TestGetTenantsCommand() _mainPageViewModel.GetTenantsCommand.Execute(null); - Assert.AreEqual(_mainPageViewModel.AvailableTenants.Count, 1); + Assert.AreEqual(1, _mainPageViewModel.AvailableTenants.Count); _authenticationService.VerifySet(x => x.Tenant = tenant2, Times.Once); } diff --git a/src/PackageUploader.UI.Test/ViewModel/PackagingFinishedViewModelTest.cs b/src/PackageUploader.UI.Test/ViewModel/PackagingFinishedViewModelTest.cs index a0ba7e78..568ca7a9 100644 --- a/src/PackageUploader.UI.Test/ViewModel/PackagingFinishedViewModelTest.cs +++ b/src/PackageUploader.UI.Test/ViewModel/PackagingFinishedViewModelTest.cs @@ -148,7 +148,6 @@ public void InstallGame_CreatesBatchFileAndStartsProcess() } [TestMethod] - [ExpectedException(typeof(FileNotFoundException))] public void InstallGame_CreatesBatchFileAndStartsProcess_SafetyTest() { // Arrange @@ -159,8 +158,11 @@ public void InstallGame_CreatesBatchFileAndStartsProcess_SafetyTest() _mockProcessStarterService.Setup(p => p.Start(It.IsAny())) .Returns(mockProcess.Object); - // Act - _viewModel.InstallGame(); + Assert.ThrowsExactly(() => + { + // Act + _viewModel.InstallGame(); + }); } [TestMethod] diff --git a/src/PackageUploader.UI.Test/ViewModel/RelayCommandTest.cs b/src/PackageUploader.UI.Test/ViewModel/RelayCommandTest.cs index 2b1020d0..447e26b5 100644 --- a/src/PackageUploader.UI.Test/ViewModel/RelayCommandTest.cs +++ b/src/PackageUploader.UI.Test/ViewModel/RelayCommandTest.cs @@ -8,11 +8,13 @@ namespace PackageUploader.UI.Test.ViewModel; public class RelayCommandTest { [TestMethod] - [ExpectedException(typeof(ArgumentNullException))] public void Test_ThrowsException() { - _ = new RelayCommand(null); - Assert.Fail("Expected an ArgumentNullException to be thrown."); + Assert.ThrowsExactly(() => + { + _ = new RelayCommand(null); + Assert.Fail("Expected an ArgumentNullException to be thrown."); + }); } [TestMethod] diff --git a/src/PackageUploader.UI.Test/WPFTestMethodAttribute.cs b/src/PackageUploader.UI.Test/WPFTestMethodAttribute.cs index 95467eb2..444a333f 100644 --- a/src/PackageUploader.UI.Test/WPFTestMethodAttribute.cs +++ b/src/PackageUploader.UI.Test/WPFTestMethodAttribute.cs @@ -1,8 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; @@ -11,22 +8,26 @@ namespace PackageUploader.UI.Test // Code from: https://getyourbitstogether.com/wpf-and-mstest/ public class WpfTestMethodAttribute : TestMethodAttribute { - public override TestResult[] Execute(ITestMethod testMethod) + public WpfTestMethodAttribute([CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = 0) + : base(callerFilePath, callerLineNumber) + { + } + + public override Task ExecuteAsync(ITestMethod testMethod) { if (Thread.CurrentThread.GetApartmentState() == ApartmentState.STA) - return Invoke(testMethod); + return base.ExecuteAsync(testMethod); - TestResult[] result = null; - var thread = new Thread(() => result = Invoke(testMethod)); + var tcs = new TaskCompletionSource(); + var thread = new Thread(() => + { + var result = base.ExecuteAsync(testMethod).GetAwaiter().GetResult(); + tcs.SetResult(result); + }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); thread.Join(); - return result; - } - - private TestResult[] Invoke(ITestMethod testMethod) - { - return new[] { testMethod.Invoke(null) }; + return tcs.Task; } } } diff --git a/src/PackageUploader.UI.Test/packages.lock.json b/src/PackageUploader.UI.Test/packages.lock.json index 3b6d7949..d28226fd 100644 --- a/src/PackageUploader.UI.Test/packages.lock.json +++ b/src/PackageUploader.UI.Test/packages.lock.json @@ -1,44 +1,32 @@ { "version": 1, "dependencies": { - "net8.0-windows7.0": { + "net10.0-windows7.0": { "coverlet.collector": { "type": "Direct", - "requested": "[6.0.2, )", - "resolved": "6.0.2", - "contentHash": "bJShQ6uWRTQ100ZeyiMqcFlhP7WJ+bCuabUs885dJiBEzMsJMSFr7BOyeCw4rgvQokteGi5rKQTlkhfQPUXg2A==" - }, - "Microsoft.NET.Test.Sdk": { - "type": "Direct", - "requested": "[17.11.1, )", - "resolved": "17.11.1", - "contentHash": "U3Ty4BaGoEu+T2bwSko9tWqWUOU16WzSFkq6U8zve75oRBMSLTBdMAZrVNNz1Tq12aCdDom9fcOcM9QZaFHqFg==", - "dependencies": { - "Microsoft.CodeCoverage": "17.11.1", - "Microsoft.TestPlatform.TestHost": "17.11.1" - } + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "WFejCcOUR6k8UYyDnnR6Gk+obFYMsWrZuNqPJnsVFGVhpPSN0y20D4qbdKJnXinYGx9PQ397Hf9TnU1NBST8vA==" }, "Microsoft.Testing.Extensions.CodeCoverage": { "type": "Direct", - "requested": "[17.13.1, )", - "resolved": "17.13.1", - "contentHash": "Ok2HWJdOTzErMqLlWQZ/i2Fw05VWmgh1yhUWFYJAtUmCv6uJSgz/qAiriRgpTjZRWaKbb7HDaGfMgKSNcmaVfw==", + "requested": "[18.5.2, )", + "resolved": "18.5.2", + "contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==", "dependencies": { - "Microsoft.DiaSymReader": "2.0.0", - "Microsoft.Extensions.DependencyModel": "6.0.1", - "Microsoft.Testing.Platform": "1.4.3", - "Newtonsoft.Json": "13.0.3", - "System.Reflection.Metadata": "8.0.0" + "Microsoft.DiaSymReader": "2.2.3", + "Microsoft.Extensions.DependencyModel": "8.0.2", + "Microsoft.Testing.Platform": "2.1.0" } }, "Microsoft.Testing.Extensions.TrxReport": { "type": "Direct", - "requested": "[1.4.3, )", - "resolved": "1.4.3", - "contentHash": "JSy1dY8ZpNWV00NZBVAQuqJmC18LOszwRsIz4VSROK06FxoPOz5N19D6FHz9ZKJxn3XieoHWhbvuLFWdz9UJiw==", + "requested": "[2.2.1, )", + "resolved": "2.2.1", + "contentHash": "FWaktPQHSiZh/+2ft2PHH/4bLlg8BKlrbLiil8mRcpoP0oHzKpgBfmN3QepGlAbxG0yDrZGN8tuPy77FYdEaMw==", "dependencies": { - "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.4.3", - "Microsoft.Testing.Platform": "1.4.3" + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.2.1", + "Microsoft.Testing.Platform": "2.2.1" } }, "Moq": { @@ -50,64 +38,64 @@ "Castle.Core": "5.1.1" } }, - "MSTest.Analyzers": { - "type": "Direct", - "requested": "[3.6.4, )", - "resolved": "3.6.4", - "contentHash": "4gU/VdItLebmE2+UkOaqffVmVa/in0VeIF9fmN/fG0tj5AHAasjasJcZa9U2uXBNX03cKCWlgWenlhKLz343NQ==" - }, "MSTest.TestAdapter": { "type": "Direct", - "requested": "[3.6.4, )", - "resolved": "3.6.4", - "contentHash": "YdwseRA+nDhRqD2oPHjCE4KzLEN5B10A61lOslE3N3OvUwHJ6ezyZZjYWf7mrZ8jckCcx/UlBclTzgWUpMpPQw==", + "requested": "[4.2.1, )", + "resolved": "4.2.1", + "contentHash": "lZRgNzaQnffK4XLjM/og4Eoqp/3IkpcyJQQcyKXkPdkzCT3+ghpwHa9zG1xYhQDbUFoc54M+/waLwh31K9stDQ==", "dependencies": { - "Microsoft.Testing.Extensions.VSTestBridge": "1.4.3", - "Microsoft.Testing.Platform.MSBuild": "1.4.3" + "MSTest.TestFramework": "4.2.1", + "Microsoft.Testing.Extensions.VSTestBridge": "2.2.1", + "Microsoft.Testing.Platform.MSBuild": "2.2.1" } }, "MSTest.TestFramework": { "type": "Direct", - "requested": "[3.6.4, )", - "resolved": "3.6.4", - "contentHash": "3nV+2CJluKmiJpCSqQfXu5idCq35+vqFywjScyauTIz0Zk7KJw7Qpzv8gtwow0To7pxIlIvwkq9rbMB+V6eOow==" + "requested": "[4.2.1, )", + "resolved": "4.2.1", + "contentHash": "I4/RbS2TpGZ56CE98+jPbrGlcerYtw2LvPVKzQGvyQQcJDekPy2Kd+fnThXYn+geJ1sW+vA9B7++rFNxvKcWxA==", + "dependencies": { + "MSTest.Analyzers": "4.2.1" + } }, "Azure.Core": { "type": "Transitive", - "resolved": "1.46.1", - "contentHash": "iE5DPOlGsN5kCkF4gN+vasN1RihO0Ypie92oQ5tohQYiokmnrrhLnee+3zcE8n7vB6ZAzhPTfUGAEXX/qHGkYA==", + "resolved": "1.54.0", + "contentHash": "m6hHbx1q9+GCBZ5A9ykzFylPdTwscX2APH7PlnqV+yu+DH3RRtuIDJMRqdU17cMyinv0hCPofpegoyQ6qWPW7g==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "System.ClientModel": "1.4.1", - "System.Memory.Data": "6.0.1" + "Microsoft.Bcl.AsyncInterfaces": "10.0.3", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.3", + "Microsoft.Identity.Client": "4.83.1", + "Microsoft.Identity.Client.Extensions.Msal": "4.83.1", + "System.ClientModel": "1.10.0", + "System.Memory.Data": "10.0.3" } }, "Azure.Identity": { "type": "Transitive", - "resolved": "1.14.0", - "contentHash": "xQ6mpNhifb8W/KG2BclhbJWAupvE3JF8lPEBF8t59Q5sc1yN0Ci+dvS0qXtc6m9auxwYpmc8rhOmK541dcGwmA==", + "resolved": "1.21.0", + "contentHash": "GeFv8sGwRKvDKwI2WFy8r0mhmlxEVZg24Sit2NogTjiSO8RVjllWM65OT6e1sKjOvG8V74y7hAbaELUUPjZQSw==", "dependencies": { - "Azure.Core": "1.46.1", - "Microsoft.Identity.Client": "4.71.1", - "Microsoft.Identity.Client.Extensions.Msal": "4.71.1", - "System.Memory": "4.5.5" + "Azure.Core": "1.53.0" } }, "Azure.Storage.Blobs": { "type": "Transitive", - "resolved": "12.24.1", - "contentHash": "479Z9ps9yl9XyhU45bbU2CU4e2B23S6FJiSiL9LpfZHU6eNXXD9Jb6rYdwY+qqmm852RhqICXBpX3Sql4DLBew==", + "resolved": "12.27.0", + "contentHash": "zI5rg1tTtnA8T2g2/21l+1iIUdDjpEQQ0FI1BabJVEQJ1JUyTQKrc41eNabAHs0SBHprl6pu/6OqIMK9Ve+4tQ==", "dependencies": { - "Azure.Storage.Common": "12.23.0" + "Azure.Core": "1.50.0", + "Azure.Storage.Common": "12.26.0" } }, "Azure.Storage.Common": { "type": "Transitive", - "resolved": "12.23.0", - "contentHash": "X/pe1LS3lC6s6MSL7A6FzRfnB6P72rNBt5oSuyan6Q4Jxr+KiN9Ufwqo32YLHOVfPcB8ESZZ4rBDketn+J37Rw==", + "resolved": "12.26.0", + "contentHash": "XaT6CDcSshZb7KaCTwc6m4EouZbLBg7ciOEpsJSdJCvkNsZJQCvPKw7V5TtXno19AA1NpwtsZriYque8mzbQVg==", "dependencies": { - "Azure.Core": "1.44.1", - "System.IO.Hashing": "6.0.0" + "Azure.Core": "1.50.0", + "System.IO.Hashing": "10.0.1" } }, "Castle.Core": { @@ -120,471 +108,432 @@ }, "Microsoft.ApplicationInsights": { "type": "Transitive", - "resolved": "2.22.0", - "contentHash": "3AOM9bZtku7RQwHyMEY3tQMrHIgjcfRDa6YQpd/QG2LDGvMydSlL9Di+8LLMt7J2RDdfJ7/2jdYv6yHcMJAnNw==", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "5.0.0" - } + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" - }, - "Microsoft.Bcl.Memory": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "bTUtGfpGyJnohQzjdXbtc7MqNzkv7CWUSRz54+ucNm0i32rZiIU0VdVPHDBShOl1qhVKRjW8mnEBz3d2vH93tQ==" - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "17.11.1", - "contentHash": "nPJqrcA5iX+Y0kqoT3a+pD/8lrW/V7ayqnEJQsTonSoPz59J8bmoQhcSN4G8+UJ64Hkuf0zuxnfuj2lkHOq4cA==" + "resolved": "10.0.3", + "contentHash": "TV62UsrJZPX6gbt3c4WrtXh7bmaDIcMqf9uft1cc4L6gJXOU07hDGEh+bFQh/L2Az0R1WVOkiT66lFqS6G2NmA==" }, "Microsoft.DiaSymReader": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "QcZrCETsBJqy/vQpFtJc+jSXQ0K5sucQ6NUFbTNVHD4vfZZOwjZ/3sBzczkC4DityhD3AVO/+K/+9ioLs1AgRA==" + "resolved": "2.2.3", + "contentHash": "bhwzJfzyiJM0nXJyNB7Y9OfsEXyxLdDBHG99soIp5JjnPydwkOaBdRCtRtWgQh3noSLi2cSIZ/wpbHNNE9knxQ==" }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "uYXLg2Gt8KUH5nT3u+TBpg9VrRcN5+2zPmIjqEHR4kOoBwsbtMDncEJw9HiLvZqGgIo2TR4oraibAoy5hXn2bQ==", + "resolved": "10.0.7", + "contentHash": "wZbGh7J8R1vXN525O6d8dlcDTxhRTnd5MyW4LdfP5S0tSnTwTCseYSrq6g0Mxh7W9xn8P/2xPuf0D/m6k2dy2w==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "ew0G6gIznnyAkbIa67wXspkDFcVektjN3xaDAfBDIPbWph+rbuGaaohFxUSGw28ht7wdcWtTtElKnzfkcDDbOQ==", + "resolved": "10.0.7", + "contentHash": "t56nEgvECcyLPojZIUFWJknQQDAbgfTf9J+QMYJE1YYvVgz69vN6B/AKL8Grvj3Lcnp8kTpNqwmwFhb3YLJmtQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "7pQ4Tkyofm8DFWFhqn9ZmG8qSAC2VitWleATj5qob9V9KtoxCVdwRtmiVl/ha3WAgjkEfW++JLWXox9MJwMgkg==", + "resolved": "10.0.7", + "contentHash": "8bS1qIaRivny+WX+49pmeJ6iAylbtX8C0DLEcCQWZjdxQvLqaMssXiGD9P/6pYElrHbK5/nAHmjbQ8STqdMYeg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Configuration.CommandLine": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "NZuZMz3Q8Z780nKX3ifV1fE7lS+6pynDHK71OfU4OZ1ItgvDOhyOC7E6z+JMZrAj63zRpwbdldYFk499t3+1dQ==", + "resolved": "10.0.7", + "contentHash": "3lNjglxfFxOzI9zG+3HSg/YSGqo//8Fqw6u6iuIamZb4JCorbA3JLaeWOpfKTAPi2UJwaispOXWx14dUqcGz4A==", "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Configuration.EnvironmentVariables": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "plvZ0ZIpq+97gdPNNvhwvrEZ92kNml9hd1pe3idMA7svR0PztdzVLkoWLcRFgySYXUJc3kSM3Xw3mNFMo/bxRA==", + "resolved": "10.0.7", + "contentHash": "TWto3imA+mJMLZI+5sbgLiFFoOFNFkizQYNaC5jTuiHKn3diwm1RN7mWDOEZN9kG2bixw7IvgpvtUG5/teSRzA==", "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "McP+Lz/EKwvtCv48z0YImw+L1gi1gy5rHhNaNIY2CrjloV+XY8gydT8DjMR6zWeL13AFK+DioVpppwAuO1Gi1w==", + "resolved": "10.0.7", + "contentHash": "qbZLvLsoTdArSloEnSxs21P781YUmwVmHc5NJPQD/ezAreQ7884z+6QfAZVKi86WAZtzx83jK2uC4itxOM44gQ==", "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Physical": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", + "Microsoft.Extensions.FileProviders.Physical": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Configuration.Json": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "C2wqUoh9OmRL1akaCcKSTmRU8z0kckfImG7zLNI8uyi47Lp+zd5LWAD17waPQEqCz3ioWOCrFUo+JJuoeZLOBw==", + "resolved": "10.0.7", + "contentHash": "64dimvyyKk0dbUbrLg/YCv4ugJ4sVz2aXLwfvZwR1EC4tJqW9ru/oVRcXwoJRa2lQGXtYtlpk4maWOeIb48tQw==", "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "System.Text.Json": "8.0.0" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.FileExtensions": "10.0.7", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Configuration.UserSecrets": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ihDHu2dJYQird9pl2CbdwuNDfvCZdOS0S7SPlNfhPt0B81UTT+yyZKz2pimFZGUp3AfuBRnqUCxB2SjsZKHVUw==", + "resolved": "10.0.7", + "contentHash": "YqVIICoIdl0016wkeO2WQS+uEbEXbUhMLKdC5rZNl1X3nu59F+nwaAHdHjq/4OK+Cx31DYmNUSFh+MUot8qSDw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Json": "8.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Physical": "8.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Json": "10.0.7", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", + "Microsoft.Extensions.FileProviders.Physical": "10.0.7" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "N1Mn0T/tUBPoLL+Fzsp+VCEtneUhhxc1//Dx3BeuQ8AX+XrMlYCfnp2zgpEXnTCB7053CLdiqVWPZ7mEX6MPjg==", + "resolved": "10.0.7", + "contentHash": "91F/o3emPV/+xY/ip3s2LqDNF14kjttlVtq0BXgg6p4MnCzeSZxnUJm+t6WRrtD3JdGo88/oX+z7OwK4y8PZuw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "cjnRtsEAzU73aN6W7vkWy8Phj5t3Xm78HSqgrbh/O4Q9SK/yN73wZVa21QQY6amSLQRQ/M8N+koGnY6PuvKQsw==" + "resolved": "10.0.7", + "contentHash": "Z6mfFEaFcwCfSboxJwOLfu7/31npCY9q70WUamHW/vRQhDvBKOT4Vf9YkZj5J6hLvJpb0oDEYfHunQZj0xxvKw==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "AdvrtrqZpMgW4tIAQ/8gE1LAM/FjFY8JrFdyiolOf9WLEfN3WuFG1Hje6n0jqaOs3ldZFGWhatJQHJRrIOd++w==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.10" - } + "resolved": "8.0.2", + "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" }, "Microsoft.Extensions.Diagnostics": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "fRiUjmhm9e4vMp6WEO9MgWNxVtWSr4Pcgh1W4DyJIr8bRANlZz9JU7uicf7ShzMspDxo/9Ejo9zJ6qQZY0IhVw==", + "resolved": "10.0.7", + "contentHash": "l+smp1qPlU0OUXD0OGfdp7OUFrbdq7ZaP5T7m2WpfZ4RFKD7iG73BAT7tjSMxNmbSXkhAn1jYHOAqzYG1r9sNg==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.5", - "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.5", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.7", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.7" } }, "Microsoft.Extensions.Diagnostics.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "6YfTcULCYREMTqtk+s3UiszsFV2xN2FXtxdQpurmQJY9Cp/QGiM4MTKfJKUo7AzdLuzjOKKMWjQITmvtK7AsUg==", + "resolved": "10.0.7", + "contentHash": "uJ9JP677y+uy+C0vtaSfi7XXgFAdz8DhU3M9lwwIXDfQKcyQ0yxM9DVYa0NXDtdVTYA2eBUtVFZ8LY0GCdeE/w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "System.Diagnostics.DiagnosticSource": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", + "resolved": "10.0.7", + "contentHash": "teioDgVpi8L186wUfrXQV1YuBt6lCSPmFZiMZo53+FZxHFjOV+f4GXo4LXgJ273Mku9//AdXWVjk9J7eJP6inw==", "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.FileProviders.Physical": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", + "resolved": "10.0.7", + "contentHash": "zhgWg/i0ECj5v0jLFBSZHplvc5ygCI91DR4nne+BP4XAKF5ycz0pEKnFiTw8C1jCABJEZsnBZh6pXAvn71kFmw==", "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", + "Microsoft.Extensions.FileSystemGlobbing": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" + "resolved": "10.0.7", + "contentHash": "NTUspqB+vH9g4wAD6KPOBx01xqYuKXR/cHXm449zpbq1GqfjdAxBmg7eJXrNsPw7SKwIdT2cJ05GxYVvc+lvsA==" }, "Microsoft.Extensions.Hosting": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ItYHpdqVp5/oFLT5QqbopnkKlyFG9EW/9nhM6/yfObeKt6Su0wkBio6AizgRHGNwhJuAtlE5VIjow5JOTrip6w==", - "dependencies": { - "Microsoft.Extensions.Configuration": "8.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.Configuration.Binder": "8.0.0", - "Microsoft.Extensions.Configuration.CommandLine": "8.0.0", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "8.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0", - "Microsoft.Extensions.Configuration.Json": "8.0.0", - "Microsoft.Extensions.Configuration.UserSecrets": "8.0.0", - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Diagnostics": "8.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Physical": "8.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging.Configuration": "8.0.0", - "Microsoft.Extensions.Logging.Console": "8.0.0", - "Microsoft.Extensions.Logging.Debug": "8.0.0", - "Microsoft.Extensions.Logging.EventLog": "8.0.0", - "Microsoft.Extensions.Logging.EventSource": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" + "resolved": "10.0.7", + "contentHash": "M/vBpfWcschvS2EUeq7cHfscsxabiGTptXwV7GeSueovGiSoNjyo1j5PMcWuOAAQrRW3nRqxZk8NeumrmpzUBg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Binder": "10.0.7", + "Microsoft.Extensions.Configuration.CommandLine": "10.0.7", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "10.0.7", + "Microsoft.Extensions.Configuration.FileExtensions": "10.0.7", + "Microsoft.Extensions.Configuration.Json": "10.0.7", + "Microsoft.Extensions.Configuration.UserSecrets": "10.0.7", + "Microsoft.Extensions.DependencyInjection": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Diagnostics": "10.0.7", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", + "Microsoft.Extensions.FileProviders.Physical": "10.0.7", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging.Configuration": "10.0.7", + "Microsoft.Extensions.Logging.Console": "10.0.7", + "Microsoft.Extensions.Logging.Debug": "10.0.7", + "Microsoft.Extensions.Logging.EventLog": "10.0.7", + "Microsoft.Extensions.Logging.EventSource": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", + "resolved": "10.0.7", + "contentHash": "5s8d6qC6EA8UOI4wR/+zlsq7SXttJMRb9d7zvVZ7+bE3CQEfVtC9ITUDCommm87R1zzj6WJBbCnztuIJXnP3DA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.7", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Http": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "6vbo3XjyEc+w/kv/Dkfv9NA7iSdIdX5dlU9Shk3wJJ0fiZpCVzVW5FJtNoIePX5hS0ENNpHPClq/qtq06yM4FQ==", + "resolved": "10.0.7", + "contentHash": "1wbd+RPhRo3hJKNJhdGEO5ls0LGe55Ho4BUjlFtRUrWxDVVBd7g0Ydq9fbNy86pmvx/j7AGcSPo7YNCo1IRI6Q==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Diagnostics": "9.0.5", - "Microsoft.Extensions.Logging": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Diagnostics": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.Http.Polly": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "VCFPTik1LjPuUiS3vHy65UUzffm7MKGG6tBTFOrDklGDT36BsB9srrW+otYVT7nw6a/NbE8SM4kKsPzuRWxLRA==", + "resolved": "10.0.7", + "contentHash": "pcUsPoqMHvOp+QJsLA/Hlg/W+IBnAoUXKEBc7FqMcY0sUez15DOKXtbEo81TvHL9xwjWQcF3ZMayNpcvpI7Bqg==", "dependencies": { - "Microsoft.Extensions.Http": "9.0.5", + "Microsoft.Extensions.Http": "10.0.7", "Polly": "7.2.4", "Polly.Extensions.Http": "3.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "rQU61lrgvpE/UgcAd4E56HPxUIkX/VUQCxWmwDTLLVeuwRDYTL0q/FLGfAW17cGTKyCh7ywYAEnY3sTEvURsfg==", + "resolved": "10.0.7", + "contentHash": "hOeRIQ63GkgiYCB/MIFp+LQs8aXpJXpB55t6Aj37ab7t2/6WeFcPXxYM9hdy/o5tffzwf8mhqzLJP6mjGYCxjw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" + "Microsoft.Extensions.DependencyInjection": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "pP1PADCrIxMYJXxFmTVbAgEU7GVpjK5i0/tyfU9DiE0oXQy3JWQaOVgCkrCiePLgS8b5sghM3Fau3EeHiVWbCg==", + "resolved": "10.0.7", + "contentHash": "tIEcQ2gvERrH2KiCjdsVcHGhXt9lIsuDStfOIeZWr7/fP8IXhGiYfx0/80PNI7WPO2IYuFtlZLSlnTS8+/Mchw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "System.Diagnostics.DiagnosticSource": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "WgYTJ1/dxdzqaYYMrgC6cZXJVmaoxUmWgsvR9Kg5ZARpy0LMw7fZIZMIiVuaxhItwwFIW0ruhAN+Er2/oVZgmQ==", + "resolved": "10.0.7", + "contentHash": "7BBnoGF37USiu7j434put9mDp7EjdlNDIZsR4vHfC1FbLZeLqiWjgJbeEtF0p59Ryqt8AtraHawf0ZKbe5jibg==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Configuration.Binder": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Logging": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.5" + "Microsoft.Extensions.Configuration": "10.0.7", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Binder": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.7" } }, "Microsoft.Extensions.Logging.Console": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "e+48o7DztoYog+PY430lPxrM4mm3PbA6qucvQtUDDwVo4MO+ejMw7YGc/o2rnxbxj4isPxdfKFzTxvXMwAz83A==", + "resolved": "10.0.7", + "contentHash": "DA++Es6v6W0HfrOrw+K8WyN6jNnZHp640PDdEvl8yfeVmgflKdn6vSSFvufNUSOuY+M2ZaSUgfY+jUKtNpXcCw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging.Configuration": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "System.Text.Json": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging.Configuration": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.Logging.Debug": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "IyosWdl/NM2LP72zlavSpkZyd1SczzJ+8J4LImlKWF8w/JEbqJuSJey79Wd1lJGsDj7Cik8y4CD1T2mXMIhEVA==", + "resolved": "10.0.7", + "contentHash": "Y6DSt/JZApunYWKqTtqbdsR6iqAvHx3D0tavbNJ1rnC24MUpF+3XO/VKgFi+9PFqMyvQ2GHBBGb8H3cLSw7rDg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Logging": "9.0.5", - "Microsoft.Extensions.Logging.Abstractions": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7" } }, "Microsoft.Extensions.Logging.EventLog": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3X9D3sl7EmOu7vQp5MJrmIJBl5XSdOhZPYXUeFfYa6Nnm9+tok8x3t3IVPLhm7UJtPOU61ohFchw8rNm9tIYOQ==", + "resolved": "10.0.7", + "contentHash": "1C8eTuxF6BLncNSJ1HCfmaBcjpUSqQDPlBVdYTlet9oldHTPpNh9iatxSJLs8TOqdp/FOpH+nSLdBve7fu9mTQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "System.Diagnostics.EventLog": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "System.Diagnostics.EventLog": "10.0.7" } }, "Microsoft.Extensions.Logging.EventSource": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "oKcPMrw+luz2DUAKhwFXrmFikZWnyc8l2RKoQwqU3KIZZjcfoJE0zRHAnqATfhRZhtcbjl/QkiY2Xjxp0xu+6w==", + "resolved": "10.0.7", + "contentHash": "YWfndnDX1jVMGCN8d5T+rO+BO8sDw6BkYlUk0BYui+WP7+HhlWx8QLdA4yUDjrkGVb3AQxIWWEPVKw5Nnfj5GQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0", - "System.Text.Json": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Logging": "10.0.7", + "Microsoft.Extensions.Logging.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "vPdJQU8YLOUSSK8NL0RmwcXJr2E0w8xH559PGQl4JYsglgilZr9LZnqV2zdgk+XR05+kuvhBEZKoDVd46o7NqA==", + "resolved": "10.0.7", + "contentHash": "00SHUGTh2jSMvIr6x9Xwd2nE+B5/qFCO/9hDwUDhJsjYRDlADmaBZ7tqehXzBDsfjHSXJzuRHJzPYPPjphBQ7Q==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "CJbAVdovKPFh2FoKxesu20odRVSbL/vtvzzObnG+5u38sOfzRS2Ncy25id0TjYUGQzMhNnJUHgTUzTMDl/3c9g==", + "resolved": "10.0.7", + "contentHash": "IT7f+EMXZtkjatEcF+o6aOw/7OE4etRrMiDGEWH/iiTu2R3uhC4NEQJCfHiibtX45U3sIQ5Fh6tbb1qaOz3YAg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.5", - "Microsoft.Extensions.Configuration.Binder": "9.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5", - "Microsoft.Extensions.Primitives": "9.0.5" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.7", + "Microsoft.Extensions.Configuration.Binder": "10.0.7", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7", + "Microsoft.Extensions.Primitives": "10.0.7" } }, "Microsoft.Extensions.Options.DataAnnotations": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "3e1vlYqezeCEhjvx5z45zEfbwNNpOCRWo/hzd8Ittt93f3a4n/xz7JSOdf/Hg0v1/mo+wE0JADrl4k+KZ3f9uA==", + "resolved": "10.0.7", + "contentHash": "KWepqdSD4PxhFvVh3mckkvJ03u3q/VChkr6nT3nf5mm2XBk8ojxt2E4It0RMblb3GE7hJ0zQzFzxGKL0d6TfXA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", - "Microsoft.Extensions.Options": "9.0.5" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.7", + "Microsoft.Extensions.Options": "10.0.7" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "b4OAv1qE1C9aM+ShWJu3rlo/WjDwa/I30aIPXqDWSKXTtKl1Wwh6BZn+glH5HndGVVn3C6ZAPQj5nv7/7HJNBQ==" + "resolved": "10.0.7", + "contentHash": "D5M0Jr551iTgwkZMN9rm0pSkgNLj5quUWQUmQPMZh7k/bnvZTnXRGfE2KuvXf1EEjt/ofD9yw9IumpgdP9QCnw==" }, "Microsoft.Identity.Client": { "type": "Transitive", - "resolved": "4.71.1", - "contentHash": "SgvSBcMRvmEEyV10pcvxNVUbwYoShmj/9pxXFVr3AFjE26IUzuwYLtLgt58xkEnT0xJBjfObaXxcol3BMtmEAg==", + "resolved": "4.83.1", + "contentHash": "jOLIrZ3cynoqHLLO1cXplFFabrhrMEYs/EuKHvmCyrOm1axqiVFT6nCSnHxk7w5+d2BeQfCdM12Yf/0X7OeS1g==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.35.0", - "System.Diagnostics.DiagnosticSource": "6.0.1" + "Microsoft.IdentityModel.Abstractions": "8.14.0" } }, "Microsoft.Identity.Client.Extensions.Msal": { "type": "Transitive", - "resolved": "4.71.1", - "contentHash": "PGOHaoQhKBKnXy1kfW+Gu9/rxStKsqR+UZKeVv4XAsATdzmfj9y9kkUOftIjVFvxP3oh2Sk7v65ylS0K/qYADA==", + "resolved": "4.83.1", + "contentHash": "I3k4J4Hj4KbLEFanjeUzzDOVecukETaTgEkJ7h2pP/Yazs6SLp6TVUTo/Eo+ptPXMwvc+iX7rBFtMSUrA7R+Mg==", "dependencies": { - "Microsoft.Identity.Client": "4.71.1", + "Microsoft.Identity.Client": "4.83.1", "System.Security.Cryptography.ProtectedData": "4.5.0" } }, "Microsoft.IdentityModel.Abstractions": { "type": "Transitive", - "resolved": "8.7.0", - "contentHash": "OQd5aVepYvh5evOmBMeAYjMIpEcTf1ZCBZaU7Nh/RlhhdXefjFDJeP1L2F2zeNT1unFr+wUu/h3Ac2Xb4BXU6w==" + "resolved": "8.17.0", + "contentHash": "6NrxQGcZg6IunkN8K2F0UVMavNpfCjbjjjON7PYcL8FwI8aULKUreiHsRX/yaA8j3XsTJnQKUYpoQk5gBjULZw==" }, "Microsoft.IdentityModel.JsonWebTokens": { "type": "Transitive", - "resolved": "8.7.0", - "contentHash": "uzsSAWhNhbrkWbQKBTE8QhzviU6sr3bJ1Bkv7gERlhswfSKOp7HsxTRLTPBpx/whQ/GRRHEwMg8leRIPbMrOgw==", + "resolved": "8.17.0", + "contentHash": "JbFZ3OVwtvqcqgBL0cIkhRYbIP7u9GIUYLOgbNqLWtBtZY8tGDpdGyXMzUVX0gVHq1ovuHsKZrkVv+ziHEnBHw==", "dependencies": { - "Microsoft.IdentityModel.Tokens": "8.7.0" + "Microsoft.IdentityModel.Tokens": "8.17.0" } }, "Microsoft.IdentityModel.Logging": { "type": "Transitive", - "resolved": "8.7.0", - "contentHash": "Bs0TznPAu+nxa9rAVHJ+j3CYECHJkT3tG8AyBfhFYlT5ldsDhoxFT7J+PKxJHLf+ayqWfvDZHHc4639W2FQCxA==", + "resolved": "8.17.0", + "contentHash": "w1vjfri0BWqW7RkSZY3ZsqekNfIJJg5BQSFs2j+a+pCXOVrkezmJcn74pT3djwjXJh71577C6wJQgNc2UPz30w==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "8.7.0" + "Microsoft.IdentityModel.Abstractions": "8.17.0" } }, "Microsoft.IdentityModel.Tokens": { "type": "Transitive", - "resolved": "8.7.0", - "contentHash": "5Z6voXjRXAnGklhmZd1mKz89UhcF5ZQQZaZc2iKrOuL4Li1UihG2vlJx8IbiFAOIxy/xdbsAm0A+WZEaH5fxng==", + "resolved": "8.17.0", + "contentHash": "teaW35URIV2x78Tzk+dVJiC4M62/9mQoSEoDjDGoEZmcQa3H2rE+XQpm9Tmdo9KK1Lcrnve4zoyLavl69kCFGg==", "dependencies": { - "Microsoft.Bcl.Memory": "9.0.0", "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.IdentityModel.Logging": "8.7.0" + "Microsoft.IdentityModel.Logging": "8.17.0" } }, "Microsoft.Testing.Extensions.Telemetry": { "type": "Transitive", - "resolved": "1.4.3", - "contentHash": "dh8jnqWikxQXJ4kWy8B82PtSAlQCnvDKh1128arDmSW5OU5xWA84HwruV3TanXi3ZjIHn1wWFCgtMOhcDNwBow==", + "resolved": "2.2.1", + "contentHash": "7zB8BjffOyvqfHF26rFVPuK0w1fCf5+j1tLuhHIr76CqxXkGb+fMJtq6YNOV+m6qPytExHMXxluk3RgJ+dSIqw==", "dependencies": { - "Microsoft.ApplicationInsights": "2.22.0", - "Microsoft.Testing.Platform": "1.4.3" + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "2.2.1" } }, "Microsoft.Testing.Extensions.TrxReport.Abstractions": { "type": "Transitive", - "resolved": "1.4.3", - "contentHash": "16sWznD6ZMok/zgW+vrO6zerCFMD9N+ey9bi1iV/e9xxsQb4V4y/aW6cY/Y7E9jA7pc+aZ6ffZby43yxQOoYZA==", + "resolved": "2.2.1", + "contentHash": "RD6D1Jx6cKDA5IHd1H2q8ylIuQG3PD+gdULI0JC8CvsRtaypFzTFpB5xDPuQi8o6kAkcM04cBhAiJPxZboNH2Q==", "dependencies": { - "Microsoft.Testing.Platform": "1.4.3" + "Microsoft.Testing.Platform": "2.2.1" } }, "Microsoft.Testing.Extensions.VSTestBridge": { "type": "Transitive", - "resolved": "1.4.3", - "contentHash": "xZ6oyNYh2aM5Wb+HJAy1fj2C4CNRVhINXHCjlWs/2C8hEIpdqVSpP3y6HWUN40KpFqyGD4myHGR1Rflm28UpcQ==", + "resolved": "2.2.1", + "contentHash": "D8AGlkNtlTQPe3zf4SLnHBMr13lerMe0RuHSoRfnRatcuX/T7YbRtgn39rWBjKhXsNio0WXKrPKv3gfWE2I46w==", "dependencies": { - "Microsoft.ApplicationInsights": "2.22.0", - "Microsoft.TestPlatform.ObjectModel": "17.11.1", - "Microsoft.Testing.Extensions.Telemetry": "1.4.3", - "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.4.3", - "Microsoft.Testing.Platform": "1.4.3" + "Microsoft.TestPlatform.ObjectModel": "18.3.0", + "Microsoft.Testing.Extensions.Telemetry": "2.2.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.2.1", + "Microsoft.Testing.Platform": "2.2.1" } }, "Microsoft.Testing.Platform": { "type": "Transitive", - "resolved": "1.4.3", - "contentHash": "NedIbwl1T7+ZMeg7gwk0Db8/RFLf0siyVpeTcRMMOle6Xl/ujaYOM4Aduo8rEfVqNj3kcQ7blegpyT3dHi+0PA==" + "resolved": "2.2.1", + "contentHash": "9bbPuls/b6/vUFzxbSjJLZlJHyKBfOZE5kjIY+ITI2ASqlFPJhR83BdLydJeQOCLEZhEbrEcz5xtt1B69nwSVg==" }, "Microsoft.Testing.Platform.MSBuild": { "type": "Transitive", - "resolved": "1.4.3", - "contentHash": "1gGqgHtiZ6tZn/6Tby+qlKpNe5Ye/5LnxlSsyl4XMZ4m4V+Cu1K1m+gD1zxoxHIvLjgX8mCnQRK95MGBBFuumw==", + "resolved": "2.2.1", + "contentHash": "CSJOcZHfKlTyPbS0CTJk6iEnU4gJC+eUA5z72UBnMDRdgVHYOmB8k9Y7jT233gZjnCOQiYFg3acQHRfu2H62nw==", "dependencies": { - "Microsoft.Testing.Platform": "1.4.3" + "Microsoft.Testing.Platform": "2.2.1" } }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.11.1", - "contentHash": "E2jZqAU6JeWEVsyOEOrSW1o1bpHLgb25ypvKNB/moBXPVsFYBPd/Jwi7OrYahG50J83LfHzezYI+GaEkpAotiA==", - "dependencies": { - "System.Reflection.Metadata": "1.6.0" - } - }, - "Microsoft.TestPlatform.TestHost": { - "type": "Transitive", - "resolved": "17.11.1", - "contentHash": "DnG+GOqJXO/CkoqlJWeDFTgPhqD/V6VqUIL3vINizCWZ3X+HshCtbbyDdSHQQEjrc2Sl/K3yaxX6s+5LFEdYuw==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.11.1", - "Newtonsoft.Json": "13.0.1" - } + "resolved": "18.3.0", + "contentHash": "AEIEX2aWdPO9XbtR96eBaJxmXRD9vaI9uQ1T/JbPEKlTAZwYx0ZrMzKyULMdh/HH9Sg03kXCoN7LszQ90o6nPQ==" }, - "Newtonsoft.Json": { + "MSTest.Analyzers": { "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + "resolved": "4.2.1", + "contentHash": "1i9jgE/42KGGyZ4s0MdrYM/Uu/dRYhbRfYQifcO0AZ6vw4sBXRjoQGQRGNSm771AYgPAmoGl0u4sJc2lMET6HQ==" }, "Polly": { "type": "Transitive", @@ -604,169 +553,115 @@ "Polly": "7.1.0" } }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, "System.ClientModel": { "type": "Transitive", - "resolved": "1.4.1", - "contentHash": "MY7eFGKp+Hu7Ciub8wigQ0odGrkml4eTjUy8d5Bu2eGAVvm8Qskkq+YuXiiS5wMJGq7iSvqseV4skd5WxTUdDA==", + "resolved": "1.10.0", + "contentHash": "lBEWs54F5Y5pZ9hC+8z4S/X76957ex+DPk7WecRHlbIHtrPfbRMMlOgI3iDn4Jpb3bSxvBnKaaHoD59auFjlBA==", "dependencies": { - "Microsoft.Extensions.Logging.Abstractions": "8.0.3", - "System.Memory.Data": "6.0.1" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.3", + "Microsoft.Extensions.Logging.Abstractions": "10.0.3", + "System.Memory.Data": "10.0.3" } }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "WoI5or8kY2VxFdDmsaRZ5yaYvvb+4MCyy66eXo79Cy1uMa7qXeGIlYmZx7R9Zy5S4xZjmqvkk2V8L6/vDwAAEA==" - }, "System.Diagnostics.EventLog": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" + "resolved": "10.0.7", + "contentHash": "WbmDLeTPYhEzXhvYVioTVn/D1XX6bovyny9n5p8Zxtf03+eY385RB818teZm6n+fA63iZNvng0/Np4tLuhkMhQ==" }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", - "resolved": "8.7.0", - "contentHash": "8dKL3A9pVqYCJIXHd4H2epQqLxSvKeNxGonR0e5g89yMchyvsM/NLuB06otx29BicUd6+LUJZgNZmvYjjPsPGg==", + "resolved": "8.17.0", + "contentHash": "nKikRYheDeSaXA3wGr2otwaiRFygBa25m+hc7MEomZVIEWZvKVqd8wgP9yn+8QpLRGgw//dUs4LErGx9gtVmAA==", "dependencies": { - "Microsoft.IdentityModel.JsonWebTokens": "8.7.0", - "Microsoft.IdentityModel.Tokens": "8.7.0" + "Microsoft.IdentityModel.JsonWebTokens": "8.17.0", + "Microsoft.IdentityModel.Tokens": "8.17.0" } }, - "System.IO.Hashing": { + "System.Interactive.Async": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Rfm2jYCaUeGysFEZjDe7j1R4x6Z6BzumS/vUT5a1AA/AWJuGX71PoGB0RmpyX3VmrGqVnAwtfMn39OHR8Y/5+g==" + "resolved": "7.0.1", + "contentHash": "oL1iox7sAJL8i+muGzVMQjDB0axQgOoT5CkwYdap8cQJMkWDWMRErNqhOcZkn31+aKr/uCfgMEdhUARCU4G7gg==" }, - "System.IO.Pipelines": { + "System.IO.Hashing": { "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "5WXo+3MGcnYn54+1ojf+kRzKq1Q6sDUnovujNJ2ky1nl1/kP3+PMil9LPbFvZ2mkhvAGmQcY07G2sfHat/v0Fw==" + "resolved": "10.0.1", + "contentHash": "Dy6ULPb2S0GmNndjKrEIpfibNsc8+FTOoZnqygtFDuyun8vWboQbfMpQtKUXpgTxokR5E4zFHETpNnGfeWY6NA==" }, "System.Linq.Async": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", + "resolved": "7.0.1", + "contentHash": "gwQtBHVY/WgqWgAYSe4JspXR+f1FvMbVIW4ixsJpGV/Kj8Nun3zp1ajIdvCWfmac8ektJGVLiJ/OR8JU9nZnMg==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + "System.Interactive.Async": "7.0.1" } }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" - }, "System.Memory.Data": { "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "yliDgLh9S9Mcy5hBIdZmX6yphYIW3NH+3HN1kV1m7V1e0s7LNTw/tHNjJP4U9nSMEgl3w1TzYv/KA1Tg9NYy6w==" - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", - "dependencies": { - "System.Collections.Immutable": "8.0.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + "resolved": "10.0.3", + "contentHash": "MaGhRfGunmrj/nHjtsi9XkhlYJ/ERGWrbA+BiSKNtGnAjc9XlG5EhAvak6VRcX5LYzPF6pBO8nJ613dTgzabig==" }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "wLBKzFnDCxP12VL9ANydSYhk59fC4cvOr9ypYQLPnAj48NQIhqnjdD2yhP8yEKyBJEjERWS9DisKL7rX5eU25Q==" }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "HJPmqP2FsE+WVUUlTsZ4IFRSyzw40yz0ubiTnsaqm+Xo5fFZhVRvx6Zn8tLXj92/6pbre6OA4QL2A2vnCSKxJA==" - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "rnP61ZfloTgPQPe7ecr36loNiGX3g1PocxlKHdY/FUpDSsExKkTxpMAlB4X35wNEPr1X7mkYZuQvW3Lhxmu7KA==", - "dependencies": { - "System.IO.Pipelines": "9.0.5", - "System.Text.Encodings.Web": "9.0.5" - } - }, "packageuploader.clientapi": { "type": "Project", "dependencies": { - "Azure.Core": "[1.46.1, )", - "Azure.Identity": "[1.14.0, )", - "Azure.Storage.Blobs": "[12.24.1, )", - "Microsoft.Extensions.Configuration.Binder": "[9.0.5, )", - "Microsoft.Extensions.DependencyInjection.Abstractions": "[9.0.5, )", - "Microsoft.Extensions.Http": "[9.0.5, )", - "Microsoft.Extensions.Http.Polly": "[9.0.5, )", - "Microsoft.Extensions.Options.ConfigurationExtensions": "[9.0.5, )", - "Microsoft.Extensions.Options.DataAnnotations": "[9.0.5, )", + "Azure.Core": "[1.54.0, )", + "Azure.Identity": "[1.21.0, )", + "Azure.Storage.Blobs": "[12.27.0, )", + "Microsoft.Extensions.Configuration.Binder": "[10.0.7, )", + "Microsoft.Extensions.DependencyInjection.Abstractions": "[10.0.7, )", + "Microsoft.Extensions.Http": "[10.0.7, )", + "Microsoft.Extensions.Http.Polly": "[10.0.7, )", + "Microsoft.Extensions.Options.ConfigurationExtensions": "[10.0.7, )", + "Microsoft.Extensions.Options.DataAnnotations": "[10.0.7, )", "Polly.Contrib.WaitAndRetry": "[1.1.1, )", - "System.Linq.Async": "[6.0.1, )", - "System.Text.Json": "[9.0.5, )" + "System.Linq.Async": "[7.0.1, )" } }, "packageuploader.filelogger": { "type": "Project", "dependencies": { - "Microsoft.Extensions.Logging": "[9.0.5, )", - "Microsoft.Extensions.Logging.Configuration": "[9.0.5, )", - "System.Text.Json": "[9.0.5, )" + "Microsoft.Extensions.Logging": "[10.0.7, )", + "Microsoft.Extensions.Logging.Configuration": "[10.0.7, )" } }, "XboxGamePackageManager": { "type": "Project", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "[9.0.5, )", - "Microsoft.Extensions.Hosting": "[8.0.0, )", - "Microsoft.Extensions.Logging.Debug": "[9.0.5, )", + "Microsoft.Extensions.DependencyInjection": "[10.0.7, )", + "Microsoft.Extensions.Hosting": "[10.0.7, )", + "Microsoft.Extensions.Logging.Debug": "[10.0.7, )", "PackageUploader.ClientApi": "[1.0.0, )", "PackageUploader.FileLogger": "[1.0.0, )", - "System.IdentityModel.Tokens.Jwt": "[8.7.0, )" + "System.IdentityModel.Tokens.Jwt": "[8.17.0, )" } } }, - "net8.0-windows7.0/win-x64": { + "net10.0-windows7.0/win-x64": { "Microsoft.Testing.Extensions.CodeCoverage": { "type": "Direct", - "requested": "[17.13.1, )", - "resolved": "17.13.1", - "contentHash": "Ok2HWJdOTzErMqLlWQZ/i2Fw05VWmgh1yhUWFYJAtUmCv6uJSgz/qAiriRgpTjZRWaKbb7HDaGfMgKSNcmaVfw==", + "requested": "[18.5.2, )", + "resolved": "18.5.2", + "contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==", "dependencies": { - "Microsoft.DiaSymReader": "2.0.0", - "Microsoft.Extensions.DependencyModel": "6.0.1", - "Microsoft.Testing.Platform": "1.4.3", - "Newtonsoft.Json": "13.0.3", - "System.Reflection.Metadata": "8.0.0" + "Microsoft.DiaSymReader": "2.2.3", + "Microsoft.Extensions.DependencyModel": "8.0.2", + "Microsoft.Testing.Platform": "2.1.0" } }, "System.Diagnostics.EventLog": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" + "resolved": "10.0.7", + "contentHash": "WbmDLeTPYhEzXhvYVioTVn/D1XX6bovyny9n5p8Zxtf03+eY385RB818teZm6n+fA63iZNvng0/Np4tLuhkMhQ==" }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "wLBKzFnDCxP12VL9ANydSYhk59fC4cvOr9ypYQLPnAj48NQIhqnjdD2yhP8yEKyBJEjERWS9DisKL7rX5eU25Q==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "9.0.5", - "contentHash": "HJPmqP2FsE+WVUUlTsZ4IFRSyzw40yz0ubiTnsaqm+Xo5fFZhVRvx6Zn8tLXj92/6pbre6OA4QL2A2vnCSKxJA==" } } } diff --git a/src/PackageUploader.UI/PackageUploader.UI.csproj b/src/PackageUploader.UI/PackageUploader.UI.csproj index f790f07c..57e45260 100644 --- a/src/PackageUploader.UI/PackageUploader.UI.csproj +++ b/src/PackageUploader.UI/PackageUploader.UI.csproj @@ -1,7 +1,7 @@  - net8.0-windows + net10.0-windows WinExe PackageUploader.UI true @@ -39,10 +39,10 @@ - - - - + + + + diff --git a/src/PackageUploader.sln b/src/PackageUploader.sln index be0b49e2..aad6a3ac 100644 --- a/src/PackageUploader.sln +++ b/src/PackageUploader.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.13.35825.156 +# Visual Studio Version 18 +VisualStudioVersion = 18.3.11527.330 d18.3 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageUploader.Application", "PackageUploader.Application\PackageUploader.Application.csproj", "{30F60E9E-6744-45F3-A9CD-5E19D6E121E8}" EndProject diff --git a/src/global.json b/src/global.json new file mode 100644 index 00000000..8f73781c --- /dev/null +++ b/src/global.json @@ -0,0 +1,5 @@ +{ + "test": { + "runner": "Microsoft.Testing.Platform" + } +} \ No newline at end of file diff --git a/src/publish.linux-x64.ps1 b/src/publish.linux-x64.ps1 index aa1b4620..e5528bdf 100644 --- a/src/publish.linux-x64.ps1 +++ b/src/publish.linux-x64.ps1 @@ -1,4 +1,4 @@ -param ([String] $Version='1.0', [String] $Output='./PackageUploader.Application/bin/release/net6.0/linux-x64/publish/', [Boolean] $Zip=$false) +param ([String] $Version='1.0', [String] $Output='./PackageUploader.Application/bin/release/linux-x64/publish/', [Boolean] $Zip=$false) dotnet publish ./PackageUploader.Application/PackageUploader.Application.csproj -c release --self-contained -o $Output -p:Version=$Version -r linux-x64 if ($LASTEXITCODE -eq 0 -and $Zip) { Compress-Archive -Force -LiteralPath $Output/PackageUploader -DestinationPath $Output/PackageUploader.$Version.linux-x64.zip diff --git a/src/publish.ps1 b/src/publish.ps1 index 8fa5e911..260406fd 100644 --- a/src/publish.ps1 +++ b/src/publish.ps1 @@ -1,4 +1,4 @@ -param ([String] $Version='1.0', [String] $Output='./PackageUploader.Application/bin/release/net6.0/publish/', [Boolean] $Zip=$false) +param ([String] $Version='1.0', [String] $Output='./PackageUploader.Application/bin/release/publish/', [Boolean] $Zip=$false) dotnet publish ./PackageUploader.Application/PackageUploader.Application.csproj -c release --self-contained -o $Output -p:Version=$Version -r linux-x64 if ($LASTEXITCODE -eq 0 -and $Zip) { Compress-Archive -Force -LiteralPath $Output/PackageUploader -DestinationPath $Output/PackageUploader.$Version.linux-x64.zip diff --git a/src/publish.win-x64.ps1 b/src/publish.win-x64.ps1 index bfe70ab3..f6821f20 100644 --- a/src/publish.win-x64.ps1 +++ b/src/publish.win-x64.ps1 @@ -1,4 +1,4 @@ -param ([String] $Version='1.0', [String] $Output='./PackageUploader.Application/bin/release/net6.0/win-x64/publish/', [Boolean] $Zip=$false) +param ([String] $Version='1.0', [String] $Output='./PackageUploader.Application/bin/release/win-x64/publish/', [Boolean] $Zip=$false) dotnet publish ./PackageUploader.Application/PackageUploader.Application.csproj -c release --self-contained -o $Output -p:Version=$Version -r win-x64 if ($LASTEXITCODE -eq 0 -and $Zip) { Compress-Archive -Force -LiteralPath $Output/PackageUploader.exe -DestinationPath $Output/PackageUploader.$Version.win-x64.zip