1 /* 2 * Copyright (C) 2017 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.autofillservice.cts; 18 19 import static android.service.autofill.FillResponse.FLAG_DISABLE_ACTIVITY_ONLY; 20 import static android.service.autofill.FillResponse.FLAG_TRACK_CONTEXT_COMMITED; 21 22 import static com.google.common.truth.Truth.assertThat; 23 24 import static org.testng.Assert.assertThrows; 25 26 import android.content.IntentSender; 27 import android.os.Bundle; 28 import android.platform.test.annotations.AppModeFull; 29 import android.service.autofill.Dataset; 30 import android.service.autofill.FillResponse; 31 import android.service.autofill.SaveInfo; 32 import android.service.autofill.UserData; 33 import android.view.autofill.AutofillId; 34 import android.view.autofill.AutofillValue; 35 import android.widget.RemoteViews; 36 37 import org.junit.Test; 38 import org.junit.runner.RunWith; 39 import org.mockito.Mock; 40 import org.mockito.junit.MockitoJUnitRunner; 41 42 @RunWith(MockitoJUnitRunner.class) 43 @AppModeFull // Unit test 44 public class FillResponseTest { 45 46 private final AutofillId mAutofillId = new AutofillId(42); 47 private final FillResponse.Builder mBuilder = new FillResponse.Builder(); 48 private final AutofillId[] mIds = new AutofillId[] { mAutofillId }; 49 private final SaveInfo mSaveInfo = new SaveInfo.Builder(0, mIds).build(); 50 private final Bundle mClientState = new Bundle(); 51 private final Dataset mDataset = new Dataset.Builder() 52 .setValue(mAutofillId, AutofillValue.forText("forty-two")) 53 .build(); 54 private final long mDisableDuration = 666; 55 @Mock private RemoteViews mPresentation; 56 @Mock private RemoteViews mHeader; 57 @Mock private RemoteViews mFooter; 58 @Mock private IntentSender mIntentSender; 59 60 @Test 61 public void testBuilder_setAuthentication_invalid() { 62 // null ids 63 assertThrows(IllegalArgumentException.class, 64 () -> mBuilder.setAuthentication(null, mIntentSender, mPresentation)); 65 // empty ids 66 assertThrows(IllegalArgumentException.class, 67 () -> mBuilder.setAuthentication(new AutofillId[] {}, mIntentSender, 68 mPresentation)); 69 // ids with null value 70 assertThrows(IllegalArgumentException.class, 71 () -> mBuilder.setAuthentication(new AutofillId[] {null}, mIntentSender, 72 mPresentation)); 73 // null intent sender 74 assertThrows(IllegalArgumentException.class, 75 () -> mBuilder.setAuthentication(mIds, null, mPresentation)); 76 // null presentation 77 assertThrows(IllegalArgumentException.class, 78 () -> mBuilder.setAuthentication(mIds, mIntentSender, null)); 79 } 80 81 @Test 82 public void testBuilder_setAuthentication_valid() { 83 new FillResponse.Builder().setAuthentication(mIds, null, null); 84 new FillResponse.Builder().setAuthentication(mIds, mIntentSender, mPresentation); 85 } 86 87 @Test 88 public void testBuilder_setAuthentication_illegalState() { 89 assertThrows(IllegalStateException.class, 90 () -> new FillResponse.Builder().setHeader(mHeader).setAuthentication(mIds, 91 mIntentSender, mPresentation)); 92 assertThrows(IllegalStateException.class, 93 () -> new FillResponse.Builder().setFooter(mFooter).setAuthentication(mIds, 94 mIntentSender, mPresentation)); 95 } 96 97 @Test 98 public void testBuilder_setHeaderOrFooterInvalid() { 99 assertThrows(NullPointerException.class, () -> new FillResponse.Builder().setHeader(null)); 100 assertThrows(NullPointerException.class, () -> new FillResponse.Builder().setFooter(null)); 101 } 102 103 @Test 104 public void testBuilder_setHeaderOrFooterAfterAuthentication() { 105 FillResponse.Builder builder = 106 new FillResponse.Builder().setAuthentication(mIds, mIntentSender, mPresentation); 107 assertThrows(IllegalStateException.class, () -> builder.setHeader(mHeader)); 108 assertThrows(IllegalStateException.class, () -> builder.setHeader(mFooter)); 109 } 110 111 @Test 112 public void testBuilder_setFlag_invalid() { 113 assertThrows(IllegalArgumentException.class, () -> mBuilder.setFlags(-1)); 114 } 115 116 @Test 117 public void testBuilder_setFlag_valid() { 118 mBuilder.setFlags(0); 119 mBuilder.setFlags(FLAG_TRACK_CONTEXT_COMMITED); 120 mBuilder.setFlags(FLAG_DISABLE_ACTIVITY_ONLY); 121 } 122 123 @Test 124 public void testBuilder_disableAutofill_invalid() { 125 assertThrows(IllegalArgumentException.class, () -> mBuilder.disableAutofill(0)); 126 assertThrows(IllegalArgumentException.class, () -> mBuilder.disableAutofill(-1)); 127 } 128 129 @Test 130 public void testBuilder_disableAutofill_valid() { 131 mBuilder.disableAutofill(mDisableDuration); 132 mBuilder.disableAutofill(Long.MAX_VALUE); 133 } 134 135 @Test 136 public void testBuilder_disableAutofill_mustBeTheOnlyMethodCalled() { 137 // No method can be called after disableAutofill() 138 mBuilder.disableAutofill(mDisableDuration); 139 assertThrows(IllegalStateException.class, () -> mBuilder.setSaveInfo(mSaveInfo)); 140 assertThrows(IllegalStateException.class, () -> mBuilder.addDataset(mDataset)); 141 assertThrows(IllegalStateException.class, 142 () -> mBuilder.setAuthentication(mIds, mIntentSender, mPresentation)); 143 assertThrows(IllegalStateException.class, 144 () -> mBuilder.setFieldClassificationIds(mAutofillId)); 145 assertThrows(IllegalStateException.class, 146 () -> mBuilder.setClientState(mClientState)); 147 148 // And vice-versa... 149 final FillResponse.Builder builder1 = new FillResponse.Builder().setSaveInfo(mSaveInfo); 150 assertThrows(IllegalStateException.class, () -> builder1.disableAutofill(mDisableDuration)); 151 final FillResponse.Builder builder2 = new FillResponse.Builder().addDataset(mDataset); 152 assertThrows(IllegalStateException.class, () -> builder2.disableAutofill(mDisableDuration)); 153 final FillResponse.Builder builder3 = 154 new FillResponse.Builder().setAuthentication(mIds, mIntentSender, mPresentation); 155 assertThrows(IllegalStateException.class, () -> builder3.disableAutofill(mDisableDuration)); 156 final FillResponse.Builder builder4 = 157 new FillResponse.Builder().setFieldClassificationIds(mAutofillId); 158 assertThrows(IllegalStateException.class, () -> builder4.disableAutofill(mDisableDuration)); 159 final FillResponse.Builder builder5 = 160 new FillResponse.Builder().setClientState(mClientState); 161 assertThrows(IllegalStateException.class, () -> builder5.disableAutofill(mDisableDuration)); 162 } 163 164 @Test 165 public void testBuilder_setFieldClassificationIds_invalid() { 166 assertThrows(NullPointerException.class, 167 () -> mBuilder.setFieldClassificationIds((AutofillId) null)); 168 assertThrows(NullPointerException.class, 169 () -> mBuilder.setFieldClassificationIds((AutofillId[]) null)); 170 final AutofillId[] oneTooMany = 171 new AutofillId[UserData.getMaxFieldClassificationIdsSize() + 1]; 172 for (int i = 0; i < oneTooMany.length; i++) { 173 oneTooMany[i] = new AutofillId(i); 174 } 175 assertThrows(IllegalArgumentException.class, 176 () -> mBuilder.setFieldClassificationIds(oneTooMany)); 177 } 178 179 @Test 180 public void testBuilder_setFieldClassificationIds_valid() { 181 mBuilder.setFieldClassificationIds(mAutofillId); 182 } 183 184 @Test 185 public void testBuilder_setFieldClassificationIds_setsFlag() { 186 mBuilder.setFieldClassificationIds(mAutofillId); 187 assertThat(mBuilder.build().getFlags()).isEqualTo(FLAG_TRACK_CONTEXT_COMMITED); 188 } 189 190 @Test 191 public void testBuilder_setFieldClassificationIds_addsFlag() { 192 mBuilder.setFlags(FLAG_DISABLE_ACTIVITY_ONLY).setFieldClassificationIds(mAutofillId); 193 assertThat(mBuilder.build().getFlags()) 194 .isEqualTo(FLAG_TRACK_CONTEXT_COMMITED | FLAG_DISABLE_ACTIVITY_ONLY); 195 } 196 197 @Test 198 public void testBuild_invalid() { 199 assertThrows(IllegalStateException.class, () -> mBuilder.build()); 200 } 201 202 @Test 203 public void testBuild_valid() { 204 // authentication only 205 assertThat(new FillResponse.Builder().setAuthentication(mIds, mIntentSender, mPresentation) 206 .build()).isNotNull(); 207 // save info only 208 assertThat(new FillResponse.Builder().setSaveInfo(mSaveInfo).build()).isNotNull(); 209 // dataset only 210 assertThat(new FillResponse.Builder().addDataset(mDataset).build()).isNotNull(); 211 // disable autofill only 212 assertThat(new FillResponse.Builder().disableAutofill(mDisableDuration).build()) 213 .isNotNull(); 214 // fill detection only 215 assertThat(new FillResponse.Builder().setFieldClassificationIds(mAutofillId).build()) 216 .isNotNull(); 217 // client state only 218 assertThat(new FillResponse.Builder().setClientState(mClientState).build()) 219 .isNotNull(); 220 } 221 222 @Test 223 public void testBuilder_build_headerOrFooterWithoutDatasets() { 224 assertThrows(IllegalStateException.class, 225 () -> new FillResponse.Builder().setHeader(mHeader).build()); 226 assertThrows(IllegalStateException.class, 227 () -> new FillResponse.Builder().setFooter(mFooter).build()); 228 } 229 230 @Test 231 public void testNoMoreInteractionsAfterBuild() { 232 assertThat(mBuilder.setAuthentication(mIds, mIntentSender, mPresentation).build()) 233 .isNotNull(); 234 235 assertThrows(IllegalStateException.class, () -> mBuilder.build()); 236 assertThrows(IllegalStateException.class, 237 () -> mBuilder.setAuthentication(mIds, mIntentSender, mPresentation).build()); 238 assertThrows(IllegalStateException.class, () -> mBuilder.setIgnoredIds(mIds)); 239 assertThrows(IllegalStateException.class, () -> mBuilder.addDataset(null)); 240 assertThrows(IllegalStateException.class, () -> mBuilder.setSaveInfo(mSaveInfo)); 241 assertThrows(IllegalStateException.class, () -> mBuilder.setClientState(mClientState)); 242 assertThrows(IllegalStateException.class, () -> mBuilder.setFlags(0)); 243 assertThrows(IllegalStateException.class, 244 () -> mBuilder.setFieldClassificationIds(mAutofillId)); 245 assertThrows(IllegalStateException.class, () -> mBuilder.setHeader(mHeader)); 246 assertThrows(IllegalStateException.class, () -> mBuilder.setFooter(mFooter)); 247 } 248 } 249