1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.companion.virtual; 18 19 import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_CUSTOM; 20 import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT; 21 import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_AUDIO; 22 import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_CAMERA; 23 import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_SENSORS; 24 import static android.content.Context.DEVICE_ID_DEFAULT; 25 import static android.content.Context.DEVICE_ID_INVALID; 26 27 import static com.google.common.truth.Truth.assertThat; 28 29 import static org.junit.Assert.assertThrows; 30 import static org.mockito.Mockito.when; 31 32 import android.companion.virtual.IVirtualDevice; 33 import android.companion.virtual.VirtualDevice; 34 import android.os.Parcel; 35 import android.platform.test.annotations.Presubmit; 36 import android.platform.test.flag.junit.SetFlagsRule; 37 38 import androidx.test.ext.junit.runners.AndroidJUnit4; 39 40 import org.junit.Before; 41 import org.junit.Rule; 42 import org.junit.Test; 43 import org.junit.runner.RunWith; 44 import org.mockito.Mock; 45 import org.mockito.MockitoAnnotations; 46 47 @Presubmit 48 @RunWith(AndroidJUnit4.class) 49 public class VirtualDeviceTest { 50 51 private static final int VIRTUAL_DEVICE_ID = 42; 52 private static final String PERSISTENT_ID = "persistentId"; 53 private static final String DEVICE_NAME = "VirtualDeviceName"; 54 private static final String DISPLAY_NAME = "DisplayName"; 55 56 @Rule 57 public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); 58 59 @Mock 60 private IVirtualDevice mVirtualDevice; 61 62 @Before setUp()63 public void setUp() throws Exception { 64 MockitoAnnotations.initMocks(this); 65 } 66 67 @Test build_invalidId_shouldThrowIllegalArgumentException()68 public void build_invalidId_shouldThrowIllegalArgumentException() { 69 assertThrows( 70 IllegalArgumentException.class, 71 () -> new VirtualDevice( 72 mVirtualDevice, DEVICE_ID_INVALID, PERSISTENT_ID, DEVICE_NAME)); 73 } 74 75 @Test build_defaultId_shouldThrowIllegalArgumentException()76 public void build_defaultId_shouldThrowIllegalArgumentException() { 77 assertThrows( 78 IllegalArgumentException.class, 79 () -> new VirtualDevice( 80 mVirtualDevice, DEVICE_ID_DEFAULT, PERSISTENT_ID, DEVICE_NAME)); 81 } 82 83 @Test build_onlyRequiredFields()84 public void build_onlyRequiredFields() { 85 VirtualDevice virtualDevice = 86 new VirtualDevice( 87 mVirtualDevice, VIRTUAL_DEVICE_ID, /*persistentId=*/null, /*name=*/null); 88 assertThat(virtualDevice.getDeviceId()).isEqualTo(VIRTUAL_DEVICE_ID); 89 assertThat(virtualDevice.getPersistentDeviceId()).isNull(); 90 assertThat(virtualDevice.getName()).isNull(); 91 } 92 93 @Test parcelable_shouldRecreateSuccessfully()94 public void parcelable_shouldRecreateSuccessfully() { 95 VirtualDevice originalDevice = 96 new VirtualDevice(mVirtualDevice, VIRTUAL_DEVICE_ID, PERSISTENT_ID, DEVICE_NAME, 97 DISPLAY_NAME); 98 Parcel parcel = Parcel.obtain(); 99 originalDevice.writeToParcel(parcel, 0); 100 parcel.setDataPosition(0); 101 102 VirtualDevice device = VirtualDevice.CREATOR.createFromParcel(parcel); 103 assertThat(device.getDeviceId()).isEqualTo(VIRTUAL_DEVICE_ID); 104 assertThat(device.getPersistentDeviceId()).isEqualTo(PERSISTENT_ID); 105 assertThat(device.getName()).isEqualTo(DEVICE_NAME); 106 assertThat(device.getDisplayName().toString()).isEqualTo(DISPLAY_NAME); 107 } 108 109 @Test virtualDevice_getDisplayIds()110 public void virtualDevice_getDisplayIds() throws Exception { 111 VirtualDevice virtualDevice = 112 new VirtualDevice( 113 mVirtualDevice, VIRTUAL_DEVICE_ID, /*persistentId=*/null, /*name=*/null); 114 115 when(mVirtualDevice.getDisplayIds()).thenReturn(new int[0]); 116 assertThat(virtualDevice.getDisplayIds()).hasLength(0); 117 118 final int[] displayIds = new int[]{7, 18}; 119 when(mVirtualDevice.getDisplayIds()).thenReturn(displayIds); 120 assertThat(virtualDevice.getDisplayIds()).isEqualTo(displayIds); 121 } 122 123 @Test virtualDevice_hasCustomSensorSupport()124 public void virtualDevice_hasCustomSensorSupport() throws Exception { 125 VirtualDevice virtualDevice = 126 new VirtualDevice( 127 mVirtualDevice, VIRTUAL_DEVICE_ID, /*persistentId=*/null, /*name=*/null); 128 129 when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_SENSORS)).thenReturn(DEVICE_POLICY_DEFAULT); 130 assertThat(virtualDevice.hasCustomSensorSupport()).isFalse(); 131 132 when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_SENSORS)).thenReturn(DEVICE_POLICY_CUSTOM); 133 assertThat(virtualDevice.hasCustomSensorSupport()).isTrue(); 134 } 135 136 @Test virtualDevice_hasCustomAudioInputSupport()137 public void virtualDevice_hasCustomAudioInputSupport() throws Exception { 138 mSetFlagsRule.enableFlags(android.media.audiopolicy.Flags.FLAG_AUDIO_MIX_TEST_API); 139 140 VirtualDevice virtualDevice = 141 new VirtualDevice( 142 mVirtualDevice, VIRTUAL_DEVICE_ID, /*persistentId=*/null, /*name=*/null); 143 144 when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_AUDIO)).thenReturn(DEVICE_POLICY_DEFAULT); 145 assertThat(virtualDevice.hasCustomAudioInputSupport()).isFalse(); 146 147 when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_AUDIO)).thenReturn(DEVICE_POLICY_CUSTOM); 148 when(mVirtualDevice.hasCustomAudioInputSupport()).thenReturn(false); 149 assertThat(virtualDevice.hasCustomAudioInputSupport()).isFalse(); 150 151 when(mVirtualDevice.hasCustomAudioInputSupport()).thenReturn(true); 152 assertThat(virtualDevice.hasCustomAudioInputSupport()).isTrue(); 153 } 154 155 @Test virtualDevice_hasCustomCameraSupport()156 public void virtualDevice_hasCustomCameraSupport() throws Exception { 157 VirtualDevice virtualDevice = 158 new VirtualDevice( 159 mVirtualDevice, VIRTUAL_DEVICE_ID, /*persistentId=*/null, /*name=*/null); 160 161 when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_CAMERA)).thenReturn(DEVICE_POLICY_DEFAULT); 162 assertThat(virtualDevice.hasCustomCameraSupport()).isFalse(); 163 164 when(mVirtualDevice.getDevicePolicy(POLICY_TYPE_CAMERA)).thenReturn(DEVICE_POLICY_CUSTOM); 165 assertThat(virtualDevice.hasCustomCameraSupport()).isTrue(); 166 } 167 } 168