1724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo/*
2724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo * Copyright (C) 2011 The Android Open Source Project
3724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo *
4724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo * Licensed under the Apache License, Version 2.0 (the "License");
5724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo * you may not use this file except in compliance with the License.
6724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo * You may obtain a copy of the License at
7724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo *
8724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo *      http://www.apache.org/licenses/LICENSE-2.0
9724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo *
10724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo * Unless required by applicable law or agreed to in writing, software
11724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo * distributed under the License is distributed on an "AS IS" BASIS,
12724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo * See the License for the specific language governing permissions and
14724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo * limitations under the License.
15724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo */
16724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo
17724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalopackage com.android.emailcommon.utility;
18724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo
19724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komaloimport android.test.AndroidTestCase;
20724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komaloimport android.test.MoreAsserts;
21724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komaloimport android.test.suitebuilder.annotation.SmallTest;
22724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo
23724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komaloimport java.util.Random;
24724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komaloimport java.util.regex.Pattern;
25724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo
26724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo/**
27724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo * Unit tests for SSLUtils.
28724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo */
29724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo@SmallTest
30724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalopublic class SSLUtilsTest extends AndroidTestCase {
31724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo
32724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo    String SAFE_SCHEME_PATTERN = "[a-z][a-z0-9+\\-]*";
33724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo    private void assertSchemeNameValid(String s) {
34724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        assertTrue(Pattern.matches(SAFE_SCHEME_PATTERN, s));
35724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo    }
36724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo
37724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo    public void testSchemeNameEscapeAlreadySafe() {
38724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        // Safe names are unmodified.
39724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        assertEquals("http", SSLUtils.escapeForSchemeName("http"));
40724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        assertEquals("https", SSLUtils.escapeForSchemeName("https"));
41724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        assertEquals("ftp", SSLUtils.escapeForSchemeName("ftp"));
42724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        assertEquals("z39.50r", SSLUtils.escapeForSchemeName("z39.50r"));
43724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        assertEquals("fake-protocol.yes", SSLUtils.escapeForSchemeName("fake-protocol.yes"));
44724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo    }
45724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo
46724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo    public void testSchemeNameEscapeIsSafe() {
47724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        // Invalid characters are escaped properly
48724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        assertSchemeNameValid(SSLUtils.escapeForSchemeName("name with spaces"));
49724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        assertSchemeNameValid(SSLUtils.escapeForSchemeName("odd * & characters"));
50724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        assertSchemeNameValid(SSLUtils.escapeForSchemeName("f3v!l;891023-47 +"));
51724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo    }
52724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo
53724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo    private static final char[] RANDOM_DICT = new char[] {
54724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        'x', '.', '^', '4', ';', ' ', 'j', '#', '~', '+'
55724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo    };
56724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo    private String randomString(Random r) {
57724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        // 5 to 15 characters
58724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        int length = (r.nextInt() % 5) + 10;
59724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        StringBuilder sb = new StringBuilder();
60724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        for (int i = 0; i < length; i++) {
61724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo            sb.append(RANDOM_DICT[Math.abs(r.nextInt()) % RANDOM_DICT.length]);
62724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        }
63724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        return sb.toString();
64724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo    }
65724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo
66724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo    public void testSchemeNamesAreMoreOrLessUnique() {
67724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        assertEquals(
68724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo                SSLUtils.escapeForSchemeName("name with spaces"),
69724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo                SSLUtils.escapeForSchemeName("name with spaces"));
70724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo
71724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        // As expected, all escaping is case insensitive.
72724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        assertEquals(
73724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo                SSLUtils.escapeForSchemeName("NAME with spaces"),
74724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo                SSLUtils.escapeForSchemeName("name with spaces"));
75724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo
76724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        Random random = new Random(314159 /* seed */);
77724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        for (int i = 0; i < 100; i++) {
78724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo            // Other strings should more or less be unique.
79724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo            String s1 = randomString(random);
80724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo            String s2 = randomString(random);
81724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo            MoreAsserts.assertNotEqual(
82724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo                    SSLUtils.escapeForSchemeName(s1),
83724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo                    SSLUtils.escapeForSchemeName(s2));
84724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo        }
85724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo    }
86724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo}
87724c3a81cd3649b48ab47c6e49cb42f73f20c815Ben Komalo
88