Home | History | Annotate | Download | only in der
      1 /*
      2  *  Licensed to the Apache Software Foundation (ASF) under one or more
      3  *  contributor license agreements.  See the NOTICE file distributed with
      4  *  this work for additional information regarding copyright ownership.
      5  *  The ASF licenses this file to You under the Apache License, Version 2.0
      6  *  (the "License"); you may not use this file except in compliance with
      7  *  the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  */
     17 
     18 /**
     19 * @author Vladimir N. Molotkov
     20 */
     21 
     22 package org.apache.harmony.security.tests.asn1.der;
     23 
     24 import java.io.ByteArrayInputStream;
     25 import java.io.IOException;
     26 import java.text.ParseException;
     27 import java.text.SimpleDateFormat;
     28 import java.util.Date;
     29 import java.util.TimeZone;
     30 
     31 import org.apache.harmony.security.asn1.ASN1UTCTime;
     32 import org.apache.harmony.security.asn1.DerInputStream;
     33 import org.apache.harmony.security.asn1.DerOutputStream;
     34 
     35 import junit.framework.TestCase;
     36 
     37 
     38 /**
     39  * ASN.1 DER test for UTCTime type
     40  *
     41  * @see http://asn1.elibel.tm.fr/en/standards/index.htm
     42  */
     43 public class DerUTCTimeEDTest extends TestCase {
     44 
     45     private ASN1UTCTime uTime = ASN1UTCTime.getInstance();
     46 
     47     private final int workersNumber = 10;
     48     private boolean mtTestPassed;
     49     /**
     50      * UTC TIME DER Encoder test
     51      * @throws ParseException
     52      */
     53     public final void testUTCEncoder() throws Exception {
     54         // no fractional seconds (last 3 0s and "." must be trimmed out)
     55         Date myDate = getGmtDate(1101980374187L);
     56         byte[] encoded =
     57             new DerOutputStream(uTime, myDate).encoded;
     58         String rep = new String(encoded, 2, encoded[1] & 0xff, "UTF-8");
     59         assertEquals("no fraction", "041202093934Z", rep);
     60 
     61         // midnight
     62         SimpleDateFormat sdf =
     63             new SimpleDateFormat("dd.MM.yyyy HH:mm");
     64         sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
     65         myDate = sdf.parse("06.06.2004 00:00");
     66         encoded =
     67             new DerOutputStream(uTime, myDate).encoded;
     68         rep = new String(encoded, 2, encoded[1] & 0xff, "UTF-8");
     69         assertEquals("midnight", "040606000000Z", rep);
     70     }
     71 
     72     /**
     73      * UTC TIME DER Encoder/Decoder test
     74      * (byte array case)
     75      * @throws ParseException
     76      * @throws IOException
     77      */
     78     public final void testUTCEncoderDecoder01()
     79         throws ParseException,
     80                IOException {
     81         runTest(false);
     82     }
     83 
     84     /**
     85      * UTC TIME DER Encoder/Decoder test
     86      * (InputStream case)
     87      * @throws ParseException
     88      * @throws IOException
     89      */
     90     public final void testUTCEncoderDecoder02()
     91         throws ParseException,
     92                IOException {
     93         runTest(true);
     94     }
     95 
     96     private final void runTest(boolean useInputStream)
     97         throws IOException, ParseException {
     98         Date myDate = new Date(1101980374187L);
     99         byte[] encoded =
    100             new DerOutputStream(uTime, myDate).encoded;
    101         DerInputStream dis = useInputStream
    102         ? new DerInputStream(new ByteArrayInputStream(encoded))
    103         : new DerInputStream(encoded);
    104         // the difference only fractional-seconds
    105         assertEquals(187, (myDate.getTime()-((Date)uTime.decode(dis)).getTime()));
    106 
    107         // midnight
    108         myDate = new SimpleDateFormat("MM.dd.yyyy HH:mm").
    109             parse("06.06.2004 00:00");
    110         encoded =
    111             new DerOutputStream(uTime, myDate).encoded;
    112         dis = useInputStream
    113         ? new DerInputStream(new ByteArrayInputStream(encoded))
    114         : new DerInputStream(encoded);
    115         assertEquals(myDate, uTime.decode(dis));
    116     }
    117 
    118     public final void testMt() throws InterruptedException {
    119         mtTestPassed = true;
    120         Thread[] workers = new Thread[workersNumber];
    121             for(int i=0; i<workersNumber; i++) {
    122                 workers[i] = new TestWorker();
    123             }
    124             for(int i=0; i<workersNumber; i++) {
    125                 workers[i].start();
    126             }
    127             for(int i=0; i<workersNumber; i++) {
    128                 workers[i].join();
    129             }
    130             assertTrue(mtTestPassed);
    131     }
    132 
    133     private static Date getGmtDate(long mills) {
    134         return new Date(mills);
    135     }
    136 
    137     /**
    138      * MT Test worker thread
    139      *
    140      * @author Vladimir Molotkov
    141      * @version 0.1
    142      */
    143     private class TestWorker extends Thread {
    144 
    145         public void run() {
    146             for (int i=0; i<100; i++) {
    147                 try {
    148                     // Perform DER encoding/decoding:
    149                     if(i%2==0) {
    150                         testUTCEncoderDecoder01();
    151                     } else {
    152                         testUTCEncoderDecoder02();
    153                     }
    154                 } catch (Throwable e) {
    155                     System.err.println(e);
    156                     mtTestPassed = false;
    157                     return;
    158                 }
    159             }
    160         }
    161     }
    162 }
    163