Initialize cross-platform workspace host scaffold
Verify / verify (ubuntu-latest, linux-x64) (push) Canceled after 0s
Verify / verify (windows-latest, win-x64) (push) Canceled after 0s

This commit is contained in:
Youmu Liu
2026-09-29 11:30:51 +08:00
commit 4bc3552167
56 changed files with 2627 additions and 0 deletions
@@ -0,0 +1,78 @@
using System.Collections.Concurrent;
using WorkspaceAccessHost.Connections;
using WorkspaceAccessHost.Authentication;
namespace WorkspaceAccessHost.Tests;
public sealed class HostConnectionGateTests
{
private static readonly ExternalIdentity Alice = new("https://auth.example/application/o/workspace/", "alice-id");
[Fact]
public void TakeoverInvalidatesOldInputAndDisconnect()
{
var gate = new HostConnectionGate();
var first = Assert.IsType<ConnectionLease>(gate.Acquire(Alice).Lease);
Assert.Equal(AcquisitionStatus.TakeoverRequired, gate.Acquire(Alice).Status);
var replacement = Assert.IsType<ConnectionLease>(gate.Acquire(Alice, takeover: true).Lease);
var inputs = new List<string>();
Assert.False(gate.TryDispatch(first, () => inputs.Add("stale")));
Assert.False(gate.Disconnect(first));
Assert.False(gate.CloseWorkspace(first));
Assert.True(gate.TryDispatch(replacement, () => inputs.Add("current")));
Assert.Equal(new[] { "current" }, inputs);
Assert.True(replacement.Generation > first.Generation);
}
[Fact]
public void DisconnectionPreservesOwnerAndAllowsOwnerToReconnect()
{
var gate = new HostConnectionGate();
var lease = Assert.IsType<ConnectionLease>(gate.Acquire(Alice).Lease);
Assert.True(gate.Disconnect(lease));
Assert.False(gate.IsCurrent(lease));
Assert.Equal(AcquisitionStatus.OwnedByAnotherIdentity,
gate.Acquire(new(Alice.Issuer, "bob-id"), takeover: true).Status);
Assert.Equal(AcquisitionStatus.Acquired, gate.Acquire(Alice).Status);
}
[Fact]
public void IssuerIsPartOfIdentity()
{
var gate = new HostConnectionGate();
gate.Acquire(Alice);
Assert.Equal(AcquisitionStatus.OwnedByAnotherIdentity,
gate.Acquire(new("https://other.example/", Alice.Subject), takeover: true).Status);
}
[Fact]
public void ClosedWorkspaceCanBeAssignedToAnotherOwner()
{
var gate = new HostConnectionGate();
var lease = Assert.IsType<ConnectionLease>(gate.Acquire(Alice).Lease);
Assert.True(gate.CloseWorkspace(lease));
Assert.Equal(AcquisitionStatus.Acquired, gate.Acquire(new(Alice.Issuer, "bob-id")).Status);
Assert.False(gate.IsCurrent(lease));
}
[Fact]
public void OnlyOneConcurrentConnectionAcquiresControl()
{
var gate = new HostConnectionGate();
var results = new ConcurrentBag<AcquisitionResult>();
Parallel.For(0, 64, _ => results.Add(gate.Acquire(Alice)));
Assert.Single(results, result => result.Status == AcquisitionStatus.Acquired);
Assert.Equal(63, results.Count(result => result.Status == AcquisitionStatus.TakeoverRequired));
}
[Fact]
public void LeaseFromAnotherGateCannotDispatch()
{
var gate = new HostConnectionGate();
var other = new HostConnectionGate();
gate.Acquire(Alice);
var foreign = Assert.IsType<ConnectionLease>(other.Acquire(Alice).Lease);
Assert.False(gate.TryDispatch(foreign, () => Assert.Fail("Foreign lease dispatched input.")));
}
}
@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../../src/WorkspaceAccessHost.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="xunit.v3" />
<PackageReference Include="xunit.runner.visualstudio" PrivateAssets="all" />
<Using Include="Xunit" />
</ItemGroup>
</Project>
@@ -0,0 +1,487 @@
{
"version": 2,
"dependencies": {
"net10.0": {
"Microsoft.NET.Test.Sdk": {
"type": "Direct",
"requested": "[18.0.1, )",
"resolved": "18.0.1",
"contentHash": "WNpu6vI2rA0pXY4r7NKxCN16XRWl5uHu6qjuyVLoDo6oYEggIQefrMjkRuibQHm/NslIUNCcKftvoWAN80MSAg==",
"dependencies": {
"Microsoft.CodeCoverage": "18.0.1",
"Microsoft.TestPlatform.TestHost": "18.0.1"
}
},
"xunit.runner.visualstudio": {
"type": "Direct",
"requested": "[3.1.5, )",
"resolved": "3.1.5",
"contentHash": "tKi7dSTwP4m5m9eXPM2Ime4Kn7xNf4x4zT9sdLO/G4hZVnQCRiMTWoSZqI/pYTVeI27oPPqHBKYI/DjJ9GsYgA=="
},
"xunit.v3": {
"type": "Direct",
"requested": "[3.2.2, )",
"resolved": "3.2.2",
"contentHash": "L+4/4y0Uqcg8/d6hfnxhnwh4j9FaeULvefTwrk30rr1o4n/vdPfyUQ8k0yzH8VJx7bmFEkDdcRfbtbjEHlaYcA==",
"dependencies": {
"xunit.v3.mtp-v1": "[3.2.2]"
}
},
"Microsoft.ApplicationInsights": {
"type": "Transitive",
"resolved": "2.23.0",
"contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw=="
},
"Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg=="
},
"Microsoft.CodeCoverage": {
"type": "Transitive",
"resolved": "18.0.1",
"contentHash": "O+utSr97NAJowIQT/OVp3Lh9QgW/wALVTP4RG1m2AfFP4IyJmJz0ZBmFJUsRQiAPgq6IRC0t8AAzsiPIsaUDEA=="
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "10.0.12",
"Microsoft.Extensions.Primitives": "10.0.12"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==",
"dependencies": {
"Microsoft.Extensions.Primitives": "10.0.12"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==",
"dependencies": {
"Microsoft.Extensions.Configuration": "10.0.12",
"Microsoft.Extensions.Configuration.Abstractions": "10.0.12"
}
},
"Microsoft.Extensions.Configuration.CommandLine": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "hWWJzJpmg161rYJ2H6vxqCuFfh6zL2Tp9emOrfu1M4gsmW5BOlW8GldthyFwm2L+beW+0axmkMKRw3HyO1qceQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "10.0.12",
"Microsoft.Extensions.Configuration.Abstractions": "10.0.12"
}
},
"Microsoft.Extensions.Configuration.EnvironmentVariables": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "OIFhLxKAdvSrZuecX177ZkN4AcAB6OLlbS8y0MQYL68512aMOZI8cJLb8OeuYe2X+gu5uMqbbCxhzAmSp+Q2ow==",
"dependencies": {
"Microsoft.Extensions.Configuration": "10.0.12",
"Microsoft.Extensions.Configuration.Abstractions": "10.0.12"
}
},
"Microsoft.Extensions.Configuration.FileExtensions": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "PNPS7yYH9U2M0dExn0tMkQFVtE53xTlCs/dgTfsWTTFyCF6qwGT3VrTgm2nnnkSRlSmvM9/J+n9xCpyzd9xTpQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "10.0.12",
"Microsoft.Extensions.Configuration.Abstractions": "10.0.12",
"Microsoft.Extensions.FileProviders.Abstractions": "10.0.12",
"Microsoft.Extensions.FileProviders.Physical": "10.0.12",
"Microsoft.Extensions.Primitives": "10.0.12"
}
},
"Microsoft.Extensions.Configuration.Json": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "H4u2ZeIhjmRQvbHj7S7U4MK1kXb0khx3UtOWcir32VHczdFyIVF0lvHew/VVHmCF7Uk0QseAUaO7HyFKOCSiKA==",
"dependencies": {
"Microsoft.Extensions.Configuration": "10.0.12",
"Microsoft.Extensions.Configuration.Abstractions": "10.0.12",
"Microsoft.Extensions.Configuration.FileExtensions": "10.0.12",
"Microsoft.Extensions.FileProviders.Abstractions": "10.0.12"
}
},
"Microsoft.Extensions.Configuration.UserSecrets": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "2OtyTIt0/tkChr3inq9Y0c34xogxXW//68gvPzIWgKwyVR4x82RSGVSZfV+ZgG13zrKBzqjaI23wpUCfKpY2yQ==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "10.0.12",
"Microsoft.Extensions.Configuration.Json": "10.0.12",
"Microsoft.Extensions.FileProviders.Abstractions": "10.0.12",
"Microsoft.Extensions.FileProviders.Physical": "10.0.12"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw=="
},
"Microsoft.Extensions.Diagnostics": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "amx0O/R4dReqKlC3T740+CHpX8D8tAIV0f5kAPfFi4XK9jYo9BSepGt9/rWfvvCoSMaZ1+XvnqPp/Vv2fmTdAg==",
"dependencies": {
"Microsoft.Extensions.Configuration": "10.0.12",
"Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12",
"Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12"
}
},
"Microsoft.Extensions.Diagnostics.Abstractions": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "fMp91qlRlMOuHfMyp7LuAnOS+MOeWTF1obJmyFcs4nZCXu6pr+QB1AbFJcl2qpBltBrqF/Y7+Rn9IuNcSuctig==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12",
"Microsoft.Extensions.Options": "10.0.12"
}
},
"Microsoft.Extensions.FileProviders.Abstractions": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "iQseV6HixWzEYQH4i++84ToIroXnM5jC1TJF4EqBz3lWNG1HBTMYDLkRb6Wm3wk5V6WqSfl7NukO/LYsloGyfg==",
"dependencies": {
"Microsoft.Extensions.Primitives": "10.0.12"
}
},
"Microsoft.Extensions.FileProviders.Physical": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "3cY+wo2+Qe65BVwShhr2fFqZv5Ns73h3kX4mpW3WvSgfT3AWCk0hKArKW4TF7Dg3mvbJdA6RhWPW7FR+PS5/1w==",
"dependencies": {
"Microsoft.Extensions.FileProviders.Abstractions": "10.0.12",
"Microsoft.Extensions.FileSystemGlobbing": "10.0.12",
"Microsoft.Extensions.Primitives": "10.0.12"
}
},
"Microsoft.Extensions.FileSystemGlobbing": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "45cV+UeI0chPAIXrx9Wv7K4PJXuuIR2pnOur5MOAo6kOFclBHSLLDrvGAxMfWRMtUvpv/kQZkxlgaUN56jwzSQ=="
},
"Microsoft.Extensions.Hosting": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "dzPj59oALFLu9TA4YUrfxqXEcbJVen/D2kOoitgM1lXBeSvPwPR8rOrrV0NKilCV3K0l4o+TLJJ3a1wmTu40Uw==",
"dependencies": {
"Microsoft.Extensions.Configuration": "10.0.12",
"Microsoft.Extensions.Configuration.Abstractions": "10.0.12",
"Microsoft.Extensions.Configuration.Binder": "10.0.12",
"Microsoft.Extensions.Configuration.CommandLine": "10.0.12",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "10.0.12",
"Microsoft.Extensions.Configuration.FileExtensions": "10.0.12",
"Microsoft.Extensions.Configuration.Json": "10.0.12",
"Microsoft.Extensions.Configuration.UserSecrets": "10.0.12",
"Microsoft.Extensions.DependencyInjection": "10.0.12",
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12",
"Microsoft.Extensions.Diagnostics": "10.0.12",
"Microsoft.Extensions.FileProviders.Abstractions": "10.0.12",
"Microsoft.Extensions.FileProviders.Physical": "10.0.12",
"Microsoft.Extensions.Hosting.Abstractions": "10.0.12",
"Microsoft.Extensions.Logging": "10.0.12",
"Microsoft.Extensions.Logging.Abstractions": "10.0.12",
"Microsoft.Extensions.Logging.Configuration": "10.0.12",
"Microsoft.Extensions.Logging.Console": "10.0.12",
"Microsoft.Extensions.Logging.Debug": "10.0.12",
"Microsoft.Extensions.Logging.EventLog": "10.0.12",
"Microsoft.Extensions.Logging.EventSource": "10.0.12",
"Microsoft.Extensions.Options": "10.0.12"
}
},
"Microsoft.Extensions.Hosting.Abstractions": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "ZlIxIJtWmrph0Ikj0svSaTkZ+d+ZYpTAhazpf1b3aoFRmlNnNWwkcvqnqT9yKHjKvfBRthvUrkq11OxfItOhpg==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "10.0.12",
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12",
"Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12",
"Microsoft.Extensions.FileProviders.Abstractions": "10.0.12",
"Microsoft.Extensions.Logging.Abstractions": "10.0.12"
}
},
"Microsoft.Extensions.Logging": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "10.0.12",
"Microsoft.Extensions.Logging.Abstractions": "10.0.12",
"Microsoft.Extensions.Options": "10.0.12"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12"
}
},
"Microsoft.Extensions.Logging.Configuration": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "CLHWfKQZWFE6fSzRXfjd4UlGveckkfPtwx/p5yF/o3hEkMSzGsl7MSxNAkI19hjw0rprBqrQC09Dwy6Lh6kweA==",
"dependencies": {
"Microsoft.Extensions.Configuration": "10.0.12",
"Microsoft.Extensions.Configuration.Abstractions": "10.0.12",
"Microsoft.Extensions.Configuration.Binder": "10.0.12",
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12",
"Microsoft.Extensions.Logging": "10.0.12",
"Microsoft.Extensions.Logging.Abstractions": "10.0.12",
"Microsoft.Extensions.Options": "10.0.12",
"Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12"
}
},
"Microsoft.Extensions.Logging.Console": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "nHvaR8gO0CdEfG324KdUsP3Hqgdf1licZb+UlNh5pFYw7+o8QYTmiMgFmwayE/LPSpaqND/Qn3xHa1cI9b8x0w==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12",
"Microsoft.Extensions.Logging": "10.0.12",
"Microsoft.Extensions.Logging.Abstractions": "10.0.12",
"Microsoft.Extensions.Logging.Configuration": "10.0.12",
"Microsoft.Extensions.Options": "10.0.12"
}
},
"Microsoft.Extensions.Logging.Debug": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "dEvvABq9Qgfu/SgTncXDjCshcJmgO97bLOnMAuqBDSonlk4+VXlKJMHPak+S78TlOxJ47+gY7vPgVukJsr69gg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12",
"Microsoft.Extensions.Logging": "10.0.12",
"Microsoft.Extensions.Logging.Abstractions": "10.0.12"
}
},
"Microsoft.Extensions.Logging.EventLog": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "Qn0FWPMiQzM4GQEEXxrJbh3vp3I9wrAgpMcsVH36+6FTRGXaqtwHDgf/2030FUJ4OuNSpOeIRh+9kCZGDDsfGg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12",
"Microsoft.Extensions.Logging": "10.0.12",
"Microsoft.Extensions.Logging.Abstractions": "10.0.12",
"Microsoft.Extensions.Options": "10.0.12",
"System.Diagnostics.EventLog": "10.0.12"
}
},
"Microsoft.Extensions.Logging.EventSource": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "nKpYoiUdBu8fdLwDxj/fjjGn//7/VwRLzujtMq99/pExrswMXOz+80hbB98QxrD8qPt9oWlFpEVrN9OBKOP7RQ==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12",
"Microsoft.Extensions.Logging": "10.0.12",
"Microsoft.Extensions.Logging.Abstractions": "10.0.12",
"Microsoft.Extensions.Options": "10.0.12",
"Microsoft.Extensions.Primitives": "10.0.12"
}
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12",
"Microsoft.Extensions.Primitives": "10.0.12"
}
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==",
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "10.0.12",
"Microsoft.Extensions.Configuration.Binder": "10.0.12",
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12",
"Microsoft.Extensions.Options": "10.0.12",
"Microsoft.Extensions.Primitives": "10.0.12"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ=="
},
"Microsoft.Testing.Extensions.Telemetry": {
"type": "Transitive",
"resolved": "1.9.1",
"contentHash": "No5AudZMmSb+uNXjlgL2y3/stHD2IT4uxqc5yHwkE+/nNux9jbKcaJMvcp9SwgP4DVD8L9/P3OUz8mmmcvEIdQ==",
"dependencies": {
"Microsoft.ApplicationInsights": "2.23.0",
"Microsoft.Testing.Platform": "1.9.1"
}
},
"Microsoft.Testing.Extensions.TrxReport.Abstractions": {
"type": "Transitive",
"resolved": "1.9.1",
"contentHash": "AL46Xe1WBi85Ntd4mNPvat5ZSsZ2uejiVqoKCypr8J3wK0elA5xJ3AN4G/Q4GIwzUFnggZoH/DBjnr9J18IO/g==",
"dependencies": {
"Microsoft.Testing.Platform": "1.9.1"
}
},
"Microsoft.Testing.Platform": {
"type": "Transitive",
"resolved": "1.9.1",
"contentHash": "QafNtNSmEI0zazdebnsIkDKmFtTSpmx/5PLOjURWwozcPb3tvRxzosQSL8xwYNM1iPhhKiBksXZyRSE2COisrA=="
},
"Microsoft.Testing.Platform.MSBuild": {
"type": "Transitive",
"resolved": "1.9.1",
"contentHash": "oTUtyR4X/s9ytuiNA29FGsNCCH0rNmY5Wdm14NCKLjTM1cT9edVSlA+rGS/mVmusPqcP0l/x9qOnMXg16v87RQ==",
"dependencies": {
"Microsoft.Testing.Platform": "1.9.1"
}
},
"Microsoft.TestPlatform.ObjectModel": {
"type": "Transitive",
"resolved": "18.0.1",
"contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ=="
},
"Microsoft.TestPlatform.TestHost": {
"type": "Transitive",
"resolved": "18.0.1",
"contentHash": "uDJKAEjFTaa2wHdWlfo6ektyoh+WD4/Eesrwb4FpBFKsLGehhACVnwwTI4qD3FrIlIEPlxdXg3SyrYRIcO+RRQ==",
"dependencies": {
"Microsoft.TestPlatform.ObjectModel": "18.0.1",
"Newtonsoft.Json": "13.0.3"
}
},
"Microsoft.Win32.Registry": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg=="
},
"Newtonsoft.Json": {
"type": "Transitive",
"resolved": "13.0.3",
"contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "sOZM+VyRj1pg/ItlHsvrSbjws6oGqZveTzTNBGZ9ziwRDyKsOF3ub6vhvOdxotCIqtlnyHAIwP5sLNvgiZC+pQ=="
},
"System.ServiceProcess.ServiceController": {
"type": "Transitive",
"resolved": "10.0.12",
"contentHash": "sFV+RM/yPtshiCAEIuTm8Dt4F7VuKRbL50PnGC9nXHolk/jw+z3T8zx7axKTBC8mqtQU2ZmjsoPC9b1iwOilNQ==",
"dependencies": {
"System.Diagnostics.EventLog": "10.0.12"
}
},
"xunit.analyzers": {
"type": "Transitive",
"resolved": "1.27.0",
"contentHash": "y/pxIQaLvk/kxAoDkZW9GnHLCEqzwl5TW0vtX3pweyQpjizB9y3DXhb9pkw2dGeUqhLjsxvvJM1k89JowU6z3g=="
},
"xunit.v3.assert": {
"type": "Transitive",
"resolved": "3.2.2",
"contentHash": "BPciBghgEEaJN/JG00QfCYDfEfnLgQhfnYEy+j1izoeHVNYd5+3Wm8GJ6JgYysOhpBPYGE+sbf75JtrRc7jrdA=="
},
"xunit.v3.common": {
"type": "Transitive",
"resolved": "3.2.2",
"contentHash": "Hj775PEH6GTbbg0wfKRvG2hNspDCvTH9irXhH4qIWgdrOSV1sQlqPie+DOvFeigsFg2fxSM3ZAaaCDQs+KreFA==",
"dependencies": {
"Microsoft.Bcl.AsyncInterfaces": "6.0.0"
}
},
"xunit.v3.core.mtp-v1": {
"type": "Transitive",
"resolved": "3.2.2",
"contentHash": "Ga5aA2Ca9ktz+5k3g5ukzwfexwoqwDUpV6z7atSEUvqtd6JuybU1XopHqg1oFd78QdTfZgZE9h5sHpO4qYIi5w==",
"dependencies": {
"Microsoft.Testing.Extensions.Telemetry": "1.9.1",
"Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.9.1",
"Microsoft.Testing.Platform": "1.9.1",
"Microsoft.Testing.Platform.MSBuild": "1.9.1",
"xunit.v3.extensibility.core": "[3.2.2]",
"xunit.v3.runner.inproc.console": "[3.2.2]"
}
},
"xunit.v3.extensibility.core": {
"type": "Transitive",
"resolved": "3.2.2",
"contentHash": "srY8z/oMPvh/t8axtO2DwrHajhFMH7tnqKildvYrVQIfICi8fOn3yIBWkVPAcrKmHMwvXRJ/XsQM3VMR6DOYfQ==",
"dependencies": {
"xunit.v3.common": "[3.2.2]"
}
},
"xunit.v3.mtp-v1": {
"type": "Transitive",
"resolved": "3.2.2",
"contentHash": "O41aAzYKBT5PWqATa1oEWVNCyEUypFQ4va6K0kz37dduV3EKzXNMaV2UnEhufzU4Cce1I33gg0oldS8tGL5I0A==",
"dependencies": {
"xunit.analyzers": "1.27.0",
"xunit.v3.assert": "[3.2.2]",
"xunit.v3.core.mtp-v1": "[3.2.2]"
}
},
"xunit.v3.runner.common": {
"type": "Transitive",
"resolved": "3.2.2",
"contentHash": "/hkHkQCzGrugelOAehprm7RIWdsUFVmIVaD6jDH/8DNGCymTlKKPTbGokD5czbAfqfex47mBP0sb0zbHYwrO/g==",
"dependencies": {
"Microsoft.Win32.Registry": "[5.0.0]",
"xunit.v3.common": "[3.2.2]"
}
},
"xunit.v3.runner.inproc.console": {
"type": "Transitive",
"resolved": "3.2.2",
"contentHash": "ulWOdSvCk+bPXijJZ73bth9NyoOHsAs1ZOvamYbCkD4DNLX/Bd29Ve2ZNUwBbK0MqfIYWXHZViy/HKrdEC/izw==",
"dependencies": {
"xunit.v3.extensibility.core": "[3.2.2]",
"xunit.v3.runner.common": "[3.2.2]"
}
},
"workspaceaccesshost": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Hosting.Systemd": "[10.0.12, )",
"Microsoft.Extensions.Hosting.WindowsServices": "[10.0.12, )"
}
},
"Microsoft.Extensions.Hosting.Systemd": {
"type": "CentralTransitive",
"requested": "[10.0.12, )",
"resolved": "10.0.12",
"contentHash": "WC1u8RbTqJTY/JknZFHX0+TDptgtpoBRc8Kro0xPSwunMql3e1zBxnK+OJbx30ozSCfMpHaYAfaeiVQgM5sizw==",
"dependencies": {
"Microsoft.Extensions.Hosting": "10.0.12"
}
},
"Microsoft.Extensions.Hosting.WindowsServices": {
"type": "CentralTransitive",
"requested": "[10.0.12, )",
"resolved": "10.0.12",
"contentHash": "Za5xCWb7jkHd7+hYu8C22uIf0DGhNASIiXo1xSU450nj01RFCerP06h1Bh3kxUm+5DijfgP0gtpY6v+oI/UI4g==",
"dependencies": {
"Microsoft.Extensions.Hosting": "10.0.12",
"Microsoft.Extensions.Logging.EventLog": "10.0.12",
"System.ServiceProcess.ServiceController": "10.0.12"
}
}
}
}
}