package org.bouncycastle.asn1.test; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.bouncycastle.asn1.ASN1Integer; import org.bouncycastle.asn1.cmc.CMCFailInfo; import org.bouncycastle.util.test.SimpleTest; public class CMCFailInfoTest extends SimpleTest { // From Page 68, CMC: Structures RFC 5272 private static Object[][] types = new Object[][]{ {"badAlg", new Long(0L) }, {"badMessageCheck", new Long(1L) }, {"badRequest", new Long(2L) }, {"badTime", new Long(3L) }, {"badCertId", new Long(4L) }, {"unsupportedExt", new Long(5L) }, {"mustArchiveKeys", new Long(6L) }, {"badIdentity", new Long(7L) }, {"popRequired", new Long(8L) }, {"popFailed", new Long(9L) }, {"noKeyReuse", new Long(10L) }, {"internalCAError", new Long(11L) }, {"tryLater", new Long(12L) }, {"authDataFail", new Long(13L)} }; private static Map typesMap = new HashMap(); static { for (int t = 0; t < types.length; t++) { typesMap.put(types[t][1], types[t][0]); } } public void performTest() throws Exception { // // Check that range has changed and this test has not been updated or vice versa. // It is intended to act as a double check on the addition of CMCFailInfo presets by // requiring this test to be updated equally to ensure it will pass. // Field rangeField = CMCFailInfo.class.getDeclaredField("range"); rangeField.setAccessible(true); Map range = (Map)rangeField.get(null); isEquals("Range in CMCFailInfo does not match test data.",range.size(), types.length); for (Iterator rangeKeys = range.keySet().iterator(); rangeKeys.hasNext(); ) { Object j = rangeKeys.next(); if (!typesMap.containsKey(new Long(((ASN1Integer)j).getValue().longValue()))) { fail("The 'range' map in CMCFailInfo contains a value not in the test ('typesMap') map, value was: "+j.toString()); } } for (Iterator typeKeys = typesMap.keySet().iterator(); typeKeys.hasNext(); ) { Object j = typeKeys.next(); if (!range.containsKey(new ASN1Integer(((Long)j).longValue()))) { fail("The 'typesMap' map in CMCFailInfoTest contains a value not in the CMCFailInfo ('range') map, value was: "+j.toString()); } } // // Test encoding / decoding // byte[] b = CMCFailInfo.authDataFail.getEncoded(); CMCFailInfo r = CMCFailInfo.getInstance(b); isEquals(r,CMCFailInfo.authDataFail); } public String getName() { return "CMCFailInfoTest"; } public static void main(String[] args) { runTest(new CMCFailInfoTest()); } }