Skip to content

Commit ced70f6

Browse files
authored
Fix CA1062 (#5048)
1 parent f6c940b commit ced70f6

File tree

3 files changed

+208
-2
lines changed

3 files changed

+208
-2
lines changed

src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ public static class RedisBuilderExtensions
2626
/// <returns>A reference to the <see cref="IResourceBuilder{T}"/>.</returns>
2727
public static IResourceBuilder<RedisResource> AddRedis(this IDistributedApplicationBuilder builder, string name, int? port = null)
2828
{
29+
ArgumentNullException.ThrowIfNull(builder);
30+
2931
var redis = new RedisResource(name);
3032
return builder.AddResource(redis)
3133
.WithEndpoint(port: port, targetPort: 6379, name: RedisResource.PrimaryEndpointName)
@@ -42,6 +44,8 @@ public static IResourceBuilder<RedisResource> AddRedis(this IDistributedApplicat
4244
/// <returns></returns>
4345
public static IResourceBuilder<RedisResource> WithRedisCommander(this IResourceBuilder<RedisResource> builder, Action<IResourceBuilder<RedisCommanderResource>>? configureContainer = null, string? containerName = null)
4446
{
47+
ArgumentNullException.ThrowIfNull(builder);
48+
4549
if (builder.ApplicationBuilder.Resources.OfType<RedisCommanderResource>().SingleOrDefault() is { } existingRedisCommanderResource)
4650
{
4751
var builderForExistingResource = builder.ApplicationBuilder.CreateResourceBuilder(existingRedisCommanderResource);
@@ -74,6 +78,8 @@ public static IResourceBuilder<RedisResource> WithRedisCommander(this IResourceB
7478
/// <returns>The resource builder for PGAdmin.</returns>
7579
public static IResourceBuilder<RedisCommanderResource> WithHostPort(this IResourceBuilder<RedisCommanderResource> builder, int? port)
7680
{
81+
ArgumentNullException.ThrowIfNull(builder);
82+
7783
return builder.WithEndpoint("http", endpoint =>
7884
{
7985
endpoint.Port = port;
@@ -100,6 +106,8 @@ public static IResourceBuilder<RedisCommanderResource> WithHostPort(this IResour
100106
/// <returns>The <see cref="IResourceBuilder{T}"/>.</returns>
101107
public static IResourceBuilder<RedisResource> WithDataVolume(this IResourceBuilder<RedisResource> builder, string? name = null, bool isReadOnly = false)
102108
{
109+
ArgumentNullException.ThrowIfNull(builder);
110+
103111
builder.WithVolume(name ?? VolumeNameGenerator.CreateVolumeName(builder, "data"), "/data", isReadOnly);
104112
if (!isReadOnly)
105113
{
@@ -128,6 +136,9 @@ public static IResourceBuilder<RedisResource> WithDataVolume(this IResourceBuild
128136
/// <returns>The <see cref="IResourceBuilder{T}"/>.</returns>
129137
public static IResourceBuilder<RedisResource> WithDataBindMount(this IResourceBuilder<RedisResource> builder, string source, bool isReadOnly = false)
130138
{
139+
ArgumentNullException.ThrowIfNull(builder);
140+
ArgumentNullException.ThrowIfNull(source);
141+
131142
builder.WithBindMount(source, "/data", isReadOnly);
132143
if (!isReadOnly)
133144
{
@@ -153,11 +164,16 @@ public static IResourceBuilder<RedisResource> WithDataBindMount(this IResourceBu
153164
/// <param name="keysChangedThreshold">The number of key change operations required to trigger a snapshot at the interval. Defaults to 1.</param>
154165
/// <returns>The <see cref="IResourceBuilder{T}"/>.</returns>
155166
public static IResourceBuilder<RedisResource> WithPersistence(this IResourceBuilder<RedisResource> builder, TimeSpan? interval = null, long keysChangedThreshold = 1)
156-
=> builder.WithAnnotation(new CommandLineArgsCallbackAnnotation(context =>
167+
{
168+
ArgumentNullException.ThrowIfNull(builder);
169+
170+
return builder.WithAnnotation(new CommandLineArgsCallbackAnnotation(context =>
157171
{
158172
context.Args.Add("--save");
159-
context.Args.Add((interval ?? TimeSpan.FromSeconds(60)).TotalSeconds.ToString(CultureInfo.InvariantCulture));
173+
context.Args.Add(
174+
(interval ?? TimeSpan.FromSeconds(60)).TotalSeconds.ToString(CultureInfo.InvariantCulture));
160175
context.Args.Add(keysChangedThreshold.ToString(CultureInfo.InvariantCulture));
161176
return Task.CompletedTask;
162177
}), ResourceAnnotationMutationBehavior.Replace);
178+
}
163179
}

src/Aspire.Hosting.Redis/RedisCommanderConfigWriterHook.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ internal sealed class RedisCommanderConfigWriterHook : IDistributedApplicationLi
1111
{
1212
public Task AfterEndpointsAllocatedAsync(DistributedApplicationModel appModel, CancellationToken cancellationToken)
1313
{
14+
ArgumentNullException.ThrowIfNull(appModel);
15+
1416
if (appModel.Resources.OfType<RedisCommanderResource>().SingleOrDefault() is not { } commanderResource)
1517
{
1618
// No-op if there is no commander resource (removed after hook added).
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using Aspire.Hosting.ApplicationModel;
5+
using Xunit;
6+
7+
namespace Aspire.Hosting.Redis.Tests;
8+
9+
public class RedisPublicApiTests
10+
{
11+
#region RedisBuilderExtensions
12+
13+
[Fact]
14+
public void AddRedisContainerShouldThrowsWhenBuilderIsNull()
15+
{
16+
IDistributedApplicationBuilder builder = null!;
17+
const string name = "Redis";
18+
19+
var action = () => builder.AddRedis(name);
20+
21+
Assert.Multiple(() =>
22+
{
23+
var exception = Assert.Throws<ArgumentNullException>(action);
24+
Assert.Equal(nameof(builder), exception.ParamName);
25+
});
26+
}
27+
28+
[Fact]
29+
public void AddRedisContainerShouldThrowsWhenNameIsNull()
30+
{
31+
IDistributedApplicationBuilder builder = new DistributedApplicationBuilder([]);
32+
string name = null!;
33+
34+
var action = () => builder.AddRedis(name);
35+
36+
Assert.Multiple(() =>
37+
{
38+
var exception = Assert.Throws<ArgumentNullException>(action);
39+
Assert.Equal(nameof(name), exception.ParamName);
40+
});
41+
}
42+
43+
[Fact]
44+
public void WithRedisCommanderShouldThrowsWhenBuilderIsNull()
45+
{
46+
IResourceBuilder<RedisResource> builder = null!;
47+
48+
var action = () => builder.WithRedisCommander();
49+
50+
Assert.Multiple(() =>
51+
{
52+
var exception = Assert.Throws<ArgumentNullException>(action);
53+
Assert.Equal(nameof(builder), exception.ParamName);
54+
});
55+
}
56+
57+
[Fact]
58+
public void WithHostPortShouldThrowsWhenBuilderIsNull()
59+
{
60+
IResourceBuilder<RedisCommanderResource> builder = null!;
61+
const int port = 777;
62+
63+
var action = () => builder.WithHostPort(port);
64+
65+
Assert.Multiple(() =>
66+
{
67+
var exception = Assert.Throws<ArgumentNullException>(action);
68+
Assert.Equal(nameof(builder), exception.ParamName);
69+
});
70+
}
71+
72+
[Fact]
73+
public void WithDataVolumeShouldThrowsWhenBuilderIsNull()
74+
{
75+
IResourceBuilder<RedisResource> builder = null!;
76+
77+
var action = () => builder.WithDataVolume();
78+
79+
Assert.Multiple(() =>
80+
{
81+
var exception = Assert.Throws<ArgumentNullException>(action);
82+
Assert.Equal(nameof(builder), exception.ParamName);
83+
});
84+
}
85+
86+
[Fact]
87+
public void WithDataBindMountShouldThrowsWhenBuilderIsNull()
88+
{
89+
IResourceBuilder<RedisResource> builder = null!;
90+
const string source = "/data";
91+
92+
var action = () => builder.WithDataBindMount(source);
93+
94+
Assert.Multiple(() =>
95+
{
96+
var exception = Assert.Throws<ArgumentNullException>(action);
97+
Assert.Equal(nameof(builder), exception.ParamName);
98+
});
99+
}
100+
101+
[Fact]
102+
public void WithDataBindMountShouldThrowsWhenNameIsNull()
103+
{
104+
var distributedApplicationBuilder = new DistributedApplicationBuilder([]);
105+
const string name = "Redis";
106+
var resource = new RedisResource(name);
107+
var builder = distributedApplicationBuilder.AddResource(resource);
108+
string source = null!;
109+
110+
var action = () => builder.WithDataBindMount(source);
111+
112+
Assert.Multiple(() =>
113+
{
114+
var exception = Assert.Throws<ArgumentNullException>(action);
115+
Assert.Equal(nameof(source), exception.ParamName);
116+
});
117+
}
118+
119+
[Fact]
120+
public void WithPersistenceShouldThrowsWhenBuilderIsNull()
121+
{
122+
IResourceBuilder<RedisResource> builder = null!;
123+
124+
var action = () => builder.WithPersistence();
125+
126+
Assert.Multiple(() =>
127+
{
128+
var exception = Assert.Throws<ArgumentNullException>(action);
129+
Assert.Equal(nameof(builder), exception.ParamName);
130+
});
131+
}
132+
133+
#endregion
134+
135+
#region RedisCommanderConfigWriterHook
136+
137+
[Fact]
138+
public async Task AfterEndpointsAllocatedAsyncShouldThrowsWhenDistributedApplicationModelIsNull()
139+
{
140+
DistributedApplicationModel appModel = null!;
141+
var cancellationToken = CancellationToken.None;
142+
143+
var instance = (RedisCommanderConfigWriterHook)Activator.CreateInstance(typeof(RedisCommanderConfigWriterHook), true)!;
144+
145+
async Task Action() => await instance.AfterEndpointsAllocatedAsync(appModel, cancellationToken);
146+
147+
var exception = await Assert.ThrowsAsync<ArgumentNullException>(Action);
148+
Assert.Equal(nameof(appModel), exception.ParamName);
149+
}
150+
151+
#endregion
152+
153+
#region RedisCommanderResource
154+
155+
[Fact]
156+
public void CtorRedisCommanderResourceShouldThrowsWhenNameIsNull()
157+
{
158+
string name = null!;
159+
160+
var action = () => new RedisCommanderResource(name);
161+
162+
Assert.Multiple(() =>
163+
{
164+
var exception = Assert.Throws<ArgumentNullException>(action);
165+
Assert.Equal(nameof(name), exception.ParamName);
166+
});
167+
}
168+
169+
#endregion
170+
171+
#region RedisResource
172+
173+
[Fact]
174+
public void CtorRedisResourceShouldThrowsWhenNameIsNull()
175+
{
176+
string name = null!;
177+
178+
var action = () => new RedisResource(name);
179+
180+
Assert.Multiple(() =>
181+
{
182+
var exception = Assert.Throws<ArgumentNullException>(action);
183+
Assert.Equal(nameof(name), exception.ParamName);
184+
});
185+
}
186+
187+
#endregion
188+
}

0 commit comments

Comments
 (0)