import java.lang.*;
import java.util.*;

class TestBase64
{ 
    public static void main(String args[]) 
    { 
	Base64.Encoder encoder = Base64.getUrlEncoder();
	Base64.Decoder decoder = Base64.getUrlDecoder();
	//Base64.Encoder encoder = Base64.getEncoder();
	//Base64.Decoder decoder = Base64.getDecoder();
	//Base64.Encoder encoder = Base64.getMimeEncoder();
	//Base64.Decoder decoder = Base64.getMimeDecoder();
        int bin_src_len = 3 * (1 << 14); // about 48k
        int base64_len = (bin_src_len / 3) * 4;
	byte[] unencoded = new byte[bin_src_len];
	byte[] encoded = new byte[base64_len];
	byte[] decoded = new byte[bin_src_len];

	new Random().nextBytes(unencoded);
        int outlen = encoder.encode(unencoded, encoded);
        System.out.println("warmup...");
	for (int i = 0; i < 20_000; i++) {
		decoder.decode(encoded, decoded);
        }
	
        System.out.println("beginning decode loop...");
	long start = System.currentTimeMillis();
	for (int i = 0; i < 200_000; i++) {
		decoder.decode(encoded, decoded);
		if (! Arrays.equals(unencoded, decoded)) {
			System.out.println("Arrays are not equal!");
                        System.out.print("Unencoded: ");
                        for (int addr=0; addr < 15; addr++) {
                                System.out.format("%02x ", unencoded[addr]);
                        }
                        System.out.println();
                        System.out.print("Decoded:   ");
                        for (int addr=0; addr < 15; addr++) {
                                System.out.format("%02x ", decoded[addr]);
                        }
                        System.out.println();
			return;
                }
	}
	System.out.println("Elapsed time: " + Long.toString(System.currentTimeMillis() - start));
    } 
} 

