/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.emailcommon.utility;

import android.test.AndroidTestCase;
import android.test.MoreAsserts;
import android.test.suitebuilder.annotation.SmallTest;

import java.util.Random;
import java.util.regex.Pattern;

/**
 * Unit tests for SSLUtils.
 */
@SmallTest
public class SSLUtilsTest extends AndroidTestCase {

    String SAFE_SCHEME_PATTERN = "[a-z][a-z0-9+\\-]*";
    private void assertSchemeNameValid(String s) {
        assertTrue(Pattern.matches(SAFE_SCHEME_PATTERN, s));
    }

    public void testSchemeNameEscapeAlreadySafe() {
        // Safe names are unmodified.
        assertEquals("http", SSLUtils.escapeForSchemeName("http"));
        assertEquals("https", SSLUtils.escapeForSchemeName("https"));
        assertEquals("ftp", SSLUtils.escapeForSchemeName("ftp"));
        assertEquals("z39.50r", SSLUtils.escapeForSchemeName("z39.50r"));
        assertEquals("fake-protocol.yes", SSLUtils.escapeForSchemeName("fake-protocol.yes"));
    }

    public void testSchemeNameEscapeIsSafe() {
        // Invalid characters are escaped properly
        assertSchemeNameValid(SSLUtils.escapeForSchemeName("name with spaces"));
        assertSchemeNameValid(SSLUtils.escapeForSchemeName("odd * & characters"));
        assertSchemeNameValid(SSLUtils.escapeForSchemeName("f3v!l;891023-47 +"));
        assertSchemeNameValid(
                SSLUtils.escapeForSchemeName("\u304d\u307f\u3092\u611b\u3057\u3066\u308b"));
    }

    private static final char[] RANDOM_DICT = new char[] {
        'x', '.', '^', '4', ';', ' ', 'j', '#', '~', '+'
    };
    private String randomString(Random r) {
        // 5 to 15 characters
        int length = (r.nextInt() % 5) + 10;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            sb.append(RANDOM_DICT[Math.abs(r.nextInt()) % RANDOM_DICT.length]);
        }
        return sb.toString();
    }

    public void testSchemeNamesAreMoreOrLessUnique() {
        assertEquals(
                SSLUtils.escapeForSchemeName("name with spaces"),
                SSLUtils.escapeForSchemeName("name with spaces"));

        // As expected, all escaping is case insensitive.
        assertEquals(
                SSLUtils.escapeForSchemeName("NAME with spaces"),
                SSLUtils.escapeForSchemeName("name with spaces"));

        Random random = new Random(314159 /* seed */);
        for (int i = 0; i < 100; i++) {
            // Other strings should more or less be unique.
            String s1 = randomString(random);
            String s2 = randomString(random);
            MoreAsserts.assertNotEqual(
                    SSLUtils.escapeForSchemeName(s1),
                    SSLUtils.escapeForSchemeName(s2));
        }
    }
}

