/*
* Copyright (C) 2014 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.sdklib.devices;
import com.android.resources.Keyboard;
import com.android.resources.Navigation;
import com.android.sdklib.ISystemImage;
import com.android.sdklib.SdkManagerTestCase;
import com.android.sdklib.SystemImage;
import com.android.sdklib.devices.Device.Builder;
import com.android.sdklib.devices.DeviceManager.DeviceFilter;
import com.android.sdklib.devices.DeviceManager.DeviceStatus;
import com.android.sdklib.mock.MockLog;
import com.android.sdklib.repository.descriptors.IdDisplay;
import java.io.File;
import java.util.*;
public class DeviceManagerTest extends SdkManagerTestCase {
private DeviceManager dm;
private MockLog log;
@Override
public void setUp() throws Exception {
super.setUp();
dm = createDeviceManager();
}
private DeviceManager createDeviceManager() {
log = super.getLog();
File sdkLocation = getSdkManager().getLocalSdk().getLocation();
return DeviceManager.createInstance(sdkLocation, log);
}
/**
* Returns a list of just the devices' display names, for unit test comparisons.
*/
private static String listDisplayName(Device device) {
if (device == null) {
return null;
}
return device.getDisplayName();
}
/**
* Returns a list of just the devices' display names, for unit test comparisons.
*/
private static List<String> listDisplayNames(Collection<Device> devices) {
if (devices == null) {
return null;
}
List<String> names = new ArrayList<String>();
for (Device d : devices) {
names.add(listDisplayName(d));
}
Collections.sort(names);
return names;
}
@Override
public void tearDown() throws Exception {
super.tearDown();
}
public final void testGetDevices_Default() {
// no user devices defined in the test's custom .android home folder
assertEquals("[]", dm.getDevices(DeviceFilter.USER).toString());
assertEquals("", log.toString());
// no system-images devices defined in the SDK by default
assertEquals("[]", dm.getDevices(DeviceFilter.SYSTEM_IMAGES).toString());
assertEquals("", log.toString());
// this list comes from devices.xml bundled in the JAR
// cf /sdklib/src/main/java/com/android/sdklib/devices/devices.xml
assertEquals(
"[10.1\" WXGA (Tablet), 2.7\" QVGA, 2.7\" QVGA slider, " +
"3.2\" HVGA slider (ADP1), 3.2\" QVGA (ADP2), 3.3\" WQVGA, 3.4\" WQVGA, " +
"3.7\" FWVGA slider, 3.7\" WVGA (Nexus One), 4\" WVGA (Nexus S), " +
"4.65\" 720p (Galaxy Nexus), 4.7\" WXGA, 5.1\" WVGA, 5.4\" FWVGA, " +
"7\" WSVGA (Tablet)]",
listDisplayNames(dm.getDevices(DeviceFilter.DEFAULT)).toString());
assertEquals("", log.toString());
assertEquals("2.7\" QVGA",
listDisplayName(dm.getDevice("2.7in QVGA", "Generic")));
// this list comes from the nexus.xml bundled in the JAR
// cf /sdklib/src/main/java/com/android/sdklib/devices/nexus.xml
assertEquals("[Android TV (1080p), Android TV (720p), Android Wear Round, " +
"Android Wear Round Chin, Android Wear Square, " +
"Galaxy Nexus, Nexus 10, Nexus 4, Nexus 5, Nexus 6, Nexus 7, " +
"Nexus 7 (2012), Nexus 9, Nexus One, Nexus S]",
listDisplayNames(dm.getDevices(DeviceFilter.VENDOR)).toString());
assertEquals("", log.toString());
assertEquals("Nexus One",
listDisplayName(dm.getDevice("Nexus One", "Google")));
assertEquals(
"[10.1\" WXGA (Tablet), 2.7\" QVGA, 2.7\" QVGA slider, 3.2\" HVGA slider (ADP1), " +
"3.2\" QVGA (ADP2), 3.3\" WQVGA, 3.4\" WQVGA, 3.7\" FWVGA slider, " +
"3.7\" WVGA (Nexus One), 4\" WVGA (Nexus S), 4.65\" 720p (Galaxy Nexus), " +
"4.7\" WXGA, 5.1\" WVGA, 5.4\" FWVGA, 7\" WSVGA (Tablet), Android TV (1080p), "
+
"Android TV (720p), Android Wear Round, Android Wear Round Chin, " +
"Android Wear Square, Galaxy Nexus, Nexus 10, Nexus 4, Nexus 5, " +
"Nexus 6, Nexus 7, Nexus 7 (2012), Nexus 9, Nexus One, Nexus S]",
listDisplayNames(dm.getDevices(DeviceManager.ALL_DEVICES)).toString());
assertEquals("", log.toString());
}
public final void testGetDevice() {
// get a definition from the bundled devices.xml file
Device d1 = dm.getDevice("7in WSVGA (Tablet)", "Generic");
assertEquals("7\" WSVGA (Tablet)", d1.getDisplayName());
assertEquals("", log.toString());
// get a definition from the bundled nexus.xml file
Device d2 = dm.getDevice("Nexus One", "Google");
assertEquals("Nexus One", d2.getDisplayName());
assertEquals("", log.toString());
}
public final void testGetDevices_UserDevice() {
Device d1 = dm.getDevice("7in WSVGA (Tablet)", "Generic");
Builder b = new Device.Builder(d1);
b.setId("MyCustomTablet");
b.setName("My Custom Tablet");
b.setManufacturer("OEM");
Device d2 = b.build();
dm.addUserDevice(d2);
dm.saveUserDevices();
assertEquals("My Custom Tablet", dm.getDevice("MyCustomTablet", "OEM").getDisplayName());
assertEquals("", log.toString());
// create a new device manager, forcing it reload all files
dm = null;
DeviceManager dm2 = createDeviceManager();
assertEquals("My Custom Tablet", dm2.getDevice("MyCustomTablet", "OEM").getDisplayName());
assertEquals("", log.toString());
// 1 user device defined in the test's custom .android home folder
assertEquals("[My Custom Tablet]",
listDisplayNames(dm2.getDevices(DeviceFilter.USER)).toString());
assertEquals("", log.toString());
// no system-images devices defined in the SDK by default
assertEquals("[]",
listDisplayNames(dm2.getDevices(DeviceFilter.SYSTEM_IMAGES)).toString());
assertEquals("", log.toString());
// this list comes from devices.xml bundled in the JAR
// cf /sdklib/src/main/java/com/android/sdklib/devices/devices.xml
assertEquals(
"[10.1\" WXGA (Tablet), 2.7\" QVGA, 2.7\" QVGA slider, 3.2\" HVGA slider (ADP1), " +
"3.2\" QVGA (ADP2), 3.3\" WQVGA, 3.4\" WQVGA, 3.7\" FWVGA slider, " +
"3.7\" WVGA (Nexus One), 4\" WVGA (Nexus S), 4.65\" 720p (Galaxy Nexus), " +
"4.7\" WXGA, 5.1\" WVGA, 5.4\" FWVGA, 7\" WSVGA (Tablet)]",
listDisplayNames(dm2.getDevices(DeviceFilter.DEFAULT)).toString());
assertEquals("", log.toString());
// this list comes from the nexus.xml bundled in the JAR
// cf /sdklib/src/main/java/com/android/sdklib/devices/nexus.xml
assertEquals("[Android TV (1080p), Android TV (720p), Android Wear Round, " +
"Android Wear Round Chin, Android Wear Square, Galaxy Nexus, " +
"Nexus 10, Nexus 4, Nexus 5, Nexus 6, Nexus 7, Nexus 7 (2012), " +
"Nexus 9, Nexus One, Nexus S]",
listDisplayNames(dm2.getDevices(DeviceFilter.VENDOR)).toString());
assertEquals("", log.toString());
assertEquals(
"[10.1\" WXGA (Tablet), 2.7\" QVGA, 2.7\" QVGA slider, 3.2\" HVGA slider (ADP1), " +
"3.2\" QVGA (ADP2), 3.3\" WQVGA, 3.4\" WQVGA, 3.7\" FWVGA slider, " +
"3.7\" WVGA (Nexus One), 4\" WVGA (Nexus S), 4.65\" 720p (Galaxy Nexus), " +
"4.7\" WXGA, 5.1\" WVGA, 5.4\" FWVGA, 7\" WSVGA (Tablet), Android TV (1080p), "
+
"Android TV (720p), Android Wear Round, Android Wear Round Chin, " +
"Android Wear Square, Galaxy Nexus, My Custom Tablet, Nexus 10, " +
"Nexus 4, Nexus 5, Nexus 6, Nexus 7, Nexus 7 (2012), Nexus 9, Nexus One, Nexus S]",
listDisplayNames(dm2.getDevices(DeviceManager.ALL_DEVICES)).toString());
assertEquals("", log.toString());
}
public final void testGetDevices_SysImgDevice() throws Exception {
// this adds a devices.xml with one device
makeSystemImageFolder(TARGET_DIR_NAME_0, "tag-1", "x86");
// no user devices defined in the test's custom .android home folder
assertEquals("[]", listDisplayNames(dm.getDevices(DeviceFilter.USER)).toString());
assertEquals("", log.toString());
// find the system-images specific device added by makeSystemImageFolder above
// using both the getDevices() API and the device-specific getDevice() API.
assertEquals("[Mock Tag 1 Device Name]",
listDisplayNames(dm.getDevices(DeviceFilter.SYSTEM_IMAGES)).toString());
assertEquals("", log.toString());
assertEquals("Mock Tag 1 Device Name",
listDisplayName(dm.getDevice("MockDevice-tag-1", "Mock Tag 1 OEM")));
// this list comes from devices.xml bundled in the JAR
// cf /sdklib/src/main/java/com/android/sdklib/devices/devices.xml
assertEquals(
"[10.1\" WXGA (Tablet), 2.7\" QVGA, 2.7\" QVGA slider, 3.2\" HVGA slider (ADP1), " +
"3.2\" QVGA (ADP2), 3.3\" WQVGA, 3.4\" WQVGA, 3.7\" FWVGA slider, " +
"3.7\" WVGA (Nexus One), 4\" WVGA (Nexus S), 4.65\" 720p (Galaxy Nexus), " +
"4.7\" WXGA, 5.1\" WVGA, 5.4\" FWVGA, 7\" WSVGA (Tablet)]",
listDisplayNames(dm.getDevices(DeviceFilter.DEFAULT)).toString());
assertEquals("", log.toString());
// this list comes from the nexus.xml bundled in the JAR
// cf /sdklib/src/main/java/com/android/sdklib/devices/nexus.xml
assertEquals(
"[Android TV (1080p), Android TV (720p), Android Wear Round, Android Wear Round Chin, "
+
"Android Wear Square, Galaxy Nexus, Nexus 10, Nexus 4, Nexus 5, Nexus 6, Nexus 7, "
+
"Nexus 7 (2012), Nexus 9, Nexus One, Nexus S]",
listDisplayNames(dm.getDevices(DeviceFilter.VENDOR)).toString());
assertEquals("", log.toString());
assertEquals(
"[10.1\" WXGA (Tablet), 2.7\" QVGA, 2.7\" QVGA slider, 3.2\" HVGA slider (ADP1), " +
"3.2\" QVGA (ADP2), 3.3\" WQVGA, 3.4\" WQVGA, 3.7\" FWVGA slider, " +
"3.7\" WVGA (Nexus One), 4\" WVGA (Nexus S), 4.65\" 720p (Galaxy Nexus), " +
"4.7\" WXGA, 5.1\" WVGA, 5.4\" FWVGA, 7\" WSVGA (Tablet), Android TV (1080p), "
+
"Android TV (720p), Android Wear Round, Android Wear Round Chin, " +
"Android Wear Square, Galaxy Nexus, Mock Tag 1 Device Name, Nexus 10, Nexus 4, "
+
"Nexus 5, Nexus 6, Nexus 7, Nexus 7 (2012), Nexus 9, Nexus One, Nexus S]",
listDisplayNames(dm.getDevices(DeviceManager.ALL_DEVICES)).toString());
assertEquals("", log.toString());
}
public final void testGetDeviceStatus() {
// get a definition from the bundled devices.xml file
assertEquals(DeviceStatus.EXISTS,
dm.getDeviceStatus("7in WSVGA (Tablet)", "Generic"));
// get a definition from the bundled oem file
assertEquals(DeviceStatus.EXISTS,
dm.getDeviceStatus("Nexus One", "Google"));
// try a device that does not exist
assertEquals(DeviceStatus.MISSING,
dm.getDeviceStatus("My Device", "Custom OEM"));
}
public final void testHasHardwarePropHashChanged_Generic() {
final Device d1 = dm.getDevice("7in WSVGA (Tablet)", "Generic");
assertEquals("MD5:750a657019b49e621c42ce9a20c2cc30",
DeviceManager.hasHardwarePropHashChanged(
d1,
"invalid"));
assertEquals(null,
DeviceManager.hasHardwarePropHashChanged(d1, "MD5:750a657019b49e621c42ce9a20c2cc30"));
// change the device hardware props, this should change the hash
d1.getDefaultHardware().setNav(Navigation.TRACKBALL);
assertEquals("MD5:9c4dd5018987da51f7166f139f4361a2",
DeviceManager.hasHardwarePropHashChanged(d1, "MD5:750a657019b49e621c42ce9a20c2cc30"));
// change the property back, should revert its hash to the previous one
d1.getDefaultHardware().setNav(Navigation.NONAV);
assertEquals(null,
DeviceManager.hasHardwarePropHashChanged(d1, "MD5:750a657019b49e621c42ce9a20c2cc30"));
}
public final void testHasHardwarePropHashChanged_Oem() {
final Device d2 = dm.getDevice("Nexus One", "Google");
assertEquals("MD5:36362a51e6c830c2ab515a312c9ecbff",
DeviceManager.hasHardwarePropHashChanged(
d2,
"invalid"));
assertEquals(null,
DeviceManager.hasHardwarePropHashChanged(
d2,
"MD5:36362a51e6c830c2ab515a312c9ecbff"));
// change the device hardware props, this should change the hash
d2.getDefaultHardware().setKeyboard(Keyboard.QWERTY);
assertEquals("MD5:f8f4b390755f2f58dfeb7d3020cd87db",
DeviceManager.hasHardwarePropHashChanged(
d2,
"MD5:36362a51e6c830c2ab515a312c9ecbff"));
// change the property back, should revert its hash to the previous one
d2.getDefaultHardware().setKeyboard(Keyboard.NOKEY);
assertEquals(null,
DeviceManager.hasHardwarePropHashChanged(
d2,
"MD5:36362a51e6c830c2ab515a312c9ecbff"));
}
public final void testDeviceOverrides() throws Exception {
try {
File location = getSdkManager().getLocalSdk().getLocation();
SystemImage imageWithDevice = new SystemImage(
new File(location, "system-images/android-22/android-wear/x86"),
ISystemImage.LocationType.IN_SYSTEM_IMAGE,
new IdDisplay("android-wear", "android-wear"), new IdDisplay("Google", "Google1"),
"x86", new File[]{});
DeviceManager manager = DeviceManager.createInstance(location, log);
int count = manager.getDevices(EnumSet.allOf(DeviceFilter.class)).size();
Device d = manager.getDevice("wear_round", "Google");
assertEquals(d.getDisplayName(), "Android Wear Round");
makeSystemImageFolder(imageWithDevice, "wear_round");
manager = DeviceManager.createInstance(location, log);
d = manager.getDevice("wear_round", "Google");
assertEquals(d.getDisplayName(), "Mock Android wear Device Name");
Device d1 = dm.getDevice("wear_round", "Google");
Builder b = new Device.Builder(d1);
b.setName("Custom");
Device d2 = b.build();
manager.addUserDevice(d2);
manager.saveUserDevices();
d = manager.getDevice("wear_round", "Google");
assertEquals(d.getDisplayName(), "Custom");
assertEquals(count, manager.getDevices(EnumSet.allOf(DeviceFilter.class)).size());
}
finally {
super.setUp();
}
}
}