From f5a7c1647b86a50c8f87f8d8ee88e311fc38aa44 Mon Sep 17 00:00:00 2001 From: markchien Date: Thu, 6 Feb 2020 14:34:08 +0800 Subject: [PATCH] Always report non-null TetherStatesParcel Before this change, tetherStatesParcel may be null when there is no avaialbe tethering interface yet. TetheringManager should handle null case. But it is annoy to check null case each time and easy to have error. Report non-null empty TetherStatesParcel object instead. Bug: 148874619 Test: -build, flash, boot -atest TetheringTests -OFF/ON hotspot Change-Id: I0717e7958c9409648170498d5e76322207856de3 --- .../server/connectivity/tethering/Tethering.java | 14 +++++++++++++- .../connectivity/tethering/TetheringTest.java | 13 ++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Tethering/src/com/android/server/connectivity/tethering/Tethering.java b/Tethering/src/com/android/server/connectivity/tethering/Tethering.java index 5b35bb6e71..cec03ed4b9 100644 --- a/Tethering/src/com/android/server/connectivity/tethering/Tethering.java +++ b/Tethering/src/com/android/server/connectivity/tethering/Tethering.java @@ -1943,7 +1943,8 @@ public class Tethering { parcel.tetheringSupported = mDeps.isTetheringSupported(); parcel.upstreamNetwork = mTetherUpstream; parcel.config = mConfig.toStableParcelable(); - parcel.states = mTetherStatesParcel; + parcel.states = + mTetherStatesParcel != null ? mTetherStatesParcel : emptyTetherStatesParcel(); try { callback.onCallbackStarted(parcel); } catch (RemoteException e) { @@ -1952,6 +1953,17 @@ public class Tethering { }); } + private TetherStatesParcel emptyTetherStatesParcel() { + final TetherStatesParcel parcel = new TetherStatesParcel(); + parcel.availableList = new String[0]; + parcel.tetheredList = new String[0]; + parcel.localOnlyList = new String[0]; + parcel.erroredIfaceList = new String[0]; + parcel.lastErrorList = new int[0]; + + return parcel; + } + /** Unregister tethering event callback */ void unregisterTetheringEventCallback(ITetheringEventCallback callback) { mHandler.post(() -> { diff --git a/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringTest.java b/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringTest.java index e7c3e55670..a917849480 100644 --- a/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringTest.java +++ b/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringTest.java @@ -127,6 +127,7 @@ import com.android.internal.util.StateMachine; import com.android.internal.util.test.BroadcastInterceptingContext; import com.android.internal.util.test.FakeSettingsProvider; import com.android.networkstack.tethering.R; +import com.android.testutils.MiscAssertsKt; import org.junit.After; import org.junit.Before; @@ -1220,6 +1221,16 @@ public class TetheringTest { } } + private void assertTetherStatesNotNullButEmpty(final TetherStatesParcel parcel) { + assertFalse(parcel == null); + assertEquals(0, parcel.availableList.length); + assertEquals(0, parcel.tetheredList.length); + assertEquals(0, parcel.localOnlyList.length); + assertEquals(0, parcel.erroredIfaceList.length); + assertEquals(0, parcel.lastErrorList.length); + MiscAssertsKt.assertFieldCountEquals(5, TetherStatesParcel.class); + } + @Test public void testRegisterTetheringEventCallback() throws Exception { TestTetheringEventCallback callback = new TestTetheringEventCallback(); @@ -1232,7 +1243,7 @@ public class TetheringTest { callback.expectConfigurationChanged( mTethering.getTetheringConfiguration().toStableParcelable()); TetherStatesParcel tetherState = callback.pollTetherStatesChanged(); - assertEquals(tetherState, null); + assertTetherStatesNotNullButEmpty(tetherState); // 2. Enable wifi tethering. UpstreamNetworkState upstreamState = buildMobileDualStackUpstreamState(); when(mUpstreamNetworkMonitor.getCurrentPreferredUpstream()).thenReturn(upstreamState);