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