diff options
author | Juan C Nuno <juancnuno@google.com> | 2022-06-15 15:20:52 -0700 |
---|---|---|
committer | Juan Nuno <juancnuno@google.com> | 2022-06-22 21:31:50 +0000 |
commit | daa267643f1bbcbcea6a2eaf94fc4e20a3cd7c8d (patch) | |
tree | 3451caf60ad3bac052ca852ea0dc2ed85b15bf5d /device-manager | |
parent | 1c228648d92f620abd12811f687d128bce582cef (diff) | |
download | idea-daa267643f1bbcbcea6a2eaf94fc4e20a3cd7c8d.tar.gz |
Add ABI list to the virtual details panel
Bug: 198459483
Test: VirtualDeviceDetailsPanelTest
Change-Id: I9c79ce6389750ace6e6221e5d4c021fb1e9c7921
Diffstat (limited to 'device-manager')
6 files changed, 198 insertions, 85 deletions
diff --git a/device-manager/src/com/android/tools/idea/devicemanager/InfoSection.java b/device-manager/src/com/android/tools/idea/devicemanager/InfoSection.java index 6a92fe42400..049db53e2ae 100644 --- a/device-manager/src/com/android/tools/idea/devicemanager/InfoSection.java +++ b/device-manager/src/com/android/tools/idea/devicemanager/InfoSection.java @@ -18,16 +18,19 @@ package com.android.tools.idea.devicemanager; import com.android.tools.idea.flags.StudioFlags; import com.android.tools.idea.wearpairing.WearPairingManager; import com.android.tools.idea.wearpairing.WearPairingManager.PhoneWearPair; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Streams; import com.intellij.ui.components.JBLabel; import com.intellij.ui.components.JBPanel; import com.intellij.util.ui.JBUI.CurrentTheme.Label; import java.awt.Component; import java.util.ArrayList; +import java.util.Collection; import java.util.Formatter; import java.util.List; import java.util.Optional; import java.util.OptionalInt; +import java.util.stream.Collectors; import java.util.stream.IntStream; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Group; @@ -137,8 +140,25 @@ public class InfoSection extends JBPanel<InfoSection> { label.setText(String.join(", ", values)); } + @VisibleForTesting + public final @NotNull Object getNames() { + return getText(myNameLabels); + } + + @VisibleForTesting + public final @NotNull Object getValues() { + return getText(myValueLabels); + } + + @VisibleForTesting + private static @NotNull Object getText(@NotNull Collection<@NotNull JLabel> labels) { + return labels.stream() + .map(JLabel::getText) + .collect(Collectors.toList()); + } + @Override - public @NotNull String toString() { + public final @NotNull String toString() { Formatter formatter = new Formatter(); formatter.format("%s%n", myHeadingLabel.getText()); diff --git a/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/AsyncVirtualDeviceDetailsBuilder.java b/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/AsyncVirtualDeviceDetailsBuilder.java index 96ec61fc90d..cb850908a6b 100644 --- a/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/AsyncVirtualDeviceDetailsBuilder.java +++ b/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/AsyncVirtualDeviceDetailsBuilder.java @@ -31,7 +31,6 @@ import java.util.List; import java.util.Objects; import java.util.OptionalInt; import java.util.concurrent.Executor; -import java.util.concurrent.Future; import java.util.stream.Collectors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -41,6 +40,10 @@ final class AsyncVirtualDeviceDetailsBuilder { private final @NotNull VirtualDevice myDevice; private final @NotNull DeviceManagerAndroidDebugBridge myBridge; + AsyncVirtualDeviceDetailsBuilder(@Nullable Project project, @NotNull VirtualDevice device) { + this(project, device, new DeviceManagerAndroidDebugBridge()); + } + @VisibleForTesting AsyncVirtualDeviceDetailsBuilder(@Nullable Project project, @NotNull VirtualDevice device, @@ -50,7 +53,7 @@ final class AsyncVirtualDeviceDetailsBuilder { myBridge = bridge; } - @NotNull Future<@NotNull Device> buildAsync() { + @NotNull ListenableFuture<@NotNull Device> buildAsync() { Executor executor = AppExecutorUtil.getAppExecutorService(); // noinspection UnstableApiUsage @@ -89,18 +92,20 @@ final class AsyncVirtualDeviceDetailsBuilder { private @NotNull Device build(@Nullable IDevice device) { AvdInfo avd = myDevice.getAvdInfo(); - return new VirtualDevice.Builder() + VirtualDevice.Builder builder = new VirtualDevice.Builder() .setKey(myDevice.getKey()) - .setType(myDevice.getType()) .setName(myDevice.getName()) - .setOnline(myDevice.isOnline()) .setTarget(myDevice.getTarget()) .setCpuArchitecture(myDevice.getCpuArchitecture()) - .setAndroidVersion(myDevice.getAndroidVersion()) - .setSizeOnDisk(myDevice.getSizeOnDisk()) .setResolution(getResolution(avd)) - .setDensity(getProperty(avd, "hw.lcd.density").orElse(-1)) - .setAvdInfo(myDevice.getAvdInfo()) + .setDensity(getProperty(avd, "hw.lcd.density").orElse(-1)); + + if (device != null) { + builder.addAllAbis(device.getAbis()); + } + + return builder + .setAvdInfo(avd) .build(); } @@ -129,4 +134,8 @@ final class AsyncVirtualDeviceDetailsBuilder { return OptionalInt.empty(); } } + + @Nullable Project getProject() { + return myProject; + } } diff --git a/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/VirtualDevice.java b/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/VirtualDevice.java index 762116dcad3..38e4d53d078 100644 --- a/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/VirtualDevice.java +++ b/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/VirtualDevice.java @@ -22,6 +22,7 @@ import com.android.tools.idea.devicemanager.DeviceType; import com.android.tools.idea.devicemanager.Key; import com.android.tools.idea.devicemanager.Resolution; import com.android.tools.idea.wearpairing.AndroidWearPairingBundle; +import java.util.Collection; import java.util.Objects; import javax.swing.Icon; import org.jetbrains.annotations.NotNull; @@ -89,6 +90,11 @@ public final class VirtualDevice extends Device { return this; } + @NotNull Builder addAllAbis(@NotNull Collection<@NotNull String> abis) { + myAbis.addAll(abis); + return this; + } + @NotNull Builder setAvdInfo(@NotNull AvdInfo avdInfo) { myAvdInfo = avdInfo; return this; diff --git a/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/VirtualDeviceDetailsPanel.java b/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/VirtualDeviceDetailsPanel.java index e1763516e8d..624bdbcf080 100644 --- a/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/VirtualDeviceDetailsPanel.java +++ b/device-manager/src/com/android/tools/idea/devicemanager/virtualtab/VirtualDeviceDetailsPanel.java @@ -19,21 +19,30 @@ import com.android.sdklib.internal.avd.AvdInfo; import com.android.sdklib.internal.avd.AvdInfo.AvdStatus; import com.android.sdklib.internal.avd.AvdManager; import com.android.tools.idea.devicemanager.DetailsPanel; +import com.android.tools.idea.devicemanager.Device; +import com.android.tools.idea.devicemanager.DeviceManagerFutureCallback; import com.android.tools.idea.devicemanager.InfoSection; import com.android.tools.idea.devicemanager.PairedDevicesPanel; import com.android.tools.idea.devicemanager.ScreenDiagram; import com.android.tools.idea.flags.StudioFlags; import com.android.tools.idea.wearpairing.WearPairingManager; import com.google.common.annotations.VisibleForTesting; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; import com.intellij.openapi.project.Project; +import com.intellij.util.concurrency.EdtExecutorService; import java.util.HashMap; import java.util.Map; +import java.util.function.Function; import javax.swing.JLabel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; final class VirtualDeviceDetailsPanel extends DetailsPanel { private final @NotNull VirtualDevice myDevice; + private final @NotNull AsyncVirtualDeviceDetailsBuilder myBuilder; + private final @NotNull Function<@NotNull SummarySection, @NotNull FutureCallback<@NotNull Device>> myNewSummarySectionCallback; + private @Nullable InfoSection myPropertiesSection; @VisibleForTesting @@ -41,6 +50,7 @@ final class VirtualDeviceDetailsPanel extends DetailsPanel { @VisibleForTesting final @NotNull JLabel myApiLevelLabel; @VisibleForTesting final @NotNull JLabel myResolutionLabel; @VisibleForTesting final @NotNull JLabel myDpLabel; + @VisibleForTesting final @NotNull JLabel myAbiListLabel; @VisibleForTesting @Nullable JLabel myErrorLabel; @VisibleForTesting @Nullable JLabel mySnapshotLabel; @@ -50,12 +60,23 @@ final class VirtualDeviceDetailsPanel extends DetailsPanel { myApiLevelLabel = addNameAndValueLabels("API level"); myResolutionLabel = addNameAndValueLabels("Resolution"); myDpLabel = addNameAndValueLabels("dp"); + myAbiListLabel = addNameAndValueLabels("ABI list"); } } VirtualDeviceDetailsPanel(@NotNull VirtualDevice device, @Nullable Project project) { + this(device, new AsyncVirtualDeviceDetailsBuilder(project, device), VirtualDeviceDetailsPanel::newSummarySectionCallback); + } + + @VisibleForTesting + VirtualDeviceDetailsPanel(@NotNull VirtualDevice device, + @NotNull AsyncVirtualDeviceDetailsBuilder builder, + @NotNull Function<@NotNull SummarySection, @NotNull FutureCallback<@NotNull Device>> newSummarySectionCallback) { super(device.getName()); + myDevice = device; + myBuilder = builder; + myNewSummarySectionCallback = newSummarySectionCallback; myScreenDiagram = new ScreenDiagram(device); initPropertiesSection(); @@ -67,19 +88,25 @@ final class VirtualDeviceDetailsPanel extends DetailsPanel { } if (StudioFlags.PAIRED_DEVICES_TAB_ENABLED.get() && device.isPairable()) { - myPairedDevicesPanel = new PairedDevicesPanel(device.getKey(), this, project); + myPairedDevicesPanel = new PairedDevicesPanel(device.getKey(), this, builder.getProject()); } init(); } + @VisibleForTesting + static @NotNull FutureCallback<@NotNull Device> newSummarySectionCallback(@NotNull SummarySection section) { + return new DeviceManagerFutureCallback<>(VirtualDeviceDetailsPanel.class, device -> { + InfoSection.setText(section.myResolutionLabel, device.getResolution()); + InfoSection.setText(section.myDpLabel, device.getDp()); + InfoSection.setText(section.myAbiListLabel, device.getAbis()); + }); + } + @Override protected void initSummarySection() { SummarySection summarySection = new SummarySection(); - InfoSection.setText(summarySection.myApiLevelLabel, myDevice.getAndroidVersion().getApiString()); - InfoSection.setText(summarySection.myResolutionLabel, myDevice.getResolution()); - InfoSection.setText(summarySection.myDpLabel, myDevice.getDp()); AvdInfo device = myDevice.getAvdInfo(); @@ -88,6 +115,7 @@ final class VirtualDeviceDetailsPanel extends DetailsPanel { InfoSection.setText(summarySection.myErrorLabel, device.getErrorMessage()); } else { + // TODO Ensure this actually displays the snapshot to boot with Object snapshot = device.getProperty(AvdManager.AVD_INI_SNAPSHOT_PRESENT); if (snapshot != null) { @@ -97,6 +125,8 @@ final class VirtualDeviceDetailsPanel extends DetailsPanel { } summarySection.setLayout(); + Futures.addCallback(myBuilder.buildAsync(), myNewSummarySectionCallback.apply(summarySection), EdtExecutorService.getInstance()); + mySummarySection = summarySection; } @@ -132,4 +162,10 @@ final class VirtualDeviceDetailsPanel extends DetailsPanel { assert mySummarySection != null; return (SummarySection)mySummarySection; } + + @VisibleForTesting + @NotNull InfoSection getPropertiesSection() { + assert myPropertiesSection != null; + return myPropertiesSection; + } } diff --git a/device-manager/testSrc/com/android/tools/idea/devicemanager/virtualtab/AsyncVirtualDeviceDetailsBuilderTest.java b/device-manager/testSrc/com/android/tools/idea/devicemanager/virtualtab/AsyncVirtualDeviceDetailsBuilderTest.java index b6b1e370452..a11f88c2fbd 100644 --- a/device-manager/testSrc/com/android/tools/idea/devicemanager/virtualtab/AsyncVirtualDeviceDetailsBuilderTest.java +++ b/device-manager/testSrc/com/android/tools/idea/devicemanager/virtualtab/AsyncVirtualDeviceDetailsBuilderTest.java @@ -23,6 +23,7 @@ import com.android.ddmlib.IDevice; import com.android.sdklib.internal.avd.AvdInfo; import com.android.tools.idea.devicemanager.Device; import com.android.tools.idea.devicemanager.DeviceManagerAndroidDebugBridge; +import com.android.tools.idea.devicemanager.Key; import com.android.tools.idea.devicemanager.Resolution; import com.android.tools.idea.devicemanager.TestDeviceManagerFutures; import com.google.common.util.concurrent.Futures; @@ -37,21 +38,18 @@ import org.mockito.Mockito; @RunWith(JUnit4.class) public final class AsyncVirtualDeviceDetailsBuilderTest { private final @NotNull AvdInfo myAvd; - private final @NotNull VirtualDevice myVirtualDevice; - private final @NotNull IDevice myDevice; + private final @NotNull AsyncVirtualDeviceDetailsBuilder myBuilder; public AsyncVirtualDeviceDetailsBuilderTest() { myAvd = Mockito.mock(AvdInfo.class); - myVirtualDevice = TestVirtualDevices.pixel5Api31(myAvd); - myDevice = Mockito.mock(IDevice.class); DeviceManagerAndroidDebugBridge bridge = Mockito.mock(DeviceManagerAndroidDebugBridge.class); Mockito.when(bridge.getDevices(null)).thenReturn(Futures.immediateFuture(List.of(myDevice))); - myBuilder = new AsyncVirtualDeviceDetailsBuilder(null, myVirtualDevice, bridge); + myBuilder = new AsyncVirtualDeviceDetailsBuilder(null, TestVirtualDevices.pixel5Api31(myAvd), bridge); } @Test @@ -63,20 +61,36 @@ public final class AsyncVirtualDeviceDetailsBuilderTest { Future<Device> future = myBuilder.buildAsync(); // Assert - assertEquals(myVirtualDevice, TestDeviceManagerFutures.get(future)); + Object device = new VirtualDevice.Builder() + .setKey(TestVirtualDevices.newKey("Pixel_5_API_31")) + .setName("Pixel 5 API 31") + .setTarget("Android 12.0 Google APIs") + .setCpuArchitecture("x86_64") + .setAvdInfo(myAvd) + .build(); + + assertEquals(device, TestDeviceManagerFutures.get(future)); } @Test public void buildAsync() throws Exception { // Arrange - AvdData avd = new AvdData("Pixel_5_API_31", TestVirtualDevices.newKey("Pixel_5_API_31").toString()); - Mockito.when(myDevice.getAvdData()).thenReturn(Futures.immediateFuture(avd)); + Key key = TestVirtualDevices.newKey("Pixel_5_API_31"); + Mockito.when(myDevice.getAvdData()).thenReturn(Futures.immediateFuture(new AvdData("Pixel_5_API_31", key.toString()))); // Act Future<Device> future = myBuilder.buildAsync(); // Assert - assertEquals(myVirtualDevice, TestDeviceManagerFutures.get(future)); + Object device = new VirtualDevice.Builder() + .setKey(key) + .setName("Pixel 5 API 31") + .setTarget("Android 12.0 Google APIs") + .setCpuArchitecture("x86_64") + .setAvdInfo(myAvd) + .build(); + + assertEquals(device, TestDeviceManagerFutures.get(future)); } @Test diff --git a/device-manager/testSrc/com/android/tools/idea/devicemanager/virtualtab/VirtualDeviceDetailsPanelTest.java b/device-manager/testSrc/com/android/tools/idea/devicemanager/virtualtab/VirtualDeviceDetailsPanelTest.java index ee52ee56622..edf51647a48 100644 --- a/device-manager/testSrc/com/android/tools/idea/devicemanager/virtualtab/VirtualDeviceDetailsPanelTest.java +++ b/device-manager/testSrc/com/android/tools/idea/devicemanager/virtualtab/VirtualDeviceDetailsPanelTest.java @@ -16,19 +16,22 @@ package com.android.tools.idea.devicemanager.virtualtab; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import com.android.sdklib.AndroidVersion; import com.android.sdklib.internal.avd.AvdInfo; import com.android.sdklib.internal.avd.AvdInfo.AvdStatus; -import com.android.sdklib.internal.avd.AvdManager; -import com.android.sdklib.repository.targets.SystemImage; +import com.android.tools.idea.devicemanager.CountDownLatchAssert; +import com.android.tools.idea.devicemanager.CountDownLatchFutureCallback; +import com.android.tools.idea.devicemanager.Device; +import com.android.tools.idea.devicemanager.InfoSection; import com.android.tools.idea.devicemanager.Resolution; import com.android.tools.idea.devicemanager.virtualtab.VirtualDeviceDetailsPanel.SummarySection; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; import java.nio.file.Paths; -import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.concurrent.CountDownLatch; +import org.jetbrains.annotations.NotNull; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -36,73 +39,98 @@ import org.mockito.Mockito; @RunWith(JUnit4.class) public final class VirtualDeviceDetailsPanelTest { + private final @NotNull AvdInfo myAvd = Mockito.mock(AvdInfo.class); + @Test - public void newVirtualDeviceDetailsPanel() { - Map<String, String> properties = new HashMap<>(); - properties.put(AvdManager.AVD_INI_ANDROID_API, "30"); - - AvdInfo avdInfo = new AvdInfo("Pixel_3_API_30", - Paths.get("ini/file"), - Paths.get("data/folder/path"), - Mockito.mock(SystemImage.class), - properties, - AvdStatus.OK); - - VirtualDevice device = new VirtualDevice.Builder() - .setKey(TestVirtualDevices.newKey("Pixel_3_API_30")) - .setName("Pixel 3 API 30") - .setTarget("Android 11.0 Google APIs") + public void initSummarySection() throws Exception { + // Arrange + Mockito.when(myAvd.getStatus()).thenReturn(AvdStatus.OK); + VirtualDevice virtualDevice = TestVirtualDevices.onlinePixel5Api31(myAvd); + + Device device = new VirtualDevice.Builder() + .setKey(TestVirtualDevices.newKey("Pixel_5_API_31")) + .setName("Pixel 5 API 31") + .setTarget("Android 12.0 Google APIs") .setCpuArchitecture("x86_64") - .setAndroidVersion(new AndroidVersion(30)) - .setResolution(new Resolution(1080, 2160)) + .setResolution(new Resolution(1080, 2340)) .setDensity(440) - .setAvdInfo(avdInfo) + .addAllAbis(List.of("x86_64", "arm64-v8a")) + .setAvdInfo(myAvd) .build(); - VirtualDeviceDetailsPanel panel = new VirtualDeviceDetailsPanel(device, null); + AsyncVirtualDeviceDetailsBuilder builder = mock(device); + CountDownLatch latch = new CountDownLatch(1); + + // Act + VirtualDeviceDetailsPanel panel = new VirtualDeviceDetailsPanel(virtualDevice, + builder, + section -> newSummarySectionCallback(section, latch)); + + // Assert + CountDownLatchAssert.await(latch); + SummarySection section = panel.getSummarySection(); - assertEquals("30", section.myApiLevelLabel.getText()); - assertEquals("1080 × 2160", section.myResolutionLabel.getText()); - assertEquals("393 × 786", section.myDpLabel.getText()); - assertNull(section.myErrorLabel); - assertNull(section.mySnapshotLabel); + assertEquals("31", section.myApiLevelLabel.getText()); + assertEquals("1080 × 2340", section.myResolutionLabel.getText()); + assertEquals("393 × 851", section.myDpLabel.getText()); + assertEquals("x86_64, arm64-v8a", section.myAbiListLabel.getText()); + } + + private static @NotNull FutureCallback<@NotNull Device> newSummarySectionCallback(@NotNull SummarySection section, + @NotNull CountDownLatch latch) { + return new CountDownLatchFutureCallback<>(VirtualDeviceDetailsPanel.newSummarySectionCallback(section), latch); } @Test - public void newVirtualDeviceDetailsPanelError() { - Map<String, String> properties = new HashMap<>(); - properties.put(AvdManager.AVD_INI_ANDROID_API, "30"); - properties.put(AvdManager.AVD_INI_TAG_ID, "google_apis_playstore"); - properties.put(AvdManager.AVD_INI_TAG_DISPLAY, "Google Play"); - properties.put(AvdManager.AVD_INI_ABI_TYPE, "x86"); - - AvdInfo avdInfo = new AvdInfo("Pixel_3_API_30", - Paths.get("ini/file"), - Paths.get("data/folder/path"), - Mockito.mock(SystemImage.class), - properties, - AvdStatus.ERROR_IMAGE_MISSING); - - VirtualDevice device = new VirtualDevice.Builder() - .setKey(TestVirtualDevices.newKey("Pixel_3_API_30")) - .setName("Pixel 3 API 30") - .setTarget("Android 11.0 Google APIs") - .setCpuArchitecture("x86_64") - .setAndroidVersion(new AndroidVersion(30)) - .setResolution(new Resolution(1080, 2160)) - .setDensity(440) - .setAvdInfo(avdInfo) - .build(); + public void initSummarySectionStatusDoesntEqualOk() { + // Arrange + Object configIni = Paths.get(System.getProperty("user.home"), ".android", "avd", "Pixel_5_API_31.avd", "config.ini"); - VirtualDeviceDetailsPanel panel = new VirtualDeviceDetailsPanel(device, null); - SummarySection section = panel.getSummarySection(); + Mockito.when(myAvd.getStatus()).thenReturn(AvdStatus.ERROR_PROPERTIES); + Mockito.when(myAvd.getErrorMessage()).thenReturn("Failed to parse properties from " + configIni); + + VirtualDevice virtualDevice = TestVirtualDevices.pixel5Api31(myAvd); + AsyncVirtualDeviceDetailsBuilder builder = mock(virtualDevice); + + // Act + VirtualDeviceDetailsPanel panel = new VirtualDeviceDetailsPanel(virtualDevice, + builder, + VirtualDeviceDetailsPanel::newSummarySectionCallback); + + // Assert + assert panel.getSummarySection().myErrorLabel != null; + assertEquals("Failed to parse properties from " + configIni, panel.getSummarySection().myErrorLabel.getText()); + } + + @Test + public void initPropertiesSection() { + // Arrange + Mockito.when(myAvd.getStatus()).thenReturn(AvdStatus.OK); + + Mockito.when(myAvd.getProperties()).thenReturn(Map.of("fastboot.chosenSnapshotFile", "", + "runtime.network.speed", "full", + "hw.accelerometer", "yes")); + + VirtualDevice virtualDevice = TestVirtualDevices.pixel5Api31(myAvd); + AsyncVirtualDeviceDetailsBuilder builder = mock(virtualDevice); + + // Act + VirtualDeviceDetailsPanel panel = new VirtualDeviceDetailsPanel(virtualDevice, + builder, + VirtualDeviceDetailsPanel::newSummarySectionCallback); + + // Assert + InfoSection section = panel.getPropertiesSection(); + + assertEquals(List.of("fastboot.chosenSnapshotFile", "runtime.network.speed", "hw.accelerometer"), section.getNames()); + assertEquals(List.of("", "full", "yes"), section.getValues()); + } + + private static @NotNull AsyncVirtualDeviceDetailsBuilder mock(@NotNull Device device) { + AsyncVirtualDeviceDetailsBuilder builder = Mockito.mock(AsyncVirtualDeviceDetailsBuilder.class); + Mockito.when(builder.buildAsync()).thenReturn(Futures.immediateFuture(device)); - assertEquals("30", section.myApiLevelLabel.getText()); - assertEquals("1080 × 2160", section.myResolutionLabel.getText()); - assertEquals("393 × 786", section.myDpLabel.getText()); - assertNotNull(section.myErrorLabel); - assertEquals("Missing system image for Google Play x86 Pixel_3_API_30.", section.myErrorLabel.getText()); - assertNull(section.mySnapshotLabel); + return builder; } } |