1 /* 2 * Copyright (C) 2024 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 package android.healthconnect.aidl; 17 18 import static android.health.connect.Constants.MAXIMUM_PAGE_SIZE; 19 import static android.health.connect.Constants.MINIMUM_PAGE_SIZE; 20 import static android.health.connect.datatypes.MedicalResource.MEDICAL_RESOURCE_TYPE_VACCINES; 21 import static android.healthconnect.cts.phr.utils.PhrDataFactory.DATA_SOURCE_ID; 22 import static android.healthconnect.cts.phr.utils.PhrDataFactory.DIFFERENT_DATA_SOURCE_ID; 23 import static android.healthconnect.cts.phr.utils.PhrDataFactory.PAGE_TOKEN; 24 import static android.healthconnect.cts.utils.TestUtils.setFieldValueUsingReflection; 25 26 import static com.google.common.truth.Truth.assertThat; 27 28 import static org.junit.Assert.assertThrows; 29 30 import android.health.connect.ReadMedicalResourcesInitialRequest; 31 import android.health.connect.ReadMedicalResourcesPageRequest; 32 import android.health.connect.aidl.ReadMedicalResourcesRequestParcel; 33 import android.os.Parcel; 34 35 import org.junit.Test; 36 37 import java.util.Set; 38 39 public class ReadMedicalResourcesRequestParcelTest { 40 41 @Test testWriteInitialRequestToParcelThenRestore_propertiesAreIdentical()42 public void testWriteInitialRequestToParcelThenRestore_propertiesAreIdentical() { 43 ReadMedicalResourcesInitialRequest original = 44 new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES) 45 .addDataSourceId(DATA_SOURCE_ID) 46 .addDataSourceId(DIFFERENT_DATA_SOURCE_ID) 47 .setPageSize(100) 48 .build(); 49 50 Parcel parcel = Parcel.obtain(); 51 original.toParcel().writeToParcel(parcel, 0); 52 parcel.setDataPosition(0); 53 ReadMedicalResourcesRequestParcel restoredParcel = 54 ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel); 55 56 assertThat(restoredParcel.getMedicalResourceType()) 57 .isEqualTo(MEDICAL_RESOURCE_TYPE_VACCINES); 58 assertThat(restoredParcel.getDataSourceIds()) 59 .containsExactly(DATA_SOURCE_ID, DIFFERENT_DATA_SOURCE_ID); 60 assertThat(restoredParcel.getPageToken()).isNull(); 61 assertThat(restoredParcel.getPageSize()).isEqualTo(100); 62 parcel.recycle(); 63 } 64 65 @Test testWritePageRequestToParcelThenRestore_propertiesAreIdentical()66 public void testWritePageRequestToParcelThenRestore_propertiesAreIdentical() { 67 ReadMedicalResourcesPageRequest original = 68 new ReadMedicalResourcesPageRequest.Builder(PAGE_TOKEN).setPageSize(100).build(); 69 70 Parcel parcel = Parcel.obtain(); 71 original.toParcel().writeToParcel(parcel, 0); 72 parcel.setDataPosition(0); 73 ReadMedicalResourcesRequestParcel restoredParcel = 74 ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel); 75 76 assertThat(restoredParcel.getMedicalResourceType()).isEqualTo(0); 77 assertThat(restoredParcel.getDataSourceIds()).isEmpty(); 78 assertThat(restoredParcel.getPageToken()).isEqualTo(PAGE_TOKEN); 79 assertThat(restoredParcel.getPageSize()).isEqualTo(100); 80 } 81 82 @Test testRestoreInvalidPageRequestFromParcel_nullPageToken_expectException()83 public void testRestoreInvalidPageRequestFromParcel_nullPageToken_expectException() 84 throws NoSuchFieldException, IllegalAccessException { 85 ReadMedicalResourcesPageRequest original = 86 new ReadMedicalResourcesPageRequest.Builder(PAGE_TOKEN).setPageSize(100).build(); 87 setFieldValueUsingReflection(original, "mPageToken", null); 88 89 Parcel parcel = Parcel.obtain(); 90 original.toParcel().writeToParcel(parcel, 0); 91 parcel.setDataPosition(0); 92 93 assertThrows( 94 IllegalArgumentException.class, 95 () -> ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel)); 96 } 97 98 @Test testRestoreInvalidMedicalResourceTypeFromParcel_expectException()99 public void testRestoreInvalidMedicalResourceTypeFromParcel_expectException() 100 throws NoSuchFieldException, IllegalAccessException { 101 ReadMedicalResourcesRequestParcel original = 102 new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES) 103 .addDataSourceId(DATA_SOURCE_ID) 104 .addDataSourceId(DIFFERENT_DATA_SOURCE_ID) 105 .setPageSize(100) 106 .build() 107 .toParcel(); 108 setFieldValueUsingReflection(original, "mMedicalResourceType", -1); 109 110 Parcel parcel = Parcel.obtain(); 111 original.writeToParcel(parcel, 0); 112 parcel.setDataPosition(0); 113 114 assertThrows( 115 IllegalArgumentException.class, 116 () -> ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel)); 117 } 118 119 @Test testRestoreInvalidDataSourceIdFromParcel_expectException()120 public void testRestoreInvalidDataSourceIdFromParcel_expectException() 121 throws NoSuchFieldException, IllegalAccessException { 122 ReadMedicalResourcesRequestParcel original = 123 new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES) 124 .addDataSourceId(DATA_SOURCE_ID) 125 .addDataSourceId(DIFFERENT_DATA_SOURCE_ID) 126 .setPageSize(100) 127 .build() 128 .toParcel(); 129 setFieldValueUsingReflection(original, "mDataSourceIds", Set.of("1")); 130 131 Parcel parcel = Parcel.obtain(); 132 original.writeToParcel(parcel, 0); 133 parcel.setDataPosition(0); 134 135 assertThrows( 136 IllegalArgumentException.class, 137 () -> ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel)); 138 } 139 140 @Test testRestoreTooSmallPageSizeFromParcel_expectException()141 public void testRestoreTooSmallPageSizeFromParcel_expectException() 142 throws NoSuchFieldException, IllegalAccessException { 143 ReadMedicalResourcesRequestParcel original = 144 new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES) 145 .addDataSourceId(DATA_SOURCE_ID) 146 .addDataSourceId(DIFFERENT_DATA_SOURCE_ID) 147 .setPageSize(100) 148 .build() 149 .toParcel(); 150 setFieldValueUsingReflection(original, "mPageSize", MINIMUM_PAGE_SIZE - 1); 151 152 Parcel parcel = Parcel.obtain(); 153 original.writeToParcel(parcel, 0); 154 parcel.setDataPosition(0); 155 156 assertThrows( 157 IllegalArgumentException.class, 158 () -> ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel)); 159 } 160 161 @Test testRestoreTooLargePageSizeFromParcel_expectException()162 public void testRestoreTooLargePageSizeFromParcel_expectException() 163 throws NoSuchFieldException, IllegalAccessException { 164 ReadMedicalResourcesRequestParcel original = 165 new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES) 166 .addDataSourceId(DATA_SOURCE_ID) 167 .addDataSourceId(DIFFERENT_DATA_SOURCE_ID) 168 .setPageSize(100) 169 .build() 170 .toParcel(); 171 setFieldValueUsingReflection(original, "mPageSize", MAXIMUM_PAGE_SIZE + 1); 172 173 Parcel parcel = Parcel.obtain(); 174 original.writeToParcel(parcel, 0); 175 parcel.setDataPosition(0); 176 177 assertThrows( 178 IllegalArgumentException.class, 179 () -> ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel)); 180 } 181 } 182