// Copyright 2012-2025 The NATS Authors // Licensed under the Apache License, Version 2.0 using Xunit.Abstractions; namespace ZB.MOM.NatsNet.Server.IntegrationTests.Helpers; /// /// Stub helper for creating multi-server NATS clusters in integration tests. /// In the Go test suite, this corresponds to createJetStreamCluster(t, numServers, name) and /// createJetStreamSuperCluster(t, numClusters, numServersPerCluster). /// /// This stub is a placeholder until cluster orchestration is implemented. /// Tests using this helper will skip unless NATS_INTEGRATION_ENABLED=true. /// public sealed class TestCluster : IDisposable { private readonly ITestOutputHelper _output; /// Number of servers in the cluster. public int ServerCount { get; } /// Cluster name. public string Name { get; } /// URL of a random server in the cluster (stub returns the default URL). public string RandomServerUrl => Environment.GetEnvironmentVariable("NATS_TEST_SERVER_URL") ?? "nats://localhost:4222"; private TestCluster(ITestOutputHelper output, int serverCount, string name) { _output = output; ServerCount = serverCount; Name = name; } /// /// Creates a stub JetStream cluster. Throws NotSupportedException when integration is disabled. /// Corresponds to createJetStreamCluster(t, numServers, name) in Go tests. /// public static TestCluster CreateJetStreamCluster(int numServers, string name, ITestOutputHelper output) { if (!IntegrationTestBase.IntegrationEnabled) throw new NotSupportedException(IntegrationTestBase.SkipMessage); output.WriteLine($"Creating JetStream cluster '{name}' with {numServers} servers (stub)"); return new TestCluster(output, numServers, name); } /// /// Creates a stub JetStream super-cluster. /// Corresponds to createJetStreamSuperCluster(t, numClusters, numServers) in Go tests. /// public static TestCluster CreateJetStreamSuperCluster(int numClusters, int numServersPerCluster, ITestOutputHelper output) { if (!IntegrationTestBase.IntegrationEnabled) throw new NotSupportedException(IntegrationTestBase.SkipMessage); output.WriteLine($"Creating JetStream super-cluster with {numClusters} clusters x {numServersPerCluster} servers (stub)"); return new TestCluster(output, numClusters * numServersPerCluster, $"SuperCluster({numClusters}x{numServersPerCluster})"); } public void Dispose() { _output.WriteLine($"Shutting down cluster '{Name}'"); } }