Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2618f26d authored by Yuchao Zhou's avatar Yuchao Zhou
Browse files

Update enable/disable code to reduce flakiness

Change-Id: I9d3f69ca583b365bb5f89cfe16adcd6e604614c6
parent b22a60f9
Loading
Loading
Loading
Loading
+58 −54
Original line number Diff line number Diff line
@@ -425,38 +425,40 @@ public class BluetoothTestUtils extends Assert {
     * @param adapter The BT adapter.
     */
    public void enable(BluetoothAdapter adapter) {
        int mask = (BluetoothReceiver.STATE_TURNING_ON_FLAG | BluetoothReceiver.STATE_ON_FLAG
                | BluetoothReceiver.SCAN_MODE_CONNECTABLE_FLAG);
        long start = System.currentTimeMillis();
        BluetoothReceiver receiver = getBluetoothReceiver(mask);

        writeOutput("Enabling Bluetooth adapter.");
        assertFalse(adapter.isEnabled());
        assertTrue(adapter.enable());

        int state = BluetoothAdapter.STATE_OFF;
        long s = System.currentTimeMillis();
        while (System.currentTimeMillis() - s < ENABLE_DISABLE_TIMEOUT) {
            state = adapter.getState();
            if (state == BluetoothAdapter.STATE_ON
                    && (receiver.getFiredFlags() & mask) == mask) {
                assertTrue(adapter.isEnabled());
                long finish = receiver.getCompletedTime();
                if (start != -1 && finish != -1) {
                    writeOutput(String.format("enable() completed in %d ms", (finish - start)));
                } else {
                    writeOutput("enable() completed");
                }
                removeReceiver(receiver);
        int btState = adapter.getState();
        final Semaphore completionSemaphore = new Semaphore(0);
        final BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                final String action = intent.getAction();
                if (!BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
                    return;
                }
            sleep(POLL_TIME);
                final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
                        BluetoothAdapter.ERROR);
                if (state == BluetoothAdapter.STATE_ON) {
                    completionSemaphore.release();
                }
            }
        };

        int firedFlags = receiver.getFiredFlags();
        removeReceiver(receiver);
        fail(String.format("enable() timeout: state=%d (expected %d), flags=0x%x (expected 0x%x)",
                state, BluetoothAdapter.STATE_ON, firedFlags, mask));
        final IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
        mContext.registerReceiver(receiver, filter);
        assertTrue(adapter.enable());
        boolean success = false;
        try {
            success = completionSemaphore.tryAcquire(ENABLE_DISABLE_TIMEOUT, TimeUnit.MILLISECONDS);
            writeOutput(String.format("enable() completed in 0 ms"));
        } catch (final InterruptedException e) {
            // This should never happen but just in case it does, the test will fail anyway.
        }
        mContext.unregisterReceiver(receiver);
        if (!success) {
            fail(String.format("enable() timeout: state=%d (expected %d)", btState,
                    BluetoothAdapter.STATE_ON));
        }
    }

    /**
@@ -466,38 +468,40 @@ public class BluetoothTestUtils extends Assert {
     * @param adapter The BT adapter.
     */
    public void disable(BluetoothAdapter adapter) {
        int mask = (BluetoothReceiver.STATE_TURNING_OFF_FLAG | BluetoothReceiver.STATE_OFF_FLAG
                | BluetoothReceiver.SCAN_MODE_NONE_FLAG);
        long start = System.currentTimeMillis();
        BluetoothReceiver receiver = getBluetoothReceiver(mask);

        writeOutput("Disabling Bluetooth adapter.");
        assertTrue(adapter.isEnabled());
        assertTrue(adapter.disable());

        int state = BluetoothAdapter.STATE_OFF;
        long s = System.currentTimeMillis();
        while (System.currentTimeMillis() - s < ENABLE_DISABLE_TIMEOUT) {
            state = adapter.getState();
            if (state == BluetoothAdapter.STATE_OFF
                    && (receiver.getFiredFlags() & mask) == mask) {
                assertFalse(adapter.isEnabled());
                long finish = receiver.getCompletedTime();
                if (start != -1 && finish != -1) {
                    writeOutput(String.format("disable() completed in %d ms", (finish - start)));
                } else {
                    writeOutput("disable() completed");
                }
                removeReceiver(receiver);
        int btState = adapter.getState();
        final Semaphore completionSemaphore = new Semaphore(0);
        final BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                final String action = intent.getAction();
                if (!BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
                    return;
                }
            sleep(POLL_TIME);
                final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
                        BluetoothAdapter.ERROR);
                if (state == BluetoothAdapter.STATE_OFF) {
                    completionSemaphore.release();
                }
            }
        };

        int firedFlags = receiver.getFiredFlags();
        removeReceiver(receiver);
        fail(String.format("disable() timeout: state=%d (expected %d), flags=0x%x (expected 0x%x)",
                state, BluetoothAdapter.STATE_OFF, firedFlags, mask));
        final IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
        mContext.registerReceiver(receiver, filter);
        assertTrue(adapter.disable());
        boolean success = false;
        try {
            success = completionSemaphore.tryAcquire(ENABLE_DISABLE_TIMEOUT, TimeUnit.MILLISECONDS);
            writeOutput(String.format("disable() completed in 0 ms"));
        } catch (final InterruptedException e) {
            // This should never happen but just in case it does, the test will fail anyway.
        }
        mContext.unregisterReceiver(receiver);
        if (!success) {
            fail(String.format("disable() timeout: state=%d (expected %d)", btState,
                    BluetoothAdapter.STATE_OFF));
        }
    }

    /**