summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
author Pablo Gamito <pablogamito@google.com> 2025-03-18 14:39:03 +0000
committer Pablo Gamito <pablogamito@google.com> 2025-03-18 16:10:42 +0000
commitc90355f794af4e9f238a85d6e0ddb3b3c31e358a (patch)
tree6a59965ff86825be2dc7fb830d179336afa65b11 /tools
parent483768d275d4046033e6c000083d42e22e357f59 (diff)
Handle invalid protolog message format more gracefully
Will now throw error with the following prefix: 'Code processing error in MyFile.java:123' Bug: 403564102 Test: atest com.android.protolog.tool.ProtoLogCallProcessorImplTest Flag: EXEMPT minor error handling change Change-Id: Ifa7d566fae22d1bd2607a41e735113119bfbd7e0
Diffstat (limited to 'tools')
-rw-r--r--tools/protologtool/src/com/android/protolog/tool/Exceptions.kt (renamed from tools/protologtool/src/com/android/protolog/tool/exceptions.kt)25
-rw-r--r--tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessorImpl.kt14
-rw-r--r--tools/protologtool/tests/com/android/protolog/tool/ProtoLogCallProcessorImplTest.kt37
3 files changed, 62 insertions, 14 deletions
diff --git a/tools/protologtool/src/com/android/protolog/tool/exceptions.kt b/tools/protologtool/src/com/android/protolog/tool/Exceptions.kt
index ae00df123353..4f7e8d13c4ba 100644
--- a/tools/protologtool/src/com/android/protolog/tool/exceptions.kt
+++ b/tools/protologtool/src/com/android/protolog/tool/Exceptions.kt
@@ -18,21 +18,24 @@ package com.android.protolog.tool
import java.lang.Exception
-open class CodeProcessingException(message: String, context: ParsingContext)
- : Exception("Code processing error in ${context.filePath}:${context.lineNumber}:\n" +
- " $message")
+open class CodeProcessingException(
+ message: String, context: ParsingContext, cause: Throwable? = null
+) : Exception("Code processing error in ${context.filePath}:${context.lineNumber}:\n" +
+ " $message", cause)
-class HashCollisionException(message: String, context: ParsingContext) :
- CodeProcessingException(message, context)
+class HashCollisionException(
+ message: String, context: ParsingContext, cause: Throwable? = null
+) : CodeProcessingException(message, context, cause)
-class IllegalImportException(message: String, context: ParsingContext) :
- CodeProcessingException("Illegal import: $message", context)
+class IllegalImportException(message: String, context: ParsingContext, cause: Throwable? = null) :
+ CodeProcessingException("Illegal import: $message", context, cause)
-class InvalidProtoLogCallException(message: String, context: ParsingContext)
- : CodeProcessingException("InvalidProtoLogCall: $message", context)
+class InvalidProtoLogCallException(
+ message: String, context: ParsingContext, cause: Throwable? = null
+) : CodeProcessingException("InvalidProtoLogCall: $message", context, cause)
-class ParsingException(message: String, context: ParsingContext)
- : CodeProcessingException(message, context)
+class ParsingException(message: String, context: ParsingContext, cause: Throwable? = null) :
+ CodeProcessingException(message, context, cause)
class InvalidViewerConfigException(message: String) : Exception(message)
diff --git a/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessorImpl.kt b/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessorImpl.kt
index 272d8bb1793d..1f6db5fe2d37 100644
--- a/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessorImpl.kt
+++ b/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessorImpl.kt
@@ -118,9 +118,17 @@ class ProtoLogCallProcessorImpl(
"- not a ProtoLogGroup enum member: $call", context)
}
- logCallVisitor?.processCall(call, messageString, getLevelForMethodName(
- call.name.toString(), call, context), groupMap.getValue(groupName),
- context.lineNumber)
+ try {
+ logCallVisitor?.processCall(
+ call, messageString, getLevelForMethodName(
+ call.name.toString(), call, context
+ ), groupMap.getValue(groupName),
+ context.lineNumber
+ )
+ } catch (e: Throwable) {
+ throw InvalidProtoLogCallException("Error processing log call: $call",
+ context, e)
+ }
} else if (call.name.id == "init") {
// No processing
} else {
diff --git a/tools/protologtool/tests/com/android/protolog/tool/ProtoLogCallProcessorImplTest.kt b/tools/protologtool/tests/com/android/protolog/tool/ProtoLogCallProcessorImplTest.kt
index 004d97babbad..732824ae841c 100644
--- a/tools/protologtool/tests/com/android/protolog/tool/ProtoLogCallProcessorImplTest.kt
+++ b/tools/protologtool/tests/com/android/protolog/tool/ProtoLogCallProcessorImplTest.kt
@@ -16,11 +16,14 @@
package com.android.protolog.tool
+import com.android.internal.protolog.common.InvalidFormatStringException
import com.android.internal.protolog.common.LogLevel
import com.github.javaparser.StaticJavaParser
import com.github.javaparser.ast.expr.MethodCallExpr
import org.junit.Assert.assertEquals
+import org.junit.Assert.assertThrows
import org.junit.Test
+import com.google.common.truth.Truth
class ProtoLogCallProcessorImplTest {
private data class LogCall(
@@ -228,4 +231,38 @@ class ProtoLogCallProcessorImplTest {
visitor.process(StaticJavaParser.parse(code), processor, "")
checkCalls()
}
+
+ @Test
+ fun throws_clear_error_message_on_invalid_format_exception() {
+ val code = """
+ package org.example;
+
+ class Test {
+ void test() {
+ ProtoLog.d(ProtoLogGroup.TEST, "Invalid message %9 %");
+ }
+ }
+ """
+ groupMap["TEST"] = LogGroup("TEST", false, true, "WindowManager")
+
+ val processor = object : ProtoLogCallVisitor {
+ override fun processCall(
+ call: MethodCallExpr,
+ messageString: String,
+ level: LogLevel,
+ group: LogGroup,
+ lineNumber: Int,
+ ) {
+ throw InvalidFormatStringException("Invalid Protolog message format")
+ }
+ }
+
+ val exception = assertThrows(InvalidProtoLogCallException::class.java) {
+ visitor.process(StaticJavaParser.parse(code), processor, "MyTestFile.java")
+ }
+ Truth.assertThat(exception).hasMessageThat()
+ .contains("Code processing error in MyTestFile.java:6")
+ Truth.assertThat(exception.cause).hasMessageThat()
+ .contains("Invalid Protolog message format")
+ }
}