
/*
 * Copyright  1999-2004 The Apache Software Foundation.
 *
 *  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.apache.xml.security.test.utils;



import java.io.ByteArrayOutputStream;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import org.apache.xml.security.utils.Base64;
import org.apache.xml.security.utils.XMLUtils;


/**
 * Unit test for {@link org.apache.xml.security.utils.Base64}
 *
 * @author Christian Geuer-Pollmann
 */
public class Base64Test extends TestCase {

   /** {@link org.apache.commons.logging} logging facility */
    static org.apache.commons.logging.Log log = 
        org.apache.commons.logging.LogFactory.getLog(Base64Test.class.getName());

   /**
    * Method suite
    * @return
    *    
    */
   public static Test suite() {
      return new TestSuite(Base64Test.class);
   }

   /**
    *
    * @param Name_
    */
   public Base64Test(String Name_) {
      super(Name_);
   }

   /**
    *
    * @param args
    */
   public static void main(String[] args) {

      String[] testCaseName = { "-noloading", Base64Test.class.getName() };

      junit.textui.TestRunner.main(testCaseName);

      // junit.swingui.TestRunner.main(testCaseName);
   }    //public static void main(String[] args)

   /**
    * Method testA1
    * @throws Exception
    *
    * @throws java.io.UnsupportedEncodingException
    * $todo$ Extend more tests
    */
   public static void testA1() throws Exception {

      String textData = "Hallo";
      String result0 = Base64.encode(textData.getBytes("UTF-8"));

      assertNotNull("Result of encoding result0", result0);

      byte resultBytes[] = Base64.decode(result0);
      String resultStr = new String(resultBytes, "UTF-8");

      assertEquals("Result of decoding", 0, textData.compareTo(resultStr));
      ByteArrayOutputStream os=new ByteArrayOutputStream();
      Base64.decode(result0.getBytes(),os);
      resultStr = new String(os.toByteArray(), "UTF-8");
      assertEquals("Result of decoding", 0, textData.compareTo(resultStr));
   }

   /**
    * Method testWrap1
    *
	* Test for correct line wrapping at end of an exactly 76 char string
	*
    * @throws java.io.UnsupportedEncodingException
    * @throws Exception
    */

	public static void testWrap1() 
		throws java.io.UnsupportedEncodingException,Exception {

		String inputData = "The quick brown fox jumps over the lazy dog and some extr";
		String expectedResult = "VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZyBhbmQgc29tZSBleHRy";
		String result = Base64.encode(inputData.getBytes("UTF-8"));
		assertEquals("Result of encoding", result, expectedResult);

		String result2 = new String(Base64.decode(result), "UTF-8");
		assertEquals("Result of encoding", result2, inputData);
        ByteArrayOutputStream os=new ByteArrayOutputStream();
        Base64.decode(expectedResult.getBytes(),os);
          result2 = new String(os.toByteArray(), "UTF-8");
          assertEquals("Result of encoding", result2, inputData);

	}

   /**
    * Method testWrap2
    *
	* Test for correct line wrapping after more than 76 characters
	*
    * @throws java.io.UnsupportedEncodingException
    * @throws Exception
    */

	public static void testWrap2() 
		throws java.io.UnsupportedEncodingException, Exception {

		String inputData = "The quick brown fox jumps over the lazy dog and some extra text that will cause a line wrap";
		String expectedResult = null;
		if (XMLUtils.ignoreLineBreaks()) {
		    expectedResult = "VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZyBhbmQgc29tZSBleHRyYSB0ZXh0IHRoYXQgd2lsbCBjYXVzZSBhIGxpbmUgd3JhcA==";
		} else {
		    expectedResult = "VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZyBhbmQgc29tZSBleHRy\nYSB0ZXh0IHRoYXQgd2lsbCBjYXVzZSBhIGxpbmUgd3JhcA==";
		}
		String result = Base64.encode(inputData.getBytes("UTF-8"));
		assertEquals("Result of encoding", result, expectedResult);

		String result2 = new String(Base64.decode(result), "UTF-8");
		assertEquals("Result of encoding", result2, inputData);
        ByteArrayOutputStream os=new ByteArrayOutputStream();
        Base64.decode(expectedResult.getBytes(),os);
          result2 = new String(os.toByteArray(), "UTF-8");
          assertEquals("Result of encoding", result2, inputData);
	}

   static {
      org.apache.xml.security.Init.init();
   }
}
