diff options
4 files changed, 172 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/utils/EventLogger.java b/services/core/java/com/android/server/utils/EventLogger.java index 45b4ff8e1832..aa8b94a71b4e 100644 --- a/services/core/java/com/android/server/utils/EventLogger.java +++ b/services/core/java/com/android/server/utils/EventLogger.java @@ -23,8 +23,8 @@ import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.text.SimpleDateFormat; +import java.util.ArrayDeque; import java.util.Date; -import java.util.LinkedList; import java.util.Locale; /** @@ -36,7 +36,7 @@ public class EventLogger { private final String mTag; /** Stores the events using a ring buffer. */ - private final LinkedList<Event> mEvents; + private final ArrayDeque<Event> mEvents; /** * The maximum number of events to keep in {@code mEvents}. @@ -52,16 +52,18 @@ public class EventLogger { * @param tag the string displayed before the recorded log */ public EventLogger(int size, String tag) { - mEvents = new LinkedList<Event>(); + mEvents = new ArrayDeque<>(size); mMemSize = size; mTag = tag; } - public synchronized void log(Event evt) { + /** Enqueues {@code event} to be logged. */ + public synchronized void log(Event event) { if (mEvents.size() >= mMemSize) { - mEvents.removeFirst(); + mEvents.removeLast(); } - mEvents.add(evt); + + mEvents.addFirst(event); } /** @@ -85,8 +87,10 @@ public class EventLogger { log(event.printLog(logType, tag)); } + /** Dumps events using {@link PrintWriter} */ public synchronized void dump(PrintWriter pw) { pw.println("Events log: " + mTag); + for (Event evt : mEvents) { pw.println(evt.toString()); } diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp index ebdef8af47f8..a09d9948817f 100644 --- a/services/tests/servicestests/Android.bp +++ b/services/tests/servicestests/Android.bp @@ -58,6 +58,7 @@ android_test { // TODO: remove once Android migrates to JUnit 4.12, // which provides assertThrows "testng", + "truth-prebuilt", "junit", "junit-params", "platform-compat-test-rules", diff --git a/services/tests/servicestests/src/com/android/server/utils/EventLoggerTest.java b/services/tests/servicestests/src/com/android/server/utils/EventLoggerTest.java new file mode 100644 index 000000000000..0b27f8734f23 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/utils/EventLoggerTest.java @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2022 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.utils; + +import static com.google.common.truth.Truth.assertThat; + +import androidx.test.filters.SmallTest; + +import org.junit.Before; +import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.junit.runners.Parameterized; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Arrays; +import java.util.Collection; + +@SmallTest +@RunWith(Enclosed.class) +public class EventLoggerTest { + + private static final int EVENTS_LOGGER_SIZE = 3; + private static final String EVENTS_LOGGER_TAG = "TestLogger"; + + private static final TestEvent TEST_EVENT_1 = new TestEvent(); + private static final TestEvent TEST_EVENT_2 = new TestEvent(); + private static final TestEvent TEST_EVENT_3 = new TestEvent(); + private static final TestEvent TEST_EVENT_4 = new TestEvent(); + private static final TestEvent TEST_EVENT_5 = new TestEvent(); + + @RunWith(JUnit4.class) + public static class BasicOperationsTest { + + private StringWriter mTestStringWriter; + private PrintWriter mTestPrintWriter; + + private EventLogger mEventLogger; + + @Before + public void setUp() { + mTestStringWriter = new StringWriter(); + mTestPrintWriter = new PrintWriter(mTestStringWriter); + mEventLogger = new EventLogger(EVENTS_LOGGER_SIZE, EVENTS_LOGGER_TAG); + } + + @Test + public void testThatConsumeOfEmptyLoggerProducesEmptyList() { + mEventLogger.dump(mTestPrintWriter); + assertThat(mTestStringWriter.toString()).isEmpty(); + } + } + + @RunWith(Parameterized.class) + public static class LoggingOperationTest { + + @Parameterized.Parameters + public static Collection<Object[]> data() { + return Arrays.asList(new Object[][] { + { + // insertion order, max size is 3 + new EventLogger.Event[] { TEST_EVENT_1, TEST_EVENT_2 }, + // expected events + new EventLogger.Event[] { TEST_EVENT_2, TEST_EVENT_1 } + }, + { + // insertion order, max size is 3 + new EventLogger.Event[] { TEST_EVENT_1, TEST_EVENT_3, TEST_EVENT_2 }, + // expected events + new EventLogger.Event[] { TEST_EVENT_2, TEST_EVENT_3, TEST_EVENT_1 } + }, + { + // insertion order, max size is 3 + new EventLogger.Event[] { TEST_EVENT_1, TEST_EVENT_2, TEST_EVENT_3, + TEST_EVENT_4 }, + // expected events + new EventLogger.Event[] { TEST_EVENT_4, TEST_EVENT_3, TEST_EVENT_2 } + }, + { + // insertion order, max size is 3 + new EventLogger.Event[] { TEST_EVENT_1, TEST_EVENT_2, TEST_EVENT_3, + TEST_EVENT_4, TEST_EVENT_5 }, + // expected events + new EventLogger.Event[] { TEST_EVENT_5, TEST_EVENT_4, TEST_EVENT_3 } + } + }); + } + + private EventLogger mEventLogger; + + private final StringWriter mTestStringWriter; + private final PrintWriter mTestPrintWriter; + private final EventLogger.Event[] mEventsToInsert; + private final EventLogger.Event[] mExpectedEvents; + + public LoggingOperationTest(EventLogger.Event[] eventsToInsert, + EventLogger.Event[] expectedEvents) { + mTestStringWriter = new StringWriter(); + mTestPrintWriter = new PrintWriter(mTestStringWriter); + mEventsToInsert = eventsToInsert; + mExpectedEvents = expectedEvents; + } + + @Before + public void setUp() { + mEventLogger = new EventLogger(EVENTS_LOGGER_SIZE, EVENTS_LOGGER_TAG); + } + + @Test + public void testThatLoggingWorksAsExpected() { + for (EventLogger.Event event: mEventsToInsert) { + mEventLogger.log(event); + } + + mEventLogger.dump(mTestPrintWriter); + + assertThat(mTestStringWriter.toString()) + .isEqualTo(convertEventsToString(mExpectedEvents)); + } + + } + + private static String convertEventsToString(EventLogger.Event[] events) { + StringWriter stringWriter = new StringWriter(); + PrintWriter printWriter = new PrintWriter(stringWriter); + + printWriter.println("Events log: " + EVENTS_LOGGER_TAG); + + for (EventLogger.Event event: events) { + printWriter.println(event.toString()); + } + + return stringWriter.toString(); + } + + private static class TestEvent extends EventLogger.Event { + + @Override + public String eventToString() { + return getClass().getName() + "@" + Integer.toHexString(hashCode()); + } + } +} diff --git a/services/tests/servicestests/src/com/android/server/utils/OWNERS b/services/tests/servicestests/src/com/android/server/utils/OWNERS index 1853220b9433..d1a36bb22e97 100644 --- a/services/tests/servicestests/src/com/android/server/utils/OWNERS +++ b/services/tests/servicestests/src/com/android/server/utils/OWNERS @@ -2,3 +2,5 @@ per-file WatchableTester.java = file:/services/core/java/com/android/server/pm/O per-file WatchableTester.java = shombert@google.com per-file WatcherTest.java = file:/services/core/java/com/android/server/pm/OWNERS per-file WatcherTest.java = shombert@google.com +per-file EventLoggerTest.java = file:/platform/frameworks/av:/media/janitors/media_solutions_OWNERS +per-file EventLoggerTest.java = jmtrivi@google.com |