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