package org.bouncycastle.asn1.test;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.SimpleTimeZone;
import java.util.TimeZone;
import org.bouncycastle.asn1.ASN1GeneralizedTime;
import org.bouncycastle.asn1.DERGeneralizedTime;
import org.bouncycastle.util.test.SimpleTest;
public class GeneralizedTimeTest
extends SimpleTest
{
String[] input =
{
"20020122122220",
"20020122122220Z",
"20020122122220-1000",
"20020122122220+00",
"20020122122220.1",
"20020122122220.1Z",
"20020122122220.1-1000",
"20020122122220.1+00",
"20020122122220.01",
"20020122122220.01Z",
"20020122122220.01-1000",
"20020122122220.01+00",
"20020122122220.001",
"20020122122220.001Z",
"20020122122220.001-1000",
"20020122122220.001+00",
"20020122122220.0001",
"20020122122220.0001Z",
"20020122122220.0001-1000",
"20020122122220.0001+00",
"20020122122220.0001+1000"
};
String[] output = {
"20020122122220",
"20020122122220GMT+00:00",
"20020122122220GMT-10:00",
"20020122122220GMT+00:00",
"20020122122220.1",
"20020122122220.1GMT+00:00",
"20020122122220.1GMT-10:00",
"20020122122220.1GMT+00:00",
"20020122122220.01",
"20020122122220.01GMT+00:00",
"20020122122220.01GMT-10:00",
"20020122122220.01GMT+00:00",
"20020122122220.001",
"20020122122220.001GMT+00:00",
"20020122122220.001GMT-10:00",
"20020122122220.001GMT+00:00",
"20020122122220.0001",
"20020122122220.0001GMT+00:00",
"20020122122220.0001GMT-10:00",
"20020122122220.0001GMT+00:00",
"20020122122220.0001GMT+10:00" };
String[] zOutput = {
"20020122122220Z",
"20020122122220Z",
"20020122222220Z",
"20020122122220Z",
"20020122122220Z",
"20020122122220Z",
"20020122222220Z",
"20020122122220Z",
"20020122122220Z",
"20020122122220Z",
"20020122222220Z",
"20020122122220Z",
"20020122122220Z",
"20020122122220Z",
"20020122222220Z",
"20020122122220Z",
"20020122122220Z",
"20020122122220Z",
"20020122222220Z",
"20020122122220Z",
"20020122022220Z"
};
String[] mzOutput = {
"20020122122220.000Z",
"20020122122220.000Z",
"20020122222220.000Z",
"20020122122220.000Z",
"20020122122220.100Z",
"20020122122220.100Z",
"20020122222220.100Z",
"20020122122220.100Z",
"20020122122220.010Z",
"20020122122220.010Z",
"20020122222220.010Z",
"20020122122220.010Z",
"20020122122220.001Z",
"20020122122220.001Z",
"20020122222220.001Z",
"20020122122220.001Z",
"20020122122220.000Z",
"20020122122220.000Z",
"20020122222220.000Z",
"20020122122220.000Z",
"20020122022220.000Z"
};
String[] derMzOutput = {
"20020122122220Z",
"20020122122220Z",
"20020122222220Z",
"20020122122220Z",
"20020122122220.1Z",
"20020122122220.1Z",
"20020122222220.1Z",
"20020122122220.1Z",
"20020122122220.01Z",
"20020122122220.01Z",
"20020122222220.01Z",
"20020122122220.01Z",
"20020122122220.001Z",
"20020122122220.001Z",
"20020122222220.001Z",
"20020122122220.001Z",
"20020122122220Z",
"20020122122220Z",
"20020122222220Z",
"20020122122220Z",
"20020122022220Z"
};
String[] truncOutput = {
"200201221222Z",
"2002012212Z"
};
String[] derTruncOutput = {
"20020122122200Z",
"20020122120000Z"
};
public String getName()
{
return "GeneralizedTime";
}
public void performTest()
throws Exception
{
SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmss'Z'");
dateF.setTimeZone(new SimpleTimeZone(0,"Z"));
for (int i = 0; i != input.length; i++)
{
ASN1GeneralizedTime t = new ASN1GeneralizedTime(input[i]);
if (output[i].indexOf('G') > 0)
{
if (!t.getTime().equals(output[i]))
{
fail("failed conversion test");
}
if (!dateF.format(t.getDate()).equals(zOutput[i]))
{
fail("failed date conversion test");
}
}
else
{
String offset = calculateGMTOffset(t.getDate());
if (!t.getTime().equals(output[i] + offset))
{
fail("failed conversion test");
}
}
}
dateF = new SimpleDateFormat("yyyyMMddHHmmss.SSS'Z'");
dateF.setTimeZone(new SimpleTimeZone(0,"Z"));
for (int i = 0; i != input.length; i++)
{
ASN1GeneralizedTime t = new ASN1GeneralizedTime(input[i]);
if (!dateF.format(t.getDate()).equals(mzOutput[i]))
{
fail("failed long date conversion test");
}
}
for (int i = 0; i != mzOutput.length; i++)
{
ASN1GeneralizedTime t = new DERGeneralizedTime(mzOutput[i]);
if (!areEqual(t.getEncoded(), new ASN1GeneralizedTime(derMzOutput[i]).getEncoded()))
{
fail("der encoding wrong");
}
}
for (int i = 0; i != truncOutput.length; i++)
{
DERGeneralizedTime t = new DERGeneralizedTime(truncOutput[i]);
if (!areEqual(t.getEncoded(), new ASN1GeneralizedTime(derTruncOutput[i]).getEncoded()))
{
fail("trunc der encoding wrong");
}
}
}
private String calculateGMTOffset(Date date)
{
String sign = "+";
TimeZone timeZone = TimeZone.getDefault();
int offset = timeZone.getRawOffset();
if (offset < 0)
{
sign = "-";
offset = -offset;
}
int hours = offset / (60 * 60 * 1000);
int minutes = (offset - (hours * 60 * 60 * 1000)) / (60 * 1000);
if (timeZone.useDaylightTime() && timeZone.inDaylightTime(date))
{
hours += sign.equals("+") ? 1 : -1;
}
return "GMT" + sign + convert(hours) + ":" + convert(minutes);
}
private String convert(int time)
{
if (time < 10)
{
return "0" + time;
}
return Integer.toString(time);
}
public static void main(
String[] args)
{
runTest(new GeneralizedTimeTest());
}
}