summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/java/com/android/server/wifi/WifiLogger.java31
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiLoggerTest.java56
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]);
+ }
}