• 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.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