Skip to content

Commit

Permalink
add config hot reload to ServiceManagerBuilder, fix productInfo error…
Browse files Browse the repository at this point in the history
…, change hot reload unit tests
  • Loading branch information
Y-Sindo committed Nov 2, 2020
1 parent cdb4403 commit a9b7d1b
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 25 deletions.
2 changes: 1 addition & 1 deletion build/dependencies.props
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
<MicrosoftConfigurationUserSecretVersion>2.2.0</MicrosoftConfigurationUserSecretVersion>
<MicrosoftConfigurationEnvironmentVariablesVersion>2.2.0</MicrosoftConfigurationEnvironmentVariablesVersion>
<MicrosoftAspNetCoreSignalRProtocolsMessagePackPackageVersion>1.0.11</MicrosoftAspNetCoreSignalRProtocolsMessagePackPackageVersion>
<MicrosoftExtensionsOptionsConfigurationExtensionsVersion>3.1.9</MicrosoftExtensionsOptionsConfigurationExtensionsVersion>
<MicrosoftExtensionsOptionsConfigurationExtensionsVersion>2.1.0</MicrosoftExtensionsOptionsConfigurationExtensionsVersion>

<!-- Signing -->
<MicroBuildCorePackageVersion>0.3.0</MicroBuildCorePackageVersion>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,30 +52,19 @@ internal static IServiceCollection AddSignalRServiceManagerCore(this IServiceCol
/// <summary>
/// Adds product info to <see cref="ServiceManagerContext"/>
/// </summary>
/// <param name="services"></param>
/// <returns></returns>
[EditorBrowsable(EditorBrowsableState.Never)]
public static IServiceCollection WithCallingAssembly(this IServiceCollection services)
public static IServiceCollection WithAssembly(this IServiceCollection services, Assembly assembly)
{
var assembly = Assembly.GetCallingAssembly();
var productInfo = ProductInfo.GetProductInfo(assembly);
return services.Configure<ServiceManagerContext>(o =>
{
o.ProductInfo = productInfo;
});
return services.Configure<ServiceManagerContext>(o => o.ProductInfo = productInfo);
}

private static IServiceCollection TrySetProductInfo(this IServiceCollection services)
{
var assembly = Assembly.GetExecutingAssembly();
var productInfo = ProductInfo.GetProductInfo(assembly);
return services.Configure<ServiceManagerContext>(o =>
{
if (o.ProductInfo == null)
{
o.ProductInfo = productInfo;
}
});
return services.Configure<ServiceManagerContext>(o => o.ProductInfo = o.ProductInfo ?? productInfo);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,13 @@
</ItemGroup>
</Target>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="$(MicrosoftExtensionsOptionsConfigurationExtensionsVersion)" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.0'">
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0'">
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="$(MicrosoftExtensionsDependencyInjectionPackageVersion)" />
<PackageReference Include="Microsoft.Extensions.Http" Version="$(MicrosoftExtensionHttpVersion)" />
<PackageReference Include="Microsoft.Extensions.Http" Version="$(MicrosoftExtensionHttpVersion)" />
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="$(MicrosoftAspNetCoreSignalRPackageVersion)" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="$(MicrosoftExtensionsOptionsConfigurationExtensionsVersion)" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ internal ServiceManagerBuilder WithConfiguration(IConfiguration config) //todo t
public ServiceManagerBuilder WithCallingAssembly()
{
_assembly = Assembly.GetCallingAssembly();
_services.WithAssembly(_assembly);
return this;
}

Expand All @@ -69,5 +70,8 @@ public void Dispose()
_serviceProvider?.Dispose();
_serviceProvider = null;
}

//tests only
internal ServiceProvider GetServiceProvider() => _serviceProvider;
}
}
25 changes: 20 additions & 5 deletions test/Microsoft.Azure.SignalR.Management.Tests/DiExtensionFacts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@

using System.IO;
using System.Linq;
using System.Threading;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
Expand All @@ -27,7 +28,7 @@ public DiExtensionFacts(ITestOutputHelper outputHelper)
}

[Fact]
public void ConfigureByFile_ChangeDetecedFact()
public async Task ConfigHotReloadTest()
{
string configPath = "temp.json";
var originUrl = "http://abc";
Expand All @@ -43,7 +44,6 @@ public void ConfigureByFile_ChangeDetecedFact()
}
};
File.WriteAllText(configPath, JsonConvert.SerializeObject(configObj));
_outputHelper.WriteLine(JsonConvert.SerializeObject(configObj));
ServiceCollection services = new ServiceCollection();
services.AddSignalRServiceManager();
services.AddSingleton<IConfiguration>(new ConfigurationBuilder().AddJsonFile(configPath, false, true).Build());
Expand All @@ -55,8 +55,9 @@ public void ConfigureByFile_ChangeDetecedFact()
configObj.Azure.SignalR.ConnectionString = $"Endpoint={newUrl};AccessKey={AccessKey};Version=1.0;";
File.WriteAllText(configPath, JsonConvert.SerializeObject(configObj));

Thread.Sleep(3000);
await Task.Delay(15000);
Assert.Equal(newUrl, optionsMonitor.CurrentValue.Endpoints.Single().Endpoint);
_outputHelper.WriteLine("This test may fail in github-actions/Gated -Windows. It should be OK.");
}

[Fact]
Expand All @@ -71,7 +72,21 @@ public void ProductInfoDefaultValueNotNullFact()
using var serviceProvider = services.BuildServiceProvider();
var productInfo = serviceProvider.GetRequiredService<IOptions<ServiceManagerContext>>().Value.ProductInfo;
Assert.Matches("^Microsoft.Azure.SignalR.Management/", productInfo);
_outputHelper.WriteLine(productInfo);
}

[Fact]
public void ProductInfoFromCallingAssemblyFact()
{
ServiceCollection services = new ServiceCollection();
services.AddSignalRServiceManager(o =>
{
o.ConnectionString = TestConnectionString;
o.ServiceTransportType = ServiceTransportType.Persistent;
});
services.WithAssembly(Assembly.GetExecutingAssembly());
using var serviceProvider = services.BuildServiceProvider();
var productInfo = serviceProvider.GetRequiredService<IOptions<ServiceManagerContext>>().Value.ProductInfo;
Assert.Matches("^Microsoft.Azure.SignalR.Management.Tests/", productInfo);
}

[Fact]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using Xunit;
using Xunit.Abstractions;

namespace Microsoft.Azure.SignalR.Management.Tests
{
public class ServiceManagerBuilderFacts
{
private const string Endpoint = "https://abc";
private const string AccessKey = "nOu3jXsHnsO5urMumc87M9skQbUWuQ+PE5IvSUEic8w=";
private static readonly string _testConnectionString = $"Endpoint={Endpoint};AccessKey={AccessKey};Version=1.0;";
private readonly ITestOutputHelper _outputHelper;

public ServiceManagerBuilderFacts(ITestOutputHelper outputHelper)
{
_outputHelper = outputHelper;
}

[Fact]
public void WithCallingAssemblyTest()
{
var builder = new ServiceManagerBuilder().WithCallingAssembly().WithOptions(o => o.ConnectionString = _testConnectionString);
builder.Build();
var serviceProvider = builder.GetServiceProvider();
var productInfo = serviceProvider.GetRequiredService<IOptions<ServiceManagerContext>>().Value.ProductInfo;
Assert.Matches("^Microsoft.Azure.SignalR.Management.Tests/", productInfo);
}

[Fact]
public async Task ConfigHotReloadTest()
{
string configPath = "temp.json";
var originUrl = "http://abc";
var newUrl = "http://cde";
var configObj = new
{
Azure = new
{
SignalR = new ServiceManagerOptions
{
ConnectionString = $"Endpoint={originUrl};AccessKey={AccessKey};Version=1.0;"
}
}
};
File.WriteAllText(configPath, JsonConvert.SerializeObject(configObj));
var builder = new ServiceManagerBuilder().WithConfiguration(new ConfigurationBuilder().AddJsonFile(configPath, false, true).Build());
builder.Build();
using var provider = builder.GetServiceProvider();
var optionsMonitor = provider.GetRequiredService<IOptionsMonitor<ServiceOptions>>();
Assert.Equal(originUrl, optionsMonitor.CurrentValue.Endpoints.Single().Endpoint);

//update json config file
configObj.Azure.SignalR.ConnectionString = $"Endpoint={newUrl};AccessKey={AccessKey};Version=1.0;";
File.WriteAllText(configPath, JsonConvert.SerializeObject(configObj));

await Task.Delay(15000);
Assert.Equal(newUrl, optionsMonitor.CurrentValue.Endpoints.Single().Endpoint);
_outputHelper.WriteLine("This test may fail in github-actions/Gated -Windows. It should be OK.");
}
}
}

0 comments on commit a9b7d1b

Please sign in to comment.