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