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