diff options
author | Adam Pardyl <apardyl@google.com> | 2019-08-19 15:24:11 +0200 |
---|---|---|
committer | Adam Pardyl <apardyl@google.com> | 2019-09-23 15:47:29 +0000 |
commit | 0f1b3d460259e0b739c363c1158f774315e45e87 (patch) | |
tree | 978f3c6f2d166cbc6a5dda46f6dde24b8fc04794 /tools/protologtool | |
parent | eba21f1d7a8bc93826487f4674aafe9033318b6d (diff) |
WindowManager ProtoLog feature
This CL implements the on-device part of ProtoLog
- the new logging system for WindowManager.
Design doc: go/windowmanager-log2proto
Change-Id: I2c88c97dabb3465ffc0615b8017b335a494bca59
Bug:
Test: atest FrameworksServicesTests:com.android.server.protolog protologtool-tests
Diffstat (limited to 'tools/protologtool')
-rw-r--r-- | tools/protologtool/Android.bp | 23 | ||||
-rw-r--r-- | tools/protologtool/manifest.txt | 2 | ||||
-rw-r--r-- | tools/protologtool/src/com/android/protolog/tool/CodeUtils.kt (renamed from tools/protologtool/src/com/android/protologtool/CodeUtils.kt) | 63 | ||||
-rw-r--r-- | tools/protologtool/src/com/android/protolog/tool/CommandOptions.kt (renamed from tools/protologtool/src/com/android/protologtool/CommandOptions.kt) | 2 | ||||
-rw-r--r-- | tools/protologtool/src/com/android/protolog/tool/Constants.kt (renamed from tools/protologtool/src/com/android/protologtool/Constants.kt) | 5 | ||||
-rw-r--r-- | tools/protologtool/src/com/android/protolog/tool/LogGroup.kt (renamed from tools/protologtool/src/com/android/protologtool/LogGroup.kt) | 2 | ||||
-rw-r--r-- | tools/protologtool/src/com/android/protolog/tool/LogLevel.kt (renamed from tools/protologtool/src/com/android/protologtool/LogLevel.kt) | 2 | ||||
-rw-r--r-- | tools/protologtool/src/com/android/protolog/tool/LogParser.kt (renamed from tools/protologtool/src/com/android/protologtool/LogParser.kt) | 25 | ||||
-rw-r--r-- | tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessor.kt (renamed from tools/protologtool/src/com/android/protologtool/ProtoLogCallProcessor.kt) | 2 | ||||
-rw-r--r-- | tools/protologtool/src/com/android/protolog/tool/ProtoLogCallVisitor.kt (renamed from tools/protologtool/src/com/android/protologtool/ProtoLogCallVisitor.kt) | 2 | ||||
-rw-r--r-- | tools/protologtool/src/com/android/protolog/tool/ProtoLogGroupReader.kt (renamed from tools/protologtool/src/com/android/protologtool/ProtoLogGroupReader.kt) | 24 | ||||
-rw-r--r-- | tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt (renamed from tools/protologtool/src/com/android/protologtool/ProtoLogTool.kt) | 22 | ||||
-rw-r--r-- | tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt (renamed from tools/protologtool/src/com/android/protologtool/SourceTransformer.kt) | 46 | ||||
-rw-r--r-- | tools/protologtool/src/com/android/protolog/tool/ViewerConfigBuilder.kt (renamed from tools/protologtool/src/com/android/protologtool/ViewerConfigBuilder.kt) | 4 | ||||
-rw-r--r-- | tools/protologtool/src/com/android/protolog/tool/ViewerConfigParser.kt (renamed from tools/protologtool/src/com/android/protologtool/ViewerConfigParser.kt) | 11 | ||||
-rw-r--r-- | tools/protologtool/src/com/android/protolog/tool/exceptions.kt (renamed from tools/protologtool/src/com/android/protologtool/exceptions.kt) | 14 | ||||
-rw-r--r-- | tools/protologtool/tests/com/android/protolog/tool/CodeUtilsTest.kt (renamed from tools/protologtool/tests/com/android/protologtool/CodeUtilsTest.kt) | 41 | ||||
-rw-r--r-- | tools/protologtool/tests/com/android/protolog/tool/CommandOptionsTest.kt (renamed from tools/protologtool/tests/com/android/protologtool/CommandOptionsTest.kt) | 2 | ||||
-rw-r--r-- | tools/protologtool/tests/com/android/protolog/tool/LogParserTest.kt (renamed from tools/protologtool/tests/com/android/protologtool/LogParserTest.kt) | 30 | ||||
-rw-r--r-- | tools/protologtool/tests/com/android/protolog/tool/ProtoLogCallProcessorTest.kt (renamed from tools/protologtool/tests/com/android/protologtool/ProtoLogCallProcessorTest.kt) | 2 | ||||
-rw-r--r-- | tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt (renamed from tools/protologtool/tests/com/android/protologtool/SourceTransformerTest.kt) | 2 | ||||
-rw-r--r-- | tools/protologtool/tests/com/android/protolog/tool/ViewerConfigBuilderTest.kt (renamed from tools/protologtool/tests/com/android/protologtool/ViewerConfigBuilderTest.kt) | 2 | ||||
-rw-r--r-- | tools/protologtool/tests/com/android/protolog/tool/ViewerConfigParserTest.kt (renamed from tools/protologtool/tests/com/android/protologtool/ViewerConfigParserTest.kt) | 6 |
23 files changed, 131 insertions, 203 deletions
diff --git a/tools/protologtool/Android.bp b/tools/protologtool/Android.bp index a86c226c2179..d1a86c245dec 100644 --- a/tools/protologtool/Android.bp +++ b/tools/protologtool/Android.bp @@ -1,27 +1,32 @@ -java_binary_host { - name: "protologtool", - manifest: "manifest.txt", +java_library_host { + name: "protologtool-lib", srcs: [ - "src/**/*.kt", + "src/com/android/protolog/tool/**/*.kt", ], static_libs: [ + "protolog-common", "javaparser", - "windowmanager-log-proto", + "protolog-proto", "jsonlib", ], } +java_binary_host { + name: "protologtool", + manifest: "manifest.txt", + static_libs: [ + "protologtool-lib", + ], +} + java_test_host { name: "protologtool-tests", test_suites: ["general-tests"], srcs: [ - "src/**/*.kt", "tests/**/*.kt", ], static_libs: [ - "javaparser", - "windowmanager-log-proto", - "jsonlib", + "protologtool-lib", "junit", "mockito", ], diff --git a/tools/protologtool/manifest.txt b/tools/protologtool/manifest.txt index f5e53c450f2a..cabebd51a2fa 100644 --- a/tools/protologtool/manifest.txt +++ b/tools/protologtool/manifest.txt @@ -1 +1 @@ -Main-class: com.android.protologtool.ProtoLogTool +Main-class: com.android.protolog.tool.ProtoLogTool diff --git a/tools/protologtool/src/com/android/protologtool/CodeUtils.kt b/tools/protologtool/src/com/android/protolog/tool/CodeUtils.kt index facca6290c91..5c921612df45 100644 --- a/tools/protologtool/src/com/android/protologtool/CodeUtils.kt +++ b/tools/protologtool/src/com/android/protolog/tool/CodeUtils.kt @@ -14,20 +14,13 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool -import com.github.javaparser.StaticJavaParser import com.github.javaparser.ast.CompilationUnit import com.github.javaparser.ast.ImportDeclaration -import com.github.javaparser.ast.NodeList import com.github.javaparser.ast.expr.BinaryExpr import com.github.javaparser.ast.expr.Expression -import com.github.javaparser.ast.expr.MethodCallExpr -import com.github.javaparser.ast.expr.SimpleName import com.github.javaparser.ast.expr.StringLiteralExpr -import com.github.javaparser.ast.expr.TypeExpr -import com.github.javaparser.ast.type.PrimitiveType -import com.github.javaparser.ast.type.Type object CodeUtils { /** @@ -78,58 +71,4 @@ object CodeUtils { "or concatenation of string literals.", expr) } } - - enum class LogDataTypes( - val type: Type, - val toType: (Expression) -> Expression = { expr -> expr } - ) { - // When adding new LogDataType make sure to update {@code logDataTypesToBitMask} accordingly - STRING(StaticJavaParser.parseClassOrInterfaceType("String"), - { expr -> - MethodCallExpr(TypeExpr(StaticJavaParser.parseClassOrInterfaceType("String")), - SimpleName("valueOf"), NodeList(expr)) - }), - LONG(PrimitiveType.longType()), - DOUBLE(PrimitiveType.doubleType()), - BOOLEAN(PrimitiveType.booleanType()); - } - - fun parseFormatString(messageString: String): List<LogDataTypes> { - val types = mutableListOf<LogDataTypes>() - var i = 0 - while (i < messageString.length) { - if (messageString[i] == '%') { - if (i + 1 >= messageString.length) { - throw InvalidFormatStringException("Invalid format string in config") - } - when (messageString[i + 1]) { - 'b' -> types.add(CodeUtils.LogDataTypes.BOOLEAN) - 'd', 'o', 'x' -> types.add(CodeUtils.LogDataTypes.LONG) - 'f', 'e', 'g' -> types.add(CodeUtils.LogDataTypes.DOUBLE) - 's' -> types.add(CodeUtils.LogDataTypes.STRING) - '%' -> { - } - else -> throw InvalidFormatStringException("Invalid format string field" + - " %${messageString[i + 1]}") - } - i += 2 - } else { - i += 1 - } - } - return types - } - - fun logDataTypesToBitMask(types: List<LogDataTypes>): Int { - if (types.size > 16) { - throw InvalidFormatStringException("Too many log call parameters " + - "- max 16 parameters supported") - } - var mask = 0 - types.forEachIndexed { idx, type -> - val x = LogDataTypes.values().indexOf(type) - mask = mask or (x shl (idx * 2)) - } - return mask - } } diff --git a/tools/protologtool/src/com/android/protologtool/CommandOptions.kt b/tools/protologtool/src/com/android/protolog/tool/CommandOptions.kt index df49e1566fbc..3dfa4d216cc2 100644 --- a/tools/protologtool/src/com/android/protologtool/CommandOptions.kt +++ b/tools/protologtool/src/com/android/protolog/tool/CommandOptions.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool import java.util.regex.Pattern diff --git a/tools/protologtool/src/com/android/protologtool/Constants.kt b/tools/protologtool/src/com/android/protolog/tool/Constants.kt index 2ccfc4d20182..83b3c00ebc28 100644 --- a/tools/protologtool/src/com/android/protologtool/Constants.kt +++ b/tools/protologtool/src/com/android/protolog/tool/Constants.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool object Constants { const val NAME = "protologtool" const val VERSION = "1.0.0" - const val IS_ENABLED_METHOD = "isEnabled" - const val IS_LOG_TO_LOGCAT_METHOD = "isLogToLogcat" const val IS_LOG_TO_ANY_METHOD = "isLogToAny" - const val GET_TAG_METHOD = "getTag" const val ENUM_VALUES_METHOD = "values" } diff --git a/tools/protologtool/src/com/android/protologtool/LogGroup.kt b/tools/protologtool/src/com/android/protolog/tool/LogGroup.kt index 42a37a26e08a..587f7b9db016 100644 --- a/tools/protologtool/src/com/android/protologtool/LogGroup.kt +++ b/tools/protologtool/src/com/android/protolog/tool/LogGroup.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool data class LogGroup( val name: String, diff --git a/tools/protologtool/src/com/android/protologtool/LogLevel.kt b/tools/protologtool/src/com/android/protolog/tool/LogLevel.kt index dc29557ef440..7759f35b33fe 100644 --- a/tools/protologtool/src/com/android/protologtool/LogLevel.kt +++ b/tools/protologtool/src/com/android/protolog/tool/LogLevel.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool import com.github.javaparser.ast.Node diff --git a/tools/protologtool/src/com/android/protologtool/LogParser.kt b/tools/protologtool/src/com/android/protolog/tool/LogParser.kt index 4d0eb0e4a705..a59038fc99a0 100644 --- a/tools/protologtool/src/com/android/protologtool/LogParser.kt +++ b/tools/protologtool/src/com/android/protolog/tool/LogParser.kt @@ -14,11 +14,13 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool import com.android.json.stream.JsonReader -import com.android.server.wm.ProtoLogMessage -import com.android.server.wm.WindowManagerLogFileProto +import com.android.server.protolog.common.InvalidFormatStringException +import com.android.server.protolog.common.LogDataType +import com.android.server.protolog.ProtoLogMessage +import com.android.server.protolog.ProtoLogFileProto import java.io.BufferedReader import java.io.InputStream import java.io.InputStreamReader @@ -36,8 +38,8 @@ class LogParser(private val configParser: ViewerConfigParser) { companion object { private val dateFormat = SimpleDateFormat("MM-dd HH:mm:ss.SSS", Locale.US) private val magicNumber = - WindowManagerLogFileProto.MagicNumber.MAGIC_NUMBER_H.number.toLong() shl 32 or - WindowManagerLogFileProto.MagicNumber.MAGIC_NUMBER_L.number.toLong() + ProtoLogFileProto.MagicNumber.MAGIC_NUMBER_H.number.toLong() shl 32 or + ProtoLogFileProto.MagicNumber.MAGIC_NUMBER_L.number.toLong() } private fun printTime(time: Long, offset: Long, ps: PrintStream) { @@ -55,14 +57,15 @@ class LogParser(private val configParser: ViewerConfigParser) { val boolParamsIt = protoLogMessage.booleanParamsList.iterator() val args = mutableListOf<Any>() val format = configEntry.messageString - val argTypes = CodeUtils.parseFormatString(format) + val argTypes = LogDataType.parseFormatString(format) try { argTypes.forEach { when (it) { - CodeUtils.LogDataTypes.BOOLEAN -> args.add(boolParamsIt.next()) - CodeUtils.LogDataTypes.LONG -> args.add(longParamsIt.next()) - CodeUtils.LogDataTypes.DOUBLE -> args.add(doubleParamsIt.next()) - CodeUtils.LogDataTypes.STRING -> args.add(strParmIt.next()) + LogDataType.BOOLEAN -> args.add(boolParamsIt.next()) + LogDataType.LONG -> args.add(longParamsIt.next()) + LogDataType.DOUBLE -> args.add(doubleParamsIt.next()) + LogDataType.STRING -> args.add(strParmIt.next()) + null -> throw NullPointerException() } } } catch (ex: NoSuchElementException) { @@ -85,7 +88,7 @@ class LogParser(private val configParser: ViewerConfigParser) { fun parse(protoLogInput: InputStream, jsonConfigInput: InputStream, ps: PrintStream) { val jsonReader = JsonReader(BufferedReader(InputStreamReader(jsonConfigInput))) val config = configParser.parseConfig(jsonReader) - val protoLog = WindowManagerLogFileProto.parseFrom(protoLogInput) + val protoLog = ProtoLogFileProto.parseFrom(protoLogInput) if (protoLog.magicNumber != magicNumber) { throw InvalidInputException("ProtoLog file magic number is invalid.") diff --git a/tools/protologtool/src/com/android/protologtool/ProtoLogCallProcessor.kt b/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessor.kt index 29d8ae5c6694..eae63962161c 100644 --- a/tools/protologtool/src/com/android/protologtool/ProtoLogCallProcessor.kt +++ b/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessor.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool import com.github.javaparser.ast.CompilationUnit import com.github.javaparser.ast.expr.Expression diff --git a/tools/protologtool/src/com/android/protologtool/ProtoLogCallVisitor.kt b/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallVisitor.kt index 42a75f8cc22f..aa58b69d61cb 100644 --- a/tools/protologtool/src/com/android/protologtool/ProtoLogCallVisitor.kt +++ b/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallVisitor.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool import com.github.javaparser.ast.expr.MethodCallExpr diff --git a/tools/protologtool/src/com/android/protologtool/ProtoLogGroupReader.kt b/tools/protologtool/src/com/android/protolog/tool/ProtoLogGroupReader.kt index 664c8a6506b2..75493b6427cb 100644 --- a/tools/protologtool/src/com/android/protologtool/ProtoLogGroupReader.kt +++ b/tools/protologtool/src/com/android/protolog/tool/ProtoLogGroupReader.kt @@ -14,14 +14,11 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool -import com.android.protologtool.Constants.ENUM_VALUES_METHOD -import com.android.protologtool.Constants.GET_TAG_METHOD -import com.android.protologtool.Constants.IS_ENABLED_METHOD -import com.android.protologtool.Constants.IS_LOG_TO_LOGCAT_METHOD +import com.android.protolog.tool.Constants.ENUM_VALUES_METHOD +import com.android.server.protolog.common.IProtoLogGroup import java.io.File -import java.lang.RuntimeException import java.net.URLClassLoader class ProtoLogGroupReader { @@ -31,18 +28,10 @@ class ProtoLogGroupReader { return URLClassLoader(arrayOf(url), ProtoLogGroupReader::class.java.classLoader) } - private fun getEnumValues(clazz: Class<*>): List<Enum<*>> { + private fun getEnumValues(clazz: Class<*>): List<IProtoLogGroup> { val valuesMethod = clazz.getMethod(ENUM_VALUES_METHOD) @Suppress("UNCHECKED_CAST") - return (valuesMethod.invoke(null) as Array<Enum<*>>).toList() - } - - private fun getLogGroupFromEnumValue(group: Any, clazz: Class<*>): LogGroup { - val enabled = clazz.getMethod(IS_ENABLED_METHOD).invoke(group) as Boolean - val textEnabled = clazz.getMethod(IS_LOG_TO_LOGCAT_METHOD).invoke(group) as Boolean - val tag = clazz.getMethod(GET_TAG_METHOD).invoke(group) as String - val name = (group as Enum<*>).name - return LogGroup(name, enabled, textEnabled, tag) + return (valuesMethod.invoke(null) as Array<IProtoLogGroup>).toList() } fun loadFromJar(jarPath: String, className: String): Map<String, LogGroup> { @@ -51,7 +40,8 @@ class ProtoLogGroupReader { val clazz = classLoader.loadClass(className) val values = getEnumValues(clazz) return values.map { group -> - group.name to getLogGroupFromEnumValue(group, clazz) + group.name() to + LogGroup(group.name(), group.isEnabled, group.isLogToLogcat, group.tag) }.toMap() } catch (ex: ReflectiveOperationException) { throw RuntimeException("Unable to load ProtoLogGroup enum class", ex) diff --git a/tools/protologtool/src/com/android/protologtool/ProtoLogTool.kt b/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt index 618e4b14e4c5..9678ec3a02ba 100644 --- a/tools/protologtool/src/com/android/protologtool/ProtoLogTool.kt +++ b/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt @@ -14,9 +14,9 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool -import com.android.protologtool.CommandOptions.Companion.USAGE +import com.android.protolog.tool.CommandOptions.Companion.USAGE import com.github.javaparser.StaticJavaParser import java.io.File import java.io.FileInputStream @@ -31,6 +31,11 @@ object ProtoLogTool { exitProcess(-1) } + private fun containsProtoLogText(source: String, protoLogClassName: String): Boolean { + val protoLogSimpleClassName = protoLogClassName.substringAfterLast('.') + return source.contains(protoLogSimpleClassName) + } + private fun processClasses(command: CommandOptions) { val groups = ProtoLogGroupReader() .loadFromJar(command.protoLogGroupsJarArg, command.protoLogGroupsClassNameArg) @@ -44,7 +49,11 @@ object ProtoLogTool { val file = File(path) val text = file.readText() val code = StaticJavaParser.parse(text) - val outSrc = transformer.processClass(text, code) + val outSrc = when { + containsProtoLogText(text, command.protoLogClassNameArg) -> + transformer.processClass(text, code) + else -> text + } val pack = if (code.packageDeclaration.isPresent) code.packageDeclaration .get().nameAsString else "" val newPath = pack.replace('.', '/') + '/' + file.name @@ -65,14 +74,17 @@ object ProtoLogTool { val builder = ViewerConfigBuilder(processor) command.javaSourceArgs.forEach { path -> val file = File(path) - builder.processClass(StaticJavaParser.parse(file)) + val text = file.readText() + if (containsProtoLogText(text, command.protoLogClassNameArg)) { + builder.processClass(StaticJavaParser.parse(text)) + } } val out = FileOutputStream(command.viewerConfigJsonArg) out.write(builder.build().toByteArray()) out.close() } - fun read(command: CommandOptions) { + private fun read(command: CommandOptions) { LogParser(ViewerConfigParser()) .parse(FileInputStream(command.logProtofileArg), FileInputStream(command.viewerConfigJsonArg), System.out) diff --git a/tools/protologtool/src/com/android/protologtool/SourceTransformer.kt b/tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt index f915ea6eb186..c3920780b22a 100644 --- a/tools/protologtool/src/com/android/protologtool/SourceTransformer.kt +++ b/tools/protologtool/src/com/android/protolog/tool/SourceTransformer.kt @@ -14,26 +14,32 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool -import com.android.protologtool.Constants.IS_LOG_TO_ANY_METHOD +import com.android.protolog.tool.Constants.IS_LOG_TO_ANY_METHOD +import com.android.server.protolog.common.LogDataType import com.github.javaparser.StaticJavaParser import com.github.javaparser.ast.CompilationUnit import com.github.javaparser.ast.NodeList import com.github.javaparser.ast.body.VariableDeclarator import com.github.javaparser.ast.expr.BooleanLiteralExpr import com.github.javaparser.ast.expr.CastExpr +import com.github.javaparser.ast.expr.Expression import com.github.javaparser.ast.expr.FieldAccessExpr import com.github.javaparser.ast.expr.IntegerLiteralExpr import com.github.javaparser.ast.expr.MethodCallExpr import com.github.javaparser.ast.expr.NameExpr import com.github.javaparser.ast.expr.NullLiteralExpr import com.github.javaparser.ast.expr.SimpleName +import com.github.javaparser.ast.expr.TypeExpr import com.github.javaparser.ast.expr.VariableDeclarationExpr import com.github.javaparser.ast.stmt.BlockStmt import com.github.javaparser.ast.stmt.ExpressionStmt import com.github.javaparser.ast.stmt.IfStmt import com.github.javaparser.ast.type.ArrayType +import com.github.javaparser.ast.type.ClassOrInterfaceType +import com.github.javaparser.ast.type.PrimitiveType +import com.github.javaparser.ast.type.Type import com.github.javaparser.printer.PrettyPrinter import com.github.javaparser.printer.PrettyPrinterConfiguration import com.github.javaparser.printer.lexicalpreservation.LexicalPreservingPrinter @@ -77,8 +83,8 @@ class SourceTransformer( // Insert message string hash as a second argument. // Out: ProtoLog.e(GROUP, 1234, null, arg) newCall.arguments.add(1, IntegerLiteralExpr(hash)) - val argTypes = CodeUtils.parseFormatString(messageString) - val typeMask = CodeUtils.logDataTypesToBitMask(argTypes) + val argTypes = LogDataType.parseFormatString(messageString) + val typeMask = LogDataType.logDataTypesToBitMask(argTypes) // Insert bitmap representing which Number parameters are to be considered as // floating point numbers. // Out: ProtoLog.e(GROUP, 1234, 0, null, arg) @@ -101,8 +107,8 @@ class SourceTransformer( // Out: long protoLogParam0 = arg argTypes.forEachIndexed { idx, type -> val varName = "protoLogParam$idx" - val declaration = VariableDeclarator(type.type, varName, - type.toType(newCall.arguments[idx + 4].clone())) + val declaration = VariableDeclarator(getASTTypeForDataType(type), varName, + getConversionForType(type)(newCall.arguments[idx + 4].clone())) blockStmt.addStatement(ExpressionStmt(VariableDeclarationExpr(declaration))) newCall.setArgument(idx + 4, NameExpr(SimpleName(varName))) } @@ -174,6 +180,34 @@ class SourceTransformer( inlinePrinter = PrettyPrinter(config) } + companion object { + private val stringType: ClassOrInterfaceType = + StaticJavaParser.parseClassOrInterfaceType("String") + + fun getASTTypeForDataType(type: Int): Type { + return when (type) { + LogDataType.STRING -> stringType.clone() + LogDataType.LONG -> PrimitiveType.longType() + LogDataType.DOUBLE -> PrimitiveType.doubleType() + LogDataType.BOOLEAN -> PrimitiveType.booleanType() + else -> { + // Should never happen. + throw RuntimeException("Invalid LogDataType") + } + } + } + + fun getConversionForType(type: Int): (Expression) -> Expression { + return when (type) { + LogDataType.STRING -> { expr -> + MethodCallExpr(TypeExpr(StaticJavaParser.parseClassOrInterfaceType("String")), + SimpleName("valueOf"), NodeList(expr)) + } + else -> { expr -> expr } + } + } + } + private val protoLogImplClassNode = StaticJavaParser.parseExpression<FieldAccessExpr>(protoLogImplClassName) private var processedCode: MutableList<String> = mutableListOf() diff --git a/tools/protologtool/src/com/android/protologtool/ViewerConfigBuilder.kt b/tools/protologtool/src/com/android/protolog/tool/ViewerConfigBuilder.kt index 8ce9a49c0302..a75b5c9bbe4b 100644 --- a/tools/protologtool/src/com/android/protologtool/ViewerConfigBuilder.kt +++ b/tools/protologtool/src/com/android/protolog/tool/ViewerConfigBuilder.kt @@ -14,11 +14,11 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool import com.android.json.stream.JsonWriter import com.github.javaparser.ast.CompilationUnit -import com.android.protologtool.Constants.VERSION +import com.android.protolog.tool.Constants.VERSION import com.github.javaparser.ast.expr.MethodCallExpr import java.io.StringWriter diff --git a/tools/protologtool/src/com/android/protologtool/ViewerConfigParser.kt b/tools/protologtool/src/com/android/protolog/tool/ViewerConfigParser.kt index 69cf92d4d228..7278db0094e6 100644 --- a/tools/protologtool/src/com/android/protologtool/ViewerConfigParser.kt +++ b/tools/protologtool/src/com/android/protolog/tool/ViewerConfigParser.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool import com.android.json.stream.JsonReader @@ -31,8 +31,7 @@ open class ViewerConfigParser { var level: String? = null var groupName: String? = null while (jsonReader.hasNext()) { - val key = jsonReader.nextName() - when (key) { + when (jsonReader.nextName()) { "message" -> message = jsonReader.nextString() "level" -> level = jsonReader.nextString() "group" -> groupName = jsonReader.nextString() @@ -52,8 +51,7 @@ open class ViewerConfigParser { jsonReader.beginObject() var tag: String? = null while (jsonReader.hasNext()) { - val key = jsonReader.nextName() - when (key) { + when (jsonReader.nextName()) { "tag" -> tag = jsonReader.nextString() else -> jsonReader.skipValue() } @@ -98,8 +96,7 @@ open class ViewerConfigParser { jsonReader.beginObject() while (jsonReader.hasNext()) { - val key = jsonReader.nextName() - when (key) { + when (jsonReader.nextName()) { "messages" -> messages = parseMessages(jsonReader) "groups" -> groups = parseGroups(jsonReader) "version" -> version = jsonReader.nextString() diff --git a/tools/protologtool/src/com/android/protologtool/exceptions.kt b/tools/protologtool/src/com/android/protolog/tool/exceptions.kt index 2199785a335b..0401d8f8baa0 100644 --- a/tools/protologtool/src/com/android/protologtool/exceptions.kt +++ b/tools/protologtool/src/com/android/protolog/tool/exceptions.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool import com.github.javaparser.ast.Node import java.lang.Exception @@ -27,17 +27,7 @@ class IllegalImportException(message: String) : Exception(message) class InvalidProtoLogCallException(message: String, node: Node) : RuntimeException("$message\nAt: $node") -class InvalidViewerConfigException : Exception { - constructor(message: String) : super(message) - - constructor(message: String, ex: Exception) : super(message, ex) -} - -class InvalidFormatStringException : Exception { - constructor(message: String) : super(message) - - constructor(message: String, ex: Exception) : super(message, ex) -} +class InvalidViewerConfigException(message: String) : Exception(message) class InvalidInputException(message: String) : Exception(message) diff --git a/tools/protologtool/tests/com/android/protologtool/CodeUtilsTest.kt b/tools/protologtool/tests/com/android/protolog/tool/CodeUtilsTest.kt index 82daa736e1bc..337ed995891c 100644 --- a/tools/protologtool/tests/com/android/protologtool/CodeUtilsTest.kt +++ b/tools/protologtool/tests/com/android/protolog/tool/CodeUtilsTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool import com.github.javaparser.StaticJavaParser import com.github.javaparser.ast.expr.BinaryExpr @@ -164,43 +164,4 @@ class CodeUtilsTest { val out = CodeUtils.concatMultilineString(code) assertEquals("testabc1234test", out) } - - @Test - fun parseFormatString() { - val str = "%b %d %o %x %f %e %g %s %%" - val out = CodeUtils.parseFormatString(str) - assertEquals(listOf( - CodeUtils.LogDataTypes.BOOLEAN, - CodeUtils.LogDataTypes.LONG, - CodeUtils.LogDataTypes.LONG, - CodeUtils.LogDataTypes.LONG, - CodeUtils.LogDataTypes.DOUBLE, - CodeUtils.LogDataTypes.DOUBLE, - CodeUtils.LogDataTypes.DOUBLE, - CodeUtils.LogDataTypes.STRING - ), out) - } - - @Test(expected = InvalidFormatStringException::class) - fun parseFormatString_invalid() { - val str = "%q" - CodeUtils.parseFormatString(str) - } - - @Test - fun logDataTypesToBitMask() { - val types = listOf(CodeUtils.LogDataTypes.STRING, CodeUtils.LogDataTypes.DOUBLE, - CodeUtils.LogDataTypes.LONG, CodeUtils.LogDataTypes.BOOLEAN) - val mask = CodeUtils.logDataTypesToBitMask(types) - assertEquals(0b11011000, mask) - } - - @Test(expected = InvalidFormatStringException::class) - fun logDataTypesToBitMask_toManyParams() { - val types = mutableListOf<CodeUtils.LogDataTypes>() - for (i in 0..16) { - types.add(CodeUtils.LogDataTypes.STRING) - } - CodeUtils.logDataTypesToBitMask(types) - } } diff --git a/tools/protologtool/tests/com/android/protologtool/CommandOptionsTest.kt b/tools/protologtool/tests/com/android/protolog/tool/CommandOptionsTest.kt index c1cd473574c2..615712e10bcf 100644 --- a/tools/protologtool/tests/com/android/protologtool/CommandOptionsTest.kt +++ b/tools/protologtool/tests/com/android/protolog/tool/CommandOptionsTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool import org.junit.Assert.assertEquals import org.junit.Test diff --git a/tools/protologtool/tests/com/android/protologtool/LogParserTest.kt b/tools/protologtool/tests/com/android/protolog/tool/LogParserTest.kt index 7106ea6fa168..04a3bfa499d8 100644 --- a/tools/protologtool/tests/com/android/protologtool/LogParserTest.kt +++ b/tools/protologtool/tests/com/android/protolog/tool/LogParserTest.kt @@ -14,11 +14,11 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool import com.android.json.stream.JsonReader -import com.android.server.wm.ProtoLogMessage -import com.android.server.wm.WindowManagerLogFileProto +import com.android.server.protolog.ProtoLogMessage +import com.android.server.protolog.ProtoLogFileProto import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -51,11 +51,11 @@ class LogParserTest { return "".byteInputStream() } - private fun buildProtoInput(logBuilder: WindowManagerLogFileProto.Builder): InputStream { + private fun buildProtoInput(logBuilder: ProtoLogFileProto.Builder): InputStream { logBuilder.setVersion(Constants.VERSION) logBuilder.magicNumber = - WindowManagerLogFileProto.MagicNumber.MAGIC_NUMBER_H.number.toLong() shl 32 or - WindowManagerLogFileProto.MagicNumber.MAGIC_NUMBER_L.number.toLong() + ProtoLogFileProto.MagicNumber.MAGIC_NUMBER_H.number.toLong() shl 32 or + ProtoLogFileProto.MagicNumber.MAGIC_NUMBER_L.number.toLong() return logBuilder.build().toByteArray().inputStream() } @@ -68,7 +68,7 @@ class LogParserTest { config[70933285] = ViewerConfigParser.ConfigEntry("Test completed successfully: %b", "ERROR", "WindowManager") - val logBuilder = WindowManagerLogFileProto.newBuilder() + val logBuilder = ProtoLogFileProto.newBuilder() val logMessageBuilder = ProtoLogMessage.newBuilder() logMessageBuilder .setMessageHash(70933285) @@ -87,7 +87,7 @@ class LogParserTest { config[123] = ViewerConfigParser.ConfigEntry("Test completed successfully: %b %d %% %o" + " %x %e %g %s %f", "ERROR", "WindowManager") - val logBuilder = WindowManagerLogFileProto.newBuilder() + val logBuilder = ProtoLogFileProto.newBuilder() val logMessageBuilder = ProtoLogMessage.newBuilder() logMessageBuilder .setMessageHash(123) @@ -110,7 +110,7 @@ class LogParserTest { config[123] = ViewerConfigParser.ConfigEntry("Test completed successfully: %b %d %% %o", "ERROR", "WindowManager") - val logBuilder = WindowManagerLogFileProto.newBuilder() + val logBuilder = ProtoLogFileProto.newBuilder() val logMessageBuilder = ProtoLogMessage.newBuilder() logMessageBuilder .setMessageHash(123) @@ -132,7 +132,7 @@ class LogParserTest { config[123] = ViewerConfigParser.ConfigEntry("Test completed successfully: %b %d %% %o" + " %x %e %g %s %f", "ERROR", "WindowManager") - val logBuilder = WindowManagerLogFileProto.newBuilder() + val logBuilder = ProtoLogFileProto.newBuilder() val logMessageBuilder = ProtoLogMessage.newBuilder() logMessageBuilder .setMessageHash(123) @@ -149,7 +149,7 @@ class LogParserTest { @Test(expected = InvalidInputException::class) fun parse_invalidMagicNumber() { - val logBuilder = WindowManagerLogFileProto.newBuilder() + val logBuilder = ProtoLogFileProto.newBuilder() logBuilder.setVersion(Constants.VERSION) logBuilder.magicNumber = 0 val stream = logBuilder.build().toByteArray().inputStream() @@ -159,11 +159,11 @@ class LogParserTest { @Test(expected = InvalidInputException::class) fun parse_invalidVersion() { - val logBuilder = WindowManagerLogFileProto.newBuilder() + val logBuilder = ProtoLogFileProto.newBuilder() logBuilder.setVersion("invalid") logBuilder.magicNumber = - WindowManagerLogFileProto.MagicNumber.MAGIC_NUMBER_H.number.toLong() shl 32 or - WindowManagerLogFileProto.MagicNumber.MAGIC_NUMBER_L.number.toLong() + ProtoLogFileProto.MagicNumber.MAGIC_NUMBER_H.number.toLong() shl 32 or + ProtoLogFileProto.MagicNumber.MAGIC_NUMBER_L.number.toLong() val stream = logBuilder.build().toByteArray().inputStream() parser.parse(stream, getConfigDummyStream(), printStream) @@ -171,7 +171,7 @@ class LogParserTest { @Test fun parse_noConfig() { - val logBuilder = WindowManagerLogFileProto.newBuilder() + val logBuilder = ProtoLogFileProto.newBuilder() val logMessageBuilder = ProtoLogMessage.newBuilder() logMessageBuilder .setMessageHash(70933285) diff --git a/tools/protologtool/tests/com/android/protologtool/ProtoLogCallProcessorTest.kt b/tools/protologtool/tests/com/android/protolog/tool/ProtoLogCallProcessorTest.kt index dcb1f7fe3366..d20ce7ec4dcb 100644 --- a/tools/protologtool/tests/com/android/protologtool/ProtoLogCallProcessorTest.kt +++ b/tools/protologtool/tests/com/android/protolog/tool/ProtoLogCallProcessorTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool import com.github.javaparser.StaticJavaParser import com.github.javaparser.ast.expr.MethodCallExpr diff --git a/tools/protologtool/tests/com/android/protologtool/SourceTransformerTest.kt b/tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt index 2cd85627b94b..d6e4a36dc3da 100644 --- a/tools/protologtool/tests/com/android/protologtool/SourceTransformerTest.kt +++ b/tools/protologtool/tests/com/android/protolog/tool/SourceTransformerTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool import com.github.javaparser.StaticJavaParser import com.github.javaparser.ast.CompilationUnit diff --git a/tools/protologtool/tests/com/android/protologtool/ViewerConfigBuilderTest.kt b/tools/protologtool/tests/com/android/protolog/tool/ViewerConfigBuilderTest.kt index 53d2e8b0f4fa..f435d4065256 100644 --- a/tools/protologtool/tests/com/android/protologtool/ViewerConfigBuilderTest.kt +++ b/tools/protologtool/tests/com/android/protolog/tool/ViewerConfigBuilderTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool import com.android.json.stream.JsonReader import com.github.javaparser.ast.CompilationUnit diff --git a/tools/protologtool/tests/com/android/protologtool/ViewerConfigParserTest.kt b/tools/protologtool/tests/com/android/protolog/tool/ViewerConfigParserTest.kt index c0cea733eadd..dc3ef7c57b35 100644 --- a/tools/protologtool/tests/com/android/protologtool/ViewerConfigParserTest.kt +++ b/tools/protologtool/tests/com/android/protolog/tool/ViewerConfigParserTest.kt @@ -14,12 +14,12 @@ * limitations under the License. */ -package com.android.protologtool +package com.android.protolog.tool import com.android.json.stream.JsonReader +import org.junit.Assert.assertEquals import org.junit.Test import java.io.StringReader -import org.junit.Assert.assertEquals class ViewerConfigParserTest { private val parser = ViewerConfigParser() @@ -322,6 +322,6 @@ class ViewerConfigParserTest { } } """ - val config = parser.parseConfig(getJSONReader(json)) + parser.parseConfig(getJSONReader(json)) } } |