diff options
author | Ecco Park <eccopark@google.com> | 2019-01-11 16:10:07 -0800 |
---|---|---|
committer | Ecco Park <eccopark@google.com> | 2019-01-14 16:42:05 -0800 |
commit | 31b4320747cb9406252997e921a9e81964449cd5 (patch) | |
tree | d64b83f3027796c26b414ab3a92e985603d24c0f /tests/wifitests/src/com/android/server/wifi/hotspot2 | |
parent | 3067b923baf0c6b04b5777a7107d8b8c2f9b45bc (diff) | |
download | android_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.java | 42 | ||||
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/hotspot2/soap/RedirectListenerTest.java | 3 |
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()); } /** |