summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java227
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java175
-rw-r--r--tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java120
3 files changed, 258 insertions, 264 deletions
diff --git a/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java b/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java
index 823a28d13..e5391f16b 100644
--- a/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java
@@ -45,6 +45,7 @@ import android.hardware.wifi.V1_0.IWifiEventCallback;
import android.hardware.wifi.V1_0.IWifiIface;
import android.hardware.wifi.V1_0.IWifiNanIface;
import android.hardware.wifi.V1_0.IWifiP2pIface;
+import android.hardware.wifi.V1_0.IWifiRttController;
import android.hardware.wifi.V1_0.IWifiStaIface;
import android.hardware.wifi.V1_0.IfaceType;
import android.hardware.wifi.V1_0.WifiStatus;
@@ -86,6 +87,7 @@ public class HalDeviceManagerTest {
private HalDeviceManager mDut;
@Mock IServiceManager mServiceManagerMock;
@Mock IWifi mWifiMock;
+ @Mock IWifiRttController mRttControllerMock;
@Mock HalDeviceManager.ManagerStatusListener mManagerStatusListenerMock;
@Mock private Clock mClock;
private TestLooper mTestLooper;
@@ -140,6 +142,7 @@ public class HalDeviceManagerTest {
when(mWifiMock.registerEventCallback(any(IWifiEventCallback.class))).thenReturn(mStatusOk);
when(mWifiMock.start()).thenReturn(mStatusOk);
when(mWifiMock.stop()).thenReturn(mStatusOk);
+ when(mWifiMock.isStarted()).thenReturn(true);
mDut = new HalDeviceManagerSpy();
}
@@ -519,6 +522,196 @@ public class HalDeviceManagerTest {
assertFalse(mDut.isSupported());
}
+ /**
+ * Validate RTT configuration when the callback is registered first and the chip is
+ * configured later - i.e. RTT isn't available immediately.
+ */
+ @Test
+ public void testAndTriggerRttLifecycleCallbacksRegBeforeChipConfig() throws Exception {
+ HalDeviceManager.InterfaceRttControllerLifecycleCallback cb = mock(
+ HalDeviceManager.InterfaceRttControllerLifecycleCallback.class);
+
+ InOrder io = inOrder(cb);
+
+ // initialize a test chip (V1 is fine since we're not testing any specifics of
+ // concurrency in this test).
+ ChipMockBase chipMock = new TestChipV1();
+ chipMock.initialize();
+ mInOrder = inOrder(mServiceManagerMock, mWifiMock, chipMock.chip,
+ mManagerStatusListenerMock);
+ executeAndValidateInitializationSequence();
+ executeAndValidateStartupSequence();
+
+ // register initial cb: don't expect RTT since chip isn't configured
+ mDut.registerRttControllerLifecycleCallback(cb, mHandler);
+ mTestLooper.dispatchAll();
+ io.verify(cb, times(0)).onNewRttController(any());
+
+ // create a STA - that will get the chip configured and get us an RTT controller
+ validateInterfaceSequence(chipMock,
+ false, // chipModeValid
+ -1000, // chipModeId (only used if chipModeValid is true)
+ IfaceType.STA,
+ "wlan0",
+ TestChipV1.STA_CHIP_MODE_ID,
+ false, // high priority
+ null, // tearDownList
+ null, // destroyedListener
+ null // availableListener
+ );
+ verify(chipMock.chip).createRttController(any(), any());
+ io.verify(cb).onNewRttController(any());
+
+ verifyNoMoreInteractions(cb);
+ }
+
+ /**
+ * Validate the RTT Controller lifecycle using a multi-mode chip (i.e. a chip which can
+ * switch modes, during which RTT is destroyed).
+ *
+ * 1. Validate that an RTT is created as soon as the callback is registered - if the chip
+ * is already configured (i.e. it is possible to create the RTT controller).
+ *
+ * 2. Validate that only the registered callback is triggered, not previously registered ones
+ * and not duplicate ones.
+ *
+ * 3. Validate that onDestroy callbacks are triggered on mode change.
+ */
+ @Test
+ public void testAndTriggerRttLifecycleCallbacksMultiModeChip() throws Exception {
+ HalDeviceManager.InterfaceRttControllerLifecycleCallback cb1 = mock(
+ HalDeviceManager.InterfaceRttControllerLifecycleCallback.class);
+ HalDeviceManager.InterfaceRttControllerLifecycleCallback cb2 = mock(
+ HalDeviceManager.InterfaceRttControllerLifecycleCallback.class);
+
+ InOrder io1 = inOrder(cb1);
+ InOrder io2 = inOrder(cb2);
+
+ // initialize a test chip (V1 is a must since we're testing a multi-mode chip) & create a
+ // STA (which will configure the chip).
+ ChipMockBase chipMock = new TestChipV1();
+ chipMock.initialize();
+ mInOrder = inOrder(mServiceManagerMock, mWifiMock, chipMock.chip,
+ mManagerStatusListenerMock);
+ executeAndValidateInitializationSequence();
+ executeAndValidateStartupSequence();
+ validateInterfaceSequence(chipMock,
+ false, // chipModeValid
+ -1000, // chipModeId (only used if chipModeValid is true)
+ IfaceType.STA,
+ "wlan0",
+ TestChipV1.STA_CHIP_MODE_ID,
+ false, // high priority
+ null, // tearDownList
+ null, // destroyedListener
+ null // availableListener
+ );
+ mInOrder.verify(chipMock.chip, times(0)).createRttController(any(), any());
+
+ // register initial cb - expect the cb right away
+ mDut.registerRttControllerLifecycleCallback(cb1, mHandler);
+ mTestLooper.dispatchAll();
+ verify(chipMock.chip).createRttController(any(), any());
+ io1.verify(cb1).onNewRttController(mRttControllerMock);
+
+ // register a second callback and the first one again
+ mDut.registerRttControllerLifecycleCallback(cb2, mHandler);
+ mDut.registerRttControllerLifecycleCallback(cb1, mHandler);
+ mTestLooper.dispatchAll();
+ io2.verify(cb2).onNewRttController(mRttControllerMock);
+
+ // change to AP mode (which for TestChipV1 doesn't allow RTT): trigger onDestroyed for all
+ validateInterfaceSequence(chipMock,
+ true, // chipModeValid
+ TestChipV1.STA_CHIP_MODE_ID, // chipModeId (only used if chipModeValid is true)
+ IfaceType.AP,
+ "wlan0",
+ TestChipV1.AP_CHIP_MODE_ID,
+ false, // high priority
+ null, // tearDownList
+ null, // destroyedListener
+ null // availableListener
+ );
+ mTestLooper.dispatchAll();
+ verify(chipMock.chip, times(2)).createRttController(any(), any()); // but returns a null!
+ io1.verify(cb1).onRttControllerDestroyed();
+ io2.verify(cb2).onRttControllerDestroyed();
+
+ // change back to STA mode (which for TestChipV1 will re-allow RTT): trigger onNew for all
+ validateInterfaceSequence(chipMock,
+ true, // chipModeValid
+ TestChipV1.AP_CHIP_MODE_ID, // chipModeId (only used if chipModeValid is true)
+ IfaceType.STA,
+ "wlan0",
+ TestChipV1.STA_CHIP_MODE_ID,
+ false, // high priority
+ null, // tearDownList
+ null, // destroyedListener
+ null // availableListener
+ );
+ mTestLooper.dispatchAll();
+ verify(chipMock.chip, times(3)).createRttController(any(), any());
+ io1.verify(cb1).onNewRttController(mRttControllerMock);
+ io2.verify(cb2).onNewRttController(mRttControllerMock);
+
+ verifyNoMoreInteractions(cb1, cb2);
+ }
+
+ /**
+ * Validate the RTT Controller lifecycle using a single-mode chip. Specifically validate
+ * that RTT isn't impacted during STA -> AP change.
+ */
+ @Test
+ public void testAndTriggerRttLifecycleCallbacksSingleModeChip() throws Exception {
+ HalDeviceManager.InterfaceRttControllerLifecycleCallback cb = mock(
+ HalDeviceManager.InterfaceRttControllerLifecycleCallback.class);
+
+ InOrder io = inOrder(cb);
+
+ // initialize a test chip (V2 is a must since we need a single mode chip)
+ // & create a STA (which will configure the chip).
+ ChipMockBase chipMock = new TestChipV2();
+ chipMock.initialize();
+ mInOrder = inOrder(mServiceManagerMock, mWifiMock, chipMock.chip,
+ mManagerStatusListenerMock);
+ executeAndValidateInitializationSequence();
+ executeAndValidateStartupSequence();
+ validateInterfaceSequence(chipMock,
+ false, // chipModeValid
+ -1000, // chipModeId (only used if chipModeValid is true)
+ IfaceType.STA,
+ "wlan0",
+ TestChipV2.CHIP_MODE_ID,
+ false, // high priority
+ null, // tearDownList
+ null, // destroyedListener
+ null // availableListener
+ );
+ mInOrder.verify(chipMock.chip, times(0)).createRttController(any(), any());
+
+ // register initial cb - expect the cb right away
+ mDut.registerRttControllerLifecycleCallback(cb, mHandler);
+ mTestLooper.dispatchAll();
+ verify(chipMock.chip).createRttController(any(), any());
+ io.verify(cb).onNewRttController(mRttControllerMock);
+
+ // create an AP: no mode change for TestChipV2 -> expect no impact on RTT
+ validateInterfaceSequence(chipMock,
+ true, // chipModeValid
+ TestChipV2.CHIP_MODE_ID, // chipModeId (only used if chipModeValid is true)
+ IfaceType.AP,
+ "wlan0",
+ TestChipV2.CHIP_MODE_ID,
+ false, // high priority
+ null, // tearDownList
+ null, // destroyedListener
+ null // availableListener
+ );
+ mTestLooper.dispatchAll();
+
+ verifyNoMoreInteractions(cb);
+ }
+
//////////////////////////////////////////////////////////////////////////////////////
// Chip Specific Tests - but should work on all chips!
// (i.e. add copies for each test chip)
@@ -2198,6 +2391,7 @@ public class HalDeviceManagerTest {
///////////////////////////////////////////////////////////////////////////////////////
// utilities
///////////////////////////////////////////////////////////////////////////////////////
+
private void dumpDut(String prefix) {
StringWriter sw = new StringWriter();
mDut.dump(null, new PrintWriter(sw), null);
@@ -2234,7 +2428,7 @@ public class HalDeviceManagerTest {
}
}
- private void executeAndValidateStartupSequence()throws Exception {
+ private void executeAndValidateStartupSequence() throws Exception {
executeAndValidateStartupSequence(1, true);
}
@@ -2684,6 +2878,7 @@ public class HalDeviceManagerTest {
}
public WifiStatus answer(int chipMode) {
+ mChipMockBase.chipModeValid = true;
mChipMockBase.chipModeId = chipMode;
return mStatusOk;
}
@@ -2784,6 +2979,24 @@ public class HalDeviceManagerTest {
}
}
+ private class CreateRttControllerAnswer extends MockAnswerUtil.AnswerWithArguments {
+ private final ChipMockBase mChipMockBase;
+ private final IWifiRttController mRttController;
+
+ CreateRttControllerAnswer(ChipMockBase chipMockBase, IWifiRttController rttController) {
+ mChipMockBase = chipMockBase;
+ mRttController = rttController;
+ }
+
+ public void answer(IWifiIface boundIface, IWifiChip.createRttControllerCallback cb) {
+ if (mChipMockBase.chipModeIdValidForRtt == mChipMockBase.chipModeId) {
+ cb.onValues(mStatusOk, mRttController);
+ } else {
+ cb.onValues(mStatusFail, null);
+ }
+ }
+ }
+
private class RemoveXxxIfaceAnswer extends MockAnswerUtil.AnswerWithArguments {
private ChipMockBase mChipMockBase;
private int mType;
@@ -2850,6 +3063,7 @@ public class HalDeviceManagerTest {
public int chipId;
public boolean chipModeValid = false;
public int chipModeId = -1000;
+ public int chipModeIdValidForRtt = -1; // single chip mode ID where RTT can be created
public Map<Integer, ArrayList<String>> interfaceNames = new HashMap<>();
public Map<Integer, Map<String, IWifiIface>> interfacesByName = new HashMap<>();
@@ -2900,6 +3114,9 @@ public class HalDeviceManagerTest {
anyString());
doAnswer(new RemoveXxxIfaceAnswer(this, IfaceType.NAN)).when(chip).removeNanIface(
anyString());
+
+ doAnswer(new CreateRttControllerAnswer(this, mRttControllerMock)).when(
+ chip).createRttController(any(), any());
}
}
@@ -2962,6 +3179,8 @@ public class HalDeviceManagerTest {
cm.availableCombinations.add(cic);
availableModes.add(cm);
+ chipModeIdValidForRtt = STA_CHIP_MODE_ID;
+
doAnswer(new GetAvailableModesAnswer(this)).when(chip)
.getAvailableModes(any(IWifiChip.getAvailableModesCallback.class));
}
@@ -3020,6 +3239,8 @@ public class HalDeviceManagerTest {
cm.availableCombinations.add(cic);
availableModes.add(cm);
+ chipModeIdValidForRtt = CHIP_MODE_ID;
+
doAnswer(new GetAvailableModesAnswer(this)).when(chip)
.getAvailableModes(any(IWifiChip.getAvailableModesCallback.class));
}
@@ -3090,6 +3311,8 @@ public class HalDeviceManagerTest {
cm.availableCombinations.add(cic);
availableModes.add(cm);
+ chipModeIdValidForRtt = CHIP_MODE_ID;
+
doAnswer(new GetAvailableModesAnswer(this)).when(chip)
.getAvailableModes(any(IWifiChip.getAvailableModesCallback.class));
}
@@ -3159,6 +3382,8 @@ public class HalDeviceManagerTest {
cm.availableCombinations.add(cic);
availableModes.add(cm);
+ chipModeIdValidForRtt = CHIP_MODE_ID;
+
doAnswer(new GetAvailableModesAnswer(this)).when(chip)
.getAvailableModes(any(IWifiChip.getAvailableModesCallback.class));
}
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java b/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java
index d5259c710..9ca722164 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java
@@ -48,15 +48,9 @@ import android.hardware.wifi.V1_0.IWifiApIface;
import android.hardware.wifi.V1_0.IWifiChip;
import android.hardware.wifi.V1_0.IWifiChipEventCallback;
import android.hardware.wifi.V1_0.IWifiIface;
-import android.hardware.wifi.V1_0.IWifiRttController;
-import android.hardware.wifi.V1_0.IWifiRttControllerEventCallback;
import android.hardware.wifi.V1_0.IWifiStaIface;
import android.hardware.wifi.V1_0.IWifiStaIfaceEventCallback;
import android.hardware.wifi.V1_0.IfaceType;
-import android.hardware.wifi.V1_0.RttBw;
-import android.hardware.wifi.V1_0.RttCapabilities;
-import android.hardware.wifi.V1_0.RttConfig;
-import android.hardware.wifi.V1_0.RttPreamble;
import android.hardware.wifi.V1_0.StaApfPacketFilterCapabilities;
import android.hardware.wifi.V1_0.StaBackgroundScanCapabilities;
import android.hardware.wifi.V1_0.StaBackgroundScanParameters;
@@ -86,7 +80,6 @@ import android.hardware.wifi.V1_2.IWifiChipEventCallback.RadioModeInfo;
import android.net.KeepalivePacketData;
import android.net.MacAddress;
import android.net.apf.ApfCapabilities;
-import android.net.wifi.RttManager;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiScanner;
@@ -154,8 +147,6 @@ public class WifiVendorHalTest {
private android.hardware.wifi.V1_2.IWifiStaIface mIWifiStaIfaceV12;
@Mock
private android.hardware.wifi.V1_3.IWifiStaIface mIWifiStaIfaceV13;
- @Mock
- private IWifiRttController mIWifiRttController;
private IWifiStaIfaceEventCallback mIWifiStaIfaceEventCallback;
private IWifiChipEventCallback mIWifiChipEventCallback;
private android.hardware.wifi.V1_2.IWifiChipEventCallback mIWifiChipEventCallbackV12;
@@ -310,7 +301,6 @@ public class WifiVendorHalTest {
when(mHalDeviceManager.removeIface(any())).thenReturn(true);
when(mHalDeviceManager.getChip(any(IWifiIface.class)))
.thenReturn(mIWifiChip);
- when(mHalDeviceManager.createRttController()).thenReturn(mIWifiRttController);
when(mIWifiChip.registerEventCallback(any(IWifiChipEventCallback.class)))
.thenReturn(mWifiStatusSuccess);
mIWifiStaIfaceEventCallback = null;
@@ -335,9 +325,6 @@ public class WifiVendorHalTest {
return (mWifiStatusSuccess);
}));
- when(mIWifiRttController.registerEventCallback(any(IWifiRttControllerEventCallback.class)))
- .thenReturn(mWifiStatusSuccess);
-
doAnswer(new AnswerWithArguments() {
public void answer(IWifiIface.getNameCallback cb)
throws RemoteException {
@@ -375,7 +362,6 @@ public class WifiVendorHalTest {
verify(mHalDeviceManager).start();
verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
- verify(mHalDeviceManager).createRttController();
verify(mHalDeviceManager).isReady();
verify(mHalDeviceManager).isStarted();
verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
@@ -400,7 +386,6 @@ public class WifiVendorHalTest {
verify(mHalDeviceManager).isStarted();
verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
- verify(mHalDeviceManager, never()).createRttController();
}
/**
@@ -424,7 +409,6 @@ public class WifiVendorHalTest {
verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
- verify(mHalDeviceManager, never()).createRttController();
verify(mIWifiStaIface, never())
.registerEventCallback(any(IWifiStaIfaceEventCallback.class));
}
@@ -445,7 +429,6 @@ public class WifiVendorHalTest {
verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
- verify(mHalDeviceManager, never()).createRttController();
verify(mIWifiStaIface, never())
.registerEventCallback(any(IWifiStaIfaceEventCallback.class));
}
@@ -455,26 +438,6 @@ public class WifiVendorHalTest {
* {@link WifiVendorHal#startVendorHalSta()}.
*/
@Test
- public void testStartHalFailureInRttControllerCreationInStaMode() throws Exception {
- when(mHalDeviceManager.createRttController()).thenReturn(null);
- assertFalse(mWifiVendorHal.startVendorHalSta());
- assertFalse(mWifiVendorHal.isHalStarted());
-
- verify(mHalDeviceManager).start();
- verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
- verify(mHalDeviceManager).createRttController();
- verify(mHalDeviceManager).stop();
- verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
-
- verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
- verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
- }
-
- /**
- * Tests the failure to start HAL in STA mode using
- * {@link WifiVendorHal#startVendorHalSta()}.
- */
- @Test
public void testStartHalFailureInChipGetInStaMode() throws Exception {
when(mHalDeviceManager.getChip(any(IWifiIface.class))).thenReturn(null);
assertFalse(mWifiVendorHal.startVendorHalSta());
@@ -482,7 +445,6 @@ public class WifiVendorHalTest {
verify(mHalDeviceManager).start();
verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
- verify(mHalDeviceManager).createRttController();
verify(mHalDeviceManager).getChip(any(IWifiIface.class));
verify(mHalDeviceManager).stop();
verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
@@ -506,7 +468,6 @@ public class WifiVendorHalTest {
verify(mHalDeviceManager).stop();
verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
- verify(mHalDeviceManager, never()).createRttController();
verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
verify(mHalDeviceManager, never()).createApIface(any(), eq(null));
}
@@ -524,7 +485,6 @@ public class WifiVendorHalTest {
verify(mHalDeviceManager).start();
verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
- verify(mHalDeviceManager).createRttController();
verify(mHalDeviceManager).getChip(any(IWifiIface.class));
verify(mHalDeviceManager).stop();
verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
@@ -549,7 +509,6 @@ public class WifiVendorHalTest {
verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
verify(mHalDeviceManager, never()).getChip(any(IWifiIface.class));
- verify(mHalDeviceManager, never()).createRttController();
}
/**
@@ -568,7 +527,6 @@ public class WifiVendorHalTest {
verify(mHalDeviceManager).stop();
verify(mHalDeviceManager).createStaIface(eq(false), any(), eq(null));
verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
- verify(mHalDeviceManager).createRttController();
verify(mHalDeviceManager, times(2)).isReady();
verify(mHalDeviceManager, times(2)).isStarted();
@@ -595,7 +553,6 @@ public class WifiVendorHalTest {
verify(mHalDeviceManager, times(2)).isStarted();
verify(mHalDeviceManager, never()).createStaIface(anyBoolean(), any(), eq(null));
- verify(mHalDeviceManager, never()).createRttController();
}
/**
@@ -615,7 +572,6 @@ public class WifiVendorHalTest {
verify(mHalDeviceManager).createStaIface(eq(false), internalListenerCaptor.capture(),
eq(null));
verify(mHalDeviceManager).getChip(eq(mIWifiStaIface));
- verify(mHalDeviceManager).createRttController();
verify(mHalDeviceManager).isReady();
verify(mHalDeviceManager).isStarted();
verify(mIWifiStaIface).registerEventCallback(any(IWifiStaIfaceEventCallback.class));
@@ -1103,137 +1059,6 @@ public class WifiVendorHalTest {
assertEquals(2, ex);
}
-
- /**
- * Test translations of RTT type
- */
- @Test
- public void testRttTypeTranslation() throws Exception {
- checkRoundTripIntTranslation(
- (y) -> WifiVendorHal.halRttTypeFromFrameworkRttType(y),
- (x) -> WifiVendorHal.frameworkRttTypeFromHalRttType(x),
- 1, 3);
- }
-
- /**
- * Test translations of peer type
- */
- @Test
- public void testPeerTranslation() throws Exception {
- checkRoundTripIntTranslation(
- (y) -> WifiVendorHal.halPeerFromFrameworkPeer(y),
- (x) -> WifiVendorHal.frameworkPeerFromHalPeer(x),
- 1, 6);
- }
-
- /**
- * Test translations of channel width
- */
- @Test
- public void testChannelWidth() throws Exception {
- checkRoundTripIntTranslation(
- (y) -> WifiVendorHal.halChannelWidthFromFrameworkChannelWidth(y),
- (x) -> WifiVendorHal.frameworkChannelWidthFromHalChannelWidth(x),
- 0, 5);
- }
-
- /**
- * Test translations of preamble type mask
- */
- @Test
- public void testPreambleTranslation() throws Exception {
- checkRoundTripIntTranslation(
- (y) -> WifiVendorHal.halPreambleFromFrameworkPreamble(y),
- (x) -> WifiVendorHal.frameworkPreambleFromHalPreamble(x),
- 0, 8);
- }
-
- /**
- * Test translations of bandwidth mask
- */
- @Test
- public void testBandwidthTranslations() throws Exception {
- checkRoundTripIntTranslation(
- (y) -> WifiVendorHal.halBwFromFrameworkBw(y),
- (x) -> WifiVendorHal.frameworkBwFromHalBw(x),
- 0, 64);
- }
-
- /**
- * Test translation of framwork RttParams to hal RttConfig
- */
- @Test
- public void testGetRttStuff() throws Exception {
- RttManager.RttParams params = new RttManager.RttParams();
- params.bssid = "03:01:04:01:05:09";
- params.frequency = 2420;
- params.channelWidth = ScanResult.CHANNEL_WIDTH_40MHZ;
- params.centerFreq0 = 2440;
- params.centerFreq1 = 1;
- params.num_samples = 2;
- params.num_retries = 3;
- params.numberBurst = 4;
- params.interval = 5;
- params.numSamplesPerBurst = 8;
- params.numRetriesPerMeasurementFrame = 6;
- params.numRetriesPerFTMR = 7;
- params.LCIRequest = false;
- params.LCRRequest = false;
- params.burstTimeout = 15;
- String frameish = params.toString();
- assertFalse(frameish.contains("=0,")); // make sure all fields are initialized
- RttConfig config = WifiVendorHal.halRttConfigFromFrameworkRttParams(params);
- String halish = config.toString();
- StringBuffer expect = new StringBuffer(200);
- expect.append("{.addr = [3, 1, 4, 1, 5, 9], .type = ONE_SIDED, .peer = AP, ");
- expect.append(".channel = {.width = WIDTH_40, .centerFreq = 2420, ");
- expect.append(".centerFreq0 = 2440, .centerFreq1 = 1}, ");
- expect.append(".burstPeriod = 5, .numBurst = 4, .numFramesPerBurst = 8, ");
- expect.append(".numRetriesPerRttFrame = 6, .numRetriesPerFtmr = 7, ");
- expect.append(".mustRequestLci = false, .mustRequestLcr = false, .burstDuration = 15, ");
- expect.append(".preamble = HT, .bw = BW_20MHZ}");
- assertEquals(expect.toString(), halish);
- }
-
- /**
- * Test that RTT capabilities are plumbed through
- */
- @Test
- public void testGetRttCapabilities() throws Exception {
- RttCapabilities capabilities = new RttCapabilities();
- capabilities.lcrSupported = true;
- capabilities.preambleSupport = RttPreamble.LEGACY | RttPreamble.VHT;
- capabilities.bwSupport = RttBw.BW_5MHZ | RttBw.BW_20MHZ;
- capabilities.mcVersion = 43;
- doAnswer(new AnswerWithArguments() {
- public void answer(IWifiRttController.getCapabilitiesCallback cb)
- throws RemoteException {
- cb.onValues(mWifiStatusSuccess, capabilities);
- }
- }).when(mIWifiRttController).getCapabilities(any(
- IWifiRttController.getCapabilitiesCallback.class));
-
- assertNull(mWifiVendorHal.getRttCapabilities());
-
- assertTrue(mWifiVendorHal.startVendorHalSta());
-
- RttManager.RttCapabilities actual = mWifiVendorHal.getRttCapabilities();
- assertTrue(actual.lcrSupported);
- assertEquals(RttManager.PREAMBLE_LEGACY | RttManager.PREAMBLE_VHT,
- actual.preambleSupported);
- assertEquals(RttManager.RTT_BW_5_SUPPORT | RttManager.RTT_BW_20_SUPPORT,
- actual.bwSupported);
- assertEquals(43, (int) capabilities.mcVersion);
- }
-
- /**
- * Negative test of disableRttResponder
- */
- @Test
- public void testDisableOfUnstartedRtt() throws Exception {
- assertFalse(mWifiVendorHal.disableRttResponder());
- }
-
/**
* Test that setScanningMacOui is hooked up to the HAL correctly
*/
diff --git a/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java b/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java
index 751a6a4ee..59ef71666 100644
--- a/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java
@@ -23,7 +23,7 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
@@ -52,13 +52,10 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;
import org.mockito.ArgumentCaptor;
-import org.mockito.InOrder;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
/**
@@ -68,12 +65,14 @@ import java.util.List;
public class RttNativeTest {
private RttNative mDut;
private WifiStatus mStatusSuccess;
- private WifiStatus mStatusRttControllerInvalid;
private ArgumentCaptor<ArrayList> mRttConfigCaptor = ArgumentCaptor.forClass(ArrayList.class);
private ArgumentCaptor<List> mRttResultCaptor = ArgumentCaptor.forClass(List.class);
private ArgumentCaptor<HalDeviceManager.ManagerStatusListener> mHdmStatusListener =
ArgumentCaptor.forClass(HalDeviceManager.ManagerStatusListener.class);
+ private ArgumentCaptor<HalDeviceManager.InterfaceRttControllerLifecycleCallback>
+ mRttLifecycleCbCaptor = ArgumentCaptor.forClass(
+ HalDeviceManager.InterfaceRttControllerLifecycleCallback.class);
private ArgumentCaptor<IWifiRttController.getCapabilitiesCallback> mGetCapCbCatpr =
ArgumentCaptor.forClass(IWifiRttController.getCapabilitiesCallback.class);
@@ -94,7 +93,6 @@ public class RttNativeTest {
MockitoAnnotations.initMocks(this);
when(mockHalDeviceManager.isStarted()).thenReturn(true);
- when(mockHalDeviceManager.createRttController()).thenReturn(mockRttController);
mStatusSuccess = new WifiStatus();
mStatusSuccess.code = WifiStatusCode.SUCCESS;
@@ -104,12 +102,12 @@ public class RttNativeTest {
when(mockRttController.rangeCancel(anyInt(), any(ArrayList.class))).thenReturn(
mStatusSuccess);
- mStatusRttControllerInvalid = new WifiStatus();
- mStatusRttControllerInvalid.code = WifiStatusCode.ERROR_WIFI_RTT_CONTROLLER_INVALID;
-
mDut = new RttNative(mockRttServiceImpl, mockHalDeviceManager);
mDut.start(null);
- verify(mockHalDeviceManager).registerStatusListener(mHdmStatusListener.capture(), any());
+ verify(mockHalDeviceManager).initialize();
+ verify(mockHalDeviceManager).registerRttControllerLifecycleCallback(
+ mRttLifecycleCbCaptor.capture(), any());
+ mRttLifecycleCbCaptor.getValue().onNewRttController(mockRttController);
verify(mockRttController).registerEventCallback(any());
verify(mockRttServiceImpl).enableIfPossible();
verify(mockRttController).getCapabilities(mGetCapCbCatpr.capture());
@@ -334,18 +332,35 @@ public class RttNativeTest {
int cmdId = 55;
RangingRequest request = RttTestUtils.getDummyRangingRequest((byte) 0);
- InOrder order = inOrder(mockRttServiceImpl);
-
- // (1) configure Wi-Fi down and send a status change indication
- when(mockHalDeviceManager.isStarted()).thenReturn(false);
- mHdmStatusListener.getValue().onStatusChanged();
- order.verify(mockRttServiceImpl).disable();
+ // (1) simulate Wi-Fi down and send a status change indication
+ mRttLifecycleCbCaptor.getValue().onRttControllerDestroyed();
+ verify(mockRttServiceImpl).disable();
assertFalse(mDut.isReady());
// (2) issue range request
mDut.rangeRequest(cmdId, request, true);
- order.verify(mockRttServiceImpl).disable(); // due to re-init attempt
+ verifyNoMoreInteractions(mockRttServiceImpl, mockRttController);
+ }
+
+ /**
+ * Validate that we react correctly (i.e. enable/disable global RTT availability) when
+ * notified that the RTT controller has disappear and appeared.
+ */
+ @Test
+ public void testRttControllerLifecycle() throws Exception {
+ // RTT controller disappears
+ mRttLifecycleCbCaptor.getValue().onRttControllerDestroyed();
+ verify(mockRttServiceImpl).disable();
+ assertFalse(mDut.isReady());
+
+ // RTT controller re-appears (verification is x2 since 1st time is in setup())
+ mRttLifecycleCbCaptor.getValue().onNewRttController(mockRttController);
+ verify(mockRttController, times(2)).registerEventCallback(any());
+ verify(mockRttServiceImpl, times(2)).enableIfPossible();
+ verify(mockRttController, times(2)).getCapabilities(mGetCapCbCatpr.capture());
+ assertTrue(mDut.isReady());
+
verifyNoMoreInteractions(mockRttServiceImpl, mockRttController);
}
@@ -449,77 +464,6 @@ public class RttNativeTest {
}
}
- /**
- * Validate correct re-initialization when the RTT Controller is invalid (which can happen
- * due to mode change in the HAL). Expect a re-initialization and a rerun of the range request.
- */
- @Test
- public void testRangeRequestInvalidRttControllerOnce() throws Exception {
- int cmdId = 55;
- RangingRequest request = RttTestUtils.getDummyRangingRequest((byte) 0);
-
- InOrder inOrder = Mockito.inOrder(mockRttController);
-
- // configure failure then success
- when(mockRttController.rangeRequest(anyInt(), any(ArrayList.class))).thenReturn(
- mStatusRttControllerInvalid).thenReturn(mStatusSuccess);
-
- // issue range request
- boolean result = mDut.rangeRequest(cmdId, request, true);
- assertTrue("rangeRequest should succeeed", result);
-
- // verify HAL call
- inOrder.verify(mockRttController).rangeRequest(eq(cmdId), mRttConfigCaptor.capture());
- ArrayList<RttConfig> halRequest1 = mRttConfigCaptor.getValue();
-
- // verify re-initialization (i.e. callback re-registered)
- inOrder.verify(mockRttController).registerEventCallback(any());
-
- // verify HAL call
- inOrder.verify(mockRttController).rangeRequest(eq(cmdId), mRttConfigCaptor.capture());
- ArrayList<RttConfig> halRequest2 = mRttConfigCaptor.getValue();
-
- assertTrue("HAL parameters different between calls!",
- Arrays.equals(halRequest1.toArray(), halRequest2.toArray()));
- verifyNoMoreInteractions(mockRttController);
- }
-
- /**
- * Validate correct re-initialization when the RTT Controller is invalid (which can happen
- * due to mode change in the HAL). Expect a re-initialization and a rerun of the range request -
- * but only once (no infinite loop).
- */
- @Test
- public void testRangeRequestInvalidRttControllerForever() throws Exception {
- int cmdId = 55;
- RangingRequest request = RttTestUtils.getDummyRangingRequest((byte) 0);
-
- InOrder inOrder = Mockito.inOrder(mockRttController);
-
- // configure failure
- when(mockRttController.rangeRequest(anyInt(), any(ArrayList.class))).thenReturn(
- mStatusRttControllerInvalid);
-
- // issue range request
- boolean result = mDut.rangeRequest(cmdId, request, true);
- assertFalse("rangeRequest should fail", result);
-
- // verify HAL call
- inOrder.verify(mockRttController).rangeRequest(eq(cmdId), mRttConfigCaptor.capture());
- ArrayList<RttConfig> halRequest1 = mRttConfigCaptor.getValue();
-
- // verify re-initialization (i.e. callback re-registered)
- inOrder.verify(mockRttController).registerEventCallback(any());
-
- // verify HAL call
- inOrder.verify(mockRttController).rangeRequest(eq(cmdId), mRttConfigCaptor.capture());
- ArrayList<RttConfig> halRequest2 = mRttConfigCaptor.getValue();
-
- assertTrue("HAL parameters different between calls!",
- Arrays.equals(halRequest1.toArray(), halRequest2.toArray()));
- verifyNoMoreInteractions(mockRttController);
- }
-
// Utilities
/**