| /* | |
| * Copyright 2010 Google Inc. | |
| * | |
| * 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.google.gwt.safehtml.server; | |
| import com.google.gwt.safehtml.shared.UriUtils; | |
| import junit.framework.TestCase; | |
| import java.net.URI; | |
| import java.net.URISyntaxException; | |
| import java.util.ArrayList; | |
| import java.util.Collections; | |
| import java.util.List; | |
| /** | |
| * Unit tests for UriUtils. | |
| */ | |
| public class UriUtilsTest extends TestCase { | |
| /** | |
| * Encapsulates a URI and relevant attributes for use in tests of | |
| * {@link UriUtils#sanitizeUri(String)} and related methods. | |
| */ | |
| private static class UriTestCaseSpec { | |
| private String uri; | |
| private String scheme; | |
| private boolean expectUriParseException; | |
| private URI parsedUri; | |
| /** | |
| * Creates a URI test case specification. | |
| * | |
| * @param uri the URI of this test vector | |
| * @param scheme the scheme that is expected to be parsed from {@code uri} | |
| * by {@link UriUtils#extractScheme(String)} | |
| * @param expectUriParseException true if parsing {@code uri} into a | |
| * {@link URI} object is expected to result in a | |
| * {@link URISyntaxException} | |
| */ | |
| public UriTestCaseSpec( | |
| String uri, String scheme, boolean expectUriParseException) { | |
| this.uri = uri; | |
| this.scheme = scheme; | |
| this.expectUriParseException = expectUriParseException; | |
| if (!expectUriParseException) { | |
| try { | |
| parsedUri = new URI(uri); | |
| } catch (URISyntaxException e) { | |
| throw new IllegalStateException( | |
| "parsing \"" + uri + "\" resulted in " + "unexpected exception: " | |
| + e); | |
| } | |
| } | |
| } | |
| public UriTestCaseSpec(String uri, String scheme) { | |
| this(uri, scheme, false); | |
| } | |
| public String getUri() { | |
| return uri; | |
| } | |
| public URI getParsedUri() { | |
| return parsedUri; | |
| } | |
| public String getScheme() { | |
| return scheme; | |
| } | |
| public boolean getExpectUriParseException() { | |
| return expectUriParseException; | |
| } | |
| } | |
| private static final List<UriTestCaseSpec> GOOD_URIS; | |
| static { | |
| ArrayList<UriTestCaseSpec> goodUris = new ArrayList<UriTestCaseSpec>(); | |
| // URIs with no scheme. | |
| goodUris.add(new UriTestCaseSpec("bar", null)); | |
| goodUris.add(new UriTestCaseSpec("/foo/bar", null)); | |
| goodUris.add(new UriTestCaseSpec("/foo/bar#baz", null)); | |
| goodUris.add(new UriTestCaseSpec("/foo/bar:baz", null)); | |
| goodUris.add(new UriTestCaseSpec("#baz", null)); | |
| goodUris.add(new UriTestCaseSpec("#baz:dooz", null)); | |
| goodUris.add(new UriTestCaseSpec("foo#baz:dooz", null)); | |
| // URIs with http scheme. | |
| goodUris.add(new UriTestCaseSpec("http:foo", "http")); | |
| goodUris.add(new UriTestCaseSpec("http://foo.com:80/blah", "http")); | |
| goodUris.add(new UriTestCaseSpec("http://foo.com/bar", "http")); | |
| goodUris.add(new UriTestCaseSpec("http://foo.com/bar#baz", "http")); | |
| // URIs with https, ftp, mailto scheme. | |
| goodUris.add(new UriTestCaseSpec("mailto:good@good.com", "mailto")); | |
| goodUris.add(new UriTestCaseSpec("https://foo.com", "https")); | |
| goodUris.add(new UriTestCaseSpec("ftp://foo.com", "ftp")); | |
| GOOD_URIS = Collections.unmodifiableList(goodUris); | |
| } | |
| private static final List<UriTestCaseSpec> BAD_URIS; | |
| static { | |
| ArrayList<UriTestCaseSpec> badUris = new ArrayList<UriTestCaseSpec>(); | |
| // URIs with defined, bad schemes. | |
| badUris.add(new UriTestCaseSpec("javascript:evil", "javascript")); | |
| badUris.add(new UriTestCaseSpec("javascript://foo()", "javascript")); | |
| badUris.add(new UriTestCaseSpec("javascript:evil#world", "javascript")); | |
| badUris.add(new UriTestCaseSpec("javascript:evil/is", "javascript")); | |
| // URIs with weird schemes, neither of which can be parsed as a URI. | |
| badUris.add( | |
| new UriTestCaseSpec(" mailto:good@good.com", " mailto", true)); | |
| badUris.add(new UriTestCaseSpec("ma&ilto:good@good.com", "ma&ilto", true)); | |
| BAD_URIS = Collections.unmodifiableList(badUris); | |
| } | |
| public static void testExtractScheme() { | |
| for (UriTestCaseSpec uriSpec : GOOD_URIS) { | |
| assertEquals( | |
| uriSpec.getScheme(), UriUtils.extractScheme(uriSpec.getUri())); | |
| // Verify that the scheme parsed by extractScheme() is the same as | |
| // obtained by {@link URI}'s parser. | |
| assertEquals(uriSpec.getScheme(), uriSpec.getParsedUri().getScheme()); | |
| } | |
| for (UriTestCaseSpec uriSpec : BAD_URIS) { | |
| assertEquals( | |
| uriSpec.getScheme(), UriUtils.extractScheme(uriSpec.getUri())); | |
| if (!uriSpec.getExpectUriParseException()) { | |
| // Verify that the scheme parsed by extractScheme() is the same as | |
| // obtained by {@link URI}'s parser (for those URIs that can be parsed | |
| // by the latter). | |
| assertEquals(uriSpec.getScheme(), uriSpec.getParsedUri().getScheme()); | |
| } | |
| } | |
| } | |
| public static void testIsSafeUri() { | |
| for (UriTestCaseSpec uriSpec : GOOD_URIS) { | |
| assertTrue(UriUtils.isSafeUri(uriSpec.getUri())); | |
| } | |
| for (UriTestCaseSpec uriSpec : BAD_URIS) { | |
| assertFalse(UriUtils.isSafeUri(uriSpec.getUri())); | |
| } | |
| } | |
| public static void testSanitizeUri() { | |
| for (UriTestCaseSpec uriSpec : GOOD_URIS) { | |
| assertEquals(uriSpec.getUri(), UriUtils.sanitizeUri(uriSpec.getUri())); | |
| } | |
| for (UriTestCaseSpec uriSpec : BAD_URIS) { | |
| assertEquals("#", UriUtils.sanitizeUri(uriSpec.getUri())); | |
| } | |
| } | |
| } |