/* * Copyright (C) 2011 The Android Open Source Project * * 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 com.android.sdklib.internal.build; import com.android.sdklib.internal.build.DebugKeyProvider.IKeyGenOutput; import junit.framework.TestCase; import java.io.File; import java.security.PrivateKey; import java.security.cert.X509Certificate; import java.util.Calendar; public class DebugKeyProviderTest extends TestCase { private File mTmpFile; @Override protected void setUp() throws Exception { super.setUp(); // We want to allocate a new tmp file but not have it actually exist mTmpFile = File.createTempFile(this.getClass().getSimpleName(), ".keystore"); assertTrue(mTmpFile.delete()); } @Override protected void tearDown() throws Exception { super.tearDown(); if (mTmpFile != null) { if (!mTmpFile.delete()) { mTmpFile.deleteOnExit(); } mTmpFile = null; } } public void testCreateAndCheckKey() throws Exception { String osPath = mTmpFile.getAbsolutePath(); KeygenOutput keygenOutput = new KeygenOutput(); // "now" is just slightly before the key was created long now = System.currentTimeMillis(); DebugKeyProvider provider; try { provider = new DebugKeyProvider(osPath, null /*storeType*/, keygenOutput); } catch (Throwable t) { // In case we get any kind of exception, rewrap it to make sure we output // the path used. String msg = String.format("%1$s in %2$s\n%3$s", t.getClass().getSimpleName(), osPath, t.toString()); throw new Exception(msg, t); } assertNotNull(provider); assertEquals("", keygenOutput.getOut()); assertEquals("", keygenOutput.getErr()); PrivateKey key = provider.getDebugKey(); assertNotNull(key); X509Certificate certificate = (X509Certificate) provider.getCertificate(); assertNotNull(certificate); // The "not-after" (a.k.a. expiration) date should be after "now" Calendar c = Calendar.getInstance(); c.setTimeInMillis(now); assertTrue(certificate.getNotAfter().compareTo(c.getTime()) > 0); // It should be valid after 1 year from now (adjust by a second since the 'now' time // doesn't exactly match the creation time... 1 second should be enough.) c.add(Calendar.DAY_OF_YEAR, 365); c.add(Calendar.SECOND, -1); assertTrue("1 year expiration failed", certificate.getNotAfter().compareTo(c.getTime()) > 0); // and 30 years from now c.add(Calendar.DAY_OF_YEAR, 29 * 365); // remove 1 hour to handle for PST/PDT issue 77 c.add(Calendar.HOUR_OF_DAY, -1); assertTrue("30 year expiration failed", certificate.getNotAfter().compareTo(c.getTime()) > 0); // however expiration date should be passed in 30 years + a few hours c.add(Calendar.HOUR, 5); assertFalse("30 year and a few hours expiration failed", certificate.getNotAfter().compareTo(c.getTime()) > 0); } private static class KeygenOutput implements IKeyGenOutput { private String mOut = ""; //$NON-NLS-1$ private String mErr = ""; //$NON-NLS-1$ @Override public void out(String message) { mOut += message + "\n"; //$NON-NLS-1$ } @Override public void err(String message) { mErr += message + "\n"; //$NON-NLS-1$ } public String getOut() { return mOut; } public String getErr() { return mErr; } } }