Skip to content

Commit a7e5b90

Browse files
authored
Updates dependencies. Removes ASP.NET support for netstandard2.0 & tests for netcoreapp2.1 (#267)
* Updating dependencies * Updates packages and resolves issues * Remove pointless semicolon * Adjusts dotnet installation for buiddy build * Removes ASP.NET tests from .NET tests * Removes unused usings
1 parent 0eb3de9 commit a7e5b90

22 files changed

+358
-241
lines changed

Microsoft.FeatureManagement.sln

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApp", "examples\Cons
1919
EndProject
2020
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TargetingConsoleApp", "examples\TargetingConsoleApp\TargetingConsoleApp.csproj", "{6558C21E-CF20-4278-AA08-EB9D1DF29D66}"
2121
EndProject
22-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RazorPages", "examples\RazorPages\RazorPages.csproj", "{BA29A1BB-81D5-4EB1-AF37-6ECF64AF27E2}"
22+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RazorPages", "examples\RazorPages\RazorPages.csproj", "{BA29A1BB-81D5-4EB1-AF37-6ECF64AF27E2}"
23+
EndProject
24+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.FeatureManagement.AspNetCore", "tests\Tests.FeatureManagement.AspNetCore\Tests.FeatureManagement.AspNetCore.csproj", "{FC0DC3E2-5646-4AEC-A7DB-2D6167BC3BB4}"
2325
EndProject
2426
Global
2527
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -55,6 +57,10 @@ Global
5557
{BA29A1BB-81D5-4EB1-AF37-6ECF64AF27E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
5658
{BA29A1BB-81D5-4EB1-AF37-6ECF64AF27E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
5759
{BA29A1BB-81D5-4EB1-AF37-6ECF64AF27E2}.Release|Any CPU.Build.0 = Release|Any CPU
60+
{FC0DC3E2-5646-4AEC-A7DB-2D6167BC3BB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
61+
{FC0DC3E2-5646-4AEC-A7DB-2D6167BC3BB4}.Debug|Any CPU.Build.0 = Debug|Any CPU
62+
{FC0DC3E2-5646-4AEC-A7DB-2D6167BC3BB4}.Release|Any CPU.ActiveCfg = Release|Any CPU
63+
{FC0DC3E2-5646-4AEC-A7DB-2D6167BC3BB4}.Release|Any CPU.Build.0 = Release|Any CPU
5864
EndGlobalSection
5965
GlobalSection(SolutionProperties) = preSolution
6066
HideSolutionNode = FALSE
@@ -65,6 +71,7 @@ Global
6571
{E50FB931-7A42-440E-AC47-B8DFE5E15394} = {FB5C34DF-695C-4DF9-8AED-B3EA2516EA72}
6672
{6558C21E-CF20-4278-AA08-EB9D1DF29D66} = {FB5C34DF-695C-4DF9-8AED-B3EA2516EA72}
6773
{BA29A1BB-81D5-4EB1-AF37-6ECF64AF27E2} = {FB5C34DF-695C-4DF9-8AED-B3EA2516EA72}
74+
{FC0DC3E2-5646-4AEC-A7DB-2D6167BC3BB4} = {8ED6FFEE-4037-49A2-9709-BC519C104A90}
6875
EndGlobalSection
6976
GlobalSection(ExtensibilityGlobals) = postSolution
7077
SolutionGuid = {84DA6C54-F140-4518-A1B4-E4CF42117FBD}

build/install-dotnet.ps1

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
# Installs .NET Core 2.1, .NET 5 and .NET 6 for CI/CD environment
1+
# Installs .NET 6 and .NET 7 for CI/CD environment
22
# see: https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-install-script#examples
33

44
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;
55

6-
&([scriptblock]::Create((Invoke-WebRequest -UseBasicParsing 'https://dot.net/v1/dotnet-install.ps1'))) -Version 2.1.816
6+
&([scriptblock]::Create((Invoke-WebRequest -UseBasicParsing 'https://dot.net/v1/dotnet-install.ps1'))) -Channel 6.0
77

8-
&([scriptblock]::Create((Invoke-WebRequest -UseBasicParsing 'https://dot.net/v1/dotnet-install.ps1'))) -Version 5.0.408
9-
10-
&([scriptblock]::Create((Invoke-WebRequest -UseBasicParsing 'https://dot.net/v1/dotnet-install.ps1')))
8+
&([scriptblock]::Create((Invoke-WebRequest -UseBasicParsing 'https://dot.net/v1/dotnet-install.ps1'))) -Channel 7.0

examples/RazorPages/RazorPages.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk.Web">
22

33
<PropertyGroup>
4-
<TargetFramework>netcoreapp3.1</TargetFramework>
4+
<TargetFramework>net6.0</TargetFramework>
55
</PropertyGroup>
66

77
<ItemGroup>

src/Microsoft.FeatureManagement.AspNetCore/AspNetCoreFeatureManagementBuilderExtensions.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
//
44
using Microsoft.AspNetCore.Mvc.Filters;
55
using Microsoft.Extensions.DependencyInjection;
6-
using Microsoft.FeatureManagement.FeatureFilters;
76
using Microsoft.FeatureManagement.Mvc;
87
using System;
98
using System.Collections.Generic;

src/Microsoft.FeatureManagement.AspNetCore/Microsoft.FeatureManagement.AspNetCore.csproj

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<Import Project="..\..\build\Versioning.props" />
1212

1313
<PropertyGroup>
14-
<TargetFrameworks>netstandard2.0;netcoreapp3.1;net5.0;net6.0</TargetFrameworks>
14+
<TargetFrameworks>net6.0;net7.0</TargetFrameworks>
1515
<SignAssembly>true</SignAssembly>
1616
<DelaySign>false</DelaySign>
1717
<AssemblyOriginatorKeyFile>..\..\build\Microsoft.FeatureManagement.snk</AssemblyOriginatorKeyFile>
@@ -28,17 +28,9 @@
2828
<PackageIconUrl>https://aka.ms/AzureAppConfigurationPackageIcon</PackageIconUrl>
2929
<Copyright>© Microsoft Corporation. All rights reserved.</Copyright>
3030
</PropertyGroup>
31-
31+
3232
<ItemGroup>
3333
<ProjectReference Include="..\Microsoft.FeatureManagement\Microsoft.FeatureManagement.csproj" />
34-
</ItemGroup>
35-
36-
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
37-
<PackageReference Include="Microsoft.AspNetCore.Mvc.RazorPages" Version="2.1.11" />
38-
<PackageReference Include="Microsoft.AspNetCore.Mvc.TagHelpers" Version="2.1.3" />
39-
</ItemGroup>
40-
41-
<ItemGroup Condition="'$(TargetFramework)' != 'netstandard2.0'">
4234
<FrameworkReference Include="Microsoft.AspNetCore.App" />
4335
</ItemGroup>
4436

src/Microsoft.FeatureManagement/Microsoft.FeatureManagement.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<Import Project="..\..\build\Versioning.props" />
1212

1313
<PropertyGroup>
14-
<TargetFrameworks>netstandard2.0;netcoreapp3.1;net5.0;net6.0</TargetFrameworks>
14+
<TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
1515
<SignAssembly>true</SignAssembly>
1616
<DelaySign>false</DelaySign>
1717
<AssemblyOriginatorKeyFile>..\..\build\Microsoft.FeatureManagement.snk</AssemblyOriginatorKeyFile>
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT license.
3+
//
4+
using Microsoft.AspNetCore;
5+
using Microsoft.AspNetCore.Builder;
6+
using Microsoft.AspNetCore.Hosting;
7+
using Microsoft.AspNetCore.Mvc;
8+
using Microsoft.AspNetCore.TestHost;
9+
using Microsoft.Extensions.Configuration;
10+
using Microsoft.Extensions.DependencyInjection;
11+
using Microsoft.FeatureManagement;
12+
using System;
13+
using System.Collections.Generic;
14+
using System.Linq;
15+
using System.Net;
16+
using System.Net.Http;
17+
using System.Threading.Tasks;
18+
using Xunit;
19+
20+
namespace Tests.FeatureManagement.AspNetCore
21+
{
22+
public class FeatureManagementAspNetCore
23+
{
24+
[Fact]
25+
public async Task Integrates()
26+
{
27+
IConfiguration config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
28+
29+
TestServer testServer = new TestServer(WebHost.CreateDefaultBuilder().ConfigureServices(services =>
30+
{
31+
services
32+
.AddSingleton(config)
33+
.AddFeatureManagement()
34+
.AddFeatureFilter<TestFilter>();
35+
36+
services.AddMvcCore(o =>
37+
{
38+
DisableEndpointRouting(o);
39+
o.Filters.AddForFeature<MvcFilter>(Enum.GetName(typeof(Features), Features.ConditionalFeature));
40+
});
41+
})
42+
.Configure(app =>
43+
{
44+
app.UseForFeature(Enum.GetName(typeof(Features), Features.ConditionalFeature), a => a.Use(async (ctx, next) =>
45+
{
46+
ctx.Response.Headers[nameof(RouterMiddleware)] = bool.TrueString;
47+
48+
await next();
49+
}));
50+
51+
app.UseMvc();
52+
}));
53+
54+
IEnumerable<IFeatureFilterMetadata> featureFilters = testServer.Host.Services.GetRequiredService<IEnumerable<IFeatureFilterMetadata>>();
55+
56+
TestFilter testFeatureFilter = (TestFilter)featureFilters.First(f => f is TestFilter);
57+
58+
testFeatureFilter.Callback = _ => Task.FromResult(true);
59+
60+
HttpResponseMessage res = await testServer.CreateClient().GetAsync("");
61+
62+
Assert.True(res.Headers.Contains(nameof(MvcFilter)));
63+
Assert.True(res.Headers.Contains(nameof(RouterMiddleware)));
64+
65+
testFeatureFilter.Callback = _ => Task.FromResult(false);
66+
67+
res = await testServer.CreateClient().GetAsync("");
68+
69+
Assert.False(res.Headers.Contains(nameof(MvcFilter)));
70+
Assert.False(res.Headers.Contains(nameof(RouterMiddleware)));
71+
}
72+
73+
[Fact]
74+
public async Task GatesFeatures()
75+
{
76+
IConfiguration config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
77+
78+
TestServer testServer = new TestServer(WebHost.CreateDefaultBuilder().ConfigureServices(services =>
79+
{
80+
services
81+
.AddSingleton(config)
82+
.AddFeatureManagement()
83+
.AddFeatureFilter<TestFilter>();
84+
85+
services.AddMvcCore(o => DisableEndpointRouting(o));
86+
})
87+
.Configure(app => app.UseMvc()));
88+
89+
IEnumerable<IFeatureFilterMetadata> featureFilters = testServer.Host.Services.GetRequiredService<IEnumerable<IFeatureFilterMetadata>>();
90+
91+
TestFilter testFeatureFilter = (TestFilter)featureFilters.First(f => f is TestFilter);
92+
93+
//
94+
// Enable all features
95+
testFeatureFilter.Callback = ctx => Task.FromResult(true);
96+
97+
HttpResponseMessage gateAllResponse = await testServer.CreateClient().GetAsync("gateAll");
98+
HttpResponseMessage gateAnyResponse = await testServer.CreateClient().GetAsync("gateAny");
99+
100+
Assert.Equal(HttpStatusCode.OK, gateAllResponse.StatusCode);
101+
Assert.Equal(HttpStatusCode.OK, gateAnyResponse.StatusCode);
102+
103+
//
104+
// Enable 1/2 features
105+
testFeatureFilter.Callback = ctx => Task.FromResult(ctx.FeatureName == Enum.GetName(typeof(Features), Features.ConditionalFeature));
106+
107+
gateAllResponse = await testServer.CreateClient().GetAsync("gateAll");
108+
gateAnyResponse = await testServer.CreateClient().GetAsync("gateAny");
109+
110+
Assert.Equal(HttpStatusCode.NotFound, gateAllResponse.StatusCode);
111+
Assert.Equal(HttpStatusCode.OK, gateAnyResponse.StatusCode);
112+
113+
//
114+
// Enable no
115+
testFeatureFilter.Callback = ctx => Task.FromResult(false);
116+
117+
gateAllResponse = await testServer.CreateClient().GetAsync("gateAll");
118+
gateAnyResponse = await testServer.CreateClient().GetAsync("gateAny");
119+
120+
Assert.Equal(HttpStatusCode.NotFound, gateAllResponse.StatusCode);
121+
Assert.Equal(HttpStatusCode.NotFound, gateAnyResponse.StatusCode);
122+
}
123+
124+
[Fact]
125+
public async Task GatesRazorPageFeatures()
126+
{
127+
IConfiguration config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
128+
129+
TestServer testServer = new TestServer(WebHost.CreateDefaultBuilder().ConfigureServices(services =>
130+
{
131+
services
132+
.AddSingleton(config)
133+
.AddFeatureManagement()
134+
.AddFeatureFilter<TestFilter>();
135+
136+
services.AddRazorPages();
137+
138+
services.AddMvc(o => DisableEndpointRouting(o));
139+
})
140+
.Configure(app =>
141+
{
142+
app.UseMvc();
143+
}));
144+
145+
IEnumerable<IFeatureFilterMetadata> featureFilters = testServer.Host.Services.GetRequiredService<IEnumerable<IFeatureFilterMetadata>>();
146+
147+
TestFilter testFeatureFilter = (TestFilter)featureFilters.First(f => f is TestFilter);
148+
149+
//
150+
// Enable all features
151+
testFeatureFilter.Callback = ctx => Task.FromResult(true);
152+
153+
HttpResponseMessage gateAllResponse = await testServer.CreateClient().GetAsync("RazorTestAll");
154+
HttpResponseMessage gateAnyResponse = await testServer.CreateClient().GetAsync("RazorTestAny");
155+
156+
Assert.Equal(HttpStatusCode.OK, gateAllResponse.StatusCode);
157+
Assert.Equal(HttpStatusCode.OK, gateAnyResponse.StatusCode);
158+
159+
//
160+
// Enable 1/2 features
161+
testFeatureFilter.Callback = ctx => Task.FromResult(ctx.FeatureName == Enum.GetName(typeof(Features), Features.ConditionalFeature));
162+
163+
gateAllResponse = await testServer.CreateClient().GetAsync("RazorTestAll");
164+
gateAnyResponse = await testServer.CreateClient().GetAsync("RazorTestAny");
165+
166+
Assert.Equal(HttpStatusCode.NotFound, gateAllResponse.StatusCode);
167+
Assert.Equal(HttpStatusCode.OK, gateAnyResponse.StatusCode);
168+
169+
//
170+
// Enable no
171+
testFeatureFilter.Callback = ctx => Task.FromResult(false);
172+
173+
gateAllResponse = await testServer.CreateClient().GetAsync("RazorTestAll");
174+
gateAnyResponse = await testServer.CreateClient().GetAsync("RazorTestAny");
175+
176+
Assert.Equal(HttpStatusCode.NotFound, gateAllResponse.StatusCode);
177+
Assert.Equal(HttpStatusCode.NotFound, gateAnyResponse.StatusCode);
178+
}
179+
180+
private static void DisableEndpointRouting(MvcOptions options)
181+
{
182+
//
183+
// Endpoint routing is disabled by default in .NET Core 2.1 since it didn't exist.
184+
options.EnableEndpointRouting = false;
185+
}
186+
}
187+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT license.
3+
//
4+
namespace Tests.FeatureManagement.AspNetCore
5+
{
6+
enum Features
7+
{
8+
ConditionalFeature,
9+
ConditionalFeature2
10+
}
11+
}

tests/Tests.FeatureManagement/MvcFilter.cs renamed to tests/Tests.FeatureManagement.AspNetCore/MvcFilter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
using System.Threading.Tasks;
55
using Microsoft.AspNetCore.Mvc.Filters;
66

7-
namespace Tests.FeatureManagement
7+
namespace Tests.FeatureManagement.AspNetCore
88
{
99
public class MvcFilter : IAsyncActionFilter
1010
{

0 commit comments

Comments
 (0)