Home | History | Annotate | Download | only in cts
      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