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