1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.protolog.tool
18 
19 import com.android.json.stream.JsonReader
20 import com.android.protolog.tool.ViewerConfigBuilder.LogCall
21 import org.junit.Assert.assertEquals
22 import org.junit.Test
23 import org.mockito.Mockito
24 import java.io.StringReader
25 
26 class ViewerConfigBuilderTest {
27     companion object {
28         private val TAG1 = "WM_TEST"
29         private val TAG2 = "WM_DEBUG"
30         private val TEST1 = ViewerConfigParser.ConfigEntry("test1", LogLevel.INFO.name, TAG1)
31         private val TEST2 = ViewerConfigParser.ConfigEntry("test2", LogLevel.DEBUG.name, TAG2)
32         private val TEST3 = ViewerConfigParser.ConfigEntry("test3", LogLevel.ERROR.name, TAG2)
33         private val GROUP1 = LogGroup("TEST_GROUP", true, true, TAG1)
34         private val GROUP2 = LogGroup("DEBUG_GROUP", true, true, TAG2)
35         private val GROUP3 = LogGroup("DEBUG_GROUP", true, true, TAG2)
36         private val GROUP_DISABLED = LogGroup("DEBUG_GROUP", false, true, TAG2)
37         private val GROUP_TEXT_DISABLED = LogGroup("DEBUG_GROUP", true, false, TAG2)
38         private const val PATH = "/tmp/test.java"
39     }
40 
41     private val configBuilder = ViewerConfigBuilder(Mockito.mock(ProtoLogCallProcessor::class.java))
42 
43     private fun parseConfig(json: String): Map<Int, ViewerConfigParser.ConfigEntry> {
44         return ViewerConfigParser().parseConfig(JsonReader(StringReader(json)))
45     }
46 
47     @Test
48     fun processClass() {
49         configBuilder.addLogCalls(listOf(
50                 LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH),
51                 LogCall(TEST2.messageString, LogLevel.DEBUG, GROUP2, PATH),
52                 LogCall(TEST3.messageString, LogLevel.ERROR, GROUP3, PATH)).withContext())
53 
54         val parsedConfig = parseConfig(configBuilder.build())
55         assertEquals(3, parsedConfig.size)
56         assertEquals(TEST1, parsedConfig[CodeUtils.hash(PATH,
57 	           TEST1.messageString, LogLevel.INFO, GROUP1)])
58         assertEquals(TEST2, parsedConfig[CodeUtils.hash(PATH, TEST2.messageString,
59 	           LogLevel.DEBUG, GROUP2)])
60         assertEquals(TEST3, parsedConfig[CodeUtils.hash(PATH, TEST3.messageString,
61 	           LogLevel.ERROR, GROUP3)])
62     }
63 
64     @Test
65     fun processClass_nonUnique() {
66         configBuilder.addLogCalls(listOf(
67                 LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH),
68                 LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH),
69                 LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH)).withContext())
70 
71         val parsedConfig = parseConfig(configBuilder.build())
72         assertEquals(1, parsedConfig.size)
73         assertEquals(TEST1, parsedConfig[CodeUtils.hash(PATH, TEST1.messageString,
74             	   LogLevel.INFO, GROUP1)])
75     }
76 
77     @Test
78     fun processClass_disabled() {
79         configBuilder.addLogCalls(listOf(
80                 LogCall(TEST1.messageString, LogLevel.INFO, GROUP1, PATH),
81                 LogCall(TEST2.messageString, LogLevel.DEBUG, GROUP_DISABLED, PATH),
82                 LogCall(TEST3.messageString, LogLevel.ERROR, GROUP_TEXT_DISABLED, PATH))
83                 .withContext())
84 
85         val parsedConfig = parseConfig(configBuilder.build())
86         assertEquals(2, parsedConfig.size)
87         assertEquals(TEST1, parsedConfig[CodeUtils.hash(
88                 PATH, TEST1.messageString, LogLevel.INFO, GROUP1)])
89         assertEquals(TEST3, parsedConfig[CodeUtils.hash(
90                 PATH, TEST3.messageString, LogLevel.ERROR, GROUP_TEXT_DISABLED)])
91     }
92 
93     private fun List<LogCall>.withContext() = map { it to ParsingContext() }
94 }
95