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