/* TestOfManifest.java Copyright (C) 2006 Free Software Foundation, Inc. This file is part of Mauve. Mauve is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. Mauve is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Mauve; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ // Tags: JDK1.4 package gnu.testlet.wonka.util.jar.JarFile; import gnu.testlet.TestHarness; import gnu.testlet.Testlet; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.security.cert.Certificate; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; /** * Simple test for validating Marco Trudel's patch for parsing long file names * in a Jar file's manifest. */ public class TestOfManifest implements Testlet { private static final String FILENAME = "jfaceSmall.jar"; private static final String FILEPATH = FILENAME; private static final String ENTRYNAME = "org/eclipse/jface/viewers/TreeViewer$TreeColorAndFontCollector.class"; /* (non-Javadoc) * @see gnu.testlet.Testlet#test(gnu.testlet.TestHarness) */ public void test(TestHarness harness) { checkManifestEntries(harness); checkCertificates(harness); } private void checkManifestEntries(TestHarness harness) { harness.checkPoint("checkManifestEntries"); try { File file = harness.getResourceFile(FILEPATH); JarFile jarFile = new JarFile(file); readEntries(jarFile); // will parse the signatures boolean ok = readCertificates(harness, jarFile); harness.check(ok, "Jar entry MUST be signed"); } catch (Exception x) { harness.debug(x); harness.fail("checkManifestEntries: " + x); } } /** * @param harness this test-harness. */ private void checkCertificates(TestHarness harness) { harness.checkPoint("checkCertificates"); try { File file = harness.getResourceFile(FILEPATH); JarFile jarFile = new JarFile(file, true); JarEntry je = jarFile.getJarEntry(ENTRYNAME); Certificate[] certsBefore = je.getCertificates(); int certsBeforeCount = certsBefore == null ? 0 : certsBefore.length; harness.verbose("*** before: " + certsBeforeCount); harness.check(certsBeforeCount == 0, "Certificate count MUST be 0"); read1Entry(jarFile, je); Certificate[] certsAfter = je.getCertificates(); int certsAfterCount = certsAfter == null ? 0 : certsAfter.length; harness.verbose("*** after: " + certsAfterCount); harness.check(certsAfterCount == 1, "Certificate count MUST be 1"); harness.check(certsBeforeCount != certsAfterCount, "Certificate counts MUST NOT be the same"); JarEntry je_ = jarFile.getJarEntry(ENTRYNAME); Certificate[] sameCerts = je_.getCertificates(); int sameCertsCount = sameCerts == null ? 0 : sameCerts.length; harness.verbose("*** w/ new entry: " + sameCertsCount); harness.check(sameCertsCount == 1, "Certificate count (w/ new entry) MUST be 1"); harness.check(certsAfterCount == sameCertsCount, "Certificate counts (w/ new entry) MUST be the same"); } catch (Exception x) { harness.debug(x); harness.fail("checkCertificates: " + x); } } private static void readEntries(JarFile jarFile) throws Exception { for (Enumeration entries = jarFile.entries(); entries.hasMoreElements();) read1Entry(jarFile, (JarEntry) entries.nextElement()); } private static void read1Entry(JarFile jar, JarEntry entry) throws Exception { InputStream stream = null; try { stream = jar.getInputStream(entry); byte[] ba = new byte[8192]; int n; while ((n = stream.read(ba)) >= 0) /* keep reading */; } finally { if (stream != null) try { stream.close(); } catch (IOException ignored) { } } } private boolean readCertificates(TestHarness harness, JarFile jarFile) { for (Enumeration entries = jarFile.entries(); entries.hasMoreElements();) { JarEntry entry = (JarEntry) entries.nextElement(); if (entry.isDirectory()) continue; Certificate[] certs = entry.getCertificates(); if (certs == null || certs.length == 0) // No certificate { if (! entry.getName().startsWith("META-INF")) { harness.verbose("Entry " + entry.getName() + " in jar file " + FILENAME + " does not have a certificate"); return false; } } } return true; } }