Skip to content

Commit 5c8c3dc

Browse files
authored
chore: Additional log assertions (#21233)
Signed-off-by: Michael Heinrichs <[email protected]>
1 parent 460d1a0 commit 5c8c3dc

File tree

8 files changed

+93
-5
lines changed

8 files changed

+93
-5
lines changed

platform-sdk/consensus-otter-tests/src/testFixtures/java/org/hiero/otter/fixtures/assertions/MultipleNodeLogResultsAssert.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*
1616
* <p>Provides custom assertions for validating log results across multiple nodes.
1717
*/
18-
@SuppressWarnings("unused")
18+
@SuppressWarnings({"unused", "UnusedReturnValue"})
1919
public class MultipleNodeLogResultsAssert extends AbstractAssert<MultipleNodeLogResultsAssert, MultipleNodeLogResults> {
2020

2121
/**
@@ -83,4 +83,21 @@ public MultipleNodeLogResultsAssert haveNoMessagesWithLevelHigherThan(@NonNull f
8383
public MultipleNodeLogResultsAssert haveNoErrorLevelMessages() {
8484
return haveNoMessagesWithLevelHigherThan(Level.WARN);
8585
}
86+
87+
/**
88+
* Verifies that no log message contains the specified content.
89+
*
90+
* @param searchString the substring that should not be present
91+
* @return this assertion object for method chaining
92+
*/
93+
@NonNull
94+
public MultipleNodeLogResultsAssert haveNoMessageContaining(@NonNull final String searchString) {
95+
isNotNull();
96+
97+
for (final SingleNodeLogResult result : actual.results()) {
98+
OtterAssertions.assertThat(result).hasNoMessageContaining(searchString);
99+
}
100+
101+
return this;
102+
}
86103
}

platform-sdk/consensus-otter-tests/src/testFixtures/java/org/hiero/otter/fixtures/assertions/MultipleNodeLogResultsContinuousAssert.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,21 @@ public MultipleNodeLogResultsContinuousAssert haveNoErrorLevelMessages() {
123123
return haveNoMessageWithLevelHigherThan(Level.WARN);
124124
}
125125

126+
/**
127+
* Verifies that no log message contains the specified content.
128+
*
129+
* @param searchString the substring that should not be present
130+
* @return this assertion object for method chaining
131+
*/
132+
@NonNull
133+
public MultipleNodeLogResultsContinuousAssert haveNoMessageContaining(@NonNull final String searchString) {
134+
return checkContinuously(logEntry -> {
135+
if (logEntry.message().contains(searchString)) {
136+
failWithMessage("Expected no message containing '%s', but found in %n%s", searchString, logEntry);
137+
}
138+
});
139+
}
140+
126141
private MultipleNodeLogResultsContinuousAssert checkContinuously(final Consumer<StructuredLog> check) {
127142
isNotNull();
128143

platform-sdk/consensus-otter-tests/src/testFixtures/java/org/hiero/otter/fixtures/assertions/SingleNodeLogResultAssert.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,48 @@ public SingleNodeLogResultAssert hasNoMessagesWithLevelHigherThan(@NonNull final
101101
*
102102
* @return this assertion object for method chaining
103103
*/
104+
@NonNull
104105
public SingleNodeLogResultAssert hasNoErrorLevelMessages() {
105106
return hasNoMessagesWithLevelHigherThan(Level.WARN);
106107
}
107108

109+
/**
110+
* Verifies that at least one log message contains the specified substring.
111+
*
112+
* @param expectedMessage the substring to search for in log messages
113+
* @return this assertion object for method chaining
114+
*/
115+
@NonNull
116+
public SingleNodeLogResultAssert hasMessageContaining(@NonNull final String expectedMessage) {
117+
isNotNull();
118+
final List<StructuredLog> logs = actual.logs().stream()
119+
.filter(log -> log.message().contains(expectedMessage))
120+
.toList();
121+
if (logs.isEmpty()) {
122+
failWithMessage("Expected to find a message containing '%s', but did not", expectedMessage);
123+
}
124+
return this;
125+
}
126+
127+
/**
128+
* Verifies that no log message contains the specified substring.
129+
*
130+
* @param searchString the substring that should not be present
131+
* @return this assertion object for method chaining
132+
*/
133+
@NonNull
134+
public SingleNodeLogResultAssert hasNoMessageContaining(@NonNull final String searchString) {
135+
isNotNull();
136+
final List<StructuredLog> logs = actual.logs().stream()
137+
.filter(log -> log.message().contains(searchString))
138+
.toList();
139+
if (!logs.isEmpty()) {
140+
final String message = String.format("Expected to find no message containing '%s'", searchString);
141+
failWithMessage(message, logs);
142+
}
143+
return this;
144+
}
145+
108146
/**
109147
* Fails the assertion with a custom message and the list of log entries that caused the failure.
110148
*

platform-sdk/consensus-otter-tests/src/testFixtures/java/org/hiero/otter/fixtures/assertions/SingleNodeLogResultContinuousAssert.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,21 @@ public SingleNodeLogResultContinuousAssert haveNoErrorLevelMessages() {
122122
return haveNoMessageWithLevelHigherThan(Level.WARN);
123123
}
124124

125+
/**
126+
* Verifies that no log message contains the specified substring.
127+
*
128+
* @param searchString the substring that should not be present
129+
* @return this assertion object for method chaining
130+
*/
131+
@NonNull
132+
public SingleNodeLogResultContinuousAssert hasNoMessageContaining(@NonNull final String searchString) {
133+
return checkContinuously(logEntry -> {
134+
if (logEntry.message().contains(searchString)) {
135+
failWithMessage("Expected no message containing '%s', but found in %n%s", searchString, logEntry);
136+
}
137+
});
138+
}
139+
125140
private SingleNodeLogResultContinuousAssert checkContinuously(final Consumer<StructuredLog> check) {
126141
isNotNull();
127142

platform-sdk/consensus-otter-tests/src/testFixtures/java/org/hiero/otter/fixtures/internal/result/MultipleNodeLogResultsImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public void subscribe(@NonNull final LogSubscriber subscriber) {
7979
public MultipleNodeLogResults suppressingNode(@NonNull final NodeId nodeId) {
8080
requireNonNull(nodeId, "nodeId cannot be null");
8181
final List<SingleNodeLogResult> filteredResults = results.stream()
82-
.filter(res -> Objects.equals(res.nodeId(), nodeId))
82+
.filter(result -> !Objects.equals(result.nodeId(), nodeId))
8383
.toList();
8484

8585
return new MultipleNodeLogResultsImpl(filteredResults);

platform-sdk/consensus-otter-tests/src/testFixtures/java/org/hiero/otter/fixtures/internal/result/MultipleNodePcesResultsImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public record MultipleNodePcesResultsImpl(@NonNull List<SingleNodePcesResult> pc
2828
@NonNull
2929
public MultipleNodePcesResults suppressingNode(@NonNull final NodeId nodeId) {
3030
final List<SingleNodePcesResult> filtered = pcesResults.stream()
31-
.filter(it -> Objects.equals(it.nodeId(), nodeId))
31+
.filter(result -> !Objects.equals(result.nodeId(), nodeId))
3232
.toList();
3333
return new MultipleNodePcesResultsImpl(filtered);
3434
}

platform-sdk/consensus-otter-tests/src/testFixtures/java/org/hiero/otter/fixtures/internal/result/MultipleNodeReconnectResultsImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public MultipleNodeReconnectResultsImpl(@NonNull final List<SingleNodeReconnectR
5454
@NonNull
5555
public MultipleNodeReconnectResults suppressingNode(@NonNull final NodeId nodeId) {
5656
final List<SingleNodeReconnectResult> filtered = results.stream()
57-
.filter(it -> Objects.equals(it.nodeId(), nodeId))
57+
.filter(result -> !Objects.equals(result.nodeId(), nodeId))
5858
.toList();
5959
return new MultipleNodeReconnectResultsImpl(filtered);
6060
}

platform-sdk/consensus-otter-tests/src/testFixtures/java/org/hiero/otter/fixtures/turtle/TurtleNode.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import java.nio.file.Path;
4040
import java.time.Duration;
4141
import java.time.Instant;
42+
import java.util.Objects;
4243
import java.util.function.Consumer;
4344
import org.hiero.consensus.model.node.KeysAndCerts;
4445
import org.hiero.consensus.model.node.NodeId;
@@ -234,7 +235,9 @@ protected void doStart(@NonNull final Duration timeout) {
234235
wrapConsumerWithNodeContext(this::handlePlatformStatusChange));
235236

236237
InMemorySubscriptionManager.INSTANCE.subscribe(logEntry -> {
237-
resultsCollector.addLogEntry(logEntry);
238+
if (Objects.equals(logEntry.nodeId(), selfId)) {
239+
resultsCollector.addLogEntry(logEntry);
240+
}
238241
return lifeCycle == DESTROYED ? UNSUBSCRIBE : CONTINUE;
239242
});
240243

0 commit comments

Comments
 (0)