137 lines
3.5 KiB
C#
137 lines
3.5 KiB
C#
|
|
using System.Net;
|
|
using System.Threading.Tasks;
|
|
using Server.Network;
|
|
using Xunit;
|
|
|
|
namespace Server.Tests;
|
|
|
|
public class FirewallTests
|
|
{
|
|
[Fact]
|
|
public void Firewall_BlocksIPAddress_WhenAdded()
|
|
{
|
|
var ip = IPAddress.Parse("192.168.1.1");
|
|
var entry = new SingleIpFirewallEntry("192.168.1.1");
|
|
|
|
Assert.False(Firewall.IsBlocked(ip));
|
|
|
|
Firewall.Add(entry);
|
|
|
|
Assert.True(Firewall.IsBlocked(ip));
|
|
}
|
|
|
|
[Fact]
|
|
public void Firewall_DoesNotBlockIPAddress_WhenNotAdded()
|
|
{
|
|
var ip = IPAddress.Parse("192.168.1.2");
|
|
Assert.False(Firewall.IsBlocked(ip));
|
|
}
|
|
|
|
[Fact]
|
|
public void Firewall_StopsBlockingIPAddress_WhenRemoved()
|
|
{
|
|
var ip = IPAddress.Parse("192.168.1.3");
|
|
var entry = new SingleIpFirewallEntry("192.168.1.3");
|
|
|
|
Firewall.Add(entry);
|
|
Assert.True(Firewall.IsBlocked(ip));
|
|
|
|
Firewall.Remove(entry);
|
|
Assert.False(Firewall.IsBlocked(ip));
|
|
}
|
|
|
|
[Fact]
|
|
public void Firewall_BlocksIPRange()
|
|
{
|
|
var entry = new CidrFirewallEntry(IPAddress.Parse("10.0.0.1"), IPAddress.Parse("10.0.0.5"));
|
|
|
|
Firewall.Add(entry);
|
|
|
|
Assert.True(Firewall.IsBlocked(IPAddress.Parse("10.0.0.1")));
|
|
Assert.True(Firewall.IsBlocked(IPAddress.Parse("10.0.0.3")));
|
|
Assert.True(Firewall.IsBlocked(IPAddress.Parse("10.0.0.5")));
|
|
|
|
Assert.False(Firewall.IsBlocked(IPAddress.Parse("10.0.0.6")));
|
|
}
|
|
|
|
[Fact]
|
|
public void Firewall_CacheInvalidation_WorksOnUpdate()
|
|
{
|
|
var ip = IPAddress.Parse("192.168.1.10");
|
|
var entry = new SingleIpFirewallEntry("192.168.1.10");
|
|
|
|
Firewall.Add(entry);
|
|
Assert.True(Firewall.IsBlocked(ip));
|
|
|
|
Firewall.Remove(entry);
|
|
Assert.False(Firewall.IsBlocked(ip));
|
|
}
|
|
|
|
[Fact]
|
|
public void Firewall_ReadsFirewallSetCorrectly()
|
|
{
|
|
var entry = new SingleIpFirewallEntry("172.16.0.1");
|
|
Firewall.Add(entry);
|
|
|
|
var found = false;
|
|
Firewall.ReadFirewallSet(set =>
|
|
{
|
|
found = set.Contains(entry);
|
|
});
|
|
|
|
Assert.True(found);
|
|
}
|
|
|
|
[Fact]
|
|
public void Firewall_IsThreadSafe()
|
|
{
|
|
var testIps = new IPAddress[256];
|
|
for (var i = 0; i <= 255; i++)
|
|
{
|
|
testIps[i] = IPAddress.Parse($"192.168.0.{i}");
|
|
}
|
|
|
|
var entry = new CidrFirewallEntry(IPAddress.Parse("192.168.0.1"), IPAddress.Parse("192.168.0.255"));
|
|
Firewall.Add(entry);
|
|
|
|
Parallel.ForEach(testIps, ip =>
|
|
{
|
|
var shouldBlock = int.Parse(ip.ToString().Split('.')[3]) is > 0;
|
|
Assert.Equal(shouldBlock, Firewall.IsBlocked(ip));
|
|
});
|
|
|
|
Firewall.Remove(entry);
|
|
|
|
Parallel.ForEach(testIps, ip =>
|
|
{
|
|
Assert.False(Firewall.IsBlocked(ip));
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void Firewall_DoesNotThrowWhenRemovingNonExistentEntry()
|
|
{
|
|
var entry = new SingleIpFirewallEntry("203.0.113.5");
|
|
Assert.False(Firewall.Remove(entry));
|
|
}
|
|
|
|
[Fact]
|
|
public void Firewall_CacheHandlesMultipleUpdates()
|
|
{
|
|
var ip = IPAddress.Parse("192.168.1.20");
|
|
var entry = new SingleIpFirewallEntry("192.168.1.20");
|
|
|
|
Firewall.Add(entry);
|
|
Assert.True(Firewall.IsBlocked(ip));
|
|
|
|
Firewall.Remove(entry);
|
|
Assert.False(Firewall.IsBlocked(ip));
|
|
|
|
Firewall.Add(entry);
|
|
Assert.True(Firewall.IsBlocked(ip));
|
|
|
|
Firewall.Remove(entry);
|
|
Assert.False(Firewall.IsBlocked(ip));
|
|
}
|
|
}
|