Skip to content

Commit f1d8300

Browse files
committed
Skip duplicate networks when extracting multiple networks from a network
1 parent 51410b4 commit f1d8300

File tree

3 files changed

+42
-4
lines changed

3 files changed

+42
-4
lines changed

IPNetworkHelper.Tests/NetworkHelperTests.cs

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,18 @@ public void ExtractIPv4()
147147
Assert.IsTrue(result.Select((n, i) => expected[i].Equals(n)).All(v => true));
148148
}
149149

150+
[TestMethod]
151+
public void ExtractSelfReturnsSelfIPv4()
152+
{
153+
var network = NetworkHelper.Parse("192.168.0.0/16");
154+
var desired = NetworkHelper.Parse("192.168.0.0/16");
155+
156+
var result = network.Extract(desired).ToArray();
157+
var expected = new[] { NetworkHelper.Parse("192.168.0.0/16") };
158+
159+
Assert.IsTrue(result.Select((n, i) => expected[i].Equals(n)).All(v => true));
160+
}
161+
150162
[TestMethod]
151163
public void ExtractIPv6()
152164
{
@@ -159,6 +171,18 @@ public void ExtractIPv6()
159171
Assert.IsTrue(result.Select((n, i) => expected[i].Equals(n)).All(v => true));
160172
}
161173

174+
[TestMethod]
175+
public void ExtractSelfReturnsSelfIPv6()
176+
{
177+
var network = NetworkHelper.Parse("1111:2222::/32");
178+
var desired = NetworkHelper.Parse("1111:2222::/32");
179+
180+
var result = network.Extract(desired).ToArray();
181+
var expected = new[] { NetworkHelper.Parse("1111:2222::/32") };
182+
183+
Assert.IsTrue(result.Select((n, i) => expected[i].Equals(n)).All(v => true));
184+
}
185+
162186
[TestMethod]
163187
public void ExtractMultipleIPv4()
164188
{
@@ -171,6 +195,19 @@ public void ExtractMultipleIPv4()
171195
Assert.IsTrue(result.Select((n, i) => expected[i].Equals(n)).All(v => true));
172196
}
173197

198+
[TestMethod]
199+
public void ExtractMultipleSkipsCreated()
200+
{
201+
// See https://github.com/RobThree/IPNetworkHelper/issues/1#issuecomment-1034793979
202+
var network = NetworkHelper.Parse("37.0.0.0/8");
203+
var desired = new[] { "37.10.128.0/17", "37.12.128.0/18", "37.13.64.0/18", "37.13.128.0/17" }.Select(v => NetworkHelper.Parse(v)).ToArray();
204+
205+
var result = network.Extract(desired).ToArray();
206+
var expected = new[] { "37.0.0.0/13", "37.8.0.0/15", "37.10.0.0/17", "37.10.128.0/17", "37.11.0.0/16", "37.12.0.0/17", "37.12.128.0/18", "37.12.192.0/18", "37.13.0.0/18", "37.13.64.0/18", "37.13.128.0/17", "37.14.0.0/15", "37.16.0.0/12", "37.32.0.0/11", "37.64.0.0/10", "37.128.0.0/9" }.Select(v => NetworkHelper.Parse(v)).ToArray();
207+
208+
Assert.IsTrue(result.Select((n, i) => expected[i].Equals(n)).All(v => true));
209+
}
210+
174211
[TestMethod]
175212
public void ExtractMultipleIPv6()
176213
{
@@ -191,7 +228,7 @@ public void ExtractMultipleThrowsOnNetworkOutsideOfStartingNetwork()
191228

192229
try
193230
{
194-
network.Extract(desired).ToArray();
231+
network.Extract(desired);
195232
Assert.Fail();
196233
}
197234
catch (IPNetworkNotInIPNetworkException ex)

IPNetworkHelper/IPNetworkHelper.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
<RepositoryUrl>https://github.com/RobThree/IPNetworkHelper</RepositoryUrl>
1616
<RepositoryType>git</RepositoryType>
1717
<PackageTags>networking, csharp, ipv6, dotnet, network, ipv4, ip, cidr, extension-methods, dotnet-standard, ipv6-network, cidr-notation, ipv6-subnetting, ipv4-subnetting, ipv4-network, cidr-subnet</PackageTags>
18-
<PackageReleaseNotes>Added overload to extract multiple networks from a starting network</PackageReleaseNotes>
19-
<Version>1.0.4</Version>
18+
<PackageReleaseNotes>Duplicate networks are now ignored/skipped when extracting multiple networks</PackageReleaseNotes>
19+
<Version>1.0.5</Version>
2020
<Description>Provides helper (extension)methods for working with IPNetworks</Description>
2121
</PropertyGroup>
2222

IPNetworkHelper/NetworkHelper.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ private static IEnumerable<IPNetwork> ExtractImpl(IPNetwork network, IPNetwork d
197197
throw new AddressFamilyMismatchException(network.Prefix.AddressFamily, desiredNetwork.Prefix.AddressFamily);
198198
}
199199

200-
if (desiredNetwork.PrefixLength <= network.PrefixLength)
200+
if (desiredNetwork.PrefixLength < network.PrefixLength)
201201
{
202202
throw new IPNetworkLargerThanIPNetworkException(network, desiredNetwork);
203203
}
@@ -219,5 +219,6 @@ private static IEnumerable<IPNetwork> ExtractImpl(IPNetwork network, IPNetwork d
219219
}
220220
yield return network; // Lastly, return the extracted network
221221
}
222+
222223
}
223224
}

0 commit comments

Comments
 (0)