blob: 908eff58c796056927d0792475edea44e57e01aa [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2016-2017 TypeFox and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
******************************************************************************/
package org.eclipse.lsp4j.jsonrpc.debug.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import org.junit.Assert;
public class LogMessageAccumulator extends Handler {
private static final long TIMEOUT = 2000;
private final List<LogRecord> records = new ArrayList<>();
private final List<Logger> registeredLoggers = new ArrayList<>();
public Logger registerTo(Class<?> clazz) {
return registerTo(clazz.getName());
}
public Logger registerTo(String name) {
Logger logger = Logger.getLogger(name);
logger.setUseParentHandlers(false);
logger.addHandler(this);
logger.setLevel(Level.ALL);
registeredLoggers.add(logger);
return logger;
}
public void unregister() {
for (Logger logger : registeredLoggers) {
logger.setLevel(null);
logger.removeHandler(this);
logger.setUseParentHandlers(true);
}
registeredLoggers.clear();
}
public List<LogRecord> getRecords() {
return records;
}
public LogRecord findRecord(Level level, String message) {
synchronized (records) {
for (LogRecord r : records) {
if (level.equals(r.getLevel()) && message.equals(r.getMessage()))
return r;
}
return null;
}
}
public Optional<LogRecord> match(Predicate<LogRecord> predicate) {
synchronized (records) {
return records.stream().filter(predicate).findFirst();
}
}
@Override
public void publish(LogRecord record) {
synchronized (records) {
records.add(record);
}
}
@Override
public void flush() {
}
@Override
public void close() throws SecurityException {
}
public void await(Predicate<LogRecord> predicate) throws InterruptedException {
long startTime = System.currentTimeMillis();
while (!match(predicate).isPresent()) {
Thread.sleep(20);
if (System.currentTimeMillis() - startTime > TIMEOUT) {
synchronized (records) {
String records = this.records.stream().map(r -> r.getLevel() + ": " + r.getMessage()).reduce((a, a2) -> a + '\n' + a2).get();
Assert.fail("Timeout elapsed while waiting for logging, logged:\n" + records);
}
}
}
}
public void await(Level level, String message) throws InterruptedException {
long startTime = System.currentTimeMillis();
while (findRecord(level, message) == null) {
Thread.sleep(20);
if (System.currentTimeMillis() - startTime > TIMEOUT)
Assert.fail("Timeout elapsed while waiting for " + level + ": " + message);
}
}
}