• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 com.android.bedstead.testapp;
18 
19 import static com.android.queryable.annotations.IntegerQuery.DEFAULT_INT_QUERY_PARAMETERS_VALUE;
20 import static com.android.queryable.queries.ActivityQuery.activity;
21 
22 import static com.google.common.truth.Truth.assertThat;
23 
24 import static org.testng.Assert.assertThrows;
25 
26 import com.android.bedstead.harrier.BedsteadJUnit4;
27 import com.android.bedstead.harrier.DeviceState;
28 import com.android.bedstead.nene.types.OptionalBoolean;
29 import com.android.queryable.annotations.IntegerQuery;
30 import com.android.queryable.annotations.Query;
31 import com.android.queryable.annotations.StringQuery;
32 
33 import com.google.auto.value.AutoAnnotation;
34 
35 import org.junit.Before;
36 import org.junit.ClassRule;
37 import org.junit.Ignore;
38 import org.junit.Rule;
39 import org.junit.Test;
40 import org.junit.runner.RunWith;
41 
42 import java.util.HashSet;
43 import java.util.Set;
44 import java.util.stream.Collectors;
45 
46 @RunWith(BedsteadJUnit4.class)
47 public final class TestAppProviderTest {
48 
49     @ClassRule
50     @Rule
51     public static final DeviceState sDeviceState = new DeviceState();
52 
53     // Expects that this package name matches an actual test app
54     private static final String EXISTING_PACKAGENAME = "com.android.bedstead.testapp.EmptyTestApp";
55 
56     // Expects that this package name does not match an actual test app
57     private static final String NOT_EXISTING_PACKAGENAME = "not.existing.test.app";
58 
59     // Expected to be a class name which is used in a test app
60     private static final String KNOWN_EXISTING_TESTAPP_ACTIVITY_CLASSNAME =
61             "android.testapp.activity";
62 
63     private static final String QUERY_ONLY_TEST_APP_PACKAGE_NAME = "com.android.cts.RemoteDPC";
64 
65     private static final String PERMISSION_DECLARED_BY_TESTAPP = "android.permission.READ_CALENDAR";
66 
67     private static final String METADATA_KEY = "test-metadata-key";
68     private static final String METADATA_VALUE = "test-metadata-value";
69 
70     private static final String STRING_VALUE = "String";
71     private static final String DIFFERENT_STRING_VALUE = "Different String";
72 
73     private static final int INTEGER_VALUE = 10;
74     private static final int HIGHER_INTEGER_VALUE = 11;
75     private static final int LOWER_INTEGER_VALUE = 9;
76 
77     private TestAppProvider mTestAppProvider;
78 
79     @AutoAnnotation
query(StringQuery packageName, IntegerQuery minSdkVersion, IntegerQuery maxSdkVersion, IntegerQuery targetSdkVersion)80     public static Query query(StringQuery packageName, IntegerQuery minSdkVersion, IntegerQuery maxSdkVersion, IntegerQuery targetSdkVersion) {
81         return new AutoAnnotation_TestAppProviderTest_query(packageName, minSdkVersion, maxSdkVersion, targetSdkVersion);
82     }
83 
84     @AutoAnnotation
stringQuery(String startsWith, String isEqualTo, String isNotEqualTo, OptionalBoolean isNull)85     public static StringQuery stringQuery(String startsWith, String isEqualTo, String isNotEqualTo, OptionalBoolean isNull) {
86         return new AutoAnnotation_TestAppProviderTest_stringQuery(startsWith, isEqualTo, isNotEqualTo, isNull);
87     }
88 
89     @AutoAnnotation
integerQuery(int isEqualTo, int isGreaterThan, int isGreaterThanOrEqualTo, int isLessThan, int isLessThanOrEqualTo)90     public static IntegerQuery integerQuery(int isEqualTo, int isGreaterThan, int isGreaterThanOrEqualTo, int isLessThan, int isLessThanOrEqualTo) {
91         return new AutoAnnotation_TestAppProviderTest_integerQuery(isEqualTo, isGreaterThan, isGreaterThanOrEqualTo, isLessThan, isLessThanOrEqualTo);
92     }
93 
94     static final class QueryBuilder {
95         private StringQuery mPackageName = null;
96         private IntegerQuery mMinSdkVersion = null;
97         private IntegerQuery mMaxSdkVersion = null;
98         private IntegerQuery mTargetSdkVersion = null;
99 
packageName(StringQuery packageName)100         public QueryBuilder packageName(StringQuery packageName) {
101             mPackageName = packageName;
102             return this;
103         }
104 
minSdkVersion(IntegerQuery minSdkVersion)105         public QueryBuilder minSdkVersion(IntegerQuery minSdkVersion) {
106             mMinSdkVersion = minSdkVersion;
107             return this;
108         }
109 
maxSdkVersion(IntegerQuery maxSdkVersion)110         public QueryBuilder maxSdkVersion(IntegerQuery maxSdkVersion) {
111             mMaxSdkVersion = maxSdkVersion;
112             return this;
113         }
114 
targetSdkVersion(IntegerQuery targetSdkVersion)115         public QueryBuilder targetSdkVersion(IntegerQuery targetSdkVersion) {
116             mTargetSdkVersion = targetSdkVersion;
117             return this;
118         }
119 
build()120         public Query build() {
121             return query(
122                     mPackageName != null ? mPackageName : stringQueryBuilder().build(),
123                     mMinSdkVersion != null ? mMinSdkVersion : integerQueryBuilder().build(),
124                     mMaxSdkVersion != null ? mMaxSdkVersion : integerQueryBuilder().build(),
125                     mTargetSdkVersion != null ? mTargetSdkVersion : integerQueryBuilder().build()
126             );
127         }
128     }
129 
130     static final class StringQueryBuilder {
131         private String mStartsWith = StringQuery.DEFAULT_STRING_QUERY_PARAMETERS_VALUE;
132         private String mIsEqualTo = StringQuery.DEFAULT_STRING_QUERY_PARAMETERS_VALUE;
133         private String mIsNotEqualTo = StringQuery.DEFAULT_STRING_QUERY_PARAMETERS_VALUE;
134         private OptionalBoolean mIsNull = OptionalBoolean.ANY;
135 
startsWith(String startsWith)136         public StringQueryBuilder startsWith(String startsWith) {
137             mStartsWith = startsWith;
138             return this;
139         }
140 
isEqualTo(String isEqualTo)141         public StringQueryBuilder isEqualTo(String isEqualTo) {
142             mIsEqualTo = isEqualTo;
143             return this;
144         }
145 
isNotEqualTo(String isNotEqualTo)146         public StringQueryBuilder isNotEqualTo(String isNotEqualTo) {
147             mIsNotEqualTo = isNotEqualTo;
148             return this;
149         }
150 
isNull(OptionalBoolean isNull)151         public StringQueryBuilder isNull(OptionalBoolean isNull) {
152             mIsNull = isNull;
153             return this;
154         }
155 
build()156         public StringQuery build() {
157             return stringQuery(mStartsWith, mIsEqualTo, mIsNotEqualTo, mIsNull);
158         }
159     }
160 
161     static final class IntegerQueryBuilder {
162         private int mIsEqualTo = DEFAULT_INT_QUERY_PARAMETERS_VALUE;
163         private int mIsGreaterThan = DEFAULT_INT_QUERY_PARAMETERS_VALUE;
164         private int mIsGreaterThanOrEqualTo = DEFAULT_INT_QUERY_PARAMETERS_VALUE;
165         private int mIsLessThan = DEFAULT_INT_QUERY_PARAMETERS_VALUE;
166         private int mIsLessThanOrEqualTo = DEFAULT_INT_QUERY_PARAMETERS_VALUE;
167 
isEqualTo(int isEqualTo)168         public IntegerQueryBuilder isEqualTo(int isEqualTo) {
169             mIsEqualTo = isEqualTo;
170             return this;
171         }
172 
isGreaterThan(int isGreaterThan)173         public IntegerQueryBuilder isGreaterThan(int isGreaterThan) {
174             mIsGreaterThan = isGreaterThan;
175             return this;
176         }
177 
isGreaterThanOrEqualTo(int isGreaterThanOrEqualTo)178         public IntegerQueryBuilder isGreaterThanOrEqualTo(int isGreaterThanOrEqualTo) {
179             mIsGreaterThanOrEqualTo = isGreaterThanOrEqualTo;
180             return this;
181         }
182 
isLessThan(int isLessThan)183         public IntegerQueryBuilder isLessThan(int isLessThan) {
184             mIsLessThan = isLessThan;
185             return this;
186         }
187 
isLessThanOrEqualTo(int isLessThanOrEqualTo)188         public IntegerQueryBuilder isLessThanOrEqualTo(int isLessThanOrEqualTo) {
189             mIsLessThanOrEqualTo = isLessThanOrEqualTo;
190             return this;
191         }
192 
build()193         public IntegerQuery build() {
194             return integerQuery(
195                     mIsEqualTo,
196                     mIsGreaterThan, mIsGreaterThanOrEqualTo,
197                     mIsLessThan, mIsLessThanOrEqualTo);
198         }
199     }
200 
201     // TODO: The below AutoBuilder should work instead of the custom one but we get
202     // [AutoBuilderNoVisible] No visible constructor for com.android.queryable.annotations.Query
203 
204 //    @AutoBuilder(ofClass = Query.class)
205 //    interface QueryBuilder {
206 //        QueryBuilder packageName(StringQuery packageName);
207 //        QueryBuilder minSdkVersion(IntegerQuery minSdkVersion);
208 //        QueryBuilder maxSdkVersion(IntegerQuery maxSdkVersion);
209 //        QueryBuilder targetSdkVersion(IntegerQuery targetSdkVersion);
210 //        Query build();
211 //    }
212 
213 //    @AutoBuilder(ofClass = StringQuery.class)
214 //    interface StringQueryBuilder {
215 //        StringQueryBuilder startsWith(String startsWith);
216 //        StringQueryBuilder isEqualTo(String isEqualTo);
217 //        StringQueryBuilder isNotEqualTo(String isNotEqualTo);
218 //        StringQueryBuilder isNull(OptionalBoolean isNull);
219 //        StringQuery build();
220 //    }
221 //
222 //    @AutoBuilder(ofClass = IntegerQuery.class)
223 //    interface IntegerQueryBuilder {
224 //        IntegerQueryBuilder isEqualTo(int isEqualTo);
225 //        IntegerQueryBuilder isGreaterThan(int isGreaterThan);
226 //        IntegerQueryBuilder isGreaterThanOrEqualTo(int isGreaterThanOrEqualTo);
227 //        IntegerQueryBuilder isLessThan(int isLessThan);
228 //        IntegerQueryBuilder isLessThanOrEqualTo(int isLessThanOrEqualTo);
229 //        IntegerQuery build();
230 //    }
231 
queryBuilder()232     static QueryBuilder queryBuilder() {
233         return new QueryBuilder();
234     }
235 
stringQueryBuilder()236     static StringQueryBuilder stringQueryBuilder() {
237         return new StringQueryBuilder();
238     }
239 
integerQueryBuilder()240     static IntegerQueryBuilder integerQueryBuilder() {
241         return new IntegerQueryBuilder();
242     }
243 
244     @Before
setup()245     public void setup() {
246         mTestAppProvider = new TestAppProvider();
247     }
248 
249     @Test
get_queryMatches_returnsTestApp()250     public void get_queryMatches_returnsTestApp() {
251         TestAppQueryBuilder query = mTestAppProvider.query()
252                 .wherePackageName().isEqualTo(EXISTING_PACKAGENAME);
253 
254         assertThat(query.get()).isNotNull();
255     }
256 
257     @Test
get_queryMatches_packageNameIsSet()258     public void get_queryMatches_packageNameIsSet() {
259         TestAppQueryBuilder query = mTestAppProvider.query()
260                 .wherePackageName().isEqualTo(EXISTING_PACKAGENAME);
261 
262         assertThat(query.get().packageName()).isEqualTo(EXISTING_PACKAGENAME);
263     }
264 
265     @Test
get_queryDoesNotMatch_throwsException()266     public void get_queryDoesNotMatch_throwsException() {
267         TestAppQueryBuilder query = mTestAppProvider.query()
268                 .wherePackageName().isEqualTo(NOT_EXISTING_PACKAGENAME);
269 
270         assertThrows(NotFoundException.class, query::get);
271     }
272 
273     @Test
any_returnsTestApp()274     public void any_returnsTestApp() {
275         assertThat(mTestAppProvider.any()).isNotNull();
276     }
277 
278     @Test
any_returnsDifferentTestApps()279     public void any_returnsDifferentTestApps() {
280         assertThat(mTestAppProvider.any()).isNotEqualTo(mTestAppProvider.any());
281     }
282 
283     @Test
query_onlyReturnsTestAppOnce()284     public void query_onlyReturnsTestAppOnce() {
285         mTestAppProvider.query().wherePackageName().isEqualTo(EXISTING_PACKAGENAME).get();
286 
287         TestAppQueryBuilder query = mTestAppProvider.query().wherePackageName().isEqualTo(EXISTING_PACKAGENAME);
288 
289         assertThrows(NotFoundException.class, query::get);
290     }
291 
292     @Test
query_afterRestore_returnsTestAppAgain()293     public void query_afterRestore_returnsTestAppAgain() {
294         mTestAppProvider.snapshot();
295         mTestAppProvider.query().wherePackageName().isEqualTo(EXISTING_PACKAGENAME).get();
296 
297         mTestAppProvider.restore();
298 
299         assertThat(mTestAppProvider.query().wherePackageName()
300                 .isEqualTo(EXISTING_PACKAGENAME).get()).isNotNull();
301     }
302 
303     @Test
query_afterRestoreWithAppAlreadyUsed_doesNotReturnTestAppAgain()304     public void query_afterRestoreWithAppAlreadyUsed_doesNotReturnTestAppAgain() {
305         mTestAppProvider.query().wherePackageName().isEqualTo(EXISTING_PACKAGENAME).get();
306         mTestAppProvider.snapshot();
307 
308         mTestAppProvider.restore();
309 
310         TestAppQueryBuilder query =
311                 mTestAppProvider.query().wherePackageName().isEqualTo(EXISTING_PACKAGENAME);
312         assertThrows(NotFoundException.class, query::get);
313     }
314 
315     @Test
restore_noSnapshot_throwsException()316     public void restore_noSnapshot_throwsException() {
317         assertThrows(IllegalStateException.class, mTestAppProvider::restore);
318     }
319 
320     @Test
any_doesNotReturnPackageQueryOnlyTestApps()321     public void any_doesNotReturnPackageQueryOnlyTestApps() {
322         Set<String> testAppPackageNames = new HashSet<>();
323 
324         while (true) {
325             try {
326                 testAppPackageNames.add(mTestAppProvider.any().packageName());
327             } catch (NotFoundException e) {
328                 // Expected when we run out of test apps
329                 break;
330             }
331         }
332 
333         assertThat(testAppPackageNames).doesNotContain(QUERY_ONLY_TEST_APP_PACKAGE_NAME);
334     }
335 
336     @Test
query_queryByPackageName_doesReturnPackageQueryOnlyTestApps()337     public void query_queryByPackageName_doesReturnPackageQueryOnlyTestApps() {
338         assertThat(
339                 mTestAppProvider.query()
340                         .wherePackageName().isEqualTo(QUERY_ONLY_TEST_APP_PACKAGE_NAME)
341                         .get()).isNotNull();
342     }
343 
344     @Test
query_byFeature_returnsDifferentTestAppsForSameQuery()345     public void query_byFeature_returnsDifferentTestAppsForSameQuery() {
346         TestApp firstResult = mTestAppProvider.query()
347                 .whereTestOnly().isFalse()
348                 .get();
349         TestApp secondResult = mTestAppProvider.query()
350                 .whereTestOnly().isFalse()
351                 .get();
352 
353         assertThat(firstResult).isNotEqualTo(secondResult);
354     }
355 
356     @Test
query_testOnly_returnsMatching()357     public void query_testOnly_returnsMatching() {
358         TestApp testApp = mTestAppProvider.query()
359                 .whereTestOnly().isTrue()
360                 .get();
361 
362         assertThat(testApp.testOnly()).isTrue();
363     }
364 
365     @Test
query_notTestOnly_returnsMatching()366     public void query_notTestOnly_returnsMatching() {
367         TestApp testApp = mTestAppProvider.query()
368                 .whereTestOnly().isFalse()
369                 .get();
370 
371         assertThat(testApp.testOnly()).isFalse();
372     }
373 
374     @Test
query_minSdkVersion_returnsMatching()375     public void query_minSdkVersion_returnsMatching() {
376         TestApp testApp = mTestAppProvider.query()
377                 .whereMinSdkVersion().isGreaterThanOrEqualTo(28)
378                 .get();
379 
380         assertThat(testApp.minSdkVersion()).isAtLeast(28);
381     }
382 
383     @Test
query_targetSdkVersion_returnsMatching()384     public void query_targetSdkVersion_returnsMatching() {
385         TestApp testApp = mTestAppProvider.query()
386                 .whereTargetSdkVersion().isGreaterThanOrEqualTo(28)
387                 .get();
388 
389         assertThat(testApp.targetSdkVersion()).isAtLeast(28);
390     }
391 
392     @Test
query_withPermission_returnsMatching()393     public void query_withPermission_returnsMatching() {
394         TestApp testApp = mTestAppProvider.query()
395                 .wherePermissions().contains(PERMISSION_DECLARED_BY_TESTAPP)
396                 .get();
397 
398         assertThat(testApp.permissions()).contains(PERMISSION_DECLARED_BY_TESTAPP);
399     }
400 
401     @Test
query_withoutPermission_returnsMatching()402     public void query_withoutPermission_returnsMatching() {
403         TestApp testApp = mTestAppProvider.query()
404                 .wherePermissions().doesNotContain(PERMISSION_DECLARED_BY_TESTAPP)
405                 .get();
406 
407         assertThat(testApp.permissions()).doesNotContain(PERMISSION_DECLARED_BY_TESTAPP);
408     }
409 
410     @Test
query_metadata_returnsMatching()411     public void query_metadata_returnsMatching() {
412         TestApp testApp = mTestAppProvider.query()
413                 .whereMetadata().key(METADATA_KEY).stringValue().isEqualTo(METADATA_VALUE)
414                 .get();
415 
416         assertThat(testApp.metadata().get(METADATA_KEY)).isEqualTo(METADATA_VALUE);
417     }
418 
419     @Test
query_withExistingActivity_returnsMatching()420     public void query_withExistingActivity_returnsMatching() {
421         TestApp testApp = mTestAppProvider.query()
422                 .whereActivities().contains(
423                         activity().where().activityClass()
424                             .className().isEqualTo(KNOWN_EXISTING_TESTAPP_ACTIVITY_CLASSNAME)
425                 )
426                 .get();
427 
428         Set<String> activityClassNames = testApp.activities().stream()
429                 .map(a -> a.className()).collect(Collectors.toSet());
430         assertThat(activityClassNames).contains(KNOWN_EXISTING_TESTAPP_ACTIVITY_CLASSNAME);
431     }
432 
433     @Test
query_withAnyActivity_returnsMatching()434     public void query_withAnyActivity_returnsMatching() {
435         TestApp testApp = mTestAppProvider.query()
436                 .whereActivities().isNotEmpty()
437                 .get();
438 
439         assertThat(testApp.activities()).isNotEmpty();
440     }
441 
442     @Test
query_withNoActivity_returnsMatching()443     public void query_withNoActivity_returnsMatching() {
444         TestApp testApp = mTestAppProvider.query()
445                 .whereActivities().isEmpty()
446                 .get();
447 
448         assertThat(testApp.activities()).isEmpty();
449     }
450 
451     @Test
452     @Ignore // Restore when we have a way of querying for device admin in nene
query_isDeviceAdmin_returnsMatching()453     public void query_isDeviceAdmin_returnsMatching() {
454         TestApp testApp = mTestAppProvider.query()
455                 .whereIsDeviceAdmin().isTrue()
456                 .get();
457 
458         assertThat(testApp.packageName()).endsWith("DeviceAdminTestApp");
459     }
460 
461     @Test
query_isNotDeviceAdmin_returnsMatching()462     public void query_isNotDeviceAdmin_returnsMatching() {
463         TestApp testApp = mTestAppProvider.query()
464                 .whereIsDeviceAdmin().isFalse()
465                 .get();
466 
467         assertThat(testApp.packageName()).isNotEqualTo(
468                 "com.android.bedstead.testapp.DeviceAdminTestApp");
469     }
470 
471     @Test
query_doesNotSpecifySharedUserId_sharedUserIdIsNull()472     public void query_doesNotSpecifySharedUserId_sharedUserIdIsNull() {
473         TestApp testApp = mTestAppProvider.query()
474                 .get();
475 
476         assertThat(testApp.sharedUserId()).isNull();
477     }
478 
479     @Test
480     @Ignore("re-enable when we have a test app which has a shareuserid")
query_doesSpecifySharedUserId_matches()481     public void query_doesSpecifySharedUserId_matches() {
482         TestApp testApp = mTestAppProvider.query()
483                 .whereSharedUserId().isEqualTo("com.android.bedstead")
484                 .get();
485 
486         assertThat(testApp.sharedUserId()).isEqualTo("com.android.bedstead");
487     }
488 
489     @Test
query_specifiesNullSharedUserId_matches()490     public void query_specifiesNullSharedUserId_matches() {
491         TestApp testApp = mTestAppProvider.query()
492                 .whereSharedUserId().isNull()
493                 .get();
494 
495         assertThat(testApp.sharedUserId()).isNull();
496     }
497 
498     @Test
query_queryAnnotationSpecifiesPackageName_matches()499     public void query_queryAnnotationSpecifiesPackageName_matches() {
500         Query queryAnnotation = queryBuilder()
501                 .packageName(stringQueryBuilder().isEqualTo(STRING_VALUE).build())
502                 .build();
503 
504         TestAppQueryBuilder queryBuilder = mTestAppProvider.query(queryAnnotation);
505 
506         assertThat(queryBuilder.mPackageName.matches(STRING_VALUE)).isTrue();
507         assertThat(queryBuilder.mPackageName.matches(DIFFERENT_STRING_VALUE)).isFalse();
508     }
509 
510     @Test
query_queryAnnotationSpecifiesTargetSdkVersion_matches()511     public void query_queryAnnotationSpecifiesTargetSdkVersion_matches() {
512         Query queryAnnotation = queryBuilder()
513                 .targetSdkVersion(integerQueryBuilder().isEqualTo(INTEGER_VALUE).build())
514                 .build();
515 
516         TestAppQueryBuilder queryBuilder = mTestAppProvider.query(queryAnnotation);
517 
518         assertThat(queryBuilder.mTargetSdkVersion.matches(INTEGER_VALUE)).isTrue();
519         assertThat(queryBuilder.mTargetSdkVersion.matches(HIGHER_INTEGER_VALUE)).isFalse();
520     }
521 
522     @Test
query_queryAnnotationSpecifiesMaxSdkVersion_matches()523     public void query_queryAnnotationSpecifiesMaxSdkVersion_matches() {
524         Query queryAnnotation = queryBuilder()
525                 .maxSdkVersion(integerQueryBuilder().isEqualTo(INTEGER_VALUE).build())
526                 .build();
527 
528         TestAppQueryBuilder queryBuilder = mTestAppProvider.query(queryAnnotation);
529 
530         assertThat(queryBuilder.mMaxSdkVersion.matches(INTEGER_VALUE)).isTrue();
531         assertThat(queryBuilder.mMaxSdkVersion.matches(HIGHER_INTEGER_VALUE)).isFalse();
532     }
533 
534     @Test
query_queryAnnotationSpecifiesMinSdkVersion_matches()535     public void query_queryAnnotationSpecifiesMinSdkVersion_matches() {
536         Query queryAnnotation = queryBuilder()
537                 .minSdkVersion(integerQueryBuilder().isEqualTo(INTEGER_VALUE).build())
538                 .build();
539 
540         TestAppQueryBuilder queryBuilder = mTestAppProvider.query(queryAnnotation);
541 
542         assertThat(queryBuilder.mMinSdkVersion.matches(INTEGER_VALUE)).isTrue();
543         assertThat(queryBuilder.mMinSdkVersion.matches(HIGHER_INTEGER_VALUE)).isFalse();
544     }
545 
546     @Test
query_stringQueryAnnotationSpecifiesIsEqualTo_matches()547     public void query_stringQueryAnnotationSpecifiesIsEqualTo_matches() {
548         Query queryAnnotation = queryBuilder()
549                 .packageName(stringQueryBuilder().isEqualTo(STRING_VALUE).build())
550                 .build();
551 
552         TestAppQueryBuilder queryBuilder = mTestAppProvider.query(queryAnnotation);
553 
554         assertThat(queryBuilder.mPackageName.matches(STRING_VALUE)).isTrue();
555         assertThat(queryBuilder.mPackageName.matches(DIFFERENT_STRING_VALUE)).isFalse();
556     }
557 
558     @Test
query_stringQueryAnnotationSpecifiesIsNotEqualTo_matches()559     public void query_stringQueryAnnotationSpecifiesIsNotEqualTo_matches() {
560         Query queryAnnotation = queryBuilder()
561                 .packageName(stringQueryBuilder().isNotEqualTo(STRING_VALUE).build())
562                 .build();
563 
564         TestAppQueryBuilder queryBuilder = mTestAppProvider.query(queryAnnotation);
565 
566         assertThat(queryBuilder.mPackageName.matches(STRING_VALUE)).isFalse();
567         assertThat(queryBuilder.mPackageName.matches(DIFFERENT_STRING_VALUE)).isTrue();
568     }
569 
570     @Test
query_stringQueryAnnotationSpecifiesStartsWith_matches()571     public void query_stringQueryAnnotationSpecifiesStartsWith_matches() {
572         Query queryAnnotation = queryBuilder()
573                 .packageName(stringQueryBuilder().startsWith(STRING_VALUE).build())
574                 .build();
575 
576         TestAppQueryBuilder queryBuilder = mTestAppProvider.query(queryAnnotation);
577 
578         assertThat(queryBuilder.mPackageName.matches(STRING_VALUE + "A")).isTrue();
579         assertThat(queryBuilder.mPackageName.matches(DIFFERENT_STRING_VALUE)).isFalse();
580     }
581 
582     @Test
query_stringQueryAnnotationSpecifiesIsNullTrue_matches()583     public void query_stringQueryAnnotationSpecifiesIsNullTrue_matches() {
584         Query queryAnnotation = queryBuilder()
585                 .packageName(stringQueryBuilder().isNull(OptionalBoolean.TRUE).build())
586                 .build();
587 
588         TestAppQueryBuilder queryBuilder = mTestAppProvider.query(queryAnnotation);
589 
590         assertThat(queryBuilder.mPackageName.matches(null)).isTrue();
591         assertThat(queryBuilder.mPackageName.matches(STRING_VALUE)).isFalse();
592     }
593 
594     @Test
query_stringQueryAnnotationSpecifiesIsNullFalse_matches()595     public void query_stringQueryAnnotationSpecifiesIsNullFalse_matches() {
596         Query queryAnnotation = queryBuilder()
597                 .packageName(stringQueryBuilder().isNull(OptionalBoolean.FALSE).build())
598                 .build();
599 
600         TestAppQueryBuilder queryBuilder = mTestAppProvider.query(queryAnnotation);
601 
602         assertThat(queryBuilder.mPackageName.matches(null)).isFalse();
603         assertThat(queryBuilder.mPackageName.matches(STRING_VALUE)).isTrue();
604     }
605 
606     @Test
query_integerQueryAnnotationSpecifiesIsEqualTo_matches()607     public void query_integerQueryAnnotationSpecifiesIsEqualTo_matches() {
608         Query queryAnnotation = queryBuilder()
609                 .minSdkVersion(integerQueryBuilder().isEqualTo(INTEGER_VALUE).build())
610                 .build();
611 
612         TestAppQueryBuilder queryBuilder = mTestAppProvider.query(queryAnnotation);
613 
614         assertThat(queryBuilder.mMinSdkVersion.matches(INTEGER_VALUE)).isTrue();
615         assertThat(queryBuilder.mMinSdkVersion.matches(HIGHER_INTEGER_VALUE)).isFalse();
616     }
617 
618     @Test
query_integerQueryAnnotationSpecifiesIsGreaterThan_matches()619     public void query_integerQueryAnnotationSpecifiesIsGreaterThan_matches() {
620         Query queryAnnotation = queryBuilder()
621                 .minSdkVersion(integerQueryBuilder().isGreaterThan(INTEGER_VALUE).build())
622                 .build();
623 
624         TestAppQueryBuilder queryBuilder = mTestAppProvider.query(queryAnnotation);
625 
626         assertThat(queryBuilder.mMinSdkVersion.matches(INTEGER_VALUE)).isFalse();
627         assertThat(queryBuilder.mMinSdkVersion.matches(HIGHER_INTEGER_VALUE)).isTrue();
628     }
629 
630     @Test
query_integerQueryAnnotationSpecifiesIsGreaterThanOrEqualTo_matches()631     public void query_integerQueryAnnotationSpecifiesIsGreaterThanOrEqualTo_matches() {
632         Query queryAnnotation = queryBuilder()
633                 .minSdkVersion(integerQueryBuilder().isGreaterThanOrEqualTo(INTEGER_VALUE).build())
634                 .build();
635 
636         TestAppQueryBuilder queryBuilder = mTestAppProvider.query(queryAnnotation);
637 
638         assertThat(queryBuilder.mMinSdkVersion.matches(INTEGER_VALUE)).isTrue();
639         assertThat(queryBuilder.mMinSdkVersion.matches(HIGHER_INTEGER_VALUE)).isTrue();
640         assertThat(queryBuilder.mMinSdkVersion.matches(LOWER_INTEGER_VALUE)).isFalse();
641     }
642 
643     @Test
query_integerQueryAnnotationSpecifiesIsLessThan_matches()644     public void query_integerQueryAnnotationSpecifiesIsLessThan_matches() {
645         Query queryAnnotation = queryBuilder()
646                 .minSdkVersion(integerQueryBuilder().isLessThan(INTEGER_VALUE).build())
647                 .build();
648 
649         TestAppQueryBuilder queryBuilder = mTestAppProvider.query(queryAnnotation);
650 
651         assertThat(queryBuilder.mMinSdkVersion.matches(INTEGER_VALUE)).isFalse();
652         assertThat(queryBuilder.mMinSdkVersion.matches(LOWER_INTEGER_VALUE)).isTrue();
653     }
654 
655     @Test
query_integerQueryAnnotationSpecifiesIsLessThanOrEqualTo_matches()656     public void query_integerQueryAnnotationSpecifiesIsLessThanOrEqualTo_matches() {
657         Query queryAnnotation = queryBuilder()
658                 .minSdkVersion(integerQueryBuilder().isLessThanOrEqualTo(INTEGER_VALUE).build())
659                 .build();
660 
661         TestAppQueryBuilder queryBuilder = mTestAppProvider.query(queryAnnotation);
662 
663         assertThat(queryBuilder.mMinSdkVersion.matches(INTEGER_VALUE)).isTrue();
664         assertThat(queryBuilder.mMinSdkVersion.matches(LOWER_INTEGER_VALUE)).isTrue();
665         assertThat(queryBuilder.mMinSdkVersion.matches(HIGHER_INTEGER_VALUE)).isFalse();
666     }
667 }
668