BluetoothStressTest.java revision e1d666b632608a2f708cb3df06c796e16d5d1717
114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe/*
214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe * Copyright (C) 2010 The Android Open Source Project
314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe *
414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe * Licensed under the Apache License, Version 2.0 (the "License");
514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe * you may not use this file except in compliance with the License.
614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe * You may obtain a copy of the License at
714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe *
814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe *      http://www.apache.org/licenses/LICENSE-2.0
914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe *
1014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe * Unless required by applicable law or agreed to in writing, software
1114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe * distributed under the License is distributed on an "AS IS" BASIS,
1214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe * See the License for the specific language governing permissions and
1414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe * limitations under the License.
1514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe */
1614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
1714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowepackage android.bluetooth;
1814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
19e1d666b632608a2f708cb3df06c796e16d5d1717Eric Roweimport java.io.BufferedWriter;
20e1d666b632608a2f708cb3df06c796e16d5d1717Eric Roweimport java.io.File;
21e1d666b632608a2f708cb3df06c796e16d5d1717Eric Roweimport java.io.FileWriter;
22e1d666b632608a2f708cb3df06c796e16d5d1717Eric Roweimport java.io.IOException;
23e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe
2414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Roweimport android.app.Instrumentation;
2514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Roweimport android.content.BroadcastReceiver;
2614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Roweimport android.content.Context;
2714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Roweimport android.content.Intent;
2814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Roweimport android.content.IntentFilter;
29e1d666b632608a2f708cb3df06c796e16d5d1717Eric Roweimport android.os.Environment;
3014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Roweimport android.test.InstrumentationTestCase;
3114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Roweimport android.util.Log;
3214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
3314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowepublic class BluetoothStressTest extends InstrumentationTestCase {
34e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe    private static final String TAG = "BluetoothStressTest";
35e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe    private static final String OUTPUT_FILE = "BluetoothStressTestOutput.txt";
3614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
3714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    /**
3814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe     * Timeout for {@link BluetoothAdapter#disable()} in ms.
3914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe     */
4014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private static final int DISABLE_TIMEOUT = 5000;
4114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
4214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    /**
4314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe     * Timeout for {@link BluetoothAdapter#enable()} in ms.
4414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe     */
4514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private static final int ENABLE_TIMEOUT = 20000;
4614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
4714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    /**
4814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe     * Timeout for {@link BluetoothAdapter#setScanMode(int)} in ms.
4914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe     */
5014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private static final int SET_SCAN_MODE_TIMEOUT = 5000;
5114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
5214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    /**
5314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe     * Timeout for {@link BluetoothAdapter#startDiscovery()} in ms.
5414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe     */
5514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private static final int START_DISCOVERY_TIMEOUT = 5000;
5614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
5714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    /**
5814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe     * Timeout for {@link BluetoothAdapter#cancelDiscovery()} in ms.
5914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe     */
6014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private static final int CANCEL_DISCOVERY_TIMEOUT = 5000;
6114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
6214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private static final int DISCOVERY_STARTED_FLAG = 1;
6314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private static final int DISCOVERY_FINISHED_FLAG = 1 << 1;
6414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private static final int SCAN_MODE_NONE_FLAG = 1 << 2;
6514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private static final int SCAN_MODE_CONNECTABLE_FLAG = 1 << 3;
6614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private static final int SCAN_MODE_CONNECTABLE_DISCOVERABLE_FLAG = 1 << 4;
6714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private static final int STATE_OFF_FLAG = 1 << 5;
6814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private static final int STATE_TURNING_ON_FLAG = 1 << 6;
6914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private static final int STATE_ON_FLAG = 1 << 7;
7014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private static final int STATE_TURNING_OFF_FLAG = 1 << 8;
7114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
7214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    /**
7314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe     * Time between polls in ms.
7414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe     */
7514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private static final int POLL_TIME = 100;
7614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
7714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private Context mContext;
7814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
7914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private Instrumentation mInstrumentation;
8014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
81e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe    private BufferedWriter mOutputWriter;
82e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe
8314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private class BluetoothReceiver extends BroadcastReceiver {
8414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        private int mFiredFlags = 0;
8514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
8614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        @Override
8714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        public void onReceive(Context context, Intent intent) {
8814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            synchronized (this) {
8914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(intent.getAction())) {
9014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    mFiredFlags |= DISCOVERY_STARTED_FLAG;
9114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(intent.getAction())) {
9214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    mFiredFlags |= DISCOVERY_FINISHED_FLAG;
9314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                } else if (BluetoothAdapter.ACTION_SCAN_MODE_CHANGED.equals(intent.getAction())) {
9414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    int mode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE,
9514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            BluetoothAdapter.ERROR);
9614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    assertNotSame(mode, BluetoothAdapter.ERROR);
9714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    switch (mode) {
9814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                        case BluetoothAdapter.SCAN_MODE_NONE:
9914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            mFiredFlags |= SCAN_MODE_NONE_FLAG;
10014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            break;
10114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                        case BluetoothAdapter.SCAN_MODE_CONNECTABLE:
10214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            mFiredFlags |= SCAN_MODE_CONNECTABLE_FLAG;
10314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            break;
10414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                        case BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE:
10514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            mFiredFlags |= SCAN_MODE_CONNECTABLE_DISCOVERABLE_FLAG;
10614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            break;
10714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    }
10814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                } else if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction())) {
10914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
11014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            BluetoothAdapter.ERROR);
11114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    assertNotSame(state, BluetoothAdapter.ERROR);
11214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    switch (state) {
11314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                        case BluetoothAdapter.STATE_OFF:
11414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            mFiredFlags |= STATE_OFF_FLAG;
11514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            break;
11614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                        case BluetoothAdapter.STATE_TURNING_ON:
11714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            mFiredFlags |= STATE_TURNING_ON_FLAG;
11814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            break;
11914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                        case BluetoothAdapter.STATE_ON:
12014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            mFiredFlags |= STATE_ON_FLAG;
12114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            break;
12214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                        case BluetoothAdapter.STATE_TURNING_OFF:
12314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            mFiredFlags |= STATE_TURNING_OFF_FLAG;
12414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                            break;
12514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    }
12614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                }
12714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            }
12814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
12914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
13014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        public int getFiredFlags() {
13114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            synchronized (this) {
13214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                return mFiredFlags;
13314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            }
13414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
13514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
13614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        public void resetFiredFlags() {
13714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            synchronized (this) {
13814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                mFiredFlags = 0;
13914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            }
14014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
14114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    }
14214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
14314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private BluetoothReceiver mReceiver = new BluetoothReceiver();
14414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
14514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    @Override
14614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    protected void setUp() throws Exception {
14714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        super.setUp();
14814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
14914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mInstrumentation = getInstrumentation();
15014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mContext = mInstrumentation.getTargetContext();
15114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
152e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        try {
153e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe            mOutputWriter = new BufferedWriter(new FileWriter(new File(
154e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                    Environment.getExternalStorageDirectory(), OUTPUT_FILE), true));
155e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        } catch (IOException e) {
156e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe            Log.w(TAG, "Test output file could not be opened", e);
157e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe            mOutputWriter = null;
158e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        }
159e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe
16014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        IntentFilter filter = new IntentFilter();
16114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
16214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
16314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        filter.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
16414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
16514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mContext.registerReceiver(mReceiver, filter);
16614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    }
16714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
16814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    @Override
16914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    protected void tearDown() throws Exception {
17014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        super.tearDown();
17114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
17214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mContext.unregisterReceiver(mReceiver);
173e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe
174e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        if (mOutputWriter != null) {
175e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe            try {
176e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                mOutputWriter.close();
177e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe            } catch (IOException e) {
178e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                Log.w(TAG, "Test output file could not be closed", e);
179e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe            }
180e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        }
18114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    }
18214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
183e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe    public void testEnable() {
184e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        int iterations = BluetoothTestRunner.sEnableIterations;
18514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
18614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
187e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        for (int i = 0; i < iterations; i++) {
188e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe            writeOutput("enable iteration " + (i + 1) + " of " + iterations);
18914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            enable(adapter);
19014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            disable(adapter);
19114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
19214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    }
19314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
19414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    public void testDiscoverable() {
195e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        int iterations = BluetoothTestRunner.sDiscoverableIterations;
19614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
19714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        enable(adapter);
19814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
199e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        for (int i = 0; i < iterations; i++) {
200e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe            writeOutput("discoverable iteration " + (i + 1) + " of " + iterations);
20114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            discoverable(adapter);
20214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            undiscoverable(adapter);
20314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
20414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
20514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        disable(adapter);
20614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    }
20714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
20814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    public void testScan() {
209e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        int iterations = BluetoothTestRunner.sScanIterations;
21014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
21114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        enable(adapter);
21214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
213e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        for (int i = 0; i < iterations; i++) {
214e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe            writeOutput("scan iteration " + (i + 1) + " of " + iterations);
21514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            startScan(adapter);
21614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            stopScan(adapter);
21714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
21814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
21914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        disable(adapter);
22014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    }
22114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
22214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private void disable(BluetoothAdapter adapter) {
22314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int mask = STATE_TURNING_OFF_FLAG | STATE_OFF_FLAG | SCAN_MODE_NONE_FLAG;
22414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mReceiver.resetFiredFlags();
22514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
22614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int state = adapter.getState();
22714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        switch (state) {
22814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            case BluetoothAdapter.STATE_OFF:
22914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertFalse(adapter.isEnabled());
23014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                return;
23114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            case BluetoothAdapter.STATE_ON:
23214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertTrue(adapter.isEnabled());
23314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertTrue(adapter.disable());
23414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                break;
23514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            case BluetoothAdapter.STATE_TURNING_ON:
23614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertFalse(adapter.isEnabled());
23714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertTrue(adapter.disable());
23814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                break;
23914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            case BluetoothAdapter.STATE_TURNING_OFF:
24014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertFalse(adapter.isEnabled());
24114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                mask = 0; // Don't check for received intents since we might have missed them.
24214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                break;
24314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            default:
244e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                fail("disable() invalid state: state=" + state);
24514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
24614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
24714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        long s = System.currentTimeMillis();
24814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        while (System.currentTimeMillis() - s < DISABLE_TIMEOUT) {
24914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            state = adapter.getState();
25014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            if (state == BluetoothAdapter.STATE_OFF) {
25114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertFalse(adapter.isEnabled());
25214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                if ((mReceiver.getFiredFlags() & mask) == mask) {
25314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    mReceiver.resetFiredFlags();
254e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                    writeOutput(String.format("disable() completed in %d ms",
255e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                            (System.currentTimeMillis() - s)));
25614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    return;
25714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                }
25814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            } else {
25914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertFalse(adapter.isEnabled());
26014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertEquals(BluetoothAdapter.STATE_TURNING_OFF, state);
26114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            }
26214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            sleep(POLL_TIME);
26314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
26414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
26514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int firedFlags = mReceiver.getFiredFlags();
26614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mReceiver.resetFiredFlags();
267e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        fail(String.format("disable() timeout: state=%d (expected %d), flags=0x%x (expected 0x%x)",
268e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                state, BluetoothAdapter.STATE_OFF, firedFlags, mask));
26914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    }
27014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
27114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private void enable(BluetoothAdapter adapter) {
27214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int mask = STATE_TURNING_ON_FLAG | STATE_ON_FLAG | SCAN_MODE_CONNECTABLE_FLAG;
27314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mReceiver.resetFiredFlags();
27414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
27514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int state = adapter.getState();
27614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        switch (state) {
27714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            case BluetoothAdapter.STATE_ON:
27814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertTrue(adapter.isEnabled());
27914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                return;
28014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            case BluetoothAdapter.STATE_OFF:
28114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            case BluetoothAdapter.STATE_TURNING_OFF:
28214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertFalse(adapter.isEnabled());
28314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertTrue(adapter.enable());
28414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                break;
28514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            case BluetoothAdapter.STATE_TURNING_ON:
28614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertFalse(adapter.isEnabled());
28714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                mask = 0; // Don't check for received intents since we might have missed them.
28814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                break;
28914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            default:
29014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                fail("enable() invalid state: state=" + state);
29114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
29214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
29314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        long s = System.currentTimeMillis();
29414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        while (System.currentTimeMillis() - s < ENABLE_TIMEOUT) {
29514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            state = adapter.getState();
29614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            if (state == BluetoothAdapter.STATE_ON) {
29714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertTrue(adapter.isEnabled());
29814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                if ((mReceiver.getFiredFlags() & mask) == mask) {
29914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    mReceiver.resetFiredFlags();
300e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                    writeOutput(String.format("enable() completed in %d ms",
301e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                            (System.currentTimeMillis() - s)));
30214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    return;
30314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                }
30414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            } else {
30514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertFalse(adapter.isEnabled());
30614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertEquals(BluetoothAdapter.STATE_TURNING_ON, state);
30714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            }
30814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            sleep(POLL_TIME);
30914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
31014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
31114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int firedFlags = mReceiver.getFiredFlags();
31214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mReceiver.resetFiredFlags();
313e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        fail(String.format("enable() timeout: state=%d (expected %d), flags=0x%x (expected 0x%x)",
314e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                state, BluetoothAdapter.STATE_ON, firedFlags, mask));
31514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    }
31614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
31714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private void discoverable(BluetoothAdapter adapter) {
31814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int mask = SCAN_MODE_CONNECTABLE_DISCOVERABLE_FLAG;
31914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mReceiver.resetFiredFlags();
32014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
32114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        if (!adapter.isEnabled()) {
32214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            fail("discoverable() bluetooth not enabled");
32314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
32414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
32514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int scanMode = adapter.getScanMode();
32614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        if (scanMode == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
32714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            return;
32814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
32914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
33014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        assertEquals(scanMode, BluetoothAdapter.SCAN_MODE_CONNECTABLE);
33114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        assertTrue(adapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE));
33214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
33314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        long s = System.currentTimeMillis();
33414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        while (System.currentTimeMillis() - s < SET_SCAN_MODE_TIMEOUT) {
33514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            scanMode = adapter.getScanMode();
33614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            if (scanMode == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
33714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                if ((mReceiver.getFiredFlags() & mask) == mask) {
33814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    mReceiver.resetFiredFlags();
339e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                    writeOutput(String.format("discoverable() completed in %d ms",
340e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                            (System.currentTimeMillis() - s)));
34114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    return;
34214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                }
34314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            } else {
34414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertEquals(scanMode, BluetoothAdapter.SCAN_MODE_CONNECTABLE);
34514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            }
34614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            sleep(POLL_TIME);
34714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
34814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
34914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int firedFlags = mReceiver.getFiredFlags();
35014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mReceiver.resetFiredFlags();
351e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        fail(String.format("discoverable() timeout: scanMode=%d (expected %d), flags=0x%x "
352e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                + "(expected 0x%x)", scanMode, BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE,
353e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                firedFlags, mask));
35414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    }
35514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
35614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private void undiscoverable(BluetoothAdapter adapter) {
35714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int mask = SCAN_MODE_CONNECTABLE_FLAG;
35814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mReceiver.resetFiredFlags();
35914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
36014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        if (!adapter.isEnabled()) {
361301c437b554e2152f3f6fffadc680f5cbf8e8231Eric Rowe            fail("undiscoverable() bluetooth not enabled");
36214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
36314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
36414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int scanMode = adapter.getScanMode();
36514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        if (scanMode == BluetoothAdapter.SCAN_MODE_CONNECTABLE) {
36614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            return;
36714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
36814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
36914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        assertEquals(scanMode, BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
37014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        assertTrue(adapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE));
37114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
37214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        long s = System.currentTimeMillis();
37314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        while (System.currentTimeMillis() - s < SET_SCAN_MODE_TIMEOUT) {
37414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            scanMode = adapter.getScanMode();
37514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            if (scanMode == BluetoothAdapter.SCAN_MODE_CONNECTABLE) {
37614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                if ((mReceiver.getFiredFlags() & mask) == mask) {
37714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    mReceiver.resetFiredFlags();
378e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                    writeOutput(String.format("undiscoverable() completed in %d ms",
379e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                            (System.currentTimeMillis() - s)));
38014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                    return;
38114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                }
38214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            } else {
38314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                assertEquals(scanMode, BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
38414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            }
38514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            sleep(POLL_TIME);
38614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
38714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
38814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int firedFlags = mReceiver.getFiredFlags();
38914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mReceiver.resetFiredFlags();
390e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        fail(String.format("undiscoverable() timeout: scanMode=%d (expected %d), flags=0x%x "
391e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                + "(expected 0x%x)", scanMode, BluetoothAdapter.SCAN_MODE_CONNECTABLE, firedFlags,
392e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                mask));
39314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    }
39414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
39514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private void startScan(BluetoothAdapter adapter) {
39614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int mask = DISCOVERY_STARTED_FLAG;
39714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mReceiver.resetFiredFlags();
39814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
39914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        if (!adapter.isEnabled()) {
400301c437b554e2152f3f6fffadc680f5cbf8e8231Eric Rowe            fail("startScan() bluetooth not enabled");
40114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
40214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
40314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        if (adapter.isDiscovering()) {
40414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            return;
40514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
40614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
40714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        assertTrue(adapter.startDiscovery());
40814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
40914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        long s = System.currentTimeMillis();
41014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        while (System.currentTimeMillis() - s < START_DISCOVERY_TIMEOUT) {
41114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            if (adapter.isDiscovering() && ((mReceiver.getFiredFlags() & mask) == mask)) {
41214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                mReceiver.resetFiredFlags();
413e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                writeOutput(String.format("startScan() completed in %d ms",
414e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                        (System.currentTimeMillis() - s)));
41514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                return;
41614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            }
41714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            sleep(POLL_TIME);
41814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
41914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
42014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int firedFlags = mReceiver.getFiredFlags();
42114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mReceiver.resetFiredFlags();
422e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        fail(String.format("startScan() timeout: isDiscovering=%b, flags=0x%x (expected 0x%x)",
423e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                adapter.isDiscovering(), firedFlags, mask));
42414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    }
42514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
42614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private void stopScan(BluetoothAdapter adapter) {
42714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int mask = DISCOVERY_FINISHED_FLAG;
42814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mReceiver.resetFiredFlags();
42914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
43014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        if (!adapter.isEnabled()) {
431301c437b554e2152f3f6fffadc680f5cbf8e8231Eric Rowe            fail("stopScan() bluetooth not enabled");
43214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
43314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
43414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        if (!adapter.isDiscovering()) {
43514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            return;
43614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
43714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
43814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        // TODO: put assertTrue() around cancelDiscovery() once it starts
43914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        // returning true.
44014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        adapter.cancelDiscovery();
44114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
44214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        long s = System.currentTimeMillis();
44314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        while (System.currentTimeMillis() - s < CANCEL_DISCOVERY_TIMEOUT) {
44414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            if (!adapter.isDiscovering() && ((mReceiver.getFiredFlags() & mask) == mask)) {
44514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                mReceiver.resetFiredFlags();
446e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                writeOutput(String.format("stopScan() completed in %d ms",
447e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                        (System.currentTimeMillis() - s)));
44814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe                return;
44914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            }
45014db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            sleep(POLL_TIME);
45114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
45214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
45314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        int firedFlags = mReceiver.getFiredFlags();
45414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        mReceiver.resetFiredFlags();
455e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        fail(String.format("stopScan() timeout: isDiscovering=%b, flags=0x%x (expected 0x%x)",
456e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe                adapter.isDiscovering(), firedFlags, mask));
457e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe
458e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe    }
459e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe
460e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe    private void writeOutput(String s) {
461e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        if (mOutputWriter == null) {
462e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe            return;
463e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        }
464e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        try {
465e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe            Log.i(TAG, s);
466e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe            mOutputWriter.write(s + "\n");
467e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe            mOutputWriter.flush();
468e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        } catch (IOException e) {
469e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe            Log.w(TAG, "Could not write to output file", e);
470e1d666b632608a2f708cb3df06c796e16d5d1717Eric Rowe        }
47114db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    }
47214db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe
47314db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    private void sleep(long time) {
47414db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        try {
47514db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe            Thread.sleep(time);
47614db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        } catch (InterruptedException e) {
47714db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe        }
47814db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe    }
47914db8d9978daf070f5e66ac8f2cdb1f4ee0dfe06Eric Rowe}
480