11b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal/* 21b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * Copyright (C) 2016 The Android Open Source Project 31b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * 41b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * Licensed under the Apache License, Version 2.0 (the "License"); 51b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * you may not use this file except in compliance with the License. 61b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * You may obtain a copy of the License at 71b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * 81b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * http://www.apache.org/licenses/LICENSE-2.0 91b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * 101b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * Unless required by applicable law or agreed to in writing, software 111b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * distributed under the License is distributed on an "AS IS" BASIS, 121b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * See the License for the specific language governing permissions and 141b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * limitations under the License. 151b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal */ 161b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal 171b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawalpackage com.android.server.wifi; 181b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal 191b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawalimport android.test.suitebuilder.annotation.SmallTest; 201b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal 21b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawalimport static org.junit.Assert.assertArrayEquals; 22b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawalimport static org.junit.Assert.assertEquals; 23d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawalimport static org.junit.Assert.assertFalse; 24ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawalimport static org.junit.Assert.assertTrue; 251b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawalimport static org.mockito.Mockito.anyInt; 26ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawalimport static org.mockito.Mockito.anyObject; 271b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawalimport static org.mockito.Mockito.eq; 28ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawalimport static org.mockito.Mockito.never; 29956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawalimport static org.mockito.Mockito.reset; 301b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawalimport static org.mockito.Mockito.verify; 311b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawalimport static org.mockito.Mockito.when; 321b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal 33ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawalimport com.android.server.wifi.MockAnswerUtil.AnswerWithArguments; 34ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 351b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawalimport org.junit.Before; 361b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawalimport org.junit.Test; 371b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawalimport org.mockito.Mock; 381b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawalimport org.mockito.MockitoAnnotations; 391b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal 40ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawalimport java.io.FileDescriptor; 41ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawalimport java.io.PrintWriter; 42ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawalimport java.io.StringWriter; 43eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawalimport java.util.regex.Pattern; 44ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 451b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal/** 461b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * Unit tests for {@link com.android.server.wifi.WifiLogger}. 471b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal */ 481b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal@SmallTest 491b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawalpublic class WifiLoggerTest { 501b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal public static final String TAG = "WifiLoggerTest"; 511b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal 521b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal @Mock WifiStateMachine mWsm; 531b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal @Mock WifiNative mWifiNative; 548df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal @Mock BuildProperties mBuildProperties; 551b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal WifiLogger mWifiLogger; 561b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal 571b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal private static final String FAKE_RING_BUFFER_NAME = "fake-ring-buffer"; 58b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal private WifiNative.RingBufferStatus mFakeRbs; 59b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal 60b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal /** 61b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal * Returns the data that we would dump in a bug report, for our ring buffer. 62b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal * @return a 2-D byte array, where the first dimension is the record number, and the second 63b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal * dimension is the byte index within that record. 64b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal */ 65b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal private final byte[][] getLoggerRingBufferData() throws Exception { 66b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal return mWifiLogger.getBugReports().get(0).ringBuffers.get(FAKE_RING_BUFFER_NAME); 67b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal } 681b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal 691b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal /** 701b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * Initializes common state (e.g. mocks) needed by test cases. 711b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal */ 721b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal @Before 731b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal public void setUp() throws Exception { 741b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal MockitoAnnotations.initMocks(this); 75b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal mFakeRbs = new WifiNative.RingBufferStatus(); 76b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal mFakeRbs.name = FAKE_RING_BUFFER_NAME; 771b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal 781b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal WifiNative.RingBufferStatus[] ringBufferStatuses = new WifiNative.RingBufferStatus[] { 79b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal mFakeRbs 801b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal }; 81b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal 821b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal when(mWifiNative.getRingBufferStatus()).thenReturn(ringBufferStatuses); 83b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal when(mWifiNative.readKernelLog()).thenReturn(""); 848df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal when(mBuildProperties.isEngBuild()).thenReturn(false); 858df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal when(mBuildProperties.isUserdebugBuild()).thenReturn(false); 868df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal when(mBuildProperties.isUserBuild()).thenReturn(true); 871b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal 888df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal mWifiLogger = new WifiLogger(mWsm, mWifiNative, mBuildProperties); 89590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan mWifiNative.enableVerboseLogging(0); 901b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal } 911b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal 92956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal /** Verifies that startLogging() registers a logging event handler. */ 93956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal @Test 94956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal public void startLoggingRegistersLogEventHandler() throws Exception { 95956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal final boolean verbosityToggle = false; // even default mode wants log events from HAL 96956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal mWifiLogger.startLogging(verbosityToggle); 97956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal verify(mWifiNative).setLoggingEventHandler(anyObject()); 98956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal } 99956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal 100956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal /** 101956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal * Verifies that a failure to set the logging event handler does not prevent a future 102956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal * startLogging() from setting the logging event handler. 103956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal */ 104956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal @Test 105956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal public void startLoggingRegistersLogEventHandlerIfPriorAttemptFailed() 106956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal throws Exception { 107956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal final boolean verbosityToggle = false; // even default mode wants log events from HAL 108956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal 109956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal when(mWifiNative.setLoggingEventHandler(anyObject())).thenReturn(false); 110956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal mWifiLogger.startLogging(verbosityToggle); 111956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal verify(mWifiNative).setLoggingEventHandler(anyObject()); 112956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal reset(mWifiNative); 113956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal 114956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal when(mWifiNative.setLoggingEventHandler(anyObject())).thenReturn(true); 115956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal mWifiLogger.startLogging(verbosityToggle); 116956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal verify(mWifiNative).setLoggingEventHandler(anyObject()); 117956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal } 118956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal 119956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal /** Verifies that startLogging() does not make redundant calls to setLoggingEventHandler(). */ 120956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal @Test 121956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal public void startLoggingDoesNotRegisterLogEventHandlerIfPriorAttemptSucceeded() 122956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal throws Exception { 123956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal final boolean verbosityToggle = false; // even default mode wants log events from HAL 124956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal 125956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal when(mWifiNative.setLoggingEventHandler(anyObject())).thenReturn(true); 126956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal mWifiLogger.startLogging(verbosityToggle); 127956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal verify(mWifiNative).setLoggingEventHandler(anyObject()); 128956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal reset(mWifiNative); 129956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal 130956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal mWifiLogger.startLogging(verbosityToggle); 131956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal verify(mWifiNative, never()).setLoggingEventHandler(anyObject()); 132956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal } 133956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal 1341b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal /** 1351b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * Verifies that startLogging() restarts HAL ringbuffers. 1361b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * 1371b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * Specifically: verifies that startLogging() 1381b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * a) stops any ring buffer logging that might be already running, 1391b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal * b) instructs WifiNative to enable ring buffers of the appropriate log level. 1401b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal */ 1411b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal @Test 1421b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal public void startLoggingStopsAndRestartsRingBufferLogging() throws Exception { 1431b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal final boolean verbosityToggle = false; 1441b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal mWifiLogger.startLogging(verbosityToggle); 1451b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal verify(mWifiNative).startLoggingRingBuffer( 1461b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal eq(WifiLogger.VERBOSE_NO_LOG), anyInt(), anyInt(), anyInt(), 1471b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal eq(FAKE_RING_BUFFER_NAME)); 1481b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal verify(mWifiNative).startLoggingRingBuffer( 1491b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal eq(WifiLogger.VERBOSE_NORMAL_LOG), anyInt(), anyInt(), anyInt(), 1501b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal eq(FAKE_RING_BUFFER_NAME)); 1511b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal } 152b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal 153956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal /** Verifies that, if a log handler was registered, then stopLogging() resets it. */ 154956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal @Test 155956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal public void stopLoggingResetsLogHandlerIfHandlerWasRegistered() throws Exception { 156956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal final boolean verbosityToggle = false; // even default mode wants log events from HAL 157956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal 158956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal when(mWifiNative.setLoggingEventHandler(anyObject())).thenReturn(true); 159956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal mWifiLogger.startLogging(verbosityToggle); 160956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal reset(mWifiNative); 161956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal 162956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal mWifiLogger.stopLogging(); 163956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal verify(mWifiNative).resetLogHandler(); 164956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal } 165956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal 166956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal /** Verifies that, if a log handler is not registered, stopLogging() skips resetLogHandler(). */ 167956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal @Test 168956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal public void stopLoggingOnlyResetsLogHandlerIfHandlerWasRegistered() throws Exception { 169956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal final boolean verbosityToggle = false; // even default mode wants log events from HAL 170956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal mWifiLogger.stopLogging(); 171956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal verify(mWifiNative, never()).resetLogHandler(); 172956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal } 173956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal 174956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal /** Verifies that stopLogging() remembers that we've reset the log handler. */ 175956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal @Test 176956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal public void multipleStopLoggingCallsOnlyResetLogHandlerOnce() throws Exception { 177956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal final boolean verbosityToggle = false; // even default mode wants log events from HAL 178956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal 179956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal when(mWifiNative.setLoggingEventHandler(anyObject())).thenReturn(true); 180956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal mWifiLogger.startLogging(verbosityToggle); 181956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal reset(mWifiNative); 182956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal 183956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal when(mWifiNative.resetLogHandler()).thenReturn(true); 184956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal mWifiLogger.stopLogging(); 185956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal verify(mWifiNative).resetLogHandler(); 186956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal reset(mWifiNative); 187956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal 188956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal mWifiLogger.stopLogging(); 189956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal verify(mWifiNative, never()).resetLogHandler(); 190956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal } 191956fd40b6145c4aba9160e10bfc1ea609873ce8dmukesh agrawal 192b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal /** 193b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal * Verifies that we capture ring-buffer data. 194b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal */ 195b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal @Test 196b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal public void canCaptureAndStoreRingBufferData() throws Exception { 197b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal final boolean verbosityToggle = false; 198b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal mWifiLogger.startLogging(verbosityToggle); 199b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal 200d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal final byte[] data = new byte[WifiLogger.RING_BUFFER_BYTE_LIMIT_SMALL]; 201b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal mWifiLogger.onRingBufferData(mFakeRbs, data); 202b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 203b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal 204b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal byte[][] ringBufferData = getLoggerRingBufferData(); 205b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal assertEquals(1, ringBufferData.length); 206b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal assertArrayEquals(data, ringBufferData[0]); 207b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal } 208b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal 209b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal /** 210b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal * Verifies that we discard extraneous ring-buffer data. 211b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal */ 212b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal @Test 213b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal public void loggerDiscardsExtraneousData() throws Exception { 214b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal final boolean verbosityToggle = false; 215b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal mWifiLogger.startLogging(verbosityToggle); 216b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal 217d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal final byte[] data1 = new byte[WifiLogger.RING_BUFFER_BYTE_LIMIT_SMALL]; 218b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal final byte[] data2 = {1, 2, 3}; 219b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal mWifiLogger.onRingBufferData(mFakeRbs, data1); 220b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal mWifiLogger.onRingBufferData(mFakeRbs, data2); 221b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 222b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal 223b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal byte[][] ringBufferData = getLoggerRingBufferData(); 224b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal assertEquals(1, ringBufferData.length); 225b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal assertArrayEquals(data2, ringBufferData[0]); 226b46c550a7305e6c42af4ca92a964b801c33f1f72mukesh agrawal } 227ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 228ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal /** 229590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan * Verifies that, when verbose mode is not enabled, startLogging() calls 230ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal * startPktFateMonitoring(). 231ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal */ 232ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal @Test 233590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan public void startLoggingStartsPacketFateWithoutVerboseMode() { 234ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal final boolean verbosityToggle = false; 235ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.startLogging(verbosityToggle); 236590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan verify(mWifiNative).startPktFateMonitoring(); 237ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal } 238ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 239ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal /** 240ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal * Verifies that, when verbose mode is enabled, startLogging() calls 241ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal * startPktFateMonitoring(). 242ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal */ 243ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal @Test 244ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal public void startLoggingStartsPacketFateInVerboseMode() { 245ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal final boolean verbosityToggle = true; 246ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.startLogging(verbosityToggle); 247ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal verify(mWifiNative).startPktFateMonitoring(); 248ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal } 249ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 250ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal /** 251590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan * Verifies that, when verbose mode is not enabled, reportConnectionFailure() still 252590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan * fetches packet fates. 253ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal */ 254ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal @Test 255ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal public void reportConnectionFailureIsIgnoredWithoutVerboseMode() { 256ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal final boolean verbosityToggle = false; 257ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.startLogging(verbosityToggle); 258ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.reportConnectionFailure(); 259590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan verify(mWifiNative).getTxPktFates(anyObject()); 260590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan verify(mWifiNative).getRxPktFates(anyObject()); 261ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal } 262ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 263ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal /** 264ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal * Verifies that, when verbose mode is enabled, reportConnectionFailure() fetches packet fates. 265ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal */ 266ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal @Test 267ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal public void reportConnectionFailureFetchesFatesInVerboseMode() { 268ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal final boolean verbosityToggle = true; 269ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.startLogging(verbosityToggle); 270ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.reportConnectionFailure(); 271ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal verify(mWifiNative).getTxPktFates(anyObject()); 272ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal verify(mWifiNative).getRxPktFates(anyObject()); 273ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal } 274ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 275ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal /** 276ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal * Verifies that we try to fetch TX fates, even if fetching RX fates failed. 277ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal */ 278ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal @Test 279ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal public void loggerFetchesTxFatesEvenIfFetchingRxFatesFails() { 280ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal final boolean verbosityToggle = true; 281ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal when(mWifiNative.getRxPktFates(anyObject())).thenReturn(false); 282ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.startLogging(verbosityToggle); 283ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.reportConnectionFailure(); 284ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal verify(mWifiNative).getTxPktFates(anyObject()); 285ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal verify(mWifiNative).getRxPktFates(anyObject()); 286ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal } 287ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 288ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal /** 289ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal * Verifies that we try to fetch RX fates, even if fetching TX fates failed. 290ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal */ 291ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal @Test 292ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal public void loggerFetchesRxFatesEvenIfFetchingTxFatesFails() { 293ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal final boolean verbosityToggle = true; 294ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal when(mWifiNative.getTxPktFates(anyObject())).thenReturn(false); 295ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.startLogging(verbosityToggle); 296ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.reportConnectionFailure(); 297ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal verify(mWifiNative).getTxPktFates(anyObject()); 298ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal verify(mWifiNative).getRxPktFates(anyObject()); 299ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal } 300ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 3011bf155710ada7a6ee27453a120690d2c91a0fec5mukesh agrawal /** Verifies that dump() fetches the latest fates. */ 302ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal @Test 3031bf155710ada7a6ee27453a120690d2c91a0fec5mukesh agrawal public void dumpFetchesFates() { 3041bf155710ada7a6ee27453a120690d2c91a0fec5mukesh agrawal final boolean verbosityToggle = false; 305ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal StringWriter sw = new StringWriter(); 306ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal PrintWriter pw = new PrintWriter(sw); 307ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.startLogging(verbosityToggle); 308ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.dump(new FileDescriptor(), pw, new String[]{"bogus", "args"}); 3091bf155710ada7a6ee27453a120690d2c91a0fec5mukesh agrawal verify(mWifiNative).getTxPktFates(anyObject()); 3101bf155710ada7a6ee27453a120690d2c91a0fec5mukesh agrawal verify(mWifiNative).getRxPktFates(anyObject()); 311ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal } 312ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 313ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal /** 314ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal * Verifies that dump() doesn't crash, or generate garbage, in the case where we haven't fetched 315ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal * any fates. 316ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal */ 317ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal @Test 318ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal public void dumpSucceedsWhenNoFatesHaveNotBeenFetched() { 319ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal StringWriter sw = new StringWriter(); 320ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal PrintWriter pw = new PrintWriter(sw); 321ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.dump(new FileDescriptor(), pw, new String[]{"bogus", "args"}); 322ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 323ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal String fateDumpString = sw.toString(); 324ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal assertTrue(fateDumpString.contains("Last failed")); 325ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal // Verify dump terminator is present 326ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal assertTrue(fateDumpString.contains( 327ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal "--------------------------------------------------------------------")); 328ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal } 329ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 330ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal /** 331ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal * Verifies that dump() doesn't crash, or generate garbage, in the case where the fates that 332ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal * the HAL-provided fates are empty. 333ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal */ 334ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal @Test 335ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal public void dumpSucceedsWhenFatesHaveBeenFetchedButAreEmpty() { 336ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal final boolean verbosityToggle = true; 337ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.startLogging(verbosityToggle); 338ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.reportConnectionFailure(); 3391bf155710ada7a6ee27453a120690d2c91a0fec5mukesh agrawal verify(mWifiNative).getTxPktFates(anyObject()); 3401bf155710ada7a6ee27453a120690d2c91a0fec5mukesh agrawal verify(mWifiNative).getRxPktFates(anyObject()); 341ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 342ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal StringWriter sw = new StringWriter(); 343ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal PrintWriter pw = new PrintWriter(sw); 344ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.dump(new FileDescriptor(), pw, new String[]{"bogus", "args"}); 345ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 346ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal String fateDumpString = sw.toString(); 347ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal assertTrue(fateDumpString.contains("Last failed")); 348ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal // Verify dump terminator is present 349ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal assertTrue(fateDumpString.contains( 350ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal "--------------------------------------------------------------------")); 351ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal } 352ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 353590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan private String getDumpString(boolean verbose) { 354590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan mWifiLogger.startLogging(verbose); 355590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan mWifiNative.enableVerboseLogging(verbose ? 1 : 0); 356ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal when(mWifiNative.getTxPktFates(anyObject())).then(new AnswerWithArguments() { 357ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal public boolean answer(WifiNative.TxFateReport[] fates) { 358ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal fates[0] = new WifiNative.TxFateReport( 359590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan WifiLoggerHal.TX_PKT_FATE_ACKED, 2, WifiLoggerHal.FRAME_TYPE_ETHERNET_II, 360590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan new byte[0] 361590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan ); 362590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan fates[1] = new WifiNative.TxFateReport( 363ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal WifiLoggerHal.TX_PKT_FATE_ACKED, 0, WifiLoggerHal.FRAME_TYPE_ETHERNET_II, 364ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal new byte[0] 365ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal ); 366ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal return true; 367ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal } 368ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal }); 369ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal when(mWifiNative.getRxPktFates(anyObject())).then(new AnswerWithArguments() { 370ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal public boolean answer(WifiNative.RxFateReport[] fates) { 371ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal fates[0] = new WifiNative.RxFateReport( 372590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan WifiLoggerHal.RX_PKT_FATE_SUCCESS, 3, WifiLoggerHal.FRAME_TYPE_ETHERNET_II, 373590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan new byte[0] 374590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan ); 375590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan fates[1] = new WifiNative.RxFateReport( 376ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal WifiLoggerHal.RX_PKT_FATE_SUCCESS, 1, WifiLoggerHal.FRAME_TYPE_ETHERNET_II, 377ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal new byte[0] 378ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal ); 379ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal return true; 380ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal } 381ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal }); 382ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.reportConnectionFailure(); 383ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 384ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal StringWriter sw = new StringWriter(); 385ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal PrintWriter pw = new PrintWriter(sw); 386ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal mWifiLogger.dump(new FileDescriptor(), pw, new String[]{"bogus", "args"}); 387590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan return sw.toString(); 388590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan } 389ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 390590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan /** 391590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan * Verifies that dump() shows both TX, and RX fates in only table form, when verbose 392590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan * logging is not enabled. 393590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan */ 394590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan @Test 395590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan public void dumpShowsTxAndRxFates() { 396590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan final boolean verbosityToggle = false; 397590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan String dumpString = getDumpString(verbosityToggle); 398590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertTrue(dumpString.contains(WifiNative.FateReport.getTableHeader())); 399eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal assertTrue(Pattern.compile("0 .* TX ").matcher(dumpString).find()); 400eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal assertTrue(Pattern.compile("1 .* RX ").matcher(dumpString).find()); 401eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal assertTrue(Pattern.compile("2 .* TX ").matcher(dumpString).find()); 402eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal assertTrue(Pattern.compile("3 .* RX ").matcher(dumpString).find()); 403590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertFalse(dumpString.contains("VERBOSE PACKET FATE DUMP")); 404590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertFalse(dumpString.contains("Frame bytes")); 405590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan } 406590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan 407590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan /** 408590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan * Verifies that dump() shows both TX, and RX fates in table and verbose forms, when verbose 409590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan * logging is enabled. 410590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan */ 411590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan @Test 412590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan public void dumpShowsTxAndRxFatesVerbose() { 413590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan final boolean verbosityToggle = true; 414590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan String dumpString = getDumpString(verbosityToggle); 415590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertTrue(dumpString.contains(WifiNative.FateReport.getTableHeader())); 416eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal assertTrue(Pattern.compile("0 .* TX ").matcher(dumpString).find()); 417eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal assertTrue(Pattern.compile("1 .* RX ").matcher(dumpString).find()); 418eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal assertTrue(Pattern.compile("2 .* TX ").matcher(dumpString).find()); 419eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal assertTrue(Pattern.compile("3 .* RX ").matcher(dumpString).find()); 420590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertTrue(dumpString.contains("VERBOSE PACKET FATE DUMP")); 421590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertTrue(dumpString.contains("Frame bytes")); 422ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal } 423ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal 424ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal /** 425eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal * Verifies that dump() outputs frames in timestamp order, even though the HAL provided the 426eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal * data out-of-order (order is specified in getDumpString()). 427ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal */ 428ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal @Test 429ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal public void dumpIsSortedByTimestamp() { 430ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal final boolean verbosityToggle = true; 431590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan String dumpString = getDumpString(verbosityToggle); 432590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertTrue(dumpString.contains(WifiNative.FateReport.getTableHeader())); 433eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal assertTrue(Pattern.compile( 434eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal "0 .* TX .*\n" + 435eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal "1 .* RX .*\n" + 436eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal "2 .* TX .*\n" + 437eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal "3 .* RX " 438eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal ).matcher(dumpString).find()); 439590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan 440590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan int expected_index_of_verbose_frame_0 = dumpString.indexOf( 441590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan "Frame direction: TX\nFrame timestamp: 0\n"); 442590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan int expected_index_of_verbose_frame_1 = dumpString.indexOf( 443590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan "Frame direction: RX\nFrame timestamp: 1\n"); 444590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan int expected_index_of_verbose_frame_2 = dumpString.indexOf( 445590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan "Frame direction: TX\nFrame timestamp: 2\n"); 446590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan int expected_index_of_verbose_frame_3 = dumpString.indexOf( 447590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan "Frame direction: RX\nFrame timestamp: 3\n"); 448590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertFalse(-1 == expected_index_of_verbose_frame_0); 449590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertFalse(-1 == expected_index_of_verbose_frame_1); 450590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertFalse(-1 == expected_index_of_verbose_frame_2); 451590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertFalse(-1 == expected_index_of_verbose_frame_3); 452590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertTrue(expected_index_of_verbose_frame_0 < expected_index_of_verbose_frame_1); 453590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertTrue(expected_index_of_verbose_frame_1 < expected_index_of_verbose_frame_2); 454590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertTrue(expected_index_of_verbose_frame_2 < expected_index_of_verbose_frame_3); 455ed510cfa64decd813f76faf9bb1b0a70b74b9898mukesh agrawal } 456d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal 4578df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal /** Verifies that eng builds do not show fate detail outside of verbose mode. */ 4588df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal @Test 4598df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal public void dumpOmitsFateDetailInEngBuildsOutsideOfVerboseMode() throws Exception { 4608df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal final boolean verbosityToggle = false; 4618df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal when(mBuildProperties.isEngBuild()).thenReturn(true); 4628df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal when(mBuildProperties.isUserdebugBuild()).thenReturn(false); 4638df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal when(mBuildProperties.isUserBuild()).thenReturn(false); 4648df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal String dumpString = getDumpString(verbosityToggle); 4658df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal assertFalse(dumpString.contains("VERBOSE PACKET FATE DUMP")); 4668df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal assertFalse(dumpString.contains("Frame bytes")); 4678df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal } 4688df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal 4698df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal /** Verifies that userdebug builds do not show fate detail outside of verbose mode. */ 4708df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal @Test 4718df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal public void dumpOmitsFateDetailInUserdebugBuildsOutsideOfVerboseMode() throws Exception { 4728df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal final boolean verbosityToggle = false; 4738df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal when(mBuildProperties.isUserdebugBuild()).thenReturn(true); 4748df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal when(mBuildProperties.isEngBuild()).thenReturn(false); 4758df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal when(mBuildProperties.isUserBuild()).thenReturn(false); 4768df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal String dumpString = getDumpString(verbosityToggle); 4778df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal assertFalse(dumpString.contains("VERBOSE PACKET FATE DUMP")); 4788df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal assertFalse(dumpString.contains("Frame bytes")); 4798df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal } 4808df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal 4812ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal /** 4822ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal * Verifies that, if verbose is disabled after fetching fates, the dump does not include 483590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan * verbose fate logs. 4842ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal */ 4852ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal @Test 4862ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal public void dumpOmitsFatesIfVerboseIsDisabledAfterFetch() { 4872ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal final boolean verbosityToggle = true; 4882ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal mWifiLogger.startLogging(verbosityToggle); 4892ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal when(mWifiNative.getTxPktFates(anyObject())).then(new AnswerWithArguments() { 4902ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal public boolean answer(WifiNative.TxFateReport[] fates) { 4912ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal fates[0] = new WifiNative.TxFateReport( 4922ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal WifiLoggerHal.TX_PKT_FATE_ACKED, 0, WifiLoggerHal.FRAME_TYPE_ETHERNET_II, 4932ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal new byte[0] 4942ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal ); 4952ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal return true; 4962ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal } 4972ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal }); 4982ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal when(mWifiNative.getRxPktFates(anyObject())).then(new AnswerWithArguments() { 4992ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal public boolean answer(WifiNative.RxFateReport[] fates) { 5002ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal fates[0] = new WifiNative.RxFateReport( 5012ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal WifiLoggerHal.RX_PKT_FATE_SUCCESS, 1, WifiLoggerHal.FRAME_TYPE_ETHERNET_II, 5022ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal new byte[0] 5032ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal ); 5042ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal return true; 5052ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal } 5062ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal }); 5072ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal mWifiLogger.reportConnectionFailure(); 5082ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal verify(mWifiNative).getTxPktFates(anyObject()); 5092ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal verify(mWifiNative).getRxPktFates(anyObject()); 5102ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal 5112ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal final boolean newVerbosityToggle = false; 5122ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal mWifiLogger.startLogging(newVerbosityToggle); 5132ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal 5142ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal StringWriter sw = new StringWriter(); 5152ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal PrintWriter pw = new PrintWriter(sw); 5162ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal mWifiLogger.dump(new FileDescriptor(), pw, new String[]{"bogus", "args"}); 5172ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal 5182ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal String fateDumpString = sw.toString(); 519590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertFalse(fateDumpString.contains("VERBOSE PACKET FATE DUMP")); 520590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan assertFalse(fateDumpString.contains("Frame bytes")); 5212ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal } 5222ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal 523d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal /** Verifies that the default size of our ring buffers is small. */ 524d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal @Test 525d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal public void ringBufferSizeIsSmallByDefault() throws Exception { 526d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal final boolean verbosityToggle = false; 527d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.startLogging(verbosityToggle); 528d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.onRingBufferData( 529d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mFakeRbs, new byte[WifiLogger.RING_BUFFER_BYTE_LIMIT_SMALL + 1]); 530d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 531d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal assertEquals(0, getLoggerRingBufferData().length); 532d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal } 533d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal 5349a865ec91cf32d41496a28d800279cd86832b027mukesh agrawal /** Verifies that we use small ring buffers by default, on userdebug builds. */ 5358df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal @Test 5369a865ec91cf32d41496a28d800279cd86832b027mukesh agrawal public void ringBufferSizeIsSmallByDefaultOnUserdebugBuilds() throws Exception { 5378df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal final boolean verbosityToggle = false; 5388df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal when(mBuildProperties.isUserdebugBuild()).thenReturn(true); 5398df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal when(mBuildProperties.isEngBuild()).thenReturn(false); 5408df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal when(mBuildProperties.isUserBuild()).thenReturn(false); 5418df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal mWifiLogger.startLogging(verbosityToggle); 5429a865ec91cf32d41496a28d800279cd86832b027mukesh agrawal mWifiLogger.onRingBufferData( 5439a865ec91cf32d41496a28d800279cd86832b027mukesh agrawal mFakeRbs, new byte[WifiLogger.RING_BUFFER_BYTE_LIMIT_SMALL + 1]); 5448df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 5459a865ec91cf32d41496a28d800279cd86832b027mukesh agrawal assertEquals(0, getLoggerRingBufferData().length); 5468df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal } 5478df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal 5489a865ec91cf32d41496a28d800279cd86832b027mukesh agrawal /** Verifies that we use small ring buffers by default, on eng builds. */ 5498df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal @Test 5509a865ec91cf32d41496a28d800279cd86832b027mukesh agrawal public void ringBufferSizeIsSmallByDefaultOnEngBuilds() throws Exception { 5518df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal final boolean verbosityToggle = false; 5528df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal when(mBuildProperties.isEngBuild()).thenReturn(true); 5538df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal when(mBuildProperties.isUserdebugBuild()).thenReturn(false); 5548df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal when(mBuildProperties.isUserBuild()).thenReturn(false); 5558df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal mWifiLogger.startLogging(verbosityToggle); 5569a865ec91cf32d41496a28d800279cd86832b027mukesh agrawal mWifiLogger.onRingBufferData( 5579a865ec91cf32d41496a28d800279cd86832b027mukesh agrawal mFakeRbs, new byte[WifiLogger.RING_BUFFER_BYTE_LIMIT_SMALL + 1]); 5588df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 5599a865ec91cf32d41496a28d800279cd86832b027mukesh agrawal assertEquals(0, getLoggerRingBufferData().length); 5608df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal } 5618df302f5b9c647f69acee24e09fa20d8b5c54c4amukesh agrawal 562d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal /** Verifies that we use large ring buffers when initially started in verbose mode. */ 563d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal @Test 564d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal public void ringBufferSizeIsLargeInVerboseMode() throws Exception { 565d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal final boolean verbosityToggle = true; 566d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.startLogging(verbosityToggle); 567d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.onRingBufferData(mFakeRbs, new byte[WifiLogger.RING_BUFFER_BYTE_LIMIT_LARGE]); 568d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 569d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal assertEquals(1, getLoggerRingBufferData().length); 570d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal } 571d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal 572d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal /** Verifies that we use large ring buffers when switched from normal to verbose mode. */ 573d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal @Test 574d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal public void startLoggingGrowsRingBuffersIfNeeded() throws Exception { 575d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.startLogging(false /* verbose disabled */); 576d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.startLogging(true /* verbose enabled */); 577d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.onRingBufferData(mFakeRbs, new byte[WifiLogger.RING_BUFFER_BYTE_LIMIT_LARGE]); 578d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 579d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal assertEquals(1, getLoggerRingBufferData().length); 580d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal } 581d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal 582d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal /** Verifies that we use small ring buffers when switched from verbose to normal mode. */ 583d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal @Test 584d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal public void startLoggingShrinksRingBuffersIfNeeded() throws Exception { 585d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.startLogging(true /* verbose enabled */); 586d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.onRingBufferData( 587d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mFakeRbs, new byte[WifiLogger.RING_BUFFER_BYTE_LIMIT_SMALL + 1]); 588d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal 589d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal // Existing data is nuked (too large). 590d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.startLogging(false /* verbose disabled */); 591d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 592d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal assertEquals(0, getLoggerRingBufferData().length); 593d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal 594d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal // New data must obey limit as well. 595d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.onRingBufferData( 596d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mFakeRbs, new byte[WifiLogger.RING_BUFFER_BYTE_LIMIT_SMALL + 1]); 597d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 598d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal assertEquals(0, getLoggerRingBufferData().length); 599d604bbd63d620244ef43408de10f65ead01d5026mukesh agrawal } 600d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 601d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal /** Verifies that we skip the firmware and driver dumps if verbose is not enabled. */ 602d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal @Test 603d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal public void captureBugReportSkipsFirmwareAndDriverDumpsByDefault() { 604d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 605d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal verify(mWifiNative, never()).getFwMemoryDump(); 606d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal verify(mWifiNative, never()).getDriverStateDump(); 607d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal } 608d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 609d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal /** Verifies that we capture the firmware and driver dumps if verbose is enabled. */ 610d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal @Test 611d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal public void captureBugReportTakesFirmwareAndDriverDumpsInVerboseMode() { 612d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal mWifiLogger.startLogging(true /* verbose enabled */); 613d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 614d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal verify(mWifiNative).getFwMemoryDump(); 615d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal verify(mWifiNative).getDriverStateDump(); 616d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal } 617d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 618d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal /** Verifies that the dump includes driver state, if driver state was provided by HAL. */ 619d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal @Test 620d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal public void dumpIncludesDriverStateDumpIfAvailable() { 621d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal when(mWifiNative.getDriverStateDump()).thenReturn(new byte[]{0, 1, 2}); 622d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 623d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal mWifiLogger.startLogging(true /* verbose enabled */); 624d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 625d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal verify(mWifiNative).getDriverStateDump(); 626d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 627d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal StringWriter sw = new StringWriter(); 628d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal PrintWriter pw = new PrintWriter(sw); 629d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal mWifiLogger.dump(new FileDescriptor(), pw, new String[]{}); 630d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal assertTrue(sw.toString().contains(WifiLogger.DRIVER_DUMP_SECTION_HEADER)); 631d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal } 632d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 633d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal /** Verifies that the dump skips driver state, if driver state was not provided by HAL. */ 634d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal @Test 635d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal public void dumpOmitsDriverStateDumpIfUnavailable() { 636d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal mWifiLogger.startLogging(true /* verbose enabled */); 637d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 638d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal verify(mWifiNative).getDriverStateDump(); 639d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 640d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal StringWriter sw = new StringWriter(); 641d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal PrintWriter pw = new PrintWriter(sw); 642d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal mWifiLogger.dump(new FileDescriptor(), pw, new String[]{}); 643d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal assertFalse(sw.toString().contains(WifiLogger.DRIVER_DUMP_SECTION_HEADER)); 644d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal } 645d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 6462ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal /** Verifies that the dump omits driver state, if verbose was disabled after capture. */ 6472ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal @Test 6482ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal public void dumpOmitsDriverStateDumpIfVerboseDisabledAfterCapture() { 6492ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal when(mWifiNative.getDriverStateDump()).thenReturn(new byte[]{0, 1, 2}); 6502ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal 6512ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal mWifiLogger.startLogging(true /* verbose enabled */); 6522ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 6532ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal verify(mWifiNative).getDriverStateDump(); 6542ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal 6552ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal mWifiLogger.startLogging(false /* verbose no longer enabled */); 6562ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal 6572ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal StringWriter sw = new StringWriter(); 6582ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal PrintWriter pw = new PrintWriter(sw); 6592ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal mWifiLogger.dump(new FileDescriptor(), pw, new String[]{}); 6602ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal assertFalse(sw.toString().contains(WifiLogger.DRIVER_DUMP_SECTION_HEADER)); 6612ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal } 6622ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal 6632ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal /** Verifies that the dump includes firmware dump, if firmware dump was provided by HAL. */ 664d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal @Test 665d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal public void dumpIncludesFirmwareMemoryDumpIfAvailable() { 666d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal when(mWifiNative.getFwMemoryDump()).thenReturn(new byte[]{0, 1, 2}); 667d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 668d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal mWifiLogger.startLogging(true /* verbose enabled */); 669d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 670d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal verify(mWifiNative).getFwMemoryDump(); 671d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 672d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal StringWriter sw = new StringWriter(); 673d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal PrintWriter pw = new PrintWriter(sw); 674d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal mWifiLogger.dump(new FileDescriptor(), pw, new String[]{}); 675d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal assertTrue(sw.toString().contains(WifiLogger.FIRMWARE_DUMP_SECTION_HEADER)); 676d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal } 677d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 678d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal /** Verifies that the dump skips firmware memory, if firmware memory was not provided by HAL. */ 679d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal @Test 680d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal public void dumpOmitsFirmwareMemoryDumpIfUnavailable() { 681d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal mWifiLogger.startLogging(true /* verbose enabled */); 682d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 683d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal verify(mWifiNative).getFwMemoryDump(); 684d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 685d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal StringWriter sw = new StringWriter(); 686d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal PrintWriter pw = new PrintWriter(sw); 687d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal mWifiLogger.dump(new FileDescriptor(), pw, new String[]{}); 688d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal assertFalse(sw.toString().contains(WifiLogger.FIRMWARE_DUMP_SECTION_HEADER)); 689d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal } 6902ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal 6912ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal /** Verifies that the dump omits firmware memory, if verbose was disabled after capture. */ 6922ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal @Test 6932ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal public void dumpOmitsFirmwareMemoryDumpIfVerboseDisabledAfterCapture() { 6942ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal when(mWifiNative.getFwMemoryDump()).thenReturn(new byte[]{0, 1, 2}); 6952ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal 6962ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal mWifiLogger.startLogging(true /* verbose enabled */); 6972ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); 6982ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal verify(mWifiNative).getFwMemoryDump(); 6992ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal 7002ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal mWifiLogger.startLogging(false /* verbose no longer enabled */); 7012ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal 7022ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal StringWriter sw = new StringWriter(); 7032ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal PrintWriter pw = new PrintWriter(sw); 7042ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal mWifiLogger.dump(new FileDescriptor(), pw, new String[]{}); 7052ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal assertFalse(sw.toString().contains(WifiLogger.FIRMWARE_DUMP_SECTION_HEADER)); 7062ecb62764d26c3f0d95a9dc5c0a616af1b2bf8demukesh agrawal } 7071b8a2b3c8724e29ce669f5bd6b0b82250824d034mukesh agrawal} 708