summaryrefslogtreecommitdiff
path: root/tools/protologtool
diff options
context:
space:
mode:
authorAdam Pardyl <apardyl@google.com>2019-08-19 15:24:11 +0200
committerAdam Pardyl <apardyl@google.com>2019-09-23 15:47:29 +0000
commit0f1b3d460259e0b739c363c1158f774315e45e87 (patch)
tree978f3c6f2d166cbc6a5dda46f6dde24b8fc04794 /tools/protologtool
parenteba21f1d7a8bc93826487f4674aafe9033318b6d (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.bp23
-rw-r--r--tools/protologtool/manifest.txt2
-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))
}
}