/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import android.net.util.SharedLog; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; import java.io.ByteArrayOutputStream; import java.io.PrintWriter; @RunWith(AndroidJUnit4.class) @SmallTest public class SharedLogTest { private static final String TIMESTAMP_PATTERN = "\\d{2}:\\d{2}:\\d{2}"; private static final String TIMESTAMP = "HH:MM:SS"; @Test public void testBasicOperation() { final SharedLog logTop = new SharedLog("top"); logTop.mark("first post!"); final SharedLog logLevel2a = logTop.forSubComponent("twoA"); final SharedLog logLevel2b = logTop.forSubComponent("twoB"); logLevel2b.e("2b or not 2b"); logLevel2b.e("No exception", null); logLevel2b.e("Wait, here's one", new Exception("Test")); logLevel2a.w("second post?"); final SharedLog logLevel3 = logLevel2a.forSubComponent("three"); logTop.log("still logging"); logLevel3.log("3 >> 2"); logLevel2a.mark("ok: last post"); final String[] expected = { " - MARK first post!", " - [twoB] ERROR 2b or not 2b", " - [twoB] ERROR No exception", // No stacktrace in shared log, only in logcat " - [twoB] ERROR Wait, here's one: Test", " - [twoA] WARN second post?", " - still logging", " - [twoA.three] 3 >> 2", " - [twoA] MARK ok: last post", }; // Verify the logs are all there and in the correct order. verifyLogLines(expected, logTop); // In fact, because they all share the same underlying LocalLog, // every subcomponent SharedLog's dump() is identical. verifyLogLines(expected, logLevel2a); verifyLogLines(expected, logLevel2b); verifyLogLines(expected, logLevel3); } private static void verifyLogLines(String[] expected, SharedLog log) { final ByteArrayOutputStream ostream = new ByteArrayOutputStream(); final PrintWriter pw = new PrintWriter(ostream, true); log.dump(null, pw, null); final String dumpOutput = ostream.toString(); assertTrue(dumpOutput != null); assertTrue(!"".equals(dumpOutput)); final String[] lines = dumpOutput.split("\n"); assertEquals(expected.length, lines.length); for (int i = 0; i < expected.length; i++) { String got = lines[i]; String want = expected[i]; assertTrue(String.format("'%s' did not contain '%s'", got, want), got.endsWith(want)); assertTrue(String.format("'%s' did not contain a %s timestamp", got, TIMESTAMP), got.replaceFirst(TIMESTAMP_PATTERN, TIMESTAMP).contains(TIMESTAMP)); } } }