/*
 * 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));
        }
    }
}
