blob: a39b856f0f49550adc05f6b48cf2080e0f0e9add [file] [log] [blame]
package com.android.systemui.log
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.plugins.log.LogBuffer
import com.google.common.truth.Truth.assertThat
import java.io.PrintWriter
import java.io.StringWriter
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.junit.MockitoJUnitRunner
@SmallTest
@RunWith(MockitoJUnitRunner::class)
class LogBufferTest : SysuiTestCase() {
private lateinit var buffer: LogBuffer
private lateinit var outputWriter: StringWriter
@Mock private lateinit var logcatEchoTracker: LogcatEchoTracker
@Before
fun setup() {
outputWriter = StringWriter()
buffer = createBuffer()
}
private fun createBuffer(): LogBuffer {
return LogBuffer("TestBuffer", 1, logcatEchoTracker, false)
}
@Test
fun log_shouldSaveLogToBuffer() {
buffer.log("Test", LogLevel.INFO, "Some test message")
val dumpedString = dumpBuffer()
assertThat(dumpedString).contains("Some test message")
}
@Test
fun log_shouldRotateIfLogBufferIsFull() {
buffer.log("Test", LogLevel.INFO, "This should be rotated")
buffer.log("Test", LogLevel.INFO, "New test message")
val dumpedString = dumpBuffer()
assertThat(dumpedString).contains("New test message")
}
@Test
fun dump_writesExceptionAndStacktrace() {
buffer = createBuffer()
val exception = createTestException("Exception message", "TestClass")
buffer.log("Tag", LogLevel.ERROR, { str1 = "Extra message" }, { str1!! }, exception)
val dumpedString = dumpBuffer()
assertThat(dumpedString).contains("Extra message")
assertThat(dumpedString).contains("java.lang.RuntimeException: Exception message")
assertThat(dumpedString).contains("at TestClass.TestMethod(TestClass.java:1)")
assertThat(dumpedString).contains("at TestClass.TestMethod(TestClass.java:2)")
}
@Test
fun dump_writesCauseAndStacktrace() {
buffer = createBuffer()
val exception =
createTestException(
"Exception message",
"TestClass",
cause = createTestException("The real cause!", "TestClass")
)
buffer.log("Tag", LogLevel.ERROR, { str1 = "Extra message" }, { str1!! }, exception)
val dumpedString = dumpBuffer()
assertThat(dumpedString).contains("Caused by: java.lang.RuntimeException: The real cause!")
assertThat(dumpedString).contains("at TestClass.TestMethod(TestClass.java:1)")
assertThat(dumpedString).contains("at TestClass.TestMethod(TestClass.java:2)")
}
@Test
fun dump_writesSuppressedExceptionAndStacktrace() {
buffer = createBuffer()
val exception = RuntimeException("Root exception message")
exception.addSuppressed(
createTestException(
"First suppressed exception",
"FirstClass",
createTestException("Cause of suppressed exp", "ThirdClass")
)
)
exception.addSuppressed(createTestException("Second suppressed exception", "SecondClass"))
buffer.log("Tag", LogLevel.ERROR, { str1 = "Extra message" }, { str1!! }, exception)
val dumpedStr = dumpBuffer()
// first suppressed exception
assertThat(dumpedStr)
.contains("Suppressed: " + "java.lang.RuntimeException: First suppressed exception")
assertThat(dumpedStr).contains("at FirstClass.TestMethod(FirstClass.java:1)")
assertThat(dumpedStr).contains("at FirstClass.TestMethod(FirstClass.java:2)")
assertThat(dumpedStr)
.contains("Caused by: java.lang.RuntimeException: Cause of suppressed exp")
assertThat(dumpedStr).contains("at ThirdClass.TestMethod(ThirdClass.java:1)")
assertThat(dumpedStr).contains("at ThirdClass.TestMethod(ThirdClass.java:2)")
// second suppressed exception
assertThat(dumpedStr)
.contains("Suppressed: " + "java.lang.RuntimeException: Second suppressed exception")
assertThat(dumpedStr).contains("at SecondClass.TestMethod(SecondClass.java:1)")
assertThat(dumpedStr).contains("at SecondClass.TestMethod(SecondClass.java:2)")
}
private fun createTestException(
message: String,
errorClass: String,
cause: Throwable? = null,
): Exception {
val exception = RuntimeException(message, cause)
exception.stackTrace =
(1..5)
.map { lineNumber ->
StackTraceElement(errorClass, "TestMethod", "$errorClass.java", lineNumber)
}
.toTypedArray()
return exception
}
private fun dumpBuffer(): String {
buffer.dump(PrintWriter(outputWriter), tailLength = 100)
return outputWriter.toString()
}
}