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 android.healthconnect; 18 19 import static android.health.connect.HealthPermissions.HEALTH_PERMISSION_GROUP; 20 import static android.health.connect.HealthPermissions.READ_EXERCISE_ROUTE; 21 22 import static com.google.common.truth.Truth.assertThat; 23 import static com.google.common.truth.Truth.assertWithMessage; 24 25 import android.content.Context; 26 import android.content.pm.PackageInfo; 27 import android.content.pm.PackageManager; 28 import android.content.pm.PermissionInfo; 29 import android.health.connect.HealthConnectManager; 30 import android.health.connect.HealthPermissions; 31 32 import androidx.test.InstrumentationRegistry; 33 34 import org.junit.Before; 35 import org.junit.Test; 36 37 import java.util.Set; 38 39 public class HealthPermissionsTest { 40 private static final String FAIL_MESSAGE = 41 "Add new health permission to ALL_EXPECTED_HEALTH_PERMISSIONS and " 42 + " android.healthconnect.cts.HealthPermissionsPresenceTest.HEALTH_PERMISSIONS " 43 + "sets."; 44 45 // Add new health permission to ALL_EXPECTED_HEALTH_PERMISSIONS and 46 // {@link android.healthconnect.cts.HealthPermissionsPresenceTest.HEALTH_PERMISSIONS} 47 // sets. 48 private static final Set<String> ALL_EXPECTED_HEALTH_PERMISSIONS = 49 Set.of( 50 HealthPermissions.READ_ACTIVE_CALORIES_BURNED, 51 HealthPermissions.READ_DISTANCE, 52 HealthPermissions.READ_ELEVATION_GAINED, 53 HealthPermissions.READ_EXERCISE, 54 HealthPermissions.READ_FLOORS_CLIMBED, 55 HealthPermissions.READ_STEPS, 56 HealthPermissions.READ_TOTAL_CALORIES_BURNED, 57 HealthPermissions.READ_VO2_MAX, 58 HealthPermissions.READ_WHEELCHAIR_PUSHES, 59 HealthPermissions.READ_POWER, 60 HealthPermissions.READ_SPEED, 61 HealthPermissions.READ_BASAL_METABOLIC_RATE, 62 HealthPermissions.READ_BODY_FAT, 63 HealthPermissions.READ_BODY_WATER_MASS, 64 HealthPermissions.READ_BONE_MASS, 65 HealthPermissions.READ_HEIGHT, 66 HealthPermissions.READ_LEAN_BODY_MASS, 67 HealthPermissions.READ_WEIGHT, 68 HealthPermissions.READ_CERVICAL_MUCUS, 69 HealthPermissions.READ_INTERMENSTRUAL_BLEEDING, 70 HealthPermissions.READ_MENSTRUATION, 71 HealthPermissions.READ_OVULATION_TEST, 72 HealthPermissions.READ_SEXUAL_ACTIVITY, 73 HealthPermissions.READ_HYDRATION, 74 HealthPermissions.READ_NUTRITION, 75 HealthPermissions.READ_SLEEP, 76 HealthPermissions.READ_BASAL_BODY_TEMPERATURE, 77 HealthPermissions.READ_BLOOD_GLUCOSE, 78 HealthPermissions.READ_BLOOD_PRESSURE, 79 HealthPermissions.READ_BODY_TEMPERATURE, 80 HealthPermissions.READ_HEART_RATE, 81 HealthPermissions.READ_HEART_RATE_VARIABILITY, 82 HealthPermissions.READ_OXYGEN_SATURATION, 83 HealthPermissions.READ_RESPIRATORY_RATE, 84 HealthPermissions.READ_RESTING_HEART_RATE, 85 HealthPermissions.WRITE_ACTIVE_CALORIES_BURNED, 86 HealthPermissions.WRITE_DISTANCE, 87 HealthPermissions.WRITE_ELEVATION_GAINED, 88 HealthPermissions.WRITE_EXERCISE, 89 HealthPermissions.WRITE_EXERCISE_ROUTE, 90 HealthPermissions.WRITE_FLOORS_CLIMBED, 91 HealthPermissions.WRITE_STEPS, 92 HealthPermissions.WRITE_TOTAL_CALORIES_BURNED, 93 HealthPermissions.WRITE_VO2_MAX, 94 HealthPermissions.WRITE_WHEELCHAIR_PUSHES, 95 HealthPermissions.WRITE_POWER, 96 HealthPermissions.WRITE_SPEED, 97 HealthPermissions.WRITE_BASAL_METABOLIC_RATE, 98 HealthPermissions.WRITE_BODY_FAT, 99 HealthPermissions.WRITE_BODY_WATER_MASS, 100 HealthPermissions.WRITE_BONE_MASS, 101 HealthPermissions.WRITE_HEIGHT, 102 HealthPermissions.WRITE_LEAN_BODY_MASS, 103 HealthPermissions.WRITE_WEIGHT, 104 HealthPermissions.WRITE_CERVICAL_MUCUS, 105 HealthPermissions.WRITE_INTERMENSTRUAL_BLEEDING, 106 HealthPermissions.WRITE_MENSTRUATION, 107 HealthPermissions.WRITE_OVULATION_TEST, 108 HealthPermissions.WRITE_SEXUAL_ACTIVITY, 109 HealthPermissions.WRITE_HYDRATION, 110 HealthPermissions.WRITE_NUTRITION, 111 HealthPermissions.WRITE_SLEEP, 112 HealthPermissions.WRITE_BASAL_BODY_TEMPERATURE, 113 HealthPermissions.WRITE_BLOOD_GLUCOSE, 114 HealthPermissions.WRITE_BLOOD_PRESSURE, 115 HealthPermissions.WRITE_BODY_TEMPERATURE, 116 HealthPermissions.WRITE_HEART_RATE, 117 HealthPermissions.WRITE_HEART_RATE_VARIABILITY, 118 HealthPermissions.WRITE_OXYGEN_SATURATION, 119 HealthPermissions.WRITE_RESPIRATORY_RATE, 120 HealthPermissions.WRITE_RESTING_HEART_RATE); 121 private PackageManager mPackageManager; 122 private Context mContext; 123 124 @Before setUp()125 public void setUp() { 126 mContext = InstrumentationRegistry.getTargetContext(); 127 mPackageManager = mContext.getPackageManager(); 128 } 129 130 @Test testHealthGroupPermissions_noUnexpectedPermissionsDefined()131 public void testHealthGroupPermissions_noUnexpectedPermissionsDefined() throws Exception { 132 PermissionInfo[] permissionInfos = getHealthPermissionInfos(); 133 for (PermissionInfo permissionInfo : permissionInfos) { 134 if (permissionInfo.group != null 135 && permissionInfo.group.equals(HEALTH_PERMISSION_GROUP)) { 136 assertWithMessage(FAIL_MESSAGE) 137 .that(ALL_EXPECTED_HEALTH_PERMISSIONS) 138 .contains(permissionInfo.name); 139 } 140 } 141 } 142 143 @Test testHealthConnectManager_noUnexpectedPermissionsReturned()144 public void testHealthConnectManager_noUnexpectedPermissionsReturned() throws Exception { 145 assertWithMessage(FAIL_MESSAGE) 146 .that(HealthConnectManager.getHealthPermissions(mContext)) 147 .isEqualTo(ALL_EXPECTED_HEALTH_PERMISSIONS); 148 } 149 150 @Test testReadExerciseRoutePerm_hasSignatureProtection()151 public void testReadExerciseRoutePerm_hasSignatureProtection() throws Exception { 152 assertThat( 153 mPackageManager 154 .getPermissionInfo(READ_EXERCISE_ROUTE, /* flags= */ 0) 155 .getProtection()) 156 .isEqualTo(PermissionInfo.PROTECTION_SIGNATURE); 157 } 158 159 @Test testReadExerciseRoutePerm_controllerUiHoldsIt()160 public void testReadExerciseRoutePerm_controllerUiHoldsIt() throws Exception { 161 String healthControllerPackageName = getControllerUiPackageName(); 162 assertThat( 163 mContext.getPackageManager() 164 .checkPermission(READ_EXERCISE_ROUTE, healthControllerPackageName)) 165 .isEqualTo(PackageManager.PERMISSION_GRANTED); 166 } 167 getHealthPermissionInfos()168 private PermissionInfo[] getHealthPermissionInfos() throws Exception { 169 String healthControllerPackageName = getControllerUiPackageName(); 170 171 PackageInfo packageInfo = 172 mPackageManager.getPackageInfo( 173 healthControllerPackageName, 174 PackageManager.PackageInfoFlags.of(PackageManager.GET_PERMISSIONS)); 175 return packageInfo.permissions; 176 } 177 getControllerUiPackageName()178 private String getControllerUiPackageName() throws Exception { 179 return mPackageManager.getPermissionInfo(HealthPermissions.READ_STEPS, /* flags= */ 0) 180 .packageName; 181 } 182 } 183