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