1 /* 2 * Copyright (C) 2015 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 android.car.hiddenapitest; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import android.car.Car; 22 import android.car.CarFeatures; 23 import android.car.extendedapitest.testbase.CarApiTestBase; 24 import android.car.feature.Flags; 25 import android.util.ArraySet; 26 27 import androidx.test.filters.SmallTest; 28 29 import org.junit.Test; 30 31 import java.util.List; 32 33 @SmallTest 34 public final class CarFeatureTest extends CarApiTestBase { 35 36 private static final String TAG = CarFeatureTest.class.getSimpleName(); 37 38 private static final String BLUETOOTH_SERVICE = "car_bluetooth"; 39 40 // List in CarFeatureController should be inline with this. 41 private static final List<String> NON_FLAGGED_MANDATORY_FEATURES = List.of( 42 Car.APP_FOCUS_SERVICE, 43 Car.AUDIO_SERVICE, 44 Car.CAR_ACTIVITY_SERVICE, 45 Car.CAR_BUGREPORT_SERVICE, 46 Car.CAR_DEVICE_POLICY_SERVICE, 47 Car.CAR_DRIVING_STATE_SERVICE, 48 Car.CAR_INPUT_SERVICE, 49 Car.CAR_MEDIA_SERVICE, 50 Car.CAR_OCCUPANT_ZONE_SERVICE, 51 Car.CAR_PERFORMANCE_SERVICE, 52 Car.CAR_USER_SERVICE, 53 Car.CAR_UX_RESTRICTION_SERVICE, 54 Car.CAR_WATCHDOG_SERVICE, 55 Car.INFO_SERVICE, 56 Car.PACKAGE_SERVICE, 57 Car.POWER_SERVICE, 58 Car.PROJECTION_SERVICE, 59 Car.PROPERTY_SERVICE, 60 Car.TEST_SERVICE, 61 // All items below here are deprecated, but still should be supported 62 BLUETOOTH_SERVICE, 63 Car.CABIN_SERVICE, 64 Car.HVAC_SERVICE, 65 Car.SENSOR_SERVICE, 66 Car.VENDOR_EXTENSION_SERVICE 67 ); 68 69 private static final ArraySet<String> FLAGGED_MANDATORY_FEATURES = new ArraySet<>(1); 70 71 static { 72 if (Flags.persistApSettings()) { 73 FLAGGED_MANDATORY_FEATURES.add(Car.CAR_WIFI_SERVICE); 74 } 75 76 // Note: if a new entry is added here, the capacity of FLAGGED_MANDATORY_FEATURES 77 // should also be increased. 78 } 79 80 private static final ArraySet<String> MANDATORY_FEATURES = combineFeatures( 81 NON_FLAGGED_MANDATORY_FEATURES, 82 FLAGGED_MANDATORY_FEATURES); 83 84 private static final List<String> NON_FLAGGED_OPTIONAL_FEATURES = List.of( 85 CarFeatures.FEATURE_CAR_USER_NOTICE_SERVICE, 86 Car.CLUSTER_HOME_SERVICE, 87 Car.CAR_NAVIGATION_SERVICE, 88 Car.CAR_OCCUPANT_CONNECTION_SERVICE, 89 Car.CAR_REMOTE_DEVICE_SERVICE, 90 Car.DIAGNOSTIC_SERVICE, 91 Car.OCCUPANT_AWARENESS_SERVICE, 92 Car.STORAGE_MONITORING_SERVICE, 93 Car.VEHICLE_MAP_SERVICE, 94 Car.CAR_TELEMETRY_SERVICE, 95 Car.CAR_EVS_SERVICE, 96 Car.CAR_REMOTE_ACCESS_SERVICE, 97 Car.EXPERIMENTAL_CAR_KEYGUARD_SERVICE, 98 // All items below here are deprecated, but still could be supported 99 Car.CAR_INSTRUMENT_CLUSTER_SERVICE 100 ); 101 102 private static final ArraySet<String> FLAGGED_OPTIONAL_FEATURES = new ArraySet<>(); 103 104 static { 105 if (Flags.displayCompatibility()) { 106 FLAGGED_OPTIONAL_FEATURES.add(Car.CAR_DISPLAY_COMPAT_SERVICE); 107 } 108 109 // Note: if a new entry is added here, the capacity of FLAGGED_OPTIONAL_FEATURES 110 // should also be increased. 111 } 112 113 private static final ArraySet<String> OPTIONAL_FEATURES = combineFeatures( 114 NON_FLAGGED_OPTIONAL_FEATURES, FLAGGED_OPTIONAL_FEATURES); 115 116 private static final String NON_EXISTING_FEATURE = "ThisFeatureDoesNotExist"; 117 118 @Test checkMandatoryFeatures()119 public void checkMandatoryFeatures() { 120 Car car = getCar(); 121 assertThat(car).isNotNull(); 122 for (int i = 0; i < MANDATORY_FEATURES.size(); i++) { 123 String mandatoryFeature = MANDATORY_FEATURES.valueAt(i); 124 assertThat(car.isFeatureEnabled(mandatoryFeature)).isTrue(); 125 } 126 } 127 128 @Test toggleOptionalFeature()129 public void toggleOptionalFeature() { 130 Car car = getCar(); 131 assertThat(car).isNotNull(); 132 for (int i = 0; i < OPTIONAL_FEATURES.size(); i++) { 133 String optionalFeature = OPTIONAL_FEATURES.valueAt(i); 134 boolean enabled = getCar().isFeatureEnabled(optionalFeature); 135 toggleOptionalFeature(optionalFeature, !enabled, enabled); 136 toggleOptionalFeature(optionalFeature, enabled, enabled); 137 } 138 } 139 140 @Test testGetAllEnabledFeatures()141 public void testGetAllEnabledFeatures() { 142 Car car = getCar(); 143 assertThat(car).isNotNull(); 144 List<String> allEnabledFeatures = car.getAllEnabledFeatures(); 145 assertThat(allEnabledFeatures).isNotEmpty(); 146 for (int i = 0; i < MANDATORY_FEATURES.size(); i++) { 147 String mandatoryFeature = MANDATORY_FEATURES.valueAt(i); 148 assertThat(allEnabledFeatures).contains(mandatoryFeature); 149 } 150 } 151 152 @Test testEnableDisableForMandatoryFeatures()153 public void testEnableDisableForMandatoryFeatures() { 154 for (int i = 0; i < MANDATORY_FEATURES.size(); i++) { 155 String mandatoryFeature = MANDATORY_FEATURES.valueAt(i); 156 assertThat(getCar().enableFeature(mandatoryFeature)).isEqualTo( 157 Car.FEATURE_REQUEST_MANDATORY); 158 assertThat(getCar().disableFeature(mandatoryFeature)).isEqualTo( 159 Car.FEATURE_REQUEST_MANDATORY); 160 } 161 } 162 163 @Test testEnableDisableForNonExistingFeature()164 public void testEnableDisableForNonExistingFeature() { 165 assertThat(getCar().enableFeature(NON_EXISTING_FEATURE)).isEqualTo( 166 Car.FEATURE_REQUEST_NOT_EXISTING); 167 assertThat(getCar().disableFeature(NON_EXISTING_FEATURE)).isEqualTo( 168 Car.FEATURE_REQUEST_NOT_EXISTING); 169 } 170 toggleOptionalFeature(String feature, boolean enable, boolean originallyEnabled)171 private void toggleOptionalFeature(String feature, boolean enable, boolean originallyEnabled) { 172 if (enable) { 173 if (originallyEnabled) { 174 assertThat(getCar().enableFeature(feature)).isEqualTo( 175 Car.FEATURE_REQUEST_ALREADY_IN_THE_STATE); 176 } else { 177 assertThat(getCar().enableFeature(feature)).isEqualTo(Car.FEATURE_REQUEST_SUCCESS); 178 assertThat(getCar().getAllPendingEnabledFeatures()).contains(feature); 179 } 180 assertThat(getCar().getAllPendingDisabledFeatures()).doesNotContain(feature); 181 } else { 182 if (originallyEnabled) { 183 assertThat(getCar().disableFeature(feature)).isEqualTo(Car.FEATURE_REQUEST_SUCCESS); 184 assertThat(getCar().getAllPendingDisabledFeatures()).contains(feature); 185 } else { 186 assertThat(getCar().disableFeature(feature)).isEqualTo( 187 Car.FEATURE_REQUEST_ALREADY_IN_THE_STATE); 188 } 189 assertThat(getCar().getAllPendingEnabledFeatures()).doesNotContain(feature); 190 } 191 } 192 combineFeatures(List<String> features, ArraySet<String> flaggedFeatures)193 private static ArraySet<String> combineFeatures(List<String> features, 194 ArraySet<String> flaggedFeatures) { 195 ArraySet<String> combinedFeatures = new ArraySet<>(features); 196 combinedFeatures.addAll(flaggedFeatures); 197 return combinedFeatures; 198 } 199 } 200