Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9ef20b41 authored by Pablo Gamito's avatar Pablo Gamito
Browse files

Update ProtoLog tests

Flag: TEST_ONLY
Test: atest com.android.internal.protolog.PerfettoProtoLogImplTest
Change-Id: Ibc45f91546b2052dd4f0337545ca5ec285ac915a
parent eee930b9
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -25,11 +25,11 @@ import android.platform.test.annotations.Presubmit;

import androidx.test.filters.SmallTest;

import com.android.internal.protolog.ProtoLog;
import com.android.internal.protolog.ProtoLogGroup;
import com.android.internal.protolog.ProtoLogImpl;
import com.android.internal.protolog.common.IProtoLog;
import com.android.internal.protolog.common.LogLevel;
import com.android.internal.protolog.ProtoLog;

import org.junit.After;
import org.junit.Ignore;
@@ -53,9 +53,6 @@ public class ProtoLogIntegrationTest {
        runWith(mockedProtoLog, this::testProtoLog);
        verify(mockedProtoLog).log(eq(LogLevel.ERROR), eq(ProtoLogGroup.TEST_GROUP),
                anyInt(), eq(0b0010010111),
                eq(com.android.internal.protolog.ProtoLogGroup.TEST_GROUP.isLogToLogcat()
                        ? "Test completed successfully: %b %d %x %f %% %s"
                        : null),
                eq(new Object[]{true, 1L, 2L, 0.3, "ok"}));
    }

+9 −10
Original line number Diff line number Diff line
@@ -59,7 +59,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.LinkedList;
import java.util.TreeMap;

/**
 * Test class for {@link ProtoLogImpl}.
@@ -90,7 +89,7 @@ public class LegacyProtoLogImplTest {
        //noinspection ResultOfMethodCallIgnored
        mFile.delete();
        mProtoLog = new LegacyProtoLogImpl(mFile, mViewerConfigFilename,
                1024 * 1024, mReader, 1024, new TreeMap<>(), () -> {});
                1024 * 1024, mReader, 1024, () -> {});
    }

    @After
@@ -142,7 +141,7 @@ public class LegacyProtoLogImplTest {
        TestProtoLogGroup.TEST_GROUP.setLogToProto(false);

        implSpy.log(
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321, null,
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321,
                new Object[]{true, 10000, 30000, "test", 0.000003});

        verify(implSpy).passToLogcat(eq(TestProtoLogGroup.TEST_GROUP.getTag()), eq(
@@ -159,7 +158,7 @@ public class LegacyProtoLogImplTest {
        TestProtoLogGroup.TEST_GROUP.setLogToProto(false);

        implSpy.log(
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321, null,
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321,
                new Object[]{true, 10000, 0.0001, 0.00002, "test"});

        verify(implSpy).passToLogcat(eq(TestProtoLogGroup.TEST_GROUP.getTag()), eq(
@@ -176,7 +175,7 @@ public class LegacyProtoLogImplTest {
        TestProtoLogGroup.TEST_GROUP.setLogToProto(false);

        implSpy.log(
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321, "test %d",
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321,
                new Object[]{5});

        verify(implSpy).passToLogcat(eq(TestProtoLogGroup.TEST_GROUP.getTag()), eq(
@@ -192,7 +191,7 @@ public class LegacyProtoLogImplTest {
        TestProtoLogGroup.TEST_GROUP.setLogToProto(false);

        implSpy.log(
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321, null,
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321,
                new Object[]{5});

        verify(implSpy).passToLogcat(eq(TestProtoLogGroup.TEST_GROUP.getTag()), eq(
@@ -208,7 +207,7 @@ public class LegacyProtoLogImplTest {
        TestProtoLogGroup.TEST_GROUP.setLogToProto(false);

        implSpy.log(
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321, "test %d",
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321,
                new Object[]{5});

        verify(implSpy, never()).passToLogcat(any(), any(), any());
@@ -277,7 +276,7 @@ public class LegacyProtoLogImplTest {
        long before = SystemClock.elapsedRealtimeNanos();
        mProtoLog.log(
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234,
                0b1110101001010100, null,
                0b1110101001010100,
                new Object[]{"test", 1, 2, 3, 0.4, 0.5, 0.6, true});
        long after = SystemClock.elapsedRealtimeNanos();
        mProtoLog.stopProtoLog(mock(PrintWriter.class), true);
@@ -302,7 +301,7 @@ public class LegacyProtoLogImplTest {
        long before = SystemClock.elapsedRealtimeNanos();
        mProtoLog.log(
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234,
                0b01100100, null,
                0b01100100,
                new Object[]{"test", 1, 0.1, true});
        long after = SystemClock.elapsedRealtimeNanos();
        mProtoLog.stopProtoLog(mock(PrintWriter.class), true);
@@ -326,7 +325,7 @@ public class LegacyProtoLogImplTest {
        TestProtoLogGroup.TEST_GROUP.setLogToProto(false);
        mProtoLog.startProtoLog(mock(PrintWriter.class));
        mProtoLog.log(LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234,
                0b11, null, new Object[]{true});
                0b11, new Object[]{true});
        mProtoLog.stopProtoLog(mock(PrintWriter.class), true);
        try (InputStream is = new FileInputStream(mFile)) {
            ProtoInputStream ip = new ProtoInputStream(is);
+42 −53
Original line number Diff line number Diff line
@@ -111,6 +111,9 @@ public class PerfettoProtoLogImplTest {
        //noinspection ResultOfMethodCallIgnored
        mFile.delete();

        TestProtoLogGroup.TEST_GROUP.setLogToLogcat(false);
        TestProtoLogGroup.TEST_GROUP.setLogToProto(false);

        mViewerConfigBuilder = Protolog.ProtoLogViewerConfig.newBuilder()
                .addGroups(
                        Protolog.ProtoLogViewerConfig.Group.newBuilder()
@@ -157,8 +160,9 @@ public class PerfettoProtoLogImplTest {
        mCacheUpdater = () -> {};
        mReader = Mockito.spy(new ProtoLogViewerConfigReader(viewerConfigInputStreamProvider));
        mProtoLog = new PerfettoProtoLogImpl(
                viewerConfigInputStreamProvider, mReader, new TreeMap<>(),
                viewerConfigInputStreamProvider, mReader,
                () -> mCacheUpdater.run());
        mProtoLog.registerGroups(TestProtoLogGroup.values());
    }

    @After
@@ -210,15 +214,15 @@ public class PerfettoProtoLogImplTest {
            // Shouldn't be logging anything except WTF unless explicitly requested in the group
            // override.
            mProtoLog.log(LogLevel.DEBUG, TestProtoLogGroup.TEST_GROUP, 1,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.VERBOSE, TestProtoLogGroup.TEST_GROUP, 2,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.WARN, TestProtoLogGroup.TEST_GROUP, 3,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.ERROR, TestProtoLogGroup.TEST_GROUP, 4,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.WTF, TestProtoLogGroup.TEST_GROUP, 5,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
        } finally {
            traceMonitor.stop(mWriter);
        }
@@ -240,15 +244,15 @@ public class PerfettoProtoLogImplTest {
        try {
            traceMonitor.start();
            mProtoLog.log(LogLevel.DEBUG, TestProtoLogGroup.TEST_GROUP, 1,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.VERBOSE, TestProtoLogGroup.TEST_GROUP, 2,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.WARN, TestProtoLogGroup.TEST_GROUP, 3,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.ERROR, TestProtoLogGroup.TEST_GROUP, 4,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.WTF, TestProtoLogGroup.TEST_GROUP, 5,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
        } finally {
            traceMonitor.stop(mWriter);
        }
@@ -274,15 +278,15 @@ public class PerfettoProtoLogImplTest {
        try {
            traceMonitor.start();
            mProtoLog.log(LogLevel.DEBUG, TestProtoLogGroup.TEST_GROUP, 1,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.VERBOSE, TestProtoLogGroup.TEST_GROUP, 2,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.WARN, TestProtoLogGroup.TEST_GROUP, 3,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.ERROR, TestProtoLogGroup.TEST_GROUP, 4,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.WTF, TestProtoLogGroup.TEST_GROUP, 5,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
        } finally {
            traceMonitor.stop(mWriter);
        }
@@ -304,15 +308,15 @@ public class PerfettoProtoLogImplTest {
        try {
            traceMonitor.start();
            mProtoLog.log(LogLevel.DEBUG, TestProtoLogGroup.TEST_GROUP, 1,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.VERBOSE, TestProtoLogGroup.TEST_GROUP, 2,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.WARN, TestProtoLogGroup.TEST_GROUP, 3,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.ERROR, TestProtoLogGroup.TEST_GROUP, 4,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
            mProtoLog.log(LogLevel.WTF, TestProtoLogGroup.TEST_GROUP, 5,
                    LogDataType.BOOLEAN, null, new Object[]{true});
                    LogDataType.BOOLEAN, new Object[]{true});
        } finally {
            traceMonitor.stop(mWriter);
        }
@@ -329,14 +333,14 @@ public class PerfettoProtoLogImplTest {
    }

    @Test
    public void log_logcatEnabledExternalMessage() {
    public void log_logcatEnabled() {
        when(mReader.getViewerString(anyLong())).thenReturn("test %b %d %% 0x%x %s %f");
        PerfettoProtoLogImpl implSpy = Mockito.spy(mProtoLog);
        TestProtoLogGroup.TEST_GROUP.setLogToLogcat(true);
        TestProtoLogGroup.TEST_GROUP.setLogToProto(false);

        implSpy.log(
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321, null,
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321,
                new Object[]{true, 10000, 30000, "test", 0.000003});

        verify(implSpy).passToLogcat(eq(TestProtoLogGroup.TEST_GROUP.getTag()), eq(
@@ -353,31 +357,16 @@ public class PerfettoProtoLogImplTest {
        TestProtoLogGroup.TEST_GROUP.setLogToProto(false);

        implSpy.log(
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321, null,
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321,
                new Object[]{true, 10000, 0.0001, 0.00002, "test"});

        verify(implSpy).passToLogcat(eq(TestProtoLogGroup.TEST_GROUP.getTag()), eq(
                LogLevel.INFO),
                eq("UNKNOWN MESSAGE (1234) true 10000 1.0E-4 2.0E-5 test"));
                eq("FORMAT_ERROR \"test %b %d %% %x %s %f\", "
                        + "args=(true, 10000, 1.0E-4, 2.0E-5, test)"));
        verify(mReader).getViewerString(eq(1234L));
    }

    @Test
    public void log_logcatEnabledInlineMessage() {
        when(mReader.getViewerString(anyLong())).thenReturn("test %d");
        PerfettoProtoLogImpl implSpy = Mockito.spy(mProtoLog);
        TestProtoLogGroup.TEST_GROUP.setLogToLogcat(true);
        TestProtoLogGroup.TEST_GROUP.setLogToProto(false);

        implSpy.log(
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321, "test %d",
                new Object[]{5});

        verify(implSpy).passToLogcat(eq(TestProtoLogGroup.TEST_GROUP.getTag()), eq(
                LogLevel.INFO), eq("test 5"));
        verify(mReader, never()).getViewerString(anyLong());
    }

    @Test
    public void log_logcatEnabledNoMessage() {
        when(mReader.getViewerString(anyLong())).thenReturn(null);
@@ -386,11 +375,11 @@ public class PerfettoProtoLogImplTest {
        TestProtoLogGroup.TEST_GROUP.setLogToProto(false);

        implSpy.log(
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321, null,
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321,
                new Object[]{5});

        verify(implSpy).passToLogcat(eq(TestProtoLogGroup.TEST_GROUP.getTag()), eq(
                LogLevel.INFO), eq("UNKNOWN MESSAGE (1234) 5"));
                LogLevel.INFO), eq("UNKNOWN MESSAGE#1234 (5)"));
        verify(mReader).getViewerString(eq(1234L));
    }

@@ -401,7 +390,7 @@ public class PerfettoProtoLogImplTest {
        TestProtoLogGroup.TEST_GROUP.setLogToLogcat(false);

        implSpy.log(
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321, "test %d",
                LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321,
                new Object[]{5});

        verify(implSpy, never()).passToLogcat(any(), any(), any());
@@ -425,7 +414,7 @@ public class PerfettoProtoLogImplTest {
            before = SystemClock.elapsedRealtimeNanos();
            mProtoLog.log(
                    LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, messageHash,
                    0b1110101001010100, null,
                    0b1110101001010100,
                    new Object[]{"test", 1, 2, 3, 0.4, 0.5, 0.6, true});
            after = SystemClock.elapsedRealtimeNanos();
        } finally {
@@ -457,8 +446,8 @@ public class PerfettoProtoLogImplTest {
            before = SystemClock.elapsedRealtimeNanos();
            mProtoLog.log(
                    LogLevel.INFO, TestProtoLogGroup.TEST_GROUP,
                    "My test message :: %s, %d, %o, %x, %f, %e, %g, %b",
                    "test", 1, 2, 3, 0.4, 0.5, 0.6, true);
                    "My test message :: %s, %d, %o, %x, %f, %b",
                    "test", 1, 2, 3, 0.4, true);
            after = SystemClock.elapsedRealtimeNanos();
        } finally {
            traceMonitor.stop(mWriter);
@@ -473,7 +462,7 @@ public class PerfettoProtoLogImplTest {
        Truth.assertThat(protolog.messages.getFirst().getTimestamp().getElapsedNanos())
                .isAtMost(after);
        Truth.assertThat(protolog.messages.getFirst().getMessage())
                .isEqualTo("My test message :: test, 2, 4, 6, 0.400000, 5.000000e-01, 0.6, true");
                .isEqualTo("My test message :: test, 2, 4, 6, 0.400000, true");
    }

    private long addMessageToConfig(ProtologCommon.ProtoLogLevel logLevel, String message) {
@@ -502,7 +491,7 @@ public class PerfettoProtoLogImplTest {
            before = SystemClock.elapsedRealtimeNanos();
            mProtoLog.log(
                    LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, messageHash,
                    0b01100100, null,
                    0b01100100,
                    new Object[]{"test", 1, 0.1, true});
            after = SystemClock.elapsedRealtimeNanos();
        } finally {
@@ -520,7 +509,7 @@ public class PerfettoProtoLogImplTest {
        try {
            traceMonitor.start();
            mProtoLog.log(LogLevel.DEBUG, TestProtoLogGroup.TEST_GROUP, 1,
                    0b11, null, new Object[]{true});
                    0b11, new Object[]{true});
        } finally {
            traceMonitor.stop(mWriter);
        }
@@ -544,7 +533,7 @@ public class PerfettoProtoLogImplTest {

            ProtoLogImpl.setSingleInstance(mProtoLog);
            ProtoLogImpl.d(TestProtoLogGroup.TEST_GROUP, 1,
                    0b11, null, true);
                    0b11, true);
        } finally {
            traceMonitor.stop(mWriter);
        }
@@ -618,7 +607,7 @@ public class PerfettoProtoLogImplTest {
                .isFalse();
        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.ERROR))
                .isFalse();
        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.WTF)).isTrue();
        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.WTF)).isFalse();

        PerfettoTraceMonitor traceMonitor1 =
                PerfettoTraceMonitor.newBuilder().enableProtoLog(true,
@@ -696,7 +685,7 @@ public class PerfettoProtoLogImplTest {
        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.ERROR))
                .isFalse();
        Truth.assertThat(mProtoLog.isEnabled(TestProtoLogGroup.TEST_GROUP, LogLevel.WTF))
                .isTrue();
                .isFalse();
    }

    private enum TestProtoLogGroup implements IProtoLogGroup {
+12 −13
Original line number Diff line number Diff line
@@ -58,51 +58,50 @@ public class ProtoLogImplTest {
    public void d_logCalled() {
        IProtoLog mockedProtoLog = mock(IProtoLog.class);
        ProtoLogImpl.setSingleInstance(mockedProtoLog);
        ProtoLogImpl.d(TestProtoLogGroup.TEST_GROUP, 1234, 4321, "test %d");
        ProtoLogImpl.d(TestProtoLogGroup.TEST_GROUP, 1234, 4321);
        verify(mockedProtoLog).log(eq(LogLevel.DEBUG), eq(
                TestProtoLogGroup.TEST_GROUP),
                eq(1234L), eq(4321), eq("test %d"), eq(new Object[]{}));
                eq(1234L), eq(4321), eq(new Object[]{}));
    }

    @Test
    public void v_logCalled() {
        IProtoLog mockedProtoLog = mock(IProtoLog.class);
        ProtoLogImpl.setSingleInstance(mockedProtoLog);
        ProtoLogImpl.v(TestProtoLogGroup.TEST_GROUP, 1234, 4321, "test %d");
        ProtoLogImpl.v(TestProtoLogGroup.TEST_GROUP, 1234, 4321);
        verify(mockedProtoLog).log(eq(LogLevel.VERBOSE), eq(
                TestProtoLogGroup.TEST_GROUP),
                eq(1234L), eq(4321), eq("test %d"), eq(new Object[]{}));
                eq(1234L), eq(4321), eq(new Object[]{}));
    }

    @Test
    public void i_logCalled() {
        IProtoLog mockedProtoLog = mock(IProtoLog.class);
        ProtoLogImpl.setSingleInstance(mockedProtoLog);
        ProtoLogImpl.i(TestProtoLogGroup.TEST_GROUP, 1234, 4321, "test %d");
        ProtoLogImpl.i(TestProtoLogGroup.TEST_GROUP, 1234, 4321);
        verify(mockedProtoLog).log(eq(LogLevel.INFO), eq(
                TestProtoLogGroup.TEST_GROUP),
                eq(1234L), eq(4321), eq("test %d"), eq(new Object[]{}));
                eq(1234L), eq(4321), eq(new Object[]{}));
    }

    @Test
    public void w_logCalled() {
        IProtoLog mockedProtoLog = mock(IProtoLog.class);
        ProtoLogImpl.setSingleInstance(mockedProtoLog);
        ProtoLogImpl.w(TestProtoLogGroup.TEST_GROUP, 1234,
                4321, "test %d");
        ProtoLogImpl.w(TestProtoLogGroup.TEST_GROUP, 1234, 4321);
        verify(mockedProtoLog).log(eq(LogLevel.WARN), eq(
                TestProtoLogGroup.TEST_GROUP),
                eq(1234L), eq(4321), eq("test %d"), eq(new Object[]{}));
                eq(1234L), eq(4321), eq(new Object[]{}));
    }

    @Test
    public void e_logCalled() {
        IProtoLog mockedProtoLog = mock(IProtoLog.class);
        ProtoLogImpl.setSingleInstance(mockedProtoLog);
        ProtoLogImpl.e(TestProtoLogGroup.TEST_GROUP, 1234, 4321, "test %d");
        ProtoLogImpl.e(TestProtoLogGroup.TEST_GROUP, 1234, 4321);
        verify(mockedProtoLog).log(eq(LogLevel.ERROR), eq(
                TestProtoLogGroup.TEST_GROUP),
                eq(1234L), eq(4321), eq("test %d"), eq(new Object[]{}));
                eq(1234L), eq(4321), eq(new Object[]{}));
    }

    @Test
@@ -110,10 +109,10 @@ public class ProtoLogImplTest {
        IProtoLog mockedProtoLog = mock(IProtoLog.class);
        ProtoLogImpl.setSingleInstance(mockedProtoLog);
        ProtoLogImpl.wtf(TestProtoLogGroup.TEST_GROUP,
                1234, 4321, "test %d");
                1234, 4321);
        verify(mockedProtoLog).log(eq(LogLevel.WTF), eq(
                TestProtoLogGroup.TEST_GROUP),
                eq(1234L), eq(4321), eq("test %d"), eq(new Object[]{}));
                eq(1234L), eq(4321), eq(new Object[]{}));
    }

    private enum TestProtoLogGroup implements IProtoLogGroup {