Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 2a3028c

Browse files
Zhukov Maximajcvickers
authored andcommitted
Fix ArgumentNullException in case of IValidatableObject returns null (#25693)
* Fix ArgumentNullException in case of IValidatableObject returns null (#25495) * Skip validatable null check tests on NETFX (#25495) * Fix an issue with tests ignore
1 parent 075df17 commit 2a3028c

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed

src/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/Validator.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -433,9 +433,12 @@ private static IEnumerable<ValidationError> GetObjectValidationErrors(object ins
433433
{
434434
var results = validatable.Validate(validationContext);
435435

436-
foreach (var result in results.Where(r => r != ValidationResult.Success))
436+
if (results != null)
437437
{
438-
errors.Add(new ValidationError(null, instance, result));
438+
foreach (var result in results.Where(r => r != ValidationResult.Success))
439+
{
440+
errors.Add(new ValidationError(null, instance, result));
441+
}
439442
}
440443
}
441444

src/System.ComponentModel.Annotations/tests/ValidatorTests.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,26 @@ public IEnumerable<ValidationResult> Validate(ValidationContext validationContex
190190
}
191191
}
192192

193+
[Fact]
194+
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Null check not present in .NET Framework. See https://github.com/dotnet/corefx/issues/25495")]
195+
public void TryValidateObject_IValidatableObject_Null()
196+
{
197+
var instance = new ValidatableNull();
198+
var context = new ValidationContext(instance);
199+
200+
var results = new List<ValidationResult>();
201+
Assert.True(Validator.TryValidateObject(instance, context, results));
202+
Assert.Equal(0, results.Count);
203+
}
204+
205+
public class ValidatableNull : IValidatableObject
206+
{
207+
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
208+
{
209+
return null;
210+
}
211+
}
212+
193213
[Fact]
194214
public void TryValidateObject_RequiredNonNull_Success()
195215
{
@@ -318,6 +338,34 @@ public static void ValidateObject_throws_ValidationException_if_all_properties_a
318338
Assert.Equal(objectToBeValidated, exception.Value);
319339
}
320340

341+
[Fact]
342+
public void ValidateObject_IValidatableObject_Success()
343+
{
344+
var instance = new ValidatableSuccess();
345+
var context = new ValidationContext(instance);
346+
347+
Validator.ValidateObject(instance, context);
348+
}
349+
350+
[Fact]
351+
public void ValidateObject_IValidatableObject_Error()
352+
{
353+
var instance = new ValidatableError();
354+
var context = new ValidationContext(instance);
355+
var exception = Assert.Throws<ValidationException>(
356+
() => Validator.ValidateObject(instance, context));
357+
Assert.Equal("error", exception.ValidationResult.ErrorMessage);
358+
}
359+
360+
[Fact]
361+
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Null check not present in .NET Framework. See https://github.com/dotnet/corefx/issues/25495")]
362+
public void ValidateObject_IValidatableObject_Null()
363+
{
364+
var instance = new ValidatableNull();
365+
var context = new ValidationContext(instance);
366+
367+
Validator.ValidateObject(instance, context);
368+
}
321369
#endregion ValidateObject
322370

323371
#region TryValidateProperty

0 commit comments

Comments
 (0)