1a682c725efdc0a0718372c1ac9c28c96773393f7Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
2c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
3c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetskyimport android.util.Log;
4c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetskyimport com.xtremelabs.robolectric.internal.Implementation;
5c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetskyimport com.xtremelabs.robolectric.internal.Implements;
6c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
7dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkelimport java.io.PrintStream;
8c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetskyimport java.util.ArrayList;
9c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetskyimport java.util.List;
10c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
11c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky@Implements(Log.class)
121ce4754cba537b287d24e85e7d5434408ae89f2dTyler Schultzpublic class ShadowLog {
13c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    private static List<LogItem> logs = new ArrayList<LogItem>();
14dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel    public static PrintStream stream;
15c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
16c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    @Implementation
17c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    public static void e(String tag, String msg) {
18c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky        e(tag, msg, null);
19c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    }
20c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
21c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    @Implementation
22c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    public static void e(String tag, String msg, Throwable throwable) {
23dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        addLog(Log.ERROR, tag, msg, throwable);
24c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    }
25c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
26c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    @Implementation
27c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    public static void d(String tag, String msg) {
28c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky        d(tag, msg, null);
29c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    }
30c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
31c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    @Implementation
32c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    public static void d(String tag, String msg, Throwable throwable) {
33dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        addLog(Log.DEBUG, tag, msg, throwable);
34c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    }
35c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
36c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    @Implementation
37c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    public static void i(String tag, String msg) {
38c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky        i(tag, msg, null);
39c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    }
40c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
41c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    @Implementation
42c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    public static void i(String tag, String msg, Throwable throwable) {
43dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        addLog(Log.INFO, tag, msg, throwable);
44c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    }
45c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
46c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    @Implementation
47c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    public static void v(String tag, String msg) {
48c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky        v(tag, msg, null);
49c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    }
50c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
51c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    @Implementation
52c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    public static void v(String tag, String msg, Throwable throwable) {
53dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        addLog(Log.VERBOSE, tag, msg, throwable);
54c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    }
55c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
56c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    @Implementation
57c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    public static void w(String tag, String msg) {
58c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky        w(tag, msg, null);
59c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    }
60c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
61c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    @Implementation
62dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel    public static void w(String tag, Throwable throwable) {
63dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        w(tag, null, throwable);
64dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel    }
65dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel
66dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel
67dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel    @Implementation
68c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    public static void w(String tag, String msg, Throwable throwable) {
69dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        addLog(Log.WARN, tag, msg, throwable);
70c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    }
71c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
72c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    @Implementation
73c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    public static void wtf(String tag, String msg) {
74c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky        wtf(tag, msg, null);
75c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    }
76c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
77c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    @Implementation
78c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    public static void wtf(String tag, String msg, Throwable throwable) {
79dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        addLog(Log.ASSERT, tag, msg, throwable);
80dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel    }
81dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel
82dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel    @Implementation
83dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel    public static boolean isLoggable(String tag, int level) {
84dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        return stream != null || level >= Log.INFO;
85dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel    }
86dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel
87dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel    private static void addLog(int level, String tag, String msg, Throwable throwable) {
88dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        if (stream != null) {
89dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel            logToStream(stream, level, tag, msg, throwable);
90dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        }
91dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        logs.add(new LogItem(level, tag, msg, throwable));
92dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel    }
93dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel
94dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel
95dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel    private static void logToStream(PrintStream ps, int level, String tag, String msg, Throwable throwable) {
96dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        final char c;
97dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        switch (level) {
98dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel            case Log.ASSERT: c = 'A'; break;
99dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel            case Log.DEBUG:  c = 'D'; break;
100dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel            case Log.ERROR:  c = 'E'; break;
101dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel            case Log.WARN:   c = 'W'; break;
102dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel            case Log.INFO:   c = 'I'; break;
103dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel            case Log.VERBOSE:c = 'V'; break;
104dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel            default:         c = '?';
105dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        }
106dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        ps.println(c + "/" + tag + ": " + msg);
107dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        if (throwable != null) {
108dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel            throwable.printStackTrace(ps);
109dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        }
110c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    }
111c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
112c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    public static List<LogItem> getLogs() {
113c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky        return logs;
114c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    }
115c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
116c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    public static void reset() {
117c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky        logs.clear();
118c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    }
119c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
1209eea23b1f94e1be5d7e581ef5675c5b0d6bbb053Glenn Jahnke & Lenny Turetsky    public static class LogItem {
121dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        public final int type;
122c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky        public final String tag;
123c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky        public final String msg;
124c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky        public final Throwable throwable;
125c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky
126dc69095c2faf013e3d1fd197a247a0e31f2f10f2Jan Berkel        public LogItem(int type, String tag, String msg, Throwable throwable) {
127c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky            this.type = type;
128c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky            this.tag = tag;
129c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky            this.msg = msg;
130c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky            this.throwable = throwable;
131c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky        }
132c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky    }
133c2de7d694855e12183711d477c9e654cca3419a3Glenn Jahnke & Lenny Turetsky}
134