Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion nuget.config
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
<packageSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="dotnet-core" value="https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json" />
<add key="dotnet7" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet7/nuget/v3/index.json" />
<add key="dotnet8" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet8/nuget/v3/index.json" />
<add key="dotnet9" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet9/nuget/v3/index.json" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#region Copyright notice and license
#region Copyright notice and license

// Copyright 2019 The gRPC Authors
//
Expand Down Expand Up @@ -29,6 +29,7 @@
using Grpc.Net.Client.Tests.Infrastructure.Balancer;
using Grpc.Tests.Shared;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NUnit.Framework;

namespace Grpc.Net.Client.Tests.Balancer;
Expand All @@ -52,11 +53,13 @@ public async Task ResolverReturnsNoAddresses_CallWithWaitForReady_Wait()
});

var services = new ServiceCollection();
services.AddNUnitLogger();
services.AddSingleton<TestResolver>();
services.AddSingleton<ResolverFactory, TestResolverFactory>();
services.AddSingleton<ISubchannelTransportFactory>(new TestSubchannelTransportFactory());
var serviceProvider = services.BuildServiceProvider();

var logger = serviceProvider.GetRequiredService<ILogger<ConnectivityStateTests>>();
var invoker = HttpClientCallInvokerFactory.Create(testMessageHandler, "test:///localhost", configure: o =>
{
o.Credentials = ChannelCredentials.Insecure;
Expand All @@ -72,6 +75,8 @@ public async Task ResolverReturnsNoAddresses_CallWithWaitForReady_Wait()
Assert.IsNull(authority);

var resolver = serviceProvider.GetRequiredService<TestResolver>();

logger.LogInformation("UpdateAddresses");
resolver.UpdateAddresses(new List<BalancerAddress>
{
new BalancerAddress("localhost", 81)
Expand Down
14 changes: 11 additions & 3 deletions test/Shared/TestResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ namespace Grpc.Tests.Shared;

internal class TestResolver : PollingResolver
{
private readonly object _lock;
private readonly Func<Task>? _onRefreshAsync;
private readonly TaskCompletionSource<object?> _hasResolvedTcs;
private readonly ILogger _logger;
Expand All @@ -45,6 +46,7 @@ public TestResolver(ILoggerFactory loggerFactory) : this(loggerFactory, null)

public TestResolver(ILoggerFactory? loggerFactory = null, Func<Task>? onRefreshAsync = null) : base(loggerFactory ?? NullLoggerFactory.Instance)
{
_lock = new object();
_onRefreshAsync = onRefreshAsync;
_hasResolvedTcs = new TaskCompletionSource<object?>(TaskCreationOptions.RunContinuationsAsynchronously);
_logger = (ILogger?)loggerFactory?.CreateLogger<TestResolver>() ?? NullLogger.Instance;
Expand All @@ -64,8 +66,11 @@ public void UpdateError(Status status)

public void UpdateResult(ResolverResult result)
{
_result = result;
Listener?.Invoke(result);
lock (_lock)
{
_result = result;
Listener?.Invoke(result);
}
}

protected override async Task ResolveAsync(CancellationToken cancellationToken)
Expand All @@ -75,7 +80,10 @@ protected override async Task ResolveAsync(CancellationToken cancellationToken)
await _onRefreshAsync();
}

Listener(_result ?? ResolverResult.ForResult(Array.Empty<BalancerAddress>(), serviceConfig: null, serviceConfigStatus: null));
lock (_lock)
{
Listener(_result ?? ResolverResult.ForResult(Array.Empty<BalancerAddress>(), serviceConfig: null, serviceConfigStatus: null));
}
_hasResolvedTcs.TrySetResult(null);
}
}
Expand Down