/* * ModeShape (http://www.modeshape.org) * * 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 org.modeshape.common.text; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.notNullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import org.junit.Before; import org.junit.Test; import org.modeshape.common.FixFor; /** * @author Randall Hauch */ public class UrlEncoderTest { private UrlEncoder encoder = new UrlEncoder(); @Before public void beforeEach() { } protected void checkEncoding( String input, String expected ) { String output = this.encoder.encode(input); assertThat(output, is(notNullValue())); assertEquals(expected, output); assertThat(output.length(), is(expected.length())); assertThat(output, is(expected)); checkDecoding(output, input); } protected void checkForNoEncoding( String input ) { String output = this.encoder.encode(input); assertThat(output, is(notNullValue())); assertEquals(input, output); assertThat(output.length(), is(input.length())); assertThat(output, is(input)); checkDecoding(output, input); } protected void checkDecoding( String input, String output ) { String decoded = this.encoder.decode(input); assertEquals(output, decoded); assertThat(decoded.length(), is(output.length())); assertThat(decoded, is(output)); } @Test public void shouldNotEncodeForwardSlashByDefault() { checkEncoding("/", "%2f"); this.encoder.setSlashEncoded(false); checkForNoEncoding("/"); } @Test public void shouldEncodePercent() { checkEncoding("%", "%25"); this.encoder.setSlashEncoded(false); checkEncoding("%", "%25"); } @Test public void shouldNotEncodeAlphabeticCharacters() { checkForNoEncoding("abcdefghijklmnopqrstuvwxyz"); checkForNoEncoding("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); this.encoder.setSlashEncoded(false); checkForNoEncoding("abcdefghijklmnopqrstuvwxyz"); checkForNoEncoding("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); } @Test public void shouldNotEncodeNumericCharacters() { checkForNoEncoding("0123456789"); this.encoder.setSlashEncoded(false); checkForNoEncoding("0123456789"); } @Test public void shouldNotEncodeReservedPunctuationCharacters() { checkForNoEncoding("-_.!~*\'()"); this.encoder.setSlashEncoded(false); checkForNoEncoding("-_.!~*\'()"); } @Test public void shouldNotDecodePercentIfNotFollowedByValidHexNumber() { checkDecoding("%", "%"); checkDecoding("%2", "%2"); checkDecoding("%2G", "%2G"); checkDecoding("%2f", "/"); checkDecoding("%25", "%"); } @Test public void shouldEncodeSpaceUsingHexFormat() { checkEncoding(" ", "%20"); } @Test public void shouldEncodePunctuationUsingHexFormat() { checkEncoding("`", "%60"); checkEncoding("@", "%40"); checkEncoding("#", "%23"); checkEncoding("$", "%24"); checkEncoding("^", "%5e"); checkEncoding("&", "%26"); checkEncoding("{", "%7b"); checkEncoding("[", "%5b"); checkEncoding("}", "%7d"); checkEncoding("]", "%5d"); checkEncoding("|", "%7c"); checkEncoding(":", "%3a"); checkEncoding(";", "%3b"); checkEncoding("\"", "%22"); checkEncoding("<", "%3c"); checkEncoding(",", "%2c"); checkEncoding(">", "%3e"); checkEncoding("?", "%3f"); } @Test public void shouldEncodeAndDecodeUrlsCorrectly() { this.encoder.setSlashEncoded(false); checkEncoding("http://acme.com/this is %something?get=true;something=false", "http%3a//acme.com/this%20is%20%25something%3fget%3dtrue%3bsomething%3dfalse"); } @Test @FixFor( "MODE-2258" ) public void shouldEncodeNonReservedNonAsciiCharacter() { this.encoder.setSlashEncoded(false); checkEncoding(":Тест:的", "%3a%d0%a2%d0%b5%d1%81%d1%82%3a%e7%9a%84"); } }