View Javadoc
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 javax.annotation.Nullable;
27  
28  /**
29   * Tests may use this to intercept messages that are logged by the code under
30   * test.  Example:
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    /**
62     * Adds the most recently logged record to our list.
63     */
64    @Override
65    public synchronized void publish(@Nullable LogRecord record) {
66      list.add(record);
67    }
68  
69    @Override
70    public void flush() {}
71  
72    @Override
73    public void close() {}
74  
75    public synchronized void clear() {
76      list.clear();
77    }
78  
79    /**
80     * Returns a snapshot of the logged records.
81     */
82    /*
83     * TODO(cpovirk): consider higher-level APIs here (say, assertNoRecordsLogged(),
84     * getOnlyRecordLogged(), getAndClearLogRecords()...)
85     *
86     * TODO(cpovirk): consider renaming this method to reflect that it takes a snapshot (and/or return
87     * an ImmutableList)
88     */
89    public synchronized List<LogRecord> getStoredLogRecords() {
90      List<LogRecord> result = new ArrayList<>(list);
91      return Collections.unmodifiableList(result);
92    }
93  }