• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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