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.mockito.ArgumentMatchers.anyString; 20 import static org.mockito.ArgumentMatchers.contains; 21 import static org.mockito.ArgumentMatchers.endsWith; 22 import static org.mockito.ArgumentMatchers.eq; 23 import static org.mockito.Mockito.atLeast; 24 import static org.mockito.Mockito.times; 25 26 import android.os.Binder; 27 import android.platform.test.annotations.Presubmit; 28 29 import org.junit.Test; 30 import org.junit.runner.RunWith; 31 import org.mockito.Mock; 32 import org.mockito.Mockito; 33 import org.mockito.junit.MockitoJUnitRunner; 34 35 import java.io.FileDescriptor; 36 import java.io.PrintWriter; 37 38 /** 39 * Test class for {@link ProtoLogImpl}. 40 */ 41 @Presubmit 42 @RunWith(MockitoJUnitRunner.class) 43 public class ProtoLogCommandHandlerTest { 44 45 @Mock 46 ProtoLogConfigurationService mProtoLogConfigurationService; 47 @Mock 48 PrintWriter mPrintWriter; 49 @Mock 50 Binder mMockBinder; 51 52 @Test printsHelpForAllAvailableCommands()53 public void printsHelpForAllAvailableCommands() { 54 final ProtoLogCommandHandler cmdHandler = 55 new ProtoLogCommandHandler(mProtoLogConfigurationService, mPrintWriter); 56 57 cmdHandler.onHelp(); 58 validateOnHelpPrinted(); 59 } 60 61 @Test printsHelpIfCommandIsNull()62 public void printsHelpIfCommandIsNull() { 63 final ProtoLogCommandHandler cmdHandler = 64 new ProtoLogCommandHandler(mProtoLogConfigurationService, mPrintWriter); 65 66 cmdHandler.onCommand(null); 67 validateOnHelpPrinted(); 68 } 69 70 @Test handlesGroupListCommand()71 public void handlesGroupListCommand() { 72 Mockito.when(mProtoLogConfigurationService.getGroups()) 73 .thenReturn(new String[] {"MY_TEST_GROUP", "MY_OTHER_GROUP"}); 74 final ProtoLogCommandHandler cmdHandler = 75 new ProtoLogCommandHandler(mProtoLogConfigurationService, mPrintWriter); 76 77 cmdHandler.exec(mMockBinder, FileDescriptor.in, FileDescriptor.out, 78 FileDescriptor.err, new String[] { "groups", "list" }); 79 80 Mockito.verify(mPrintWriter, times(1)) 81 .println(contains("MY_TEST_GROUP")); 82 Mockito.verify(mPrintWriter, times(1)) 83 .println(contains("MY_OTHER_GROUP")); 84 } 85 86 @Test handlesIncompleteGroupsCommand()87 public void handlesIncompleteGroupsCommand() { 88 final ProtoLogCommandHandler cmdHandler = 89 new ProtoLogCommandHandler(mProtoLogConfigurationService, mPrintWriter); 90 91 cmdHandler.exec(mMockBinder, FileDescriptor.in, FileDescriptor.out, 92 FileDescriptor.err, new String[] { "groups" }); 93 94 Mockito.verify(mPrintWriter, times(1)) 95 .println(contains("Incomplete command")); 96 } 97 98 @Test handlesGroupStatusCommand()99 public void handlesGroupStatusCommand() { 100 Mockito.when(mProtoLogConfigurationService.getGroups()) 101 .thenReturn(new String[] {"MY_GROUP"}); 102 Mockito.when(mProtoLogConfigurationService.isLoggingToLogcat("MY_GROUP")).thenReturn(true); 103 final ProtoLogCommandHandler cmdHandler = 104 new ProtoLogCommandHandler(mProtoLogConfigurationService, mPrintWriter); 105 106 cmdHandler.exec(mMockBinder, FileDescriptor.in, FileDescriptor.out, 107 FileDescriptor.err, new String[] { "groups", "status", "MY_GROUP" }); 108 109 Mockito.verify(mPrintWriter, times(1)) 110 .println(contains("MY_GROUP")); 111 Mockito.verify(mPrintWriter, times(1)) 112 .println(contains("LOG_TO_LOGCAT = true")); 113 } 114 115 @Test handlesGroupStatusCommandOfUnregisteredGroups()116 public void handlesGroupStatusCommandOfUnregisteredGroups() { 117 Mockito.when(mProtoLogConfigurationService.getGroups()).thenReturn(new String[] {}); 118 final ProtoLogCommandHandler cmdHandler = 119 new ProtoLogCommandHandler(mProtoLogConfigurationService, mPrintWriter); 120 121 cmdHandler.exec(mMockBinder, FileDescriptor.in, FileDescriptor.out, 122 FileDescriptor.err, new String[] { "groups", "status", "MY_GROUP" }); 123 124 Mockito.verify(mPrintWriter, times(1)) 125 .println(contains("MY_GROUP")); 126 Mockito.verify(mPrintWriter, times(1)) 127 .println(contains("UNREGISTERED")); 128 } 129 130 @Test handlesGroupStatusCommandWithNoGroups()131 public void handlesGroupStatusCommandWithNoGroups() { 132 final ProtoLogCommandHandler cmdHandler = 133 new ProtoLogCommandHandler(mProtoLogConfigurationService, mPrintWriter); 134 135 cmdHandler.exec(mMockBinder, FileDescriptor.in, FileDescriptor.out, 136 FileDescriptor.err, new String[] { "groups", "status" }); 137 138 Mockito.verify(mPrintWriter, times(1)) 139 .println(contains("Incomplete command")); 140 } 141 142 @Test handlesIncompleteLogcatCommand()143 public void handlesIncompleteLogcatCommand() { 144 final ProtoLogCommandHandler cmdHandler = 145 new ProtoLogCommandHandler(mProtoLogConfigurationService, mPrintWriter); 146 147 cmdHandler.exec(mMockBinder, FileDescriptor.in, FileDescriptor.out, 148 FileDescriptor.err, new String[] { "logcat" }); 149 150 Mockito.verify(mPrintWriter, times(1)) 151 .println(contains("Incomplete command")); 152 } 153 154 @Test handlesLogcatEnableCommand()155 public void handlesLogcatEnableCommand() { 156 final ProtoLogCommandHandler cmdHandler = 157 new ProtoLogCommandHandler(mProtoLogConfigurationService, mPrintWriter); 158 159 cmdHandler.exec(mMockBinder, FileDescriptor.in, FileDescriptor.out, 160 FileDescriptor.err, new String[] { "logcat", "enable", "MY_GROUP" }); 161 Mockito.verify(mProtoLogConfigurationService) 162 .enableProtoLogToLogcat(Mockito.any(), eq("MY_GROUP")); 163 164 cmdHandler.exec(mMockBinder, FileDescriptor.in, FileDescriptor.out, 165 FileDescriptor.err, 166 new String[] { "logcat", "enable", "MY_GROUP", "MY_OTHER_GROUP" }); 167 Mockito.verify(mProtoLogConfigurationService) 168 .enableProtoLogToLogcat(Mockito.any(), 169 eq("MY_GROUP"), eq("MY_OTHER_GROUP")); 170 } 171 172 @Test handlesLogcatDisableCommand()173 public void handlesLogcatDisableCommand() { 174 final ProtoLogCommandHandler cmdHandler = 175 new ProtoLogCommandHandler(mProtoLogConfigurationService, mPrintWriter); 176 177 cmdHandler.exec(mMockBinder, FileDescriptor.in, FileDescriptor.out, 178 FileDescriptor.err, new String[] { "logcat", "disable", "MY_GROUP" }); 179 Mockito.verify(mProtoLogConfigurationService) 180 .disableProtoLogToLogcat(Mockito.any(), eq("MY_GROUP")); 181 182 cmdHandler.exec(mMockBinder, FileDescriptor.in, FileDescriptor.out, 183 FileDescriptor.err, 184 new String[] { "logcat", "disable", "MY_GROUP", "MY_OTHER_GROUP" }); 185 Mockito.verify(mProtoLogConfigurationService) 186 .disableProtoLogToLogcat(Mockito.any(), 187 eq("MY_GROUP"), eq("MY_OTHER_GROUP")); 188 } 189 190 @Test handlesLogcatEnableCommandWithNoGroups()191 public void handlesLogcatEnableCommandWithNoGroups() { 192 final ProtoLogCommandHandler cmdHandler = 193 new ProtoLogCommandHandler(mProtoLogConfigurationService, mPrintWriter); 194 195 cmdHandler.exec(mMockBinder, FileDescriptor.in, FileDescriptor.out, 196 FileDescriptor.err, new String[] { "logcat", "enable" }); 197 Mockito.verify(mPrintWriter).println(contains("Incomplete command")); 198 } 199 200 @Test handlesLogcatDisableCommandWithNoGroups()201 public void handlesLogcatDisableCommandWithNoGroups() { 202 final ProtoLogCommandHandler cmdHandler = 203 new ProtoLogCommandHandler(mProtoLogConfigurationService, mPrintWriter); 204 205 cmdHandler.exec(mMockBinder, FileDescriptor.in, FileDescriptor.out, 206 FileDescriptor.err, new String[] { "logcat", "disable" }); 207 Mockito.verify(mPrintWriter).println(contains("Incomplete command")); 208 } 209 validateOnHelpPrinted()210 private void validateOnHelpPrinted() { 211 Mockito.verify(mPrintWriter, times(1)).println(endsWith("help")); 212 Mockito.verify(mPrintWriter, times(1)) 213 .println(endsWith("groups (list | status)")); 214 Mockito.verify(mPrintWriter, times(1)) 215 .println(endsWith("logcat (enable | disable) <group>")); 216 Mockito.verify(mPrintWriter, atLeast(0)).println(anyString()); 217 } 218 } 219