• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 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.internal.protolog;
18 
19 import static org.junit.Assert.assertThrows;
20 import static org.junit.Assume.assumeTrue;
21 
22 import android.tracing.perfetto.CreateTlsStateArgs;
23 import android.util.proto.ProtoInputStream;
24 
25 import com.android.internal.protolog.common.LogLevel;
26 
27 import com.google.common.truth.Truth;
28 
29 import org.junit.Before;
30 import org.junit.Test;
31 import org.mockito.Mockito;
32 
33 import perfetto.protos.DataSourceConfigOuterClass;
34 import perfetto.protos.ProtologCommon;
35 import perfetto.protos.ProtologConfig;
36 
37 public class ProtologDataSourceTest {
38     @Before
before()39     public void before() {
40         assumeTrue(android.tracing.Flags.perfettoProtologTracing());
41     }
42 
43     @Test
noConfig()44     public void noConfig() {
45         final ProtoLogDataSource.TlsState tlsState = createTlsState(
46                 DataSourceConfigOuterClass.DataSourceConfig.newBuilder().build());
47 
48         Truth.assertThat(tlsState.getLogFromLevel("SOME_TAG")).isEqualTo(LogLevel.WTF);
49         Truth.assertThat(tlsState.getShouldCollectStacktrace("SOME_TAG")).isFalse();
50     }
51 
52     @Test
defaultTraceMode()53     public void defaultTraceMode() {
54         final ProtoLogDataSource.TlsState tlsState = createTlsState(
55                 DataSourceConfigOuterClass.DataSourceConfig.newBuilder()
56                         .setProtologConfig(
57                                 ProtologConfig.ProtoLogConfig.newBuilder()
58                                         .setTracingMode(
59                                                 ProtologConfig.ProtoLogConfig.TracingMode
60                                                         .ENABLE_ALL)
61                                         .build()
62                         ).build());
63 
64         Truth.assertThat(tlsState.getLogFromLevel("SOME_TAG")).isEqualTo(LogLevel.DEBUG);
65         Truth.assertThat(tlsState.getShouldCollectStacktrace("SOME_TAG")).isFalse();
66     }
67 
68     @Test
allEnabledTraceMode()69     public void allEnabledTraceMode() {
70         final ProtoLogDataSource.TlsState tlsState = createTlsState(
71                 DataSourceConfigOuterClass.DataSourceConfig.newBuilder().setProtologConfig(
72                         ProtologConfig.ProtoLogConfig.newBuilder()
73                                 .setTracingMode(
74                                         ProtologConfig.ProtoLogConfig.TracingMode.ENABLE_ALL)
75                                 .build()
76                 ).build()
77         );
78 
79         Truth.assertThat(tlsState.getLogFromLevel("SOME_TAG")).isEqualTo(LogLevel.DEBUG);
80         Truth.assertThat(tlsState.getShouldCollectStacktrace("SOME_TAG")).isFalse();
81     }
82 
83     @Test
requireGroupTagInOverrides()84     public void requireGroupTagInOverrides() {
85         Exception exception = assertThrows(RuntimeException.class, () -> {
86             createTlsState(DataSourceConfigOuterClass.DataSourceConfig.newBuilder()
87                     .setProtologConfig(
88                             ProtologConfig.ProtoLogConfig.newBuilder()
89                                     .addGroupOverrides(
90                                             ProtologConfig.ProtoLogGroup.newBuilder()
91                                                     .setLogFrom(
92                                                             ProtologCommon.ProtoLogLevel
93                                                                     .PROTOLOG_LEVEL_WARN)
94                                                     .setCollectStacktrace(true)
95                                     )
96                                     .build()
97                     ).build());
98         });
99 
100         Truth.assertThat(exception).hasMessageThat().contains("group override without a group tag");
101     }
102 
103     @Test
stackTraceCollection()104     public void stackTraceCollection() {
105         final ProtoLogDataSource.TlsState tlsState = createTlsState(
106                 DataSourceConfigOuterClass.DataSourceConfig.newBuilder().setProtologConfig(
107                         ProtologConfig.ProtoLogConfig.newBuilder()
108                                 .addGroupOverrides(
109                                         ProtologConfig.ProtoLogGroup.newBuilder()
110                                                 .setGroupName("SOME_TAG")
111                                                 .setCollectStacktrace(true)
112                                 )
113                                 .build()
114                 ).build());
115 
116         Truth.assertThat(tlsState.getShouldCollectStacktrace("SOME_TAG")).isTrue();
117     }
118 
119     @Test
groupLogFromOverrides()120     public void groupLogFromOverrides() {
121         final ProtoLogDataSource.TlsState tlsState = createTlsState(
122                 DataSourceConfigOuterClass.DataSourceConfig.newBuilder().setProtologConfig(
123                         ProtologConfig.ProtoLogConfig.newBuilder()
124                                 .addGroupOverrides(
125                                         ProtologConfig.ProtoLogGroup.newBuilder()
126                                                 .setGroupName("SOME_TAG")
127                                                 .setLogFrom(
128                                                         ProtologCommon.ProtoLogLevel
129                                                                 .PROTOLOG_LEVEL_DEBUG)
130                                                 .setCollectStacktrace(true)
131                                 )
132                                 .addGroupOverrides(
133                                         ProtologConfig.ProtoLogGroup.newBuilder()
134                                                 .setGroupName("SOME_OTHER_TAG")
135                                                 .setLogFrom(
136                                                         ProtologCommon.ProtoLogLevel
137                                                                 .PROTOLOG_LEVEL_WARN)
138                                 )
139                                 .build()
140                 ).build());
141 
142         Truth.assertThat(tlsState.getLogFromLevel("SOME_TAG")).isEqualTo(LogLevel.DEBUG);
143         Truth.assertThat(tlsState.getShouldCollectStacktrace("SOME_TAG")).isTrue();
144 
145         Truth.assertThat(tlsState.getLogFromLevel("SOME_OTHER_TAG")).isEqualTo(LogLevel.WARN);
146         Truth.assertThat(tlsState.getShouldCollectStacktrace("SOME_OTHER_TAG")).isFalse();
147 
148         Truth.assertThat(tlsState.getLogFromLevel("UNKNOWN_TAG")).isEqualTo(LogLevel.WTF);
149         Truth.assertThat(tlsState.getShouldCollectStacktrace("UNKNOWN_TAG")).isFalse();
150     }
151 
createTlsState( DataSourceConfigOuterClass.DataSourceConfig config)152     private ProtoLogDataSource.TlsState createTlsState(
153             DataSourceConfigOuterClass.DataSourceConfig config) {
154         final ProtoLogDataSource ds = Mockito.spy(new ProtoLogDataSource());
155 
156         ProtoInputStream configStream = new ProtoInputStream(config.toByteArray());
157         final ProtoLogDataSource.Instance dsInstance = Mockito.spy(
158                 ds.createInstance(configStream, 8));
159         Mockito.doNothing().when(dsInstance).release();
160         final CreateTlsStateArgs mockCreateTlsStateArgs = Mockito.mock(CreateTlsStateArgs.class);
161         Mockito.when(mockCreateTlsStateArgs.getDataSourceInstanceLocked()).thenReturn(dsInstance);
162         return ds.createTlsState(mockCreateTlsStateArgs);
163     }
164 }
165