/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.common.logging; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import javax.annotation.Nullable; public final class FakeLoggingDelegate implements LoggingDelegate { public static final class LogLine { public final int priority; public final String tag; public final String msg; public final @Nullable Throwable tr; private LogLine( int priority, String tag, String msg, @Nullable Throwable tr) { this.priority = priority; this.tag = tag; this.msg = msg; this.tr = tr; } } public static final int ASSERT = FLog.ASSERT; public static final int DEBUG = FLog.DEBUG; public static final int ERROR = FLog.ERROR; public static final int INFO = FLog.INFO; public static final int VERBOSE = FLog.VERBOSE; public static final int WARN = FLog.WARN; /** * There is no log level for Terrible Failures (we emit them at the Error * Log-level), but to test that WTF errors are being logged, we are making up * a new log level here, guaranteed to be larger than any of the other log * levels. */ public static final int WTF = 1 + Collections.max(Arrays.asList(ASSERT, DEBUG, ERROR, INFO, VERBOSE, WARN)); private int mMinLogLevel = FLog.VERBOSE; private final ArrayList<LogLine> mLogs = new ArrayList<>(); /** Test Harness */ private static boolean matchLogQuery( int priority, String tag, @Nullable String throwMsg, LogLine line) { return priority == line.priority && tag.equals(line.tag) && (throwMsg == null || throwMsg.equals(line.tr.getMessage())); } public boolean logContains(int priority, String tag, String throwMsg) { for (FakeLoggingDelegate.LogLine line : mLogs) { if (matchLogQuery(priority, tag, throwMsg, line)) { return true; } } return false; } /** LoggingDelegate API */ public int getMinimumLoggingLevel() { return mMinLogLevel; } public void setMinimumLoggingLevel(int level) { mMinLogLevel = level; } public boolean isLoggable(int level) { return level >= mMinLogLevel; } private void logImpl(int priority, String tag, String msg, Throwable tr) { if (isLoggable(priority)) { mLogs.add(new LogLine(priority, tag, msg, tr)); } } public void log(int priority, String tag, String msg) { logImpl(priority, tag, msg, null); } public void d(String tag, String msg, Throwable tr) { logImpl(DEBUG, tag, msg, tr); } public void d(String tag, String msg) { logImpl(DEBUG, tag, msg, null); } public void e(String tag, String msg, Throwable tr) { logImpl(ERROR, tag, msg, tr); } public void e(String tag, String msg) { logImpl(ERROR, tag, msg, null); } public void i(String tag, String msg, Throwable tr) { logImpl(INFO, tag, msg, tr); } public void i(String tag, String msg) { logImpl(INFO, tag, msg, null); } public void v(String tag, String msg, Throwable tr) { logImpl(VERBOSE, tag, msg, tr); } public void v(String tag, String msg) { logImpl(VERBOSE, tag, msg, null); } public void w(String tag, String msg, Throwable tr) { logImpl(WARN, tag, msg, tr); } public void w(String tag, String msg) { logImpl(WARN, tag, msg, null); } public void wtf(String tag, String msg, Throwable tr) { logImpl(WTF, tag, msg, tr); } public void wtf(String tag, String msg) { logImpl(WTF, tag, msg, null); } }