1 /* 2 * Copyright (C) 2008 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.content.cts; 18 19 import static android.os.PatternMatcher.PATTERN_LITERAL; 20 import static android.os.PatternMatcher.PATTERN_PREFIX; 21 import static android.os.PatternMatcher.PATTERN_SIMPLE_GLOB; 22 23 import java.io.ByteArrayInputStream; 24 import java.io.ByteArrayOutputStream; 25 import java.io.IOException; 26 import java.io.InputStream; 27 import java.util.HashSet; 28 import java.util.Iterator; 29 import java.util.Set; 30 31 import org.kxml2.io.KXmlParser; 32 import org.xmlpull.v1.XmlPullParser; 33 import org.xmlpull.v1.XmlPullParserException; 34 import org.xmlpull.v1.XmlSerializer; 35 36 import android.app.cts.MockActivity; 37 import android.content.ComponentName; 38 import android.content.ContentResolver; 39 import android.content.Intent; 40 import android.content.IntentFilter; 41 import android.content.IntentFilter.AuthorityEntry; 42 import android.content.IntentFilter.MalformedMimeTypeException; 43 import android.content.pm.ActivityInfo; 44 import android.content.pm.PackageManager; 45 import android.content.pm.PackageManager.NameNotFoundException; 46 import android.net.Uri; 47 import android.os.Parcel; 48 import android.os.PatternMatcher; 49 import android.provider.Contacts.People; 50 import android.test.AndroidTestCase; 51 import android.util.Printer; 52 import android.util.StringBuilderPrinter; 53 54 import com.android.internal.util.FastXmlSerializer; 55 56 import dalvik.annotation.TestLevel; 57 import dalvik.annotation.TestTargetClass; 58 import dalvik.annotation.TestTargetNew; 59 import dalvik.annotation.TestTargets; 60 import dalvik.annotation.ToBeFixed; 61 62 @TestTargetClass(IntentFilter.class) 63 public class IntentFilterTest extends AndroidTestCase { 64 65 private IntentFilter mIntentFilter; 66 private static final String ACTION = "testAction"; 67 private static final String CATEGORY = "testCategory"; 68 private static final String DATA_TYPE = "vnd.android.cursor.dir/person"; 69 private static final String DATA_SCHEME = "testDataSchemes."; 70 private static final String HOST = "testHost"; 71 private static final int PORT = 80; 72 private static final String DATA_PATH = "testDataPath"; 73 private static final Uri URI = People.CONTENT_URI; 74 75 @Override setUp()76 protected void setUp() throws Exception { 77 super.setUp(); 78 mIntentFilter = new IntentFilter(); 79 } 80 81 @TestTargets({ 82 @TestTargetNew( 83 level = TestLevel.COMPLETE, 84 method = "IntentFilter", 85 args = {} 86 ), 87 @TestTargetNew( 88 level = TestLevel.COMPLETE, 89 method = "IntentFilter", 90 args = {android.content.IntentFilter.class} 91 ), 92 @TestTargetNew( 93 level = TestLevel.COMPLETE, 94 method = "IntentFilter", 95 args = {java.lang.String.class} 96 ), 97 @TestTargetNew( 98 level = TestLevel.COMPLETE, 99 method = "IntentFilter", 100 args = {java.lang.String.class, java.lang.String.class} 101 ) 102 }) testConstructor()103 public void testConstructor() throws MalformedMimeTypeException { 104 105 IntentFilter filter = new IntentFilter(); 106 verifyContent(filter, null, null); 107 108 filter = new IntentFilter(ACTION); 109 verifyContent(filter, ACTION, null); 110 111 final IntentFilter actionTypeFilter = new IntentFilter(ACTION, DATA_TYPE); 112 verifyContent(actionTypeFilter, ACTION, DATA_TYPE); 113 114 filter = new IntentFilter(actionTypeFilter); 115 verifyContent(filter, ACTION, DATA_TYPE); 116 117 final String dataType = "testdataType"; 118 try { 119 new IntentFilter(ACTION, dataType); 120 fail("Should throw MalformedMimeTypeException "); 121 } catch (MalformedMimeTypeException e) { 122 // expected 123 } 124 } 125 126 /** 127 * Assert that the given filter contains the given action and dataType. If 128 * action or dataType are null, assert that the filter has no actions or 129 * dataTypes registered. 130 */ verifyContent(IntentFilter filter, String action, String dataType)131 private void verifyContent(IntentFilter filter, String action, String dataType) { 132 if (action != null) { 133 assertEquals(1, filter.countActions()); 134 assertEquals(action, filter.getAction(0)); 135 } else { 136 assertEquals(0, filter.countActions()); 137 } 138 if (dataType != null) { 139 assertEquals(1, filter.countDataTypes()); 140 assertEquals(dataType, filter.getDataType(0)); 141 } else { 142 assertEquals(0, filter.countDataTypes()); 143 } 144 } 145 146 @TestTargets({ 147 @TestTargetNew( 148 level = TestLevel.COMPLETE, 149 method = "categoriesIterator", 150 args = {} 151 ), 152 @TestTargetNew( 153 level = TestLevel.COMPLETE, 154 method = "addCategory", 155 args = {java.lang.String.class} 156 ), 157 @TestTargetNew( 158 level = TestLevel.COMPLETE, 159 method = "getCategory", 160 args = {int.class} 161 ), 162 @TestTargetNew( 163 level = TestLevel.COMPLETE, 164 method = "hasCategory", 165 args = {java.lang.String.class} 166 ), 167 @TestTargetNew( 168 level = TestLevel.COMPLETE, 169 method = "countCategories", 170 args = {} 171 ) 172 }) testCategories()173 public void testCategories() { 174 for (int i = 0; i < 10; i++) { 175 mIntentFilter.addCategory(CATEGORY + i); 176 } 177 assertEquals(10, mIntentFilter.countCategories()); 178 Iterator<String> iter = mIntentFilter.categoriesIterator(); 179 String actual = null; 180 int i = 0; 181 while (iter.hasNext()) { 182 actual = iter.next(); 183 assertEquals(CATEGORY + i, actual); 184 assertEquals(CATEGORY + i, mIntentFilter.getCategory(i)); 185 assertTrue(mIntentFilter.hasCategory(CATEGORY + i)); 186 assertFalse(mIntentFilter.hasCategory(CATEGORY + i + 10)); 187 i++; 188 } 189 IntentFilter filter = new Match(null, new String[] { "category1" }, null, null, null, null); 190 checkMatches(filter, new MatchCondition[] { 191 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, null, null, null), 192 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, 193 new String[] { "category1" }, null, null), 194 new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null, 195 new String[] { "category2" }, null, null), 196 new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null, new String[] { 197 "category1", "category2" }, null, null), }); 198 199 filter = new Match(null, new String[] { "category1", "category2" }, null, null, null, null); 200 checkMatches(filter, new MatchCondition[] { 201 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, null, null, null), 202 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, 203 new String[] { "category1" }, null, null), 204 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, 205 new String[] { "category2" }, null, null), 206 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, new String[] { 207 "category1", "category2" }, null, null), 208 new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null, 209 new String[] { "category3" }, null, null), 210 new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null, new String[] { 211 "category1", "category2", "category3" }, null, null), }); 212 } 213 214 @TestTargets({ 215 @TestTargetNew( 216 level = TestLevel.COMPLETE, 217 method = "match", 218 args = {android.content.ContentResolver.class, android.content.Intent.class, 219 boolean.class, java.lang.String.class} 220 ), 221 @TestTargetNew( 222 level = TestLevel.COMPLETE, 223 method = "match", 224 args = {java.lang.String.class, java.lang.String.class, java.lang.String.class, 225 android.net.Uri.class, java.util.Set.class, java.lang.String.class} 226 ) 227 }) testMimeTypes()228 public void testMimeTypes() throws Exception { 229 IntentFilter filter = new Match(null, null, new String[] { "which1/what1" }, null, null, 230 null); 231 checkMatches(filter, new MatchCondition[] { 232 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null), 233 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1", 234 null), 235 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null), 236 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null), 237 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/what2", null), 238 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/*", null), 239 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which1/what2", null), 240 }); 241 242 filter = new Match(null, null, new String[] { "which1/what1", "which2/what2" }, null, null, 243 null); 244 checkMatches(filter, new MatchCondition[] { 245 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null), 246 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1", 247 null), 248 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null), 249 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null), 250 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/what2", 251 null), 252 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/*", null), 253 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which1/what2", null), 254 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which3/what3", null), 255 }); 256 257 filter = new Match(null, null, new String[] { "which1/*" }, null, null, null); 258 checkMatches(filter, new MatchCondition[] { 259 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null), 260 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1", 261 null), 262 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null), 263 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null), 264 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/what2", null), 265 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/*", null), 266 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what2", 267 null), 268 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which3/what3", null), 269 }); 270 271 filter = new Match(null, null, new String[] { "*/*" }, null, null, null); 272 checkMatches(filter, new MatchCondition[] { 273 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null), 274 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1", 275 null), 276 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null), 277 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null), 278 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/what2", 279 null), 280 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/*", null), 281 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what2", 282 null), 283 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which3/what3", 284 null), }); 285 } 286 287 @TestTargets({ 288 @TestTargetNew( 289 level = TestLevel.COMPLETE, 290 method = "setPriority", 291 args = {int.class} 292 ), 293 @TestTargetNew( 294 level = TestLevel.COMPLETE, 295 method = "getPriority", 296 args = {} 297 ) 298 }) testAccessPriority()299 public void testAccessPriority() { 300 final int expected = 1; 301 mIntentFilter.setPriority(expected); 302 assertEquals(expected, mIntentFilter.getPriority()); 303 } 304 305 @TestTargets({ 306 @TestTargetNew( 307 level = TestLevel.COMPLETE, 308 method = "schemesIterator", 309 args = {} 310 ), 311 @TestTargetNew( 312 level = TestLevel.COMPLETE, 313 method = "getDataScheme", 314 args = {int.class} 315 ), 316 @TestTargetNew( 317 level = TestLevel.COMPLETE, 318 method = "addDataScheme", 319 args = {java.lang.String.class} 320 ), 321 @TestTargetNew( 322 level = TestLevel.COMPLETE, 323 method = "countDataSchemes", 324 args = {} 325 ), 326 @TestTargetNew( 327 level = TestLevel.COMPLETE, 328 method = "hasDataScheme", 329 args = {java.lang.String.class} 330 ) 331 }) testDataSchemes()332 public void testDataSchemes() { 333 for (int i = 0; i < 10; i++) { 334 mIntentFilter.addDataScheme(DATA_SCHEME + i); 335 } 336 assertEquals(10, mIntentFilter.countDataSchemes()); 337 final Iterator<String> iter = mIntentFilter.schemesIterator(); 338 String actual = null; 339 int i = 0; 340 while (iter.hasNext()) { 341 actual = iter.next(); 342 assertEquals(DATA_SCHEME + i, actual); 343 assertEquals(DATA_SCHEME + i, mIntentFilter.getDataScheme(i)); 344 assertTrue(mIntentFilter.hasDataScheme(DATA_SCHEME + i)); 345 assertFalse(mIntentFilter.hasDataScheme(DATA_SCHEME + i + 10)); 346 i++; 347 } 348 IntentFilter filter = new Match(null, null, null, new String[] { "scheme1" }, null, null); 349 checkMatches(filter, new MatchCondition[] { 350 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 351 new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME, null, null, null, 352 "scheme1:foo"), 353 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme2:foo"), }); 354 355 filter = new Match(null, null, null, new String[] { "scheme1", "scheme2" }, null, null); 356 checkMatches(filter, new MatchCondition[] { 357 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 358 new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME, null, null, null, 359 "scheme1:foo"), 360 new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME, null, null, null, 361 "scheme2:foo"), 362 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme3:foo"), }); 363 } 364 365 @TestTargetNew( 366 level = TestLevel.COMPLETE, 367 method = "create", 368 args = {java.lang.String.class, java.lang.String.class} 369 ) testCreate()370 public void testCreate() { 371 IntentFilter filter = IntentFilter.create(ACTION, DATA_TYPE); 372 assertNotNull(filter); 373 verifyContent(filter, ACTION, DATA_TYPE); 374 } 375 376 @TestTargets({ 377 @TestTargetNew( 378 level = TestLevel.COMPLETE, 379 method = "authoritiesIterator", 380 args = {} 381 ), 382 @TestTargetNew( 383 level = TestLevel.COMPLETE, 384 method = "countDataAuthorities", 385 args = {} 386 ), 387 @TestTargetNew( 388 level = TestLevel.COMPLETE, 389 method = "hasDataAuthority", 390 args = {android.net.Uri.class} 391 ), 392 @TestTargetNew( 393 level = TestLevel.COMPLETE, 394 method = "addDataAuthority", 395 args = {java.lang.String.class, java.lang.String.class} 396 ), 397 @TestTargetNew( 398 level = TestLevel.COMPLETE, 399 method = "getDataAuthority", 400 args = {int.class} 401 ) 402 }) testAuthorities()403 public void testAuthorities() { 404 for (int i = 0; i < 10; i++) { 405 mIntentFilter.addDataAuthority(HOST + i, String.valueOf(PORT + i)); 406 } 407 assertEquals(10, mIntentFilter.countDataAuthorities()); 408 409 final Iterator<AuthorityEntry> iter = mIntentFilter.authoritiesIterator(); 410 AuthorityEntry actual = null; 411 int i = 0; 412 while (iter.hasNext()) { 413 actual = iter.next(); 414 assertEquals(HOST + i, actual.getHost()); 415 assertEquals(PORT + i, actual.getPort()); 416 AuthorityEntry ae = new AuthorityEntry(HOST + i, String.valueOf(PORT + i)); 417 assertEquals(ae.getHost(), mIntentFilter.getDataAuthority(i).getHost()); 418 assertEquals(ae.getPort(), mIntentFilter.getDataAuthority(i).getPort()); 419 Uri uri = Uri.parse("http://" + HOST + i + ":" + String.valueOf(PORT + i)); 420 assertTrue(mIntentFilter.hasDataAuthority(uri)); 421 Uri uri2 = Uri.parse("http://" + HOST + i + 10 + ":" + PORT + i + 10); 422 assertFalse(mIntentFilter.hasDataAuthority(uri2)); 423 i++; 424 } 425 IntentFilter filter = new Match(null, null, null, new String[] { "scheme1" }, 426 new String[] { "authority1" }, new String[] { null }); 427 checkMatches(filter, new MatchCondition[] { 428 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 429 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme1:foo"), 430 new MatchCondition(IntentFilter.MATCH_CATEGORY_HOST, null, null, null, 431 "scheme1://authority1/"), 432 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 433 "scheme1://authority2/"), 434 new MatchCondition(IntentFilter.MATCH_CATEGORY_HOST, null, null, null, 435 "scheme1://authority1:100/"), }); 436 437 filter = new Match(null, null, null, new String[] { "scheme1" }, 438 new String[] { "authority1" }, new String[] { "100" }); 439 checkMatches(filter, new MatchCondition[] { 440 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 441 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme1:foo"), 442 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 443 "scheme1://authority1/"), 444 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 445 "scheme1://authority2/"), 446 new MatchCondition(IntentFilter.MATCH_CATEGORY_PORT, null, null, null, 447 "scheme1://authority1:100/"), 448 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 449 "scheme1://authority1:200/"), }); 450 451 filter = new Match(null, null, null, new String[] { "scheme1" }, 452 new String[] { "authority1", "authority2" }, new String[] { "100", null }); 453 checkMatches(filter, new MatchCondition[] { 454 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 455 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme1:foo"), 456 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 457 "scheme1://authority1/"), 458 new MatchCondition(IntentFilter.MATCH_CATEGORY_HOST, null, null, null, 459 "scheme1://authority2/"), 460 new MatchCondition(IntentFilter.MATCH_CATEGORY_PORT, null, null, null, 461 "scheme1://authority1:100/"), 462 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 463 "scheme1://authority1:200/"), }); 464 } 465 466 @TestTargets({ 467 @TestTargetNew( 468 level = TestLevel.COMPLETE, 469 method = "hasDataType", 470 args = {java.lang.String.class} 471 ), 472 @TestTargetNew( 473 level = TestLevel.COMPLETE, 474 method = "addDataType", 475 args = {java.lang.String.class} 476 ), 477 @TestTargetNew( 478 level = TestLevel.COMPLETE, 479 method = "getDataType", 480 args = {int.class} 481 ), 482 @TestTargetNew( 483 level = TestLevel.COMPLETE, 484 method = "typesIterator", 485 args = {} 486 ), 487 @TestTargetNew( 488 level = TestLevel.COMPLETE, 489 method = "countDataTypes", 490 args = {} 491 ) 492 }) testDataTypes()493 public void testDataTypes() throws MalformedMimeTypeException { 494 for (int i = 0; i < 10; i++) { 495 mIntentFilter.addDataType(DATA_TYPE + i); 496 } 497 assertEquals(10, mIntentFilter.countDataTypes()); 498 final Iterator<String> iter = mIntentFilter.typesIterator(); 499 String actual = null; 500 int i = 0; 501 while (iter.hasNext()) { 502 actual = iter.next(); 503 assertEquals(DATA_TYPE + i, actual); 504 assertEquals(DATA_TYPE + i, mIntentFilter.getDataType(i)); 505 assertTrue(mIntentFilter.hasDataType(DATA_TYPE + i)); 506 assertFalse(mIntentFilter.hasDataType(DATA_TYPE + i + 10)); 507 i++; 508 } 509 } 510 511 @TestTargetNew( 512 level = TestLevel.COMPLETE, 513 method = "matchData", 514 args = {java.lang.String.class, java.lang.String.class, android.net.Uri.class} 515 ) testMatchData()516 public void testMatchData() throws MalformedMimeTypeException { 517 int expected = IntentFilter.MATCH_CATEGORY_EMPTY + IntentFilter.MATCH_ADJUSTMENT_NORMAL; 518 assertEquals(expected, mIntentFilter.matchData(null, null, null)); 519 assertEquals(expected, mIntentFilter.matchData(null, DATA_SCHEME, null)); 520 521 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(null, DATA_SCHEME, URI)); 522 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(DATA_TYPE, DATA_SCHEME, 523 URI)); 524 525 mIntentFilter.addDataScheme(DATA_SCHEME); 526 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(DATA_TYPE, 527 "mDataSchemestest", URI)); 528 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(DATA_TYPE, "", URI)); 529 530 expected = IntentFilter.MATCH_CATEGORY_SCHEME + IntentFilter.MATCH_ADJUSTMENT_NORMAL; 531 assertEquals(expected, mIntentFilter.matchData(null, DATA_SCHEME, URI)); 532 assertEquals(IntentFilter.NO_MATCH_TYPE, mIntentFilter.matchData(DATA_TYPE, DATA_SCHEME, 533 URI)); 534 535 mIntentFilter.addDataType(DATA_TYPE); 536 assertEquals(IntentFilter.MATCH_CATEGORY_TYPE + IntentFilter.MATCH_ADJUSTMENT_NORMAL, 537 mIntentFilter.matchData(DATA_TYPE, DATA_SCHEME, URI)); 538 539 mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT)); 540 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(null, DATA_SCHEME, URI)); 541 542 final Uri uri = Uri.parse("http://" + HOST + ":" + PORT); 543 mIntentFilter.addDataPath(DATA_PATH, PatternMatcher.PATTERN_LITERAL); 544 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(null, DATA_SCHEME, uri)); 545 } 546 547 @TestTargets({ 548 @TestTargetNew( 549 level = TestLevel.COMPLETE, 550 method = "countActions", 551 args = {} 552 ), 553 @TestTargetNew( 554 level = TestLevel.COMPLETE, 555 method = "addAction", 556 args = {java.lang.String.class} 557 ), 558 @TestTargetNew( 559 level = TestLevel.COMPLETE, 560 method = "actionsIterator", 561 args = {} 562 ), 563 @TestTargetNew( 564 level = TestLevel.COMPLETE, 565 method = "hasAction", 566 args = {java.lang.String.class} 567 ), 568 @TestTargetNew( 569 level = TestLevel.COMPLETE, 570 method = "matchAction", 571 args = {java.lang.String.class} 572 ), 573 @TestTargetNew( 574 level = TestLevel.COMPLETE, 575 method = "getAction", 576 args = {int.class} 577 ) 578 }) testActions()579 public void testActions() { 580 for (int i = 0; i < 10; i++) { 581 mIntentFilter.addAction(ACTION + i); 582 } 583 assertEquals(10, mIntentFilter.countActions()); 584 final Iterator<String> iter = mIntentFilter.actionsIterator(); 585 String actual = null; 586 int i = 0; 587 while (iter.hasNext()) { 588 actual = iter.next(); 589 assertEquals(ACTION + i, actual); 590 assertEquals(ACTION + i, mIntentFilter.getAction(i)); 591 assertTrue(mIntentFilter.hasAction(ACTION + i)); 592 assertFalse(mIntentFilter.hasAction(ACTION + i + 10)); 593 assertTrue(mIntentFilter.matchAction(ACTION + i)); 594 assertFalse(mIntentFilter.matchAction(ACTION + i + 10)); 595 i++; 596 } 597 IntentFilter filter = new Match(new String[] { "action1" }, null, null, null, null, null); 598 checkMatches(filter, new MatchCondition[] { 599 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, null, null, null), 600 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "action1", null, null, null), 601 new MatchCondition(IntentFilter.NO_MATCH_ACTION, "action2", null, null, null), }); 602 603 filter = new Match(new String[] { "action1", "action2" }, null, null, null, null, null); 604 checkMatches(filter, new MatchCondition[] { 605 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, null, null, null), 606 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "action1", null, null, null), 607 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "action2", null, null, null), 608 new MatchCondition(IntentFilter.NO_MATCH_ACTION, "action3", null, null, null), }); 609 } 610 611 @TestTargets({ 612 @TestTargetNew( 613 level = TestLevel.COMPLETE, 614 method = "writeToXml", 615 args = {org.xmlpull.v1.XmlSerializer.class} 616 ), 617 @TestTargetNew( 618 level = TestLevel.COMPLETE, 619 method = "readFromXml", 620 args = {org.xmlpull.v1.XmlPullParser.class} 621 ) 622 }) testWriteToXml()623 public void testWriteToXml() throws IllegalArgumentException, IllegalStateException, 624 IOException, MalformedMimeTypeException, XmlPullParserException { 625 XmlSerializer xml; 626 ByteArrayOutputStream out; 627 628 xml = new FastXmlSerializer(); 629 out = new ByteArrayOutputStream(); 630 xml.setOutput(out, "utf-8"); 631 mIntentFilter.addAction(ACTION); 632 mIntentFilter.addCategory(CATEGORY); 633 mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT)); 634 mIntentFilter.addDataPath(DATA_PATH, 1); 635 mIntentFilter.addDataScheme(DATA_SCHEME); 636 mIntentFilter.addDataType(DATA_TYPE); 637 mIntentFilter.writeToXml(xml); 638 xml.flush(); 639 final KXmlParser parser = new KXmlParser(); 640 final InputStream in = new ByteArrayInputStream(out.toByteArray()); 641 parser.setInput(in, "utf-8"); 642 final IntentFilter intentFilter = new IntentFilter(); 643 intentFilter.readFromXml(parser); 644 assertEquals(ACTION, intentFilter.getAction(0)); 645 assertEquals(CATEGORY, intentFilter.getCategory(0)); 646 assertEquals(DATA_TYPE, intentFilter.getDataType(0)); 647 assertEquals(DATA_SCHEME, intentFilter.getDataScheme(0)); 648 assertEquals(DATA_PATH, intentFilter.getDataPath(0).getPath()); 649 assertEquals(HOST, intentFilter.getDataAuthority(0).getHost()); 650 assertEquals(PORT, intentFilter.getDataAuthority(0).getPort()); 651 out.close(); 652 } 653 654 @TestTargetNew( 655 level = TestLevel.COMPLETE, 656 method = "matchCategories", 657 args = {java.util.Set.class} 658 ) testMatchCategories()659 public void testMatchCategories() { 660 assertNull(mIntentFilter.matchCategories(null)); 661 Set<String> cat = new HashSet<String>(); 662 assertNull(mIntentFilter.matchCategories(cat)); 663 664 final String expected = "mytest"; 665 cat.add(expected); 666 assertEquals(expected, mIntentFilter.matchCategories(cat)); 667 668 cat = new HashSet<String>(); 669 cat.add(CATEGORY); 670 mIntentFilter.addCategory(CATEGORY); 671 assertNull(mIntentFilter.matchCategories(cat)); 672 cat.add(expected); 673 assertEquals(expected, mIntentFilter.matchCategories(cat)); 674 } 675 676 @TestTargetNew( 677 level = TestLevel.COMPLETE, 678 method = "matchDataAuthority", 679 args = {android.net.Uri.class} 680 ) testMatchDataAuthority()681 public void testMatchDataAuthority() { 682 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchDataAuthority(null)); 683 mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT)); 684 final Uri uri = Uri.parse("http://" + HOST + ":" + PORT); 685 assertEquals(IntentFilter.MATCH_CATEGORY_PORT, mIntentFilter.matchDataAuthority(uri)); 686 } 687 688 @TestTargetNew( 689 level = TestLevel.COMPLETE, 690 method = "describeContents", 691 args = {} 692 ) testDescribeContents()693 public void testDescribeContents() { 694 assertEquals(0, mIntentFilter.describeContents()); 695 } 696 697 @TestTargets({ 698 @TestTargetNew( 699 level = TestLevel.COMPLETE, 700 method = "readFromXml", 701 args = {org.xmlpull.v1.XmlPullParser.class} 702 ), 703 @TestTargetNew( 704 level = TestLevel.COMPLETE, 705 method = "getDataScheme", 706 args = {int.class} 707 ) 708 }) testReadFromXml()709 public void testReadFromXml() throws NameNotFoundException, XmlPullParserException, IOException { 710 XmlPullParser parser = null; 711 ActivityInfo ai = null; 712 713 final ComponentName mComponentName = new ComponentName(mContext, MockActivity.class); 714 final PackageManager pm = mContext.getPackageManager(); 715 ai = pm.getActivityInfo(mComponentName, PackageManager.GET_META_DATA); 716 717 parser = ai.loadXmlMetaData(pm, "android.app.intent.filter"); 718 719 int type; 720 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 721 && type != XmlPullParser.START_TAG) { 722 } 723 724 final String nodeName = parser.getName(); 725 726 if (!"intent-filter".equals(nodeName)) { 727 throw new RuntimeException(); 728 } 729 730 mIntentFilter.readFromXml(parser); 731 732 assertEquals("testAction", mIntentFilter.getAction(0)); 733 assertEquals("testCategory", mIntentFilter.getCategory(0)); 734 assertEquals("vnd.android.cursor.dir/person", mIntentFilter.getDataType(0)); 735 assertEquals("testScheme", mIntentFilter.getDataScheme(0)); 736 assertEquals("testHost", mIntentFilter.getDataAuthority(0).getHost()); 737 assertEquals(80, mIntentFilter.getDataAuthority(0).getPort()); 738 739 assertEquals("test", mIntentFilter.getDataPath(0).getPath()); 740 assertEquals("test", mIntentFilter.getDataPath(1).getPath()); 741 assertEquals("test", mIntentFilter.getDataPath(2).getPath()); 742 } 743 744 @TestTargets({ 745 @TestTargetNew( 746 level = TestLevel.COMPLETE, 747 method = "pathsIterator", 748 args = {} 749 ), 750 @TestTargetNew( 751 level = TestLevel.COMPLETE, 752 method = "addDataPath", 753 args = {java.lang.String.class, int.class} 754 ), 755 @TestTargetNew( 756 level = TestLevel.COMPLETE, 757 method = "hasDataPath", 758 args = {java.lang.String.class} 759 ), 760 @TestTargetNew( 761 level = TestLevel.COMPLETE, 762 method = "getDataPath", 763 args = {int.class} 764 ), 765 @TestTargetNew( 766 level = TestLevel.COMPLETE, 767 method = "addDataPath", 768 args = {java.lang.String.class, int.class} 769 ), 770 @TestTargetNew( 771 level = TestLevel.COMPLETE, 772 method = "countDataPaths", 773 args = {} 774 ) 775 }) testDataPaths()776 public void testDataPaths() { 777 for (int i = 0; i < 10; i++) { 778 mIntentFilter.addDataPath(DATA_PATH + i, PatternMatcher.PATTERN_PREFIX); 779 } 780 assertEquals(10, mIntentFilter.countDataPaths()); 781 Iterator<PatternMatcher> iter = mIntentFilter.pathsIterator(); 782 PatternMatcher actual = null; 783 int i = 0; 784 while (iter.hasNext()) { 785 actual = iter.next(); 786 assertEquals(DATA_PATH + i, actual.getPath()); 787 assertEquals(PatternMatcher.PATTERN_PREFIX, actual.getType()); 788 PatternMatcher p = new PatternMatcher(DATA_PATH + i, PatternMatcher.PATTERN_PREFIX); 789 assertEquals(p.getPath(), mIntentFilter.getDataPath(i).getPath()); 790 assertEquals(p.getType(), mIntentFilter.getDataPath(i).getType()); 791 assertTrue(mIntentFilter.hasDataPath(DATA_PATH + i)); 792 assertTrue(mIntentFilter.hasDataPath(DATA_PATH + i + 10)); 793 i++; 794 } 795 796 mIntentFilter = new IntentFilter(); 797 i = 0; 798 for (i = 0; i < 10; i++) { 799 mIntentFilter.addDataPath(DATA_PATH + i, PatternMatcher.PATTERN_LITERAL); 800 } 801 assertEquals(10, mIntentFilter.countDataPaths()); 802 iter = mIntentFilter.pathsIterator(); 803 i = 0; 804 while (iter.hasNext()) { 805 actual = iter.next(); 806 assertEquals(DATA_PATH + i, actual.getPath()); 807 assertEquals(PatternMatcher.PATTERN_LITERAL, actual.getType()); 808 PatternMatcher p = new PatternMatcher(DATA_PATH + i, PatternMatcher.PATTERN_LITERAL); 809 assertEquals(p.getPath(), mIntentFilter.getDataPath(i).getPath()); 810 assertEquals(p.getType(), mIntentFilter.getDataPath(i).getType()); 811 assertTrue(mIntentFilter.hasDataPath(DATA_PATH + i)); 812 assertFalse(mIntentFilter.hasDataPath(DATA_PATH + i + 10)); 813 i++; 814 } 815 mIntentFilter = new IntentFilter(); 816 i = 0; 817 for (i = 0; i < 10; i++) { 818 mIntentFilter.addDataPath(DATA_PATH + i, PatternMatcher.PATTERN_SIMPLE_GLOB); 819 } 820 assertEquals(10, mIntentFilter.countDataPaths()); 821 iter = mIntentFilter.pathsIterator(); 822 i = 0; 823 while (iter.hasNext()) { 824 actual = iter.next(); 825 assertEquals(DATA_PATH + i, actual.getPath()); 826 assertEquals(PatternMatcher.PATTERN_SIMPLE_GLOB, actual.getType()); 827 PatternMatcher p = new PatternMatcher(DATA_PATH + i, 828 PatternMatcher.PATTERN_SIMPLE_GLOB); 829 assertEquals(p.getPath(), mIntentFilter.getDataPath(i).getPath()); 830 assertEquals(p.getType(), mIntentFilter.getDataPath(i).getType()); 831 assertTrue(mIntentFilter.hasDataPath(DATA_PATH + i)); 832 assertFalse(mIntentFilter.hasDataPath(DATA_PATH + i + 10)); 833 i++; 834 } 835 836 IntentFilter filter = new Match(null, null, null, new String[] { "scheme1" }, 837 new String[] { "authority1" }, new String[] { null }); 838 checkMatches(filter, new MatchCondition[] { 839 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 840 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme1:foo"), 841 new MatchCondition(IntentFilter.MATCH_CATEGORY_HOST, null, null, null, 842 "scheme1://authority1/"), 843 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 844 "scheme1://authority2/"), 845 new MatchCondition(IntentFilter.MATCH_CATEGORY_HOST, null, null, null, 846 "scheme1://authority1:100/"), }); 847 848 filter = new Match(null, null, null, new String[] { "scheme1" }, 849 new String[] { "authority1" }, new String[] { "100" }); 850 checkMatches(filter, new MatchCondition[] { 851 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 852 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme1:foo"), 853 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 854 "scheme1://authority1/"), 855 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 856 "scheme1://authority2/"), 857 new MatchCondition(IntentFilter.MATCH_CATEGORY_PORT, null, null, null, 858 "scheme1://authority1:100/"), 859 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 860 "scheme1://authority1:200/"), }); 861 862 filter = new Match(null, null, null, new String[] { "scheme1" }, 863 new String[] { "authority1", "authority2" }, new String[] { "100", null }); 864 checkMatches(filter, new MatchCondition[] { 865 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 866 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme1:foo"), 867 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 868 "scheme1://authority1/"), 869 new MatchCondition(IntentFilter.MATCH_CATEGORY_HOST, null, null, null, 870 "scheme1://authority2/"), 871 new MatchCondition(IntentFilter.MATCH_CATEGORY_PORT, null, null, null, 872 "scheme1://authority1:100/"), 873 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 874 "scheme1://authority1:200/"), }); 875 } 876 877 @TestTargetNew( 878 level = TestLevel.COMPLETE, 879 method = "match", 880 args = {android.content.ContentResolver.class, android.content.Intent.class, boolean.class, 881 java.lang.String.class} 882 ) testMatchWithIntent()883 public void testMatchWithIntent() throws MalformedMimeTypeException { 884 final ContentResolver resolver = mContext.getContentResolver(); 885 886 Intent intent = new Intent(ACTION); 887 assertEquals(IntentFilter.NO_MATCH_ACTION, mIntentFilter.match(resolver, intent, true, 888 null)); 889 mIntentFilter.addAction(ACTION); 890 assertEquals(IntentFilter.MATCH_CATEGORY_EMPTY + IntentFilter.MATCH_ADJUSTMENT_NORMAL, 891 mIntentFilter.match(resolver, intent, true, null)); 892 893 final Uri uri = Uri.parse(DATA_SCHEME + "://" + HOST + ":" + PORT); 894 intent.setData(uri); 895 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(resolver, intent, true, null)); 896 mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT)); 897 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(resolver, intent, true, null)); 898 intent.setType(DATA_TYPE); 899 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(resolver, intent, true, null)); 900 901 mIntentFilter.addDataType(DATA_TYPE); 902 903 assertEquals(IntentFilter.MATCH_CATEGORY_TYPE + IntentFilter.MATCH_ADJUSTMENT_NORMAL, 904 mIntentFilter.match(resolver, intent, true, null)); 905 assertEquals(IntentFilter.MATCH_CATEGORY_TYPE + IntentFilter.MATCH_ADJUSTMENT_NORMAL, 906 mIntentFilter.match(resolver, intent, false, null)); 907 intent.addCategory(CATEGORY); 908 assertEquals(IntentFilter.NO_MATCH_CATEGORY, mIntentFilter.match(resolver, intent, true, 909 null)); 910 mIntentFilter.addCategory(CATEGORY); 911 assertEquals(IntentFilter.MATCH_CATEGORY_TYPE + IntentFilter.MATCH_ADJUSTMENT_NORMAL, 912 mIntentFilter.match(resolver, intent, true, null)); 913 914 intent.setDataAndType(uri, DATA_TYPE); 915 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(resolver, intent, true, null)); 916 917 } 918 919 @TestTargetNew( 920 level = TestLevel.COMPLETE, 921 method = "match", 922 args = {java.lang.String.class, java.lang.String.class, java.lang.String.class, 923 android.net.Uri.class, java.util.Set.class, java.lang.String.class} 924 ) testMatchWithIntentData()925 public void testMatchWithIntentData() throws MalformedMimeTypeException { 926 Set<String> cat = new HashSet<String>(); 927 assertEquals(IntentFilter.NO_MATCH_ACTION, mIntentFilter.match(ACTION, null, null, null, 928 null, null)); 929 mIntentFilter.addAction(ACTION); 930 931 assertEquals(IntentFilter.MATCH_CATEGORY_EMPTY + IntentFilter.MATCH_ADJUSTMENT_NORMAL, 932 mIntentFilter.match(ACTION, null, null, null, null, null)); 933 assertEquals(IntentFilter.MATCH_CATEGORY_EMPTY + IntentFilter.MATCH_ADJUSTMENT_NORMAL, 934 mIntentFilter.match(ACTION, null, DATA_SCHEME, null, null, null)); 935 936 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(null, DATA_SCHEME, URI)); 937 938 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE, 939 DATA_SCHEME, URI, null, null)); 940 941 mIntentFilter.addDataScheme(DATA_SCHEME); 942 assertEquals(IntentFilter.NO_MATCH_TYPE, mIntentFilter.match(ACTION, DATA_TYPE, 943 DATA_SCHEME, URI, null, null)); 944 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE, "", URI, 945 null, null)); 946 mIntentFilter.addDataType(DATA_TYPE); 947 948 assertEquals(IntentFilter.MATCH_CATEGORY_TYPE + IntentFilter.MATCH_ADJUSTMENT_NORMAL, 949 mIntentFilter.match(ACTION, DATA_TYPE, DATA_SCHEME, URI, null, null)); 950 951 assertEquals(IntentFilter.NO_MATCH_TYPE, mIntentFilter.match(ACTION, null, DATA_SCHEME, 952 URI, null, null)); 953 954 assertEquals(IntentFilter.NO_MATCH_TYPE, mIntentFilter.match(ACTION, null, DATA_SCHEME, 955 URI, cat, null)); 956 957 cat.add(CATEGORY); 958 assertEquals(IntentFilter.NO_MATCH_CATEGORY, mIntentFilter.match(ACTION, DATA_TYPE, 959 DATA_SCHEME, URI, cat, null)); 960 cat = new HashSet<String>(); 961 mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT)); 962 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, null, DATA_SCHEME, 963 URI, null, null)); 964 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE, 965 DATA_SCHEME, URI, null, null)); 966 967 final Uri uri = Uri.parse(DATA_SCHEME + "://" + HOST + ":" + PORT); 968 mIntentFilter.addDataPath(DATA_PATH, PatternMatcher.PATTERN_LITERAL); 969 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE, 970 DATA_SCHEME, uri, null, null)); 971 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE, 972 DATA_SCHEME, URI, null, null)); 973 974 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE, 975 DATA_SCHEME, URI, cat, null)); 976 cat.add(CATEGORY); 977 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE, 978 DATA_SCHEME, URI, cat, null)); 979 mIntentFilter.addCategory(CATEGORY); 980 assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE, 981 DATA_SCHEME, URI, cat, null)); 982 } 983 984 @TestTargetNew( 985 level = TestLevel.COMPLETE, 986 method = "writeToParcel", 987 args = {android.os.Parcel.class, int.class} 988 ) testWriteToParcel()989 public void testWriteToParcel() throws MalformedMimeTypeException { 990 mIntentFilter.addAction(ACTION); 991 mIntentFilter.addCategory(CATEGORY); 992 mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT)); 993 mIntentFilter.addDataPath(DATA_PATH, 1); 994 mIntentFilter.addDataScheme(DATA_SCHEME); 995 mIntentFilter.addDataType(DATA_TYPE); 996 Parcel parcel = Parcel.obtain(); 997 mIntentFilter.writeToParcel(parcel, 1); 998 parcel.setDataPosition(0); 999 IntentFilter target = IntentFilter.CREATOR.createFromParcel(parcel); 1000 assertEquals(mIntentFilter.getAction(0), target.getAction(0)); 1001 assertEquals(mIntentFilter.getCategory(0), target.getCategory(0)); 1002 assertEquals(mIntentFilter.getDataAuthority(0).getHost(), 1003 target.getDataAuthority(0).getHost()); 1004 assertEquals(mIntentFilter.getDataAuthority(0).getPort(), 1005 target.getDataAuthority(0).getPort()); 1006 assertEquals(mIntentFilter.getDataPath(0).getPath(), target.getDataPath(0).getPath()); 1007 assertEquals(mIntentFilter.getDataScheme(0), target.getDataScheme(0)); 1008 } 1009 1010 @TestTargetNew( 1011 level = TestLevel.COMPLETE, 1012 method = "addDataType", 1013 args = {java.lang.String.class} 1014 ) testAddDataType()1015 public void testAddDataType() throws MalformedMimeTypeException { 1016 try { 1017 mIntentFilter.addDataType("test"); 1018 fail("should throw MalformedMimeTypeException"); 1019 } catch (MalformedMimeTypeException e) { 1020 // expected 1021 } 1022 1023 mIntentFilter.addDataType(DATA_TYPE); 1024 assertEquals(DATA_TYPE, mIntentFilter.getDataType(0)); 1025 } 1026 1027 private static class Match extends IntentFilter { Match(String[] actions, String[] categories, String[] mimeTypes, String[] schemes, String[] authorities, String[] ports)1028 Match(String[] actions, String[] categories, String[] mimeTypes, String[] schemes, 1029 String[] authorities, String[] ports) { 1030 if (actions != null) { 1031 for (int i = 0; i < actions.length; i++) { 1032 addAction(actions[i]); 1033 } 1034 } 1035 if (categories != null) { 1036 for (int i = 0; i < categories.length; i++) { 1037 addCategory(categories[i]); 1038 } 1039 } 1040 if (mimeTypes != null) { 1041 for (int i = 0; i < mimeTypes.length; i++) { 1042 try { 1043 addDataType(mimeTypes[i]); 1044 } catch (IntentFilter.MalformedMimeTypeException e) { 1045 throw new RuntimeException("Bad mime type", e); 1046 } 1047 } 1048 } 1049 if (schemes != null) { 1050 for (int i = 0; i < schemes.length; i++) { 1051 addDataScheme(schemes[i]); 1052 } 1053 } 1054 if (authorities != null) { 1055 for (int i = 0; i < authorities.length; i++) { 1056 addDataAuthority(authorities[i], ports != null ? ports[i] : null); 1057 } 1058 } 1059 } 1060 Match(String[] actions, String[] categories, String[] mimeTypes, String[] schemes, String[] authorities, String[] ports, String[] paths, int[] pathTypes)1061 Match(String[] actions, String[] categories, String[] mimeTypes, String[] schemes, 1062 String[] authorities, String[] ports, String[] paths, int[] pathTypes) { 1063 this(actions, categories, mimeTypes, schemes, authorities, ports); 1064 if (paths != null) { 1065 for (int i = 0; i < paths.length; i++) { 1066 addDataPath(paths[i], pathTypes[i]); 1067 } 1068 } 1069 } 1070 } 1071 1072 private static class MatchCondition { 1073 public final int result; 1074 public final String action; 1075 public final String mimeType; 1076 public final Uri data; 1077 public final String[] categories; 1078 MatchCondition(int _result, String _action, String[] _categories, String _mimeType, String _data)1079 public MatchCondition(int _result, String _action, String[] _categories, String _mimeType, 1080 String _data) { 1081 result = _result; 1082 action = _action; 1083 mimeType = _mimeType; 1084 data = _data != null ? Uri.parse(_data) : null; 1085 categories = _categories; 1086 } 1087 } 1088 checkMatches(IntentFilter filter, MatchCondition[] results)1089 private static void checkMatches(IntentFilter filter, MatchCondition[] results) { 1090 for (int i = 0; i < results.length; i++) { 1091 MatchCondition mc = results[i]; 1092 HashSet<String> categories = null; 1093 if (mc.categories != null) { 1094 for (int j = 0; j < mc.categories.length; j++) { 1095 if (categories == null) { 1096 categories = new HashSet<String>(); 1097 } 1098 categories.add(mc.categories[j]); 1099 } 1100 } 1101 int result = filter.match(mc.action, mc.mimeType, mc.data != null ? mc.data.getScheme() 1102 : null, mc.data, categories, "test"); 1103 if ((result & IntentFilter.MATCH_CATEGORY_MASK) != 1104 (mc.result & IntentFilter.MATCH_CATEGORY_MASK)) { 1105 StringBuilder msg = new StringBuilder(); 1106 msg.append("Error matching against IntentFilter:\n"); 1107 filter.dump(new StringBuilderPrinter(msg), " "); 1108 msg.append("Match action: "); 1109 msg.append(mc.action); 1110 msg.append("\nMatch mimeType: "); 1111 msg.append(mc.mimeType); 1112 msg.append("\nMatch data: "); 1113 msg.append(mc.data); 1114 msg.append("\nMatch categories: "); 1115 if (mc.categories != null) { 1116 for (int j = 0; j < mc.categories.length; j++) { 1117 if (j > 0) 1118 msg.append(", "); 1119 msg.append(mc.categories[j]); 1120 } 1121 } 1122 msg.append("\nExpected result: 0x"); 1123 msg.append(Integer.toHexString(mc.result)); 1124 msg.append(", got result: 0x"); 1125 msg.append(Integer.toHexString(result)); 1126 throw new RuntimeException(msg.toString()); 1127 } 1128 } 1129 } 1130 1131 @TestTargets({ 1132 @TestTargetNew( 1133 level = TestLevel.COMPLETE, 1134 method = "addDataPath", 1135 args = {java.lang.String.class, int.class} 1136 ), 1137 @TestTargetNew( 1138 level = TestLevel.COMPLETE, 1139 method = "countDataPaths", 1140 args = {} 1141 ), 1142 @TestTargetNew( 1143 level = TestLevel.COMPLETE, 1144 method = "getDataPath", 1145 args = {int.class} 1146 ), 1147 @TestTargetNew( 1148 level = TestLevel.COMPLETE, 1149 method = "hasDataPath", 1150 args = {java.lang.String.class} 1151 ) 1152 }) testPaths()1153 public void testPaths() throws Exception { 1154 IntentFilter filter = new Match(null, null, null, 1155 new String[]{"scheme"}, new String[]{"authority"}, null, 1156 new String[]{"/literal1", "/2literal"}, 1157 new int[]{PATTERN_LITERAL, PATTERN_LITERAL}); 1158 checkMatches(filter, new MatchCondition[] { 1159 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 1160 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1161 "scheme://authority/literal1"), 1162 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1163 "scheme://authority/2literal"), 1164 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1165 "scheme://authority/literal"), 1166 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1167 "scheme://authority/literal12"), }); 1168 filter = new Match(null, null, null, 1169 new String[]{"scheme"}, new String[]{"authority"}, null, 1170 new String[]{"/literal1", "/2literal"}, new int[]{PATTERN_PREFIX, PATTERN_PREFIX}); 1171 checkMatches(filter, new MatchCondition[] { 1172 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 1173 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1174 "scheme://authority/literal1"), 1175 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1176 "scheme://authority/2literal"), 1177 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1178 "scheme://authority/literal"), 1179 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1180 "scheme://authority/literal12"), }); 1181 filter = new Match(null, null, null, 1182 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/.*"}, 1183 new int[]{PATTERN_SIMPLE_GLOB}); 1184 checkMatches(filter, new MatchCondition[] { 1185 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 1186 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1187 "scheme://authority/literal1"), 1188 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1189 "scheme://authority/"), 1190 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1191 "scheme://authority"), }); 1192 filter = new Match(null, null, null, 1193 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{".*"}, 1194 new int[]{PATTERN_SIMPLE_GLOB}); 1195 checkMatches(filter, new MatchCondition[] { 1196 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 1197 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1198 "scheme://authority/literal1"), 1199 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1200 "scheme://authority/"), 1201 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1202 "scheme://authority"), }); 1203 filter = new Match(null, null, null, 1204 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a1*b"}, 1205 new int[]{PATTERN_SIMPLE_GLOB}); 1206 checkMatches(filter, new MatchCondition[] { 1207 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 1208 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1209 "scheme://authority/ab"), 1210 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1211 "scheme://authority/a1b"), 1212 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1213 "scheme://authority/a11b"), 1214 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1215 "scheme://authority/a2b"), 1216 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1217 "scheme://authority/a1bc"), 1218 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1219 "scheme://authority/"), }); 1220 filter = new Match(null, null, null, 1221 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a1*"}, 1222 new int[]{PATTERN_SIMPLE_GLOB}); 1223 checkMatches(filter, new MatchCondition[] { 1224 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 1225 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1226 "scheme://authority/a1"), 1227 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1228 "scheme://authority/ab"), 1229 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1230 "scheme://authority/a11"), 1231 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1232 "scheme://authority/a1b"), 1233 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1234 "scheme://authority/a11"), 1235 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1236 "scheme://authority/a2"), }); 1237 filter = new Match(null, null, null, 1238 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a\\.*b"}, 1239 new int[]{PATTERN_SIMPLE_GLOB}); 1240 checkMatches(filter, new MatchCondition[] { 1241 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 1242 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1243 "scheme://authority/ab"), 1244 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1245 "scheme://authority/a.b"), 1246 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1247 "scheme://authority/a..b"), 1248 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1249 "scheme://authority/a2b"), 1250 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1251 "scheme://authority/a.bc"), 1252 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1253 "scheme://authority/"), }); 1254 filter = new Match(null, null, null, 1255 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a.*b"}, 1256 new int[]{PATTERN_SIMPLE_GLOB}); 1257 checkMatches(filter, new MatchCondition[] { 1258 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 1259 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1260 "scheme://authority/ab"), 1261 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1262 "scheme://authority/a.b"), 1263 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1264 "scheme://authority/a.1b"), 1265 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1266 "scheme://authority/a2b"), 1267 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1268 "scheme://authority/a.bc"), 1269 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1270 "scheme://authority/"), }); 1271 filter = new Match(null, null, null, 1272 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a.*"}, 1273 new int[]{PATTERN_SIMPLE_GLOB}); 1274 checkMatches(filter, new MatchCondition[] { 1275 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 1276 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1277 "scheme://authority/ab"), 1278 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1279 "scheme://authority/a.b"), 1280 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1281 "scheme://authority/a.1b"), 1282 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1283 "scheme://authority/a2b"), 1284 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1285 "scheme://authority/a.bc"), 1286 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1287 "scheme://authority/"), }); 1288 filter = new Match(null, null, null, 1289 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a.\\*b"}, 1290 new int[]{PATTERN_SIMPLE_GLOB}); 1291 checkMatches(filter, new MatchCondition[] { 1292 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 1293 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1294 "scheme://authority/ab"), 1295 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1296 "scheme://authority/a.*b"), 1297 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1298 "scheme://authority/a1*b"), 1299 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1300 "scheme://authority/a2b"), 1301 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1302 "scheme://authority/a.bc"), 1303 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1304 "scheme://authority/"), }); 1305 filter = new Match(null, null, null, 1306 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a.\\*"}, 1307 new int[]{PATTERN_SIMPLE_GLOB}); 1308 checkMatches(filter, new MatchCondition[] { 1309 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null), 1310 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1311 "scheme://authority/ab"), 1312 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1313 "scheme://authority/a.*"), 1314 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null, 1315 "scheme://authority/a1*"), 1316 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, 1317 "scheme://authority/a1b"), }); 1318 } 1319 1320 @TestTargetNew( 1321 level = TestLevel.COMPLETE, 1322 method = "dump", 1323 args = {Printer.class, String.class} 1324 ) 1325 @ToBeFixed(explanation = "new IntentFilter().dump(...) does not print anything at all") testDump()1326 public void testDump() throws MalformedMimeTypeException { 1327 TestPrinter printer = new TestPrinter(); 1328 String prefix = "TestIntentFilter"; 1329 IntentFilter filter = new IntentFilter(ACTION, DATA_TYPE); 1330 filter.dump(printer, prefix); 1331 assertTrue(printer.isPrintlnCalled); 1332 } 1333 1334 private class TestPrinter implements Printer { 1335 public boolean isPrintlnCalled; println(String x)1336 public void println(String x) { 1337 isPrintlnCalled = true; 1338 } 1339 } 1340 } 1341