diff options
-rw-r--r-- | service/java/com/android/server/wifi/WifiLogger.java | 31 | ||||
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/WifiLoggerTest.java | 56 |
2 files changed, 72 insertions, 15 deletions
diff --git a/service/java/com/android/server/wifi/WifiLogger.java b/service/java/com/android/server/wifi/WifiLogger.java index 98a3c5172..fde3e05bc 100644 --- a/service/java/com/android/server/wifi/WifiLogger.java +++ b/service/java/com/android/server/wifi/WifiLogger.java @@ -19,6 +19,9 @@ package com.android.server.wifi; import android.util.Base64; import android.util.Log; +import com.android.internal.annotations.VisibleForTesting; +import com.android.server.wifi.util.ByteArrayRingBuffer; + import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.FileDescriptor; @@ -64,8 +67,7 @@ class WifiLogger extends BaseWifiLogger { public static final int REPORT_REASON_SCAN_FAILURE = 6; public static final int REPORT_REASON_USER_ACTION = 7; - /** number of ring buffer entries to cache */ - public static final int MAX_RING_BUFFERS = 10; + public static final int MAX_RING_BUFFER_SIZE_BYTES = 32 * 1024; /** number of bug reports to hold */ public static final int MAX_BUG_REPORTS = 4; @@ -184,7 +186,7 @@ class WifiLogger extends BaseWifiLogger { } /* private methods and data */ - private static class BugReport { + class BugReport { long systemTimeMs; long kernelTimeNanos; int errorCode; @@ -260,7 +262,7 @@ class WifiLogger extends BaseWifiLogger { } } - private static class LimitedCircularArray<E> { + class LimitedCircularArray<E> { private ArrayList<E> mArrayList; private int mMax; LimitedCircularArray(int max) { @@ -287,7 +289,7 @@ class WifiLogger extends BaseWifiLogger { new LimitedCircularArray<BugReport>(MAX_ALERT_REPORTS); private final LimitedCircularArray<BugReport> mLastBugReports = new LimitedCircularArray<BugReport>(MAX_BUG_REPORTS); - private final HashMap<String, LimitedCircularArray<byte[]>> mRingBufferData = new HashMap(); + private final HashMap<String, ByteArrayRingBuffer> mRingBufferData = new HashMap(); private final WifiNative.WifiLoggerEventHandler mHandler = new WifiNative.WifiLoggerEventHandler() { @@ -303,9 +305,9 @@ class WifiLogger extends BaseWifiLogger { }; synchronized void onRingBufferData(WifiNative.RingBufferStatus status, byte[] buffer) { - LimitedCircularArray<byte[]> ring = mRingBufferData.get(status.name); + ByteArrayRingBuffer ring = mRingBufferData.get(status.name); if (ring != null) { - ring.addLast(buffer); + ring.appendBuffer(buffer); } } @@ -325,7 +327,7 @@ class WifiLogger extends BaseWifiLogger { if (DBG) Log.d(TAG, "RingBufferStatus is: \n" + buffer.name); if (mRingBufferData.containsKey(buffer.name) == false) { mRingBufferData.put(buffer.name, - new LimitedCircularArray<byte[]>(MAX_RING_BUFFERS)); + new ByteArrayRingBuffer(MAX_RING_BUFFER_SIZE_BYTES)); } if ((buffer.flag & RING_BUFFER_FLAG_HAS_PER_PACKET_ENTRIES) != 0) { mPerPacketRingBuffer = buffer; @@ -417,10 +419,10 @@ class WifiLogger extends BaseWifiLogger { for (WifiNative.RingBufferStatus buffer : mRingBuffers) { /* this will push data in mRingBuffers */ mWifiNative.getRingBufferData(buffer.name); - LimitedCircularArray<byte[]> data = mRingBufferData.get(buffer.name); - byte[][] buffers = new byte[data.size()][]; - for (int i = 0; i < data.size(); i++) { - buffers[i] = data.get(i).clone(); + ByteArrayRingBuffer data = mRingBufferData.get(buffer.name); + byte[][] buffers = new byte[data.getNumBuffers()][]; + for (int i = 0; i < data.getNumBuffers(); i++) { + buffers[i] = data.getBuffer(i).clone(); } report.ringBuffers.put(buffer.name, buffers); } @@ -435,6 +437,11 @@ class WifiLogger extends BaseWifiLogger { return report; } + @VisibleForTesting + LimitedCircularArray<BugReport> getBugReports() { + return mLastBugReports; + } + private static String compressToBase64(byte[] input) { String result; //compress diff --git a/tests/wifitests/src/com/android/server/wifi/WifiLoggerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiLoggerTest.java index 6ff51c007..83f49762f 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiLoggerTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiLoggerTest.java @@ -18,6 +18,8 @@ package com.android.server.wifi; import android.test.suitebuilder.annotation.SmallTest; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.verify; @@ -40,6 +42,16 @@ public class WifiLoggerTest { WifiLogger mWifiLogger; private static final String FAKE_RING_BUFFER_NAME = "fake-ring-buffer"; + private WifiNative.RingBufferStatus mFakeRbs; + + /** + * Returns the data that we would dump in a bug report, for our ring buffer. + * @return a 2-D byte array, where the first dimension is the record number, and the second + * dimension is the byte index within that record. + */ + private final byte[][] getLoggerRingBufferData() throws Exception { + return mWifiLogger.getBugReports().get(0).ringBuffers.get(FAKE_RING_BUFFER_NAME); + } /** * Initializes common state (e.g. mocks) needed by test cases. @@ -47,13 +59,15 @@ public class WifiLoggerTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); + mFakeRbs = new WifiNative.RingBufferStatus(); + mFakeRbs.name = FAKE_RING_BUFFER_NAME; - WifiNative.RingBufferStatus fakeRbs = new WifiNative.RingBufferStatus(); WifiNative.RingBufferStatus[] ringBufferStatuses = new WifiNative.RingBufferStatus[] { - fakeRbs + mFakeRbs }; - fakeRbs.name = FAKE_RING_BUFFER_NAME; + when(mWifiNative.getRingBufferStatus()).thenReturn(ringBufferStatuses); + when(mWifiNative.readKernelLog()).thenReturn(""); mWifiLogger = new WifiLogger(mWsm, mWifiNative); } @@ -76,4 +90,40 @@ public class WifiLoggerTest { eq(WifiLogger.VERBOSE_NORMAL_LOG), anyInt(), anyInt(), anyInt(), eq(FAKE_RING_BUFFER_NAME)); } + + /** + * Verifies that we capture ring-buffer data. + */ + @Test + public void canCaptureAndStoreRingBufferData() throws Exception { + final boolean verbosityToggle = false; + mWifiLogger.startLogging(verbosityToggle); + + final byte[] data = new byte[WifiLogger.MAX_RING_BUFFER_SIZE_BYTES]; + mWifiLogger.onRingBufferData(mFakeRbs, data); + mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); + + byte[][] ringBufferData = getLoggerRingBufferData(); + assertEquals(1, ringBufferData.length); + assertArrayEquals(data, ringBufferData[0]); + } + + /** + * Verifies that we discard extraneous ring-buffer data. + */ + @Test + public void loggerDiscardsExtraneousData() throws Exception { + final boolean verbosityToggle = false; + mWifiLogger.startLogging(verbosityToggle); + + final byte[] data1 = new byte[WifiLogger.MAX_RING_BUFFER_SIZE_BYTES]; + final byte[] data2 = {1, 2, 3}; + mWifiLogger.onRingBufferData(mFakeRbs, data1); + mWifiLogger.onRingBufferData(mFakeRbs, data2); + mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_NONE); + + byte[][] ringBufferData = getLoggerRingBufferData(); + assertEquals(1, ringBufferData.length); + assertArrayEquals(data2, ringBufferData[0]); + } } |