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
25 import static com.google.common.truth.Truth.assertThat;
26
27 import static org.junit.Assert.assertThrows;
28
29 import android.annotation.Nullable;
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 androidx.test.ext.junit.runners.AndroidJUnit4;
36
37 import org.junit.Test;
38 import org.junit.runner.RunWith;
39
40 import java.util.ArrayList;
41 import java.util.Set;
42
43 @RunWith(AndroidJUnit4.class)
44 public class ReadMedicalResourcesRequestParcelTest {
45
46 @Test
testWriteInitialRequestToParcelThenRestore_propertiesAreIdentical()47 public void testWriteInitialRequestToParcelThenRestore_propertiesAreIdentical() {
48 ReadMedicalResourcesInitialRequest original =
49 new ReadMedicalResourcesInitialRequest.Builder(MEDICAL_RESOURCE_TYPE_VACCINES)
50 .addDataSourceId(DATA_SOURCE_ID)
51 .addDataSourceId(DIFFERENT_DATA_SOURCE_ID)
52 .setPageSize(100)
53 .build();
54
55 Parcel parcel = Parcel.obtain();
56 original.toParcel().writeToParcel(parcel, 0);
57 parcel.setDataPosition(0);
58 ReadMedicalResourcesRequestParcel restoredParcel =
59 ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel);
60
61 assertThat(restoredParcel.getMedicalResourceType())
62 .isEqualTo(MEDICAL_RESOURCE_TYPE_VACCINES);
63 assertThat(restoredParcel.getDataSourceIds())
64 .containsExactly(DATA_SOURCE_ID, DIFFERENT_DATA_SOURCE_ID);
65 assertThat(restoredParcel.getPageToken()).isNull();
66 assertThat(restoredParcel.getPageSize()).isEqualTo(100);
67 parcel.recycle();
68 }
69
70 @Test
testWritePageRequestToParcelThenRestore_propertiesAreIdentical()71 public void testWritePageRequestToParcelThenRestore_propertiesAreIdentical() {
72 ReadMedicalResourcesPageRequest original =
73 new ReadMedicalResourcesPageRequest.Builder(PAGE_TOKEN).setPageSize(100).build();
74
75 Parcel parcel = Parcel.obtain();
76 original.toParcel().writeToParcel(parcel, 0);
77 parcel.setDataPosition(0);
78 ReadMedicalResourcesRequestParcel restoredParcel =
79 ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel);
80
81 assertThat(restoredParcel.getMedicalResourceType()).isEqualTo(0);
82 assertThat(restoredParcel.getDataSourceIds()).isEmpty();
83 assertThat(restoredParcel.getPageToken()).isEqualTo(PAGE_TOKEN);
84 assertThat(restoredParcel.getPageSize()).isEqualTo(100);
85 }
86
87 @Test
testRestoreInvalidPageRequestFromParcel_nullPageToken_expectException()88 public void testRestoreInvalidPageRequestFromParcel_nullPageToken_expectException()
89 throws NoSuchFieldException, IllegalAccessException {
90 // Write a bad parcel which has a null page token
91 Parcel parcel =
92 createUnvalidatedParcel(
93 /* isPageRequest= */ true,
94 /* medicalResourceType= */ 0,
95 /* dataSourceIds= */ Set.of(),
96 /* pageToken= */ null, // bad value being tested
97 /* pageSize= */ 100);
98
99 assertThrows(
100 IllegalArgumentException.class,
101 () -> ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel));
102 }
103
104 @Test
testRestoreInvalidMedicalResourceTypeFromParcel_expectException()105 public void testRestoreInvalidMedicalResourceTypeFromParcel_expectException() {
106 Parcel parcel =
107 createUnvalidatedParcel(
108 /* isPageRequest= */ false,
109 /* medicalResourceType= */ -1, // bad value being tested
110 /* dataSourceIds= */ Set.of(DATA_SOURCE_ID, DIFFERENT_DATA_SOURCE_ID),
111 /* pageToken= */ null,
112 /* pageSize= */ 100);
113
114 assertThrows(
115 IllegalArgumentException.class,
116 () -> ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel));
117 }
118
119 @Test
testRestoreInvalidDataSourceIdFromParcel_expectException()120 public void testRestoreInvalidDataSourceIdFromParcel_expectException() {
121 Parcel parcel =
122 createUnvalidatedParcel(
123 /* isPageRequest= */ false,
124 /* medicalResourceType= */ MEDICAL_RESOURCE_TYPE_VACCINES,
125 /* dataSourceIds= */ Set.of("1"), // bad value being tested, must be uuid
126 /* pageToken= */ null,
127 /* pageSize= */ 100);
128
129 assertThrows(
130 IllegalArgumentException.class,
131 () -> ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel));
132 }
133
134 @Test
testRestoreTooSmallPageSizeFromParcel_expectException()135 public void testRestoreTooSmallPageSizeFromParcel_expectException() {
136 Parcel parcel =
137 createUnvalidatedParcel(
138 /* isPageRequest= */ false,
139 /* medicalResourceType= */ MEDICAL_RESOURCE_TYPE_VACCINES,
140 /* dataSourceIds= */ Set.of(DATA_SOURCE_ID, DIFFERENT_DATA_SOURCE_ID),
141 /* pageToken= */ null,
142 /* pageSize= */ MINIMUM_PAGE_SIZE - 1); // bad value being tested
143
144 assertThrows(
145 IllegalArgumentException.class,
146 () -> ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel));
147 }
148
149 @Test
testRestoreTooLargePageSizeFromParcel_expectException()150 public void testRestoreTooLargePageSizeFromParcel_expectException() {
151 Parcel parcel =
152 createUnvalidatedParcel(
153 /* isPageRequest= */ false,
154 /* medicalResourceType= */ MEDICAL_RESOURCE_TYPE_VACCINES,
155 /* dataSourceIds= */ Set.of(DATA_SOURCE_ID, DIFFERENT_DATA_SOURCE_ID),
156 /* pageToken= */ null,
157 /* pageSize= */ MAXIMUM_PAGE_SIZE + 1); // bad value being tested
158
159 assertThrows(
160 IllegalArgumentException.class,
161 () -> ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(parcel));
162 }
163
164 @Test
testCreateUnvalidatedParcel_byDefault_success()165 public void testCreateUnvalidatedParcel_byDefault_success() {
166 Parcel goodParcel =
167 createUnvalidatedParcel(
168 /* isPageRequest= */ false,
169 /* medicalResourceType= */ MEDICAL_RESOURCE_TYPE_VACCINES,
170 /* dataSourceIds= */ Set.of(DATA_SOURCE_ID, DIFFERENT_DATA_SOURCE_ID),
171 /* pageToken= */ null,
172 /* pageSize= */ 100);
173
174 ReadMedicalResourcesRequestParcel restored =
175 ReadMedicalResourcesRequestParcel.CREATOR.createFromParcel(goodParcel);
176 assertThat(restored.getMedicalResourceType()).isEqualTo(MEDICAL_RESOURCE_TYPE_VACCINES);
177 assertThat(restored.getDataSourceIds())
178 .containsExactly(DATA_SOURCE_ID, DIFFERENT_DATA_SOURCE_ID);
179 assertThat(restored.getPageToken()).isNull();
180 assertThat(restored.getPageSize()).isEqualTo(100);
181 }
182
183 /**
184 * Create a parcel with values that cannot be created with the normal builder (because it
185 * validates), but need to be tested as they could be received from apps.
186 */
createUnvalidatedParcel( boolean isPageRequest, int medicalResourceType, Set<String> dataSourceIds, @Nullable String pageToken, int pageSize)187 private static Parcel createUnvalidatedParcel(
188 boolean isPageRequest,
189 int medicalResourceType,
190 Set<String> dataSourceIds,
191 @Nullable String pageToken,
192 int pageSize) {
193 Parcel parcel = Parcel.obtain();
194 parcel.writeBoolean(isPageRequest);
195 parcel.writeInt(medicalResourceType);
196 parcel.writeStringList(new ArrayList<>(dataSourceIds));
197 parcel.writeString(pageToken);
198 parcel.writeInt(pageSize);
199 parcel.setDataPosition(0);
200 return parcel;
201 }
202 }
203