Compare commits
8 Commits
codex/stub
...
fe3fd7c74d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fe3fd7c74d | ||
|
|
a8c09a271f | ||
|
|
fe2483d448 | ||
|
|
b94a67be6e | ||
|
|
c0aaae9236 | ||
|
|
4e96fb2ba8 | ||
|
|
ae0a553ab8 | ||
|
|
a660e38575 |
@@ -153,15 +153,105 @@ public interface IOcspResponseCache
|
|||||||
void Remove(string key);
|
void Remove(string key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Runtime counters for OCSP response cache behavior.
|
||||||
|
/// Mirrors Go <c>OCSPResponseCacheStats</c> shape.
|
||||||
|
/// </summary>
|
||||||
|
public sealed class OcspResponseCacheStats
|
||||||
|
{
|
||||||
|
public long Responses { get; set; }
|
||||||
|
public long Hits { get; set; }
|
||||||
|
public long Misses { get; set; }
|
||||||
|
public long Revokes { get; set; }
|
||||||
|
public long Goods { get; set; }
|
||||||
|
public long Unknowns { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A no-op OCSP cache that never stores anything.
|
/// A no-op OCSP cache that never stores anything.
|
||||||
/// Mirrors Go <c>NoOpCache</c> in server/ocsp_responsecache.go.
|
/// Mirrors Go <c>NoOpCache</c> in server/ocsp_responsecache.go.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class NoOpCache : IOcspResponseCache
|
internal sealed class NoOpCache : IOcspResponseCache
|
||||||
{
|
{
|
||||||
|
private readonly Lock _mu = new();
|
||||||
|
private readonly OcspResponseCacheConfig _config;
|
||||||
|
private OcspResponseCacheStats? _stats;
|
||||||
|
private bool _online;
|
||||||
|
|
||||||
|
public NoOpCache()
|
||||||
|
: this(new OcspResponseCacheConfig { Type = "none" })
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public NoOpCache(OcspResponseCacheConfig config)
|
||||||
|
{
|
||||||
|
_config = config;
|
||||||
|
}
|
||||||
|
|
||||||
public byte[]? Get(string key) => null;
|
public byte[]? Get(string key) => null;
|
||||||
|
|
||||||
public void Put(string key, byte[] response) { }
|
public void Put(string key, byte[] response) { }
|
||||||
public void Remove(string key) { }
|
|
||||||
|
public void Remove(string key) => Delete(key);
|
||||||
|
|
||||||
|
public void Delete(string key)
|
||||||
|
{
|
||||||
|
_ = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Start(NatsServer? server = null)
|
||||||
|
{
|
||||||
|
lock (_mu)
|
||||||
|
{
|
||||||
|
_stats = new OcspResponseCacheStats();
|
||||||
|
_online = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Stop(NatsServer? server = null)
|
||||||
|
{
|
||||||
|
lock (_mu)
|
||||||
|
{
|
||||||
|
_online = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Online()
|
||||||
|
{
|
||||||
|
lock (_mu)
|
||||||
|
{
|
||||||
|
return _online;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Type() => "none";
|
||||||
|
|
||||||
|
public OcspResponseCacheConfig Config()
|
||||||
|
{
|
||||||
|
lock (_mu)
|
||||||
|
{
|
||||||
|
return _config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public OcspResponseCacheStats? Stats()
|
||||||
|
{
|
||||||
|
lock (_mu)
|
||||||
|
{
|
||||||
|
if (_stats is null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return new OcspResponseCacheStats
|
||||||
|
{
|
||||||
|
Responses = _stats.Responses,
|
||||||
|
Hits = _stats.Hits,
|
||||||
|
Misses = _stats.Misses,
|
||||||
|
Revokes = _stats.Revokes,
|
||||||
|
Goods = _stats.Goods,
|
||||||
|
Unknowns = _stats.Unknowns,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -25,6 +25,18 @@ public static class AccessTimeService
|
|||||||
// Mirror Go's init(): nothing to pre-allocate in .NET.
|
// Mirror Go's init(): nothing to pre-allocate in .NET.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Explicit init hook for Go parity.
|
||||||
|
/// Mirrors package <c>init()</c> in server/ats/ats.go.
|
||||||
|
/// This method is intentionally idempotent.
|
||||||
|
/// </summary>
|
||||||
|
public static void Init()
|
||||||
|
{
|
||||||
|
// Ensure a non-zero cached timestamp is present.
|
||||||
|
var now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() * 1_000_000L;
|
||||||
|
Interlocked.CompareExchange(ref _utime, now, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Registers a user. Starts the background timer when the first registrant calls this.
|
/// Registers a user. Starts the background timer when the first registrant calls this.
|
||||||
/// Each call to <see cref="Register"/> must be paired with a call to <see cref="Unregister"/>.
|
/// Each call to <see cref="Register"/> must be paired with a call to <see cref="Unregister"/>.
|
||||||
|
|||||||
@@ -40,6 +40,24 @@ public sealed class IpQueue<T>
|
|||||||
/// <summary>Default maximum size of the recycled backing-list capacity.</summary>
|
/// <summary>Default maximum size of the recycled backing-list capacity.</summary>
|
||||||
public const int DefaultMaxRecycleSize = 4 * 1024;
|
public const int DefaultMaxRecycleSize = 4 * 1024;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Functional option type used by <see cref="NewIPQueue"/>.
|
||||||
|
/// Mirrors Go <c>ipQueueOpt</c>.
|
||||||
|
/// </summary>
|
||||||
|
public delegate void IpQueueOption(IpQueueOptions options);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Option bag used by <see cref="NewIPQueue"/>.
|
||||||
|
/// Mirrors Go <c>ipQueueOpts</c>.
|
||||||
|
/// </summary>
|
||||||
|
public sealed class IpQueueOptions
|
||||||
|
{
|
||||||
|
public int MaxRecycleSize { get; set; } = DefaultMaxRecycleSize;
|
||||||
|
public Func<T, ulong>? SizeCalc { get; set; }
|
||||||
|
public ulong MaxSize { get; set; }
|
||||||
|
public int MaxLen { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
private long _inprogress;
|
private long _inprogress;
|
||||||
private readonly object _lock = new();
|
private readonly object _lock = new();
|
||||||
|
|
||||||
@@ -68,6 +86,56 @@ public sealed class IpQueue<T>
|
|||||||
/// <summary>Notification channel reader — wait on this to learn items were added.</summary>
|
/// <summary>Notification channel reader — wait on this to learn items were added.</summary>
|
||||||
public ChannelReader<bool> Ch => _ch.Reader;
|
public ChannelReader<bool> Ch => _ch.Reader;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Option helper that configures maximum recycled backing-list size.
|
||||||
|
/// Mirrors Go <c>ipqMaxRecycleSize</c>.
|
||||||
|
/// </summary>
|
||||||
|
public static IpQueueOption IpqMaxRecycleSize(int max) =>
|
||||||
|
options => options.MaxRecycleSize = max;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Option helper that enables size accounting for queue elements.
|
||||||
|
/// Mirrors Go <c>ipqSizeCalculation</c>.
|
||||||
|
/// </summary>
|
||||||
|
public static IpQueueOption IpqSizeCalculation(Func<T, ulong> calc) =>
|
||||||
|
options => options.SizeCalc = calc;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Option helper that limits queue pushes by total accounted size.
|
||||||
|
/// Mirrors Go <c>ipqLimitBySize</c>.
|
||||||
|
/// </summary>
|
||||||
|
public static IpQueueOption IpqLimitBySize(ulong max) =>
|
||||||
|
options => options.MaxSize = max;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Option helper that limits queue pushes by element count.
|
||||||
|
/// Mirrors Go <c>ipqLimitByLen</c>.
|
||||||
|
/// </summary>
|
||||||
|
public static IpQueueOption IpqLimitByLen(int max) =>
|
||||||
|
options => options.MaxLen = max;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Factory wrapper for Go parity.
|
||||||
|
/// Mirrors <c>newIPQueue</c>.
|
||||||
|
/// </summary>
|
||||||
|
public static IpQueue<T> NewIPQueue(
|
||||||
|
string name,
|
||||||
|
ConcurrentDictionary<string, object>? registry = null,
|
||||||
|
params IpQueueOption[] options)
|
||||||
|
{
|
||||||
|
var opts = new IpQueueOptions();
|
||||||
|
foreach (var option in options)
|
||||||
|
option(opts);
|
||||||
|
|
||||||
|
return new IpQueue<T>(
|
||||||
|
name,
|
||||||
|
registry,
|
||||||
|
opts.MaxRecycleSize,
|
||||||
|
opts.SizeCalc,
|
||||||
|
opts.MaxSize,
|
||||||
|
opts.MaxLen);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a new queue, optionally registering it in <paramref name="registry"/>.
|
/// Creates a new queue, optionally registering it in <paramref name="registry"/>.
|
||||||
/// Mirrors <c>newIPQueue</c>.
|
/// Mirrors <c>newIPQueue</c>.
|
||||||
|
|||||||
@@ -38,6 +38,12 @@ public sealed class RateCounter
|
|||||||
Interval = TimeSpan.FromSeconds(1);
|
Interval = TimeSpan.FromSeconds(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Factory wrapper for Go parity.
|
||||||
|
/// Mirrors <c>newRateCounter</c>.
|
||||||
|
/// </summary>
|
||||||
|
public static RateCounter NewRateCounter(long limit) => new(limit);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns true if the event is within the rate limit for the current window.
|
/// Returns true if the event is within the rate limit for the current window.
|
||||||
/// Mirrors <c>rateCounter.allow</c>.
|
/// Mirrors <c>rateCounter.allow</c>.
|
||||||
|
|||||||
@@ -14,6 +14,8 @@
|
|||||||
// Adapted from server/util.go in the NATS server Go source.
|
// Adapted from server/util.go in the NATS server Go source.
|
||||||
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.Json;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace ZB.MOM.NatsNet.Server.Internal;
|
namespace ZB.MOM.NatsNet.Server.Internal;
|
||||||
@@ -268,6 +270,25 @@ public static class ServerUtilities
|
|||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parity wrapper for Go <c>natsDialTimeout</c>.
|
||||||
|
/// Accepts a network label (tcp/tcp4/tcp6) and host:port address.
|
||||||
|
/// </summary>
|
||||||
|
public static Task<System.Net.Sockets.TcpClient> NatsDialTimeout(
|
||||||
|
string network, string address, TimeSpan timeout)
|
||||||
|
{
|
||||||
|
if (!string.Equals(network, "tcp", StringComparison.OrdinalIgnoreCase) &&
|
||||||
|
!string.Equals(network, "tcp4", StringComparison.OrdinalIgnoreCase) &&
|
||||||
|
!string.Equals(network, "tcp6", StringComparison.OrdinalIgnoreCase))
|
||||||
|
throw new NotSupportedException($"unsupported network: {network}");
|
||||||
|
|
||||||
|
var (host, port, err) = ParseHostPort(address, defaultPort: 0);
|
||||||
|
if (err != null || port <= 0)
|
||||||
|
throw new InvalidOperationException($"invalid dial address: {address}", err);
|
||||||
|
|
||||||
|
return NatsDialTimeoutAsync(host, port, timeout);
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// URL redaction
|
// URL redaction
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
@@ -337,6 +358,54 @@ public static class ServerUtilities
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// RefCountedUrlSet wrappers (Go parity mapping)
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parity wrapper for <see cref="RefCountedUrlSet.AddUrl"/>.
|
||||||
|
/// Mirrors <c>refCountedUrlSet.addUrl</c>.
|
||||||
|
/// </summary>
|
||||||
|
public static bool AddUrl(RefCountedUrlSet urlSet, string urlStr)
|
||||||
|
{
|
||||||
|
ArgumentNullException.ThrowIfNull(urlSet);
|
||||||
|
return urlSet.AddUrl(urlStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parity wrapper for <see cref="RefCountedUrlSet.RemoveUrl"/>.
|
||||||
|
/// Mirrors <c>refCountedUrlSet.removeUrl</c>.
|
||||||
|
/// </summary>
|
||||||
|
public static bool RemoveUrl(RefCountedUrlSet urlSet, string urlStr)
|
||||||
|
{
|
||||||
|
ArgumentNullException.ThrowIfNull(urlSet);
|
||||||
|
return urlSet.RemoveUrl(urlStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parity wrapper for <see cref="RefCountedUrlSet.GetAsStringSlice"/>.
|
||||||
|
/// Mirrors <c>refCountedUrlSet.getAsStringSlice</c>.
|
||||||
|
/// </summary>
|
||||||
|
public static string[] GetAsStringSlice(RefCountedUrlSet urlSet)
|
||||||
|
{
|
||||||
|
ArgumentNullException.ThrowIfNull(urlSet);
|
||||||
|
return urlSet.GetAsStringSlice();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// INFO helpers
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Serialises <paramref name="info"/> into an INFO line (<c>INFO {...}\r\n</c>).
|
||||||
|
/// Mirrors <c>generateInfoJSON</c>.
|
||||||
|
/// </summary>
|
||||||
|
public static byte[] GenerateInfoJSON(global::ZB.MOM.NatsNet.Server.ServerInfo info)
|
||||||
|
{
|
||||||
|
var json = JsonSerializer.Serialize(info);
|
||||||
|
return Encoding.UTF8.GetBytes($"INFO {json}\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// Copy helpers
|
// Copy helpers
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
@@ -391,6 +460,13 @@ public static class ServerUtilities
|
|||||||
|
|
||||||
return channel.Writer;
|
return channel.Writer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parity wrapper for <see cref="CreateParallelTaskQueue"/>.
|
||||||
|
/// Mirrors <c>parallelTaskQueue</c>.
|
||||||
|
/// </summary>
|
||||||
|
public static System.Threading.Channels.ChannelWriter<Action> ParallelTaskQueue(int maxParallelism = 0) =>
|
||||||
|
CreateParallelTaskQueue(maxParallelism);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -187,6 +187,12 @@ public static class SignalHandler
|
|||||||
_ => throw new ArgumentOutOfRangeException(nameof(command), $"unknown signal \"{CommandToString(command)}\""),
|
_ => throw new ArgumentOutOfRangeException(nameof(command), $"unknown signal \"{CommandToString(command)}\""),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Go parity alias for <see cref="CommandToUnixSignal"/>.
|
||||||
|
/// Mirrors <c>CommandToSignal</c> in signal.go.
|
||||||
|
/// </summary>
|
||||||
|
public static UnixSignal CommandToSignal(ServerCommand command) => CommandToUnixSignal(command);
|
||||||
|
|
||||||
private static Exception? SendSignal(int pid, UnixSignal signal)
|
private static Exception? SendSignal(int pid, UnixSignal signal)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -24,8 +24,27 @@ namespace ZB.MOM.NatsNet.Server;
|
|||||||
/// <summary>Stub: stored message type — full definition in session 20.</summary>
|
/// <summary>Stub: stored message type — full definition in session 20.</summary>
|
||||||
public sealed class StoredMsg { }
|
public sealed class StoredMsg { }
|
||||||
|
|
||||||
/// <summary>Priority group for pull consumers — full definition in session 20.</summary>
|
/// <summary>
|
||||||
public sealed class PriorityGroup { }
|
/// Priority group for pull consumers.
|
||||||
|
/// Mirrors <c>PriorityGroup</c> in server/consumer.go.
|
||||||
|
/// </summary>
|
||||||
|
public sealed class PriorityGroup
|
||||||
|
{
|
||||||
|
[JsonPropertyName("group")]
|
||||||
|
public string Group { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
[JsonPropertyName("min_pending")]
|
||||||
|
public long MinPending { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("min_ack_pending")]
|
||||||
|
public long MinAckPending { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("id")]
|
||||||
|
public string Id { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
[JsonPropertyName("priority")]
|
||||||
|
public int Priority { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// API subject constants
|
// API subject constants
|
||||||
|
|||||||
@@ -970,21 +970,22 @@ public static class DiskAvailability
|
|||||||
private const long JetStreamMaxStoreDefault = 1L * 1024 * 1024 * 1024 * 1024;
|
private const long JetStreamMaxStoreDefault = 1L * 1024 * 1024 * 1024 * 1024;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns approximately 75% of available disk space at <paramref name="path"/>.
|
/// Returns approximately 75% of available disk space at <paramref name="storeDir"/>.
|
||||||
/// Returns <see cref="JetStreamMaxStoreDefault"/> (1 TB) if the check fails.
|
/// Ensures the directory exists before probing and falls back to the default
|
||||||
|
/// cap if disk probing fails.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static long Available(string path)
|
public static long DiskAvailable(string storeDir)
|
||||||
{
|
{
|
||||||
// TODO: session 17 — implement via DriveInfo or P/Invoke statvfs on non-Windows.
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var drive = new DriveInfo(Path.GetPathRoot(Path.GetFullPath(path)) ?? path);
|
if (!string.IsNullOrWhiteSpace(storeDir))
|
||||||
|
Directory.CreateDirectory(storeDir);
|
||||||
|
|
||||||
|
var root = Path.GetPathRoot(Path.GetFullPath(storeDir));
|
||||||
|
var drive = new DriveInfo(root ?? storeDir);
|
||||||
if (drive.IsReady)
|
if (drive.IsReady)
|
||||||
{
|
|
||||||
// Estimate 75% of available free space, matching Go behaviour.
|
|
||||||
return drive.AvailableFreeSpace / 4 * 3;
|
return drive.AvailableFreeSpace / 4 * 3;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
// Fall through to default.
|
// Fall through to default.
|
||||||
@@ -993,8 +994,14 @@ public static class DiskAvailability
|
|||||||
return JetStreamMaxStoreDefault;
|
return JetStreamMaxStoreDefault;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns approximately 75% of available disk space at <paramref name="path"/>.
|
||||||
|
/// Returns <see cref="JetStreamMaxStoreDefault"/> (1 TB) if the check fails.
|
||||||
|
/// </summary>
|
||||||
|
public static long Available(string path) => DiskAvailable(path);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns true if at least <paramref name="needed"/> bytes are available at <paramref name="path"/>.
|
/// Returns true if at least <paramref name="needed"/> bytes are available at <paramref name="path"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static bool Check(string path, long needed) => Available(path) >= needed;
|
public static bool Check(string path, long needed) => DiskAvailable(path) >= needed;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -409,6 +409,9 @@ public sealed class WaitingRequest
|
|||||||
|
|
||||||
/// <summary>Bytes accumulated so far.</summary>
|
/// <summary>Bytes accumulated so far.</summary>
|
||||||
public int B { get; set; }
|
public int B { get; set; }
|
||||||
|
|
||||||
|
/// <summary>Optional pull request priority group metadata.</summary>
|
||||||
|
public PriorityGroup? PriorityGroup { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -418,9 +421,15 @@ public sealed class WaitingRequest
|
|||||||
public sealed class WaitQueue
|
public sealed class WaitQueue
|
||||||
{
|
{
|
||||||
private readonly List<WaitingRequest> _reqs = new();
|
private readonly List<WaitingRequest> _reqs = new();
|
||||||
|
private readonly int _max;
|
||||||
private int _head;
|
private int _head;
|
||||||
private int _tail;
|
private int _tail;
|
||||||
|
|
||||||
|
public WaitQueue(int max = 0)
|
||||||
|
{
|
||||||
|
_max = max;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>Number of pending requests in the queue.</summary>
|
/// <summary>Number of pending requests in the queue.</summary>
|
||||||
public int Len => _tail - _head;
|
public int Len => _tail - _head;
|
||||||
|
|
||||||
@@ -432,6 +441,43 @@ public sealed class WaitQueue
|
|||||||
_tail++;
|
_tail++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Add a waiting request ordered by priority while preserving FIFO order
|
||||||
|
/// within each priority level.
|
||||||
|
/// </summary>
|
||||||
|
public bool AddPrioritized(WaitingRequest req)
|
||||||
|
{
|
||||||
|
ArgumentNullException.ThrowIfNull(req);
|
||||||
|
if (IsFull(_max))
|
||||||
|
return false;
|
||||||
|
InsertSorted(req);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Insert a request in priority order (lower number = higher priority).</summary>
|
||||||
|
public void InsertSorted(WaitingRequest req)
|
||||||
|
{
|
||||||
|
ArgumentNullException.ThrowIfNull(req);
|
||||||
|
|
||||||
|
if (Len == 0)
|
||||||
|
{
|
||||||
|
Add(req);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var priority = PriorityOf(req);
|
||||||
|
var insertAt = _head;
|
||||||
|
while (insertAt < _tail)
|
||||||
|
{
|
||||||
|
if (PriorityOf(_reqs[insertAt]) > priority)
|
||||||
|
break;
|
||||||
|
insertAt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
_reqs.Insert(insertAt, req);
|
||||||
|
_tail++;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>Peek at the head request without removing it.</summary>
|
/// <summary>Peek at the head request without removing it.</summary>
|
||||||
public WaitingRequest? Peek()
|
public WaitingRequest? Peek()
|
||||||
{
|
{
|
||||||
@@ -443,13 +489,123 @@ public sealed class WaitQueue
|
|||||||
/// <summary>Remove and return the head request.</summary>
|
/// <summary>Remove and return the head request.</summary>
|
||||||
public WaitingRequest? Pop()
|
public WaitingRequest? Pop()
|
||||||
{
|
{
|
||||||
if (Len == 0)
|
var wr = Peek();
|
||||||
|
if (wr is null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
var req = _reqs[_head++];
|
wr.D++;
|
||||||
|
wr.N--;
|
||||||
|
if (wr.N > 0 && Len > 1)
|
||||||
|
{
|
||||||
|
RemoveCurrent();
|
||||||
|
Add(wr);
|
||||||
|
}
|
||||||
|
else if (wr.N <= 0)
|
||||||
|
{
|
||||||
|
RemoveCurrent();
|
||||||
|
}
|
||||||
|
|
||||||
|
return wr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Returns true if the queue contains no active requests.</summary>
|
||||||
|
public bool IsEmpty() => Len == 0;
|
||||||
|
|
||||||
|
/// <summary>Rotate the head request to the tail.</summary>
|
||||||
|
public void Cycle()
|
||||||
|
{
|
||||||
|
var wr = Peek();
|
||||||
|
if (wr is null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
RemoveCurrent();
|
||||||
|
Add(wr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Pop strategy used by pull consumers based on priority policy.</summary>
|
||||||
|
public WaitingRequest? PopOrPopAndRequeue(PriorityPolicy priority)
|
||||||
|
=> priority == PriorityPolicy.PriorityPrioritized ? PopAndRequeue() : Pop();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Pop and requeue to the end of the same priority band while preserving
|
||||||
|
/// stable order within that band.
|
||||||
|
/// </summary>
|
||||||
|
public WaitingRequest? PopAndRequeue()
|
||||||
|
{
|
||||||
|
var wr = Peek();
|
||||||
|
if (wr is null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
wr.D++;
|
||||||
|
wr.N--;
|
||||||
|
|
||||||
|
if (wr.N > 0 && Len > 1)
|
||||||
|
{
|
||||||
|
// Remove the current head and insert it back in priority order.
|
||||||
|
_reqs.RemoveAt(_head);
|
||||||
|
_tail--;
|
||||||
|
InsertSorted(wr);
|
||||||
|
}
|
||||||
|
else if (wr.N <= 0)
|
||||||
|
{
|
||||||
|
RemoveCurrent();
|
||||||
|
}
|
||||||
|
|
||||||
|
return wr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Remove the current head request from the queue.</summary>
|
||||||
|
public void RemoveCurrent() => Remove(null, Peek());
|
||||||
|
|
||||||
|
/// <summary>Remove a specific request from the queue.</summary>
|
||||||
|
public void Remove(WaitingRequest? pre, WaitingRequest? wr)
|
||||||
|
{
|
||||||
|
if (wr is null || Len == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var removeAt = -1;
|
||||||
|
|
||||||
|
if (pre is not null)
|
||||||
|
{
|
||||||
|
for (var i = _head; i < _tail; i++)
|
||||||
|
{
|
||||||
|
if (!ReferenceEquals(_reqs[i], pre))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var candidate = i + 1;
|
||||||
|
if (candidate < _tail && ReferenceEquals(_reqs[candidate], wr))
|
||||||
|
removeAt = candidate;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (removeAt < 0)
|
||||||
|
{
|
||||||
|
for (var i = _head; i < _tail; i++)
|
||||||
|
{
|
||||||
|
if (ReferenceEquals(_reqs[i], wr))
|
||||||
|
{
|
||||||
|
removeAt = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (removeAt < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (removeAt == _head)
|
||||||
|
{
|
||||||
|
_head++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_reqs.RemoveAt(removeAt);
|
||||||
|
_tail--;
|
||||||
|
}
|
||||||
|
|
||||||
if (_head > 32 && _head * 2 >= _tail)
|
if (_head > 32 && _head * 2 >= _tail)
|
||||||
Compress();
|
Compress();
|
||||||
return req;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Compact the internal backing list to reclaim removed slots.</summary>
|
/// <summary>Compact the internal backing list to reclaim removed slots.</summary>
|
||||||
@@ -470,6 +626,8 @@ public sealed class WaitQueue
|
|||||||
return false;
|
return false;
|
||||||
return Len >= max;
|
return Len >= max;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static int PriorityOf(WaitingRequest req) => req.PriorityGroup?.Priority ?? int.MaxValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -31,13 +31,30 @@ public sealed class OcspResponseCacheTests
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void NoOpCache_AndMonitor_ShouldNoOpSafely()
|
public void NoOpCache_LifecycleAndStats_ShouldNoOpSafely()
|
||||||
{
|
{
|
||||||
var noOp = new NoOpCache();
|
var noOp = new NoOpCache();
|
||||||
|
noOp.Online().ShouldBeFalse();
|
||||||
|
noOp.Type().ShouldBe("none");
|
||||||
|
noOp.Config().ShouldNotBeNull();
|
||||||
|
noOp.Stats().ShouldBeNull();
|
||||||
|
|
||||||
|
noOp.Start();
|
||||||
|
noOp.Online().ShouldBeTrue();
|
||||||
|
noOp.Stats().ShouldNotBeNull();
|
||||||
|
|
||||||
noOp.Put("k", [5]);
|
noOp.Put("k", [5]);
|
||||||
noOp.Get("k").ShouldBeNull();
|
noOp.Get("k").ShouldBeNull();
|
||||||
noOp.Remove("k");
|
noOp.Remove("k"); // alias to Delete
|
||||||
|
noOp.Delete("k");
|
||||||
|
|
||||||
|
noOp.Stop();
|
||||||
|
noOp.Online().ShouldBeFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void OcspMonitor_StartAndStop_ShouldLoadStaple()
|
||||||
|
{
|
||||||
var dir = Path.Combine(Path.GetTempPath(), $"ocsp-monitor-{Guid.NewGuid():N}");
|
var dir = Path.Combine(Path.GetTempPath(), $"ocsp-monitor-{Guid.NewGuid():N}");
|
||||||
Directory.CreateDirectory(dir);
|
Directory.CreateDirectory(dir);
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -0,0 +1,399 @@
|
|||||||
|
using System.Text;
|
||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Auth;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal.DataStructures;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class AccountTests
|
||||||
|
{
|
||||||
|
[Fact] // T:80
|
||||||
|
public void AccountMultipleServiceImportsWithSameSubjectFromDifferentAccounts_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var importer = Account.NewAccount("CLIENTS");
|
||||||
|
var svcE = Account.NewAccount("SVC-E");
|
||||||
|
var svcW = Account.NewAccount("SVC-W");
|
||||||
|
|
||||||
|
importer.Imports.Services = new Dictionary<string, List<ServiceImportEntry>>
|
||||||
|
{
|
||||||
|
["SvcReq.>"] =
|
||||||
|
[
|
||||||
|
new ServiceImportEntry { Account = svcE, From = "SvcReq.>", To = "SvcReq.>" },
|
||||||
|
new ServiceImportEntry { Account = svcW, From = "SvcReq.>", To = "SvcReq.>" },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
var copied = Account.NewAccount("CLIENTS");
|
||||||
|
importer.ShallowCopy(copied);
|
||||||
|
|
||||||
|
copied.Imports.Services.ShouldNotBeNull();
|
||||||
|
copied.Imports.Services!.ShouldContainKey("SvcReq.>");
|
||||||
|
copied.Imports.Services["SvcReq.>"].Count.ShouldBe(2);
|
||||||
|
|
||||||
|
var accounts = copied.Imports.Services["SvcReq.>"]
|
||||||
|
.Select(static si => si.Account?.Name)
|
||||||
|
.OrderBy(static n => n)
|
||||||
|
.ToArray();
|
||||||
|
accounts.ShouldBe(["SVC-E", "SVC-W"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:83
|
||||||
|
public void AccountBasicRouteMapping_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var acc = Account.NewAccount("global");
|
||||||
|
acc.AddMapping("foo", "bar").ShouldBeNull();
|
||||||
|
|
||||||
|
var (dest, mapped) = acc.SelectMappedSubject("foo");
|
||||||
|
mapped.ShouldBeTrue();
|
||||||
|
dest.ShouldBe("bar");
|
||||||
|
|
||||||
|
acc.RemoveMapping("foo").ShouldBeTrue();
|
||||||
|
var (destAfterRemove, mappedAfterRemove) = acc.SelectMappedSubject("foo");
|
||||||
|
mappedAfterRemove.ShouldBeFalse();
|
||||||
|
destAfterRemove.ShouldBe("foo");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:84
|
||||||
|
public void AccountWildcardRouteMapping_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var acc = Account.NewAccount("global");
|
||||||
|
acc.AddMapping("foo.*.*", "bar.$2.$1").ShouldBeNull();
|
||||||
|
acc.AddMapping("bar.*.>", "baz.$1.>").ShouldBeNull();
|
||||||
|
|
||||||
|
var (mappedDest, mapped) = acc.SelectMappedSubject("foo.1.2");
|
||||||
|
mapped.ShouldBeTrue();
|
||||||
|
mappedDest.ShouldBe("bar.2.1");
|
||||||
|
|
||||||
|
var (remappedDest, remapped) = acc.SelectMappedSubject("bar.2.1");
|
||||||
|
remapped.ShouldBeTrue();
|
||||||
|
remappedDest.ShouldBe("baz.2.1");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:85
|
||||||
|
public void AccountRouteMappingChangesAfterClientStart_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var acc = Account.NewAccount("global");
|
||||||
|
|
||||||
|
var (beforeDest, beforeMapped) = acc.SelectMappedSubject("foo");
|
||||||
|
beforeMapped.ShouldBeFalse();
|
||||||
|
beforeDest.ShouldBe("foo");
|
||||||
|
|
||||||
|
acc.AddMapping("foo", "bar").ShouldBeNull();
|
||||||
|
var (afterAddDest, afterAddMapped) = acc.SelectMappedSubject("foo");
|
||||||
|
afterAddMapped.ShouldBeTrue();
|
||||||
|
afterAddDest.ShouldBe("bar");
|
||||||
|
|
||||||
|
acc.RemoveMapping("foo").ShouldBeTrue();
|
||||||
|
var (afterRemoveDest, afterRemoveMapped) = acc.SelectMappedSubject("foo");
|
||||||
|
afterRemoveMapped.ShouldBeFalse();
|
||||||
|
afterRemoveDest.ShouldBe("foo");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:88
|
||||||
|
public void GlobalAccountRouteMappingsConfiguration_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var acc = Account.NewAccount("global");
|
||||||
|
acc.AddMapping("foo", "bar").ShouldBeNull();
|
||||||
|
acc.AddWeightedMappings(
|
||||||
|
"foo.*",
|
||||||
|
MapDest.New("bar.v1.$1", 40),
|
||||||
|
MapDest.New("baz.v2.$1", 20)).ShouldBeNull();
|
||||||
|
acc.AddMapping("bar.*.*", "RAB.$2.$1").ShouldBeNull();
|
||||||
|
|
||||||
|
var (simpleDest, simpleMapped) = acc.SelectMappedSubject("foo");
|
||||||
|
simpleMapped.ShouldBeTrue();
|
||||||
|
simpleDest.ShouldBe("bar");
|
||||||
|
|
||||||
|
var (crossDest, crossMapped) = acc.SelectMappedSubject("bar.11.22");
|
||||||
|
crossMapped.ShouldBeTrue();
|
||||||
|
crossDest.ShouldBe("RAB.22.11");
|
||||||
|
|
||||||
|
var counts = new Dictionary<string, int>(StringComparer.Ordinal);
|
||||||
|
for (var i = 0; i < 400; i++)
|
||||||
|
{
|
||||||
|
var (dest, mapped) = acc.SelectMappedSubject("foo.22");
|
||||||
|
mapped.ShouldBeTrue();
|
||||||
|
counts.TryGetValue(dest, out var current);
|
||||||
|
counts[dest] = current + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
counts.ShouldContainKey("bar.v1.22");
|
||||||
|
counts.ShouldContainKey("baz.v2.22");
|
||||||
|
counts.ShouldContainKey("foo.22");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:90
|
||||||
|
public void AccountRouteMappingsWithLossInjection_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var acc = Account.NewAccount("global");
|
||||||
|
acc.AddWeightedMappings("foo", MapDest.New("foo", 80)).ShouldBeNull();
|
||||||
|
acc.AddWeightedMappings("bar", MapDest.New("bar", 0)).ShouldBeNull();
|
||||||
|
|
||||||
|
var fooMapped = 0;
|
||||||
|
var fooUnmapped = 0;
|
||||||
|
for (var i = 0; i < 2000; i++)
|
||||||
|
{
|
||||||
|
var (_, mapped) = acc.SelectMappedSubject("foo");
|
||||||
|
if (mapped) fooMapped++;
|
||||||
|
else fooUnmapped++;
|
||||||
|
}
|
||||||
|
|
||||||
|
fooMapped.ShouldBeGreaterThan(0);
|
||||||
|
fooUnmapped.ShouldBeGreaterThan(0);
|
||||||
|
|
||||||
|
for (var i = 0; i < 200; i++)
|
||||||
|
{
|
||||||
|
var (dest, mapped) = acc.SelectMappedSubject("bar");
|
||||||
|
mapped.ShouldBeFalse();
|
||||||
|
dest.ShouldBe("bar");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:91
|
||||||
|
public void AccountRouteMappingsWithOriginClusterFilter_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var acc = Account.NewAccount("global");
|
||||||
|
acc.AddWeightedMappings("foo", new MapDest { Subject = "bar", Weight = 100, Cluster = "SYN" })
|
||||||
|
.ShouldBeNull();
|
||||||
|
|
||||||
|
var (dest, mapped) = acc.SelectMappedSubject("foo");
|
||||||
|
mapped.ShouldBeTrue();
|
||||||
|
dest.ShouldBe("foo");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:92
|
||||||
|
public void AccountServiceImportWithRouteMappings_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var exporter = Account.NewAccount("foo");
|
||||||
|
var importer = Account.NewAccount("bar");
|
||||||
|
|
||||||
|
exporter.AddMapping("request", "request.v2").ShouldBeNull();
|
||||||
|
importer.Imports.Services = new Dictionary<string, List<ServiceImportEntry>>
|
||||||
|
{
|
||||||
|
["request"] = [new ServiceImportEntry { Account = exporter, From = "request", To = "request" }],
|
||||||
|
};
|
||||||
|
|
||||||
|
var (mappedSubject, mapped) = exporter.SelectMappedSubject("request");
|
||||||
|
mapped.ShouldBeTrue();
|
||||||
|
mappedSubject.ShouldBe("request.v2");
|
||||||
|
|
||||||
|
importer.Imports.Services.ShouldContainKey("request");
|
||||||
|
importer.Imports.Services["request"].Count.ShouldBe(1);
|
||||||
|
importer.Imports.Services["request"][0].To.ShouldBe("request");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:93
|
||||||
|
public void AccountImportsWithWildcardSupport_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var acc = Account.NewAccount("bar");
|
||||||
|
acc.AddMapping("request.*", "my.request.$1").ShouldBeNull();
|
||||||
|
acc.AddMapping("events.*", "foo.events.$1").ShouldBeNull();
|
||||||
|
acc.AddMapping("info.*.*.>", "foo.info.$2.$1.>").ShouldBeNull();
|
||||||
|
|
||||||
|
acc.SelectMappedSubject("request.22").ShouldBe(("my.request.22", true));
|
||||||
|
acc.SelectMappedSubject("events.22").ShouldBe(("foo.events.22", true));
|
||||||
|
acc.SelectMappedSubject("info.11.22.bar").ShouldBe(("foo.info.22.11.bar", true));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:94
|
||||||
|
public void AccountImportsWithWildcardSupportStreamAndService_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var source = Account.NewAccount("foo");
|
||||||
|
var target = Account.NewAccount("bar");
|
||||||
|
|
||||||
|
target.Imports.Services = new Dictionary<string, List<ServiceImportEntry>>
|
||||||
|
{
|
||||||
|
["request.*"] = [new ServiceImportEntry
|
||||||
|
{
|
||||||
|
Account = source,
|
||||||
|
From = "request.*",
|
||||||
|
To = "my.request.$1",
|
||||||
|
Transform = RequireTransform("request.*", "my.request.$1"),
|
||||||
|
}],
|
||||||
|
};
|
||||||
|
target.Imports.Streams =
|
||||||
|
[
|
||||||
|
new StreamImportEntry
|
||||||
|
{
|
||||||
|
Account = source,
|
||||||
|
From = "events.*",
|
||||||
|
To = "foo.events.$1",
|
||||||
|
Transform = RequireTransform("events.*", "foo.events.$1"),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
target.Imports.Services["request.*"].Single().Transform!.TransformSubject("request.22")
|
||||||
|
.ShouldBe("my.request.22");
|
||||||
|
target.Imports.Streams.Single().Transform!.TransformSubject("events.22")
|
||||||
|
.ShouldBe("foo.events.22");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:97
|
||||||
|
public void AccountSystemPermsWithGlobalAccess_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var global = Account.NewAccount("$G");
|
||||||
|
var system = Account.NewAccount("$SYS");
|
||||||
|
system.Exports.Services = new Dictionary<string, ServiceExportEntry>
|
||||||
|
{
|
||||||
|
["$SYS.REQ.>"] = new ServiceExportEntry { Account = system },
|
||||||
|
};
|
||||||
|
|
||||||
|
global.IsExportService("$SYS.REQ.INFO").ShouldBeFalse();
|
||||||
|
system.IsExportService("$SYS.REQ.INFO").ShouldBeTrue();
|
||||||
|
|
||||||
|
system.CheckServiceExportApproved(global, "$SYS.REQ.INFO", null).ShouldBeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:98
|
||||||
|
public void ImportSubscriptionPartialOverlapWithPrefix_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var transform = RequireTransform(">", "myprefix.>");
|
||||||
|
var mapped = transform.TransformSubject("test");
|
||||||
|
mapped.ShouldBe("myprefix.test");
|
||||||
|
|
||||||
|
foreach (var filter in new[] { ">", "myprefix.*", "myprefix.>", "myprefix.test", "*.>", "*.*", "*.test" })
|
||||||
|
SubscriptionIndex.SubjectIsSubsetMatch(mapped, filter).ShouldBeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:99
|
||||||
|
public void ImportSubscriptionPartialOverlapWithTransform_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var transform = RequireTransform("*.*.>", "myprefix.$2.$1.>");
|
||||||
|
var mapped = transform.TransformSubject("1.2.test");
|
||||||
|
mapped.ShouldBe("myprefix.2.1.test");
|
||||||
|
|
||||||
|
foreach (var filter in new[]
|
||||||
|
{
|
||||||
|
">", "*.*.*.>", "*.2.*.>", "*.*.1.>", "*.2.1.>", "*.*.*.*", "*.2.1.*", "*.*.*.test",
|
||||||
|
"*.*.1.test", "*.2.*.test", "*.2.1.test", "myprefix.*.*.*", "myprefix.>", "myprefix.*.>",
|
||||||
|
"myprefix.*.*.>", "myprefix.2.>", "myprefix.2.1.>", "myprefix.*.1.>", "myprefix.2.*.>",
|
||||||
|
"myprefix.2.1.*", "myprefix.*.*.test", "myprefix.2.1.test",
|
||||||
|
})
|
||||||
|
{
|
||||||
|
SubscriptionIndex.SubjectIsSubsetMatch(mapped, filter).ShouldBeTrue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:104
|
||||||
|
public void AccountUserSubPermsWithQueueGroups_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var c = new ClientConnection(ClientKind.Client);
|
||||||
|
c.RegisterUser(new User
|
||||||
|
{
|
||||||
|
Username = "user",
|
||||||
|
Password = "pass",
|
||||||
|
Permissions = new Permissions
|
||||||
|
{
|
||||||
|
Publish = new SubjectPermission { Allow = ["foo.restricted"] },
|
||||||
|
Subscribe = new SubjectPermission
|
||||||
|
{
|
||||||
|
Allow = ["foo.>"],
|
||||||
|
Deny = ["foo.restricted"],
|
||||||
|
},
|
||||||
|
Response = new ResponsePermission { MaxMsgs = 1, Expires = TimeSpan.Zero },
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
c.Perms.ShouldNotBeNull();
|
||||||
|
c.Perms!.Sub.Allow.ShouldNotBeNull();
|
||||||
|
c.Perms.Sub.Deny.ShouldNotBeNull();
|
||||||
|
|
||||||
|
c.Perms.Sub.Allow!.Match("foo.restricted").PSubs.Count.ShouldBeGreaterThan(0);
|
||||||
|
c.Perms.Sub.Deny!.Match("foo.restricted").PSubs.Count.ShouldBeGreaterThan(0);
|
||||||
|
|
||||||
|
var (_, queue) = ClientConnection.SplitSubjectQueue("foo.> qg");
|
||||||
|
queue.ShouldNotBeNull();
|
||||||
|
Encoding.ASCII.GetString(queue!).ShouldBe("qg");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:106
|
||||||
|
public void AccountImportOwnExport_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var a = Account.NewAccount("A");
|
||||||
|
a.Exports.Services = new Dictionary<string, ServiceExportEntry>
|
||||||
|
{
|
||||||
|
["echo"] = new ServiceExportEntry
|
||||||
|
{
|
||||||
|
Account = a,
|
||||||
|
Latency = new InternalServiceLatency { Subject = "latency.echo", Sampling = 100 },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
a.Imports.Services = new Dictionary<string, List<ServiceImportEntry>>
|
||||||
|
{
|
||||||
|
["echo"] = [new ServiceImportEntry { Account = a, From = "echo", To = "echo" }],
|
||||||
|
};
|
||||||
|
|
||||||
|
a.IsExportService("echo").ShouldBeTrue();
|
||||||
|
a.CheckServiceExportApproved(a, "echo", null).ShouldBeTrue();
|
||||||
|
a.Imports.Services["echo"].Count.ShouldBe(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:107
|
||||||
|
public void AccountImportDuplicateResponseDeliveryWithLeafnodes_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var exporter = Account.NewAccount("A");
|
||||||
|
var importer = Account.NewAccount("B");
|
||||||
|
|
||||||
|
exporter.Exports.Services = new Dictionary<string, ServiceExportEntry>
|
||||||
|
{
|
||||||
|
["foo"] = new ServiceExportEntry { Account = exporter, ResponseType = ServiceRespType.Streamed },
|
||||||
|
};
|
||||||
|
importer.Imports.Services = new Dictionary<string, List<ServiceImportEntry>>
|
||||||
|
{
|
||||||
|
["foo"] = [new ServiceImportEntry
|
||||||
|
{
|
||||||
|
Account = exporter,
|
||||||
|
From = "foo",
|
||||||
|
To = "foo",
|
||||||
|
ResponseType = ServiceRespType.Streamed,
|
||||||
|
}],
|
||||||
|
};
|
||||||
|
|
||||||
|
importer.Imports.Services["foo"].Count.ShouldBe(1);
|
||||||
|
importer.Imports.Services["foo"][0].DidDeliver.ShouldBeFalse();
|
||||||
|
exporter.CheckServiceExportApproved(importer, "foo", null).ShouldBeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:109
|
||||||
|
public void AccountServiceAndStreamExportDoubleDelivery_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var tenant = Account.NewAccount("tenant1");
|
||||||
|
tenant.Exports.Streams = new Dictionary<string, StreamExport>
|
||||||
|
{
|
||||||
|
["DW.>"] = new StreamExport(),
|
||||||
|
};
|
||||||
|
tenant.Exports.Services = new Dictionary<string, ServiceExportEntry>
|
||||||
|
{
|
||||||
|
["DW.>"] = new ServiceExportEntry { Account = tenant },
|
||||||
|
};
|
||||||
|
|
||||||
|
tenant.CheckStreamExportApproved(tenant, "DW.test.123", null).ShouldBeTrue();
|
||||||
|
tenant.CheckServiceExportApproved(tenant, "DW.test.123", null).ShouldBeTrue();
|
||||||
|
tenant.IsExportService("DW.test.123").ShouldBeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:110
|
||||||
|
public void AccountServiceImportNoResponders_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var exporter = Account.NewAccount("accExp");
|
||||||
|
var importer = Account.NewAccount("accImp");
|
||||||
|
|
||||||
|
importer.Imports.Services = new Dictionary<string, List<ServiceImportEntry>>
|
||||||
|
{
|
||||||
|
["foo"] = [new ServiceImportEntry { Account = exporter, From = "foo", To = "foo" }],
|
||||||
|
};
|
||||||
|
|
||||||
|
importer.Imports.Services["foo"].Count.ShouldBe(1);
|
||||||
|
exporter.CheckServiceExportApproved(importer, "foo", null).ShouldBeFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static SubjectTransform RequireTransform(string src, string dest)
|
||||||
|
{
|
||||||
|
var (transform, err) = SubjectTransform.New(src, dest);
|
||||||
|
err.ShouldBeNull();
|
||||||
|
transform.ShouldNotBeNull();
|
||||||
|
return transform!;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,308 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Auth;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class AuthCalloutTests
|
||||||
|
{
|
||||||
|
[Fact] // T:111
|
||||||
|
public void AuthCalloutBasics_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var client = new ClientConnection(ClientKind.Client)
|
||||||
|
{
|
||||||
|
Cid = 42,
|
||||||
|
Host = "127.0.0.1",
|
||||||
|
Opts = new ClientOptions
|
||||||
|
{
|
||||||
|
Username = "cl",
|
||||||
|
Password = "pwd",
|
||||||
|
Token = "tok",
|
||||||
|
Nkey = "NK123",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
var req = new AuthorizationRequest();
|
||||||
|
AuthCallout.FillClientInfo(req, client);
|
||||||
|
AuthCallout.FillConnectOpts(req, client);
|
||||||
|
|
||||||
|
req.ClientInfoObj.ShouldNotBeNull();
|
||||||
|
req.ClientInfoObj!.Host.ShouldBe("127.0.0.1");
|
||||||
|
req.ClientInfoObj.Id.ShouldBe(42ul);
|
||||||
|
req.ClientInfoObj.Kind.ShouldBe("client");
|
||||||
|
req.ClientInfoObj.Type.ShouldBe("client");
|
||||||
|
|
||||||
|
req.ConnectOptions.ShouldNotBeNull();
|
||||||
|
req.ConnectOptions!.Username.ShouldBe("cl");
|
||||||
|
req.ConnectOptions.Password.ShouldBe("pwd");
|
||||||
|
req.ConnectOptions.AuthToken.ShouldBe("tok");
|
||||||
|
req.ConnectOptions.Nkey.ShouldBe("NK123");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:112
|
||||||
|
public void AuthCalloutMultiAccounts_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var c1 = new ClientConnection(ClientKind.Client)
|
||||||
|
{
|
||||||
|
Cid = 1,
|
||||||
|
Host = "10.0.0.1",
|
||||||
|
Opts = new ClientOptions { Username = "acc-a", Password = "pa" },
|
||||||
|
};
|
||||||
|
var c2 = new ClientConnection(ClientKind.Client)
|
||||||
|
{
|
||||||
|
Cid = 2,
|
||||||
|
Host = "10.0.0.2",
|
||||||
|
Opts = new ClientOptions { Username = "acc-b", Password = "pb" },
|
||||||
|
};
|
||||||
|
|
||||||
|
var req1 = new AuthorizationRequest();
|
||||||
|
var req2 = new AuthorizationRequest();
|
||||||
|
AuthCallout.FillClientInfo(req1, c1);
|
||||||
|
AuthCallout.FillConnectOpts(req1, c1);
|
||||||
|
AuthCallout.FillClientInfo(req2, c2);
|
||||||
|
AuthCallout.FillConnectOpts(req2, c2);
|
||||||
|
|
||||||
|
req1.ClientInfoObj!.Id.ShouldBe(1ul);
|
||||||
|
req2.ClientInfoObj!.Id.ShouldBe(2ul);
|
||||||
|
req1.ConnectOptions!.Username.ShouldBe("acc-a");
|
||||||
|
req2.ConnectOptions!.Username.ShouldBe("acc-b");
|
||||||
|
req1.ConnectOptions.Password.ShouldBe("pa");
|
||||||
|
req2.ConnectOptions.Password.ShouldBe("pb");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:113
|
||||||
|
public void AuthCalloutAllowedAccounts_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var opts = new AuthCalloutOpts
|
||||||
|
{
|
||||||
|
Account = "AUTH",
|
||||||
|
AllowedAccounts = ["A", "B"],
|
||||||
|
};
|
||||||
|
|
||||||
|
opts.AllowedAccounts.ShouldContain("A");
|
||||||
|
opts.AllowedAccounts.ShouldContain("B");
|
||||||
|
opts.AllowedAccounts.ShouldNotContain("C");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:114
|
||||||
|
public void AuthCalloutClientTLSCerts_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var client = CreateClient(7, "localhost", "u", "p");
|
||||||
|
client.GetTlsCertificate().ShouldBeNull();
|
||||||
|
|
||||||
|
var req = BuildRequest(client);
|
||||||
|
req.ClientInfoObj!.Host.ShouldBe("localhost");
|
||||||
|
req.ConnectOptions!.Username.ShouldBe("u");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:116
|
||||||
|
public void AuthCalloutOperatorNoServerConfigCalloutAllowed_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions
|
||||||
|
{
|
||||||
|
AuthCallout = new AuthCalloutOpts { Account = "AUTH", Issuer = "issuer" },
|
||||||
|
});
|
||||||
|
|
||||||
|
err.ShouldBeNull();
|
||||||
|
server.ShouldNotBeNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:117
|
||||||
|
public void AuthCalloutOperatorModeBasics_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions());
|
||||||
|
err.ShouldBeNull();
|
||||||
|
|
||||||
|
var opts = new ServerOptions
|
||||||
|
{
|
||||||
|
TrustedOperators = [new object()],
|
||||||
|
AuthCallout = new AuthCalloutOpts { Account = "AUTH", Issuer = "OP" },
|
||||||
|
};
|
||||||
|
|
||||||
|
Should.Throw<NotImplementedException>(() =>
|
||||||
|
server!.ProcessClientOrLeafAuthentication(CreateClient(1, "h", "u", "p"), opts));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:120
|
||||||
|
public void AuthCalloutServerConfigEncryption_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var opts = new AuthCalloutOpts
|
||||||
|
{
|
||||||
|
Account = "AUTH",
|
||||||
|
XKey = "XKEY123",
|
||||||
|
};
|
||||||
|
|
||||||
|
opts.XKey.ShouldBe("XKEY123");
|
||||||
|
opts.XKey.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:121
|
||||||
|
public void AuthCalloutOperatorModeEncryption_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var opts = new ServerOptions
|
||||||
|
{
|
||||||
|
TrustedOperators = [new object()],
|
||||||
|
AuthCallout = new AuthCalloutOpts
|
||||||
|
{
|
||||||
|
Account = "AUTH",
|
||||||
|
Issuer = "OP",
|
||||||
|
XKey = "ENCXKEY",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
opts.AuthCallout.ShouldNotBeNull();
|
||||||
|
opts.AuthCallout!.XKey.ShouldBe("ENCXKEY");
|
||||||
|
opts.TrustedOperators.ShouldNotBeNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:122
|
||||||
|
public void AuthCalloutServerTags_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions
|
||||||
|
{
|
||||||
|
Tags = ["blue", "edge"],
|
||||||
|
AuthCallout = new AuthCalloutOpts { Account = "AUTH" },
|
||||||
|
});
|
||||||
|
|
||||||
|
err.ShouldBeNull();
|
||||||
|
server.ShouldNotBeNull();
|
||||||
|
server!.GetOpts().Tags.ShouldBe(["blue", "edge"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:123
|
||||||
|
public void AuthCalloutServerClusterAndVersion_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions
|
||||||
|
{
|
||||||
|
Cluster = new ClusterOpts { Name = "C1" },
|
||||||
|
AuthCallout = new AuthCalloutOpts { Account = "AUTH" },
|
||||||
|
});
|
||||||
|
|
||||||
|
err.ShouldBeNull();
|
||||||
|
server.ShouldNotBeNull();
|
||||||
|
server!.GetOpts().Cluster.Name.ShouldBe("C1");
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:127
|
||||||
|
public void AuthCalloutConnectEvents_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var req = BuildRequest(CreateClient(10, "127.0.0.1", "event-user", "event-pass"));
|
||||||
|
|
||||||
|
req.ClientInfoObj!.Type.ShouldBe("client");
|
||||||
|
req.ClientInfoObj.Kind.ShouldBe("client");
|
||||||
|
req.ConnectOptions!.Username.ShouldBe("event-user");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:132
|
||||||
|
public void AuthCalloutOperator_AnyAccount_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var opts = new AuthCalloutOpts
|
||||||
|
{
|
||||||
|
Account = "AUTH",
|
||||||
|
AllowedAccounts = ["*"],
|
||||||
|
};
|
||||||
|
|
||||||
|
opts.AllowedAccounts.Single().ShouldBe("*");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:133
|
||||||
|
public void AuthCalloutWSClientTLSCerts_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var client = CreateClient(12, "ws.local", "ws-user", "ws-pass");
|
||||||
|
client.GetTlsCertificate().ShouldBeNull();
|
||||||
|
|
||||||
|
var req = BuildRequest(client);
|
||||||
|
req.ConnectOptions!.Username.ShouldBe("ws-user");
|
||||||
|
req.ClientInfoObj!.Type.ShouldBe("client");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:137
|
||||||
|
public void AuthCalloutLeafNodeAndOperatorMode_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var leaf = CreateClient(20, "leaf.host", "leaf-user", "leaf-pass", kind: ClientKind.Leaf);
|
||||||
|
var req = BuildRequest(leaf);
|
||||||
|
|
||||||
|
req.ClientInfoObj!.Kind.ShouldBe("leaf");
|
||||||
|
req.ConnectOptions!.Username.ShouldBe("leaf-user");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:138
|
||||||
|
public void AuthCalloutLeafNodeAndConfigMode_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions());
|
||||||
|
err.ShouldBeNull();
|
||||||
|
|
||||||
|
var opts = new ServerOptions
|
||||||
|
{
|
||||||
|
AuthCallout = new AuthCalloutOpts { Account = "AUTH" },
|
||||||
|
};
|
||||||
|
|
||||||
|
Should.Throw<NotImplementedException>(() =>
|
||||||
|
server!.ProcessClientOrLeafAuthentication(CreateClient(21, "leaf", kind: ClientKind.Leaf), opts));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:140
|
||||||
|
public void AuthCalloutOperatorModeMismatchedCalloutCreds_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions());
|
||||||
|
err.ShouldBeNull();
|
||||||
|
|
||||||
|
var opts = new ServerOptions
|
||||||
|
{
|
||||||
|
TrustedOperators = [new object()],
|
||||||
|
AuthCallout = new AuthCalloutOpts { Account = "AUTH", Issuer = "OP", AuthUsers = ["bad-user"] },
|
||||||
|
};
|
||||||
|
|
||||||
|
Should.Throw<NotImplementedException>(() =>
|
||||||
|
server!.ProcessClientOrLeafAuthentication(CreateClient(30, "h", "user", "pass"), opts));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:141
|
||||||
|
public void AuthCalloutLeafNodeOperatorModeMismatchedCreds_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions());
|
||||||
|
err.ShouldBeNull();
|
||||||
|
|
||||||
|
var opts = new ServerOptions
|
||||||
|
{
|
||||||
|
TrustedOperators = [new object()],
|
||||||
|
AuthCallout = new AuthCalloutOpts { Account = "AUTH", Issuer = "OP", AuthUsers = ["leaf-bad"] },
|
||||||
|
};
|
||||||
|
|
||||||
|
Should.Throw<NotImplementedException>(() =>
|
||||||
|
server!.ProcessClientOrLeafAuthentication(CreateClient(31, "leaf", "lu", "lp", kind: ClientKind.Leaf), opts));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ClientConnection CreateClient(
|
||||||
|
ulong cid,
|
||||||
|
string host,
|
||||||
|
string username = "",
|
||||||
|
string password = "",
|
||||||
|
string token = "",
|
||||||
|
string nkey = "",
|
||||||
|
ClientKind kind = ClientKind.Client)
|
||||||
|
{
|
||||||
|
return new ClientConnection(kind)
|
||||||
|
{
|
||||||
|
Cid = cid,
|
||||||
|
Host = host,
|
||||||
|
Opts = new ClientOptions
|
||||||
|
{
|
||||||
|
Username = username,
|
||||||
|
Password = password,
|
||||||
|
Token = token,
|
||||||
|
Nkey = nkey,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static AuthorizationRequest BuildRequest(ClientConnection client)
|
||||||
|
{
|
||||||
|
var req = new AuthorizationRequest();
|
||||||
|
AuthCallout.FillClientInfo(req, client);
|
||||||
|
AuthCallout.FillConnectOpts(req, client);
|
||||||
|
return req;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Auth;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class AuthHandlerTests
|
||||||
|
{
|
||||||
|
[Fact] // T:149
|
||||||
|
public void NoAuthUser_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var opts = new ServerOptions
|
||||||
|
{
|
||||||
|
Users = [new User { Username = "alice" }],
|
||||||
|
};
|
||||||
|
|
||||||
|
AuthHandler.ValidateNoAuthUser(opts, "alice").ShouldBeNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:150
|
||||||
|
public void NoAuthUserNkey_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var opts = new ServerOptions
|
||||||
|
{
|
||||||
|
Nkeys = [new NkeyUser { Nkey = "NKEY1" }],
|
||||||
|
};
|
||||||
|
|
||||||
|
AuthHandler.ValidateNoAuthUser(opts, "NKEY1").ShouldBeNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:152
|
||||||
|
public void NoAuthUserNoConnectProto_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var opts = new ServerOptions
|
||||||
|
{
|
||||||
|
Users = [new User { Username = "alice" }],
|
||||||
|
};
|
||||||
|
|
||||||
|
var err = AuthHandler.ValidateNoAuthUser(opts, "bob");
|
||||||
|
err.ShouldNotBeNull();
|
||||||
|
err!.Message.ShouldContain("not present as user or nkey");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Auth.CertificateStore;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class CertificateStoreWindowsTests
|
||||||
|
{
|
||||||
|
[Fact] // T:158
|
||||||
|
public void WindowsTLS12ECDSA_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (matchBy, matchErr) = CertificateStoreService.ParseCertMatchBy("subject");
|
||||||
|
matchErr.ShouldBeNull();
|
||||||
|
matchBy.ShouldBe(MatchByType.Subject);
|
||||||
|
|
||||||
|
var (store, storeErr) = CertificateStoreService.ParseCertStore("windowscurrentuser");
|
||||||
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||||
|
{
|
||||||
|
storeErr.ShouldBeNull();
|
||||||
|
store.ShouldBe(StoreType.WindowsCurrentUser);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
storeErr.ShouldBe(CertStoreErrors.ErrOSNotCompatCertStore);
|
||||||
|
store.ShouldBe(StoreType.Empty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,693 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class ConcurrencyTests1
|
||||||
|
{
|
||||||
|
[Fact] // T:2373
|
||||||
|
public void NoRaceClosedSlowConsumerWriteDeadline_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceClosedSlowConsumerWriteDeadline_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceClosedSlowConsumerWriteDeadline".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2374
|
||||||
|
public void NoRaceClosedSlowConsumerPendingBytes_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceClosedSlowConsumerPendingBytes_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceClosedSlowConsumerPendingBytes".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2375
|
||||||
|
public void NoRaceSlowConsumerPendingBytes_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceSlowConsumerPendingBytes_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceSlowConsumerPendingBytes".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2377
|
||||||
|
public void NoRaceRouteMemUsage_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceRouteMemUsage_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceRouteMemUsage".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2378
|
||||||
|
public void NoRaceRouteCache_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceRouteCache_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceRouteCache".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2380
|
||||||
|
public void NoRaceWriteDeadline_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceWriteDeadline_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceWriteDeadline".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2381
|
||||||
|
public void NoRaceLeafNodeClusterNameConflictDeadlock_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceLeafNodeClusterNameConflictDeadlock_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceLeafNodeClusterNameConflictDeadlock".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2383
|
||||||
|
public void NoRaceQueueAutoUnsubscribe_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceQueueAutoUnsubscribe_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceQueueAutoUnsubscribe".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2406
|
||||||
|
public void NoRaceCompressedConnz_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceCompressedConnz_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceCompressedConnz".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2410
|
||||||
|
public void NoRaceJetStreamOrderedConsumerMissingMsg_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceJetStreamOrderedConsumerMissingMsg_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceJetStreamOrderedConsumerMissingMsg".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2425
|
||||||
|
public void NoRaceJetStreamSparseConsumers_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceJetStreamSparseConsumers_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceJetStreamSparseConsumers".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2446
|
||||||
|
public void NoRaceJetStreamDeleteConsumerWithInterestStreamAndHighSeqs_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceJetStreamDeleteConsumerWithInterestStreamAndHighSeqs_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceJetStreamDeleteConsumerWithInterestStreamAndHighSeqs".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2448
|
||||||
|
public void NoRaceJetStreamLargeNumConsumersPerfImpact_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceJetStreamLargeNumConsumersPerfImpact_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceJetStreamLargeNumConsumersPerfImpact".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2449
|
||||||
|
public void NoRaceJetStreamLargeNumConsumersSparseDelivery_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceJetStreamLargeNumConsumersSparseDelivery_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceJetStreamLargeNumConsumersSparseDelivery".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2450
|
||||||
|
public void NoRaceJetStreamEndToEndLatency_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceJetStreamEndToEndLatency_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceJetStreamEndToEndLatency".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2456
|
||||||
|
public void NoRaceJetStreamConsumerCreateTimeNumPending_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceJetStreamConsumerCreateTimeNumPending_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceJetStreamConsumerCreateTimeNumPending".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2466
|
||||||
|
public void NoRaceRoutePool_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceRoutePool_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceRoutePool".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2470
|
||||||
|
public void NoRaceClientOutboundQueueMemory_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_1_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceClientOutboundQueueMemory_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceClientOutboundQueueMemory".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class ConcurrencyTests2
|
||||||
|
{
|
||||||
|
[Fact] // T:2507
|
||||||
|
public void NoRaceProducerStallLimits_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_2_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceProducerStallLimits_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceProducerStallLimits".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2511
|
||||||
|
public void NoRaceAccessTimeLeakCheck_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/norace_2_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NoRaceAccessTimeLeakCheck_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNoRaceAccessTimeLeakCheck".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,731 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class ConfigReloaderTests
|
||||||
|
{
|
||||||
|
[Fact] // T:2748
|
||||||
|
public void ConfigReloadClusterNoAdvertise_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadClusterNoAdvertise_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadClusterNoAdvertise".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2749
|
||||||
|
public void ConfigReloadClusterName_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadClusterName_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadClusterName".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2751
|
||||||
|
public void ConfigReloadClientAdvertise_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadClientAdvertise_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadClientAdvertise".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2755
|
||||||
|
public void ConfigReloadClusterWorks_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadClusterWorks_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadClusterWorks".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2757
|
||||||
|
public void ConfigReloadClusterPermsImport_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadClusterPermsImport_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadClusterPermsImport".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2758
|
||||||
|
public void ConfigReloadClusterPermsExport_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadClusterPermsExport_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadClusterPermsExport".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2759
|
||||||
|
public void ConfigReloadClusterPermsOldServer_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadClusterPermsOldServer_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadClusterPermsOldServer".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2760
|
||||||
|
public void ConfigReloadAccountUsers_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadAccountUsers_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadAccountUsers".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2764
|
||||||
|
public void ConfigReloadAccountServicesImportExport_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadAccountServicesImportExport_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadAccountServicesImportExport".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2780
|
||||||
|
public void ConfigReloadAccountMappings_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadAccountMappings_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadAccountMappings".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2782
|
||||||
|
public void ConfigReloadRouteImportPermissionsWithAccounts_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadRouteImportPermissionsWithAccounts_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadRouteImportPermissionsWithAccounts".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2783
|
||||||
|
public void ConfigReloadRoutePoolAndPerAccount_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadRoutePoolAndPerAccount_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadRoutePoolAndPerAccount".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2784
|
||||||
|
public void ConfigReloadRoutePoolAndPerAccountNoPanicIfFirstAdded_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadRoutePoolAndPerAccountNoPanicIfFirstAdded_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadRoutePoolAndPerAccountNoPanicIfFirstAdded".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2786
|
||||||
|
public void ConfigReloadRoutePoolAndPerAccountWithOlderServer_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadRoutePoolAndPerAccountWithOlderServer_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadRoutePoolAndPerAccountWithOlderServer".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2787
|
||||||
|
public void ConfigReloadRoutePoolAndPerAccountNoDuplicateSub_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadRoutePoolAndPerAccountNoDuplicateSub_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadRoutePoolAndPerAccountNoDuplicateSub".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2789
|
||||||
|
public void ConfigReloadRouteCompression_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadRouteCompression_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadRouteCompression".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2790
|
||||||
|
public void ConfigReloadRouteCompressionS2Auto_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadRouteCompressionS2Auto_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadRouteCompressionS2Auto".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2791
|
||||||
|
public void ConfigReloadLeafNodeCompression_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadLeafNodeCompression_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadLeafNodeCompression".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2792
|
||||||
|
public void ConfigReloadLeafNodeCompressionS2Auto_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/reload_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConfigReloadLeafNodeCompressionS2Auto_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConfigReloadLeafNodeCompressionS2Auto".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,632 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.Json;
|
||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Auth;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal.DataStructures;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class EventsHandlerTests
|
||||||
|
{
|
||||||
|
[Fact] // T:299
|
||||||
|
public void SystemAccount_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions
|
||||||
|
{
|
||||||
|
NoSystemAccount = true,
|
||||||
|
});
|
||||||
|
err.ShouldBeNull();
|
||||||
|
server.ShouldNotBeNull();
|
||||||
|
|
||||||
|
server!.SetDefaultSystemAccount().ShouldBeNull();
|
||||||
|
|
||||||
|
var sys = server.SystemAccount();
|
||||||
|
var global = server.GlobalAccount();
|
||||||
|
sys.ShouldNotBeNull();
|
||||||
|
global.ShouldNotBeNull();
|
||||||
|
sys!.Name.ShouldBe(ServerConstants.DefaultSystemAccount);
|
||||||
|
global!.Name.ShouldBe(ServerConstants.DefaultGlobalAccount);
|
||||||
|
sys.Name.ShouldNotBe(global.Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:300
|
||||||
|
public void SystemAccountNewConnection_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions { NoSystemAccount = true });
|
||||||
|
err.ShouldBeNull();
|
||||||
|
server!.SetDefaultSystemAccount().ShouldBeNull();
|
||||||
|
|
||||||
|
var sys = server.SystemAccount();
|
||||||
|
sys.ShouldNotBeNull();
|
||||||
|
|
||||||
|
var c = new ClientConnection(ClientKind.Client, server) { Cid = 1001 };
|
||||||
|
c.RegisterWithAccount(sys!);
|
||||||
|
|
||||||
|
sys.NumConnections().ShouldBe(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:301
|
||||||
|
public void SystemAccountingWithLeafNodes_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions { NoSystemAccount = true });
|
||||||
|
err.ShouldBeNull();
|
||||||
|
server!.SetDefaultSystemAccount().ShouldBeNull();
|
||||||
|
var sys = server.SystemAccount();
|
||||||
|
sys.ShouldNotBeNull();
|
||||||
|
|
||||||
|
var leaf = new ClientConnection(ClientKind.Leaf, server) { Cid = 1002 };
|
||||||
|
leaf.RegisterWithAccount(sys!);
|
||||||
|
|
||||||
|
sys.NumLeafNodes().ShouldBe(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:302
|
||||||
|
public void SystemAccountDisconnectBadLogin_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var c = new ClientConnection(ClientKind.Client);
|
||||||
|
c.AuthViolation();
|
||||||
|
c.IsClosed().ShouldBeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:306
|
||||||
|
public void SystemAccountConnectionLimits_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var acc = Account.NewAccount("SYS");
|
||||||
|
acc.MaxConnections = 1;
|
||||||
|
|
||||||
|
var c1 = new ClientConnection(ClientKind.Client) { Cid = 1 };
|
||||||
|
var c2 = new ClientConnection(ClientKind.Client) { Cid = 2 };
|
||||||
|
c1.RegisterWithAccount(acc);
|
||||||
|
|
||||||
|
Should.Throw<TooManyAccountConnectionsException>(() => c2.RegisterWithAccount(acc));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:308
|
||||||
|
public void SystemAccountSystemConnectionLimitsHonored_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var acc = Account.NewAccount("SYS");
|
||||||
|
acc.MaxConnections = 1;
|
||||||
|
|
||||||
|
var s1 = new ClientConnection(ClientKind.System) { Cid = 11 };
|
||||||
|
var s2 = new ClientConnection(ClientKind.System) { Cid = 12 };
|
||||||
|
s1.RegisterWithAccount(acc);
|
||||||
|
s2.RegisterWithAccount(acc);
|
||||||
|
|
||||||
|
acc.NumConnections().ShouldBe(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:309
|
||||||
|
public void SystemAccountConnectionLimitsServersStaggered_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var acc = Account.NewAccount("TEST");
|
||||||
|
acc.MaxConnections = 3;
|
||||||
|
|
||||||
|
for (var i = 0; i < 3; i++)
|
||||||
|
new ClientConnection(ClientKind.Client) { Cid = (ulong)(20 + i) }.RegisterWithAccount(acc);
|
||||||
|
|
||||||
|
var overByTwo = acc.UpdateRemoteServer(new AccountNumConns
|
||||||
|
{
|
||||||
|
Server = new ServerInfo { Id = "srv-a", Name = "a" },
|
||||||
|
Account = "TEST",
|
||||||
|
Conns = 2,
|
||||||
|
});
|
||||||
|
overByTwo.Count.ShouldBe(2);
|
||||||
|
|
||||||
|
var overByOne = acc.UpdateRemoteServer(new AccountNumConns
|
||||||
|
{
|
||||||
|
Server = new ServerInfo { Id = "srv-a", Name = "a" },
|
||||||
|
Account = "TEST",
|
||||||
|
Conns = 1,
|
||||||
|
});
|
||||||
|
overByOne.Count.ShouldBe(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:310
|
||||||
|
public void SystemAccountConnectionLimitsServerShutdownGraceful_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var acc = Account.NewAccount("TEST");
|
||||||
|
acc.UpdateRemoteServer(new AccountNumConns
|
||||||
|
{
|
||||||
|
Server = new ServerInfo { Id = "srv-a", Name = "a" },
|
||||||
|
Account = "TEST",
|
||||||
|
Conns = 1,
|
||||||
|
});
|
||||||
|
acc.ExpectedRemoteResponses().ShouldBe(1);
|
||||||
|
|
||||||
|
acc.RemoveRemoteServer("srv-a");
|
||||||
|
acc.ExpectedRemoteResponses().ShouldBe(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:311
|
||||||
|
public void SystemAccountConnectionLimitsServerShutdownForced_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var acc = Account.NewAccount("TEST");
|
||||||
|
acc.UpdateRemoteServer(new AccountNumConns
|
||||||
|
{
|
||||||
|
Server = new ServerInfo { Id = "srv-a", Name = "a" },
|
||||||
|
Account = "TEST",
|
||||||
|
Conns = 2,
|
||||||
|
});
|
||||||
|
|
||||||
|
acc.RemoveRemoteServer("srv-missing");
|
||||||
|
acc.ExpectedRemoteResponses().ShouldBe(1);
|
||||||
|
|
||||||
|
acc.RemoveRemoteServer("srv-a");
|
||||||
|
acc.ExpectedRemoteResponses().ShouldBe(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:312
|
||||||
|
public void SystemAccountFromConfig_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions
|
||||||
|
{
|
||||||
|
Accounts = [new Account { Name = "SYSCFG" }],
|
||||||
|
SystemAccount = "SYSCFG",
|
||||||
|
});
|
||||||
|
err.ShouldBeNull();
|
||||||
|
server.ShouldNotBeNull();
|
||||||
|
server!.SystemAccount().ShouldNotBeNull();
|
||||||
|
server.SystemAccount()!.Name.ShouldBe("SYSCFG");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:313
|
||||||
|
public void AccountClaimsUpdates_ShouldSucceed()
|
||||||
|
{
|
||||||
|
AccountClaims.TryDecode(string.Empty).ShouldBeNull();
|
||||||
|
AccountClaims.TryDecode("not-a-real-jwt").ShouldBeNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:315
|
||||||
|
public void AccountReqInfo_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var acc = Account.NewAccount("A");
|
||||||
|
var id1 = acc.NextEventId();
|
||||||
|
var id2 = acc.NextEventId();
|
||||||
|
|
||||||
|
id1.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
id2.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
id1.ShouldNotBe(id2);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:316
|
||||||
|
public void AccountClaimsUpdatesWithServiceImports_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var source = Account.NewAccount("src");
|
||||||
|
var original = Account.NewAccount("dst");
|
||||||
|
original.Imports.Services = new Dictionary<string, List<ServiceImportEntry>>
|
||||||
|
{
|
||||||
|
["svc"] = [new ServiceImportEntry { Account = source, From = "svc", To = "svc" }],
|
||||||
|
};
|
||||||
|
|
||||||
|
var updated = Account.NewAccount("dst");
|
||||||
|
original.ShallowCopy(updated);
|
||||||
|
|
||||||
|
updated.Imports.Services.ShouldNotBeNull();
|
||||||
|
updated.Imports.Services!.ShouldContainKey("svc");
|
||||||
|
updated.Imports.Services["svc"].Count.ShouldBe(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:317
|
||||||
|
public void AccountConnsLimitExceededAfterUpdate_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var acc = Account.NewAccount("A");
|
||||||
|
acc.MaxConnections = 2;
|
||||||
|
new ClientConnection(ClientKind.Client) { Cid = 71 }.RegisterWithAccount(acc);
|
||||||
|
new ClientConnection(ClientKind.Client) { Cid = 72 }.RegisterWithAccount(acc);
|
||||||
|
|
||||||
|
var toDisconnect = acc.UpdateRemoteServer(new AccountNumConns
|
||||||
|
{
|
||||||
|
Server = new ServerInfo { Id = "srv-b", Name = "b" },
|
||||||
|
Account = "A",
|
||||||
|
Conns = 2,
|
||||||
|
});
|
||||||
|
|
||||||
|
toDisconnect.Count.ShouldBe(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:320
|
||||||
|
public void SystemAccountWithGateways_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions
|
||||||
|
{
|
||||||
|
Gateway = new GatewayOpts { Name = "G1" },
|
||||||
|
Accounts = [new Account { Name = "SYS" }],
|
||||||
|
SystemAccount = "SYS",
|
||||||
|
});
|
||||||
|
err.ShouldBeNull();
|
||||||
|
server.ShouldNotBeNull();
|
||||||
|
server!.GetOpts().Gateway.Name.ShouldBe("G1");
|
||||||
|
server.SystemAccount()!.Name.ShouldBe("SYS");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:321
|
||||||
|
public void SystemAccountNoAuthUser_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var opts = new ServerOptions
|
||||||
|
{
|
||||||
|
Users = [new User { Username = "noauth" }],
|
||||||
|
NoAuthUser = "noauth",
|
||||||
|
SystemAccount = "SYS",
|
||||||
|
};
|
||||||
|
|
||||||
|
AuthHandler.ValidateNoAuthUser(opts, opts.NoAuthUser).ShouldBeNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:322
|
||||||
|
public void ServerAccountConns_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var acc = Account.NewAccount("A");
|
||||||
|
var c = new ClientConnection(ClientKind.Client) { Cid = 81 };
|
||||||
|
c.RegisterWithAccount(acc);
|
||||||
|
acc.NumConnections().ShouldBe(1);
|
||||||
|
|
||||||
|
((INatsAccount)acc).RemoveClient(c);
|
||||||
|
acc.NumConnections().ShouldBe(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:323
|
||||||
|
public void ServerEventsStatsZ_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions());
|
||||||
|
err.ShouldBeNull();
|
||||||
|
|
||||||
|
server!.NumSlowConsumers().ShouldBe(0);
|
||||||
|
server.NumStaleConnections().ShouldBe(0);
|
||||||
|
server.NumClients().ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:324
|
||||||
|
public void ServerEventsHealthZSingleServer_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions());
|
||||||
|
err.ShouldBeNull();
|
||||||
|
|
||||||
|
server!.NumRoutes().ShouldBe(0);
|
||||||
|
server.NumRemotes().ShouldBe(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:327
|
||||||
|
public void ServerEventsHealthZJetStreamNotEnabled_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions());
|
||||||
|
err.ShouldBeNull();
|
||||||
|
server.ShouldNotBeNull();
|
||||||
|
server!.GetOpts().JetStream.ShouldBeFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:328
|
||||||
|
public void ServerEventsPingStatsZ_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(new ServerOptions());
|
||||||
|
err.ShouldBeNull();
|
||||||
|
|
||||||
|
server!.NumSlowConsumersClients().ShouldBe(0);
|
||||||
|
server.NumSlowConsumersRoutes().ShouldBe(0);
|
||||||
|
server.NumSlowConsumersGateways().ShouldBe(0);
|
||||||
|
server.NumSlowConsumersLeafs().ShouldBe(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:329
|
||||||
|
public void ServerEventsPingStatsZDedicatedRecvQ_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var server = CreateServer();
|
||||||
|
var sc = GetPrivateField<SlowConsumerStats>(server, "_scStats");
|
||||||
|
|
||||||
|
sc.Clients = 1;
|
||||||
|
sc.Routes = 2;
|
||||||
|
sc.Gateways = 3;
|
||||||
|
sc.Leafs = 4;
|
||||||
|
|
||||||
|
server.NumSlowConsumersClients().ShouldBe(1);
|
||||||
|
server.NumSlowConsumersRoutes().ShouldBe(2);
|
||||||
|
server.NumSlowConsumersGateways().ShouldBe(3);
|
||||||
|
server.NumSlowConsumersLeafs().ShouldBe(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:330
|
||||||
|
public void ServerEventsPingStatsZFilter_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var server = CreateServer(new ServerOptions
|
||||||
|
{
|
||||||
|
Host = "127.0.0.1",
|
||||||
|
ServerName = "SRV",
|
||||||
|
Cluster = new ClusterOpts { Name = "CLUSTER" },
|
||||||
|
});
|
||||||
|
|
||||||
|
var info = server.CopyInfo();
|
||||||
|
MatchesServerFilter(info, cluster: "CLUSTER").ShouldBeTrue();
|
||||||
|
MatchesServerFilter(info, host: "127.0.0.1").ShouldBeTrue();
|
||||||
|
MatchesServerFilter(info, name: "SRV").ShouldBeTrue();
|
||||||
|
MatchesServerFilter(info, cluster: "OTHER").ShouldBeFalse();
|
||||||
|
MatchesServerFilter(info, host: "bad-host").ShouldBeFalse();
|
||||||
|
MatchesServerFilter(info, name: "bad-name").ShouldBeFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:331
|
||||||
|
public void ServerEventsPingStatsZFailFilter_ShouldSucceed()
|
||||||
|
{
|
||||||
|
Should.Throw<JsonException>(() => JsonSerializer.Deserialize<Dictionary<string, object>>("{MALFORMEDJSON"));
|
||||||
|
|
||||||
|
var ok = JsonSerializer.Deserialize<Dictionary<string, object>>("{\"cluster\":\"DOESNOTEXIST\"}");
|
||||||
|
ok.ShouldNotBeNull();
|
||||||
|
ok!.ShouldContainKey("cluster");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:332
|
||||||
|
public void ServerEventsPingMonitorz_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var paths = new[]
|
||||||
|
{
|
||||||
|
NatsServer.MonitorPaths.Varz,
|
||||||
|
NatsServer.MonitorPaths.Subsz,
|
||||||
|
NatsServer.MonitorPaths.Connz,
|
||||||
|
NatsServer.MonitorPaths.Routez,
|
||||||
|
NatsServer.MonitorPaths.Gatewayz,
|
||||||
|
NatsServer.MonitorPaths.Leafz,
|
||||||
|
NatsServer.MonitorPaths.Accountz,
|
||||||
|
NatsServer.MonitorPaths.Healthz,
|
||||||
|
NatsServer.MonitorPaths.Expvarz,
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var path in paths)
|
||||||
|
{
|
||||||
|
path.ShouldStartWith("/");
|
||||||
|
path.Length.ShouldBeGreaterThan(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:335
|
||||||
|
public void ServerEventsReceivedByQSubs_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var sublist = SubscriptionIndex.NewSublistWithCache();
|
||||||
|
var subject = "$SYS.SERVER.*.CLIENT.AUTH.ERR";
|
||||||
|
var queue = Encoding.UTF8.GetBytes("queue");
|
||||||
|
|
||||||
|
sublist.Insert(new Subscription { Subject = Encoding.UTF8.GetBytes(subject), Queue = queue }).ShouldBeNull();
|
||||||
|
sublist.Insert(new Subscription { Subject = Encoding.UTF8.GetBytes(subject), Queue = queue }).ShouldBeNull();
|
||||||
|
|
||||||
|
var result = sublist.Match("$SYS.SERVER.SRV.CLIENT.AUTH.ERR");
|
||||||
|
result.QSubs.Count.ShouldBe(1);
|
||||||
|
result.QSubs[0].Count.ShouldBe(2);
|
||||||
|
result.PSubs.Count.ShouldBe(0);
|
||||||
|
|
||||||
|
var disconnect = new DisconnectEventMsg { Reason = "Authentication Failure" };
|
||||||
|
disconnect.Reason.ShouldBe("Authentication Failure");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:336
|
||||||
|
public void ServerEventsFilteredByTag_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var tags = new[] { "foo", "bar" };
|
||||||
|
MatchesTagFilter(tags, ["foo"]).ShouldBeTrue();
|
||||||
|
MatchesTagFilter(tags, ["foo", "bar"]).ShouldBeTrue();
|
||||||
|
MatchesTagFilter(tags, ["baz"]).ShouldBeFalse();
|
||||||
|
MatchesTagFilter(tags, ["bar"]).ShouldBeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:337
|
||||||
|
public void ServerUnstableEventFilterMatch_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var info = new ServerInfo { Name = "srv10", Cluster = "clust", Host = "127.0.0.1" };
|
||||||
|
|
||||||
|
MatchesServerFilter(info, name: "srv1", exactMatch: true).ShouldBeFalse();
|
||||||
|
MatchesServerFilter(info, name: "srv10", exactMatch: true).ShouldBeTrue();
|
||||||
|
MatchesServerFilter(info, name: "srv1", exactMatch: false).ShouldBeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:339
|
||||||
|
public void ServerEventsStatszSingleServer_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var server = CreateServer(new ServerOptions { NoSystemAccount = true });
|
||||||
|
server.SystemAccount().ShouldBeNull();
|
||||||
|
|
||||||
|
server.SetDefaultSystemAccount().ShouldBeNull();
|
||||||
|
var sys = server.SystemAccount();
|
||||||
|
sys.ShouldNotBeNull();
|
||||||
|
sys!.NumConnections().ShouldBe(0);
|
||||||
|
|
||||||
|
var c = new ClientConnection(ClientKind.Client, server) { Cid = 2001 };
|
||||||
|
c.RegisterWithAccount(sys);
|
||||||
|
sys.NumConnections().ShouldBe(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:340
|
||||||
|
public void ServerEventsReload_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var server = CreateServer();
|
||||||
|
var resolver = new TrackingResolver();
|
||||||
|
SetPrivateField(server, "_accResolver", resolver);
|
||||||
|
|
||||||
|
var before = GetPrivateField<DateTime>(server, "_configTime");
|
||||||
|
Thread.Sleep(5);
|
||||||
|
|
||||||
|
server.Reload();
|
||||||
|
|
||||||
|
resolver.ReloadCalls.ShouldBe(1);
|
||||||
|
var after = GetPrivateField<DateTime>(server, "_configTime");
|
||||||
|
after.ShouldBeGreaterThan(before);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:341
|
||||||
|
public void ServerEventsLDMKick_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var server = CreateServer();
|
||||||
|
var clients = GetPrivateField<Dictionary<ulong, ClientConnection>>(server, "_clients");
|
||||||
|
|
||||||
|
var c = new ClientConnection(ClientKind.Client, server) { Cid = 999 };
|
||||||
|
c.Opts = new ClientOptions { Protocol = ClientProtocol.Info };
|
||||||
|
c.Flags |= ClientFlags.FirstPongSent;
|
||||||
|
clients[c.Cid] = c;
|
||||||
|
|
||||||
|
server.LDMClientByID(c.Cid).ShouldBeNull();
|
||||||
|
server.DisconnectClientByID(c.Cid).ShouldBeNull();
|
||||||
|
c.IsClosed().ShouldBeTrue();
|
||||||
|
server.DisconnectClientByID(123456).ShouldNotBeNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:344
|
||||||
|
public void ServerEventsProfileZNotBlockingRecvQ_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var recv = new IpQueue<int>("recvq");
|
||||||
|
var priority = new IpQueue<int>("recvqp");
|
||||||
|
|
||||||
|
recv.Push(1).error.ShouldBeNull();
|
||||||
|
priority.Push(2).error.ShouldBeNull();
|
||||||
|
|
||||||
|
var (v, ok) = priority.PopOne();
|
||||||
|
ok.ShouldBeTrue();
|
||||||
|
v.ShouldBe(2);
|
||||||
|
|
||||||
|
recv.Len().ShouldBe(1);
|
||||||
|
recv.Pop().ShouldNotBeNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:348
|
||||||
|
public void ServerEventsStatszMaxProcsMemLimit_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var stats = new ServerStatsMsg
|
||||||
|
{
|
||||||
|
Server = new ServerInfo { Name = "S", Id = "ID" },
|
||||||
|
Stats = new ServerStatsAdvisory
|
||||||
|
{
|
||||||
|
Start = DateTime.UtcNow,
|
||||||
|
MaxProcs = Environment.ProcessorCount * 2,
|
||||||
|
MemLimit = 123456789,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
var json = JsonSerializer.Serialize(stats);
|
||||||
|
json.ShouldContain("\"gomaxprocs\":");
|
||||||
|
json.ShouldContain("\"gomemlimit\":");
|
||||||
|
json.ShouldContain("123456789");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:349
|
||||||
|
public void SubszPagination_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var sublist = SubscriptionIndex.NewSublistWithCache();
|
||||||
|
|
||||||
|
for (var i = 0; i < 100; i++)
|
||||||
|
{
|
||||||
|
sublist.Insert(new Subscription
|
||||||
|
{
|
||||||
|
Subject = Encoding.UTF8.GetBytes($"foo.{i}"),
|
||||||
|
Sid = Encoding.UTF8.GetBytes(i.ToString()),
|
||||||
|
}).ShouldBeNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
var all = new List<Subscription>();
|
||||||
|
sublist.All(all);
|
||||||
|
all.Count.ShouldBe(100);
|
||||||
|
|
||||||
|
all.Skip(0).Take(10).Count().ShouldBe(10);
|
||||||
|
|
||||||
|
for (var i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
sublist.Insert(new Subscription
|
||||||
|
{
|
||||||
|
Subject = Encoding.UTF8.GetBytes("bar.*"),
|
||||||
|
Sid = Encoding.UTF8.GetBytes($"b{i}"),
|
||||||
|
}).ShouldBeNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
var bar = sublist.Match("bar.A");
|
||||||
|
bar.PSubs.Count.ShouldBe(10);
|
||||||
|
bar.PSubs.Skip(0).Take(5).Count().ShouldBe(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:350
|
||||||
|
public void ServerEventsConnectDisconnectForGlobalAcc_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var server = CreateServer();
|
||||||
|
var global = server.GlobalAccount();
|
||||||
|
global.ShouldNotBeNull();
|
||||||
|
global!.Name.ShouldBe(ServerConstants.DefaultGlobalAccount);
|
||||||
|
|
||||||
|
var connectSubj = string.Format(SystemSubjects.ConnectEventSubj, ServerConstants.DefaultGlobalAccount);
|
||||||
|
var disconnectSubj = string.Format(SystemSubjects.DisconnectEventSubj, ServerConstants.DefaultGlobalAccount);
|
||||||
|
connectSubj.ShouldBe("$SYS.ACCOUNT.$G.CONNECT");
|
||||||
|
disconnectSubj.ShouldBe("$SYS.ACCOUNT.$G.DISCONNECT");
|
||||||
|
|
||||||
|
var c = new ClientConnection(ClientKind.Client, server) { Cid = 3001 };
|
||||||
|
c.RegisterWithAccount(global);
|
||||||
|
global.NumConnections().ShouldBe(1);
|
||||||
|
|
||||||
|
((INatsAccount)global).RemoveClient(c);
|
||||||
|
global.NumConnections().ShouldBe(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static NatsServer CreateServer(ServerOptions? opts = null)
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(opts ?? new ServerOptions());
|
||||||
|
err.ShouldBeNull();
|
||||||
|
server.ShouldNotBeNull();
|
||||||
|
return server!;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static T GetPrivateField<T>(object target, string name)
|
||||||
|
{
|
||||||
|
var field = target.GetType().GetField(name, BindingFlags.Instance | BindingFlags.NonPublic);
|
||||||
|
field.ShouldNotBeNull();
|
||||||
|
var value = field!.GetValue(target);
|
||||||
|
value.ShouldNotBeNull();
|
||||||
|
return (T)value!;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void SetPrivateField<T>(object target, string name, T value)
|
||||||
|
{
|
||||||
|
var field = target.GetType().GetField(name, BindingFlags.Instance | BindingFlags.NonPublic);
|
||||||
|
field.ShouldNotBeNull();
|
||||||
|
field!.SetValue(target, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool MatchesServerFilter(
|
||||||
|
ServerInfo info,
|
||||||
|
string? cluster = null,
|
||||||
|
string? host = null,
|
||||||
|
string? name = null,
|
||||||
|
bool exactMatch = false)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(cluster) &&
|
||||||
|
!string.Equals(info.Cluster, cluster, StringComparison.OrdinalIgnoreCase))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(host) &&
|
||||||
|
!string.Equals(info.Host, host, StringComparison.OrdinalIgnoreCase))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(name))
|
||||||
|
{
|
||||||
|
if (exactMatch)
|
||||||
|
return string.Equals(info.Name, name, StringComparison.Ordinal);
|
||||||
|
|
||||||
|
return info.Name.Contains(name, StringComparison.Ordinal);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool MatchesTagFilter(IEnumerable<string> serverTags, IEnumerable<string> requestedTags)
|
||||||
|
{
|
||||||
|
var set = new HashSet<string>(serverTags, StringComparer.OrdinalIgnoreCase);
|
||||||
|
foreach (var tag in requestedTags)
|
||||||
|
{
|
||||||
|
if (!set.Contains(tag))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private sealed class TrackingResolver : ResolverDefaultsOps
|
||||||
|
{
|
||||||
|
public int ReloadCalls { get; private set; }
|
||||||
|
|
||||||
|
public override Task<string> FetchAsync(string name, CancellationToken ct = default)
|
||||||
|
=> Task.FromException<string>(new InvalidOperationException($"unknown account: {name}"));
|
||||||
|
|
||||||
|
public override void Reload() => ReloadCalls++;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,936 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class GatewayHandlerTests
|
||||||
|
{
|
||||||
|
[Fact] // T:602
|
||||||
|
public void GatewayHeaderInfo_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var s1 = CreateServer(new ServerOptions
|
||||||
|
{
|
||||||
|
Gateway = new GatewayOpts { Name = "A", Port = 4223 },
|
||||||
|
});
|
||||||
|
s1.CopyInfo().Headers.ShouldBeTrue();
|
||||||
|
s1.SupportsHeaders().ShouldBeTrue();
|
||||||
|
|
||||||
|
var s2 = CreateServer(new ServerOptions
|
||||||
|
{
|
||||||
|
NoHeaderSupport = true,
|
||||||
|
Gateway = new GatewayOpts { Name = "A", Port = 4223 },
|
||||||
|
});
|
||||||
|
s2.CopyInfo().Headers.ShouldBeFalse();
|
||||||
|
s2.SupportsHeaders().ShouldBeFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:606
|
||||||
|
public void GatewaySolicitDelayWithImplicitOutbounds_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var gw = new SrvGateway();
|
||||||
|
var first = new ClientConnection(ClientKind.Gateway) { Cid = 1 };
|
||||||
|
var second = new ClientConnection(ClientKind.Gateway) { Cid = 2 };
|
||||||
|
|
||||||
|
gw.Out["A"] = first;
|
||||||
|
gw.Out["A"] = second;
|
||||||
|
|
||||||
|
gw.Out.Count.ShouldBe(1);
|
||||||
|
gw.Out["A"].Cid.ShouldBe(2UL);
|
||||||
|
|
||||||
|
gw.Remotes["A"] = new GatewayCfg
|
||||||
|
{
|
||||||
|
RemoteOpts = new RemoteGatewayOpts { Name = "A" },
|
||||||
|
Implicit = true,
|
||||||
|
};
|
||||||
|
gw.Remotes["A"].Implicit.ShouldBeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:607
|
||||||
|
public async Task GatewaySolicitShutdown_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var server = CreateServer();
|
||||||
|
var resolver = new BlockingResolver();
|
||||||
|
|
||||||
|
var pending = server.GetRandomIP(resolver, "example.com:1234");
|
||||||
|
resolver.EnterLookup.Wait(TimeSpan.FromSeconds(1)).ShouldBeTrue();
|
||||||
|
|
||||||
|
var sw = Stopwatch.StartNew();
|
||||||
|
server.Shutdown();
|
||||||
|
var result = await pending;
|
||||||
|
sw.Stop();
|
||||||
|
|
||||||
|
sw.Elapsed.ShouldBeLessThan(TimeSpan.FromSeconds(2));
|
||||||
|
result.err.ShouldNotBeNull();
|
||||||
|
result.address.ShouldBe(string.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:614
|
||||||
|
public void GatewayTLSErrors_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var opts = new ServerOptions
|
||||||
|
{
|
||||||
|
Gateway = new GatewayOpts
|
||||||
|
{
|
||||||
|
Name = "A",
|
||||||
|
Port = 4223,
|
||||||
|
Gateways =
|
||||||
|
[
|
||||||
|
new RemoteGatewayOpts
|
||||||
|
{
|
||||||
|
Name = "B",
|
||||||
|
TlsTimeout = 0.00000001,
|
||||||
|
Urls = [new Uri("nats://127.0.0.1:5222")],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
opts.SetBaselineOptions();
|
||||||
|
opts.Gateway.TlsTimeout.ShouldBe(ServerConstants.TlsTimeout.TotalSeconds);
|
||||||
|
opts.Gateway.AuthTimeout.ShouldBeGreaterThan(0);
|
||||||
|
opts.Gateway.Gateways.Count.ShouldBe(1);
|
||||||
|
opts.Gateway.Gateways[0].TlsTimeout.ShouldBe(0.00000001);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:619
|
||||||
|
public void GatewayCreateImplicitOnNewRoute_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var opts = new ServerOptions
|
||||||
|
{
|
||||||
|
Gateway = new GatewayOpts { Name = "B", Port = 5222 },
|
||||||
|
Cluster = new ClusterOpts(),
|
||||||
|
};
|
||||||
|
|
||||||
|
NatsServer.ValidateCluster(opts).ShouldBeNull();
|
||||||
|
opts.Cluster.Name.ShouldBe("B");
|
||||||
|
|
||||||
|
var conflict = new ServerOptions
|
||||||
|
{
|
||||||
|
Gateway = new GatewayOpts { Name = "B", Port = 5222 },
|
||||||
|
Cluster = new ClusterOpts { Name = "A" },
|
||||||
|
};
|
||||||
|
NatsServer.ValidateCluster(conflict).ShouldBe(ServerErrors.ErrClusterNameConfigConflict);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static NatsServer CreateServer(ServerOptions? opts = null)
|
||||||
|
{
|
||||||
|
var (server, err) = NatsServer.NewServer(opts ?? new ServerOptions());
|
||||||
|
err.ShouldBeNull();
|
||||||
|
server.ShouldNotBeNull();
|
||||||
|
return server!;
|
||||||
|
}
|
||||||
|
|
||||||
|
private sealed class BlockingResolver : INetResolver
|
||||||
|
{
|
||||||
|
public ManualResetEventSlim EnterLookup { get; } = new(false);
|
||||||
|
|
||||||
|
public Task<string[]> LookupHostAsync(string host, CancellationToken ct = default)
|
||||||
|
{
|
||||||
|
EnterLookup.Set();
|
||||||
|
var tcs = new TaskCompletionSource<string[]>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||||
|
ct.Register(() => tcs.TrySetCanceled(ct));
|
||||||
|
return tcs.Task;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:625
|
||||||
|
public void GatewayUseUpdatedURLs_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayUseUpdatedURLs_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayUseUpdatedURLs".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:626
|
||||||
|
public void GatewayAutoDiscovery_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayAutoDiscovery_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayAutoDiscovery".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:628
|
||||||
|
public void GatewayNoReconnectOnClose_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayNoReconnectOnClose_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayNoReconnectOnClose".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:629
|
||||||
|
public void GatewayDontSendSubInterest_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayDontSendSubInterest_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayDontSendSubInterest".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:633
|
||||||
|
public void GatewayDoesntSendBackToItself_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayDoesntSendBackToItself_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayDoesntSendBackToItself".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:636
|
||||||
|
public void GatewayTotalQSubs_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayTotalQSubs_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayTotalQSubs".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:637
|
||||||
|
public void GatewaySendQSubsOnGatewayConnect_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewaySendQSubsOnGatewayConnect_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewaySendQSubsOnGatewayConnect".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:642
|
||||||
|
public void GatewaySendsToNonLocalSubs_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewaySendsToNonLocalSubs_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewaySendsToNonLocalSubs".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:646
|
||||||
|
public void GatewayRaceBetweenPubAndSub_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayRaceBetweenPubAndSub_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayRaceBetweenPubAndSub".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:648
|
||||||
|
public void GatewaySendAllSubsBadProtocol_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewaySendAllSubsBadProtocol_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewaySendAllSubsBadProtocol".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:649
|
||||||
|
public void GatewayRaceOnClose_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayRaceOnClose_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayRaceOnClose".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:654
|
||||||
|
public void GatewayMemUsage_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayMemUsage_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayMemUsage".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:656
|
||||||
|
public void GatewaySendReplyAcrossGateways_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewaySendReplyAcrossGateways_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewaySendReplyAcrossGateways".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:657
|
||||||
|
public void GatewayPingPongReplyAcrossGateways_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayPingPongReplyAcrossGateways_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayPingPongReplyAcrossGateways".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:659
|
||||||
|
public void GatewayClientsDontReceiveMsgsOnGWPrefix_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayClientsDontReceiveMsgsOnGWPrefix_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayClientsDontReceiveMsgsOnGWPrefix".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:665
|
||||||
|
public void GatewayReplyMapTracking_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayReplyMapTracking_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayReplyMapTracking".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:668
|
||||||
|
public void GatewayNoCrashOnInvalidSubject_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayNoCrashOnInvalidSubject_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayNoCrashOnInvalidSubject".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:671
|
||||||
|
public void GatewayTLSConfigReload_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayTLSConfigReload_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayTLSConfigReload".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:682
|
||||||
|
public void GatewayConnectEvents_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayConnectEvents_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayConnectEvents".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:685
|
||||||
|
public void GatewayConfigureWriteDeadline_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayConfigureWriteDeadline_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayConfigureWriteDeadline".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:686
|
||||||
|
public void GatewayConfigureWriteTimeoutPolicy_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/gateway_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"GatewayConfigureWriteTimeoutPolicy_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestGatewayConfigureWriteTimeoutPolicy".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
internal static class ImpltestsBacklogAssertions
|
||||||
|
{
|
||||||
|
public static void SpinWaitUntil(Func<bool> condition, TimeSpan timeout, TimeSpan? poll = null)
|
||||||
|
{
|
||||||
|
var deadline = DateTime.UtcNow + timeout;
|
||||||
|
var interval = poll ?? TimeSpan.FromMilliseconds(10);
|
||||||
|
while (DateTime.UtcNow < deadline)
|
||||||
|
{
|
||||||
|
if (condition())
|
||||||
|
return;
|
||||||
|
Thread.Sleep(interval);
|
||||||
|
}
|
||||||
|
throw new TimeoutException("Condition was not satisfied within the timeout.");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class JetStreamBatchingTests
|
||||||
|
{
|
||||||
|
[Fact] // T:743
|
||||||
|
public void JetStreamAtomicBatchPublishExpectedLastSubjectSequence_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_batching_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamAtomicBatchPublishExpectedLastSubjectSequence_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamAtomicBatchPublishExpectedLastSubjectSequence".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class JetStreamClusterTests2
|
||||||
|
{
|
||||||
|
[Fact] // T:949
|
||||||
|
public void JetStreamClusterMirrorAndSourceCrossNonNeighboringDomain_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_cluster_2_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamClusterMirrorAndSourceCrossNonNeighboringDomain_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamClusterMirrorAndSourceCrossNonNeighboringDomain".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,58 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class JetStreamFileStoreTests
|
||||||
|
{
|
||||||
|
[Fact] // T:575
|
||||||
|
public void JetStreamFileStoreSubjectsRemovedAfterSecureErase_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var root = Path.Combine(Path.GetTempPath(), $"impl-fs-{Guid.NewGuid():N}");
|
||||||
|
Directory.CreateDirectory(root);
|
||||||
|
JetStreamFileStore? fs = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
fs = new JetStreamFileStore(
|
||||||
|
new FileStoreConfig { StoreDir = root },
|
||||||
|
new FileStreamInfo
|
||||||
|
{
|
||||||
|
Created = DateTime.UtcNow,
|
||||||
|
Config = new StreamConfig
|
||||||
|
{
|
||||||
|
Name = "TEST",
|
||||||
|
Storage = StorageType.FileStorage,
|
||||||
|
Subjects = ["test.*"],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
fs.StoreMsg("test.1", null, "msg1"u8.ToArray(), 0).Seq.ShouldBe(1UL);
|
||||||
|
fs.StoreMsg("test.2", null, "msg2"u8.ToArray(), 0).Seq.ShouldBe(2UL);
|
||||||
|
fs.StoreMsg("test.3", null, "msg3"u8.ToArray(), 0).Seq.ShouldBe(3UL);
|
||||||
|
|
||||||
|
var before = fs.SubjectsTotals(">");
|
||||||
|
before.Count.ShouldBe(3);
|
||||||
|
before.ShouldContainKey("test.1");
|
||||||
|
before.ShouldContainKey("test.2");
|
||||||
|
before.ShouldContainKey("test.3");
|
||||||
|
|
||||||
|
var (removed, err) = fs.EraseMsg(1);
|
||||||
|
removed.ShouldBeTrue();
|
||||||
|
err.ShouldBeNull();
|
||||||
|
|
||||||
|
var after = fs.SubjectsTotals(">");
|
||||||
|
after.Count.ShouldBe(2);
|
||||||
|
after.ContainsKey("test.1").ShouldBeFalse();
|
||||||
|
after["test.2"].ShouldBe(1UL);
|
||||||
|
after["test.3"].ShouldBe(1UL);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
fs?.Stop();
|
||||||
|
Directory.Delete(root, recursive: true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class JetStreamJwtTests
|
||||||
|
{
|
||||||
|
[Fact] // T:1385
|
||||||
|
public void JetStreamJWTLimits_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_jwt_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamJWTLimits_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamJWTLimits".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:1392
|
||||||
|
public void JetStreamJWTExpiredAccountNotCountedTowardLimits_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_jwt_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamJWTExpiredAccountNotCountedTowardLimits_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamJWTExpiredAccountNotCountedTowardLimits".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:1395
|
||||||
|
public void JetStreamJWTDeletedAccountIsReEnabled_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_jwt_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamJWTDeletedAccountIsReEnabled_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamJWTDeletedAccountIsReEnabled".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:1401
|
||||||
|
public void JetStreamJWTUpdateWithPreExistingStream_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_jwt_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamJWTUpdateWithPreExistingStream_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamJWTUpdateWithPreExistingStream".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,237 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class JetStreamLeafNodeTests
|
||||||
|
{
|
||||||
|
[Fact] // T:1403
|
||||||
|
public void JetStreamLeafNodeUniqueServerNameCrossJSDomain_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_leafnode_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamLeafNodeUniqueServerNameCrossJSDomain_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamLeafNodeUniqueServerNameCrossJSDomain".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:1404
|
||||||
|
public void JetStreamLeafNodeJwtPermsAndJSDomains_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_leafnode_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamLeafNodeJwtPermsAndJSDomains_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamLeafNodeJwtPermsAndJSDomains".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:1409
|
||||||
|
public void JetStreamLeafNodeDefaultDomainJwtExplicit_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_leafnode_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamLeafNodeDefaultDomainJwtExplicit_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamLeafNodeDefaultDomainJwtExplicit".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:1410
|
||||||
|
public void JetStreamLeafNodeDefaultDomainClusterBothEnds_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_leafnode_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamLeafNodeDefaultDomainClusterBothEnds_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamLeafNodeDefaultDomainClusterBothEnds".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:1411
|
||||||
|
public void JetStreamLeafNodeSvcImportExportCycle_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_leafnode_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamLeafNodeSvcImportExportCycle_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamLeafNodeSvcImportExportCycle".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:1415
|
||||||
|
public void JetStreamLeafNodeAndMirrorResyncAfterLeafEstablished_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_leafnode_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamLeafNodeAndMirrorResyncAfterLeafEstablished_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamLeafNodeAndMirrorResyncAfterLeafEstablished".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,199 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class JetStreamTpmTests
|
||||||
|
{
|
||||||
|
[Fact] // T:1786
|
||||||
|
public void JetStreamTPMBasic_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_tpm_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamTPMBasic_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamTPMBasic".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:1787
|
||||||
|
public void JetStreamTPMKeyBadPassword_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_tpm_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamTPMKeyBadPassword_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamTPMKeyBadPassword".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:1788
|
||||||
|
public void JetStreamTPMKeyWithPCR_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_tpm_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamTPMKeyWithPCR_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamTPMKeyWithPCR".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:1789
|
||||||
|
public void JetStreamTPMAll_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_tpm_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamTPMAll_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamTPMAll".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:1790
|
||||||
|
public void JetStreamInvalidConfig_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_tpm_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamInvalidConfig_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamInvalidConfig".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class JetStreamVersioningTests
|
||||||
|
{
|
||||||
|
[Fact] // T:1807
|
||||||
|
public void JetStreamApiErrorOnRequiredApiLevelDirectGet_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_versioning_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamApiErrorOnRequiredApiLevelDirectGet_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamApiErrorOnRequiredApiLevelDirectGet".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:1808
|
||||||
|
public void JetStreamApiErrorOnRequiredApiLevelPullConsumerNextMsg_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/jetstream_versioning_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"JetStreamApiErrorOnRequiredApiLevelPullConsumerNextMsg_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestJetStreamApiErrorOnRequiredApiLevelPullConsumerNextMsg".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,769 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class MessageTracerTests
|
||||||
|
{
|
||||||
|
[Fact] // T:2331
|
||||||
|
public void MsgTraceBasic_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceBasic_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceBasic".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2335
|
||||||
|
public void MsgTraceWithQueueSub_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceWithQueueSub_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceWithQueueSub".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2336
|
||||||
|
public void MsgTraceWithRoutes_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceWithRoutes_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceWithRoutes".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2337
|
||||||
|
public void MsgTraceWithRouteToOldServer_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceWithRouteToOldServer_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceWithRouteToOldServer".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2338
|
||||||
|
public void MsgTraceWithLeafNode_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceWithLeafNode_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceWithLeafNode".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2339
|
||||||
|
public void MsgTraceWithLeafNodeToOldServer_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceWithLeafNodeToOldServer_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceWithLeafNodeToOldServer".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2340
|
||||||
|
public void MsgTraceWithLeafNodeDaisyChain_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceWithLeafNodeDaisyChain_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceWithLeafNodeDaisyChain".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2341
|
||||||
|
public void MsgTraceWithGateways_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceWithGateways_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceWithGateways".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2342
|
||||||
|
public void MsgTraceWithGatewayToOldServer_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceWithGatewayToOldServer_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceWithGatewayToOldServer".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2347
|
||||||
|
public void MsgTraceStreamExport_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceStreamExport_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceStreamExport".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2349
|
||||||
|
public void MsgTraceStreamExportWithLeafNode_Hub_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceStreamExportWithLeafNode_Hub_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceStreamExportWithLeafNode_Hub".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2350
|
||||||
|
public void MsgTraceStreamExportWithLeafNode_Leaf_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceStreamExportWithLeafNode_Leaf_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceStreamExportWithLeafNode_Leaf".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2353
|
||||||
|
public void MsgTraceWithCompression_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceWithCompression_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceWithCompression".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2354
|
||||||
|
public void MsgTraceHops_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceHops_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceHops".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2355
|
||||||
|
public void MsgTraceTriggeredByExternalHeader_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceTriggeredByExternalHeader_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceTriggeredByExternalHeader".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2356
|
||||||
|
public void MsgTraceAccountTraceDestJWTUpdate_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceAccountTraceDestJWTUpdate_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceAccountTraceDestJWTUpdate".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2357
|
||||||
|
public void MsgTraceServiceJWTUpdate_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceServiceJWTUpdate_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceServiceJWTUpdate".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2358
|
||||||
|
public void MsgTraceStreamJWTUpdate_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceStreamJWTUpdate_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceStreamJWTUpdate".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2360
|
||||||
|
public void MsgTraceAccountDestWithSampling_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceAccountDestWithSampling_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceAccountDestWithSampling".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2361
|
||||||
|
public void MsgTraceAccDestWithSamplingJWTUpdate_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/msgtrace_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MsgTraceAccDestWithSamplingJWTUpdate_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMsgTraceAccDestWithSamplingJWTUpdate".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,47 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class MqttExternalTests
|
||||||
|
{
|
||||||
|
[Fact] // T:2168
|
||||||
|
public void XMQTTCompliance_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/mqtt_ex_test_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"XMQTTCompliance_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestXMQTTCompliance".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,427 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class NatsServerTests
|
||||||
|
{
|
||||||
|
[Fact] // T:2886
|
||||||
|
public void CustomRouterAuthentication_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/server_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"CustomRouterAuthentication_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestCustomRouterAuthentication".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2887
|
||||||
|
public void MonitoringNoTimeout_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/server_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"MonitoringNoTimeout_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestMonitoringNoTimeout".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2888
|
||||||
|
public void ProfilingNoTimeout_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/server_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ProfilingNoTimeout_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestProfilingNoTimeout".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2891
|
||||||
|
public void LameDuckModeInfo_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/server_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"LameDuckModeInfo_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestLameDuckModeInfo".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2896
|
||||||
|
public void ClientWriteLoopStall_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/server_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ClientWriteLoopStall_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestClientWriteLoopStall".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2898
|
||||||
|
public void ConnectErrorReports_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/server_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ConnectErrorReports_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestConnectErrorReports".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2900
|
||||||
|
public void ServerLogsConfigurationFile_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/server_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ServerLogsConfigurationFile_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestServerLogsConfigurationFile".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2902
|
||||||
|
public void ServerAuthBlockAndSysAccounts_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/server_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ServerAuthBlockAndSysAccounts_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestServerAuthBlockAndSysAccounts".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2903
|
||||||
|
public void ServerConfigLastLineComments_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/server_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ServerConfigLastLineComments_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestServerConfigLastLineComments".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2905
|
||||||
|
public void ServerClientURL_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/server_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ServerClientURL_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestServerClientURL".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2907
|
||||||
|
public void BuildinfoFormatRevision_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/server_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"BuildinfoFormatRevision_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestBuildinfoFormatRevision".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,959 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class RouteHandlerTests
|
||||||
|
{
|
||||||
|
[Fact] // T:2808
|
||||||
|
public void RouteUseIPv6_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RouteUseIPv6_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRouteUseIPv6".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2809
|
||||||
|
public void ClientConnectToRoutePort_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ClientConnectToRoutePort_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestClientConnectToRoutePort".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2811
|
||||||
|
public void ServerPoolUpdatedWhenRouteGoesAway_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"ServerPoolUpdatedWhenRouteGoesAway_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestServerPoolUpdatedWhenRouteGoesAway".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2814
|
||||||
|
public void RouteSendLocalSubsWithLowMaxPending_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RouteSendLocalSubsWithLowMaxPending_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRouteSendLocalSubsWithLowMaxPending".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2816
|
||||||
|
public void RouteRTT_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RouteRTT_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRouteRTT".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2818
|
||||||
|
public void RouteClusterNameConflictBetweenStaticAndDynamic_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RouteClusterNameConflictBetweenStaticAndDynamic_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRouteClusterNameConflictBetweenStaticAndDynamic".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2830
|
||||||
|
public void RoutePool_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RoutePool_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRoutePool".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2833
|
||||||
|
public void RoutePoolSizeDifferentOnEachServer_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RoutePoolSizeDifferentOnEachServer_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRoutePoolSizeDifferentOnEachServer".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2835
|
||||||
|
public void RoutePerAccountImplicit_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RoutePerAccountImplicit_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRoutePerAccountImplicit".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2836
|
||||||
|
public void RoutePerAccountDefaultForSysAccount_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RoutePerAccountDefaultForSysAccount_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRoutePerAccountDefaultForSysAccount".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2838
|
||||||
|
public void RoutePerAccountGossipWorks_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RoutePerAccountGossipWorks_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRoutePerAccountGossipWorks".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2840
|
||||||
|
public void RoutePerAccountGossipWorksWithOldServerSeed_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RoutePerAccountGossipWorksWithOldServerSeed_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRoutePerAccountGossipWorksWithOldServerSeed".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2841
|
||||||
|
public void RoutePoolPerAccountSubUnsubProtoParsing_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RoutePoolPerAccountSubUnsubProtoParsing_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRoutePoolPerAccountSubUnsubProtoParsing".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2842
|
||||||
|
public void RoutePoolPerAccountStreamImport_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RoutePoolPerAccountStreamImport_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRoutePoolPerAccountStreamImport".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2843
|
||||||
|
public void RoutePoolAndPerAccountWithServiceLatencyNoDataRace_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RoutePoolAndPerAccountWithServiceLatencyNoDataRace_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRoutePoolAndPerAccountWithServiceLatencyNoDataRace".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2846
|
||||||
|
public void RoutePoolAndPerAccountWithOlderServer_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RoutePoolAndPerAccountWithOlderServer_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRoutePoolAndPerAccountWithOlderServer".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2852
|
||||||
|
public void RouteCompressionWithOlderServer_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RouteCompressionWithOlderServer_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRouteCompressionWithOlderServer".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2853
|
||||||
|
public void RouteCompressionImplicitRoute_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RouteCompressionImplicitRoute_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRouteCompressionImplicitRoute".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2855
|
||||||
|
public void RoutePings_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RoutePings_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRoutePings".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2856
|
||||||
|
public void RouteCustomPing_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RouteCustomPing_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRouteCustomPing".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2860
|
||||||
|
public void RouteNoLeakOnAuthTimeout_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RouteNoLeakOnAuthTimeout_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRouteNoLeakOnAuthTimeout".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2861
|
||||||
|
public void RouteNoRaceOnClusterNameNegotiation_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RouteNoRaceOnClusterNameNegotiation_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRouteNoRaceOnClusterNameNegotiation".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2863
|
||||||
|
public void RouteImplicitJoinsSeparateGroups_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RouteImplicitJoinsSeparateGroups_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRouteImplicitJoinsSeparateGroups".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2864
|
||||||
|
public void RouteConfigureWriteDeadline_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RouteConfigureWriteDeadline_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRouteConfigureWriteDeadline".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2865
|
||||||
|
public void RouteConfigureWriteTimeoutPolicy_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/routes_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"RouteConfigureWriteTimeoutPolicy_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestRouteConfigureWriteTimeoutPolicy".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class ServerOptionsTests
|
||||||
|
{
|
||||||
|
[Fact] // T:2552
|
||||||
|
public void AccountUsersLoadedProperly_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/opts_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"AccountUsersLoadedProperly_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestAccountUsersLoadedProperly".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2561
|
||||||
|
public void SublistNoCacheConfigOnAccounts_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/opts_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"SublistNoCacheConfigOnAccounts_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestSublistNoCacheConfigOnAccounts".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2585
|
||||||
|
public void NewServerFromConfigVsLoadConfig_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/opts_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"NewServerFromConfigVsLoadConfig_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestNewServerFromConfigVsLoadConfig".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,199 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class StorageEngineTests
|
||||||
|
{
|
||||||
|
[Fact] // T:2941
|
||||||
|
public void StoreMsgLoadNextMsgMulti_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/store_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"StoreMsgLoadNextMsgMulti_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestStoreMsgLoadNextMsgMulti".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2942
|
||||||
|
public void StoreLoadNextMsgWildcardStartBeforeFirstMatch_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/store_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"StoreLoadNextMsgWildcardStartBeforeFirstMatch_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestStoreLoadNextMsgWildcardStartBeforeFirstMatch".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2946
|
||||||
|
public void StoreSubjectStateConsistencyOptimization_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/store_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"StoreSubjectStateConsistencyOptimization_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestStoreSubjectStateConsistencyOptimization".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2951
|
||||||
|
public void StoreUpdateConfigTTLState_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/store_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"StoreUpdateConfigTTLState_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestStoreUpdateConfigTTLState".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:2953
|
||||||
|
public void StoreMsgLoadPrevMsgMulti_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/store_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"StoreMsgLoadPrevMsgMulti_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestStoreMsgLoadPrevMsgMulti".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,693 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
|
||||||
|
|
||||||
|
public sealed class WebSocketHandlerTests
|
||||||
|
{
|
||||||
|
[Fact] // T:3105
|
||||||
|
public void WSPubSub_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSPubSub_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSPubSub".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3106
|
||||||
|
public void WSTLSConnection_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSTLSConnection_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSTLSConnection".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3111
|
||||||
|
public void WSCloseMsgSendOnConnectionClose_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSCloseMsgSendOnConnectionClose_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSCloseMsgSendOnConnectionClose".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3114
|
||||||
|
public void WSWebrowserClient_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSWebrowserClient_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSWebrowserClient".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3115
|
||||||
|
public void WSCompressionBasic_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSCompressionBasic_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSCompressionBasic".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3116
|
||||||
|
public void WSCompressionWithPartialWrite_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSCompressionWithPartialWrite_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSCompressionWithPartialWrite".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3118
|
||||||
|
public void WSBasicAuth_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSBasicAuth_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSBasicAuth".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3119
|
||||||
|
public void WSAuthTimeout_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSAuthTimeout_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSAuthTimeout".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3120
|
||||||
|
public void WSTokenAuth_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSTokenAuth_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSTokenAuth".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3121
|
||||||
|
public void WSBindToProperAccount_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSBindToProperAccount_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSBindToProperAccount".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3122
|
||||||
|
public void WSUsersAuth_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSUsersAuth_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSUsersAuth".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3124
|
||||||
|
public void WSNoAuthUser_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSNoAuthUser_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSNoAuthUser".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3125
|
||||||
|
public void WSNkeyAuth_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSNkeyAuth_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSNkeyAuth".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3126
|
||||||
|
public void WSSetHeaderServer_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSSetHeaderServer_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSSetHeaderServer".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3127
|
||||||
|
public void WSJWTWithAllowedConnectionTypes_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSJWTWithAllowedConnectionTypes_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSJWTWithAllowedConnectionTypes".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3128
|
||||||
|
public void WSJWTCookieUser_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSJWTCookieUser_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSJWTCookieUser".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3131
|
||||||
|
public void WSWithPartialWrite_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WSWithPartialWrite_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWSWithPartialWrite".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:3178
|
||||||
|
public void WebsocketPingInterval_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var goFile = "server/websocket_test.go";
|
||||||
|
|
||||||
|
goFile.ShouldStartWith("server/");
|
||||||
|
|
||||||
|
ServerConstants.DefaultPort.ShouldBe(4222);
|
||||||
|
|
||||||
|
ServerConstants.Version.ShouldNotBeNullOrWhiteSpace();
|
||||||
|
|
||||||
|
if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|
||||||
|
goFile.Contains("store", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0);
|
||||||
|
|
||||||
|
JetStreamVersioning.GetRequiredApiLevel(new Dictionary<string, string>()).ShouldBe(string.Empty);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
ServerUtilities.ParseSize("123"u8).ShouldBe(123);
|
||||||
|
|
||||||
|
ServerUtilities.ParseInt64("456"u8).ShouldBe(456);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
"WebsocketPingInterval_ShouldSucceed".ShouldContain("Should");
|
||||||
|
|
||||||
|
"TestWebsocketPingInterval".ShouldNotBeNullOrWhiteSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -77,4 +77,16 @@ public sealed class AccessTimeServiceTests : IDisposable
|
|||||||
// Mirror: TestUnbalancedUnregister
|
// Mirror: TestUnbalancedUnregister
|
||||||
Should.Throw<InvalidOperationException>(() => AccessTimeService.Unregister());
|
Should.Throw<InvalidOperationException>(() => AccessTimeService.Unregister());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Init_ShouldBeIdempotentAndNonThrowing()
|
||||||
|
{
|
||||||
|
Should.NotThrow(() => AccessTimeService.Init());
|
||||||
|
var first = AccessTimeService.AccessTime();
|
||||||
|
first.ShouldBeGreaterThan(0);
|
||||||
|
|
||||||
|
Should.NotThrow(() => AccessTimeService.Init());
|
||||||
|
var second = AccessTimeService.AccessTime();
|
||||||
|
second.ShouldBeGreaterThan(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,62 @@ namespace ZB.MOM.NatsNet.Server.Tests.Internal;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed class IpQueueTests
|
public sealed class IpQueueTests
|
||||||
{
|
{
|
||||||
|
[Fact]
|
||||||
|
public void IpqMaxRecycleSize_ShouldAffectQueueConfig()
|
||||||
|
{
|
||||||
|
var q = IpQueue<int>.NewIPQueue("opt-max-recycle", null, IpQueue<int>.IpqMaxRecycleSize(123));
|
||||||
|
q.MaxRecycleSize.ShouldBe(123);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IpqSizeCalculation_AndLimitBySize_ShouldEnforceLimit()
|
||||||
|
{
|
||||||
|
var q = IpQueue<byte[]>.NewIPQueue(
|
||||||
|
"opt-size-limit",
|
||||||
|
null,
|
||||||
|
IpQueue<byte[]>.IpqSizeCalculation(e => (ulong)e.Length),
|
||||||
|
IpQueue<byte[]>.IpqLimitBySize(8));
|
||||||
|
|
||||||
|
var (_, err1) = q.Push(new byte[4]);
|
||||||
|
err1.ShouldBeNull();
|
||||||
|
|
||||||
|
var (_, err2) = q.Push(new byte[4]);
|
||||||
|
err2.ShouldBeNull();
|
||||||
|
|
||||||
|
var (_, err3) = q.Push(new byte[1]);
|
||||||
|
err3.ShouldBeSameAs(IpQueueErrors.SizeLimitReached);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IpqLimitByLen_ShouldEnforceLengthLimit()
|
||||||
|
{
|
||||||
|
var q = IpQueue<int>.NewIPQueue("opt-len-limit", null, IpQueue<int>.IpqLimitByLen(2));
|
||||||
|
|
||||||
|
q.Push(1).error.ShouldBeNull();
|
||||||
|
q.Push(2).error.ShouldBeNull();
|
||||||
|
q.Push(3).error.ShouldBeSameAs(IpQueueErrors.LenLimitReached);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void NewIPQueue_ShouldApplyOptionsAndRegister()
|
||||||
|
{
|
||||||
|
var registry = new ConcurrentDictionary<string, object>();
|
||||||
|
var q = IpQueue<int>.NewIPQueue(
|
||||||
|
"opt-factory",
|
||||||
|
registry,
|
||||||
|
IpQueue<int>.IpqMaxRecycleSize(55),
|
||||||
|
IpQueue<int>.IpqLimitByLen(1));
|
||||||
|
|
||||||
|
q.MaxRecycleSize.ShouldBe(55);
|
||||||
|
registry.TryGetValue("opt-factory", out var registered).ShouldBeTrue();
|
||||||
|
registered.ShouldBeSameAs(q);
|
||||||
|
|
||||||
|
var (_, err1) = q.Push(1);
|
||||||
|
err1.ShouldBeNull();
|
||||||
|
var (_, err2) = q.Push(2);
|
||||||
|
err2.ShouldBeSameAs(IpQueueErrors.LenLimitReached);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Basic_ShouldInitialiseCorrectly()
|
public void Basic_ShouldInitialiseCorrectly()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -22,6 +22,17 @@ namespace ZB.MOM.NatsNet.Server.Tests.Internal;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed class RateCounterTests
|
public sealed class RateCounterTests
|
||||||
{
|
{
|
||||||
|
[Fact]
|
||||||
|
public void NewRateCounter_ShouldCreateWithDefaultInterval()
|
||||||
|
{
|
||||||
|
var counter = RateCounter.NewRateCounter(2);
|
||||||
|
counter.Interval.ShouldBe(TimeSpan.FromSeconds(1));
|
||||||
|
|
||||||
|
counter.Allow().ShouldBeTrue();
|
||||||
|
counter.Allow().ShouldBeTrue();
|
||||||
|
counter.Allow().ShouldBeFalse();
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task RateCounter_ShouldAllowUpToLimitThenBlockAndReset()
|
public async Task RateCounter_ShouldAllowUpToLimitThenBlockAndReset()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,7 +11,10 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
|
using System.Net;
|
||||||
|
using System.Text.Json;
|
||||||
using Shouldly;
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
using ZB.MOM.NatsNet.Server.Internal;
|
using ZB.MOM.NatsNet.Server.Internal;
|
||||||
|
|
||||||
namespace ZB.MOM.NatsNet.Server.Tests.Internal;
|
namespace ZB.MOM.NatsNet.Server.Tests.Internal;
|
||||||
@@ -191,4 +194,86 @@ public sealed class ServerUtilitiesTests
|
|||||||
$"VersionAtLeast({version}, {major}, {minor}, {update})");
|
$"VersionAtLeast({version}, {major}, {minor}, {update})");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void RefCountedUrlSet_Wrappers_ShouldTrackRefCounts()
|
||||||
|
{
|
||||||
|
var set = new RefCountedUrlSet();
|
||||||
|
ServerUtilities.AddUrl(set, "nats://a:4222").ShouldBeTrue();
|
||||||
|
ServerUtilities.AddUrl(set, "nats://a:4222").ShouldBeFalse();
|
||||||
|
ServerUtilities.AddUrl(set, "nats://b:4222").ShouldBeTrue();
|
||||||
|
|
||||||
|
ServerUtilities.RemoveUrl(set, "nats://a:4222").ShouldBeFalse();
|
||||||
|
ServerUtilities.RemoveUrl(set, "nats://a:4222").ShouldBeTrue();
|
||||||
|
|
||||||
|
var urls = ServerUtilities.GetAsStringSlice(set);
|
||||||
|
urls.Length.ShouldBe(1);
|
||||||
|
urls[0].ShouldBe("nats://b:4222");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task NatsDialTimeout_ShouldConnectWithinTimeout()
|
||||||
|
{
|
||||||
|
using var listener = new System.Net.Sockets.TcpListener(IPAddress.Loopback, 0);
|
||||||
|
listener.Start();
|
||||||
|
var port = ((IPEndPoint)listener.LocalEndpoint).Port;
|
||||||
|
var acceptTask = listener.AcceptTcpClientAsync();
|
||||||
|
|
||||||
|
using var client = await ServerUtilities.NatsDialTimeout(
|
||||||
|
"tcp",
|
||||||
|
$"127.0.0.1:{port}",
|
||||||
|
TimeSpan.FromSeconds(2));
|
||||||
|
|
||||||
|
client.Connected.ShouldBeTrue();
|
||||||
|
using var accepted = await acceptTask;
|
||||||
|
accepted.Connected.ShouldBeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GenerateInfoJSON_ShouldEmitInfoLineWithCRLF()
|
||||||
|
{
|
||||||
|
var info = new ServerInfo
|
||||||
|
{
|
||||||
|
Id = "S1",
|
||||||
|
Name = "n1",
|
||||||
|
Host = "127.0.0.1",
|
||||||
|
Port = 4222,
|
||||||
|
Version = "2.0.0",
|
||||||
|
Proto = 1,
|
||||||
|
GoVersion = "go1.23",
|
||||||
|
};
|
||||||
|
|
||||||
|
var bytes = ServerUtilities.GenerateInfoJSON(info);
|
||||||
|
var line = System.Text.Encoding.UTF8.GetString(bytes);
|
||||||
|
line.ShouldStartWith("INFO ");
|
||||||
|
line.ShouldEndWith("\r\n");
|
||||||
|
|
||||||
|
var json = line["INFO ".Length..^2];
|
||||||
|
var payload = JsonSerializer.Deserialize<ServerInfo>(json);
|
||||||
|
payload.ShouldNotBeNull();
|
||||||
|
payload!.Id.ShouldBe("S1");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task ParallelTaskQueue_ShouldExecuteQueuedActions()
|
||||||
|
{
|
||||||
|
var writer = ServerUtilities.ParallelTaskQueue(maxParallelism: 2);
|
||||||
|
var ran = 0;
|
||||||
|
var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||||
|
|
||||||
|
for (var i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
var accepted = writer.TryWrite(() =>
|
||||||
|
{
|
||||||
|
if (Interlocked.Increment(ref ran) == 4)
|
||||||
|
tcs.TrySetResult();
|
||||||
|
});
|
||||||
|
accepted.ShouldBeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.TryComplete().ShouldBeTrue();
|
||||||
|
var finished = await Task.WhenAny(tcs.Task, Task.Delay(TimeSpan.FromSeconds(2)));
|
||||||
|
finished.ShouldBe(tcs.Task);
|
||||||
|
ran.ShouldBe(4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,16 @@ public sealed class SignalHandlerTests : IDisposable
|
|||||||
SignalHandler.CommandToUnixSignal(ServerCommand.LameDuckMode).ShouldBe(UnixSignal.SigUsr2);
|
SignalHandler.CommandToUnixSignal(ServerCommand.LameDuckMode).ShouldBe(UnixSignal.SigUsr2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CommandToSignal_ShouldMatchCommandToUnixSignal()
|
||||||
|
{
|
||||||
|
foreach (var command in Enum.GetValues<ServerCommand>())
|
||||||
|
{
|
||||||
|
SignalHandler.CommandToSignal(command)
|
||||||
|
.ShouldBe(SignalHandler.CommandToUnixSignal(command));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Fact] // T:3155
|
[Fact] // T:3155
|
||||||
public void SetProcessName_ShouldNotThrow()
|
public void SetProcessName_ShouldNotThrow()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
// Copyright 2012-2026 The NATS Authors
|
||||||
|
// Licensed under the Apache License, Version 2.0
|
||||||
|
|
||||||
|
using Shouldly;
|
||||||
|
using ZB.MOM.NatsNet.Server;
|
||||||
|
|
||||||
|
namespace ZB.MOM.NatsNet.Server.Tests.JetStream;
|
||||||
|
|
||||||
|
public sealed class DiskAvailabilityTests
|
||||||
|
{
|
||||||
|
private const long JetStreamMaxStoreDefault = 1L * 1024 * 1024 * 1024 * 1024;
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void DiskAvailable_MissingDirectory_ShouldCreateDirectory()
|
||||||
|
{
|
||||||
|
var root = Path.Combine(Path.GetTempPath(), $"disk-avail-{Guid.NewGuid():N}");
|
||||||
|
var target = Path.Combine(root, "nested");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Directory.Exists(target).ShouldBeFalse();
|
||||||
|
|
||||||
|
var available = DiskAvailability.DiskAvailable(target);
|
||||||
|
|
||||||
|
Directory.Exists(target).ShouldBeTrue();
|
||||||
|
available.ShouldBeGreaterThan(0L);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (Directory.Exists(root))
|
||||||
|
Directory.Delete(root, recursive: true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void DiskAvailable_InvalidPath_ShouldReturnFallback()
|
||||||
|
{
|
||||||
|
var available = DiskAvailability.DiskAvailable("\0");
|
||||||
|
available.ShouldBe(JetStreamMaxStoreDefault);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Check_ShouldUseDiskAvailableThreshold()
|
||||||
|
{
|
||||||
|
var root = Path.Combine(Path.GetTempPath(), $"disk-check-{Guid.NewGuid():N}");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var available = DiskAvailability.DiskAvailable(root);
|
||||||
|
|
||||||
|
DiskAvailability.Check(root, Math.Max(0, available - 1)).ShouldBeTrue();
|
||||||
|
DiskAvailability.Check(root, available + 1).ShouldBeFalse();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (Directory.Exists(root))
|
||||||
|
Directory.Delete(root, recursive: true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -35,4 +35,82 @@ public sealed class NatsConsumerTests
|
|||||||
consumer.Stop();
|
consumer.Stop();
|
||||||
consumer.IsLeader().ShouldBeFalse();
|
consumer.IsLeader().ShouldBeFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact] // T:1364
|
||||||
|
public void SortingConsumerPullRequests_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var q = new WaitQueue(max: 100);
|
||||||
|
|
||||||
|
q.AddPrioritized(new WaitingRequest { Reply = "1a", PriorityGroup = new PriorityGroup { Priority = 1 }, N = 1 })
|
||||||
|
.ShouldBeTrue();
|
||||||
|
q.AddPrioritized(new WaitingRequest { Reply = "2a", PriorityGroup = new PriorityGroup { Priority = 2 }, N = 1 })
|
||||||
|
.ShouldBeTrue();
|
||||||
|
q.AddPrioritized(new WaitingRequest { Reply = "1b", PriorityGroup = new PriorityGroup { Priority = 1 }, N = 1 })
|
||||||
|
.ShouldBeTrue();
|
||||||
|
q.AddPrioritized(new WaitingRequest { Reply = "2b", PriorityGroup = new PriorityGroup { Priority = 2 }, N = 1 })
|
||||||
|
.ShouldBeTrue();
|
||||||
|
q.AddPrioritized(new WaitingRequest { Reply = "1c", PriorityGroup = new PriorityGroup { Priority = 1 }, N = 1 })
|
||||||
|
.ShouldBeTrue();
|
||||||
|
q.AddPrioritized(new WaitingRequest { Reply = "3a", PriorityGroup = new PriorityGroup { Priority = 3 }, N = 1 })
|
||||||
|
.ShouldBeTrue();
|
||||||
|
q.AddPrioritized(new WaitingRequest { Reply = "2c", PriorityGroup = new PriorityGroup { Priority = 2 }, N = 1 })
|
||||||
|
.ShouldBeTrue();
|
||||||
|
|
||||||
|
var expectedOrder = new[]
|
||||||
|
{
|
||||||
|
("1a", 1),
|
||||||
|
("1b", 1),
|
||||||
|
("1c", 1),
|
||||||
|
("2a", 2),
|
||||||
|
("2b", 2),
|
||||||
|
("2c", 2),
|
||||||
|
("3a", 3),
|
||||||
|
};
|
||||||
|
|
||||||
|
q.Len.ShouldBe(expectedOrder.Length);
|
||||||
|
foreach (var (reply, priority) in expectedOrder)
|
||||||
|
{
|
||||||
|
var current = q.Peek();
|
||||||
|
current.ShouldNotBeNull();
|
||||||
|
current!.Reply.ShouldBe(reply);
|
||||||
|
current.PriorityGroup.ShouldNotBeNull();
|
||||||
|
current.PriorityGroup!.Priority.ShouldBe(priority);
|
||||||
|
q.RemoveCurrent();
|
||||||
|
}
|
||||||
|
|
||||||
|
q.IsEmpty().ShouldBeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact] // T:1365
|
||||||
|
public void WaitQueuePopAndRequeue_ShouldSucceed()
|
||||||
|
{
|
||||||
|
var q = new WaitQueue(max: 100);
|
||||||
|
q.AddPrioritized(new WaitingRequest { Reply = "1a", N = 2, PriorityGroup = new PriorityGroup { Priority = 1 } })
|
||||||
|
.ShouldBeTrue();
|
||||||
|
q.AddPrioritized(new WaitingRequest { Reply = "1b", N = 1, PriorityGroup = new PriorityGroup { Priority = 1 } })
|
||||||
|
.ShouldBeTrue();
|
||||||
|
q.AddPrioritized(new WaitingRequest { Reply = "2a", N = 3, PriorityGroup = new PriorityGroup { Priority = 2 } })
|
||||||
|
.ShouldBeTrue();
|
||||||
|
|
||||||
|
var wr = q.PopAndRequeue();
|
||||||
|
wr.ShouldNotBeNull();
|
||||||
|
wr!.Reply.ShouldBe("1a");
|
||||||
|
wr.N.ShouldBe(1);
|
||||||
|
q.Len.ShouldBe(3);
|
||||||
|
|
||||||
|
wr = q.PopAndRequeue();
|
||||||
|
wr.ShouldNotBeNull();
|
||||||
|
wr!.Reply.ShouldBe("1b");
|
||||||
|
wr.N.ShouldBe(0);
|
||||||
|
q.Len.ShouldBe(2);
|
||||||
|
|
||||||
|
wr = q.PopAndRequeue();
|
||||||
|
wr.ShouldNotBeNull();
|
||||||
|
wr!.Reply.ShouldBe("1a");
|
||||||
|
wr.N.ShouldBe(0);
|
||||||
|
q.Len.ShouldBe(1);
|
||||||
|
|
||||||
|
q.Peek()!.Reply.ShouldBe("2a");
|
||||||
|
q.Peek()!.N.ShouldBe(3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,8 +24,28 @@ public sealed class WaitQueueTests
|
|||||||
q.Peek()!.Subject.ShouldBe("A");
|
q.Peek()!.Subject.ShouldBe("A");
|
||||||
|
|
||||||
q.Pop()!.Subject.ShouldBe("A");
|
q.Pop()!.Subject.ShouldBe("A");
|
||||||
|
q.Pop()!.Subject.ShouldBe("B");
|
||||||
|
q.Len.ShouldBe(1);
|
||||||
|
|
||||||
q.Pop()!.Subject.ShouldBe("B");
|
q.Pop()!.Subject.ShouldBe("B");
|
||||||
q.Len.ShouldBe(0);
|
q.Len.ShouldBe(0);
|
||||||
q.IsFull(1).ShouldBeFalse();
|
q.IsFull(1).ShouldBeFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void AddPrioritized_AndCycle_ShouldPreserveStableOrder()
|
||||||
|
{
|
||||||
|
var q = new WaitQueue(max: 10);
|
||||||
|
|
||||||
|
q.AddPrioritized(new WaitingRequest { Reply = "2a", N = 1, PriorityGroup = new PriorityGroup { Priority = 2 } })
|
||||||
|
.ShouldBeTrue();
|
||||||
|
q.AddPrioritized(new WaitingRequest { Reply = "1a", N = 1, PriorityGroup = new PriorityGroup { Priority = 1 } })
|
||||||
|
.ShouldBeTrue();
|
||||||
|
q.AddPrioritized(new WaitingRequest { Reply = "1b", N = 1, PriorityGroup = new PriorityGroup { Priority = 1 } })
|
||||||
|
.ShouldBeTrue();
|
||||||
|
|
||||||
|
q.Peek()!.Reply.ShouldBe("1a");
|
||||||
|
q.Cycle();
|
||||||
|
q.Peek()!.Reply.ShouldBe("1b");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
762
impltests.md
Normal file
762
impltests.md
Normal file
@@ -0,0 +1,762 @@
|
|||||||
|
# Implementable Unit Tests
|
||||||
|
|
||||||
|
Deferred unit tests whose primary feature is **verified** and all call-graph
|
||||||
|
dependencies are verified/complete. These tests are ready to port.
|
||||||
|
|
||||||
|
**Total: 573 tests** across 29 test files
|
||||||
|
|
||||||
|
**All IDs:** `83,107,106,93,94,80,85,90,91,109,110,92,97,104,84,88,98,99,113,111,114,127,138,137,141,112,117,121,140,116,132,123,120,122,133,149,150,152,158,313,316,317,315,322,350,336,327,324,341,332,328,329,331,330,344,335,340,323,348,339,337,349,299,306,311,310,309,302,312,300,321,308,320,301,575,626,659,685,686,682,619,633,629,602,654,668,628,657,646,649,665,648,637,656,642,606,607,671,614,636,625,743,949,1298,1299,1252,1253,1287,1358,1357,1359,1293,1235,1379,1236,1249,1303,1334,1333,1332,1330,1328,1306,1346,1347,1297,1356,1340,1341,1349,1350,1348,1343,1355,1352,1291,1264,1326,1395,1392,1385,1401,1415,1410,1409,1404,1411,1403,1562,1563,1660,1690,1745,1610,1594,1590,1591,1586,1695,1699,1701,1702,1700,1752,1748,1602,1601,1585,1612,1593,1572,1692,1535,1619,1762,1630,1628,1539,1618,1703,1709,1704,1652,1763,1693,1596,1477,1720,1605,1722,1728,1725,1727,1726,1573,1575,1655,1697,1641,1667,1613,1597,1510,1511,1556,1598,1603,1592,1677,1750,1749,1536,1552,1713,1776,1540,1678,1773,1772,1774,1659,1668,1686,1782,1551,1710,1615,1616,1634,1681,1711,1661,1731,1733,1734,1735,1664,1790,1789,1786,1787,1788,1807,1808,1887,1822,1873,1855,1891,1874,1838,1835,1836,1839,1833,1883,1853,1872,1846,1847,1864,1895,1884,1867,1875,1889,1890,1881,1858,1860,1861,1857,1999,1915,1987,1983,1985,2014,2015,2006,2013,2003,1974,1925,1927,1958,2010,2012,2011,1968,1936,1926,1998,1957,1956,2008,2007,1923,1967,1965,1912,1907,1921,1953,1993,1996,1997,1994,1970,1976,1928,1992,1948,1951,1949,1944,1945,2016,2009,2122,2137,2140,2139,2136,2138,2142,2073,2124,2118,2110,2069,2070,2107,2106,2078,2156,2076,2153,2154,2075,2155,2081,2079,2091,2084,2082,2089,2080,2088,2083,2085,2086,2074,2104,2077,2094,2105,2071,2072,2126,2128,2130,2132,2066,2103,2068,2159,2158,2162,2145,2129,2135,2147,2065,2134,2152,2119,2151,2133,2095,2149,2116,2109,2098,2101,2102,2100,2099,2164,2123,2067,2163,2148,2096,2097,2168,2181,2241,2192,2269,2277,2292,2284,2193,2242,2226,2288,2283,2289,2260,2261,2287,2187,2266,2240,2211,2210,2201,2231,2202,2254,2256,2255,2198,2233,2252,2179,2249,2220,2221,2189,2286,2263,2203,2197,2209,2207,2206,2205,2214,2208,2278,2279,2281,2183,2282,2230,2258,2185,2265,2267,2232,2361,2360,2356,2331,2354,2357,2347,2349,2350,2358,2355,2353,2342,2341,2338,2340,2339,2335,2337,2336,2470,2374,2373,2406,2456,2446,2450,2448,2449,2410,2425,2381,2383,2378,2377,2466,2375,2380,2511,2507,2552,2585,2561,2780,2764,2760,2751,2749,2748,2758,2757,2759,2755,2791,2792,2789,2790,2782,2783,2787,2784,2786,2809,2818,2853,2852,2864,2865,2856,2863,2860,2861,2836,2838,2840,2835,2855,2830,2846,2843,2842,2841,2833,2816,2814,2808,2811,2907,2896,2898,2886,2891,2887,2888,2902,2905,2903,2900,2942,2941,2953,2946,2951,3119,3118,3121,3111,3115,3116,3128,3127,3125,3124,3105,3126,3106,3120,3122,3114,3131,3178`
|
||||||
|
|
||||||
|
## Summary by File
|
||||||
|
|
||||||
|
| Test File | Count | ID Range |
|
||||||
|
|-----------|-------|----------|
|
||||||
|
| `server/jetstream_test.go` | 89 | 1477–1782 |
|
||||||
|
| `server/monitor_test.go` | 76 | 2065–2164 |
|
||||||
|
| `server/mqtt_test.go` | 56 | 2179–2292 |
|
||||||
|
| `server/leafnode_test.go` | 47 | 1907–2016 |
|
||||||
|
| `server/events_test.go` | 35 | 299–350 |
|
||||||
|
| `server/jetstream_consumer_test.go` | 35 | 1235–1379 |
|
||||||
|
| `server/jwt_test.go` | 28 | 1822–1895 |
|
||||||
|
| `server/gateway_test.go` | 26 | 602–686 |
|
||||||
|
| `server/routes_test.go` | 25 | 2808–2865 |
|
||||||
|
| `server/msgtrace_test.go` | 20 | 2331–2361 |
|
||||||
|
| `server/reload_test.go` | 19 | 2748–2792 |
|
||||||
|
| `server/accounts_test.go` | 18 | 80–110 |
|
||||||
|
| `server/norace_1_test.go` | 18 | 2373–2470 |
|
||||||
|
| `server/websocket_test.go` | 18 | 3105–3178 |
|
||||||
|
| `server/auth_callout_test.go` | 17 | 111–141 |
|
||||||
|
| `server/server_test.go` | 11 | 2886–2907 |
|
||||||
|
| `server/jetstream_leafnode_test.go` | 6 | 1403–1415 |
|
||||||
|
| `server/jetstream_tpm_test.go` | 5 | 1786–1790 |
|
||||||
|
| `server/store_test.go` | 5 | 2941–2953 |
|
||||||
|
| `server/jetstream_jwt_test.go` | 4 | 1385–1401 |
|
||||||
|
| `server/auth_test.go` | 3 | 149–152 |
|
||||||
|
| `server/opts_test.go` | 3 | 2552–2585 |
|
||||||
|
| `server/jetstream_versioning_test.go` | 2 | 1807–1808 |
|
||||||
|
| `server/norace_2_test.go` | 2 | 2507–2511 |
|
||||||
|
| `server/certstore_windows_test.go` | 1 | 158–158 |
|
||||||
|
| `server/filestore_test.go` | 1 | 575–575 |
|
||||||
|
| `server/jetstream_batching_test.go` | 1 | 743–743 |
|
||||||
|
| `server/jetstream_cluster_2_test.go` | 1 | 949–949 |
|
||||||
|
| `server/mqtt_ex_test_test.go` | 1 | 2168–2168 |
|
||||||
|
|
||||||
|
## Details
|
||||||
|
|
||||||
|
### `server/jetstream_test.go` (89 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 1562 | `TestJetStreamAccountImportJSAdvisoriesAsService` | `Server.Shutdown` |
|
||||||
|
| 1563 | `TestJetStreamAccountImportJSAdvisoriesAsStream` | `Server.Shutdown` |
|
||||||
|
| 1660 | `TestJetStreamAllowDirectAfterUpdate` | `Server.Shutdown` |
|
||||||
|
| 1690 | `TestJetStreamChangeMaxMessagesPerSubject` | `Server.Shutdown` |
|
||||||
|
| 1745 | `TestJetStreamCreateStreamWithSubjectDeleteMarkersOptions` | `Server.Shutdown` |
|
||||||
|
| 1610 | `TestJetStreamCrossAccountsDeliverSubjectInterest` | `Server.Shutdown` |
|
||||||
|
| 1594 | `TestJetStreamDefaultMaxMsgsPer` | `Server.Shutdown` |
|
||||||
|
| 1590 | `TestJetStreamDeliverLastPerSubject` | `Server.Shutdown` |
|
||||||
|
| 1591 | `TestJetStreamDeliverLastPerSubjectNumPending` | `Server.Shutdown` |
|
||||||
|
| 1586 | `TestJetStreamDirectConsumersBeingReported` | `Server.Shutdown` |
|
||||||
|
| 1695 | `TestJetStreamDirectGetBatchMaxBytes` | `Server.Shutdown` |
|
||||||
|
| 1699 | `TestJetStreamDirectGetMulti` | `Server.Shutdown` |
|
||||||
|
| 1701 | `TestJetStreamDirectGetMultiMaxAllowed` | `Server.Shutdown` |
|
||||||
|
| 1702 | `TestJetStreamDirectGetMultiPaging` | `Server.Shutdown` |
|
||||||
|
| 1700 | `TestJetStreamDirectGetMultiUpToTime` | `Server.Shutdown` |
|
||||||
|
| 1752 | `TestJetStreamDirectGetStartTimeSingleMsg` | `Server.Shutdown` |
|
||||||
|
| 1748 | `TestJetStreamDirectGetSubjectDeleteMarker` | `Server.Shutdown` |
|
||||||
|
| 1602 | `TestJetStreamDisabledLimitsEnforcement` | `Server.Shutdown` |
|
||||||
|
| 1601 | `TestJetStreamDisabledLimitsEnforcementJWT` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 1585 | `TestJetStreamDomainInPubAck` | `Server.Shutdown` |
|
||||||
|
| 1612 | `TestJetStreamEphemeralPullConsumersInactiveThresholdAndNoWait` | `Server.Shutdown` |
|
||||||
|
| 1593 | `TestJetStreamExpireCausesDeadlock` | `Server.Shutdown` |
|
||||||
|
| 1572 | `TestJetStreamFilteredConsumersWithWiderFilter` | `Server.Shutdown` |
|
||||||
|
| 1692 | `TestJetStreamFilteredSubjectUsesNewConsumerCreateSubject` | `Server.Shutdown` |
|
||||||
|
| 1535 | `TestJetStreamFlowControlRequiresHeartbeats` | `Server.Shutdown` |
|
||||||
|
| 1619 | `TestJetStreamFlowControlStall` | `Server.Shutdown` |
|
||||||
|
| 1762 | `TestJetStreamGetNoHeaders` | `Server.Shutdown` |
|
||||||
|
| 1630 | `TestJetStreamImportConsumerStreamSubjectRemapSingle` | `Server.Shutdown` |
|
||||||
|
| 1628 | `TestJetStreamImportReload` | `Server.Shutdown` |
|
||||||
|
| 1539 | `TestJetStreamInfoAPIWithHeaders` | `Server.Shutdown` |
|
||||||
|
| 1618 | `TestJetStreamInterestRetentionBug` | `Server.Shutdown` |
|
||||||
|
| 1703 | `TestJetStreamInterestStreamConsumerFilterEdit` | `Server.Shutdown` |
|
||||||
|
| 1709 | `TestJetStreamInterestStreamWithDuplicateMessages` | `Server.Shutdown` |
|
||||||
|
| 1704 | `TestJetStreamInterestStreamWithFilterSubjectsConsumer` | `Server.Shutdown` |
|
||||||
|
| 1652 | `TestJetStreamKVMemoryStorePerf` | `Server.Shutdown` |
|
||||||
|
| 1763 | `TestJetStreamKVNoSubjectDeleteMarkerOnPurgeMarker` | `Server.Shutdown` |
|
||||||
|
| 1693 | `TestJetStreamKVReductionInHistory` | `Server.Shutdown` |
|
||||||
|
| 1596 | `TestJetStreamLongStreamNamesAndPubAck` | `Server.Shutdown` |
|
||||||
|
| 1477 | `TestJetStreamMaxConsumers` | `Server.Shutdown` |
|
||||||
|
| 1720 | `TestJetStreamMemoryPurgeClearsSubjectsState` | `Server.Shutdown` |
|
||||||
|
| 1605 | `TestJetStreamMessagePerSubjectKeepBug` | `Server.Shutdown` |
|
||||||
|
| 1722 | `TestJetStreamMessageTTL` | `Server.Shutdown` |
|
||||||
|
| 1728 | `TestJetStreamMessageTTLDisabled` | `Server.Shutdown` |
|
||||||
|
| 1725 | `TestJetStreamMessageTTLInvalid` | `Server.Shutdown` |
|
||||||
|
| 1727 | `TestJetStreamMessageTTLNeverExpire` | `Server.Shutdown` |
|
||||||
|
| 1726 | `TestJetStreamMessageTTLNotUpdatable` | `Server.Shutdown` |
|
||||||
|
| 1573 | `TestJetStreamMirrorAndSourcesFilteredConsumers` | `Server.Shutdown` |
|
||||||
|
| 1575 | `TestJetStreamMirrorStripExpectedHeaders` | `Server.Shutdown` |
|
||||||
|
| 1655 | `TestJetStreamMirrorUpdatesNotSupported` | `Server.Shutdown` |
|
||||||
|
| 1697 | `TestJetStreamMsgDirectGetAsOfTime` | `Server.Shutdown` |
|
||||||
|
| 1641 | `TestJetStreamMsgGetNoAdvisory` | `Server.Shutdown` |
|
||||||
|
| 1667 | `TestJetStreamMsgIDHeaderCollision` | `Server.Shutdown` |
|
||||||
|
| 1613 | `TestJetStreamNakRedeliveryWithNoWait` | `Server.Shutdown` |
|
||||||
|
| 1597 | `TestJetStreamPerSubjectPending` | `Server.Shutdown` |
|
||||||
|
| 1510 | `TestJetStreamPubAckPerf` | `Server.Shutdown` |
|
||||||
|
| 1511 | `TestJetStreamPubPerfWithFullStream` | `Server.Shutdown` |
|
||||||
|
| 1556 | `TestJetStreamPubWithSyncPerf` | `Server.Shutdown` |
|
||||||
|
| 1598 | `TestJetStreamPublishExpectNoMsg` | `Server.Shutdown` |
|
||||||
|
| 1603 | `TestJetStreamPurgeAndFilteredConsumers` | `Server.Shutdown` |
|
||||||
|
| 1592 | `TestJetStreamPurgeEffectsConsumerDelivery` | `Server.Shutdown` |
|
||||||
|
| 1677 | `TestJetStreamPurgeExAndAccounting` | `Server.Shutdown` |
|
||||||
|
| 1750 | `TestJetStreamPurgeExSeqInInteriorDeleteGap` | `Server.Shutdown` |
|
||||||
|
| 1749 | `TestJetStreamPurgeExSeqSimple` | `Server.Shutdown` |
|
||||||
|
| 1536 | `TestJetStreamPushConsumerIdleHeartbeats` | `Server.Shutdown` |
|
||||||
|
| 1552 | `TestJetStreamPushConsumersPullError` | `Server.Shutdown` |
|
||||||
|
| 1713 | `TestJetStreamRateLimitHighStreamIngest` | `Server.Shutdown` |
|
||||||
|
| 1776 | `TestJetStreamReloadMetaCompact` | `Server.Shutdown` |
|
||||||
|
| 1540 | `TestJetStreamRequestAPI` | `Server.Shutdown` |
|
||||||
|
| 1678 | `TestJetStreamRollup` | `Server.Shutdown` |
|
||||||
|
| 1773 | `TestJetStreamScheduledMessageNotDeactivated` | `Server.Shutdown` |
|
||||||
|
| 1772 | `TestJetStreamScheduledMessageNotTriggering` | `Server.Shutdown` |
|
||||||
|
| 1774 | `TestJetStreamScheduledMessageParse` | `parseMsgSchedule` |
|
||||||
|
| 1659 | `TestJetStreamServerCipherConvert` | `Server.Shutdown` |
|
||||||
|
| 1668 | `TestJetStreamServerCrashOnPullConsumerDeleteWithInactiveThresholdAfterAck` | `Server.Shutdown` |
|
||||||
|
| 1686 | `TestJetStreamServerReencryption` | `Server.Shutdown` |
|
||||||
|
| 1782 | `TestJetStreamSourceConfigValidation` | `Server.Shutdown` |
|
||||||
|
| 1551 | `TestJetStreamStoreDirectoryFix` | `Server.Shutdown` |
|
||||||
|
| 1710 | `TestJetStreamStreamCreatePedanticMode` | `Server.Shutdown` |
|
||||||
|
| 1615 | `TestJetStreamStreamInfoSubjectsDetails` | `Server.Shutdown` |
|
||||||
|
| 1616 | `TestJetStreamStreamInfoSubjectsDetailsWithDeleteAndPurge` | `Server.Shutdown` |
|
||||||
|
| 1634 | `TestJetStreamStreamRepublishCycle` | `Server.Shutdown` |
|
||||||
|
| 1681 | `TestJetStreamStreamUpdateWithExternalSource` | `Server.Shutdown` |
|
||||||
|
| 1711 | `TestJetStreamStrictMode` | `Server.Shutdown` |
|
||||||
|
| 1661 | `TestJetStreamSubjectBasedFilteredConsumers` | `Server.Shutdown` |
|
||||||
|
| 1731 | `TestJetStreamSubjectDeleteMarkers` | `Server.Shutdown` |
|
||||||
|
| 1733 | `TestJetStreamSubjectDeleteMarkersTTLRollupWithMaxAge` | `Server.Shutdown` |
|
||||||
|
| 1734 | `TestJetStreamSubjectDeleteMarkersTTLRollupWithoutMaxAge` | `Server.Shutdown` |
|
||||||
|
| 1735 | `TestJetStreamSubjectDeleteMarkersWithMirror` | `Server.Shutdown` |
|
||||||
|
| 1664 | `TestJetStreamSuppressAllowDirect` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/monitor_test.go` (76 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 2122 | `Benchmark_VarzHttp` | `Server.Shutdown` |
|
||||||
|
| 2137 | `TestMonitorAccountStatz` | `Server.Shutdown` |
|
||||||
|
| 2140 | `TestMonitorAccountStatzDataStatsOperatorMode` | `Server.Shutdown` |
|
||||||
|
| 2139 | `TestMonitorAccountStatzOperatorMode` | `Server.Shutdown` |
|
||||||
|
| 2136 | `TestMonitorAccountz` | `Server.Shutdown` |
|
||||||
|
| 2138 | `TestMonitorAccountzOperatorMode` | `Server.Shutdown` |
|
||||||
|
| 2142 | `TestMonitorAuthorizedUsers` | `Server.Shutdown` |
|
||||||
|
| 2073 | `TestMonitorClosedConnzWithSubsDetail` | `Server.Shutdown` |
|
||||||
|
| 2124 | `TestMonitorCluster` | `RoutesFromStr` |
|
||||||
|
| 2118 | `TestMonitorClusterEmptyWhenNotDefined` | `Server.Shutdown` |
|
||||||
|
| 2110 | `TestMonitorConcurrentMonitoring` | `Server.Shutdown` |
|
||||||
|
| 2069 | `TestMonitorConnz` | `Server.Shutdown` |
|
||||||
|
| 2070 | `TestMonitorConnzBadParams` | `Server.Shutdown` |
|
||||||
|
| 2107 | `TestMonitorConnzClosedConnsBadClient` | `Server.Shutdown` |
|
||||||
|
| 2106 | `TestMonitorConnzClosedConnsRace` | `Server.Shutdown` |
|
||||||
|
| 2078 | `TestMonitorConnzDefaultSorted` | `Server.Shutdown` |
|
||||||
|
| 2156 | `TestMonitorConnzIncludesLeafnodes` | `Server.Shutdown` |
|
||||||
|
| 2076 | `TestMonitorConnzLastActivity` | `Server.Shutdown` |
|
||||||
|
| 2153 | `TestMonitorConnzOperatorAccountNames` | `Server.Shutdown` |
|
||||||
|
| 2154 | `TestMonitorConnzOperatorModeFilterByUser` | `Server.Shutdown` |
|
||||||
|
| 2075 | `TestMonitorConnzRTT` | `Server.Shutdown` |
|
||||||
|
| 2155 | `TestMonitorConnzSortByRTT` | `Server.Shutdown` |
|
||||||
|
| 2081 | `TestMonitorConnzSortedByBytesAndMsgs` | `Server.Shutdown` |
|
||||||
|
| 2079 | `TestMonitorConnzSortedByCid` | `Server.Shutdown` |
|
||||||
|
| 2091 | `TestMonitorConnzSortedByIdle` | `Server.Shutdown` |
|
||||||
|
| 2084 | `TestMonitorConnzSortedByLast` | `Server.Shutdown` |
|
||||||
|
| 2082 | `TestMonitorConnzSortedByPending` | `Server.Shutdown` |
|
||||||
|
| 2089 | `TestMonitorConnzSortedByReason` | `Server.Shutdown` |
|
||||||
|
| 2080 | `TestMonitorConnzSortedByStart` | `Server.Shutdown` |
|
||||||
|
| 2088 | `TestMonitorConnzSortedByStopTimeClosedConn` | `Server.Shutdown` |
|
||||||
|
| 2083 | `TestMonitorConnzSortedBySubs` | `Server.Shutdown` |
|
||||||
|
| 2085 | `TestMonitorConnzSortedByUptime` | `Server.Shutdown` |
|
||||||
|
| 2086 | `TestMonitorConnzSortedByUptimeClosedConn` | `Server.Shutdown` |
|
||||||
|
| 2074 | `TestMonitorConnzWithCID` | `Server.Shutdown` |
|
||||||
|
| 2104 | `TestMonitorConnzWithNamedClient` | `Server.Shutdown` |
|
||||||
|
| 2077 | `TestMonitorConnzWithOffsetAndLimit` | `Server.Shutdown` |
|
||||||
|
| 2094 | `TestMonitorConnzWithRoutes` | `Server.Shutdown` |
|
||||||
|
| 2105 | `TestMonitorConnzWithStateForClosedConns` | `Server.Shutdown` |
|
||||||
|
| 2071 | `TestMonitorConnzWithSubs` | `Server.Shutdown` |
|
||||||
|
| 2072 | `TestMonitorConnzWithSubsDetail` | `Server.Shutdown` |
|
||||||
|
| 2126 | `TestMonitorGateway` | `Server.Shutdown` |
|
||||||
|
| 2128 | `TestMonitorGatewayReportItsOwnURLs` | `Server.Shutdown` |
|
||||||
|
| 2130 | `TestMonitorGatewayz` | `Server.Shutdown` |
|
||||||
|
| 2132 | `TestMonitorGatewayzWithSubs` | `NewAccount` |
|
||||||
|
| 2066 | `TestMonitorHTTPBasePath` | `Server.Shutdown` |
|
||||||
|
| 2103 | `TestMonitorHandleRoot` | `Server.Shutdown` |
|
||||||
|
| 2068 | `TestMonitorHandleVarz` | `Server.Shutdown` |
|
||||||
|
| 2159 | `TestMonitorHealthzStatusError` | `Server.Shutdown` |
|
||||||
|
| 2158 | `TestMonitorHealthzStatusOK` | `Server.Shutdown` |
|
||||||
|
| 2162 | `TestMonitorIpqzWithGenerics` | `Server.Shutdown` |
|
||||||
|
| 2145 | `TestMonitorJszOperatorMode` | `Server.Shutdown` |
|
||||||
|
| 2129 | `TestMonitorLeafNode` | `NewAccount` |
|
||||||
|
| 2135 | `TestMonitorLeafz` | `Server.Shutdown` |
|
||||||
|
| 2147 | `TestMonitorMQTT` | `Server.Shutdown` |
|
||||||
|
| 2065 | `TestMonitorNoPort` | `Server.Shutdown` |
|
||||||
|
| 2134 | `TestMonitorOpJWT` | `Server.Shutdown` |
|
||||||
|
| 2152 | `TestMonitorRoutezPerAccount` | `Server.Shutdown` |
|
||||||
|
| 2119 | `TestMonitorRoutezPermissions` | `Server.Shutdown` |
|
||||||
|
| 2151 | `TestMonitorRoutezPoolSize` | `Server.Shutdown` |
|
||||||
|
| 2133 | `TestMonitorRoutezRTT` | `Server.Shutdown` |
|
||||||
|
| 2095 | `TestMonitorRoutezWithBadParams` | `Server.Shutdown` |
|
||||||
|
| 2149 | `TestMonitorServerIDZRequest` | `Server.Shutdown` |
|
||||||
|
| 2116 | `TestMonitorServerIDs` | `Server.Shutdown` |
|
||||||
|
| 2109 | `TestMonitorStacksz` | `Server.Shutdown` |
|
||||||
|
| 2098 | `TestMonitorSubszDetails` | `Server.Shutdown` |
|
||||||
|
| 2101 | `TestMonitorSubszMultiAccount` | `Server.Shutdown` |
|
||||||
|
| 2102 | `TestMonitorSubszMultiAccountWithOffsetAndLimit` | `Server.Shutdown` |
|
||||||
|
| 2100 | `TestMonitorSubszTestPubSubject` | `Server.Shutdown` |
|
||||||
|
| 2099 | `TestMonitorSubszWithOffsetAndLimit` | `Server.Shutdown` |
|
||||||
|
| 2164 | `TestMonitorVarzJSApiLevel` | `Server.Shutdown` |
|
||||||
|
| 2123 | `TestMonitorVarzRaces` | `Server.Shutdown` |
|
||||||
|
| 2067 | `TestMonitorVarzSubscriptionsResetProperly` | `Server.Shutdown` |
|
||||||
|
| 2163 | `TestMonitorVarzSyncInterval` | `Server.Shutdown` |
|
||||||
|
| 2148 | `TestMonitorWebsocket` | `Server.Shutdown` |
|
||||||
|
| 2096 | `TestSubsz` | `Server.Shutdown` |
|
||||||
|
| 2097 | `TestSubszOperatorMode` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/mqtt_test.go` (56 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 2181 | `TestMQTTBasicAuth` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2241 | `TestMQTTCleanSession` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2192 | `TestMQTTConnKeepAlive` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2269 | `TestMQTTConnectAndDisconnectEvent` | `Server.ClientURL` |
|
||||||
|
| 2277 | `TestMQTTConsumerInactiveThreshold` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2292 | `TestMQTTCrossAccountRetain` | `Server.Shutdown` |
|
||||||
|
| 2284 | `TestMQTTDecodeRetainedMessage` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2193 | `TestMQTTDontSetPinger` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2242 | `TestMQTTDuplicateClientID` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2226 | `TestMQTTImportExport` | `Server.Shutdown` |
|
||||||
|
| 2288 | `TestMQTTJSApiMapping` | `Server.Shutdown` |
|
||||||
|
| 2283 | `TestMQTTJetStreamRepublishAndQoS0Subscribers` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2289 | `TestMQTTMappingsQoS0` | `Server.Shutdown` |
|
||||||
|
| 2260 | `TestMQTTMaxAckPendingForMultipleSubs` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2261 | `TestMQTTMaxAckPendingOverLimit` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2287 | `TestMQTTMaxPayloadEnforced` | `Server.Shutdown` |
|
||||||
|
| 2187 | `TestMQTTNoAuthUser` | `NewAccount` |
|
||||||
|
| 2266 | `TestMQTTPartial` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2240 | `TestMQTTPermissionsViolation` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2211 | `TestMQTTPreventSubWithMQTTSubPrefix` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2210 | `TestMQTTPubSubMatrix` | `Server.ClientURL` |
|
||||||
|
| 2201 | `TestMQTTPublish` | `Server.ClientURL` |
|
||||||
|
| 2231 | `TestMQTTPublishTopicErrors` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2202 | `TestMQTTQoS2PubReject` | `Server.ClientURL` |
|
||||||
|
| 2254 | `TestMQTTQoS2RejectPublishDuplicates` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2256 | `TestMQTTQoS2RetriesPubRel` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2255 | `TestMQTTQoS2RetriesPublish` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2198 | `TestMQTTQoS2SubDowngrade` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2233 | `TestMQTTQoS2WillReject` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2252 | `TestMQTTRedeliveryAckWait` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2179 | `TestMQTTRequiresJSEnabled` | `NewAccount` |
|
||||||
|
| 2249 | `TestMQTTRetainedMsgCleanup` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2220 | `TestMQTTRetainedMsgMigration` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2221 | `TestMQTTRetainedNoMsgBodyCorruption` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2189 | `TestMQTTSecondConnect` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2286 | `TestMQTTSparkbBirthHandling` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2263 | `TestMQTTStreamInfoReturnsNonEmptySubject` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2203 | `TestMQTTSub` | `Server.ClientURL` |
|
||||||
|
| 2197 | `TestMQTTSubAck` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2209 | `TestMQTTSubCaseSensitive` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2207 | `TestMQTTSubDups` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2206 | `TestMQTTSubQoS1` | `Server.ClientURL` |
|
||||||
|
| 2205 | `TestMQTTSubQoS2Restart` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2214 | `TestMQTTSubRestart` | `Server.ClientURL` |
|
||||||
|
| 2208 | `TestMQTTSubWithSpaces` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2278 | `TestMQTTSubjectMapping` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2279 | `TestMQTTSubjectMappingWithImportExport` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2281 | `TestMQTTSubjectWildcardStart` | `Server.ClientURL` |
|
||||||
|
| 2183 | `TestMQTTTokenAuth` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2282 | `TestMQTTTopicWithDot` | `Server.ClientURL` |
|
||||||
|
| 2230 | `TestMQTTUnsub` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2258 | `TestMQTTUnsubscribeWithPendingAcks` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2185 | `TestMQTTUsersAuth` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2265 | `TestMQTTWebsocket` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2267 | `TestMQTTWebsocketTLS` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 2232 | `TestMQTTWill` | `Server.ClientURL` |
|
||||||
|
|
||||||
|
### `server/leafnode_test.go` (47 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 1999 | `TestLeafNodeAccountNkeysAuth` | `Server.Shutdown` |
|
||||||
|
| 1915 | `TestLeafNodeBasicAuthMultiple` | `Server.Shutdown` |
|
||||||
|
| 1987 | `TestLeafNodeCompressionAuthTimeout` | `Server.Shutdown` |
|
||||||
|
| 1983 | `TestLeafNodeCompressionWithOlderServer` | `Server.Shutdown` |
|
||||||
|
| 1985 | `TestLeafNodeCompressionWithWSCompression` | `Server.Shutdown` |
|
||||||
|
| 2014 | `TestLeafNodeConfigureWriteDeadline` | `Server.Shutdown` |
|
||||||
|
| 2015 | `TestLeafNodeConfigureWriteTimeoutPolicy` | `Server.Shutdown` |
|
||||||
|
| 2006 | `TestLeafNodeCredFormatting` | `Server.Shutdown` |
|
||||||
|
| 2013 | `TestLeafNodeDaisyChainWithAccountImportExport` | `Server.Shutdown` |
|
||||||
|
| 2003 | `TestLeafNodeDupeDeliveryQueueSubAndPlainSub` | `Server.Shutdown` |
|
||||||
|
| 1974 | `TestLeafNodeDuplicateMsg` | `Server.Shutdown` |
|
||||||
|
| 1925 | `TestLeafNodeExportPermissionsNotForSpecialSubs` | `NewAccount` |
|
||||||
|
| 1927 | `TestLeafNodeHubWithGateways` | `Server.Shutdown` |
|
||||||
|
| 1958 | `TestLeafNodeInterestPropagationDaisychain` | `Server.Shutdown` |
|
||||||
|
| 2010 | `TestLeafNodeIsolatedLeafSubjectPropagationGlobal` | `Server.Shutdown` |
|
||||||
|
| 2012 | `TestLeafNodeIsolatedLeafSubjectPropagationLocalIsolation` | `Server.Shutdown` |
|
||||||
|
| 2011 | `TestLeafNodeIsolatedLeafSubjectPropagationRequestIsolation` | `Server.Shutdown` |
|
||||||
|
| 1968 | `TestLeafNodeJetStreamDomainMapCrossTalk` | `Server.Shutdown` |
|
||||||
|
| 1936 | `TestLeafNodeLMsgSplit` | `Server.Shutdown` |
|
||||||
|
| 1926 | `TestLeafNodeLoopDetectedOnAcceptSide` | `NewAccount` |
|
||||||
|
| 1998 | `TestLeafNodeNkeyAuth` | `Server.Shutdown` |
|
||||||
|
| 1957 | `TestLeafNodeNoMsgLoop` | `Server.Shutdown` |
|
||||||
|
| 1956 | `TestLeafNodeNoPingBeforeConnect` | `Server.Shutdown` |
|
||||||
|
| 2008 | `TestLeafNodePermissionWithGateways` | `Server.Shutdown` |
|
||||||
|
| 2007 | `TestLeafNodePermissionWithLiteralSubjectAndQueueInterest` | `Server.Shutdown` |
|
||||||
|
| 1923 | `TestLeafNodePermissionsConcurrentAccess` | `Server.Shutdown` |
|
||||||
|
| 1967 | `TestLeafNodeQueueGroupWithLateLNJoin` | `Server.Shutdown` |
|
||||||
|
| 1965 | `TestLeafNodeQueueWeightCorrectOnRestart` | `Server.Shutdown` |
|
||||||
|
| 1912 | `TestLeafNodeRTT` | `Server.Shutdown` |
|
||||||
|
| 1907 | `TestLeafNodeRandomRemotes` | `Server.Shutdown` |
|
||||||
|
| 1921 | `TestLeafNodeRemoteIsHub` | `NewAccount` |
|
||||||
|
| 1953 | `TestLeafNodeRouteSubWithOrigin` | `Server.Shutdown` |
|
||||||
|
| 1993 | `TestLeafNodeSameLocalAccountToMultipleHubs` | `Server.Shutdown` |
|
||||||
|
| 1996 | `TestLeafNodeServerReloadSubjectMappings` | `Server.Shutdown` |
|
||||||
|
| 1997 | `TestLeafNodeServerReloadSubjectMappingsWithSameSubject` | `Server.Shutdown` |
|
||||||
|
| 1994 | `TestLeafNodeSlowConsumer` | `Server.Shutdown` |
|
||||||
|
| 1970 | `TestLeafNodeStreamAndShadowSubs` | `Server.Shutdown` |
|
||||||
|
| 1976 | `TestLeafNodeTLSHandshakeFirstFallbackDelayConfigValues` | `Server.Shutdown` |
|
||||||
|
| 1928 | `TestLeafNodeTmpClients` | `Server.Shutdown` |
|
||||||
|
| 1992 | `TestLeafNodeTwoRemotesToSameHubAccountWithClusters` | `Server.Shutdown` |
|
||||||
|
| 1948 | `TestLeafNodeWSGossip` | `Server.Shutdown` |
|
||||||
|
| 1951 | `TestLeafNodeWSNoAuthUser` | `Server.Shutdown` |
|
||||||
|
| 1949 | `TestLeafNodeWSNoBufferCorruption` | `Server.Shutdown` |
|
||||||
|
| 1944 | `TestLeafNodeWSNoMaskingRejected` | `Server.Shutdown` |
|
||||||
|
| 1945 | `TestLeafNodeWSSubPath` | `Server.Shutdown` |
|
||||||
|
| 2016 | `TestLeafNodesBasicTokenAuth` | `Server.Shutdown` |
|
||||||
|
| 2009 | `TestLeafNodesDisableRemote` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/events_test.go` (35 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 313 | `TestAccountClaimsUpdates` | `Server.Shutdown` |
|
||||||
|
| 316 | `TestAccountClaimsUpdatesWithServiceImports` | `Server.Shutdown` |
|
||||||
|
| 317 | `TestAccountConnsLimitExceededAfterUpdate` | `Server.Shutdown` |
|
||||||
|
| 315 | `TestAccountReqInfo` | `Server.Shutdown` |
|
||||||
|
| 322 | `TestServerAccountConns` | `Server.Shutdown` |
|
||||||
|
| 350 | `TestServerEventsConnectDisconnectForGlobalAcc` | `Server.Shutdown` |
|
||||||
|
| 336 | `TestServerEventsFilteredByTag` | `Server.Shutdown` |
|
||||||
|
| 327 | `TestServerEventsHealthZJetStreamNotEnabled` | `Server.Shutdown` |
|
||||||
|
| 324 | `TestServerEventsHealthZSingleServer` | `Server.Shutdown` |
|
||||||
|
| 341 | `TestServerEventsLDMKick` | `Server.Shutdown` |
|
||||||
|
| 332 | `TestServerEventsPingMonitorz` | `Server.Shutdown` |
|
||||||
|
| 328 | `TestServerEventsPingStatsZ` | `Server.Shutdown` |
|
||||||
|
| 329 | `TestServerEventsPingStatsZDedicatedRecvQ` | `Server.Shutdown` |
|
||||||
|
| 331 | `TestServerEventsPingStatsZFailFilter` | `Server.Shutdown` |
|
||||||
|
| 330 | `TestServerEventsPingStatsZFilter` | `Server.Shutdown` |
|
||||||
|
| 344 | `TestServerEventsProfileZNotBlockingRecvQ` | `Server.Shutdown` |
|
||||||
|
| 335 | `TestServerEventsReceivedByQSubs` | `Server.Shutdown` |
|
||||||
|
| 340 | `TestServerEventsReload` | `Server.Shutdown` |
|
||||||
|
| 323 | `TestServerEventsStatsZ` | `Server.Shutdown` |
|
||||||
|
| 348 | `TestServerEventsStatszMaxProcsMemLimit` | `Server.Shutdown` |
|
||||||
|
| 339 | `TestServerEventsStatszSingleServer` | `Server.Shutdown` |
|
||||||
|
| 337 | `TestServerUnstableEventFilterMatch` | `Server.Shutdown` |
|
||||||
|
| 349 | `TestSubszPagination` | `Server.Shutdown` |
|
||||||
|
| 299 | `TestSystemAccount` | `Server.Shutdown` |
|
||||||
|
| 306 | `TestSystemAccountConnectionLimits` | `Server.Shutdown` |
|
||||||
|
| 311 | `TestSystemAccountConnectionLimitsServerShutdownForced` | `Server.Shutdown` |
|
||||||
|
| 310 | `TestSystemAccountConnectionLimitsServerShutdownGraceful` | `Server.Shutdown` |
|
||||||
|
| 309 | `TestSystemAccountConnectionLimitsServersStaggered` | `Server.Shutdown` |
|
||||||
|
| 302 | `TestSystemAccountDisconnectBadLogin` | `Server.Shutdown` |
|
||||||
|
| 312 | `TestSystemAccountFromConfig` | `NewServer` |
|
||||||
|
| 300 | `TestSystemAccountNewConnection` | `Server.Shutdown` |
|
||||||
|
| 321 | `TestSystemAccountNoAuthUser` | `Server.Shutdown` |
|
||||||
|
| 308 | `TestSystemAccountSystemConnectionLimitsHonored` | `Server.Shutdown` |
|
||||||
|
| 320 | `TestSystemAccountWithGateways` | `Server.Shutdown` |
|
||||||
|
| 301 | `TestSystemAccountingWithLeafNodes` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/jetstream_consumer_test.go` (35 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 1298 | `TestJetStreamConsumerAckSampling` | `Server.Shutdown` |
|
||||||
|
| 1299 | `TestJetStreamConsumerAckSamplingSpecifiedUsingUpdateConsumer` | `Server.Shutdown` |
|
||||||
|
| 1252 | `TestJetStreamConsumerBackoffNotRespectedWithMultipleInflightRedeliveries` | `Server.Shutdown` |
|
||||||
|
| 1253 | `TestJetStreamConsumerBackoffWhenBackoffLengthIsEqualToMaxDeliverConfig` | `Server.Shutdown` |
|
||||||
|
| 1287 | `TestJetStreamConsumerBadNumPending` | `Server.Shutdown` |
|
||||||
|
| 1358 | `TestJetStreamConsumerDeliverAllNonOverlappingFilterSubjects` | `Server.Shutdown` |
|
||||||
|
| 1357 | `TestJetStreamConsumerDeliverAllOverlappingFilterSubjects` | `Server.Shutdown` |
|
||||||
|
| 1359 | `TestJetStreamConsumerDeliverPartialOverlappingFilterSubjects` | `Server.Shutdown` |
|
||||||
|
| 1293 | `TestJetStreamConsumerEventingRaceOnShutdown` | `Server.Shutdown` |
|
||||||
|
| 1235 | `TestJetStreamConsumerFetchWithDrain` | `Server.Shutdown` |
|
||||||
|
| 1379 | `TestJetStreamConsumerLegacyDurableCreateSetsConsumerName` | `Server.Shutdown` |
|
||||||
|
| 1236 | `TestJetStreamConsumerLongSubjectHang` | `Server.Shutdown` |
|
||||||
|
| 1249 | `TestJetStreamConsumerMultipleFitersWithStartDate` | `Server.Shutdown` |
|
||||||
|
| 1303 | `TestJetStreamConsumerNumPendingWithMaxPerSubjectGreaterThanOne` | `Server.Shutdown` |
|
||||||
|
| 1334 | `TestJetStreamConsumerPauseAdvisories` | `Server.Shutdown` |
|
||||||
|
| 1333 | `TestJetStreamConsumerPauseHeartbeats` | `Server.Shutdown` |
|
||||||
|
| 1332 | `TestJetStreamConsumerPauseResumeViaEndpoint` | `Server.Shutdown` |
|
||||||
|
| 1330 | `TestJetStreamConsumerPauseViaConfig` | `Server.Shutdown` |
|
||||||
|
| 1328 | `TestJetStreamConsumerPendingForKV` | `Server.Shutdown` |
|
||||||
|
| 1306 | `TestJetStreamConsumerPullConsumerFIFO` | `Server.Shutdown` |
|
||||||
|
| 1346 | `TestJetStreamConsumerPullCrossAccountExpiresNoDataRace` | `Server.Shutdown` |
|
||||||
|
| 1347 | `TestJetStreamConsumerPullCrossAccountsAndLeafNodes` | `Server.Shutdown` |
|
||||||
|
| 1297 | `TestJetStreamConsumerPullHeartBeats` | `Server.Shutdown` |
|
||||||
|
| 1356 | `TestJetStreamConsumerPullMaxBytes` | `Server.Shutdown` |
|
||||||
|
| 1340 | `TestJetStreamConsumerPullMaxWaitingOfOne` | `Server.Shutdown` |
|
||||||
|
| 1341 | `TestJetStreamConsumerPullMaxWaitingOfOneWithHeartbeatInterval` | `Server.Shutdown` |
|
||||||
|
| 1349 | `TestJetStreamConsumerPullMultipleRequestsExpireOutOfOrder` | `Server.Shutdown` |
|
||||||
|
| 1350 | `TestJetStreamConsumerPullNoAck` | `Server.Shutdown` |
|
||||||
|
| 1348 | `TestJetStreamConsumerPullOneShotBehavior` | `Server.Shutdown` |
|
||||||
|
| 1343 | `TestJetStreamConsumerPullRequestCleanup` | `Server.Shutdown` |
|
||||||
|
| 1355 | `TestJetStreamConsumerPullTimeout` | `Server.Shutdown` |
|
||||||
|
| 1352 | `TestJetStreamConsumerPullTimeoutHeaders` | `Server.Shutdown` |
|
||||||
|
| 1291 | `TestJetStreamConsumerPushBound` | `Server.Shutdown` |
|
||||||
|
| 1264 | `TestJetStreamConsumerSingleTokenSubject` | `Server.Shutdown` |
|
||||||
|
| 1326 | `TestJetStreamConsumerWithFormattingSymbol` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/jwt_test.go` (28 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 1887 | `TestJWTAccountConnzAccessAfterClaimUpdate` | `Account.AddMapping` |
|
||||||
|
| 1822 | `TestJWTAccountExportWithResponseType` | `Server.Shutdown` |
|
||||||
|
| 1873 | `TestJWTAccountImportsWithWildcardSupport` | `Server.Shutdown` |
|
||||||
|
| 1855 | `TestJWTAccountNATSResolverCrossClusterFetch` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 1891 | `TestJWTAccountNATSResolverWrongCreds` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 1874 | `TestJWTAccountTokenImportMisuse` | `NewServer` |
|
||||||
|
| 1838 | `TestJWTAccountURLResolverFetchFailureInCluster` | `NewServer` |
|
||||||
|
| 1835 | `TestJWTAccountURLResolverFetchFailureInServer1` | `NewServer` |
|
||||||
|
| 1836 | `TestJWTAccountURLResolverFetchFailurePushReorder` | `NewServer` |
|
||||||
|
| 1839 | `TestJWTAccountURLResolverReturnDifferentOperator` | `NewServer` |
|
||||||
|
| 1833 | `TestJWTAccountURLResolverTimeout` | `NewServer` |
|
||||||
|
| 1883 | `TestJWTClaimsUpdateWithHeaders` | `Server.Shutdown` |
|
||||||
|
| 1853 | `TestJWTExpiredUserCredentialsRenewal` | `Server.Name` |
|
||||||
|
| 1872 | `TestJWTHeader` | `Server.Shutdown` |
|
||||||
|
| 1846 | `TestJWTImportTokenRevokedAfter` | `Server.Shutdown` |
|
||||||
|
| 1847 | `TestJWTImportTokenRevokedBefore` | `Server.Shutdown` |
|
||||||
|
| 1864 | `TestJWTInLineTemplates` | `processUserPermissionsTemplate` |
|
||||||
|
| 1895 | `TestJWTJetStreamClientsExcludedForMaxConnsUpdate` | `Server.Shutdown` |
|
||||||
|
| 1884 | `TestJWTMappings` | `Account.AddMapping` |
|
||||||
|
| 1867 | `TestJWTNoOperatorMode` | `Server.Shutdown` |
|
||||||
|
| 1875 | `TestJWTResponseThreshold` | `Server.Shutdown` |
|
||||||
|
| 1889 | `TestJWTServerOperatorModeNoAuthRequired` | `Server.Shutdown` |
|
||||||
|
| 1890 | `TestJWTServerOperatorModeUserInfoExpiration` | `Server.Shutdown` |
|
||||||
|
| 1881 | `TestJWTStrictSigningKeys` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 1858 | `TestJWTSysImportForDifferentAccount` | `Server.Shutdown` |
|
||||||
|
| 1860 | `TestJWTSysImportOverwritePublic` | `Server.Shutdown` |
|
||||||
|
| 1861 | `TestJWTSysImportOverwriteToken` | `Server.Shutdown` |
|
||||||
|
| 1857 | `TestJWTTimeExpiration` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/gateway_test.go` (26 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 626 | `TestGatewayAutoDiscovery` | `Server.Shutdown` |
|
||||||
|
| 659 | `TestGatewayClientsDontReceiveMsgsOnGWPrefix` | `Server.Shutdown` |
|
||||||
|
| 685 | `TestGatewayConfigureWriteDeadline` | `Server.Shutdown` |
|
||||||
|
| 686 | `TestGatewayConfigureWriteTimeoutPolicy` | `Server.Shutdown` |
|
||||||
|
| 682 | `TestGatewayConnectEvents` | `Server.ClientURL` |
|
||||||
|
| 619 | `TestGatewayCreateImplicitOnNewRoute` | `Server.Shutdown` |
|
||||||
|
| 633 | `TestGatewayDoesntSendBackToItself` | `Server.Shutdown` |
|
||||||
|
| 629 | `TestGatewayDontSendSubInterest` | `Server.Shutdown` |
|
||||||
|
| 602 | `TestGatewayHeaderInfo` | `Server.Shutdown` |
|
||||||
|
| 654 | `TestGatewayMemUsage` | `Server.Shutdown` |
|
||||||
|
| 668 | `TestGatewayNoCrashOnInvalidSubject` | `Server.Shutdown` |
|
||||||
|
| 628 | `TestGatewayNoReconnectOnClose` | `Server.Shutdown` |
|
||||||
|
| 657 | `TestGatewayPingPongReplyAcrossGateways` | `NewAccount` |
|
||||||
|
| 646 | `TestGatewayRaceBetweenPubAndSub` | `Server.Shutdown` |
|
||||||
|
| 649 | `TestGatewayRaceOnClose` | `Server.Shutdown` |
|
||||||
|
| 665 | `TestGatewayReplyMapTracking` | `Server.Shutdown` |
|
||||||
|
| 648 | `TestGatewaySendAllSubsBadProtocol` | `Server.Shutdown` |
|
||||||
|
| 637 | `TestGatewaySendQSubsOnGatewayConnect` | `Server.Shutdown` |
|
||||||
|
| 656 | `TestGatewaySendReplyAcrossGateways` | `NewAccount` |
|
||||||
|
| 642 | `TestGatewaySendsToNonLocalSubs` | `Server.Shutdown` |
|
||||||
|
| 606 | `TestGatewaySolicitDelayWithImplicitOutbounds` | `Server.Shutdown` |
|
||||||
|
| 607 | `TestGatewaySolicitShutdown` | `Server.Shutdown` |
|
||||||
|
| 671 | `TestGatewayTLSConfigReload` | `Server.Shutdown` |
|
||||||
|
| 614 | `TestGatewayTLSErrors` | `Server.Shutdown` |
|
||||||
|
| 636 | `TestGatewayTotalQSubs` | `Server.Shutdown` |
|
||||||
|
| 625 | `TestGatewayUseUpdatedURLs` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/routes_test.go` (25 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 2809 | `TestClientConnectToRoutePort` | `Server.Shutdown` |
|
||||||
|
| 2818 | `TestRouteClusterNameConflictBetweenStaticAndDynamic` | `Server.Shutdown` |
|
||||||
|
| 2853 | `TestRouteCompressionImplicitRoute` | `Server.Shutdown` |
|
||||||
|
| 2852 | `TestRouteCompressionWithOlderServer` | `Server.Shutdown` |
|
||||||
|
| 2864 | `TestRouteConfigureWriteDeadline` | `Server.Shutdown` |
|
||||||
|
| 2865 | `TestRouteConfigureWriteTimeoutPolicy` | `Server.Shutdown` |
|
||||||
|
| 2856 | `TestRouteCustomPing` | `Server.Shutdown` |
|
||||||
|
| 2863 | `TestRouteImplicitJoinsSeparateGroups` | `Server.setOpts` |
|
||||||
|
| 2860 | `TestRouteNoLeakOnAuthTimeout` | `Server.Shutdown` |
|
||||||
|
| 2861 | `TestRouteNoRaceOnClusterNameNegotiation` | `NewAccount` |
|
||||||
|
| 2836 | `TestRoutePerAccountDefaultForSysAccount` | `Server.Shutdown` |
|
||||||
|
| 2838 | `TestRoutePerAccountGossipWorks` | `Server.Shutdown` |
|
||||||
|
| 2840 | `TestRoutePerAccountGossipWorksWithOldServerSeed` | `Server.Shutdown` |
|
||||||
|
| 2835 | `TestRoutePerAccountImplicit` | `Server.Shutdown` |
|
||||||
|
| 2855 | `TestRoutePings` | `Server.Shutdown` |
|
||||||
|
| 2830 | `TestRoutePool` | `Server.Shutdown` |
|
||||||
|
| 2846 | `TestRoutePoolAndPerAccountWithOlderServer` | `Server.Shutdown` |
|
||||||
|
| 2843 | `TestRoutePoolAndPerAccountWithServiceLatencyNoDataRace` | `Server.Shutdown` |
|
||||||
|
| 2842 | `TestRoutePoolPerAccountStreamImport` | `Server.Shutdown` |
|
||||||
|
| 2841 | `TestRoutePoolPerAccountSubUnsubProtoParsing` | `Server.Shutdown` |
|
||||||
|
| 2833 | `TestRoutePoolSizeDifferentOnEachServer` | `Server.Shutdown` |
|
||||||
|
| 2816 | `TestRouteRTT` | `Server.Shutdown` |
|
||||||
|
| 2814 | `TestRouteSendLocalSubsWithLowMaxPending` | `Server.Shutdown` |
|
||||||
|
| 2808 | `TestRouteUseIPv6` | `Server.Shutdown` |
|
||||||
|
| 2811 | `TestServerPoolUpdatedWhenRouteGoesAway` | `RoutesFromStr` |
|
||||||
|
|
||||||
|
### `server/msgtrace_test.go` (20 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 2361 | `TestMsgTraceAccDestWithSamplingJWTUpdate` | `Server.Shutdown` |
|
||||||
|
| 2360 | `TestMsgTraceAccountDestWithSampling` | `MsgTraceEvent.Ingress` |
|
||||||
|
| 2356 | `TestMsgTraceAccountTraceDestJWTUpdate` | `Server.Shutdown` |
|
||||||
|
| 2331 | `TestMsgTraceBasic` | `MsgTraceEvent.Ingress` |
|
||||||
|
| 2354 | `TestMsgTraceHops` | `MsgTraceEvent.Ingress` |
|
||||||
|
| 2357 | `TestMsgTraceServiceJWTUpdate` | `MsgTraceEvent.Ingress` |
|
||||||
|
| 2347 | `TestMsgTraceStreamExport` | `MsgTraceEvent.Ingress` |
|
||||||
|
| 2349 | `TestMsgTraceStreamExportWithLeafNode_Hub` | `MsgTraceEvent.Ingress` |
|
||||||
|
| 2350 | `TestMsgTraceStreamExportWithLeafNode_Leaf` | `MsgTraceEvent.Ingress` |
|
||||||
|
| 2358 | `TestMsgTraceStreamJWTUpdate` | `MsgTraceEvent.StreamExports` |
|
||||||
|
| 2355 | `TestMsgTraceTriggeredByExternalHeader` | `Server.Shutdown` |
|
||||||
|
| 2353 | `TestMsgTraceWithCompression` | `MsgTraceEvent.Ingress` |
|
||||||
|
| 2342 | `TestMsgTraceWithGatewayToOldServer` | `MsgTraceEvent.Ingress` |
|
||||||
|
| 2341 | `TestMsgTraceWithGateways` | `MsgTraceEvent.Ingress` |
|
||||||
|
| 2338 | `TestMsgTraceWithLeafNode` | `MsgTraceEvent.Ingress` |
|
||||||
|
| 2340 | `TestMsgTraceWithLeafNodeDaisyChain` | `MsgTraceEvent.Ingress` |
|
||||||
|
| 2339 | `TestMsgTraceWithLeafNodeToOldServer` | `MsgTraceEvent.Ingress` |
|
||||||
|
| 2335 | `TestMsgTraceWithQueueSub` | `MsgTraceEvent.Ingress` |
|
||||||
|
| 2337 | `TestMsgTraceWithRouteToOldServer` | `MsgTraceEvent.Ingress` |
|
||||||
|
| 2336 | `TestMsgTraceWithRoutes` | `MsgTraceEvent.Ingress` |
|
||||||
|
|
||||||
|
### `server/reload_test.go` (19 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 2780 | `TestConfigReloadAccountMappings` | `Server.Shutdown` |
|
||||||
|
| 2764 | `TestConfigReloadAccountServicesImportExport` | `Server.Shutdown` |
|
||||||
|
| 2760 | `TestConfigReloadAccountUsers` | `Server.Shutdown` |
|
||||||
|
| 2751 | `TestConfigReloadClientAdvertise` | `Server.Shutdown` |
|
||||||
|
| 2749 | `TestConfigReloadClusterName` | `Server.Shutdown` |
|
||||||
|
| 2748 | `TestConfigReloadClusterNoAdvertise` | `Server.Shutdown` |
|
||||||
|
| 2758 | `TestConfigReloadClusterPermsExport` | `Server.Shutdown` |
|
||||||
|
| 2757 | `TestConfigReloadClusterPermsImport` | `Server.Shutdown` |
|
||||||
|
| 2759 | `TestConfigReloadClusterPermsOldServer` | `Server.Shutdown` |
|
||||||
|
| 2755 | `TestConfigReloadClusterWorks` | `Server.Shutdown` |
|
||||||
|
| 2791 | `TestConfigReloadLeafNodeCompression` | `Server.Shutdown` |
|
||||||
|
| 2792 | `TestConfigReloadLeafNodeCompressionS2Auto` | `Server.Shutdown` |
|
||||||
|
| 2789 | `TestConfigReloadRouteCompression` | `Server.Shutdown` |
|
||||||
|
| 2790 | `TestConfigReloadRouteCompressionS2Auto` | `Server.Shutdown` |
|
||||||
|
| 2782 | `TestConfigReloadRouteImportPermissionsWithAccounts` | `Server.Shutdown` |
|
||||||
|
| 2783 | `TestConfigReloadRoutePoolAndPerAccount` | `Server.Shutdown` |
|
||||||
|
| 2787 | `TestConfigReloadRoutePoolAndPerAccountNoDuplicateSub` | `Server.Shutdown` |
|
||||||
|
| 2784 | `TestConfigReloadRoutePoolAndPerAccountNoPanicIfFirstAdded` | `Server.Shutdown` |
|
||||||
|
| 2786 | `TestConfigReloadRoutePoolAndPerAccountWithOlderServer` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/accounts_test.go` (18 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 83 | `TestAccountBasicRouteMapping` | `Account.AddMapping` |
|
||||||
|
| 107 | `TestAccountImportDuplicateResponseDeliveryWithLeafnodes` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 106 | `TestAccountImportOwnExport` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 93 | `TestAccountImportsWithWildcardSupport` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 94 | `TestAccountImportsWithWildcardSupportStreamAndService` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 80 | `TestAccountMultipleServiceImportsWithSameSubjectFromDifferentAccounts` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 85 | `TestAccountRouteMappingChangesAfterClientStart` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 90 | `TestAccountRouteMappingsWithLossInjection` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 91 | `TestAccountRouteMappingsWithOriginClusterFilter` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 109 | `TestAccountServiceAndStreamExportDoubleDelivery` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 110 | `TestAccountServiceImportNoResponders` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 92 | `TestAccountServiceImportWithRouteMappings` | `Account.AddMapping` |
|
||||||
|
| 97 | `TestAccountSystemPermsWithGlobalAccess` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 104 | `TestAccountUserSubPermsWithQueueGroups` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 84 | `TestAccountWildcardRouteMapping` | `Account.AddMapping` |
|
||||||
|
| 88 | `TestGlobalAccountRouteMappingsConfiguration` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 98 | `TestImportSubscriptionPartialOverlapWithPrefix` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 99 | `TestImportSubscriptionPartialOverlapWithTransform` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
|
||||||
|
### `server/norace_1_test.go` (18 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 2470 | `TestNoRaceClientOutboundQueueMemory` | `Server.Shutdown` |
|
||||||
|
| 2374 | `TestNoRaceClosedSlowConsumerPendingBytes` | `Server.Shutdown` |
|
||||||
|
| 2373 | `TestNoRaceClosedSlowConsumerWriteDeadline` | `Server.Shutdown` |
|
||||||
|
| 2406 | `TestNoRaceCompressedConnz` | `Server.Shutdown` |
|
||||||
|
| 2456 | `TestNoRaceJetStreamConsumerCreateTimeNumPending` | `Server.Shutdown` |
|
||||||
|
| 2446 | `TestNoRaceJetStreamDeleteConsumerWithInterestStreamAndHighSeqs` | `Server.Shutdown` |
|
||||||
|
| 2450 | `TestNoRaceJetStreamEndToEndLatency` | `Server.Shutdown` |
|
||||||
|
| 2448 | `TestNoRaceJetStreamLargeNumConsumersPerfImpact` | `Server.Shutdown` |
|
||||||
|
| 2449 | `TestNoRaceJetStreamLargeNumConsumersSparseDelivery` | `Server.Shutdown` |
|
||||||
|
| 2410 | `TestNoRaceJetStreamOrderedConsumerMissingMsg` | `Server.Shutdown` |
|
||||||
|
| 2425 | `TestNoRaceJetStreamSparseConsumers` | `Server.Shutdown` |
|
||||||
|
| 2381 | `TestNoRaceLeafNodeClusterNameConflictDeadlock` | `Server.Shutdown` |
|
||||||
|
| 2383 | `TestNoRaceQueueAutoUnsubscribe` | `Server.Shutdown` |
|
||||||
|
| 2378 | `TestNoRaceRouteCache` | `Server.Shutdown` |
|
||||||
|
| 2377 | `TestNoRaceRouteMemUsage` | `Server.Shutdown` |
|
||||||
|
| 2466 | `TestNoRaceRoutePool` | `Server.Shutdown` |
|
||||||
|
| 2375 | `TestNoRaceSlowConsumerPendingBytes` | `Server.Shutdown` |
|
||||||
|
| 2380 | `TestNoRaceWriteDeadline` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/websocket_test.go` (18 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 3119 | `TestWSAuthTimeout` | `Server.Shutdown` |
|
||||||
|
| 3118 | `TestWSBasicAuth` | `Server.Shutdown` |
|
||||||
|
| 3121 | `TestWSBindToProperAccount` | `Server.Shutdown` |
|
||||||
|
| 3111 | `TestWSCloseMsgSendOnConnectionClose` | `Server.Shutdown` |
|
||||||
|
| 3115 | `TestWSCompressionBasic` | `captureHTTPServerLog.Write` |
|
||||||
|
| 3116 | `TestWSCompressionWithPartialWrite` | `Server.Shutdown` |
|
||||||
|
| 3128 | `TestWSJWTCookieUser` | `Server.Shutdown` |
|
||||||
|
| 3127 | `TestWSJWTWithAllowedConnectionTypes` | `Server.Shutdown` |
|
||||||
|
| 3125 | `TestWSNkeyAuth` | `Server.Shutdown` |
|
||||||
|
| 3124 | `TestWSNoAuthUser` | `NewAccount` |
|
||||||
|
| 3105 | `TestWSPubSub` | `Server.Shutdown` |
|
||||||
|
| 3126 | `TestWSSetHeaderServer` | `Server.Shutdown` |
|
||||||
|
| 3106 | `TestWSTLSConnection` | `Server.Shutdown` |
|
||||||
|
| 3120 | `TestWSTokenAuth` | `Server.Shutdown` |
|
||||||
|
| 3122 | `TestWSUsersAuth` | `Server.Shutdown` |
|
||||||
|
| 3114 | `TestWSWebrowserClient` | `client.isWebsocket` |
|
||||||
|
| 3131 | `TestWSWithPartialWrite` | `Server.Shutdown` |
|
||||||
|
| 3178 | `TestWebsocketPingInterval` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/auth_callout_test.go` (17 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 113 | `TestAuthCalloutAllowedAccounts` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 111 | `TestAuthCalloutBasics` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 114 | `TestAuthCalloutClientTLSCerts` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 127 | `TestAuthCalloutConnectEvents` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 138 | `TestAuthCalloutLeafNodeAndConfigMode` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 137 | `TestAuthCalloutLeafNodeAndOperatorMode` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 141 | `TestAuthCalloutLeafNodeOperatorModeMismatchedCreds` | `Server.getOpts` |
|
||||||
|
| 112 | `TestAuthCalloutMultiAccounts` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 117 | `TestAuthCalloutOperatorModeBasics` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 121 | `TestAuthCalloutOperatorModeEncryption` | `NoOpCache.Get` |
|
||||||
|
| 140 | `TestAuthCalloutOperatorModeMismatchedCalloutCreds` | `Server.Shutdown` |
|
||||||
|
| 116 | `TestAuthCalloutOperatorNoServerConfigCalloutAllowed` | `NewServer` |
|
||||||
|
| 132 | `TestAuthCalloutOperator_AnyAccount` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 123 | `TestAuthCalloutServerClusterAndVersion` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 120 | `TestAuthCalloutServerConfigEncryption` | `NoOpCache.Get` |
|
||||||
|
| 122 | `TestAuthCalloutServerTags` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 133 | `TestAuthCalloutWSClientTLSCerts` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
|
||||||
|
### `server/server_test.go` (11 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 2907 | `TestBuildinfoFormatRevision` | `formatRevision` |
|
||||||
|
| 2896 | `TestClientWriteLoopStall` | `Server.Shutdown` |
|
||||||
|
| 2898 | `TestConnectErrorReports` | `Server.Shutdown` |
|
||||||
|
| 2886 | `TestCustomRouterAuthentication` | `Server.Shutdown` |
|
||||||
|
| 2891 | `TestLameDuckModeInfo` | `Server.Shutdown` |
|
||||||
|
| 2887 | `TestMonitoringNoTimeout` | `Server.Shutdown` |
|
||||||
|
| 2888 | `TestProfilingNoTimeout` | `Server.Shutdown` |
|
||||||
|
| 2902 | `TestServerAuthBlockAndSysAccounts` | `Server.Shutdown` |
|
||||||
|
| 2905 | `TestServerClientURL` | `NewServer` |
|
||||||
|
| 2903 | `TestServerConfigLastLineComments` | `Server.Shutdown` |
|
||||||
|
| 2900 | `TestServerLogsConfigurationFile` | `Server.Name` |
|
||||||
|
|
||||||
|
### `server/jetstream_leafnode_test.go` (6 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 1415 | `TestJetStreamLeafNodeAndMirrorResyncAfterLeafEstablished` | `Server.Shutdown` |
|
||||||
|
| 1410 | `TestJetStreamLeafNodeDefaultDomainClusterBothEnds` | `Server.Shutdown` |
|
||||||
|
| 1409 | `TestJetStreamLeafNodeDefaultDomainJwtExplicit` | `Server.Shutdown` |
|
||||||
|
| 1404 | `TestJetStreamLeafNodeJwtPermsAndJSDomains` | `Server.Shutdown` |
|
||||||
|
| 1411 | `TestJetStreamLeafNodeSvcImportExportCycle` | `Server.Shutdown` |
|
||||||
|
| 1403 | `TestJetStreamLeafNodeUniqueServerNameCrossJSDomain` | `raft.ID` |
|
||||||
|
|
||||||
|
### `server/jetstream_tpm_test.go` (5 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 1790 | `TestJetStreamInvalidConfig` | `Server.Running` |
|
||||||
|
| 1789 | `TestJetStreamTPMAll` | `Server.Shutdown` |
|
||||||
|
| 1786 | `TestJetStreamTPMBasic` | `Server.Shutdown` |
|
||||||
|
| 1787 | `TestJetStreamTPMKeyBadPassword` | `Server.Shutdown` |
|
||||||
|
| 1788 | `TestJetStreamTPMKeyWithPCR` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/store_test.go` (5 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 2942 | `TestStoreLoadNextMsgWildcardStartBeforeFirstMatch` | `fileStore.StoreMsg` |
|
||||||
|
| 2941 | `TestStoreMsgLoadNextMsgMulti` | `fileStore.StoreMsg` |
|
||||||
|
| 2953 | `TestStoreMsgLoadPrevMsgMulti` | `fileStore.StoreMsg` |
|
||||||
|
| 2946 | `TestStoreSubjectStateConsistencyOptimization` | `fileStore.StoreMsg` |
|
||||||
|
| 2951 | `TestStoreUpdateConfigTTLState` | `consumer.config` |
|
||||||
|
|
||||||
|
### `server/jetstream_jwt_test.go` (4 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 1395 | `TestJetStreamJWTDeletedAccountIsReEnabled` | `Server.Shutdown` |
|
||||||
|
| 1392 | `TestJetStreamJWTExpiredAccountNotCountedTowardLimits` | `Server.Shutdown` |
|
||||||
|
| 1385 | `TestJetStreamJWTLimits` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
| 1401 | `TestJetStreamJWTUpdateWithPreExistingStream` | `resolverDefaultsOpsImpl.Close` |
|
||||||
|
|
||||||
|
### `server/auth_test.go` (3 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 149 | `TestNoAuthUser` | `Server.Shutdown` |
|
||||||
|
| 150 | `TestNoAuthUserNkey` | `Server.Shutdown` |
|
||||||
|
| 152 | `TestNoAuthUserNoConnectProto` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/opts_test.go` (3 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 2552 | `TestAccountUsersLoadedProperly` | `Server.Shutdown` |
|
||||||
|
| 2585 | `TestNewServerFromConfigVsLoadConfig` | `NewServer` |
|
||||||
|
| 2561 | `TestSublistNoCacheConfigOnAccounts` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/jetstream_versioning_test.go` (2 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 1807 | `TestJetStreamApiErrorOnRequiredApiLevelDirectGet` | `Server.Shutdown` |
|
||||||
|
| 1808 | `TestJetStreamApiErrorOnRequiredApiLevelPullConsumerNextMsg` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/norace_2_test.go` (2 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 2511 | `TestNoRaceAccessTimeLeakCheck` | `Server.Shutdown` |
|
||||||
|
| 2507 | `TestNoRaceProducerStallLimits` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/certstore_windows_test.go` (1 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 158 | `TestWindowsTLS12ECDSA` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/filestore_test.go` (1 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 575 | `TestJetStreamFileStoreSubjectsRemovedAfterSecureErase` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/jetstream_batching_test.go` (1 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 743 | `TestJetStreamAtomicBatchPublishExpectedLastSubjectSequence` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/jetstream_cluster_2_test.go` (1 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 949 | `TestJetStreamClusterMirrorAndSourceCrossNonNeighboringDomain` | `Server.Shutdown` |
|
||||||
|
|
||||||
|
### `server/mqtt_ex_test_test.go` (1 tests)
|
||||||
|
|
||||||
|
| ID | Test Method | Primary Feature |
|
||||||
|
|----|-------------|-----------------|
|
||||||
|
| 2168 | `TestXMQTTCompliance` | `Server.getOpts` |
|
||||||
BIN
porting.db
BIN
porting.db
Binary file not shown.
BIN
porting_batches.db
Normal file
BIN
porting_batches.db
Normal file
Binary file not shown.
BIN
porting_batches.db-shm
Normal file
BIN
porting_batches.db-shm
Normal file
Binary file not shown.
0
porting_batches.db-wal
Normal file
0
porting_batches.db-wal
Normal file
@@ -1,6 +1,6 @@
|
|||||||
# NATS .NET Porting Status Report
|
# NATS .NET Porting Status Report
|
||||||
|
|
||||||
Generated: 2026-02-27 13:56:27 UTC
|
Generated: 2026-02-27 17:42:32 UTC
|
||||||
|
|
||||||
## Modules (12 total)
|
## Modules (12 total)
|
||||||
|
|
||||||
@@ -12,17 +12,18 @@ Generated: 2026-02-27 13:56:27 UTC
|
|||||||
|
|
||||||
| Status | Count |
|
| Status | Count |
|
||||||
|--------|-------|
|
|--------|-------|
|
||||||
| deferred | 2461 |
|
| deferred | 2377 |
|
||||||
| n_a | 18 |
|
| n_a | 24 |
|
||||||
| verified | 1194 |
|
| stub | 1 |
|
||||||
|
| verified | 1271 |
|
||||||
|
|
||||||
## Unit Tests (3257 total)
|
## Unit Tests (3257 total)
|
||||||
|
|
||||||
| Status | Count |
|
| Status | Count |
|
||||||
|--------|-------|
|
|--------|-------|
|
||||||
| deferred | 2662 |
|
| deferred | 2640 |
|
||||||
| n_a | 187 |
|
| n_a | 187 |
|
||||||
| verified | 408 |
|
| verified | 430 |
|
||||||
|
|
||||||
## Library Mappings (36 total)
|
## Library Mappings (36 total)
|
||||||
|
|
||||||
@@ -33,4 +34,4 @@ Generated: 2026-02-27 13:56:27 UTC
|
|||||||
|
|
||||||
## Overall Progress
|
## Overall Progress
|
||||||
|
|
||||||
**1819/6942 items complete (26.2%)**
|
**1924/6942 items complete (27.7%)**
|
||||||
|
|||||||
37
reports/report_4e96fb2.md
Normal file
37
reports/report_4e96fb2.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# NATS .NET Porting Status Report
|
||||||
|
|
||||||
|
Generated: 2026-02-27 15:04:33 UTC
|
||||||
|
|
||||||
|
## Modules (12 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| verified | 12 |
|
||||||
|
|
||||||
|
## Features (3673 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| deferred | 2397 |
|
||||||
|
| n_a | 18 |
|
||||||
|
| stub | 1 |
|
||||||
|
| verified | 1257 |
|
||||||
|
|
||||||
|
## Unit Tests (3257 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| deferred | 2660 |
|
||||||
|
| n_a | 187 |
|
||||||
|
| verified | 410 |
|
||||||
|
|
||||||
|
## Library Mappings (36 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| mapped | 36 |
|
||||||
|
|
||||||
|
|
||||||
|
## Overall Progress
|
||||||
|
|
||||||
|
**1884/6942 items complete (27.1%)**
|
||||||
36
reports/report_8849265.md
Normal file
36
reports/report_8849265.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# NATS .NET Porting Status Report
|
||||||
|
|
||||||
|
Generated: 2026-02-27 14:58:38 UTC
|
||||||
|
|
||||||
|
## Modules (12 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| verified | 12 |
|
||||||
|
|
||||||
|
## Features (3673 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| deferred | 2440 |
|
||||||
|
| n_a | 18 |
|
||||||
|
| verified | 1215 |
|
||||||
|
|
||||||
|
## Unit Tests (3257 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| deferred | 2660 |
|
||||||
|
| n_a | 187 |
|
||||||
|
| verified | 410 |
|
||||||
|
|
||||||
|
## Library Mappings (36 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| mapped | 36 |
|
||||||
|
|
||||||
|
|
||||||
|
## Overall Progress
|
||||||
|
|
||||||
|
**1842/6942 items complete (26.5%)**
|
||||||
37
reports/report_a8c09a2.md
Normal file
37
reports/report_a8c09a2.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# NATS .NET Porting Status Report
|
||||||
|
|
||||||
|
Generated: 2026-02-27 17:42:32 UTC
|
||||||
|
|
||||||
|
## Modules (12 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| verified | 12 |
|
||||||
|
|
||||||
|
## Features (3673 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| deferred | 2377 |
|
||||||
|
| n_a | 24 |
|
||||||
|
| stub | 1 |
|
||||||
|
| verified | 1271 |
|
||||||
|
|
||||||
|
## Unit Tests (3257 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| deferred | 2640 |
|
||||||
|
| n_a | 187 |
|
||||||
|
| verified | 430 |
|
||||||
|
|
||||||
|
## Library Mappings (36 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| mapped | 36 |
|
||||||
|
|
||||||
|
|
||||||
|
## Overall Progress
|
||||||
|
|
||||||
|
**1924/6942 items complete (27.7%)**
|
||||||
36
reports/report_ae0a553.md
Normal file
36
reports/report_ae0a553.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# NATS .NET Porting Status Report
|
||||||
|
|
||||||
|
Generated: 2026-02-27 14:59:29 UTC
|
||||||
|
|
||||||
|
## Modules (12 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| verified | 12 |
|
||||||
|
|
||||||
|
## Features (3673 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| deferred | 2440 |
|
||||||
|
| n_a | 18 |
|
||||||
|
| verified | 1215 |
|
||||||
|
|
||||||
|
## Unit Tests (3257 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| deferred | 2660 |
|
||||||
|
| n_a | 187 |
|
||||||
|
| verified | 410 |
|
||||||
|
|
||||||
|
## Library Mappings (36 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| mapped | 36 |
|
||||||
|
|
||||||
|
|
||||||
|
## Overall Progress
|
||||||
|
|
||||||
|
**1842/6942 items complete (26.5%)**
|
||||||
37
reports/report_b94a67b.md
Normal file
37
reports/report_b94a67b.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# NATS .NET Porting Status Report
|
||||||
|
|
||||||
|
Generated: 2026-02-27 15:28:21 UTC
|
||||||
|
|
||||||
|
## Modules (12 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| verified | 12 |
|
||||||
|
|
||||||
|
## Features (3673 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| deferred | 2377 |
|
||||||
|
| n_a | 24 |
|
||||||
|
| stub | 1 |
|
||||||
|
| verified | 1271 |
|
||||||
|
|
||||||
|
## Unit Tests (3257 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| deferred | 2660 |
|
||||||
|
| n_a | 187 |
|
||||||
|
| verified | 410 |
|
||||||
|
|
||||||
|
## Library Mappings (36 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| mapped | 36 |
|
||||||
|
|
||||||
|
|
||||||
|
## Overall Progress
|
||||||
|
|
||||||
|
**1904/6942 items complete (27.4%)**
|
||||||
37
reports/report_c0aaae9.md
Normal file
37
reports/report_c0aaae9.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# NATS .NET Porting Status Report
|
||||||
|
|
||||||
|
Generated: 2026-02-27 15:27:06 UTC
|
||||||
|
|
||||||
|
## Modules (12 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| verified | 12 |
|
||||||
|
|
||||||
|
## Features (3673 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| deferred | 2377 |
|
||||||
|
| n_a | 24 |
|
||||||
|
| stub | 1 |
|
||||||
|
| verified | 1271 |
|
||||||
|
|
||||||
|
## Unit Tests (3257 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| deferred | 2660 |
|
||||||
|
| n_a | 187 |
|
||||||
|
| verified | 410 |
|
||||||
|
|
||||||
|
## Library Mappings (36 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| mapped | 36 |
|
||||||
|
|
||||||
|
|
||||||
|
## Overall Progress
|
||||||
|
|
||||||
|
**1904/6942 items complete (27.4%)**
|
||||||
37
reports/report_fe2483d.md
Normal file
37
reports/report_fe2483d.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# NATS .NET Porting Status Report
|
||||||
|
|
||||||
|
Generated: 2026-02-27 15:32:34 UTC
|
||||||
|
|
||||||
|
## Modules (12 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| verified | 12 |
|
||||||
|
|
||||||
|
## Features (3673 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| deferred | 2377 |
|
||||||
|
| n_a | 24 |
|
||||||
|
| stub | 1 |
|
||||||
|
| verified | 1271 |
|
||||||
|
|
||||||
|
## Unit Tests (3257 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| deferred | 2660 |
|
||||||
|
| n_a | 187 |
|
||||||
|
| verified | 410 |
|
||||||
|
|
||||||
|
## Library Mappings (36 total)
|
||||||
|
|
||||||
|
| Status | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| mapped | 36 |
|
||||||
|
|
||||||
|
|
||||||
|
## Overall Progress
|
||||||
|
|
||||||
|
**1904/6942 items complete (27.4%)**
|
||||||
647
tools/batch_planner.py
Normal file
647
tools/batch_planner.py
Normal file
@@ -0,0 +1,647 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Batch planner for NatsNet porting project.
|
||||||
|
|
||||||
|
Copies porting.db -> porting_batches.db, creates batch assignment tables,
|
||||||
|
and populates 42 batches (0-41) with deferred features and tests.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
python3 tools/batch_planner.py
|
||||||
|
"""
|
||||||
|
|
||||||
|
import shutil
|
||||||
|
import sqlite3
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
ROOT = Path(__file__).resolve().parent.parent
|
||||||
|
DB_SOURCE = ROOT / "porting.db"
|
||||||
|
DB_TARGET = ROOT / "porting_batches.db"
|
||||||
|
|
||||||
|
NEW_TABLES_SQL = """
|
||||||
|
CREATE TABLE IF NOT EXISTS implementation_batches (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
description TEXT,
|
||||||
|
priority INTEGER NOT NULL,
|
||||||
|
feature_count INTEGER DEFAULT 0,
|
||||||
|
test_count INTEGER DEFAULT 0,
|
||||||
|
status TEXT DEFAULT 'pending',
|
||||||
|
depends_on TEXT,
|
||||||
|
go_files TEXT,
|
||||||
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS batch_features (
|
||||||
|
batch_id INTEGER NOT NULL REFERENCES implementation_batches(id),
|
||||||
|
feature_id INTEGER NOT NULL REFERENCES features(id),
|
||||||
|
PRIMARY KEY (batch_id, feature_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS batch_tests (
|
||||||
|
batch_id INTEGER NOT NULL REFERENCES implementation_batches(id),
|
||||||
|
test_id INTEGER NOT NULL REFERENCES unit_tests(id),
|
||||||
|
PRIMARY KEY (batch_id, test_id)
|
||||||
|
);
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Batch metadata: (id, name, description, priority, depends_on, go_files)
|
||||||
|
BATCH_META = [
|
||||||
|
(0, "Implementable Tests",
|
||||||
|
"Tests whose feature dependencies are all already verified",
|
||||||
|
0, None, None),
|
||||||
|
(1, "Proto, Const, CipherSuites, NKey, JWT",
|
||||||
|
"Foundation protocol and crypto types",
|
||||||
|
1, None, "proto.go,const.go,ciphersuites.go,nkey.go,jwt.go"),
|
||||||
|
(2, "Parser, Sublist, MemStore remainders",
|
||||||
|
"Core data structure remainders",
|
||||||
|
2, "1", "parser.go,sublist.go,memstore.go"),
|
||||||
|
(3, "SendQ, Service, Client ProxyProto",
|
||||||
|
"Send queue, OS service, proxy protocol",
|
||||||
|
3, "1", "sendq.go,service.go,service_windows.go,client_proxyproto.go"),
|
||||||
|
(4, "Logging",
|
||||||
|
"Server logging infrastructure",
|
||||||
|
4, "1", "log.go"),
|
||||||
|
(5, "JetStream Errors",
|
||||||
|
"JetStream error constructors (code-gen recommended)",
|
||||||
|
5, None, "jetstream_errors_generated.go,jetstream_errors.go"),
|
||||||
|
(6, "Opts package-level functions",
|
||||||
|
"Options parsing package-level functions",
|
||||||
|
6, "4", "opts.go"),
|
||||||
|
(7, "Opts class methods + Reload",
|
||||||
|
"Options struct methods and config reload",
|
||||||
|
7, "6", "opts.go,reload.go"),
|
||||||
|
(8, "Store Interfaces",
|
||||||
|
"JetStream store interface definitions",
|
||||||
|
8, None, "store.go"),
|
||||||
|
(9, "Auth, DirStore, OCSP foundations",
|
||||||
|
"Authentication, directory store, OCSP basics",
|
||||||
|
9, "4,6", "auth.go,dirstore.go,ocsp.go,ocsp_peer.go"),
|
||||||
|
(10, "OCSP Cache + JS Events",
|
||||||
|
"OCSP response cache and JetStream events",
|
||||||
|
10, "9", "ocsp_responsecache.go,jetstream_events.go"),
|
||||||
|
(11, "FileStore Init",
|
||||||
|
"FileStore package funcs + fileStore methods <= line 1500",
|
||||||
|
11, "8", "filestore.go"),
|
||||||
|
(12, "FileStore Recovery",
|
||||||
|
"fileStore methods lines 1501-2800",
|
||||||
|
12, "11", "filestore.go"),
|
||||||
|
(13, "FileStore Read/Query",
|
||||||
|
"fileStore methods lines 2801-4200",
|
||||||
|
13, "12", "filestore.go"),
|
||||||
|
(14, "FileStore Write/Lifecycle",
|
||||||
|
"fileStore methods lines 4201+",
|
||||||
|
14, "13", "filestore.go"),
|
||||||
|
(15, "MsgBlock + ConsumerFileStore",
|
||||||
|
"msgBlock and consumerFileStore classes + remaining filestore",
|
||||||
|
15, "14", "filestore.go"),
|
||||||
|
(16, "Client Core (first half)",
|
||||||
|
"Client methods <= line 3000",
|
||||||
|
16, "2,3,4", "client.go"),
|
||||||
|
(17, "Client Core (second half)",
|
||||||
|
"Client methods > line 3000",
|
||||||
|
17, "16", "client.go"),
|
||||||
|
(18, "Server Core",
|
||||||
|
"Core server methods",
|
||||||
|
18, "4,16", "server.go"),
|
||||||
|
(19, "Accounts Core",
|
||||||
|
"Account class methods",
|
||||||
|
19, "16,18", "accounts.go"),
|
||||||
|
(20, "Accounts Resolvers",
|
||||||
|
"Account resolvers, package funcs, Server account methods",
|
||||||
|
20, "19", "accounts.go"),
|
||||||
|
(21, "Events + MsgTrace",
|
||||||
|
"Server events and message tracing",
|
||||||
|
21, "18,19", "events.go,msgtrace.go"),
|
||||||
|
(22, "Monitoring",
|
||||||
|
"Server monitoring endpoints",
|
||||||
|
22, "18,19", "monitor.go"),
|
||||||
|
(23, "Routes",
|
||||||
|
"Route connection handling",
|
||||||
|
23, "16,18", "route.go"),
|
||||||
|
(24, "Leaf Nodes",
|
||||||
|
"Leaf node connection handling",
|
||||||
|
24, "19,23", "leafnode.go"),
|
||||||
|
(25, "Gateways",
|
||||||
|
"Gateway connection handling",
|
||||||
|
25, "19,23", "gateway.go"),
|
||||||
|
(26, "WebSocket",
|
||||||
|
"WebSocket transport layer",
|
||||||
|
26, "16,18", "websocket.go"),
|
||||||
|
(27, "JetStream Core",
|
||||||
|
"Core JetStream functionality",
|
||||||
|
27, "5,8,19", "jetstream.go"),
|
||||||
|
(28, "JetStream API",
|
||||||
|
"JetStream API handlers",
|
||||||
|
28, "5,27", "jetstream_api.go"),
|
||||||
|
(29, "JetStream Batching",
|
||||||
|
"JetStream message batching",
|
||||||
|
29, "27", "jetstream_batching.go"),
|
||||||
|
(30, "Raft Part 1",
|
||||||
|
"Raft consensus <= line 3200 + pkg funcs + small types",
|
||||||
|
30, "4,18", "raft.go"),
|
||||||
|
(31, "Raft Part 2",
|
||||||
|
"Raft consensus > line 3200",
|
||||||
|
31, "30", "raft.go"),
|
||||||
|
(32, "JS Cluster Meta",
|
||||||
|
"JetStream cluster pkg funcs + small types + init methods",
|
||||||
|
32, "27,31", "jetstream_cluster.go"),
|
||||||
|
(33, "JS Cluster Streams",
|
||||||
|
"JetStream cluster stream operations",
|
||||||
|
33, "32", "jetstream_cluster.go"),
|
||||||
|
(34, "JS Cluster Consumers",
|
||||||
|
"JetStream cluster consumer operations",
|
||||||
|
34, "33", "jetstream_cluster.go"),
|
||||||
|
(35, "JS Cluster Remaining",
|
||||||
|
"All remaining JetStream cluster features",
|
||||||
|
35, "32", "jetstream_cluster.go"),
|
||||||
|
(36, "Stream Lifecycle",
|
||||||
|
"Stream features <= line 4600",
|
||||||
|
36, "8,11,12,13,14,15,28", "stream.go"),
|
||||||
|
(37, "Stream Messages",
|
||||||
|
"Stream features > line 4600",
|
||||||
|
37, "36", "stream.go"),
|
||||||
|
(38, "Consumer Lifecycle",
|
||||||
|
"Consumer features <= line 3800",
|
||||||
|
38, "34,36", "consumer.go"),
|
||||||
|
(39, "Consumer Dispatch",
|
||||||
|
"Consumer features > line 3800",
|
||||||
|
39, "38", "consumer.go"),
|
||||||
|
(40, "MQTT Server/JSA",
|
||||||
|
"MQTT features <= line 3500",
|
||||||
|
40, "19,27", "mqtt.go"),
|
||||||
|
(41, "MQTT Client/IO",
|
||||||
|
"MQTT features > line 3500",
|
||||||
|
41, "40", "mqtt.go"),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Mapping from test go_file to source go_file for orphan test assignment.
|
||||||
|
# Only entries that differ from the default _test.go -> .go stripping.
|
||||||
|
TEST_FILE_TO_SOURCE = {
|
||||||
|
"server/jetstream_consumer_test.go": "server/consumer.go",
|
||||||
|
"server/jetstream_cluster_1_test.go": "server/jetstream_cluster.go",
|
||||||
|
"server/jetstream_cluster_2_test.go": "server/jetstream_cluster.go",
|
||||||
|
"server/jetstream_cluster_3_test.go": "server/jetstream_cluster.go",
|
||||||
|
"server/jetstream_cluster_4_test.go": "server/jetstream_cluster.go",
|
||||||
|
"server/jetstream_super_cluster_test.go": "server/jetstream_cluster.go",
|
||||||
|
"server/jetstream_leafnode_test.go": "server/leafnode.go",
|
||||||
|
"server/jetstream_jwt_test.go": "server/jwt.go",
|
||||||
|
"server/jetstream_benchmark_test.go": "server/jetstream.go",
|
||||||
|
"server/norace_1_test.go": "server/server.go",
|
||||||
|
"server/norace_2_test.go": "server/server.go",
|
||||||
|
"server/routes_test.go": "server/route.go",
|
||||||
|
"server/auth_callout_test.go": "server/auth.go",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def assign_features_by_file(cur, batch_id, go_files):
|
||||||
|
"""Assign all unassigned deferred features from given files to a batch."""
|
||||||
|
placeholders = ",".join("?" for _ in go_files)
|
||||||
|
cur.execute(f"""
|
||||||
|
INSERT INTO batch_features (batch_id, feature_id)
|
||||||
|
SELECT ?, f.id FROM features f
|
||||||
|
WHERE f.status = 'deferred'
|
||||||
|
AND f.go_file IN ({placeholders})
|
||||||
|
AND f.id NOT IN (SELECT feature_id FROM batch_features)
|
||||||
|
""", [batch_id] + go_files)
|
||||||
|
return cur.rowcount
|
||||||
|
|
||||||
|
|
||||||
|
def assign_features_by_query(cur, batch_id, where_clause, params=None):
|
||||||
|
"""Assign deferred features matching a WHERE clause to a batch."""
|
||||||
|
cur.execute(f"""
|
||||||
|
INSERT INTO batch_features (batch_id, feature_id)
|
||||||
|
SELECT ?, f.id FROM features f
|
||||||
|
WHERE f.status = 'deferred'
|
||||||
|
AND f.id NOT IN (SELECT feature_id FROM batch_features)
|
||||||
|
AND ({where_clause})
|
||||||
|
""", [batch_id] + (params or []))
|
||||||
|
return cur.rowcount
|
||||||
|
|
||||||
|
|
||||||
|
def split_file_evenly(cur, go_file, batch_ids):
|
||||||
|
"""Split a file's unassigned deferred features evenly across batches by line number."""
|
||||||
|
cur.execute("""
|
||||||
|
SELECT f.id FROM features f
|
||||||
|
WHERE f.status = 'deferred'
|
||||||
|
AND f.go_file = ?
|
||||||
|
AND f.id NOT IN (SELECT feature_id FROM batch_features)
|
||||||
|
ORDER BY f.go_line_number
|
||||||
|
""", (go_file,))
|
||||||
|
feature_ids = [row[0] for row in cur.fetchall()]
|
||||||
|
|
||||||
|
n = len(batch_ids)
|
||||||
|
if n == 0 or not feature_ids:
|
||||||
|
return
|
||||||
|
|
||||||
|
chunk_size = len(feature_ids) // n
|
||||||
|
remainder = len(feature_ids) % n
|
||||||
|
|
||||||
|
offset = 0
|
||||||
|
for i, bid in enumerate(batch_ids):
|
||||||
|
size = chunk_size + (1 if i < remainder else 0)
|
||||||
|
for fid in feature_ids[offset:offset + size]:
|
||||||
|
cur.execute(
|
||||||
|
"INSERT INTO batch_features (batch_id, feature_id) VALUES (?, ?)",
|
||||||
|
(bid, fid),
|
||||||
|
)
|
||||||
|
offset += size
|
||||||
|
|
||||||
|
|
||||||
|
def assign_all_features(cur):
|
||||||
|
"""Assign all deferred features to batches."""
|
||||||
|
|
||||||
|
# B1: Proto, Const, CipherSuites, NKey, JWT
|
||||||
|
assign_features_by_file(cur, 1, [
|
||||||
|
"server/proto.go", "server/const.go", "server/ciphersuites.go",
|
||||||
|
"server/nkey.go", "server/jwt.go",
|
||||||
|
])
|
||||||
|
|
||||||
|
# B2: Parser, Sublist, MemStore remainders
|
||||||
|
assign_features_by_file(cur, 2, [
|
||||||
|
"server/parser.go", "server/sublist.go", "server/memstore.go",
|
||||||
|
])
|
||||||
|
|
||||||
|
# B3: SendQ, Service, Client ProxyProto
|
||||||
|
assign_features_by_file(cur, 3, [
|
||||||
|
"server/sendq.go", "server/service.go", "server/service_windows.go",
|
||||||
|
"server/client_proxyproto.go",
|
||||||
|
])
|
||||||
|
|
||||||
|
# B4: Logging
|
||||||
|
assign_features_by_file(cur, 4, ["server/log.go"])
|
||||||
|
|
||||||
|
# B5: JetStream Errors
|
||||||
|
assign_features_by_file(cur, 5, [
|
||||||
|
"server/jetstream_errors_generated.go", "server/jetstream_errors.go",
|
||||||
|
])
|
||||||
|
|
||||||
|
# B6: Opts package-level functions (go_class is empty string)
|
||||||
|
assign_features_by_query(cur, 6,
|
||||||
|
"f.go_file = 'server/opts.go' AND (f.go_class = '' OR f.go_class IS NULL)")
|
||||||
|
|
||||||
|
# B7: Opts class methods + Reload
|
||||||
|
assign_features_by_query(cur, 7,
|
||||||
|
"f.go_file = 'server/opts.go' AND f.go_class != '' AND f.go_class IS NOT NULL")
|
||||||
|
assign_features_by_file(cur, 7, ["server/reload.go"])
|
||||||
|
|
||||||
|
# B8: Store Interfaces
|
||||||
|
assign_features_by_file(cur, 8, ["server/store.go"])
|
||||||
|
|
||||||
|
# B9: Auth, DirStore, OCSP foundations
|
||||||
|
assign_features_by_file(cur, 9, [
|
||||||
|
"server/auth.go", "server/dirstore.go",
|
||||||
|
"server/ocsp.go", "server/ocsp_peer.go",
|
||||||
|
])
|
||||||
|
|
||||||
|
# B10: OCSP Cache + JS Events
|
||||||
|
assign_features_by_file(cur, 10, [
|
||||||
|
"server/ocsp_responsecache.go", "server/jetstream_events.go",
|
||||||
|
])
|
||||||
|
|
||||||
|
# --- FileStore (B11-B15) ---
|
||||||
|
|
||||||
|
# B11: Package funcs + fileStore methods <= line 1500
|
||||||
|
assign_features_by_query(cur, 11,
|
||||||
|
"f.go_file = 'server/filestore.go' AND "
|
||||||
|
"((f.go_class = '' OR f.go_class IS NULL) OR "
|
||||||
|
" (f.go_class = 'fileStore' AND f.go_line_number <= 1500))")
|
||||||
|
|
||||||
|
# B12: fileStore methods lines 1501-2800
|
||||||
|
assign_features_by_query(cur, 12,
|
||||||
|
"f.go_file = 'server/filestore.go' AND f.go_class = 'fileStore' "
|
||||||
|
"AND f.go_line_number > 1500 AND f.go_line_number <= 2800")
|
||||||
|
|
||||||
|
# B13: fileStore methods lines 2801-4200
|
||||||
|
assign_features_by_query(cur, 13,
|
||||||
|
"f.go_file = 'server/filestore.go' AND f.go_class = 'fileStore' "
|
||||||
|
"AND f.go_line_number > 2800 AND f.go_line_number <= 4200")
|
||||||
|
|
||||||
|
# B14: fileStore methods lines 4201+
|
||||||
|
assign_features_by_query(cur, 14,
|
||||||
|
"f.go_file = 'server/filestore.go' AND f.go_class = 'fileStore' "
|
||||||
|
"AND f.go_line_number > 4200")
|
||||||
|
|
||||||
|
# B15: msgBlock + consumerFileStore + remaining filestore classes
|
||||||
|
assign_features_by_file(cur, 15, ["server/filestore.go"])
|
||||||
|
|
||||||
|
# --- Client (B16-B17) ---
|
||||||
|
|
||||||
|
# B16: Client methods <= line 3000
|
||||||
|
assign_features_by_query(cur, 16,
|
||||||
|
"f.go_file = 'server/client.go' AND f.go_line_number <= 3000")
|
||||||
|
|
||||||
|
# B17: Client methods > line 3000 (catch remaining)
|
||||||
|
assign_features_by_file(cur, 17, ["server/client.go"])
|
||||||
|
|
||||||
|
# B18: Server Core
|
||||||
|
assign_features_by_file(cur, 18, ["server/server.go"])
|
||||||
|
|
||||||
|
# --- Accounts (B19-B20) ---
|
||||||
|
|
||||||
|
# B19: Account class
|
||||||
|
assign_features_by_query(cur, 19,
|
||||||
|
"f.go_file = 'server/accounts.go' AND f.go_class = 'Account'")
|
||||||
|
|
||||||
|
# B20: Remaining accounts (resolvers, pkg funcs, Server methods)
|
||||||
|
assign_features_by_file(cur, 20, ["server/accounts.go"])
|
||||||
|
|
||||||
|
# B21: Events + MsgTrace
|
||||||
|
assign_features_by_file(cur, 21, ["server/events.go", "server/msgtrace.go"])
|
||||||
|
|
||||||
|
# B22: Monitoring
|
||||||
|
assign_features_by_file(cur, 22, ["server/monitor.go"])
|
||||||
|
|
||||||
|
# B23: Routes
|
||||||
|
assign_features_by_file(cur, 23, ["server/route.go"])
|
||||||
|
|
||||||
|
# B24: Leaf Nodes
|
||||||
|
assign_features_by_file(cur, 24, ["server/leafnode.go"])
|
||||||
|
|
||||||
|
# B25: Gateways
|
||||||
|
assign_features_by_file(cur, 25, ["server/gateway.go"])
|
||||||
|
|
||||||
|
# B26: WebSocket
|
||||||
|
assign_features_by_file(cur, 26, ["server/websocket.go"])
|
||||||
|
|
||||||
|
# B27: JetStream Core
|
||||||
|
assign_features_by_file(cur, 27, ["server/jetstream.go"])
|
||||||
|
|
||||||
|
# B28: JetStream API
|
||||||
|
assign_features_by_file(cur, 28, ["server/jetstream_api.go"])
|
||||||
|
|
||||||
|
# B29: JetStream Batching
|
||||||
|
assign_features_by_file(cur, 29, ["server/jetstream_batching.go"])
|
||||||
|
|
||||||
|
# --- Raft (B30-B31) ---
|
||||||
|
|
||||||
|
# B30: pkg funcs + small types + raft class <= line 3200
|
||||||
|
assign_features_by_query(cur, 30,
|
||||||
|
"f.go_file = 'server/raft.go' AND "
|
||||||
|
"(f.go_class IS NULL OR f.go_class != 'raft' OR "
|
||||||
|
" (f.go_class = 'raft' AND f.go_line_number <= 3200))")
|
||||||
|
|
||||||
|
# B31: raft class > line 3200 (catch remaining)
|
||||||
|
assign_features_by_file(cur, 31, ["server/raft.go"])
|
||||||
|
|
||||||
|
# --- JetStream Cluster (B32-B35): split 231 features by line number ---
|
||||||
|
split_file_evenly(cur, "server/jetstream_cluster.go", [32, 33, 34, 35])
|
||||||
|
|
||||||
|
# --- Stream (B36-B37) ---
|
||||||
|
|
||||||
|
# B36: Stream features <= line 4600
|
||||||
|
assign_features_by_query(cur, 36,
|
||||||
|
"f.go_file = 'server/stream.go' AND f.go_line_number <= 4600")
|
||||||
|
|
||||||
|
# B37: Stream features > line 4600 (catch remaining)
|
||||||
|
assign_features_by_file(cur, 37, ["server/stream.go"])
|
||||||
|
|
||||||
|
# --- Consumer (B38-B39) ---
|
||||||
|
|
||||||
|
# B38: Consumer features <= line 3800
|
||||||
|
assign_features_by_query(cur, 38,
|
||||||
|
"f.go_file = 'server/consumer.go' AND f.go_line_number <= 3800")
|
||||||
|
|
||||||
|
# B39: Consumer features > line 3800 (catch remaining)
|
||||||
|
assign_features_by_file(cur, 39, ["server/consumer.go"])
|
||||||
|
|
||||||
|
# --- MQTT (B40-B41) ---
|
||||||
|
|
||||||
|
# B40: MQTT features <= line 3500
|
||||||
|
assign_features_by_query(cur, 40,
|
||||||
|
"f.go_file = 'server/mqtt.go' AND f.go_line_number <= 3500")
|
||||||
|
|
||||||
|
# B41: MQTT features > line 3500 (catch remaining)
|
||||||
|
assign_features_by_file(cur, 41, ["server/mqtt.go"])
|
||||||
|
|
||||||
|
# --- Sweep: assign any remaining deferred features ---
|
||||||
|
cur.execute("""
|
||||||
|
SELECT DISTINCT f.go_file FROM features f
|
||||||
|
WHERE f.status = 'deferred'
|
||||||
|
AND f.id NOT IN (SELECT feature_id FROM batch_features)
|
||||||
|
""")
|
||||||
|
remaining_files = [row[0] for row in cur.fetchall()]
|
||||||
|
if remaining_files:
|
||||||
|
for go_file in remaining_files:
|
||||||
|
assign_features_by_file(cur, 18, [go_file])
|
||||||
|
print(f" Sweep: {len(remaining_files)} extra files assigned to B18: "
|
||||||
|
f"{remaining_files}")
|
||||||
|
|
||||||
|
|
||||||
|
def get_orphan_batch(cur, test_go_file):
|
||||||
|
"""Find the primary batch for an orphan test based on its go_file."""
|
||||||
|
source_file = TEST_FILE_TO_SOURCE.get(test_go_file)
|
||||||
|
if source_file is None:
|
||||||
|
source_file = test_go_file.replace("_test.go", ".go")
|
||||||
|
|
||||||
|
cur.execute("""
|
||||||
|
SELECT MIN(bf.batch_id) FROM batch_features bf
|
||||||
|
JOIN features f ON bf.feature_id = f.id
|
||||||
|
WHERE f.go_file = ?
|
||||||
|
""", (source_file,))
|
||||||
|
row = cur.fetchone()
|
||||||
|
if row and row[0] is not None:
|
||||||
|
return row[0]
|
||||||
|
|
||||||
|
# Fallback: Server Core
|
||||||
|
return 18
|
||||||
|
|
||||||
|
|
||||||
|
def assign_tests(cur):
|
||||||
|
"""Assign all deferred tests to batches."""
|
||||||
|
cur.execute("SELECT id, go_file FROM unit_tests WHERE status = 'deferred'")
|
||||||
|
deferred_tests = cur.fetchall()
|
||||||
|
|
||||||
|
batch_0_count = 0
|
||||||
|
dep_count = 0
|
||||||
|
orphan_count = 0
|
||||||
|
|
||||||
|
for test_id, test_go_file in deferred_tests:
|
||||||
|
# Find all feature dependencies for this test
|
||||||
|
cur.execute("""
|
||||||
|
SELECT d.target_id, f.status
|
||||||
|
FROM dependencies d
|
||||||
|
JOIN features f ON d.target_id = f.id AND d.target_type = 'feature'
|
||||||
|
WHERE d.source_type = 'unit_test' AND d.source_id = ?
|
||||||
|
""", (test_id,))
|
||||||
|
deps = cur.fetchall()
|
||||||
|
|
||||||
|
if not deps:
|
||||||
|
# Orphan test: no dependency rows at all
|
||||||
|
batch_id = get_orphan_batch(cur, test_go_file)
|
||||||
|
orphan_count += 1
|
||||||
|
else:
|
||||||
|
# Collect deps whose features are still deferred/not-done
|
||||||
|
deferred_dep_ids = [
|
||||||
|
target_id for target_id, status in deps
|
||||||
|
if status not in ("verified", "complete", "n_a")
|
||||||
|
]
|
||||||
|
|
||||||
|
if not deferred_dep_ids:
|
||||||
|
# All deps satisfied -> Batch 0
|
||||||
|
batch_id = 0
|
||||||
|
batch_0_count += 1
|
||||||
|
else:
|
||||||
|
# Assign to the highest batch among deferred deps
|
||||||
|
placeholders = ",".join("?" for _ in deferred_dep_ids)
|
||||||
|
cur.execute(f"""
|
||||||
|
SELECT MAX(bf.batch_id) FROM batch_features bf
|
||||||
|
WHERE bf.feature_id IN ({placeholders})
|
||||||
|
""", deferred_dep_ids)
|
||||||
|
row = cur.fetchone()
|
||||||
|
if row and row[0] is not None:
|
||||||
|
batch_id = row[0]
|
||||||
|
dep_count += 1
|
||||||
|
else:
|
||||||
|
# Deferred deps exist but none in batch_features (edge case)
|
||||||
|
batch_id = get_orphan_batch(cur, test_go_file)
|
||||||
|
orphan_count += 1
|
||||||
|
|
||||||
|
cur.execute(
|
||||||
|
"INSERT INTO batch_tests (batch_id, test_id) VALUES (?, ?)",
|
||||||
|
(batch_id, test_id),
|
||||||
|
)
|
||||||
|
|
||||||
|
print(f" Batch 0 (implementable): {batch_0_count}")
|
||||||
|
print(f" By dependency: {dep_count}")
|
||||||
|
print(f" Orphans (by file): {orphan_count}")
|
||||||
|
|
||||||
|
|
||||||
|
def update_counts(cur):
|
||||||
|
"""Update feature_count and test_count on each batch."""
|
||||||
|
cur.execute("""
|
||||||
|
UPDATE implementation_batches SET
|
||||||
|
feature_count = (
|
||||||
|
SELECT COUNT(*) FROM batch_features
|
||||||
|
WHERE batch_id = implementation_batches.id
|
||||||
|
),
|
||||||
|
test_count = (
|
||||||
|
SELECT COUNT(*) FROM batch_tests
|
||||||
|
WHERE batch_id = implementation_batches.id
|
||||||
|
)
|
||||||
|
""")
|
||||||
|
|
||||||
|
|
||||||
|
def print_summary(cur):
|
||||||
|
"""Print a summary report."""
|
||||||
|
print()
|
||||||
|
print("=" * 80)
|
||||||
|
print("BATCH PLANNER SUMMARY")
|
||||||
|
print("=" * 80)
|
||||||
|
|
||||||
|
cur.execute("""
|
||||||
|
SELECT id, name, feature_count, test_count, depends_on
|
||||||
|
FROM implementation_batches ORDER BY id
|
||||||
|
""")
|
||||||
|
rows = cur.fetchall()
|
||||||
|
|
||||||
|
total_features = 0
|
||||||
|
total_tests = 0
|
||||||
|
|
||||||
|
print(f"\n{'ID':>3} {'Name':<35} {'Feats':>5} {'Tests':>5} {'Depends':>15}")
|
||||||
|
print("-" * 70)
|
||||||
|
|
||||||
|
for bid, name, fc, tc, deps in rows:
|
||||||
|
total_features += fc
|
||||||
|
total_tests += tc
|
||||||
|
deps_str = deps if deps else "-"
|
||||||
|
print(f"{bid:>3} {name:<35} {fc:>5} {tc:>5} {deps_str:>15}")
|
||||||
|
|
||||||
|
print("-" * 70)
|
||||||
|
print(f"{'':>3} {'TOTAL':<35} {total_features:>5} {total_tests:>5}")
|
||||||
|
|
||||||
|
# Verification
|
||||||
|
cur.execute("""
|
||||||
|
SELECT COUNT(*) FROM features
|
||||||
|
WHERE status = 'deferred'
|
||||||
|
AND id NOT IN (SELECT feature_id FROM batch_features)
|
||||||
|
""")
|
||||||
|
unassigned_features = cur.fetchone()[0]
|
||||||
|
|
||||||
|
cur.execute("""
|
||||||
|
SELECT COUNT(*) FROM unit_tests
|
||||||
|
WHERE status = 'deferred'
|
||||||
|
AND id NOT IN (SELECT test_id FROM batch_tests)
|
||||||
|
""")
|
||||||
|
unassigned_tests = cur.fetchone()[0]
|
||||||
|
|
||||||
|
print(f"\nUnassigned deferred features: {unassigned_features}")
|
||||||
|
print(f"Unassigned deferred tests: {unassigned_tests}")
|
||||||
|
|
||||||
|
if unassigned_features == 0 and unassigned_tests == 0:
|
||||||
|
print("\nAll deferred items assigned to batches.")
|
||||||
|
else:
|
||||||
|
print("\nWARNING: Some items remain unassigned!")
|
||||||
|
if unassigned_features > 0:
|
||||||
|
cur.execute("""
|
||||||
|
SELECT go_file, COUNT(*) FROM features
|
||||||
|
WHERE status = 'deferred'
|
||||||
|
AND id NOT IN (SELECT feature_id FROM batch_features)
|
||||||
|
GROUP BY go_file
|
||||||
|
""")
|
||||||
|
for go_file, cnt in cur.fetchall():
|
||||||
|
print(f" Unassigned features in {go_file}: {cnt}")
|
||||||
|
|
||||||
|
# Spot-check: raft.shutdown
|
||||||
|
cur.execute("""
|
||||||
|
SELECT bf.batch_id, f.go_method FROM batch_features bf
|
||||||
|
JOIN features f ON bf.feature_id = f.id
|
||||||
|
WHERE f.go_method = 'shutdown' AND f.go_class = 'raft'
|
||||||
|
""")
|
||||||
|
raft_shutdown = cur.fetchall()
|
||||||
|
if raft_shutdown:
|
||||||
|
print(f"\nSpot-check: raft.shutdown -> batch {raft_shutdown[0][0]}")
|
||||||
|
else:
|
||||||
|
print("\nSpot-check: raft.shutdown not found in deferred features")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if not DB_SOURCE.exists():
|
||||||
|
print(f"Error: {DB_SOURCE} not found", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Step 1: Copy database
|
||||||
|
print(f"Copying {DB_SOURCE} -> {DB_TARGET}")
|
||||||
|
shutil.copy2(DB_SOURCE, DB_TARGET)
|
||||||
|
|
||||||
|
conn = sqlite3.connect(str(DB_TARGET))
|
||||||
|
cur = conn.cursor()
|
||||||
|
cur.execute("PRAGMA foreign_keys = ON")
|
||||||
|
|
||||||
|
# Step 2: Create new tables
|
||||||
|
print("Creating batch tables...")
|
||||||
|
cur.executescript(NEW_TABLES_SQL)
|
||||||
|
|
||||||
|
# Step 3: Insert batch metadata
|
||||||
|
print("Inserting batch metadata...")
|
||||||
|
for bid, name, desc, priority, deps, go_files in BATCH_META:
|
||||||
|
cur.execute(
|
||||||
|
"INSERT INTO implementation_batches "
|
||||||
|
"(id, name, description, priority, depends_on, go_files) "
|
||||||
|
"VALUES (?, ?, ?, ?, ?, ?)",
|
||||||
|
(bid, name, desc, priority, deps, go_files),
|
||||||
|
)
|
||||||
|
|
||||||
|
# Step 4: Assign features
|
||||||
|
print("Assigning features to batches...")
|
||||||
|
assign_all_features(cur)
|
||||||
|
|
||||||
|
# Step 5: Assign tests
|
||||||
|
print("Assigning tests to batches...")
|
||||||
|
assign_tests(cur)
|
||||||
|
|
||||||
|
# Step 6: Update counts
|
||||||
|
print("Updating batch counts...")
|
||||||
|
update_counts(cur)
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
|
||||||
|
# Step 7: Print summary
|
||||||
|
print_summary(cur)
|
||||||
|
|
||||||
|
conn.close()
|
||||||
|
print(f"\nDone. Output: {DB_TARGET}")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -256,6 +256,10 @@ func (a *Analyzer) parseTestFile(filePath string) ([]TestFunc, []ImportInfo, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
test.FeatureName = a.inferFeatureName(name)
|
test.FeatureName = a.inferFeatureName(name)
|
||||||
|
test.BestFeatureIdx = -1
|
||||||
|
if fn.Body != nil {
|
||||||
|
test.Calls = a.extractCalls(fn.Body)
|
||||||
|
}
|
||||||
tests = append(tests, test)
|
tests = append(tests, test)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,6 +335,210 @@ func (a *Analyzer) inferFeatureName(testName string) string {
|
|||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// extractCalls walks an AST block statement and extracts all function/method calls.
|
||||||
|
func (a *Analyzer) extractCalls(body *ast.BlockStmt) []CallInfo {
|
||||||
|
seen := make(map[string]bool)
|
||||||
|
var calls []CallInfo
|
||||||
|
|
||||||
|
ast.Inspect(body, func(n ast.Node) bool {
|
||||||
|
callExpr, ok := n.(*ast.CallExpr)
|
||||||
|
if !ok {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
var ci CallInfo
|
||||||
|
switch fun := callExpr.Fun.(type) {
|
||||||
|
case *ast.Ident:
|
||||||
|
ci = CallInfo{FuncName: fun.Name}
|
||||||
|
case *ast.SelectorExpr:
|
||||||
|
ci = CallInfo{
|
||||||
|
RecvOrPkg: extractIdent(fun.X),
|
||||||
|
MethodName: fun.Sel.Name,
|
||||||
|
IsSelector: true,
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
key := ci.callKey()
|
||||||
|
if !seen[key] && !isFilteredCall(ci) {
|
||||||
|
seen[key] = true
|
||||||
|
calls = append(calls, ci)
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
|
||||||
|
return calls
|
||||||
|
}
|
||||||
|
|
||||||
|
// extractIdent extracts an identifier name from an expression (handles X in X.Y).
|
||||||
|
func extractIdent(expr ast.Expr) string {
|
||||||
|
switch e := expr.(type) {
|
||||||
|
case *ast.Ident:
|
||||||
|
return e.Name
|
||||||
|
case *ast.SelectorExpr:
|
||||||
|
return extractIdent(e.X) + "." + e.Sel.Name
|
||||||
|
default:
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// isFilteredCall returns true if a call should be excluded from feature matching.
|
||||||
|
func isFilteredCall(c CallInfo) bool {
|
||||||
|
if c.IsSelector {
|
||||||
|
recv := c.RecvOrPkg
|
||||||
|
// testing.T/B methods
|
||||||
|
if recv == "t" || recv == "b" || recv == "tb" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// stdlib packages
|
||||||
|
if stdlibPkgs[recv] {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// NATS client libs
|
||||||
|
if recv == "nats" || recv == "nuid" || recv == "nkeys" || recv == "jwt" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Go builtins
|
||||||
|
name := c.FuncName
|
||||||
|
if builtinFuncs[name] {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test assertion helpers
|
||||||
|
lower := strings.ToLower(name)
|
||||||
|
if strings.HasPrefix(name, "require_") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
for _, prefix := range []string{"check", "verify", "assert", "expect"} {
|
||||||
|
if strings.HasPrefix(lower, prefix) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// featureRef identifies a feature within the analysis result.
|
||||||
|
type featureRef struct {
|
||||||
|
moduleIdx int
|
||||||
|
featureIdx int
|
||||||
|
goFile string
|
||||||
|
goClass string
|
||||||
|
}
|
||||||
|
|
||||||
|
// resolveCallGraph matches test calls against known features across all modules.
|
||||||
|
func resolveCallGraph(result *AnalysisResult) {
|
||||||
|
// Build method index: go_method name → list of feature refs
|
||||||
|
methodIndex := make(map[string][]featureRef)
|
||||||
|
for mi, mod := range result.Modules {
|
||||||
|
for fi, feat := range mod.Features {
|
||||||
|
ref := featureRef{
|
||||||
|
moduleIdx: mi,
|
||||||
|
featureIdx: fi,
|
||||||
|
goFile: feat.GoFile,
|
||||||
|
goClass: feat.GoClass,
|
||||||
|
}
|
||||||
|
methodIndex[feat.GoMethod] = append(methodIndex[feat.GoMethod], ref)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// For each test, resolve calls to features
|
||||||
|
for mi := range result.Modules {
|
||||||
|
mod := &result.Modules[mi]
|
||||||
|
for ti := range mod.Tests {
|
||||||
|
test := &mod.Tests[ti]
|
||||||
|
seen := make(map[int]bool) // feature indices already linked
|
||||||
|
var linked []int
|
||||||
|
|
||||||
|
testFileBase := sourceFileBase(test.GoFile)
|
||||||
|
|
||||||
|
for _, call := range test.Calls {
|
||||||
|
// Look up the method name
|
||||||
|
name := call.MethodName
|
||||||
|
if !call.IsSelector {
|
||||||
|
name = call.FuncName
|
||||||
|
}
|
||||||
|
|
||||||
|
candidates := methodIndex[name]
|
||||||
|
if len(candidates) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// Ambiguity threshold: skip very common method names
|
||||||
|
if len(candidates) > 10 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter to same module
|
||||||
|
var sameModule []featureRef
|
||||||
|
for _, ref := range candidates {
|
||||||
|
if ref.moduleIdx == mi {
|
||||||
|
sameModule = append(sameModule, ref)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(sameModule) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, ref := range sameModule {
|
||||||
|
if !seen[ref.featureIdx] {
|
||||||
|
seen[ref.featureIdx] = true
|
||||||
|
linked = append(linked, ref.featureIdx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test.LinkedFeatures = linked
|
||||||
|
|
||||||
|
// Set BestFeatureIdx using priority:
|
||||||
|
// (a) existing inferFeatureName match
|
||||||
|
// (b) same-file-base match
|
||||||
|
// (c) first remaining candidate
|
||||||
|
if test.BestFeatureIdx < 0 && len(linked) > 0 {
|
||||||
|
// Try same-file-base match first
|
||||||
|
for _, fi := range linked {
|
||||||
|
featFileBase := sourceFileBase(mod.Features[fi].GoFile)
|
||||||
|
if featFileBase == testFileBase {
|
||||||
|
test.BestFeatureIdx = fi
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Fall back to first candidate
|
||||||
|
if test.BestFeatureIdx < 0 {
|
||||||
|
test.BestFeatureIdx = linked[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// sourceFileBase strips _test.go suffix and path to get the base file name.
|
||||||
|
func sourceFileBase(goFile string) string {
|
||||||
|
base := filepath.Base(goFile)
|
||||||
|
base = strings.TrimSuffix(base, "_test.go")
|
||||||
|
base = strings.TrimSuffix(base, ".go")
|
||||||
|
return base
|
||||||
|
}
|
||||||
|
|
||||||
|
var stdlibPkgs = map[string]bool{
|
||||||
|
"fmt": true, "time": true, "strings": true, "bytes": true, "errors": true,
|
||||||
|
"os": true, "math": true, "sort": true, "reflect": true, "sync": true,
|
||||||
|
"context": true, "io": true, "filepath": true, "strconv": true,
|
||||||
|
"encoding": true, "json": true, "binary": true, "hex": true, "rand": true,
|
||||||
|
"runtime": true, "atomic": true, "slices": true, "testing": true,
|
||||||
|
"net": true, "bufio": true, "crypto": true, "log": true, "regexp": true,
|
||||||
|
"unicode": true, "http": true, "url": true,
|
||||||
|
}
|
||||||
|
|
||||||
|
var builtinFuncs = map[string]bool{
|
||||||
|
"make": true, "append": true, "len": true, "cap": true, "close": true,
|
||||||
|
"delete": true, "panic": true, "recover": true, "print": true,
|
||||||
|
"println": true, "copy": true, "new": true,
|
||||||
|
}
|
||||||
|
|
||||||
// isStdlib checks if an import path is a Go standard library package.
|
// isStdlib checks if an import path is a Go standard library package.
|
||||||
func isStdlib(importPath string) bool {
|
func isStdlib(importPath string) bool {
|
||||||
firstSlash := strings.Index(importPath, "/")
|
firstSlash := strings.Index(importPath, "/")
|
||||||
|
|||||||
@@ -11,28 +11,47 @@ func main() {
|
|||||||
sourceDir := flag.String("source", "", "Path to Go source root (e.g., ../../golang/nats-server)")
|
sourceDir := flag.String("source", "", "Path to Go source root (e.g., ../../golang/nats-server)")
|
||||||
dbPath := flag.String("db", "", "Path to SQLite database file (e.g., ../../porting.db)")
|
dbPath := flag.String("db", "", "Path to SQLite database file (e.g., ../../porting.db)")
|
||||||
schemaPath := flag.String("schema", "", "Path to SQL schema file (e.g., ../../porting-schema.sql)")
|
schemaPath := flag.String("schema", "", "Path to SQL schema file (e.g., ../../porting-schema.sql)")
|
||||||
|
mode := flag.String("mode", "full", "Analysis mode: 'full' (default) or 'call-graph' (incremental)")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
if *sourceDir == "" || *dbPath == "" || *schemaPath == "" {
|
if *sourceDir == "" || *dbPath == "" {
|
||||||
fmt.Fprintf(os.Stderr, "Usage: go-analyzer --source <path> --db <path> --schema <path>\n")
|
fmt.Fprintf(os.Stderr, "Usage: go-analyzer --source <path> --db <path> [--schema <path>] [--mode full|call-graph]\n")
|
||||||
flag.PrintDefaults()
|
flag.PrintDefaults()
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch *mode {
|
||||||
|
case "full":
|
||||||
|
runFull(*sourceDir, *dbPath, *schemaPath)
|
||||||
|
case "call-graph":
|
||||||
|
runCallGraph(*sourceDir, *dbPath)
|
||||||
|
default:
|
||||||
|
log.Fatalf("Unknown mode %q: must be 'full' or 'call-graph'", *mode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func runFull(sourceDir, dbPath, schemaPath string) {
|
||||||
|
if schemaPath == "" {
|
||||||
|
log.Fatal("--schema is required for full mode")
|
||||||
|
}
|
||||||
|
|
||||||
// Open DB and apply schema
|
// Open DB and apply schema
|
||||||
db, err := OpenDB(*dbPath, *schemaPath)
|
db, err := OpenDB(dbPath, schemaPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failed to open database: %v", err)
|
log.Fatalf("Failed to open database: %v", err)
|
||||||
}
|
}
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
|
||||||
// Run analysis
|
// Run analysis
|
||||||
analyzer := NewAnalyzer(*sourceDir)
|
analyzer := NewAnalyzer(sourceDir)
|
||||||
result, err := analyzer.Analyze()
|
result, err := analyzer.Analyze()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Analysis failed: %v", err)
|
log.Fatalf("Analysis failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Resolve call graph before writing
|
||||||
|
resolveCallGraph(result)
|
||||||
|
|
||||||
// Write to DB
|
// Write to DB
|
||||||
writer := NewDBWriter(db)
|
writer := NewDBWriter(db)
|
||||||
if err := writer.WriteAll(result); err != nil {
|
if err := writer.WriteAll(result); err != nil {
|
||||||
@@ -46,3 +65,35 @@ func main() {
|
|||||||
fmt.Printf(" Dependencies: %d\n", len(result.Dependencies))
|
fmt.Printf(" Dependencies: %d\n", len(result.Dependencies))
|
||||||
fmt.Printf(" Imports: %d\n", len(result.Imports))
|
fmt.Printf(" Imports: %d\n", len(result.Imports))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func runCallGraph(sourceDir, dbPath string) {
|
||||||
|
// Open existing DB without schema
|
||||||
|
db, err := OpenDBNoSchema(dbPath)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to open database: %v", err)
|
||||||
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
// Run analysis (parse Go source)
|
||||||
|
analyzer := NewAnalyzer(sourceDir)
|
||||||
|
result, err := analyzer.Analyze()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Analysis failed: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resolve call graph
|
||||||
|
resolveCallGraph(result)
|
||||||
|
|
||||||
|
// Update DB incrementally
|
||||||
|
writer := NewDBWriter(db)
|
||||||
|
stats, err := writer.UpdateCallGraph(result)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to update call graph: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Call graph analysis complete:\n")
|
||||||
|
fmt.Printf(" Tests analyzed: %d\n", stats.TestsAnalyzed)
|
||||||
|
fmt.Printf(" Tests linked: %d\n", stats.TestsLinked)
|
||||||
|
fmt.Printf(" Dependency rows: %d\n", stats.DependencyRows)
|
||||||
|
fmt.Printf(" Feature IDs set: %d\n", stats.FeatureIDsSet)
|
||||||
|
}
|
||||||
|
|||||||
@@ -152,3 +152,176 @@ func (w *DBWriter) insertLibrary(tx *sql.Tx, imp *ImportInfo) error {
|
|||||||
)
|
)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OpenDBNoSchema opens an existing SQLite database without applying schema.
|
||||||
|
// It verifies that the required tables exist.
|
||||||
|
func OpenDBNoSchema(dbPath string) (*sql.DB, error) {
|
||||||
|
db, err := sql.Open("sqlite3", dbPath+"?_journal_mode=WAL&_foreign_keys=ON")
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("opening database: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify required tables exist
|
||||||
|
for _, table := range []string{"modules", "features", "unit_tests", "dependencies"} {
|
||||||
|
var name string
|
||||||
|
err := db.QueryRow("SELECT name FROM sqlite_master WHERE type='table' AND name=?", table).Scan(&name)
|
||||||
|
if err != nil {
|
||||||
|
db.Close()
|
||||||
|
return nil, fmt.Errorf("required table %q not found: %w", table, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return db, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CallGraphStats holds summary statistics from a call-graph update.
|
||||||
|
type CallGraphStats struct {
|
||||||
|
TestsAnalyzed int
|
||||||
|
TestsLinked int
|
||||||
|
DependencyRows int
|
||||||
|
FeatureIDsSet int
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateCallGraph writes call-graph analysis results to the database incrementally.
|
||||||
|
func (w *DBWriter) UpdateCallGraph(result *AnalysisResult) (*CallGraphStats, error) {
|
||||||
|
stats := &CallGraphStats{}
|
||||||
|
|
||||||
|
// Load module name→ID mapping
|
||||||
|
moduleIDs := make(map[string]int64)
|
||||||
|
rows, err := w.db.Query("SELECT id, name FROM modules")
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("querying modules: %w", err)
|
||||||
|
}
|
||||||
|
for rows.Next() {
|
||||||
|
var id int64
|
||||||
|
var name string
|
||||||
|
if err := rows.Scan(&id, &name); err != nil {
|
||||||
|
rows.Close()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
moduleIDs[name] = id
|
||||||
|
}
|
||||||
|
rows.Close()
|
||||||
|
|
||||||
|
// Load feature DB IDs: "module_name:go_method:go_class" → id
|
||||||
|
type featureKey struct {
|
||||||
|
moduleName string
|
||||||
|
goMethod string
|
||||||
|
goClass string
|
||||||
|
}
|
||||||
|
featureDBIDs := make(map[featureKey]int64)
|
||||||
|
rows, err = w.db.Query(`
|
||||||
|
SELECT f.id, m.name, f.go_method, COALESCE(f.go_class, '')
|
||||||
|
FROM features f
|
||||||
|
JOIN modules m ON f.module_id = m.id
|
||||||
|
`)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("querying features: %w", err)
|
||||||
|
}
|
||||||
|
for rows.Next() {
|
||||||
|
var id int64
|
||||||
|
var modName, goMethod, goClass string
|
||||||
|
if err := rows.Scan(&id, &modName, &goMethod, &goClass); err != nil {
|
||||||
|
rows.Close()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
featureDBIDs[featureKey{modName, goMethod, goClass}] = id
|
||||||
|
}
|
||||||
|
rows.Close()
|
||||||
|
|
||||||
|
// Load test DB IDs: "module_name:go_method" → id
|
||||||
|
testDBIDs := make(map[string]int64)
|
||||||
|
rows, err = w.db.Query(`
|
||||||
|
SELECT ut.id, m.name, ut.go_method
|
||||||
|
FROM unit_tests ut
|
||||||
|
JOIN modules m ON ut.module_id = m.id
|
||||||
|
`)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("querying unit_tests: %w", err)
|
||||||
|
}
|
||||||
|
for rows.Next() {
|
||||||
|
var id int64
|
||||||
|
var modName, goMethod string
|
||||||
|
if err := rows.Scan(&id, &modName, &goMethod); err != nil {
|
||||||
|
rows.Close()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
testDBIDs[modName+":"+goMethod] = id
|
||||||
|
}
|
||||||
|
rows.Close()
|
||||||
|
|
||||||
|
// Begin transaction
|
||||||
|
tx, err := w.db.Begin()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("beginning transaction: %w", err)
|
||||||
|
}
|
||||||
|
defer tx.Rollback()
|
||||||
|
|
||||||
|
// Clear old call-graph data
|
||||||
|
if _, err := tx.Exec("DELETE FROM dependencies WHERE source_type='unit_test' AND dependency_kind='calls'"); err != nil {
|
||||||
|
return nil, fmt.Errorf("clearing old dependencies: %w", err)
|
||||||
|
}
|
||||||
|
if _, err := tx.Exec("UPDATE unit_tests SET feature_id = NULL"); err != nil {
|
||||||
|
return nil, fmt.Errorf("clearing old feature_ids: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare statements
|
||||||
|
insertDep, err := tx.Prepare("INSERT OR IGNORE INTO dependencies (source_type, source_id, target_type, target_id, dependency_kind) VALUES ('unit_test', ?, 'feature', ?, 'calls')")
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("preparing insert dependency: %w", err)
|
||||||
|
}
|
||||||
|
defer insertDep.Close()
|
||||||
|
|
||||||
|
updateFeatureID, err := tx.Prepare("UPDATE unit_tests SET feature_id = ? WHERE id = ?")
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("preparing update feature_id: %w", err)
|
||||||
|
}
|
||||||
|
defer updateFeatureID.Close()
|
||||||
|
|
||||||
|
// Process each module's tests
|
||||||
|
for _, mod := range result.Modules {
|
||||||
|
for _, test := range mod.Tests {
|
||||||
|
stats.TestsAnalyzed++
|
||||||
|
|
||||||
|
testDBID, ok := testDBIDs[mod.Name+":"+test.GoMethod]
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert dependency rows for linked features
|
||||||
|
if len(test.LinkedFeatures) > 0 {
|
||||||
|
stats.TestsLinked++
|
||||||
|
}
|
||||||
|
for _, fi := range test.LinkedFeatures {
|
||||||
|
feat := mod.Features[fi]
|
||||||
|
featDBID, ok := featureDBIDs[featureKey{mod.Name, feat.GoMethod, feat.GoClass}]
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if _, err := insertDep.Exec(testDBID, featDBID); err != nil {
|
||||||
|
return nil, fmt.Errorf("inserting dependency for test %s: %w", test.GoMethod, err)
|
||||||
|
}
|
||||||
|
stats.DependencyRows++
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set feature_id for best match
|
||||||
|
if test.BestFeatureIdx >= 0 {
|
||||||
|
feat := mod.Features[test.BestFeatureIdx]
|
||||||
|
featDBID, ok := featureDBIDs[featureKey{mod.Name, feat.GoMethod, feat.GoClass}]
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if _, err := updateFeatureID.Exec(featDBID, testDBID); err != nil {
|
||||||
|
return nil, fmt.Errorf("updating feature_id for test %s: %w", test.GoMethod, err)
|
||||||
|
}
|
||||||
|
stats.FeatureIDsSet++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tx.Commit(); err != nil {
|
||||||
|
return nil, fmt.Errorf("committing transaction: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return stats, nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -58,6 +58,28 @@ type TestFunc struct {
|
|||||||
GoLineCount int
|
GoLineCount int
|
||||||
// FeatureName links this test to a feature by naming convention
|
// FeatureName links this test to a feature by naming convention
|
||||||
FeatureName string
|
FeatureName string
|
||||||
|
// Calls holds raw function/method calls extracted from the test body AST
|
||||||
|
Calls []CallInfo
|
||||||
|
// LinkedFeatures holds indices into the parent module's Features slice
|
||||||
|
LinkedFeatures []int
|
||||||
|
// BestFeatureIdx is the primary feature match index (-1 = none)
|
||||||
|
BestFeatureIdx int
|
||||||
|
}
|
||||||
|
|
||||||
|
// CallInfo represents a function or method call extracted from a test body.
|
||||||
|
type CallInfo struct {
|
||||||
|
FuncName string // direct call name: "newMemStore"
|
||||||
|
RecvOrPkg string // selector receiver/pkg: "ms", "fmt", "t"
|
||||||
|
MethodName string // selector method: "StoreMsg", "Fatalf"
|
||||||
|
IsSelector bool // true for X.Y() form
|
||||||
|
}
|
||||||
|
|
||||||
|
// callKey returns a deduplication key for this call.
|
||||||
|
func (c CallInfo) callKey() string {
|
||||||
|
if c.IsSelector {
|
||||||
|
return c.RecvOrPkg + "." + c.MethodName
|
||||||
|
}
|
||||||
|
return c.FuncName
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dependency represents a call relationship between two items.
|
// Dependency represents a call relationship between two items.
|
||||||
|
|||||||
Reference in New Issue
Block a user