summaryrefslogtreecommitdiffstats
path: root/tests/wifitests/src/com/android/server/wifi/hotspot2
diff options
context:
space:
mode:
authorEcco Park <eccopark@google.com>2019-01-11 16:10:07 -0800
committerEcco Park <eccopark@google.com>2019-01-14 16:42:05 -0800
commit31b4320747cb9406252997e921a9e81964449cd5 (patch)
treed64b83f3027796c26b414ab3a92e985603d24c0f /tests/wifitests/src/com/android/server/wifi/hotspot2
parent3067b923baf0c6b04b5777a7107d8b8c2f9b45bc (diff)
downloadandroid_frameworks_opt_net_wifi-31b4320747cb9406252997e921a9e81964449cd5.tar.gz
android_frameworks_opt_net_wifi-31b4320747cb9406252997e921a9e81964449cd5.tar.bz2
android_frameworks_opt_net_wifi-31b4320747cb9406252997e921a9e81964449cd5.zip
passpoint-r2: fix NullPointerException for OsuServerConnection
If we are doing OSU procedure continuously, system is crashed because of NullPointerException for mServiceConnection. This is a synchronization issue for accessing mServiceConnection between two threads. 1) WifiServiceHandlerThread: call cleanUp to set mServiceConnection to null when AP got disconnetted. 2) OsuServerHandler handlerThread: exchange Soap messages Reproducible steps: TimeoutTask for redirect response was not deleted for previous OSU session while cleanup resource by disconnection. Eventually the timeout task was triggered in new OSU procedure and causes the current state machine to be reset causing mServiceConnection to be null. In the meantime, we are trying to call mOsuServerConnection.disconnect to release resource on null mServiceConnection. Solution: 1) clean up pending timeout task when calling stopSever. 2) handle the cleanup on the OsuServerHandlerThread. error Log: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.android.server.wifi.hotspot2.soap.HttpsServiceConnection.disconnect()' on a null object reference com.android.server.wifi.hotspot2.OsuServerConnection performSoapMessageExchange(OsuServerConnection.java:353) Bug: 121223278 Test: ./frameworks/opt/net/wifi/tests/wifitests/runtests.sh Test: tested with R2 AP for OSU procedure. Change-Id: Ica3b2afa75919ad2291e14b3bf7cfa8af4022b9d Signed-off-by: Ecco Park <eccopark@google.com>
Diffstat (limited to 'tests/wifitests/src/com/android/server/wifi/hotspot2')
-rw-r--r--tests/wifitests/src/com/android/server/wifi/hotspot2/OsuServerConnectionTest.java42
-rw-r--r--tests/wifitests/src/com/android/server/wifi/hotspot2/soap/RedirectListenerTest.java3
2 files changed, 42 insertions, 3 deletions
diff --git a/tests/wifitests/src/com/android/server/wifi/hotspot2/OsuServerConnectionTest.java b/tests/wifitests/src/com/android/server/wifi/hotspot2/OsuServerConnectionTest.java
index c238d0417..c5baac721 100644
--- a/tests/wifitests/src/com/android/server/wifi/hotspot2/OsuServerConnectionTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/hotspot2/OsuServerConnectionTest.java
@@ -16,7 +16,6 @@
package com.android.server.wifi.hotspot2;
-import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyString;
@@ -25,6 +24,8 @@ import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -41,6 +42,7 @@ import com.android.server.wifi.hotspot2.soap.HttpsTransport;
import com.android.server.wifi.hotspot2.soap.SoapParser;
import com.android.server.wifi.hotspot2.soap.SppResponseMessage;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.ksoap2.HeaderProperty;
@@ -431,14 +433,48 @@ public class OsuServerConnectionTest {
verify(mOsuServerCallbacks).onReceivedTrustRootCertificates(anyInt(),
argumentCaptor.capture());
- assertEquals(1, argumentCaptor.getValue().size());
- assertEquals(certificate,
+ Assert.assertEquals(1, argumentCaptor.getValue().size());
+ Assert.assertEquals(certificate,
argumentCaptor.getValue().get(OsuServerConnection.TRUST_CERT_TYPE_AAA).get(0));
} finally {
session.finishMocking();
}
}
+ /**
+ * Verifies that cleanup is properly called on the OsuServerHandlerThread.
+ */
+ @Test
+ public void verifyCleanup() throws Exception {
+ // static mocking
+ MockitoSession session = ExtendedMockito.mockitoSession().mockStatic(
+ HttpsTransport.class).mockStatic(SoapParser.class).startMocking();
+ try {
+ establishServerConnection();
+
+ SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
+ envelope.bodyIn = new SoapObject();
+ when(HttpsTransport.createInstance(any(Network.class), any(URL.class))).thenReturn(
+ mHttpsTransport);
+ when(SoapParser.getResponse(any(SoapObject.class))).thenReturn(mSppResponseMessage);
+
+ assertTrue(mOsuServerConnection.exchangeSoapMessage(envelope));
+
+ mLooper.dispatchAll();
+
+ verify(mHttpsServiceConnection).disconnect();
+ reset(mHttpsServiceConnection);
+
+ mOsuServerConnection.cleanup();
+ mLooper.dispatchAll();
+
+ verify(mUrlConnection).disconnect();
+ verify(mHttpsServiceConnection, never()).disconnect();
+ } finally {
+ session.finishMocking();
+ }
+ }
+
private void establishServerConnection() throws Exception {
mOsuServerConnection.init(mTlsContext, mDelegate);
mOsuServerConnection.setEventCallback(mOsuServerCallbacks);
diff --git a/tests/wifitests/src/com/android/server/wifi/hotspot2/soap/RedirectListenerTest.java b/tests/wifitests/src/com/android/server/wifi/hotspot2/soap/RedirectListenerTest.java
index 95b652064..308bb47e8 100644
--- a/tests/wifitests/src/com/android/server/wifi/hotspot2/soap/RedirectListenerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/hotspot2/soap/RedirectListenerTest.java
@@ -97,6 +97,9 @@ public class RedirectListenerTest {
mLooper.dispatchAll();
assertFalse(mRedirectListener.mIsStart);
+
+ // true if there are pending messages in the message queue
+ assertFalse(mLooper.isIdle());
}
/**