diff --git a/tools/hosttestlib/src/com/android/hosttest/DeviceConnector.java b/tools/hosttestlib/src/com/android/hosttest/DeviceConnector.java new file mode 100644 index 000000000..8974d71a3 --- /dev/null +++ b/tools/hosttestlib/src/com/android/hosttest/DeviceConnector.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.hosttest; + +import com.android.ddmlib.AndroidDebugBridge; +import com.android.ddmlib.IDevice; +import com.android.ddmlib.AndroidDebugBridge.IDeviceChangeListener; + + +/** + * A helper class that can connect to a ddmlib {@link IDevice} + */ +public class DeviceConnector { + + /** + * The maximum time to wait for a device to be connected. + */ + private static final int MAX_WAIT_DEVICE_TIME = 5000; + + /** + * Initializes DDMS library, and connects to specified Android device + * + * @param deviceSerial the device serial to connect to. If null connect to first + * discovered device. + * + * @return the {@link IDevice} found + * @throws IllegalArgumentException if no device cannot be found. + */ + public IDevice connectToDevice(String deviceSerial) { + // initialize DDMS with no clientSupport aka debugger support + AndroidDebugBridge.init(false /* clientSupport */); + AndroidDebugBridge adbBridge = AndroidDebugBridge.createBridge(); + for (IDevice device : adbBridge.getDevices()) { + if (deviceSerial == null) { + return device; + } else if (deviceSerial.equals(device.getSerialNumber())) { + return device; + } + } + // TODO: get some sort of logger interface as param instead + System.out.println("Waiting for device..."); + NewDeviceListener listener = new NewDeviceListener(deviceSerial); + AndroidDebugBridge.addDeviceChangeListener(listener); + IDevice device = listener.waitForDevice(MAX_WAIT_DEVICE_TIME); + AndroidDebugBridge.removeDeviceChangeListener(listener); + if (device == null) { + throw new IllegalArgumentException("Could not connect to device"); + } else { + System.out.println(String.format("Connected to %s", device.getSerialNumber())); + } + return device; + } + + /** + * Listener for new Android devices + */ + private static class NewDeviceListener implements IDeviceChangeListener { + private IDevice mDevice; + private String mSerial; + + public NewDeviceListener(String serial) { + mSerial = serial; + } + + public void deviceChanged(IDevice device, int changeMask) { + } + + public void deviceConnected(IDevice device) { + if (mSerial == null) { + setDevice(device); + } else if (mSerial.equals(device.getSerialNumber())) { + setDevice(device); + } + } + + private synchronized void setDevice(IDevice device) { + mDevice = device; + notify(); + } + + public void deviceDisconnected(IDevice device) { + } + + public IDevice waitForDevice(long waitTime) { + synchronized(this) { + if (mDevice == null) { + try { + wait(waitTime); + } catch (InterruptedException e) { + System.out.println("Waiting for device interrupted"); + } + } + } + return mDevice; + } + } +} diff --git a/tools/hosttestlib/src/com/android/hosttest/DeviceTestRunner.java b/tools/hosttestlib/src/com/android/hosttest/DeviceTestRunner.java index ab4ce5f38..31ba31c1a 100644 --- a/tools/hosttestlib/src/com/android/hosttest/DeviceTestRunner.java +++ b/tools/hosttestlib/src/com/android/hosttest/DeviceTestRunner.java @@ -71,7 +71,8 @@ public class DeviceTestRunner extends TestRunner { parentArgs.add(args[i]); } } - mDevice = connectToDevice(mDeviceSerial); + DeviceConnector connector = new DeviceConnector(); + mDevice = connector.connectToDevice(mDeviceSerial); return super.start(parentArgs.toArray(new String[parentArgs.size()])); } @@ -83,77 +84,6 @@ public class DeviceTestRunner extends TestRunner { return args[index]; } - /** - * Initializes DDMS library, and connects to specified Android device - * @param deviceSerial - * @return {@link IDevice} - * @throws IllegalArgumentException if specified device cannot be found - */ - private IDevice connectToDevice(String deviceSerial) { - // initialize DDMS with no clientSupport aka debugger support - AndroidDebugBridge.init(false /* clientSupport */); - AndroidDebugBridge adbBridge = AndroidDebugBridge.createBridge(); - for (IDevice device : adbBridge.getDevices()) { - if (deviceSerial == null) { - return device; - } else if (deviceSerial.equals(device.getSerialNumber())) { - return device; - } - } - System.out.println("Waiting for device..."); - NewDeviceListener listener = new NewDeviceListener(deviceSerial); - AndroidDebugBridge.addDeviceChangeListener(listener); - IDevice device = listener.waitForDevice(5000); - AndroidDebugBridge.removeDeviceChangeListener(listener); - if (device == null) { - throw new IllegalArgumentException("Could not connect to device"); - } - return device; - } - - /** - * Listener for new Android devices - */ - private static class NewDeviceListener implements IDeviceChangeListener { - private IDevice mDevice; - private String mSerial; - - public NewDeviceListener(String serial) { - mSerial = serial; - } - - public void deviceChanged(IDevice device, int changeMask) { - } - - public void deviceConnected(IDevice device) { - if (mSerial == null) { - setDevice(device); - } else if (mSerial.equals(device.getSerialNumber())) { - setDevice(device); - } - } - - private synchronized void setDevice(IDevice device) { - mDevice = device; - notify(); - } - - public void deviceDisconnected(IDevice device) { - } - - public IDevice waitForDevice(long waitTime) { - synchronized(this) { - if (mDevice == null) { - try { - wait(waitTime); - } catch (InterruptedException e) { - System.out.println("Waiting for device interrupted"); - } - } - } - return mDevice; - } - } /** * Main entry point. @@ -202,6 +132,7 @@ public class DeviceTestRunner extends TestRunner { /** * Override parent to create DeviceTestSuite wrapper, instead of TestSuite */ + @SuppressWarnings("unchecked") @Override protected TestResult runSingleMethod(String testCase, String method, boolean wait) throws Exception {