ProtoLog: Cache the result of ProtoLogImpl.isEnabled(ProtoLogGroup)

We introduce a generated class ProtoLog$Cache, which contains a field
for each ProtoLogGroup to cache whether it is enabled or not.

This both makes lookup faster, and reduces code size.

Test: make droid
Change-Id: I581c87849c875918b182eff85996b6d19a6755ec
This commit is contained in:
Adrian Roos
2019-10-03 17:30:14 +02:00
parent cd45b2ab20
commit 2ca5d8601c
8 changed files with 181 additions and 32 deletions

View File

@@ -21,6 +21,7 @@ genrule {
cmd: "$(location protologtool) transform-protolog-calls " +
"--protolog-class com.android.server.protolog.common.ProtoLog " +
"--protolog-impl-class com.android.server.protolog.ProtoLogImpl " +
"--protolog-cache-class 'com.android.server.protolog.ProtoLog$$Cache' " +
"--loggroups-class com.android.server.wm.ProtoLogGroup " +
"--loggroups-jar $(location :services.core.wm.protologgroups) " +
"--output-srcjar $(out) " +

View File

@@ -45,7 +45,6 @@ import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.IllegalFormatConversionException;
import java.util.TreeMap;
import java.util.stream.Collectors;
@@ -57,8 +56,18 @@ import java.util.stream.Collectors;
public class ProtoLogImpl {
private static final TreeMap<String, IProtoLogGroup> LOG_GROUPS = new TreeMap<>();
/**
* A runnable to update the cached output of {@link #isEnabled}.
*
* Must be invoked after every action that could change the result of {@link #isEnabled}, eg.
* starting / stopping proto log, or enabling / disabling log groups.
*/
static Runnable sCacheUpdater = () -> { };
private static void addLogGroupEnum(IProtoLogGroup[] config) {
Arrays.stream(config).forEach(group -> LOG_GROUPS.put(group.name(), group));
for (IProtoLogGroup group : config) {
LOG_GROUPS.put(group.name(), group);
}
}
static {
@@ -303,6 +312,7 @@ public class ProtoLogImpl {
mProtoLogEnabled = true;
mProtoLogEnabledLockFree = true;
}
sCacheUpdater.run();
}
/**
@@ -327,6 +337,7 @@ public class ProtoLogImpl {
throw new IllegalStateException("logging enabled while waiting for flush.");
}
}
sCacheUpdater.run();
}
/**
@@ -351,6 +362,7 @@ public class ProtoLogImpl {
return -1;
}
}
sCacheUpdater.run();
return 0;
}

View File

@@ -27,19 +27,21 @@ class CommandOptions(args: Array<String>) {
private const val PROTOLOG_CLASS_PARAM = "--protolog-class"
private const val PROTOLOGIMPL_CLASS_PARAM = "--protolog-impl-class"
private const val PROTOLOGCACHE_CLASS_PARAM = "--protolog-cache-class"
private const val PROTOLOGGROUP_CLASS_PARAM = "--loggroups-class"
private const val PROTOLOGGROUP_JAR_PARAM = "--loggroups-jar"
private const val VIEWER_CONFIG_JSON_PARAM = "--viewer-conf"
private const val OUTPUT_SOURCE_JAR_PARAM = "--output-srcjar"
private val parameters = setOf(PROTOLOG_CLASS_PARAM, PROTOLOGIMPL_CLASS_PARAM,
PROTOLOGGROUP_CLASS_PARAM, PROTOLOGGROUP_JAR_PARAM, VIEWER_CONFIG_JSON_PARAM,
OUTPUT_SOURCE_JAR_PARAM)
PROTOLOGCACHE_CLASS_PARAM, PROTOLOGGROUP_CLASS_PARAM, PROTOLOGGROUP_JAR_PARAM,
VIEWER_CONFIG_JSON_PARAM, OUTPUT_SOURCE_JAR_PARAM)
val USAGE = """
Usage: ${Constants.NAME} <command> [<args>]
Available commands:
$TRANSFORM_CALLS_CMD $PROTOLOG_CLASS_PARAM <class name> $PROTOLOGIMPL_CLASS_PARAM
<class name> $PROTOLOGCACHE_CLASS_PARAM
<class name> $PROTOLOGGROUP_CLASS_PARAM <class name> $PROTOLOGGROUP_JAR_PARAM
<config.jar> $OUTPUT_SOURCE_JAR_PARAM <output.srcjar> [<input.java>]
- processes java files replacing stub calls with logging code.
@@ -54,7 +56,7 @@ class CommandOptions(args: Array<String>) {
""".trimIndent()
private fun validateClassName(name: String): String {
if (!Pattern.matches("^([a-z]+[A-Za-z0-9]*\\.)+([A-Za-z0-9]+)$", name)) {
if (!Pattern.matches("^([a-z]+[A-Za-z0-9]*\\.)+([A-Za-z0-9$]+)$", name)) {
throw InvalidCommandException("Invalid class name $name")
}
return name
@@ -121,6 +123,7 @@ class CommandOptions(args: Array<String>) {
val protoLogClassNameArg: String
val protoLogGroupsClassNameArg: String
val protoLogImplClassNameArg: String
val protoLogCacheClassNameArg: String
val protoLogGroupsJarArg: String
val viewerConfigJsonArg: String
val outputSourceJarArg: String
@@ -170,6 +173,8 @@ class CommandOptions(args: Array<String>) {
params))
protoLogImplClassNameArg = validateClassName(getParam(PROTOLOGIMPL_CLASS_PARAM,
params))
protoLogCacheClassNameArg = validateClassName(getParam(PROTOLOGCACHE_CLASS_PARAM,
params))
protoLogGroupsJarArg = validateJarName(getParam(PROTOLOGGROUP_JAR_PARAM, params))
viewerConfigJsonArg = validateNotSpecified(VIEWER_CONFIG_JSON_PARAM, params)
outputSourceJarArg = validateSrcJarName(getParam(OUTPUT_SOURCE_JAR_PARAM, params))
@@ -181,6 +186,7 @@ class CommandOptions(args: Array<String>) {
protoLogGroupsClassNameArg = validateClassName(getParam(PROTOLOGGROUP_CLASS_PARAM,
params))
protoLogImplClassNameArg = validateNotSpecified(PROTOLOGIMPL_CLASS_PARAM, params)
protoLogCacheClassNameArg = validateNotSpecified(PROTOLOGCACHE_CLASS_PARAM, params)
protoLogGroupsJarArg = validateJarName(getParam(PROTOLOGGROUP_JAR_PARAM, params))
viewerConfigJsonArg = validateJSONName(getParam(VIEWER_CONFIG_JSON_PARAM, params))
outputSourceJarArg = validateNotSpecified(OUTPUT_SOURCE_JAR_PARAM, params)
@@ -191,6 +197,7 @@ class CommandOptions(args: Array<String>) {
protoLogClassNameArg = validateNotSpecified(PROTOLOG_CLASS_PARAM, params)
protoLogGroupsClassNameArg = validateNotSpecified(PROTOLOGGROUP_CLASS_PARAM, params)
protoLogImplClassNameArg = validateNotSpecified(PROTOLOGIMPL_CLASS_PARAM, params)
protoLogCacheClassNameArg = validateNotSpecified(PROTOLOGCACHE_CLASS_PARAM, params)
protoLogGroupsJarArg = validateNotSpecified(PROTOLOGGROUP_JAR_PARAM, params)
viewerConfigJsonArg = validateJSONName(getParam(VIEWER_CONFIG_JSON_PARAM, params))
outputSourceJarArg = validateNotSpecified(OUTPUT_SOURCE_JAR_PARAM, params)

View File

@@ -53,7 +53,8 @@ object ProtoLogTool {
command.javaSourceArgs.map { path ->
executor.submitCallable {
val transformer = SourceTransformer(command.protoLogImplClassNameArg, processor)
val transformer = SourceTransformer(command.protoLogImplClassNameArg,
command.protoLogCacheClassNameArg, processor)
val file = File(path)
val text = file.readText()
val outSrc = try {
@@ -80,10 +81,53 @@ object ProtoLogTool {
executor.shutdown()
val cacheSplit = command.protoLogCacheClassNameArg.split(".")
val cacheName = cacheSplit.last()
val cachePackage = cacheSplit.dropLast(1).joinToString(".")
val cachePath = "gen/${cacheSplit.joinToString("/")}.java"
outJar.putNextEntry(ZipEntry(cachePath))
outJar.write(generateLogGroupCache(cachePackage, cacheName, groups,
command.protoLogImplClassNameArg, command.protoLogGroupsClassNameArg).toByteArray())
outJar.close()
out.close()
}
fun generateLogGroupCache(
cachePackage: String,
cacheName: String,
groups: Map<String, LogGroup>,
protoLogImplClassName: String,
protoLogGroupsClassName: String
): String {
val fields = groups.values.map {
"public static boolean ${it.name}_enabled = false;"
}.joinToString("\n")
val updates = groups.values.map {
"${it.name}_enabled = " +
"$protoLogImplClassName.isEnabled($protoLogGroupsClassName.${it.name});"
}.joinToString("\n")
return """
package $cachePackage;
public class $cacheName {
${fields.replaceIndent(" ")}
static {
$protoLogImplClassName.sCacheUpdater = $cacheName::update;
update();
}
static void update() {
${updates.replaceIndent(" ")}
}
}
""".trimIndent()
}
private fun tryParse(code: String, fileName: String): CompilationUnit {
try {
return StaticJavaParser.parse(code)

View File

@@ -16,7 +16,6 @@
package com.android.protolog.tool
import com.android.protolog.tool.Constants.IS_ENABLED_METHOD
import com.android.server.protolog.common.LogDataType
import com.github.javaparser.StaticJavaParser
import com.github.javaparser.ast.CompilationUnit
@@ -45,6 +44,7 @@ import com.github.javaparser.printer.PrettyPrinterConfiguration
class SourceTransformer(
protoLogImplClassName: String,
protoLogCacheClassName: String,
private val protoLogCallProcessor: ProtoLogCallProcessor
) : ProtoLogCallVisitor {
override fun processCall(
@@ -91,10 +91,9 @@ class SourceTransformer(
// Replace call to a stub method with an actual implementation.
// Out: com.android.server.protolog.ProtoLogImpl.e(GROUP, 1234, null, arg)
newCall.setScope(protoLogImplClassNode)
// Create a call to ProtoLogImpl.isEnabled(GROUP)
// Out: com.android.server.protolog.ProtoLogImpl.isEnabled(GROUP)
val isLogEnabled = MethodCallExpr(protoLogImplClassNode, IS_ENABLED_METHOD,
NodeList<Expression>(newCall.arguments[0].clone()))
// Create a call to ProtoLog$Cache.GROUP_enabled
// Out: com.android.server.protolog.ProtoLog$Cache.GROUP_enabled
val isLogEnabled = FieldAccessExpr(protoLogCacheClassNode, "${group.name}_enabled")
if (argTypes.size != call.arguments.size - 2) {
throw InvalidProtoLogCallException(
"Number of arguments (${argTypes.size} does not mach format" +
@@ -211,6 +210,8 @@ class SourceTransformer(
private val protoLogImplClassNode =
StaticJavaParser.parseExpression<FieldAccessExpr>(protoLogImplClassName)
private val protoLogCacheClassNode =
StaticJavaParser.parseExpression<FieldAccessExpr>(protoLogCacheClassName)
private var processedCode: MutableList<String> = mutableListOf()
private var offsets: IntArray = IntArray(0)
private var fileName: String = ""

View File

@@ -30,6 +30,7 @@ class CommandOptionsTest {
)
private const val TEST_PROTOLOG_CLASS = "com.android.server.wm.ProtoLog"
private const val TEST_PROTOLOGIMPL_CLASS = "com.android.server.wm.ProtoLogImpl"
private const val TEST_PROTOLOGCACHE_CLASS = "com.android.server.wm.ProtoLog\$Cache"
private const val TEST_PROTOLOGGROUP_CLASS = "com.android.server.wm.ProtoLogGroup"
private const val TEST_PROTOLOGGROUP_JAR = "out/soong/.intermediates/frameworks/base/" +
"services/core/services.core.wm.protologgroups/android_common/javac/" +
@@ -56,6 +57,7 @@ class CommandOptionsTest {
fun transformClasses() {
val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
"--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
"--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
"--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
"--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
"--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
@@ -73,6 +75,7 @@ class CommandOptionsTest {
fun transformClasses_noProtoLogClass() {
val testLine = "transform-protolog-calls " +
"--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
"--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
"--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
"--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
"--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
@@ -82,6 +85,17 @@ class CommandOptionsTest {
@Test(expected = InvalidCommandException::class)
fun transformClasses_noProtoLogImplClass() {
val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
"--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
"--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
"--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
"--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
CommandOptions(testLine.split(' ').toTypedArray())
}
@Test(expected = InvalidCommandException::class)
fun transformClasses_noProtoLogCacheClass() {
val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
"--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
"--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
"--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
"--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
@@ -92,6 +106,7 @@ class CommandOptionsTest {
fun transformClasses_noProtoLogGroupClass() {
val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
"--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
"--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
"--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
"--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
CommandOptions(testLine.split(' ').toTypedArray())
@@ -101,6 +116,7 @@ class CommandOptionsTest {
fun transformClasses_noProtoLogGroupJar() {
val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
"--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
"--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
"--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
"--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
CommandOptions(testLine.split(' ').toTypedArray())
@@ -110,6 +126,7 @@ class CommandOptionsTest {
fun transformClasses_noOutJar() {
val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
"--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
"--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
"--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
"--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
TEST_JAVA_SRC.joinToString(" ")
@@ -120,6 +137,7 @@ class CommandOptionsTest {
fun transformClasses_noJavaInput() {
val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
"--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
"--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
"--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
"--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
"--output-srcjar $TEST_SRC_JAR"
@@ -130,6 +148,7 @@ class CommandOptionsTest {
fun transformClasses_invalidProtoLogClass() {
val testLine = "transform-protolog-calls --protolog-class invalid " +
"--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
"--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
"--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
"--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
"--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
@@ -140,6 +159,18 @@ class CommandOptionsTest {
fun transformClasses_invalidProtoLogImplClass() {
val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
"--protolog-impl-class invalid " +
"--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
"--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
"--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
"--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
CommandOptions(testLine.split(' ').toTypedArray())
}
@Test(expected = InvalidCommandException::class)
fun transformClasses_invalidProtoLogCacheClass() {
val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
"--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
"--protolog-cache-class invalid " +
"--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
"--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
"--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
@@ -150,6 +181,7 @@ class CommandOptionsTest {
fun transformClasses_invalidProtoLogGroupClass() {
val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
"--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
"--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
"--loggroups-class invalid " +
"--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
"--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
@@ -160,6 +192,7 @@ class CommandOptionsTest {
fun transformClasses_invalidProtoLogGroupJar() {
val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
"--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
"--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
"--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
"--loggroups-jar invalid.txt " +
"--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
@@ -170,6 +203,7 @@ class CommandOptionsTest {
fun transformClasses_invalidOutJar() {
val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
"--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
"--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
"--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
"--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
"--output-srcjar invalid.db ${TEST_JAVA_SRC.joinToString(" ")}"
@@ -180,6 +214,7 @@ class CommandOptionsTest {
fun transformClasses_invalidJavaInput() {
val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
"--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
"--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
"--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
"--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
"--output-srcjar $TEST_SRC_JAR invalid.py"
@@ -190,6 +225,7 @@ class CommandOptionsTest {
fun transformClasses_unknownParam() {
val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
"--unknown test --protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
"--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
"--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
"--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
"--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
@@ -200,6 +236,7 @@ class CommandOptionsTest {
fun transformClasses_noValue() {
val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
"--protolog-impl-class " +
"--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
"--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
"--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
"--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"

View File

@@ -0,0 +1,52 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.protolog.tool
import org.junit.Assert.assertEquals
import org.junit.Test
class ProtoLogToolTest {
@Test
fun generateLogGroupCache() {
val groups = mapOf(
"GROUP1" to LogGroup("GROUP1", true, true, "TAG1"),
"GROUP2" to LogGroup("GROUP2", true, true, "TAG2")
)
val code = ProtoLogTool.generateLogGroupCache("org.example", "ProtoLog\$Cache",
groups, "org.example.ProtoLogImpl", "org.example.ProtoLogGroups")
assertEquals("""
package org.example;
public class ProtoLog${'$'}Cache {
public static boolean GROUP1_enabled = false;
public static boolean GROUP2_enabled = false;
static {
org.example.ProtoLogImpl.sCacheUpdater = ProtoLog${'$'}Cache::update;
update();
}
static void update() {
GROUP1_enabled = org.example.ProtoLogImpl.isEnabled(org.example.ProtoLogGroups.GROUP1);
GROUP2_enabled = org.example.ProtoLogImpl.isEnabled(org.example.ProtoLogGroups.GROUP2);
}
}
""".trimIndent(), code)
}
}

View File

@@ -78,7 +78,7 @@ class SourceTransformerTest {
class Test {
void test() {
if (org.example.ProtoLogImpl.isEnabled(TEST_GROUP)) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, 1698911065, 9, "test %d %f", protoLogParam0, protoLogParam1); }
if (org.example.ProtoLogCache.TEST_GROUP_enabled) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, 1698911065, 9, "test %d %f", protoLogParam0, protoLogParam1); }
}
}
""".trimIndent()
@@ -88,7 +88,7 @@ class SourceTransformerTest {
class Test {
void test() {
if (org.example.ProtoLogImpl.isEnabled(TEST_GROUP)) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; String protoLogParam2 = String.valueOf("test"); org.example.ProtoLogImpl.w(TEST_GROUP, 1780316587, 9, "test %d %f " + "abc %s\n test", protoLogParam0, protoLogParam1, protoLogParam2);
if (org.example.ProtoLogCache.TEST_GROUP_enabled) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; String protoLogParam2 = String.valueOf("test"); org.example.ProtoLogImpl.w(TEST_GROUP, 1780316587, 9, "test %d %f " + "abc %s\n test", protoLogParam0, protoLogParam1, protoLogParam2);
}
}
@@ -100,8 +100,8 @@ class SourceTransformerTest {
class Test {
void test() {
if (org.example.ProtoLogImpl.isEnabled(TEST_GROUP)) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, 1698911065, 9, "test %d %f", protoLogParam0, protoLogParam1); } /* ProtoLog.w(TEST_GROUP, "test %d %f", 100, 0.1); */ if (org.example.ProtoLogImpl.isEnabled(TEST_GROUP)) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, 1698911065, 9, "test %d %f", protoLogParam0, protoLogParam1); }
if (org.example.ProtoLogImpl.isEnabled(TEST_GROUP)) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, 1698911065, 9, "test %d %f", protoLogParam0, protoLogParam1); }
if (org.example.ProtoLogCache.TEST_GROUP_enabled) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, 1698911065, 9, "test %d %f", protoLogParam0, protoLogParam1); } /* ProtoLog.w(TEST_GROUP, "test %d %f", 100, 0.1); */ if (org.example.ProtoLogCache.TEST_GROUP_enabled) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, 1698911065, 9, "test %d %f", protoLogParam0, protoLogParam1); }
if (org.example.ProtoLogCache.TEST_GROUP_enabled) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, 1698911065, 9, "test %d %f", protoLogParam0, protoLogParam1); }
}
}
""".trimIndent()
@@ -111,7 +111,7 @@ class SourceTransformerTest {
class Test {
void test() {
if (org.example.ProtoLogImpl.isEnabled(TEST_GROUP)) { org.example.ProtoLogImpl.w(TEST_GROUP, -1741986185, 0, "test", (Object[]) null); }
if (org.example.ProtoLogCache.TEST_GROUP_enabled) { org.example.ProtoLogImpl.w(TEST_GROUP, -1741986185, 0, "test", (Object[]) null); }
}
}
""".trimIndent()
@@ -121,7 +121,7 @@ class SourceTransformerTest {
class Test {
void test() {
if (org.example.ProtoLogImpl.isEnabled(TEST_GROUP)) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, 1698911065, 9, null, protoLogParam0, protoLogParam1); }
if (org.example.ProtoLogCache.TEST_GROUP_enabled) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; org.example.ProtoLogImpl.w(TEST_GROUP, 1698911065, 9, null, protoLogParam0, protoLogParam1); }
}
}
""".trimIndent()
@@ -131,7 +131,7 @@ class SourceTransformerTest {
class Test {
void test() {
if (org.example.ProtoLogImpl.isEnabled(TEST_GROUP)) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; String protoLogParam2 = String.valueOf("test"); org.example.ProtoLogImpl.w(TEST_GROUP, 1780316587, 9, null, protoLogParam0, protoLogParam1, protoLogParam2);
if (org.example.ProtoLogCache.TEST_GROUP_enabled) { long protoLogParam0 = 100; double protoLogParam1 = 0.1; String protoLogParam2 = String.valueOf("test"); org.example.ProtoLogImpl.w(TEST_GROUP, 1780316587, 9, null, protoLogParam0, protoLogParam1, protoLogParam2);
}
}
@@ -165,8 +165,9 @@ class SourceTransformerTest {
}
private val processor: ProtoLogCallProcessor = Mockito.mock(ProtoLogCallProcessor::class.java)
private val implPath = "org.example.ProtoLogImpl"
private val sourceJarWriter = SourceTransformer(implPath, processor)
private val implName = "org.example.ProtoLogImpl"
private val cacheName = "org.example.ProtoLogCache"
private val sourceJarWriter = SourceTransformer(implName, cacheName, processor)
private fun <T> any(type: Class<T>): T = Mockito.any<T>(type)
@@ -191,8 +192,7 @@ class SourceTransformerTest {
val ifStmts = code.findAll(IfStmt::class.java)
assertEquals(1, ifStmts.size)
val ifStmt = ifStmts[0]
assertEquals("$implPath.${Constants.IS_ENABLED_METHOD}(TEST_GROUP)",
ifStmt.condition.toString())
assertEquals("$cacheName.TEST_GROUP_enabled", ifStmt.condition.toString())
assertFalse(ifStmt.elseStmt.isPresent)
assertEquals(3, ifStmt.thenStmt.childNodes.size)
val methodCall = ifStmt.thenStmt.findAll(MethodCallExpr::class.java)[0] as MethodCallExpr
@@ -234,8 +234,7 @@ class SourceTransformerTest {
val ifStmts = code.findAll(IfStmt::class.java)
assertEquals(3, ifStmts.size)
val ifStmt = ifStmts[1]
assertEquals("$implPath.${Constants.IS_ENABLED_METHOD}(TEST_GROUP)",
ifStmt.condition.toString())
assertEquals("$cacheName.TEST_GROUP_enabled", ifStmt.condition.toString())
assertFalse(ifStmt.elseStmt.isPresent)
assertEquals(3, ifStmt.thenStmt.childNodes.size)
val methodCall = ifStmt.thenStmt.findAll(MethodCallExpr::class.java)[0] as MethodCallExpr
@@ -273,8 +272,7 @@ class SourceTransformerTest {
val ifStmts = code.findAll(IfStmt::class.java)
assertEquals(1, ifStmts.size)
val ifStmt = ifStmts[0]
assertEquals("$implPath.${Constants.IS_ENABLED_METHOD}(TEST_GROUP)",
ifStmt.condition.toString())
assertEquals("$cacheName.TEST_GROUP_enabled", ifStmt.condition.toString())
assertFalse(ifStmt.elseStmt.isPresent)
assertEquals(4, ifStmt.thenStmt.childNodes.size)
val methodCall = ifStmt.thenStmt.findAll(MethodCallExpr::class.java)[1] as MethodCallExpr
@@ -311,8 +309,7 @@ class SourceTransformerTest {
val ifStmts = code.findAll(IfStmt::class.java)
assertEquals(1, ifStmts.size)
val ifStmt = ifStmts[0]
assertEquals("$implPath.${Constants.IS_ENABLED_METHOD}(TEST_GROUP)",
ifStmt.condition.toString())
assertEquals("$cacheName.TEST_GROUP_enabled", ifStmt.condition.toString())
assertFalse(ifStmt.elseStmt.isPresent)
assertEquals(1, ifStmt.thenStmt.childNodes.size)
val methodCall = ifStmt.thenStmt.findAll(MethodCallExpr::class.java)[0] as MethodCallExpr
@@ -346,8 +343,7 @@ class SourceTransformerTest {
val ifStmts = code.findAll(IfStmt::class.java)
assertEquals(1, ifStmts.size)
val ifStmt = ifStmts[0]
assertEquals("$implPath.${Constants.IS_ENABLED_METHOD}(TEST_GROUP)",
ifStmt.condition.toString())
assertEquals("$cacheName.TEST_GROUP_enabled", ifStmt.condition.toString())
assertFalse(ifStmt.elseStmt.isPresent)
assertEquals(3, ifStmt.thenStmt.childNodes.size)
val methodCall = ifStmt.thenStmt.findAll(MethodCallExpr::class.java)[0] as MethodCallExpr
@@ -385,8 +381,7 @@ class SourceTransformerTest {
val ifStmts = code.findAll(IfStmt::class.java)
assertEquals(1, ifStmts.size)
val ifStmt = ifStmts[0]
assertEquals("$implPath.${Constants.IS_ENABLED_METHOD}(TEST_GROUP)",
ifStmt.condition.toString())
assertEquals("$cacheName.TEST_GROUP_enabled", ifStmt.condition.toString())
assertFalse(ifStmt.elseStmt.isPresent)
assertEquals(4, ifStmt.thenStmt.childNodes.size)
val methodCall = ifStmt.thenStmt.findAll(MethodCallExpr::class.java)[1] as MethodCallExpr