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 import com.google.common.annotations.Beta; 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.compatqual.NullableDecl; 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 @Beta 56 @GwtCompatible 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(@ullableDecl LogRecord record)63 public synchronized void publish(@NullableDecl LogRecord record) { 64 list.add(record); 65 } 66 67 @Override flush()68 public void flush() {} 69 70 @Override close()71 public void close() {} 72 clear()73 public synchronized void clear() { 74 list.clear(); 75 } 76 77 /** Returns a snapshot of the logged records. */ 78 /* 79 * TODO(cpovirk): consider higher-level APIs here (say, assertNoRecordsLogged(), 80 * getOnlyRecordLogged(), getAndClearLogRecords()...) 81 * 82 * TODO(cpovirk): consider renaming this method to reflect that it takes a snapshot (and/or return 83 * an ImmutableList) 84 */ getStoredLogRecords()85 public synchronized List<LogRecord> getStoredLogRecords() { 86 List<LogRecord> result = new ArrayList<>(list); 87 return Collections.unmodifiableList(result); 88 } 89 } 90