Skip to content

Commit 8871dfa

Browse files
authored
Verify that ClusterFormationFailureHelper emits logs (#92743)
Today `ClusterFormationFailureHelperTests` check that the log-emitting method is called but makes no assertions about logs actually being emitted. This commit adds the missing assertions. Relates #92741
1 parent 917548d commit 8871dfa

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
lines changed

server/src/test/java/org/elasticsearch/cluster/coordination/ClusterFormationFailureHelperTests.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*/
88
package org.elasticsearch.cluster.coordination;
99

10+
import org.apache.logging.log4j.Level;
1011
import org.elasticsearch.Version;
1112
import org.elasticsearch.cluster.ClusterName;
1213
import org.elasticsearch.cluster.ClusterState;
@@ -25,6 +26,7 @@
2526
import org.elasticsearch.monitor.StatusInfo;
2627
import org.elasticsearch.test.ESTestCase;
2728
import org.elasticsearch.test.EqualsHashCodeTestUtils;
29+
import org.elasticsearch.test.MockLogAppender;
2830

2931
import java.util.ArrayList;
3032
import java.util.Arrays;
@@ -54,6 +56,9 @@ public class ClusterFormationFailureHelperTests extends ESTestCase {
5456

5557
private static final ElectionStrategy electionStrategy = ElectionStrategy.DEFAULT_INSTANCE;
5658

59+
// Hard-coding the class name here because it is also mentioned in the troubleshooting docs, so should not be renamed without care.
60+
private static final String LOGGER_NAME = "org.elasticsearch.cluster.coordination.ClusterFormationFailureHelper";
61+
5762
public void testScheduling() {
5863
final long expectedDelayMillis;
5964
final Settings.Builder settingsBuilder = Settings.builder();
@@ -103,16 +108,23 @@ public void testScheduling() {
103108
final long startTimeMillis = deterministicTaskQueue.getCurrentTimeMillis();
104109
clusterFormationFailureHelper.start();
105110

106-
while (warningCount.get() == 0) {
107-
assertTrue(clusterFormationFailureHelper.isRunning());
108-
if (deterministicTaskQueue.hasRunnableTasks()) {
109-
deterministicTaskQueue.runRandomTask();
110-
} else {
111-
deterministicTaskQueue.advanceTime();
111+
var mockLogAppender = new MockLogAppender();
112+
mockLogAppender.addExpectation(
113+
new MockLogAppender.SeenEventExpectation("master not discovered", LOGGER_NAME, Level.WARN, "master not discovered")
114+
);
115+
try (var ignored = mockLogAppender.capturing(ClusterFormationFailureHelper.class)) {
116+
while (warningCount.get() == 0) {
117+
assertTrue(clusterFormationFailureHelper.isRunning());
118+
if (deterministicTaskQueue.hasRunnableTasks()) {
119+
deterministicTaskQueue.runRandomTask();
120+
} else {
121+
deterministicTaskQueue.advanceTime();
122+
}
112123
}
113124
}
114125
assertThat(warningCount.get(), is(1L));
115126
assertThat(deterministicTaskQueue.getCurrentTimeMillis() - startTimeMillis, is(expectedDelayMillis));
127+
mockLogAppender.assertAllExpectationsMatched();
116128

117129
while (warningCount.get() < 5) {
118130
assertTrue(clusterFormationFailureHelper.isRunning());

test/framework/src/main/java/org/elasticsearch/test/MockLogAppender.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,16 @@
88
package org.elasticsearch.test;
99

1010
import org.apache.logging.log4j.Level;
11+
import org.apache.logging.log4j.LogManager;
12+
import org.apache.logging.log4j.Logger;
1113
import org.apache.logging.log4j.core.LogEvent;
1214
import org.apache.logging.log4j.core.appender.AbstractAppender;
1315
import org.apache.logging.log4j.core.config.Property;
16+
import org.elasticsearch.common.logging.Loggers;
1417
import org.elasticsearch.common.regex.Regex;
18+
import org.elasticsearch.core.Releasable;
1519

20+
import java.util.Arrays;
1621
import java.util.List;
1722
import java.util.concurrent.CopyOnWriteArrayList;
1823
import java.util.regex.Pattern;
@@ -208,4 +213,18 @@ private static String getLoggerName(String name) {
208213
}
209214
return COMMON_PREFIX + name;
210215
}
216+
217+
public Releasable capturing(Class<?>... classes) {
218+
start();
219+
final var loggers = Arrays.stream(classes).map(LogManager::getLogger).toArray(Logger[]::new);
220+
for (final var logger : loggers) {
221+
Loggers.addAppender(logger, this);
222+
}
223+
return () -> {
224+
for (final var logger : loggers) {
225+
Loggers.removeAppender(logger, this);
226+
}
227+
stop();
228+
};
229+
}
211230
}

0 commit comments

Comments
 (0)