/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* 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.pentaho.di.cluster;
import junit.framework.Assert;
import org.apache.commons.codec.binary.Base64;
import org.junit.Test;
import org.pentaho.di.core.variables.Variables;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.security.NoSuchAlgorithmException;
import java.util.zip.GZIPOutputStream;
public class HttpUtilTest {
public static final String DEFAULT_ENCODING = "UTF-8";
public static final String STANDART = "(\u256e\u00b0-\u00b0)\u256e\u2533\u2501\u2501\u2533\u30c6\u30fc\u30d6"
+ "\u30eb(\u256f\u00b0\u25a1\u00b0)\u256f\u253b\u2501\u2501\u253b\u30aa\u30d5";
/**
* [PDI-4325] Test that we can decode/encode Strings without loss of data.
*
* @throws IOException
* @throws NoSuchAlgorithmException
*/
@Test
public final void testDecodeBase64ZippedString() throws IOException, NoSuchAlgorithmException {
String enc64 = this.canonicalBase64Encode( STANDART );
// decode string
String decoded = HttpUtil.decodeBase64ZippedString( enc64 );
Assert.assertEquals( "Strings are the same after transformation", STANDART, decoded );
}
@Test
public void testConstructUrl() throws Exception {
Variables variables = new Variables();
String expected = "hostname:1234/webAppName?param=value";
Assert.assertEquals( "http://" + expected,
HttpUtil.constructUrl( variables, "hostname", String.valueOf( 1234 ), "webAppName", "?param=value" ) );
Assert.assertEquals( "http://" + expected,
HttpUtil.constructUrl( variables, "hostname", String.valueOf( 1234 ), "webAppName", "?param=value", false ) );
Assert.assertEquals( "https://" + expected,
HttpUtil.constructUrl( variables, "hostname", String.valueOf( 1234 ), "webAppName", "?param=value", true ) );
}
/**
* Test that we can encode and decode String using only static class-under-test methods.
*
*
* @throws IOException
*/
public void testEncodeBase64ZippedString() throws IOException {
String enc64 = HttpUtil.encodeBase64ZippedString( STANDART );
String decoded = HttpUtil.decodeBase64ZippedString( enc64 );
Assert.assertEquals( "Strings are the same after transformation", STANDART, decoded );
}
/**
* https://www.securecoding.cert.org/confluence/display/java/IDS12-J.+Perform+lossless+conversion+
* of+String+data+between+differing+character+encodings
*
* @param in
* string to encode
* @return
* @throws IOException
*/
private String canonicalBase64Encode( String in ) throws IOException {
Charset charset = Charset.forName( DEFAULT_ENCODING );
CharsetEncoder encoder = charset.newEncoder();
encoder.reset();
ByteBuffer baosbf = encoder.encode( CharBuffer.wrap( in ) );
byte[] bytes = new byte[baosbf.limit()];
baosbf.get( bytes );
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gzos = new GZIPOutputStream( baos );
gzos.write( bytes );
gzos.close();
String encoded = new String( Base64.encodeBase64( baos.toByteArray() ) );
return encoded;
}
}