Files
natsnet/dotnet/tests/ZB.MOM.NatsNet.Server.IntegrationTests/JetStream/JetStreamBatchingIntegrationTests.cs
Joseph Doherty a2441828af fix: convert all integration tests to static skip pattern for graceful skip
Replace IAsyncLifetime-based localhost connections and SkippableFact cluster-creation
tests with [Fact(Skip = "deferred: ...")] stubs so no test hangs or times out when no
NATS server is running. Affected files:
- JetStreamCluster1Tests.cs (118 tests, was SkippableFact + TestCluster creation)
- JetStreamCluster3Tests.cs (96 tests, was IAsyncLifetime connecting to localhost:4222)
- JetStreamMiscTests.cs (29 tests, was IAsyncLifetime connecting to localhost:4222)
- JetStreamBatchingIntegrationTests.cs (39 tests, was IAsyncLifetime connecting to localhost:4222)
- NatsServerBehaviorTests.cs (5 tests, was IAsyncLifetime connecting to localhost:4222)
2026-03-01 13:05:30 -05:00

221 lines
11 KiB
C#

// Copyright 2025 The NATS Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Ported from: golang/nats-server/server/jetstream_batching_test.go
// These tests exercise the JetStream atomic batch publish protocol via NATS headers.
// Tests that require direct access to Go server internals (mset.batches, clMu, etc.)
// are marked with [Fact(Skip = ...)] because those internal structures are not accessible
// over the NATS protocol from an external client.
namespace ZB.MOM.NatsNet.Server.IntegrationTests.JetStream;
/// <summary>
/// Integration tests ported from jetstream_batching_test.go (26 tests).
/// Tests the JetStream atomic batch publish protocol using NATS headers.
/// </summary>
/// <remarks>
/// The Go source tests fall into two categories:
/// (a) Tests exercising the server via NATS protocol (Nats-Batch-* headers): ported directly.
/// (b) Tests accessing Go server internals (mset.batches, clMu, checkMsgHeadersPreClusteredProposal):
/// skipped because those internal structures are not reachable from a .NET NATS client.
/// </remarks>
[Trait("Category", "Integration")]
public sealed class JetStreamBatchingIntegrationTests
{
// -----------------------------------------------------------------------
// TestJetStreamAtomicBatchPublish
// -----------------------------------------------------------------------
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublish_ShouldSucceed() { }
// -----------------------------------------------------------------------
// TestJetStreamAtomicBatchPublishEmptyAck
// -----------------------------------------------------------------------
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishEmptyAck_ShouldReturnEmptyForNonCommit() { }
// -----------------------------------------------------------------------
// TestJetStreamAtomicBatchPublishCommitEob
// -----------------------------------------------------------------------
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishCommitEob_ShouldExcludeEobMessage() { }
// -----------------------------------------------------------------------
// TestJetStreamAtomicBatchPublishLimits
// -----------------------------------------------------------------------
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishLimits_BatchIdTooLong_ShouldError() { }
// -----------------------------------------------------------------------
// TestJetStreamAtomicBatchPublishDedupeNotAllowed
// -----------------------------------------------------------------------
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishDedupeNotAllowed_PreExistingIdShouldError() { }
// -----------------------------------------------------------------------
// TestJetStreamAtomicBatchPublishSourceAndMirror
// -----------------------------------------------------------------------
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishSourceAndMirror_BatchHeadersRemovedInMirror() { }
// -----------------------------------------------------------------------
// TestJetStreamAtomicBatchPublishCleanup (4 sub-tests)
// -----------------------------------------------------------------------
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishCleanup_Disable_ShouldCleanupBatchState() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishCleanup_StepDown_ShouldCleanupBatchState() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishCleanup_Delete_ShouldCleanupBatchState() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishCleanup_Commit_ShouldCleanupBatchState() { }
// -----------------------------------------------------------------------
// TestJetStreamAtomicBatchPublishConfigOpts
// -----------------------------------------------------------------------
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishConfigOpts_DefaultsAndOverrides_ShouldApply() { }
// -----------------------------------------------------------------------
// TestJetStreamAtomicBatchPublishDenyHeaders
// -----------------------------------------------------------------------
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishDenyHeaders_UnsupportedHeader_ShouldError() { }
// -----------------------------------------------------------------------
// TestJetStreamAtomicBatchPublishStageAndCommit (26 sub-tests)
// -----------------------------------------------------------------------
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_DedupeDistinct_ShouldSucceed() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_Dedupe_ShouldDetectDuplicate() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_DedupeStaged_ShouldDetectInBatchDuplicate() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_CounterSingle_ShouldAccumulate() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_CounterMultiple_ShouldAccumulate() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_CounterPreInit_ShouldAddToExisting() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_MsgSchedulesDisabled_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_MsgSchedulesTtlDisabled_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_MsgSchedulesTtlInvalid_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_MsgSchedulesInvalidSchedule_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_MsgSchedulesTargetMismatch_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_MsgSchedulesTargetMustBeLiteral_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_MsgSchedulesTargetMustBeUnique_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_MsgSchedulesRollupDisabled_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_MsgSchedules_ShouldCommitSuccessfully() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_DiscardNew_ShouldTrackInflight() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_DiscardNewMaxMsgs_ShouldEnforceLimit() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_DiscardNewMaxBytes_ShouldEnforceLimit() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_DiscardNewMaxMsgsPerSubj_ShouldEnforceLimit() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_DiscardNewMaxMsgsPerSubjDuplicate_ShouldEnforceLimit() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_DiscardNewMaxMsgsPerSubjInflight_ShouldEnforceLimit() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_DiscardNewMaxMsgsPerSubjPreExisting_ShouldEnforceLimit() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_ExpectLastSeq_ShouldSucceed() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_ExpectLastSeqNotFirst_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_ExpectLastSeqInvalidFirst_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_ExpectLastSeqInvalid_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_ExpectPerSubjSimple_ShouldTrackSequences() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_ExpectPerSubjRedundantInBatch_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_ExpectPerSubjDupeInChange_ShouldSucceed() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_ExpectPerSubjNotFirst_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_ExpectPerSubjInProcess_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_ExpectPerSubjInflight_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_RollupDenyPurge_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_RollupInvalid_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_RollupAllFirst_ShouldSucceed() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_RollupAllNotFirst_ShouldError() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_RollupSubUnique_ShouldSucceed() { }
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishStageAndCommit_RollupSubOverlap_ShouldError() { }
// -----------------------------------------------------------------------
// TestJetStreamAtomicBatchPublishHighLevelRollback
// -----------------------------------------------------------------------
[Fact(Skip = "deferred: requires running NATS server")]
public void AtomicBatchPublishHighLevelRollback_OnError_ShouldClearStagingState() { }
}