-
Notifications
You must be signed in to change notification settings - Fork 8.9k
test: add unit tests for server cluster module #7767
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
WangzJi
wants to merge
37
commits into
apache:2.x
Choose a base branch
from
WangzJi:claude/add-unit-tests-011CUpCCHrzB7YG4Mx8jAUdF
base: 2.x
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
test: add unit tests for server cluster module #7767
WangzJi
wants to merge
37
commits into
apache:2.x
from
WangzJi:claude/add-unit-tests-011CUpCCHrzB7YG4Mx8jAUdF
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add unit tests for cluster module components: - Message classes: RaftBaseMsg, RaftBranchSessionSyncMsg, RaftGlobalSessionSyncMsg, RaftClusterMetadataMsg, RaftVGroupSyncMsg - DTO classes: BranchTransactionDTO, GlobalTransactionDTO, RaftClusterMetadata - Serializer: JacksonSerializer - Event: ClusterChangeEvent Total: 10 new test files covering basic cluster module components
Add unit tests for cluster module components: - Message classes: RaftBaseMsg, RaftBranchSessionSyncMsg, RaftGlobalSessionSyncMsg, RaftClusterMetadataMsg, RaftVGroupSyncMsg - DTO classes: BranchTransactionDTO, GlobalTransactionDTO, RaftClusterMetadata - Serializer: JacksonSerializer - Event: ClusterChangeEvent Total: 10 new test files covering basic cluster module components
Add unit tests for cluster module components: - Message classes: RaftBaseMsg, RaftBranchSessionSyncMsg, RaftGlobalSessionSyncMsg, RaftClusterMetadataMsg, RaftVGroupSyncMsg - DTO classes: BranchTransactionDTO, GlobalTransactionDTO, RaftClusterMetadata - Serializer: JacksonSerializer - Event: ClusterChangeEvent Total: 10 new test files covering basic cluster module components
Add unit tests for cluster module components: - Message classes: RaftBaseMsg, RaftBranchSessionSyncMsg, RaftGlobalSessionSyncMsg, RaftClusterMetadataMsg, RaftVGroupSyncMsg - DTO classes: BranchTransactionDTO, GlobalTransactionDTO, RaftClusterMetadata - Serializer: JacksonSerializer - Event: ClusterChangeEvent Total: 10 new test files covering basic cluster module components
19ba1ec to
d70ff63
Compare
…zB7YG4Mx8jAUdF' into claude/add-unit-tests-011CUpCCHrzB7YG4Mx8jAUdF # Conflicts: # server/src/test/java/org/apache/seata/server/cluster/listener/ClusterChangeEventTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/RaftBaseMsgTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/RaftBranchSessionSyncMsgTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/RaftClusterMetadataMsgTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/RaftGlobalSessionSyncMsgTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/RaftVGroupSyncMsgTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/dto/BranchTransactionDTOTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/dto/GlobalTransactionDTOTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/dto/RaftClusterMetadataTest.java
…zB7YG4Mx8jAUdF' into claude/add-unit-tests-011CUpCCHrzB7YG4Mx8jAUdF # Conflicts: # server/src/test/java/org/apache/seata/server/cluster/listener/ClusterChangeEventTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/RaftBaseMsgTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/RaftBranchSessionSyncMsgTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/RaftClusterMetadataMsgTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/RaftGlobalSessionSyncMsgTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/RaftVGroupSyncMsgTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/dto/BranchTransactionDTOTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/dto/GlobalTransactionDTOTest.java # server/src/test/java/org/apache/seata/server/cluster/raft/sync/msg/dto/RaftClusterMetadataTest.java
MappingDO only has a no-arg constructor. Changed to use no-arg constructor followed by setter methods to initialize vGroup and cluster.
MappingDO only has a no-arg constructor. Changed to use no-arg constructor followed by setter methods to initialize vGroup and cluster.
…zB7YG4Mx8jAUdF' into claude/add-unit-tests-011CUpCCHrzB7YG4Mx8jAUdF
…zB7YG4Mx8jAUdF' into claude/add-unit-tests-011CUpCCHrzB7YG4Mx8jAUdF
Remove serialization tests for MappingDO and Node classes as they don't implement Serializable interface. Replace with alternative tests that verify getters/setters and object management.
Remove serialization tests for MappingDO and Node classes as they don't implement Serializable interface. Replace with alternative tests that verify getters/setters and object management.
…zB7YG4Mx8jAUdF' into claude/add-unit-tests-011CUpCCHrzB7YG4Mx8jAUdF
…zB7YG4Mx8jAUdF' into claude/add-unit-tests-011CUpCCHrzB7YG4Mx8jAUdF
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## 2.x #7767 +/- ##
============================================
+ Coverage 67.64% 67.96% +0.31%
+ Complexity 994 992 -2
============================================
Files 1323 1323
Lines 50157 50157
Branches 5929 5929
============================================
+ Hits 33931 34089 +158
+ Misses 13297 13144 -153
+ Partials 2929 2924 -5 🚀 New features to boost your workflow:
|
Add tests for: - PutNodeMetadataRequest: constructor and getters/setters - PutNodeMetadataResponse: constructor, getters/setters, and toString - PutNodeInfoRequestProcessor: constructor and interest method Total: 3 new test files with 11 test methods
Add tests for: - PutNodeMetadataRequest: constructor and getters/setters - PutNodeMetadataResponse: constructor, getters/setters, and toString - PutNodeInfoRequestProcessor: constructor and interest method Total: 3 new test files with 11 test methods
e846d08 to
4458da9
Compare
…zB7YG4Mx8jAUdF' into claude/add-unit-tests-011CUpCCHrzB7YG4Mx8jAUdF
Add tests for RaftServerManager and RaftStateMachine: - RaftServerTest: added 7 new test methods for RaftServerManager * testIsRaftModeWhenNotInitialized * testGetRaftServerWhenNotInitialized * testGetRaftServersWhenNotInitialized * testGroupsWhenNotInitialized * testIsLeaderWhenNotInRaftMode * testCliServiceInstance * testCliClientServiceInstance - RaftStateMachineTest: new test file with 4 test methods * testConstructor * testIsLeaderWhenNotLeader * testIsLeaderInitialState * testMultipleInstances Total: 11 new test methods
Replace basic 4-test version with 21 comprehensive tests covering: - Leader election lifecycle (onLeaderStart/Stop) - Follower state transitions (onStartFollowing/StopFollowing) - Term management and progression - Metadata get/set operations - Snapshot file registry - State transition cycles - Mode-specific behavior (file vs raft mode) Addresses user feedback: core business logic must be tested, not just constructors
Add 21 unit tests for RaftServer class covering: 1. Constructor and initialization - Field initialization verification - RaftStateMachine creation - groupPath setup 2. System property validation (setSystemProperty) - Valid value setting - Null value rejection - Empty string rejection - Whitespace handling 3. SSL configuration (enableSSL) - 8 system properties correctly set - Configuration reading - Missing configuration exception handling 4. Resource cleanup (destroy) - Null safety for raftGroupService - shutdown() and join() invocation - InterruptedException handling - Multiple destroy calls safety - close() delegates to destroy() 5. Getters validation - getServerId() - getRaftStateMachine() - getNode() before start Tests focus on validation logic and resource management that can be tested independently without complex integration setup. Use mockito for mocking RaftGroupService to test destroy behavior.
Add 20 integration tests covering RaftServerManager boundary conditions: 1. Configuration parsing and validation - Invalid configuration format - Empty server address - Port 0 with no matching IP - Custom group configuration 2. Raft options configuration - Custom election timeout - Custom snapshot interval - All raft options (apply batch, buffer sizes, sync mode) 3. State management - isRaftMode after init and destroy - getRaftServer for non-existent groups - getRaftServers and groups after init - destroy clears all servers 4. Leader election logic - isLeader returns true in non-raft mode - isLeader returns false for non-existent groups 5. Initialization behavior - Multiple init calls are idempotent (CAS protection) - File mode doesn't initialize raft cluster These tests focus on configuration validation, state transitions, and edge cases that weren't covered by existing RaftServerTest, improving coverage of RaftServerManager's init(), destroy(), and isLeader() methods.
Add unit tests for utility classes in cluster/raft module: 1. SeataClusterContextTest (15 tests) - Context binding with custom group - Context binding with default group - Context unbinding - Group overwriting behavior - Edge cases: empty string, whitespace, special characters - Context isolation between operations - Multiple bind/unbind cycles 2. RaftTaskUtilTest (14 tests) - futureGet() with successful completion - futureGet() with InterruptedException handling - futureGet() with TransactionException in ExecutionException - futureGet() with non-TransactionException wrapping - Exception code preservation - Nested ExecutionException handling - Async completion handling - Multiple completion attempts - Different TransactionException subclasses These tests focus on context management and exception handling logic that are critical for raft cluster operations but were previously untested.
…or issues 1. Fix RaftTaskUtilTest failures (3 failures) - Corrected completeExceptionally usage - should pass exception directly, not wrapped in ExecutionException - Fixed testFutureGetWithTransactionExceptionInExecutionException - Fixed testFutureGetWithGlobalTransactionExceptionInExecutionException - Fixed testFutureGetPreservesTransactionExceptionCode - Fixed testFutureGetWithDifferentTransactionExceptionTypes - Fixed testFutureGetWithNestedExecutionException 2. Fix NoClassDefFoundError issues (50 errors) - Deleted RaftServerUnitTest - requires complex JRaft initialization environment - Modified RaftStateMachineTest to extend BaseSpringBootTest - Modified SeataClusterContextTest to extend BaseSpringBootTest These tests require Spring context for proper initialization of ContextCoreLoader and StoreConfig components. All tests now properly handle CompletableFuture.completeExceptionally behavior where the passed exception becomes the cause of ExecutionException thrown by get().
1. Deleted RaftServerManagerEdgeCaseTest.java (20 tests removed) - Issue: Tests assume init() can be called multiple times - Reality: RaftServerManager.init() uses AtomicBoolean guard - Only initializes once, subsequent calls are no-op - destroy() causes LifeCycleException in test environment - Edge case testing incompatible with singleton design 2. Removed testConstructorInRaftMode from RaftStateMachineTest - Issue: ClassCastException in RAFT mode construction - Requires complex RAFT environment incompatible with unit testing Final test count: - RaftStateMachineTest: 20 tests - SeataClusterContextTest: 15 tests - RaftTaskUtilTest: 14 tests Total: 49 comprehensive tests covering actual business logic
String.repeat() was introduced in Java 11 and causes compilation failures in Java 8 CI environments. Replaced with Arrays.fill() approach which is compatible with Java 8. Changes: - Added java.util.Arrays import - Replaced "a".repeat(100) with char array and Arrays.fill() - Maintains same test functionality across all Java versions
Add 54 high-value test cases covering 250+ lines of core uncovered code in the cluster/raft module to improve test coverage. Core modules covered: - RaftStateMachine: onApply, onSnapshot, metadata sync (10 tests) - Snapshot module: LeaderMetadata, Session, VGroup snapshot save/load (24 tests) - Execute module: VGroup add/remove operations (7 tests) - RaftServerManager: configuration, lifecycle, options (13 tests) Changes: - Modified RaftStateMachineTest: added core method tests for onApply, onSnapshotSave/Load, refreshClusterMetadata, changeOrInitRaftClusterMetadata - Modified RaftServerTest: added lifecycle, configuration options, and edge case tests - New LeaderMetadataSnapshotFileTest: save/load operations and error handling - New SessionSnapshotFileTest: session snapshot save/load with various scenarios - New VGroupSnapshotFileTest: vgroup mapping snapshot operations - New VGroupExecuteTest: VGroup add/remove execute operations All tests use proper mocking and follow existing test patterns. Java 8 compatible.
Fix two compilation issues: 1. RaftStateMachineTest.java: - RaftClusterMetadataMsg cannot be directly encoded - Need to wrap it in RaftSyncMessage before encoding - Added RaftSyncMessage import 2. VGroupExecuteTest.java: - RaftVGroupMappingStoreManager does not have readVGroup() method - Changed all readVGroup() calls to use loadVGroupsByUnit().get() - Updated verification logic to work with the correct API These fixes ensure tests compile and run correctly.
Remove all newly added tests that are failing due to: 1. Test environment dependencies (not raft mode in test env) 2. Singleton state sharing causing test interference 3. ClassCastException in snapshot tests 4. NullPointerException in stateMachine tests Reverted files to pre-test-addition state: - RaftServerTest.java: removed 13 failing tests - RaftStateMachineTest.java: removed 10 tests with issues Deleted files: - All snapshot test files (LeaderMetadataSnapshotFileTest, SessionSnapshotFileTest, VGroupSnapshotFileTest) - VGroupExecuteTest.java The tests were too complex and dependent on specific runtime environments. Will focus on simpler, more reliable tests in future iterations.
Add 12 new tests to cover methods identified by codecov as uncovered: onSnapshotSave (3 tests): - FILE mode: immediate OK return without saving - RAFT mode: iterate through snapshot files and save - Error handling: propagate error status when snapshot file fails onSnapshotLoad (4 tests): - FILE mode: return true immediately - Leader: refuse to load snapshot (return false) - RAFT mode follower: load all snapshot files successfully - Error handling: return false when snapshot file load fails onLeaderStart (1 test): - Verify leaderTerm and currentTerm are set correctly onConfigurationCommitted (1 test): - Basic test that method executes without throwing changeNodeMetadata (2 tests): - Add follower node to cluster metadata - Add learner node to cluster metadata Test approach: - Use Mockito to mock external dependencies (Closure, SnapshotWriter/Reader) - Test both FILE and RAFT modes where applicable - Test success and failure paths - Verify method calls with verify() Expected coverage increase: ~50-70 lines
Problem: Tests failed with ClassCastException when trying to create RaftStateMachine in RAFT mode after the test environment was initialized in FILE mode. Singleton objects (like SessionHolder) were already initialized as FILE mode types, causing ClassCastException when accessed in RAFT mode. Solution: Use reflection to modify the 'mode' field instead of creating new RAFT mode RaftStateMachine objects. This allows testing RAFT mode code paths without triggering singleton initialization conflicts. Changes: - testOnSnapshotSaveInRaftMode: Use reflection to set mode = "raft" - testOnSnapshotSaveFailsWhenSnapshotFileReturnsError: Same fix - testOnSnapshotLoadWhenIsLeader: Same fix - testOnSnapshotLoadInRaftModeAsFollower: Same fix - testOnSnapshotLoadFailsWhenSnapshotFileReturnsFalse: Same fix All 5 affected tests now use reflection instead of StoreConfig changes, avoiding ClassCastException while still testing RAFT mode logic.
Problem: 1. testOnSnapshotSaveInRaftMode: NullPointerException 2. testOnSnapshotSaveFailsWhenSnapshotFileReturnsError: NullPointerException 3. testOnSnapshotLoadInRaftModeAsFollower: Mock was not invoked Root cause: The RaftStateMachine constructor adds LeaderMetadataSnapshotFile to the snapshotFiles list by default. When we registered additional mock snapshot files, both the real LeaderMetadataSnapshotFile and our mock were in the list. During onSnapshotSave/Load: - The real LeaderMetadataSnapshotFile.save() was called first - It threw NullPointerException or completed without calling our mock - Our mock.save()/load() was never called, causing verification failures Solution: Use reflection to clear the snapshotFiles list before adding our mock: 1. Get the snapshotFiles field via reflection 2. Clear the list to remove the default LeaderMetadataSnapshotFile 3. Add only our mock via registryStoreSnapshotFile() This ensures: - Only our mock is in the list - No NullPointerException from real snapshot files - Mock is properly called and verified Changes: - testOnSnapshotSaveInRaftMode: Clear snapshotFiles before adding mock - testOnSnapshotSaveFailsWhenSnapshotFileReturnsError: Same fix - testOnSnapshotLoadInRaftModeAsFollower: Same fix - testOnSnapshotLoadFailsWhenSnapshotFileReturnsFalse: Same fix
Add comprehensive unit tests to cover previously uncovered methods: - changePeers: Tests configuration changes with followers and learners - syncCurrentNodeInfo: Tests node synchronization with various scenarios These tests increase codecov coverage for RaftStateMachine class.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Add unit tests for cluster module components:
Total: 10 new test files covering basic cluster module components
Ⅰ. Describe what this PR did
Ⅱ. Does this pull request fix one issue?
Ⅲ. Why don't you add test cases (unit test/integration test)?
Ⅳ. Describe how to verify it
Ⅴ. Special notes for reviews