namespace LibNftables.Tests; public sealed class NftContextTests { [Fact] public void ContextFlagsRoundTrip_Works() { if (!NativeTestSupport.TryCreateContext(out var ctx)) { return; } using (ctx) { ctx.DryRun = true; Assert.True(ctx.DryRun); ctx.OptimizeFlags = NftOptimizeFlags.Enabled; Assert.True(ctx.OptimizeFlags.HasFlag(NftOptimizeFlags.Enabled)); ctx.InputFlags = NftInputFlags.NoDns | NftInputFlags.Json; Assert.True(ctx.InputFlags.HasFlag(NftInputFlags.NoDns)); Assert.True(ctx.InputFlags.HasFlag(NftInputFlags.Json)); ctx.OutputFlags = NftOutputFlags.Json | NftOutputFlags.Echo | NftOutputFlags.Terse; Assert.True(ctx.OutputFlags.HasFlag(NftOutputFlags.Json)); Assert.True(ctx.OutputFlags.HasFlag(NftOutputFlags.Echo)); Assert.True(ctx.OutputFlags.HasFlag(NftOutputFlags.Terse)); ctx.DebugFlags = NftDebugLevel.Parser | NftDebugLevel.Scanner; Assert.True(ctx.DebugFlags.HasFlag(NftDebugLevel.Parser)); Assert.True(ctx.DebugFlags.HasFlag(NftDebugLevel.Scanner)); } } [Fact] public void InvalidCommand_ThrowsNftExceptionWithErrorBuffer() { if (!NativeTestSupport.TryCreateContext(out var ctx)) { return; } using (ctx) { ctx.DryRun = true; ctx.BufferError(); var ex = Assert.ThrowsAny(() => ctx.RunCommand("this is not valid nft syntax")); Assert.NotEqual(0, ex.NativeErrorCode); Assert.False(string.IsNullOrWhiteSpace(ex.NativeErrorOutput)); } } [Fact] [Trait("Category", "Privileged")] public void ValidDryRunCommand_CanExecuteAndBufferOutput() { if (!NativeTestSupport.TryCreateContext(out var ctx)) { return; } if (!NativeTestSupport.ShouldRunPrivilegedTests()) { return; } using (ctx) { ctx.DryRun = true; ctx.BufferOutput(); ctx.BufferError(); ctx.RunCommand("add table inet swig_test"); var output = ctx.GetOutputBuffer(); var error = ctx.GetErrorBuffer(); Assert.NotNull(output); Assert.True(string.IsNullOrEmpty(error), $"Unexpected error buffer: {error}"); } } }