1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.emailcommon.utility;
18 
19 import android.test.AndroidTestCase;
20 import android.test.MoreAsserts;
21 import android.test.suitebuilder.annotation.SmallTest;
22 
23 import java.util.Random;
24 import java.util.regex.Pattern;
25 
26 /**
27  * Unit tests for SSLUtils.
28  */
29 @SmallTest
30 public class SSLUtilsTest extends AndroidTestCase {
31 
32     String SAFE_SCHEME_PATTERN = "[a-z][a-z0-9+\\-]*";
assertSchemeNameValid(String s)33     private void assertSchemeNameValid(String s) {
34         assertTrue(Pattern.matches(SAFE_SCHEME_PATTERN, s));
35     }
36 
testSchemeNameEscapeAlreadySafe()37     public void testSchemeNameEscapeAlreadySafe() {
38         // Safe names are unmodified.
39         assertEquals("http", SSLUtils.escapeForSchemeName("http"));
40         assertEquals("https", SSLUtils.escapeForSchemeName("https"));
41         assertEquals("ftp", SSLUtils.escapeForSchemeName("ftp"));
42         assertEquals("z39.50r", SSLUtils.escapeForSchemeName("z39.50r"));
43         assertEquals("fake-protocol.yes", SSLUtils.escapeForSchemeName("fake-protocol.yes"));
44     }
45 
testSchemeNameEscapeIsSafe()46     public void testSchemeNameEscapeIsSafe() {
47         // Invalid characters are escaped properly
48         assertSchemeNameValid(SSLUtils.escapeForSchemeName("name with spaces"));
49         assertSchemeNameValid(SSLUtils.escapeForSchemeName("odd * & characters"));
50         assertSchemeNameValid(SSLUtils.escapeForSchemeName("f3v!l;891023-47 +"));
51     }
52 
53     private static final char[] RANDOM_DICT = new char[] {
54         'x', '.', '^', '4', ';', ' ', 'j', '#', '~', '+'
55     };
randomString(Random r)56     private String randomString(Random r) {
57         // 5 to 15 characters
58         int length = (r.nextInt() % 5) + 10;
59         StringBuilder sb = new StringBuilder();
60         for (int i = 0; i < length; i++) {
61             sb.append(RANDOM_DICT[Math.abs(r.nextInt()) % RANDOM_DICT.length]);
62         }
63         return sb.toString();
64     }
65 
testSchemeNamesAreMoreOrLessUnique()66     public void testSchemeNamesAreMoreOrLessUnique() {
67         assertEquals(
68                 SSLUtils.escapeForSchemeName("name with spaces"),
69                 SSLUtils.escapeForSchemeName("name with spaces"));
70 
71         // As expected, all escaping is case insensitive.
72         assertEquals(
73                 SSLUtils.escapeForSchemeName("NAME with spaces"),
74                 SSLUtils.escapeForSchemeName("name with spaces"));
75 
76         Random random = new Random(314159 /* seed */);
77         for (int i = 0; i < 100; i++) {
78             // Other strings should more or less be unique.
79             String s1 = randomString(random);
80             String s2 = randomString(random);
81             MoreAsserts.assertNotEqual(
82                     SSLUtils.escapeForSchemeName(s1),
83                     SSLUtils.escapeForSchemeName(s2));
84         }
85     }
86 }
87 
88