• 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 
57 public class IntentFilterTest extends AndroidTestCase {
58 
59     private IntentFilter mIntentFilter;
60     private static final String ACTION = "testAction";
61     private static final String CATEGORY = "testCategory";
62     private static final String DATA_TYPE = "vnd.android.cursor.dir/person";
63     private static final String DATA_SCHEME = "testDataSchemes.";
64     private static final String HOST = "testHost";
65     private static final int PORT = 80;
66     private static final String DATA_PATH = "testDataPath";
67     private static final Uri URI = People.CONTENT_URI;
68 
69     @Override
setUp()70     protected void setUp() throws Exception {
71         super.setUp();
72         mIntentFilter = new IntentFilter();
73     }
74 
testConstructor()75     public void testConstructor() throws MalformedMimeTypeException {
76 
77         IntentFilter filter = new IntentFilter();
78         verifyContent(filter, null, null);
79 
80         filter = new IntentFilter(ACTION);
81         verifyContent(filter, ACTION, null);
82 
83         final IntentFilter actionTypeFilter = new IntentFilter(ACTION, DATA_TYPE);
84         verifyContent(actionTypeFilter, ACTION, DATA_TYPE);
85 
86         filter = new IntentFilter(actionTypeFilter);
87         verifyContent(filter, ACTION, DATA_TYPE);
88 
89         final String dataType = "testdataType";
90         try {
91             new IntentFilter(ACTION, dataType);
92             fail("Should throw MalformedMimeTypeException ");
93         } catch (MalformedMimeTypeException e) {
94             // expected
95         }
96     }
97 
98     /**
99      * Assert that the given filter contains the given action and dataType. If
100      * action or dataType are null, assert that the filter has no actions or
101      * dataTypes registered.
102      */
verifyContent(IntentFilter filter, String action, String dataType)103     private void verifyContent(IntentFilter filter, String action, String dataType) {
104         if (action != null) {
105             assertEquals(1, filter.countActions());
106             assertEquals(action, filter.getAction(0));
107         } else {
108             assertEquals(0, filter.countActions());
109         }
110         if (dataType != null) {
111             assertEquals(1, filter.countDataTypes());
112             assertEquals(dataType, filter.getDataType(0));
113         } else {
114             assertEquals(0, filter.countDataTypes());
115         }
116     }
117 
testCategories()118     public void testCategories() {
119         for (int i = 0; i < 10; i++) {
120             mIntentFilter.addCategory(CATEGORY + i);
121         }
122         assertEquals(10, mIntentFilter.countCategories());
123         Iterator<String> iter = mIntentFilter.categoriesIterator();
124         String actual = null;
125         int i = 0;
126         while (iter.hasNext()) {
127             actual = iter.next();
128             assertEquals(CATEGORY + i, actual);
129             assertEquals(CATEGORY + i, mIntentFilter.getCategory(i));
130             assertTrue(mIntentFilter.hasCategory(CATEGORY + i));
131             assertFalse(mIntentFilter.hasCategory(CATEGORY + i + 10));
132             i++;
133         }
134         IntentFilter filter = new Match(null, new String[] { "category1" }, null, null, null, null);
135         checkMatches(filter, new MatchCondition[] {
136                 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, null, null, null),
137                 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null,
138                         new String[] { "category1" }, null, null),
139                 new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null,
140                         new String[] { "category2" }, null, null),
141                 new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null, new String[] {
142                         "category1", "category2" }, null, null), });
143 
144         filter = new Match(null, new String[] { "category1", "category2" }, null, null, null, null);
145         checkMatches(filter, new MatchCondition[] {
146                 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, null, null, null),
147                 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null,
148                         new String[] { "category1" }, null, null),
149                 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null,
150                         new String[] { "category2" }, null, null),
151                 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, new String[] {
152                         "category1", "category2" }, null, null),
153                 new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null,
154                         new String[] { "category3" }, null, null),
155                 new MatchCondition(IntentFilter.NO_MATCH_CATEGORY, null, new String[] {
156                         "category1", "category2", "category3" }, null, null), });
157     }
158 
testMimeTypes()159     public void testMimeTypes() throws Exception {
160         IntentFilter filter = new Match(null, null, new String[] { "which1/what1" }, null, null,
161                 null);
162         checkMatches(filter, new MatchCondition[] {
163                 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null),
164                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1",
165                         null),
166                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null),
167                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null),
168                 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/what2", null),
169                 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/*", null),
170                 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which1/what2", null),
171                 });
172 
173         filter = new Match(null, null, new String[] { "which1/what1", "which2/what2" }, null, null,
174                 null);
175         checkMatches(filter, new MatchCondition[] {
176                 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null),
177                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1",
178                         null),
179                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null),
180                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null),
181                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/what2",
182                         null),
183                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/*", null),
184                 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which1/what2", null),
185                 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which3/what3", null),
186                 });
187 
188         filter = new Match(null, null, new String[] { "which1/*" }, null, null, null);
189         checkMatches(filter, new MatchCondition[] {
190                 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null),
191                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1",
192                         null),
193                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null),
194                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null),
195                 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/what2", null),
196                 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which2/*", null),
197                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what2",
198                         null),
199                 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, "which3/what3", null),
200                 });
201 
202         filter = new Match(null, null, new String[] { "*/*" }, null, null, null);
203         checkMatches(filter, new MatchCondition[] {
204                 new MatchCondition(IntentFilter.NO_MATCH_TYPE, null, null, null, null),
205                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what1",
206                         null),
207                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/*", null),
208                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "*/*", null),
209                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/what2",
210                         null),
211                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which2/*", null),
212                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which1/what2",
213                         null),
214                 new MatchCondition(IntentFilter.MATCH_CATEGORY_TYPE, null, null, "which3/what3",
215                         null), });
216     }
217 
testAccessPriority()218     public void testAccessPriority() {
219         final int expected = 1;
220         mIntentFilter.setPriority(expected);
221         assertEquals(expected, mIntentFilter.getPriority());
222     }
223 
testDataSchemes()224     public void testDataSchemes() {
225         for (int i = 0; i < 10; i++) {
226             mIntentFilter.addDataScheme(DATA_SCHEME + i);
227         }
228         assertEquals(10, mIntentFilter.countDataSchemes());
229         final Iterator<String> iter = mIntentFilter.schemesIterator();
230         String actual = null;
231         int i = 0;
232         while (iter.hasNext()) {
233             actual = iter.next();
234             assertEquals(DATA_SCHEME + i, actual);
235             assertEquals(DATA_SCHEME + i, mIntentFilter.getDataScheme(i));
236             assertTrue(mIntentFilter.hasDataScheme(DATA_SCHEME + i));
237             assertFalse(mIntentFilter.hasDataScheme(DATA_SCHEME + i + 10));
238             i++;
239         }
240         IntentFilter filter = new Match(null, null, null, new String[] { "scheme1" }, null, null);
241         checkMatches(filter, new MatchCondition[] {
242                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
243                 new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME, null, null, null,
244                         "scheme1:foo"),
245                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme2:foo"), });
246 
247         filter = new Match(null, null, null, new String[] { "scheme1", "scheme2" }, null, null);
248         checkMatches(filter, new MatchCondition[] {
249                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
250                 new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME, null, null, null,
251                         "scheme1:foo"),
252                 new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME, null, null, null,
253                         "scheme2:foo"),
254                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme3:foo"), });
255     }
256 
testCreate()257     public void testCreate() {
258         IntentFilter filter = IntentFilter.create(ACTION, DATA_TYPE);
259         assertNotNull(filter);
260         verifyContent(filter, ACTION, DATA_TYPE);
261     }
262 
testAuthorities()263     public void testAuthorities() {
264         for (int i = 0; i < 10; i++) {
265             mIntentFilter.addDataAuthority(HOST + i, String.valueOf(PORT + i));
266         }
267         assertEquals(10, mIntentFilter.countDataAuthorities());
268 
269         final Iterator<AuthorityEntry> iter = mIntentFilter.authoritiesIterator();
270         AuthorityEntry actual = null;
271         int i = 0;
272         while (iter.hasNext()) {
273             actual = iter.next();
274             assertEquals(HOST + i, actual.getHost());
275             assertEquals(PORT + i, actual.getPort());
276             AuthorityEntry ae = new AuthorityEntry(HOST + i, String.valueOf(PORT + i));
277             assertEquals(ae.getHost(), mIntentFilter.getDataAuthority(i).getHost());
278             assertEquals(ae.getPort(), mIntentFilter.getDataAuthority(i).getPort());
279             Uri uri = Uri.parse("http://" + HOST + i + ":" + String.valueOf(PORT + i));
280             assertTrue(mIntentFilter.hasDataAuthority(uri));
281             Uri uri2 = Uri.parse("http://" + HOST + i + 10 + ":" + PORT + i + 10);
282             assertFalse(mIntentFilter.hasDataAuthority(uri2));
283             i++;
284         }
285         IntentFilter filter = new Match(null, null, null, new String[] { "scheme1" },
286                 new String[] { "authority1" }, new String[] { null });
287         checkMatches(filter, new MatchCondition[] {
288                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
289                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme1:foo"),
290                 new MatchCondition(IntentFilter.MATCH_CATEGORY_HOST, null, null, null,
291                         "scheme1://authority1/"),
292                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
293                         "scheme1://authority2/"),
294                 new MatchCondition(IntentFilter.MATCH_CATEGORY_HOST, null, null, null,
295                         "scheme1://authority1:100/"), });
296 
297         filter = new Match(null, null, null, new String[] { "scheme1" },
298                 new String[] { "authority1" }, new String[] { "100" });
299         checkMatches(filter, new MatchCondition[] {
300                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
301                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme1:foo"),
302                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
303                         "scheme1://authority1/"),
304                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
305                         "scheme1://authority2/"),
306                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PORT, null, null, null,
307                         "scheme1://authority1:100/"),
308                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
309                         "scheme1://authority1:200/"), });
310 
311         filter = new Match(null, null, null, new String[] { "scheme1" },
312                 new String[] { "authority1", "authority2" }, new String[] { "100", null });
313         checkMatches(filter, new MatchCondition[] {
314                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
315                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme1:foo"),
316                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
317                         "scheme1://authority1/"),
318                 new MatchCondition(IntentFilter.MATCH_CATEGORY_HOST, null, null, null,
319                         "scheme1://authority2/"),
320                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PORT, null, null, null,
321                         "scheme1://authority1:100/"),
322                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
323                         "scheme1://authority1:200/"), });
324     }
325 
testDataTypes()326     public void testDataTypes() throws MalformedMimeTypeException {
327         for (int i = 0; i < 10; i++) {
328             mIntentFilter.addDataType(DATA_TYPE + i);
329         }
330         assertEquals(10, mIntentFilter.countDataTypes());
331         final Iterator<String> iter = mIntentFilter.typesIterator();
332         String actual = null;
333         int i = 0;
334         while (iter.hasNext()) {
335             actual = iter.next();
336             assertEquals(DATA_TYPE + i, actual);
337             assertEquals(DATA_TYPE + i, mIntentFilter.getDataType(i));
338             assertTrue(mIntentFilter.hasDataType(DATA_TYPE + i));
339             assertFalse(mIntentFilter.hasDataType(DATA_TYPE + i + 10));
340             i++;
341         }
342     }
343 
testMatchData()344     public void testMatchData() throws MalformedMimeTypeException {
345         int expected = IntentFilter.MATCH_CATEGORY_EMPTY + IntentFilter.MATCH_ADJUSTMENT_NORMAL;
346         assertEquals(expected, mIntentFilter.matchData(null, null, null));
347         assertEquals(expected, mIntentFilter.matchData(null, DATA_SCHEME, null));
348 
349         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(null, DATA_SCHEME, URI));
350         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(DATA_TYPE, DATA_SCHEME,
351                 URI));
352 
353         mIntentFilter.addDataScheme(DATA_SCHEME);
354         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(DATA_TYPE,
355                 "mDataSchemestest", URI));
356         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(DATA_TYPE, "", URI));
357 
358         expected = IntentFilter.MATCH_CATEGORY_SCHEME + IntentFilter.MATCH_ADJUSTMENT_NORMAL;
359         assertEquals(expected, mIntentFilter.matchData(null, DATA_SCHEME, URI));
360         assertEquals(IntentFilter.NO_MATCH_TYPE, mIntentFilter.matchData(DATA_TYPE, DATA_SCHEME,
361                 URI));
362 
363         mIntentFilter.addDataType(DATA_TYPE);
364         assertEquals(IntentFilter.MATCH_CATEGORY_TYPE + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
365                 mIntentFilter.matchData(DATA_TYPE, DATA_SCHEME, URI));
366 
367         mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT));
368         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(null, DATA_SCHEME, URI));
369 
370         final Uri uri = Uri.parse("http://" + HOST + ":" + PORT);
371         mIntentFilter.addDataPath(DATA_PATH, PatternMatcher.PATTERN_LITERAL);
372         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(null, DATA_SCHEME, uri));
373     }
374 
testActions()375     public void testActions() {
376         for (int i = 0; i < 10; i++) {
377             mIntentFilter.addAction(ACTION + i);
378         }
379         assertEquals(10, mIntentFilter.countActions());
380         final Iterator<String> iter = mIntentFilter.actionsIterator();
381         String actual = null;
382         int i = 0;
383         while (iter.hasNext()) {
384             actual = iter.next();
385             assertEquals(ACTION + i, actual);
386             assertEquals(ACTION + i, mIntentFilter.getAction(i));
387             assertTrue(mIntentFilter.hasAction(ACTION + i));
388             assertFalse(mIntentFilter.hasAction(ACTION + i + 10));
389             assertTrue(mIntentFilter.matchAction(ACTION + i));
390             assertFalse(mIntentFilter.matchAction(ACTION + i + 10));
391             i++;
392         }
393         IntentFilter filter = new Match(new String[] { "action1" }, null, null, null, null, null);
394         checkMatches(filter, new MatchCondition[] {
395                 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, null, null, null),
396                 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "action1", null, null, null),
397                 new MatchCondition(IntentFilter.NO_MATCH_ACTION, "action2", null, null, null), });
398 
399         filter = new Match(new String[] { "action1", "action2" }, null, null, null, null, null);
400         checkMatches(filter, new MatchCondition[] {
401                 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, null, null, null, null),
402                 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "action1", null, null, null),
403                 new MatchCondition(IntentFilter.MATCH_CATEGORY_EMPTY, "action2", null, null, null),
404                 new MatchCondition(IntentFilter.NO_MATCH_ACTION, "action3", null, null, null), });
405     }
406 
testWriteToXml()407     public void testWriteToXml() throws IllegalArgumentException, IllegalStateException,
408             IOException, MalformedMimeTypeException, XmlPullParserException {
409         XmlSerializer xml;
410         ByteArrayOutputStream out;
411 
412         xml = new FastXmlSerializer();
413         out = new ByteArrayOutputStream();
414         xml.setOutput(out, "utf-8");
415         mIntentFilter.addAction(ACTION);
416         mIntentFilter.addCategory(CATEGORY);
417         mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT));
418         mIntentFilter.addDataPath(DATA_PATH, 1);
419         mIntentFilter.addDataScheme(DATA_SCHEME);
420         mIntentFilter.addDataType(DATA_TYPE);
421         mIntentFilter.writeToXml(xml);
422         xml.flush();
423         final KXmlParser parser = new KXmlParser();
424         final InputStream in = new ByteArrayInputStream(out.toByteArray());
425         parser.setInput(in, "utf-8");
426         final IntentFilter intentFilter = new IntentFilter();
427         intentFilter.readFromXml(parser);
428         assertEquals(ACTION, intentFilter.getAction(0));
429         assertEquals(CATEGORY, intentFilter.getCategory(0));
430         assertEquals(DATA_TYPE, intentFilter.getDataType(0));
431         assertEquals(DATA_SCHEME, intentFilter.getDataScheme(0));
432         assertEquals(DATA_PATH, intentFilter.getDataPath(0).getPath());
433         assertEquals(HOST, intentFilter.getDataAuthority(0).getHost());
434         assertEquals(PORT, intentFilter.getDataAuthority(0).getPort());
435         out.close();
436     }
437 
testMatchCategories()438     public void testMatchCategories() {
439         assertNull(mIntentFilter.matchCategories(null));
440         Set<String> cat = new HashSet<String>();
441         assertNull(mIntentFilter.matchCategories(cat));
442 
443         final String expected = "mytest";
444         cat.add(expected);
445         assertEquals(expected, mIntentFilter.matchCategories(cat));
446 
447         cat = new HashSet<String>();
448         cat.add(CATEGORY);
449         mIntentFilter.addCategory(CATEGORY);
450         assertNull(mIntentFilter.matchCategories(cat));
451         cat.add(expected);
452         assertEquals(expected, mIntentFilter.matchCategories(cat));
453     }
454 
testMatchDataAuthority()455     public void testMatchDataAuthority() {
456         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchDataAuthority(null));
457         mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT));
458         final Uri uri = Uri.parse("http://" + HOST + ":" + PORT);
459         assertEquals(IntentFilter.MATCH_CATEGORY_PORT, mIntentFilter.matchDataAuthority(uri));
460     }
461 
testDescribeContents()462     public void testDescribeContents() {
463         assertEquals(0, mIntentFilter.describeContents());
464     }
465 
testReadFromXml()466     public void testReadFromXml() throws NameNotFoundException, XmlPullParserException, IOException {
467         XmlPullParser parser = null;
468         ActivityInfo ai = null;
469 
470         final ComponentName mComponentName = new ComponentName(mContext, MockActivity.class);
471         final PackageManager pm = mContext.getPackageManager();
472         ai = pm.getActivityInfo(mComponentName, PackageManager.GET_META_DATA);
473 
474         parser = ai.loadXmlMetaData(pm, "android.app.intent.filter");
475 
476         int type;
477         while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
478                 && type != XmlPullParser.START_TAG) {
479         }
480 
481         final String nodeName = parser.getName();
482 
483         if (!"intent-filter".equals(nodeName)) {
484             throw new RuntimeException();
485         }
486 
487         mIntentFilter.readFromXml(parser);
488 
489         assertEquals("testAction", mIntentFilter.getAction(0));
490         assertEquals("testCategory", mIntentFilter.getCategory(0));
491         assertEquals("vnd.android.cursor.dir/person", mIntentFilter.getDataType(0));
492         assertEquals("testScheme", mIntentFilter.getDataScheme(0));
493         assertEquals("testHost", mIntentFilter.getDataAuthority(0).getHost());
494         assertEquals(80, mIntentFilter.getDataAuthority(0).getPort());
495 
496         assertEquals("test", mIntentFilter.getDataPath(0).getPath());
497         assertEquals("test", mIntentFilter.getDataPath(1).getPath());
498         assertEquals("test", mIntentFilter.getDataPath(2).getPath());
499     }
500 
testDataPaths()501     public void testDataPaths() {
502         for (int i = 0; i < 10; i++) {
503             mIntentFilter.addDataPath(DATA_PATH + i, PatternMatcher.PATTERN_PREFIX);
504         }
505         assertEquals(10, mIntentFilter.countDataPaths());
506         Iterator<PatternMatcher> iter = mIntentFilter.pathsIterator();
507         PatternMatcher actual = null;
508         int i = 0;
509         while (iter.hasNext()) {
510             actual = iter.next();
511             assertEquals(DATA_PATH + i, actual.getPath());
512             assertEquals(PatternMatcher.PATTERN_PREFIX, actual.getType());
513             PatternMatcher p = new PatternMatcher(DATA_PATH + i, PatternMatcher.PATTERN_PREFIX);
514             assertEquals(p.getPath(), mIntentFilter.getDataPath(i).getPath());
515             assertEquals(p.getType(), mIntentFilter.getDataPath(i).getType());
516             assertTrue(mIntentFilter.hasDataPath(DATA_PATH + i));
517             assertTrue(mIntentFilter.hasDataPath(DATA_PATH + i + 10));
518             i++;
519         }
520 
521         mIntentFilter = new IntentFilter();
522         i = 0;
523         for (i = 0; i < 10; i++) {
524             mIntentFilter.addDataPath(DATA_PATH + i, PatternMatcher.PATTERN_LITERAL);
525         }
526         assertEquals(10, mIntentFilter.countDataPaths());
527         iter = mIntentFilter.pathsIterator();
528         i = 0;
529         while (iter.hasNext()) {
530             actual = iter.next();
531             assertEquals(DATA_PATH + i, actual.getPath());
532             assertEquals(PatternMatcher.PATTERN_LITERAL, actual.getType());
533             PatternMatcher p = new PatternMatcher(DATA_PATH + i, PatternMatcher.PATTERN_LITERAL);
534             assertEquals(p.getPath(), mIntentFilter.getDataPath(i).getPath());
535             assertEquals(p.getType(), mIntentFilter.getDataPath(i).getType());
536             assertTrue(mIntentFilter.hasDataPath(DATA_PATH + i));
537             assertFalse(mIntentFilter.hasDataPath(DATA_PATH + i + 10));
538             i++;
539         }
540         mIntentFilter = new IntentFilter();
541         i = 0;
542         for (i = 0; i < 10; i++) {
543             mIntentFilter.addDataPath(DATA_PATH + i, PatternMatcher.PATTERN_SIMPLE_GLOB);
544         }
545         assertEquals(10, mIntentFilter.countDataPaths());
546         iter = mIntentFilter.pathsIterator();
547         i = 0;
548         while (iter.hasNext()) {
549             actual = iter.next();
550             assertEquals(DATA_PATH + i, actual.getPath());
551             assertEquals(PatternMatcher.PATTERN_SIMPLE_GLOB, actual.getType());
552             PatternMatcher p = new PatternMatcher(DATA_PATH + i,
553                     PatternMatcher.PATTERN_SIMPLE_GLOB);
554             assertEquals(p.getPath(), mIntentFilter.getDataPath(i).getPath());
555             assertEquals(p.getType(), mIntentFilter.getDataPath(i).getType());
556             assertTrue(mIntentFilter.hasDataPath(DATA_PATH + i));
557             assertFalse(mIntentFilter.hasDataPath(DATA_PATH + i + 10));
558             i++;
559         }
560 
561         IntentFilter filter = new Match(null, null, null, new String[] { "scheme1" },
562                 new String[] { "authority1" }, new String[] { null });
563         checkMatches(filter, new MatchCondition[] {
564                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
565                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme1:foo"),
566                 new MatchCondition(IntentFilter.MATCH_CATEGORY_HOST, null, null, null,
567                         "scheme1://authority1/"),
568                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
569                         "scheme1://authority2/"),
570                 new MatchCondition(IntentFilter.MATCH_CATEGORY_HOST, null, null, null,
571                         "scheme1://authority1:100/"), });
572 
573         filter = new Match(null, null, null, new String[] { "scheme1" },
574                 new String[] { "authority1" }, new String[] { "100" });
575         checkMatches(filter, new MatchCondition[] {
576                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
577                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme1:foo"),
578                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
579                         "scheme1://authority1/"),
580                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
581                         "scheme1://authority2/"),
582                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PORT, null, null, null,
583                         "scheme1://authority1:100/"),
584                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
585                         "scheme1://authority1:200/"), });
586 
587         filter = new Match(null, null, null, new String[] { "scheme1" },
588                 new String[] { "authority1", "authority2" }, new String[] { "100", null });
589         checkMatches(filter, new MatchCondition[] {
590                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
591                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme1:foo"),
592                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
593                         "scheme1://authority1/"),
594                 new MatchCondition(IntentFilter.MATCH_CATEGORY_HOST, null, null, null,
595                         "scheme1://authority2/"),
596                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PORT, null, null, null,
597                         "scheme1://authority1:100/"),
598                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
599                         "scheme1://authority1:200/"), });
600     }
601 
testMatchWithIntent()602     public void testMatchWithIntent() throws MalformedMimeTypeException {
603         final ContentResolver resolver = mContext.getContentResolver();
604 
605         Intent intent = new Intent(ACTION);
606         assertEquals(IntentFilter.NO_MATCH_ACTION, mIntentFilter.match(resolver, intent, true,
607                 null));
608         mIntentFilter.addAction(ACTION);
609         assertEquals(IntentFilter.MATCH_CATEGORY_EMPTY + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
610                 mIntentFilter.match(resolver, intent, true, null));
611 
612         final Uri uri = Uri.parse(DATA_SCHEME + "://" + HOST + ":" + PORT);
613         intent.setData(uri);
614         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(resolver, intent, true, null));
615         mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT));
616         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(resolver, intent, true, null));
617         intent.setType(DATA_TYPE);
618         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(resolver, intent, true, null));
619 
620         mIntentFilter.addDataType(DATA_TYPE);
621 
622         assertEquals(IntentFilter.MATCH_CATEGORY_TYPE + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
623                 mIntentFilter.match(resolver, intent, true, null));
624         assertEquals(IntentFilter.MATCH_CATEGORY_TYPE + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
625                 mIntentFilter.match(resolver, intent, false, null));
626         intent.addCategory(CATEGORY);
627         assertEquals(IntentFilter.NO_MATCH_CATEGORY, mIntentFilter.match(resolver, intent, true,
628                 null));
629         mIntentFilter.addCategory(CATEGORY);
630         assertEquals(IntentFilter.MATCH_CATEGORY_TYPE + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
631                 mIntentFilter.match(resolver, intent, true, null));
632 
633         intent.setDataAndType(uri, DATA_TYPE);
634         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(resolver, intent, true, null));
635 
636     }
637 
testMatchWithIntentData()638     public void testMatchWithIntentData() throws MalformedMimeTypeException {
639         Set<String> cat = new HashSet<String>();
640         assertEquals(IntentFilter.NO_MATCH_ACTION, mIntentFilter.match(ACTION, null, null, null,
641                 null, null));
642         mIntentFilter.addAction(ACTION);
643 
644         assertEquals(IntentFilter.MATCH_CATEGORY_EMPTY + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
645                 mIntentFilter.match(ACTION, null, null, null, null, null));
646         assertEquals(IntentFilter.MATCH_CATEGORY_EMPTY + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
647                 mIntentFilter.match(ACTION, null, DATA_SCHEME, null, null, null));
648 
649         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(null, DATA_SCHEME, URI));
650 
651         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE,
652                 DATA_SCHEME, URI, null, null));
653 
654         mIntentFilter.addDataScheme(DATA_SCHEME);
655         assertEquals(IntentFilter.NO_MATCH_TYPE, mIntentFilter.match(ACTION, DATA_TYPE,
656                 DATA_SCHEME, URI, null, null));
657         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE, "", URI,
658                 null, null));
659         mIntentFilter.addDataType(DATA_TYPE);
660 
661         assertEquals(IntentFilter.MATCH_CATEGORY_TYPE + IntentFilter.MATCH_ADJUSTMENT_NORMAL,
662                 mIntentFilter.match(ACTION, DATA_TYPE, DATA_SCHEME, URI, null, null));
663 
664         assertEquals(IntentFilter.NO_MATCH_TYPE, mIntentFilter.match(ACTION, null, DATA_SCHEME,
665                 URI, null, null));
666 
667         assertEquals(IntentFilter.NO_MATCH_TYPE, mIntentFilter.match(ACTION, null, DATA_SCHEME,
668                 URI, cat, null));
669 
670         cat.add(CATEGORY);
671         assertEquals(IntentFilter.NO_MATCH_CATEGORY, mIntentFilter.match(ACTION, DATA_TYPE,
672                 DATA_SCHEME, URI, cat, null));
673         cat = new HashSet<String>();
674         mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT));
675         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, null, DATA_SCHEME,
676                 URI, null, null));
677         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE,
678                 DATA_SCHEME, URI, null, null));
679 
680         final Uri uri = Uri.parse(DATA_SCHEME + "://" + HOST + ":" + PORT);
681         mIntentFilter.addDataPath(DATA_PATH, PatternMatcher.PATTERN_LITERAL);
682         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE,
683                 DATA_SCHEME, uri, null, null));
684         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE,
685                 DATA_SCHEME, URI, null, null));
686 
687         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE,
688                 DATA_SCHEME, URI, cat, null));
689         cat.add(CATEGORY);
690         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE,
691                 DATA_SCHEME, URI, cat, null));
692         mIntentFilter.addCategory(CATEGORY);
693         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.match(ACTION, DATA_TYPE,
694                 DATA_SCHEME, URI, cat, null));
695     }
696 
testWriteToParcel()697     public void testWriteToParcel() throws MalformedMimeTypeException {
698         mIntentFilter.addAction(ACTION);
699         mIntentFilter.addCategory(CATEGORY);
700         mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT));
701         mIntentFilter.addDataPath(DATA_PATH, 1);
702         mIntentFilter.addDataScheme(DATA_SCHEME);
703         mIntentFilter.addDataType(DATA_TYPE);
704         Parcel parcel = Parcel.obtain();
705         mIntentFilter.writeToParcel(parcel, 1);
706         parcel.setDataPosition(0);
707         IntentFilter target = IntentFilter.CREATOR.createFromParcel(parcel);
708         assertEquals(mIntentFilter.getAction(0), target.getAction(0));
709         assertEquals(mIntentFilter.getCategory(0), target.getCategory(0));
710         assertEquals(mIntentFilter.getDataAuthority(0).getHost(),
711                 target.getDataAuthority(0).getHost());
712         assertEquals(mIntentFilter.getDataAuthority(0).getPort(),
713                 target.getDataAuthority(0).getPort());
714         assertEquals(mIntentFilter.getDataPath(0).getPath(), target.getDataPath(0).getPath());
715         assertEquals(mIntentFilter.getDataScheme(0), target.getDataScheme(0));
716     }
717 
testAddDataType()718     public void testAddDataType() throws MalformedMimeTypeException {
719         try {
720             mIntentFilter.addDataType("test");
721             fail("should throw MalformedMimeTypeException");
722         } catch (MalformedMimeTypeException e) {
723             // expected
724         }
725 
726         mIntentFilter.addDataType(DATA_TYPE);
727         assertEquals(DATA_TYPE, mIntentFilter.getDataType(0));
728     }
729 
730     private static class Match extends IntentFilter {
Match(String[] actions, String[] categories, String[] mimeTypes, String[] schemes, String[] authorities, String[] ports)731         Match(String[] actions, String[] categories, String[] mimeTypes, String[] schemes,
732                 String[] authorities, String[] ports) {
733             if (actions != null) {
734                 for (int i = 0; i < actions.length; i++) {
735                     addAction(actions[i]);
736                 }
737             }
738             if (categories != null) {
739                 for (int i = 0; i < categories.length; i++) {
740                     addCategory(categories[i]);
741                 }
742             }
743             if (mimeTypes != null) {
744                 for (int i = 0; i < mimeTypes.length; i++) {
745                     try {
746                         addDataType(mimeTypes[i]);
747                     } catch (IntentFilter.MalformedMimeTypeException e) {
748                         throw new RuntimeException("Bad mime type", e);
749                     }
750                 }
751             }
752             if (schemes != null) {
753                 for (int i = 0; i < schemes.length; i++) {
754                     addDataScheme(schemes[i]);
755                 }
756             }
757             if (authorities != null) {
758                 for (int i = 0; i < authorities.length; i++) {
759                     addDataAuthority(authorities[i], ports != null ? ports[i] : null);
760                 }
761             }
762         }
763 
Match(String[] actions, String[] categories, String[] mimeTypes, String[] schemes, String[] authorities, String[] ports, String[] paths, int[] pathTypes)764         Match(String[] actions, String[] categories, String[] mimeTypes, String[] schemes,
765                 String[] authorities, String[] ports, String[] paths, int[] pathTypes) {
766             this(actions, categories, mimeTypes, schemes, authorities, ports);
767             if (paths != null) {
768                 for (int i = 0; i < paths.length; i++) {
769                     addDataPath(paths[i], pathTypes[i]);
770                 }
771             }
772         }
773     }
774 
775     private static class MatchCondition {
776         public final int result;
777         public final String action;
778         public final String mimeType;
779         public final Uri data;
780         public final String[] categories;
781 
MatchCondition(int _result, String _action, String[] _categories, String _mimeType, String _data)782         public MatchCondition(int _result, String _action, String[] _categories, String _mimeType,
783                 String _data) {
784             result = _result;
785             action = _action;
786             mimeType = _mimeType;
787             data = _data != null ? Uri.parse(_data) : null;
788             categories = _categories;
789         }
790     }
791 
checkMatches(IntentFilter filter, MatchCondition[] results)792     private static void checkMatches(IntentFilter filter, MatchCondition[] results) {
793         for (int i = 0; i < results.length; i++) {
794             MatchCondition mc = results[i];
795             HashSet<String> categories = null;
796             if (mc.categories != null) {
797                 for (int j = 0; j < mc.categories.length; j++) {
798                     if (categories == null) {
799                         categories = new HashSet<String>();
800                     }
801                     categories.add(mc.categories[j]);
802                 }
803             }
804             int result = filter.match(mc.action, mc.mimeType, mc.data != null ? mc.data.getScheme()
805                     : null, mc.data, categories, "test");
806             if ((result & IntentFilter.MATCH_CATEGORY_MASK) !=
807                     (mc.result & IntentFilter.MATCH_CATEGORY_MASK)) {
808                 StringBuilder msg = new StringBuilder();
809                 msg.append("Error matching against IntentFilter:\n");
810                 filter.dump(new StringBuilderPrinter(msg), "    ");
811                 msg.append("Match action: ");
812                 msg.append(mc.action);
813                 msg.append("\nMatch mimeType: ");
814                 msg.append(mc.mimeType);
815                 msg.append("\nMatch data: ");
816                 msg.append(mc.data);
817                 msg.append("\nMatch categories: ");
818                 if (mc.categories != null) {
819                     for (int j = 0; j < mc.categories.length; j++) {
820                         if (j > 0)
821                             msg.append(", ");
822                         msg.append(mc.categories[j]);
823                     }
824                 }
825                 msg.append("\nExpected result: 0x");
826                 msg.append(Integer.toHexString(mc.result));
827                 msg.append(", got result: 0x");
828                 msg.append(Integer.toHexString(result));
829                 throw new RuntimeException(msg.toString());
830             }
831         }
832     }
833 
testPaths()834     public void testPaths() throws Exception {
835         IntentFilter filter = new Match(null, null, null,
836                 new String[]{"scheme"}, new String[]{"authority"}, null,
837                 new String[]{"/literal1", "/2literal"},
838                 new int[]{PATTERN_LITERAL, PATTERN_LITERAL});
839         checkMatches(filter, new MatchCondition[] {
840                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
841                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
842                         "scheme://authority/literal1"),
843                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
844                         "scheme://authority/2literal"),
845                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
846                         "scheme://authority/literal"),
847                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
848                         "scheme://authority/literal12"), });
849         filter = new Match(null, null, null,
850                 new String[]{"scheme"}, new String[]{"authority"}, null,
851                 new String[]{"/literal1", "/2literal"}, new int[]{PATTERN_PREFIX, PATTERN_PREFIX});
852         checkMatches(filter, new MatchCondition[] {
853                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
854                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
855                         "scheme://authority/literal1"),
856                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
857                         "scheme://authority/2literal"),
858                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
859                         "scheme://authority/literal"),
860                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
861                         "scheme://authority/literal12"), });
862         filter = new Match(null, null, null,
863                 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/.*"},
864                 new int[]{PATTERN_SIMPLE_GLOB});
865         checkMatches(filter, new MatchCondition[] {
866                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
867                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
868                         "scheme://authority/literal1"),
869                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
870                         "scheme://authority/"),
871                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
872                         "scheme://authority"), });
873         filter = new Match(null, null, null,
874                 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{".*"},
875                 new int[]{PATTERN_SIMPLE_GLOB});
876         checkMatches(filter, new MatchCondition[] {
877                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
878                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
879                         "scheme://authority/literal1"),
880                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
881                         "scheme://authority/"),
882                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
883                         "scheme://authority"), });
884         filter = new Match(null, null, null,
885                 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a1*b"},
886                 new int[]{PATTERN_SIMPLE_GLOB});
887         checkMatches(filter, new MatchCondition[] {
888                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
889                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
890                         "scheme://authority/ab"),
891                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
892                         "scheme://authority/a1b"),
893                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
894                         "scheme://authority/a11b"),
895                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
896                         "scheme://authority/a2b"),
897                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
898                         "scheme://authority/a1bc"),
899                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
900                         "scheme://authority/"), });
901         filter = new Match(null, null, null,
902                 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a1*"},
903                 new int[]{PATTERN_SIMPLE_GLOB});
904         checkMatches(filter, new MatchCondition[] {
905                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
906                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
907                         "scheme://authority/a1"),
908                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
909                         "scheme://authority/ab"),
910                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
911                         "scheme://authority/a11"),
912                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
913                         "scheme://authority/a1b"),
914                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
915                         "scheme://authority/a11"),
916                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
917                         "scheme://authority/a2"), });
918         filter = new Match(null, null, null,
919                 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a\\.*b"},
920                 new int[]{PATTERN_SIMPLE_GLOB});
921         checkMatches(filter, new MatchCondition[] {
922                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
923                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
924                         "scheme://authority/ab"),
925                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
926                         "scheme://authority/a.b"),
927                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
928                         "scheme://authority/a..b"),
929                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
930                         "scheme://authority/a2b"),
931                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
932                         "scheme://authority/a.bc"),
933                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
934                         "scheme://authority/"), });
935         filter = new Match(null, null, null,
936                 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a.*b"},
937                 new int[]{PATTERN_SIMPLE_GLOB});
938         checkMatches(filter, new MatchCondition[] {
939                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
940                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
941                         "scheme://authority/ab"),
942                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
943                         "scheme://authority/a.b"),
944                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
945                         "scheme://authority/a.1b"),
946                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
947                         "scheme://authority/a2b"),
948                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
949                         "scheme://authority/a.bc"),
950                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
951                         "scheme://authority/"), });
952         filter = new Match(null, null, null,
953                 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a.*"},
954                 new int[]{PATTERN_SIMPLE_GLOB});
955         checkMatches(filter, new MatchCondition[] {
956                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
957                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
958                         "scheme://authority/ab"),
959                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
960                         "scheme://authority/a.b"),
961                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
962                         "scheme://authority/a.1b"),
963                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
964                         "scheme://authority/a2b"),
965                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
966                         "scheme://authority/a.bc"),
967                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
968                         "scheme://authority/"), });
969         filter = new Match(null, null, null,
970                 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a.\\*b"},
971                 new int[]{PATTERN_SIMPLE_GLOB});
972         checkMatches(filter, new MatchCondition[] {
973                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
974                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
975                         "scheme://authority/ab"),
976                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
977                         "scheme://authority/a.*b"),
978                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
979                         "scheme://authority/a1*b"),
980                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
981                         "scheme://authority/a2b"),
982                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
983                         "scheme://authority/a.bc"),
984                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
985                         "scheme://authority/"), });
986         filter = new Match(null, null, null,
987                 new String[]{"scheme"}, new String[]{"authority"}, null, new String[]{"/a.\\*"},
988                 new int[]{PATTERN_SIMPLE_GLOB});
989         checkMatches(filter, new MatchCondition[] {
990                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
991                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
992                         "scheme://authority/ab"),
993                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
994                         "scheme://authority/a.*"),
995                 new MatchCondition(IntentFilter.MATCH_CATEGORY_PATH, null, null, null,
996                         "scheme://authority/a1*"),
997                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
998                         "scheme://authority/a1b"), });
999     }
1000 
testDump()1001     public void testDump() throws MalformedMimeTypeException {
1002         TestPrinter printer = new TestPrinter();
1003         String prefix = "TestIntentFilter";
1004         IntentFilter filter = new IntentFilter(ACTION, DATA_TYPE);
1005         filter.dump(printer, prefix);
1006         assertTrue(printer.isPrintlnCalled);
1007     }
1008 
1009     private class TestPrinter implements Printer {
1010         public boolean isPrintlnCalled;
println(String x)1011         public void println(String x) {
1012             isPrintlnCalled = true;
1013         }
1014     }
1015 }
1016