• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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