1 /* 2 * Copyright (C) 2008 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.common.testing; 18 19 20 import com.google.common.annotations.GwtCompatible; 21 import java.util.ArrayList; 22 import java.util.Collections; 23 import java.util.List; 24 import java.util.logging.Handler; 25 import java.util.logging.LogRecord; 26 import org.checkerframework.checker.nullness.qual.Nullable; 27 28 /** 29 * Tests may use this to intercept messages that are logged by the code under test. Example: 30 * 31 * <pre> 32 * TestLogHandler handler; 33 * 34 * protected void setUp() throws Exception { 35 * super.setUp(); 36 * handler = new TestLogHandler(); 37 * SomeClass.logger.addHandler(handler); 38 * addTearDown(new TearDown() { 39 * public void tearDown() throws Exception { 40 * SomeClass.logger.removeHandler(handler); 41 * } 42 * }); 43 * } 44 * 45 * public void test() { 46 * SomeClass.foo(); 47 * LogRecord firstRecord = handler.getStoredLogRecords().get(0); 48 * assertEquals("some message", firstRecord.getMessage()); 49 * } 50 * </pre> 51 * 52 * @author Kevin Bourrillion 53 * @since 10.0 54 */ 55 @GwtCompatible 56 @ElementTypesAreNonnullByDefault 57 public class TestLogHandler extends Handler { 58 /** We will keep a private list of all logged records */ 59 private final List<LogRecord> list = new ArrayList<>(); 60 61 /** Adds the most recently logged record to our list. */ 62 @Override publish(@ullable LogRecord record)63 public synchronized void publish(@Nullable LogRecord record) { 64 if (record != null) { 65 list.add(record); 66 } 67 } 68 69 @Override flush()70 public void flush() {} 71 72 @Override close()73 public void close() {} 74 clear()75 public synchronized void clear() { 76 list.clear(); 77 } 78 79 /** Returns a snapshot of the logged records. */ 80 /* 81 * TODO(cpovirk): consider higher-level APIs here (say, assertNoRecordsLogged(), 82 * getOnlyRecordLogged(), getAndClearLogRecords()...) 83 * 84 * TODO(cpovirk): consider renaming this method to reflect that it takes a snapshot (and/or return 85 * an ImmutableList) 86 */ getStoredLogRecords()87 public synchronized List<LogRecord> getStoredLogRecords() { 88 List<LogRecord> result = new ArrayList<>(list); 89 return Collections.unmodifiableList(result); 90 } 91 } 92