Skip to content

Commit

Permalink
TryParse Method Signature for ICidrGuess (#340)
Browse files Browse the repository at this point in the history
* TryParse Method Signature for ICidrGuess

* Fix testing and automated warnings.

---------

Co-authored-by: Moshe Alfih <m.alfih@dynamosoftware.com>
  • Loading branch information
microalps and Moshe Alfih authored Jan 31, 2025
1 parent 0ab11a9 commit becfdee
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 2 deletions.
49 changes: 49 additions & 0 deletions src/System.Net.IPNetwork/IPNetwork2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -540,6 +540,55 @@ public static bool TryParse(IPAddress ipaddress, IPAddress netmask, out IPNetwor
return parsed;
}

/// <summary>
/// 192.168.0.1/24
/// 192.168.0.1 255.255.255.0
///
/// Network : 192.168.0.0
/// Netmask : 255.255.255.0
/// Cidr : 24
/// Start : 192.168.0.1
/// End : 192.168.0.254
/// Broadcast : 192.168.0.255.
/// </summary>
/// <param name="network">A string containing an ip network to convert.</param>
/// <param name="cidrGuess">A ICidrGuess implementation that will be used to guess CIDR during converion.</param>
/// <param name="ipnetwork">When this method returns, contains the IPNetwork value equivalent of the ip adress contained in ipaddress with the netmask corresponding to cidr, if the conversion succeeded, or null if the conversion failed. The conversion fails if the s parameter is null or Empty, is not of the correct format, or represents an invalid ip address. This parameter is passed uninitialized; any value originally supplied in result will be overwritten.</param>
/// <returns>true if network was converted successfully; otherwise, false..</returns>
public static bool TryParse(string network, ICidrGuess cidrGuess, out IPNetwork2 ipnetwork)
{
IPNetwork2.InternalParse(true, network, cidrGuess, true, out IPNetwork2 ipnetwork2);
bool parsed = ipnetwork2 != null;
ipnetwork = ipnetwork2;

return parsed;
}

/// <summary>
/// 192.168.0.1/24
/// 192.168.0.1 255.255.255.0
///
/// Network : 192.168.0.0
/// Netmask : 255.255.255.0
/// Cidr : 24
/// Start : 192.168.0.1
/// End : 192.168.0.254
/// Broadcast : 192.168.0.255.
/// </summary>
/// <param name="network">A string containing an ip network to convert.</param>
/// <param name="cidrGuess">A ICidrGuess implementation that will be used to guess CIDR during converion.</param>
/// <param name="sanitanize">Whether to sanitize network or not.</param>
/// <param name="ipnetwork">When this method returns, contains the IPNetwork value equivalent of the ip adress contained in ipaddress with the netmask corresponding to cidr, if the conversion succeeded, or null if the conversion failed. The conversion fails if the s parameter is null or Empty, is not of the correct format, or represents an invalid ip address. This parameter is passed uninitialized; any value originally supplied in result will be overwritten.</param>
/// <returns>true if network was converted successfully; otherwise, false..</returns>
public static bool TryParse(string network, ICidrGuess cidrGuess, bool sanitanize, out IPNetwork2 ipnetwork)
{
IPNetwork2.InternalParse(true, network, cidrGuess, sanitanize, out IPNetwork2 ipnetwork2);
bool parsed = ipnetwork2 != null;
ipnetwork = ipnetwork2;

return parsed;
}

#endregion

#region InternalParse
Expand Down
2 changes: 1 addition & 1 deletion src/TestProject/IPNetworkUnitTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -589,7 +589,7 @@ public void TestTryParseIPAddressNetmaskANE6()
public void TestTryParseIPAddressNetmaskANE7()
{
IPNetwork2 ipnet = null;
bool parsed = IPNetwork2.TryParse("0.0.0.0", null, out ipnet);
bool parsed = IPNetwork2.TryParse("0.0.0.0", netmask: null, out ipnet);

Assert.AreEqual(false, parsed, "parsed");
Assert.AreEqual(null, ipnet, "ipnet");
Expand Down
51 changes: 50 additions & 1 deletion src/TestProject/TryParseUnitTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public void TestTryParseIPAddressNetmaskANE6()
[TestMethod]
public void TestTryParseIPAddressNetmaskANE7()
{
bool parsed = IPNetwork2.TryParse("0.0.0.0", null, out IPNetwork2 ipnet);
bool parsed = IPNetwork2.TryParse("0.0.0.0", netmask: null, out IPNetwork2 ipnet);

Assert.AreEqual(false, parsed, "parsed");
Assert.AreEqual(null, ipnet, "ipnet");
Expand Down Expand Up @@ -317,6 +317,55 @@ public void Test_TryParse(string ipnetwork, bool sanitanize, bool parsed)
Assert.AreEqual(parsed, result, "parsed1");
}

/// <summary>
/// Test IPNetwork2.TryParse method with ip addresses or networks using classfull CIDR guessing.
/// </summary>
/// <param name="ipnetwork">A string containing an ip address to convert.</param>
/// <param name="sanitanize">Whether to sanitize network or not.</param>
/// <param name="parsed">The expected parse result.</param>
[DataTestMethod]
[DataRow("1.1.1.1/1", true, true)]
[DataRow("1.1.1.1/1", false, true)]
[DataRow("::/0", true, true)]
[DataRow("::/0", false, true)]
[DataRow("g001:02b8::/64", true, true)]
[DataRow("g001:02b8::/64", false, false)]
[DataRow(" 001:02b8::/64", false, false)]
[DataRow(" 001:02b8::/64", true, true)]
[DataRow("001:02b8:: / 64", true, true)]
[DataRow("001:02b8:: / 64", false, false)]
[DataRow("001:02b8::/64", true, true)]
[DataRow("001:02b8::/64", false, true)]
public void Test_TryParse_ClassFull(string ipnetwork, bool sanitanize, bool parsed)
{
bool result = IPNetwork2.TryParse(ipnetwork, sanitanize, out IPNetwork2 ipnetwork1);
bool classfullResult = IPNetwork2.TryParse(ipnetwork, CidrGuess.ClassFull, sanitanize, out IPNetwork2 ipnetwork2);

Assert.AreEqual(parsed, result, "parsed - class unspecified");
Assert.AreEqual(parsed, classfullResult, "parsed - classfull");
if (parsed)
{
Assert.AreEqual(ipnetwork1.Cidr, ipnetwork2.Cidr, "cidr");
}
}

/// <summary>
/// Test IPNetwork2.TryParse method with plain ip addresses using classless CIDR guessing.
/// </summary>
/// <param name="ipaddress">A string containing an ip address to convert.</param>
/// <param name="cidr">The expected CIDR netmask notation, 32 for IPv4 and 128 for IPv6.</param>
[DataTestMethod]
[DataRow("10.0.0.0", 32)]
[DataRow("::", 128)]
[DataRow("2001:0db8::", 128)]
public void Test_TryParse_ClassLess(string ipaddress, int cidr)
{
bool parsed = IPNetwork2.TryParse(ipaddress, CidrGuess.ClassLess, out IPNetwork2 ipnetwork2);

Assert.IsTrue(parsed, "parsed");
Assert.AreEqual(cidr, ipnetwork2.Cidr, "cidr");
}

[DataTestMethod]
[DataRow("1.1.1.1", true)]
[DataRow("::", true)]
Expand Down

0 comments on commit becfdee

Please sign in to comment.