/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.commons.lang; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.net.URI; import java.util.*; import static org.testng.Assert.*; public class TestURLEncodedUtils { static final int SWISS_GERMAN_HELLO[] = { 0x47, 0x72, 0xFC, 0x65, 0x7A, 0x69, 0x5F, 0x7A, 0xE4, 0x6D, 0xE4 }; static final int RUSSIAN_HELLO[] = { 0x412, 0x441, 0x435, 0x43C, 0x5F, 0x43F, 0x440, 0x438, 0x432, 0x435, 0x442 }; private static String constructString(int[] unicodeChars) { StringBuffer buffer = new StringBuffer(); if (unicodeChars != null) { for (int i = 0; i < unicodeChars.length; i++) { buffer.append((char)unicodeChars[i]); } } return buffer.toString(); } private static void assertNameValuePair(final Map<String, Set<String>> parameter, final String expectedName, final String... values) { Set<String> actualValues = parameter.get(expectedName); assertNotNull(actualValues); assertEquals(actualValues.size(), values.length); for (String value : values) { assertTrue(actualValues.contains(value)); } } @Test public void shouldBeAbleToParseEmptyURI() throws Exception { //given //when Map<String, Set<String>> parameters = parse("", null); //then assertTrue(parameters.isEmpty()); } @Test(dataProvider = "uris") public void shouldParseURI(String url, String expectedName, String[] expectedValues) throws Exception { assertNameValuePair(parse(url, "UTF-8"), expectedName, expectedValues); } @Test(dataProvider = "uris") public void shouldFormatURI(String url, String expectedName, String[] expectedValues) throws Exception { //given Map<String, Set<String>> parameters = new HashMap<>(); parameters.put(expectedName, new LinkedHashSet<>(Arrays.asList(expectedValues))); //when String actual = URLEncodedUtils.format(parameters, "UTF-8"); //then if ("Name3".equals(url)) { assertEquals(actual, url + "="); } else { assertEquals(actual, url); } } @Test public void shouldFormatURIWithMultipleParams() throws Exception { //given Map<String, Set<String>> parameters = new LinkedHashMap<>(); parameters.put("Name5", new LinkedHashSet<>(Arrays.asList(new String[]{"aaa"}))); parameters.put("Name6", new LinkedHashSet<>(Arrays.asList(new String[]{"bbb"}))); //when String actual = URLEncodedUtils.format(parameters, "UTF-8"); //then assertEquals(actual, "Name5=aaa&Name6=bbb"); } @Test public void shouldParseURIWithMultipleParams() throws Exception { Map<String, Set<String>> parameters = parse("Name5=aaa&Name6=bbb", null); assertNameValuePair(parameters, "Name5", "aaa"); assertNameValuePair(parameters, "Name6", "bbb"); } @DataProvider(name = "uris") public Object[][] uris() { return new Object[][]{ {"Name1=Value1", "Name1", new String[]{"Value1"}}, {"Name2=", "Name2", new String[]{}}, {"Name3", "Name3", new String[]{}}, {"Name4=Value+4%21", "Name4", new String[]{"Value 4!"}}, {"Name4=Value%2B4%21", "Name4", new String[]{"Value+4!"}}, {"Name4=Value+4%21+%214", "Name4", new String[]{"Value 4! !4"}}, {"Name7=aaa&Name7=b%2Cb&Name7=ccc", "Name7", new String[]{"aaa", "b,b", "ccc"}}, {"Name8=xx%2C++yy++%2Czz", "Name8", new String[]{"xx, yy ,zz"}}, }; } @Test public void shouldFormatUTF8() { //given String ru_hello = constructString(RUSSIAN_HELLO); String ch_hello = constructString(SWISS_GERMAN_HELLO); Map<String, Set<String>> parameters = new LinkedHashMap<>(); parameters.put("russian", new LinkedHashSet<>(Arrays.asList(new String[]{ru_hello}))); parameters.put("swiss", new LinkedHashSet<>(Arrays.asList(new String[]{ch_hello}))); //when String actual = URLEncodedUtils.format(parameters, "UTF-8"); //then assertEquals(actual, "russian=%D0%92%D1%81%D0%B5%D0%BC_%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82" + "&swiss=Gr%C3%BCezi_z%C3%A4m%C3%A4"); } @Test public void shouldParseUTF8() { //given String ru_hello = constructString(RUSSIAN_HELLO); String ch_hello = constructString(SWISS_GERMAN_HELLO); //when Map<String, Set<String>> parameters = parse("russian=%D0%92%D1%81%D0%B5%D0%BC_%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82" + "&swiss=Gr%C3%BCezi_z%C3%A4m%C3%A4", "UTF-8"); //then assertNameValuePair(parameters, "russian", ru_hello); assertNameValuePair(parameters, "swiss", ch_hello); } @Test public void shouldParseWithoutDecoding() { //given String ru_hello = "%D0%92%D1%81%D0%B5%D0%BC_%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82"; String ch_hello = "Gr%C3%BCezi_z%C3%A4m%C3%A4"; //when Map<String, Set<String>> parameters = URLEncodedUtils.parse( URI.create("http://hc.apache.org/params?russian=" + ru_hello + "&swiss=" + ch_hello), false); //then assertNameValuePair(parameters, "russian", ru_hello); assertNameValuePair(parameters, "swiss", ch_hello); } private Map<String, Set<String>> parse(final String params, final String encoding) { return URLEncodedUtils.parse(URI.create("http://hc.apache.org/params?" + params), encoding); } }