diff --git a/TestParser$LogEntry.class b/TestParser$LogEntry.class new file mode 100644 index 0000000..cda6bb2 Binary files /dev/null and b/TestParser$LogEntry.class differ diff --git a/TestParser$LogLevel.class b/TestParser$LogLevel.class new file mode 100644 index 0000000..9f7f58e Binary files /dev/null and b/TestParser$LogLevel.class differ diff --git a/app/src/main/kotlin/io/github/asutorufa/yuhaiin/compose/Logcat.kt b/app/src/main/kotlin/io/github/asutorufa/yuhaiin/compose/Logcat.kt index 3acc1ee..eee2d7c 100644 --- a/app/src/main/kotlin/io/github/asutorufa/yuhaiin/compose/Logcat.kt +++ b/app/src/main/kotlin/io/github/asutorufa/yuhaiin/compose/Logcat.kt @@ -410,7 +410,7 @@ data class LogEntry( var tid: Int? = 0, ) -fun parseLogv2(line: String): LogEntry { +fun parseLog(line: String): LogEntry { val log = LogEntry( content = line ) @@ -435,8 +435,8 @@ fun parseLogv2(line: String): LogEntry { val tm = TIME_LINE.matcher(line) if (!tm.matches()) return log - log.time = m.group(1) ?: "" - log.level = when (m.group(4)) { + log.time = tm.group(1) ?: "" + log.level = when (tm.group(2)) { "V", "D" -> LogLevel.DEBUG "I" -> LogLevel.INFO "W" -> LogLevel.WARN @@ -453,58 +453,6 @@ fun parseLogv2(line: String): LogEntry { return log } -fun parseLog(line: String): LogEntry { - var i = 0 - val n = line.length - - fun skipSpaces() { - while (i < n && line[i] == ' ') i++ - } - - fun readWord(): String { - val start = i - while (i < n && line[i] != ' ') i++ - return line.substring(start, i) - } - - skipSpaces() - val date = readWord() - skipSpaces() - val timeStr = readWord() - skipSpaces() - val pidStr = readWord() - skipSpaces() - val tidStr = readWord() - skipSpaces() - val levelStr = readWord() - skipSpaces() - val tagStart = i - while (i < n && line[i] != ':') i++ - val tag = if (i < n) line.substring(tagStart, i) else "" - i++ // skip ':' - val content = if (i < n) line.substring(i).trimStart() else "" - - val level = when (levelStr) { - "V", "D" -> LogLevel.DEBUG - "I" -> LogLevel.INFO - "W" -> LogLevel.WARN - "E", "F" -> LogLevel.ERROR - else -> LogLevel.INFO - } - - if (content.isEmpty()) - return LogEntry(time = Date().toString(), content = line) - - return LogEntry( - level = level, - time = "$date $timeStr", - content = content, - tag = tag, - pid = pidStr.toIntOrNull(), - tid = tidStr.toIntOrNull() - ) -} - @Composable @Preview fun LogItem( @@ -598,7 +546,7 @@ fun runLogcat( try { it.readLine()?.let { line -> if (excludeList.exist(line)) return@let - pushLogs(parseLogv2(line)) + pushLogs(parseLog(line)) } ?: break } catch (e: Exception) { Log.w("read log failed", "$e") diff --git a/app/src/test/kotlin/io/github/asutorufa/yuhaiin/compose/LogcatTest.kt b/app/src/test/kotlin/io/github/asutorufa/yuhaiin/compose/LogcatTest.kt new file mode 100644 index 0000000..6d8553c --- /dev/null +++ b/app/src/test/kotlin/io/github/asutorufa/yuhaiin/compose/LogcatTest.kt @@ -0,0 +1,37 @@ +package io.github.asutorufa.yuhaiin.compose + +import org.junit.Test +import kotlin.test.assertEquals + +class LogcatTest { + + @Test + fun testParseThreadTime() { + val line = "05-26 11:02:36.886 5689 5689 D AndroidRuntime: CheckJNI is OFF" + val log = parseLog(line) + assertEquals("05-26 11:02:36.886", log.time) + assertEquals(5689, log.pid) + assertEquals(5689, log.tid) + assertEquals(LogLevel.DEBUG, log.level) + assertEquals("AndroidRuntime", log.tag) + assertEquals("CheckJNI is OFF", log.content) + } + + @Test + fun testParseTime() { + val line = "06-04 02:32:14.002 D/dalvikvm( 236): GC_CONCURRENT freed 580K, 51% free [...]" + val log = parseLog(line) + assertEquals("06-04 02:32:14.002", log.time) + assertEquals(236, log.pid) + assertEquals(LogLevel.DEBUG, log.level) + assertEquals("dalvikvm", log.tag) + assertEquals("GC_CONCURRENT freed 580K, 51% free [...]", log.content) + } + + @Test + fun testParseUnknown() { + val line = "some random log line" + val log = parseLog(line) + assertEquals("some random log line", log.content) + } +}