150 lines
7.3 KiB
C#
150 lines
7.3 KiB
C#
using StellaOps.Signals.Lattice;
|
|
using Xunit;
|
|
|
|
namespace StellaOps.Signals.Tests;
|
|
|
|
public class ReachabilityLatticeTests
|
|
{
|
|
[Theory]
|
|
[InlineData(ReachabilityLatticeState.Unknown, ReachabilityLatticeState.StaticallyReachable, ReachabilityLatticeState.StaticallyReachable)]
|
|
[InlineData(ReachabilityLatticeState.StaticallyReachable, ReachabilityLatticeState.StaticallyUnreachable, ReachabilityLatticeState.Contested)]
|
|
[InlineData(ReachabilityLatticeState.StaticallyReachable, ReachabilityLatticeState.RuntimeObserved, ReachabilityLatticeState.ConfirmedReachable)]
|
|
[InlineData(ReachabilityLatticeState.StaticallyUnreachable, ReachabilityLatticeState.RuntimeUnobserved, ReachabilityLatticeState.ConfirmedUnreachable)]
|
|
[InlineData(ReachabilityLatticeState.RuntimeObserved, ReachabilityLatticeState.StaticallyUnreachable, ReachabilityLatticeState.Contested)]
|
|
[InlineData(ReachabilityLatticeState.ConfirmedReachable, ReachabilityLatticeState.ConfirmedUnreachable, ReachabilityLatticeState.Contested)]
|
|
[InlineData(ReachabilityLatticeState.Contested, ReachabilityLatticeState.Unknown, ReachabilityLatticeState.Contested)]
|
|
public void Join_ReturnsExpectedState(ReachabilityLatticeState a, ReachabilityLatticeState b, ReachabilityLatticeState expected)
|
|
{
|
|
var result = ReachabilityLattice.Join(a, b);
|
|
Assert.Equal(expected, result);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(ReachabilityLatticeState.Unknown, ReachabilityLatticeState.StaticallyReachable, ReachabilityLatticeState.Unknown)]
|
|
[InlineData(ReachabilityLatticeState.ConfirmedReachable, ReachabilityLatticeState.RuntimeObserved, ReachabilityLatticeState.RuntimeObserved)]
|
|
[InlineData(ReachabilityLatticeState.Contested, ReachabilityLatticeState.StaticallyReachable, ReachabilityLatticeState.StaticallyReachable)]
|
|
[InlineData(ReachabilityLatticeState.Contested, ReachabilityLatticeState.Unknown, ReachabilityLatticeState.Unknown)]
|
|
public void Meet_ReturnsExpectedState(ReachabilityLatticeState a, ReachabilityLatticeState b, ReachabilityLatticeState expected)
|
|
{
|
|
var result = ReachabilityLattice.Meet(a, b);
|
|
Assert.Equal(expected, result);
|
|
}
|
|
|
|
[Fact]
|
|
public void Join_IsCommutative()
|
|
{
|
|
var states = Enum.GetValues<ReachabilityLatticeState>();
|
|
foreach (var a in states)
|
|
{
|
|
foreach (var b in states)
|
|
{
|
|
Assert.Equal(ReachabilityLattice.Join(a, b), ReachabilityLattice.Join(b, a));
|
|
}
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Meet_IsCommutative()
|
|
{
|
|
var states = Enum.GetValues<ReachabilityLatticeState>();
|
|
foreach (var a in states)
|
|
{
|
|
foreach (var b in states)
|
|
{
|
|
Assert.Equal(ReachabilityLattice.Meet(a, b), ReachabilityLattice.Meet(b, a));
|
|
}
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void JoinAll_WithEmptySequence_ReturnsUnknown()
|
|
{
|
|
var result = ReachabilityLattice.JoinAll(Array.Empty<ReachabilityLatticeState>());
|
|
Assert.Equal(ReachabilityLatticeState.Unknown, result);
|
|
}
|
|
|
|
[Fact]
|
|
public void JoinAll_StopsEarlyOnContested()
|
|
{
|
|
var states = new[] { ReachabilityLatticeState.StaticallyReachable, ReachabilityLatticeState.Contested, ReachabilityLatticeState.Unknown };
|
|
var result = ReachabilityLattice.JoinAll(states);
|
|
Assert.Equal(ReachabilityLatticeState.Contested, result);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(true, false, false, ReachabilityLatticeState.StaticallyReachable)]
|
|
[InlineData(false, false, false, ReachabilityLatticeState.StaticallyUnreachable)]
|
|
[InlineData(null, false, false, ReachabilityLatticeState.Unknown)]
|
|
[InlineData(true, true, true, ReachabilityLatticeState.ConfirmedReachable)]
|
|
[InlineData(false, true, false, ReachabilityLatticeState.ConfirmedUnreachable)]
|
|
[InlineData(false, true, true, ReachabilityLatticeState.Contested)]
|
|
public void FromEvidence_ReturnsExpectedState(bool? staticReachable, bool hasRuntimeEvidence, bool runtimeObserved, ReachabilityLatticeState expected)
|
|
{
|
|
var result = ReachabilityLattice.FromEvidence(staticReachable, hasRuntimeEvidence, runtimeObserved);
|
|
Assert.Equal(expected, result);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("entrypoint", false, ReachabilityLatticeState.ConfirmedReachable)]
|
|
[InlineData("direct", false, ReachabilityLatticeState.StaticallyReachable)]
|
|
[InlineData("direct", true, ReachabilityLatticeState.ConfirmedReachable)]
|
|
[InlineData("runtime", false, ReachabilityLatticeState.RuntimeObserved)]
|
|
[InlineData("unreachable", false, ReachabilityLatticeState.StaticallyUnreachable)]
|
|
[InlineData("unreachable", true, ReachabilityLatticeState.Contested)]
|
|
[InlineData("unknown", false, ReachabilityLatticeState.Unknown)]
|
|
public void FromV0Bucket_ReturnsExpectedState(string bucket, bool hasRuntimeHits, ReachabilityLatticeState expected)
|
|
{
|
|
var result = ReachabilityLattice.FromV0Bucket(bucket, hasRuntimeHits);
|
|
Assert.Equal(expected, result);
|
|
}
|
|
}
|
|
|
|
public class ReachabilityLatticeStateExtensionsTests
|
|
{
|
|
[Theory]
|
|
[InlineData(ReachabilityLatticeState.Unknown, "U")]
|
|
[InlineData(ReachabilityLatticeState.StaticallyReachable, "SR")]
|
|
[InlineData(ReachabilityLatticeState.StaticallyUnreachable, "SU")]
|
|
[InlineData(ReachabilityLatticeState.RuntimeObserved, "RO")]
|
|
[InlineData(ReachabilityLatticeState.RuntimeUnobserved, "RU")]
|
|
[InlineData(ReachabilityLatticeState.ConfirmedReachable, "CR")]
|
|
[InlineData(ReachabilityLatticeState.ConfirmedUnreachable, "CU")]
|
|
[InlineData(ReachabilityLatticeState.Contested, "X")]
|
|
public void ToCode_ReturnsExpectedCode(ReachabilityLatticeState state, string expectedCode)
|
|
{
|
|
Assert.Equal(expectedCode, state.ToCode());
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("U", ReachabilityLatticeState.Unknown)]
|
|
[InlineData("SR", ReachabilityLatticeState.StaticallyReachable)]
|
|
[InlineData("SU", ReachabilityLatticeState.StaticallyUnreachable)]
|
|
[InlineData("RO", ReachabilityLatticeState.RuntimeObserved)]
|
|
[InlineData("RU", ReachabilityLatticeState.RuntimeUnobserved)]
|
|
[InlineData("CR", ReachabilityLatticeState.ConfirmedReachable)]
|
|
[InlineData("CU", ReachabilityLatticeState.ConfirmedUnreachable)]
|
|
[InlineData("X", ReachabilityLatticeState.Contested)]
|
|
[InlineData("invalid", ReachabilityLatticeState.Unknown)]
|
|
[InlineData("", ReachabilityLatticeState.Unknown)]
|
|
[InlineData(null, ReachabilityLatticeState.Unknown)]
|
|
public void FromCode_ReturnsExpectedState(string? code, ReachabilityLatticeState expected)
|
|
{
|
|
Assert.Equal(expected, ReachabilityLatticeStateExtensions.FromCode(code));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(ReachabilityLatticeState.ConfirmedUnreachable, "unreachable")]
|
|
[InlineData(ReachabilityLatticeState.StaticallyUnreachable, "unreachable")]
|
|
[InlineData(ReachabilityLatticeState.RuntimeUnobserved, "unreachable")]
|
|
[InlineData(ReachabilityLatticeState.ConfirmedReachable, "runtime")]
|
|
[InlineData(ReachabilityLatticeState.RuntimeObserved, "runtime")]
|
|
[InlineData(ReachabilityLatticeState.StaticallyReachable, "direct")]
|
|
[InlineData(ReachabilityLatticeState.Unknown, "unknown")]
|
|
[InlineData(ReachabilityLatticeState.Contested, "unknown")]
|
|
public void ToV0Bucket_ReturnsExpectedBucket(ReachabilityLatticeState state, string expectedBucket)
|
|
{
|
|
Assert.Equal(expectedBucket, state.ToV0Bucket());
|
|
}
|
|
|
|
}
|