Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*
* <p>Provides custom assertions for validating log results across multiple nodes.
*/
@SuppressWarnings("unused")
@SuppressWarnings({"unused", "UnusedReturnValue"})
public class MultipleNodeLogResultsAssert extends AbstractAssert<MultipleNodeLogResultsAssert, MultipleNodeLogResults> {

/**
Expand Down Expand Up @@ -83,4 +83,21 @@ public MultipleNodeLogResultsAssert haveNoMessagesWithLevelHigherThan(@NonNull f
public MultipleNodeLogResultsAssert haveNoErrorLevelMessages() {
return haveNoMessagesWithLevelHigherThan(Level.WARN);
}

/**
* Verifies that no log message contains the specified content.
*
* @param searchString the substring that should not be present
* @return this assertion object for method chaining
*/
@NonNull
public MultipleNodeLogResultsAssert haveNoMessageContaining(@NonNull final String searchString) {
isNotNull();

for (final SingleNodeLogResult result : actual.results()) {
OtterAssertions.assertThat(result).hasNoMessageContaining(searchString);
}

return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,21 @@ public MultipleNodeLogResultsContinuousAssert haveNoErrorLevelMessages() {
return haveNoMessageWithLevelHigherThan(Level.WARN);
}

/**
* Verifies that no log message contains the specified content.
*
* @param searchString the substring that should not be present
* @return this assertion object for method chaining
*/
@NonNull
public MultipleNodeLogResultsContinuousAssert haveNoMessageContaining(@NonNull final String searchString) {
return checkContinuously(logEntry -> {
if (logEntry.message().contains(searchString)) {
failWithMessage("Expected no message containing '%s', but found in %n%s", searchString, logEntry);
}
});
}

private MultipleNodeLogResultsContinuousAssert checkContinuously(final Consumer<StructuredLog> check) {
isNotNull();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,48 @@ public SingleNodeLogResultAssert hasNoMessagesWithLevelHigherThan(@NonNull final
*
* @return this assertion object for method chaining
*/
@NonNull
public SingleNodeLogResultAssert hasNoErrorLevelMessages() {
return hasNoMessagesWithLevelHigherThan(Level.WARN);
}

/**
* Verifies that at least one log message contains the specified substring.
*
* @param expectedMessage the substring to search for in log messages
* @return this assertion object for method chaining
*/
@NonNull
public SingleNodeLogResultAssert hasMessageContaining(@NonNull final String expectedMessage) {
isNotNull();
final List<StructuredLog> logs = actual.logs().stream()
.filter(log -> log.message().contains(expectedMessage))
.toList();
if (logs.isEmpty()) {
failWithMessage("Expected to find a message containing '%s', but did not", expectedMessage);
}
return this;
}

/**
* Verifies that no log message contains the specified substring.
*
* @param searchString the substring that should not be present
* @return this assertion object for method chaining
*/
@NonNull
public SingleNodeLogResultAssert hasNoMessageContaining(@NonNull final String searchString) {
isNotNull();
final List<StructuredLog> logs = actual.logs().stream()
.filter(log -> log.message().contains(searchString))
.toList();
if (!logs.isEmpty()) {
final String message = String.format("Expected to find no message containing '%s'", searchString);
failWithMessage(message, logs);
}
return this;
}

/**
* Fails the assertion with a custom message and the list of log entries that caused the failure.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,21 @@ public SingleNodeLogResultContinuousAssert haveNoErrorLevelMessages() {
return haveNoMessageWithLevelHigherThan(Level.WARN);
}

/**
* Verifies that no log message contains the specified substring.
*
* @param searchString the substring that should not be present
* @return this assertion object for method chaining
*/
@NonNull
public SingleNodeLogResultContinuousAssert hasNoMessageContaining(@NonNull final String searchString) {
return checkContinuously(logEntry -> {
if (logEntry.message().contains(searchString)) {
failWithMessage("Expected no message containing '%s', but found in %n%s", searchString, logEntry);
}
});
}

private SingleNodeLogResultContinuousAssert checkContinuously(final Consumer<StructuredLog> check) {
isNotNull();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public void subscribe(@NonNull final LogSubscriber subscriber) {
public MultipleNodeLogResults suppressingNode(@NonNull final NodeId nodeId) {
requireNonNull(nodeId, "nodeId cannot be null");
final List<SingleNodeLogResult> filteredResults = results.stream()
.filter(res -> Objects.equals(res.nodeId(), nodeId))
.filter(result -> !Objects.equals(result.nodeId(), nodeId))
.toList();

return new MultipleNodeLogResultsImpl(filteredResults);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public record MultipleNodePcesResultsImpl(@NonNull List<SingleNodePcesResult> pc
@NonNull
public MultipleNodePcesResults suppressingNode(@NonNull final NodeId nodeId) {
final List<SingleNodePcesResult> filtered = pcesResults.stream()
.filter(it -> Objects.equals(it.nodeId(), nodeId))
.filter(result -> !Objects.equals(result.nodeId(), nodeId))
.toList();
return new MultipleNodePcesResultsImpl(filtered);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public MultipleNodeReconnectResultsImpl(@NonNull final List<SingleNodeReconnectR
@NonNull
public MultipleNodeReconnectResults suppressingNode(@NonNull final NodeId nodeId) {
final List<SingleNodeReconnectResult> filtered = results.stream()
.filter(it -> Objects.equals(it.nodeId(), nodeId))
.filter(result -> !Objects.equals(result.nodeId(), nodeId))
.toList();
return new MultipleNodeReconnectResultsImpl(filtered);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import java.nio.file.Path;
import java.time.Duration;
import java.time.Instant;
import java.util.Objects;
import java.util.function.Consumer;
import org.hiero.consensus.model.node.KeysAndCerts;
import org.hiero.consensus.model.node.NodeId;
Expand Down Expand Up @@ -234,7 +235,9 @@ protected void doStart(@NonNull final Duration timeout) {
wrapConsumerWithNodeContext(this::handlePlatformStatusChange));

InMemorySubscriptionManager.INSTANCE.subscribe(logEntry -> {
resultsCollector.addLogEntry(logEntry);
if (Objects.equals(logEntry.nodeId(), selfId)) {
resultsCollector.addLogEntry(logEntry);
}
return lifeCycle == DESTROYED ? UNSUBSCRIBE : CONTINUE;
});

Expand Down
Loading