jdk/test/tools/jar/UpdateManifest.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jar/UpdateManifest.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,227 @@
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6434207 6442687
+ * @summary Ensure that jar ufm actually updates the
+ * existing jar file's manifest with contents of the
+ * manifest file.
+ */
+
+import java.io.*;
+import java.util.logging.*;
+import java.util.zip.*;
+import sun.tools.jar.Main;
+
+public class UpdateManifest {
+    static PrintStream out = System.out;
+    static PrintStream err = System.err;
+    static boolean debug = true;
+
+    public static void realMain(String[] args) throws Throwable {
+        if (args.length == 0) {
+            debug = false;
+            File tmp = File.createTempFile("system-out-err", ".txt");
+            tmp.deleteOnExit();
+            out = new PrintStream(new FileOutputStream(tmp));
+            err = out;
+            // Attributes.read() can log a message we don't care to see.
+            Logger.getLogger("java.util.jar").setLevel(Level.OFF);
+        }
+
+        try { testManifestExistence(); } catch (Throwable t) { unexpected(t); }
+        try { testManifestContents(); } catch (Throwable t) { unexpected(t); }
+    }
+
+    static void testManifestExistence() throws Throwable {
+        // Create a file to put in a jar file
+        File existence = createTextFile("existence");
+
+        // Create a jar file, specifying a Main-Class
+        final String jarFileName = "um-existence.jar";
+        new File(jarFileName).delete(); // remove pre-existing first!
+        Main jartool = new Main(out, err, "jar");
+        boolean status = jartool.run(
+            new String[] { "cfe", jarFileName, "Hello", existence.getPath() });
+        check(status);
+        checkManifest(jarFileName, "Hello");
+
+        // Update that jar file by changing the Main-Class
+        jartool = new Main(out, err, "jar");
+        status = jartool.run(
+            new String[] { "ufe", jarFileName, "Bye" });
+        check(status);
+        checkManifest(jarFileName, "Bye");
+    }
+
+    static void testManifestContents() throws Throwable {
+        // Create some strings we expect to find in the updated manifest
+        final String animal =
+            "Name: animal/marsupial";
+        final String specTitle =
+            "Specification-Title: Wombat";
+
+        // Create a text file with manifest entries
+        File manifestOrig = File.createTempFile("manifestOrig", ".txt");
+        if (!debug) manifestOrig.deleteOnExit();
+        PrintWriter pw = new PrintWriter(manifestOrig);
+        pw.println("Manifest-Version: 1.0");
+        pw.println("Created-By: 1.6.0-internal (Sun Microsystems Inc.)");
+        pw.println("");
+        pw.println(animal);
+        pw.println(specTitle);
+        pw.close();
+
+        File hello = createTextFile("hello");
+
+        // Create a jar file
+        final String jarFileName = "um-test.jar";
+        new File(jarFileName).delete(); // remove pre-existing first!
+        Main jartool = new Main(out, err, "jar");
+        boolean status = jartool.run(
+                                new String[] {"cfm", jarFileName,
+                                    manifestOrig.getPath(), hello.getPath() });
+        check(status);
+
+        // Create a new manifest, to use in updating the jar file.
+        File manifestUpdate = File.createTempFile("manifestUpdate", ".txt");
+        if (!debug) manifestUpdate.deleteOnExit();
+        pw = new PrintWriter(manifestUpdate);
+        final String createdBy =
+            "Created-By: 1.5.0-special (Sun Microsystems Inc.)";
+        final String specVersion =
+            "Specification-Version: 1.0.0.0";
+        pw.println(createdBy); // replaces line in the original
+        pw.println("");
+        pw.println(animal);
+        pw.println(specVersion); // addition to animal/marsupial section
+        pw.close();
+
+        // Update jar file with manifest
+        jartool = new Main(out, err, "jar");
+        status = jartool.run(
+            new String[] { "ufm", jarFileName, manifestUpdate.getPath() });
+        check(status);
+
+        // Extract jar, and verify contents of manifest file
+        File f = new File(jarFileName);
+        if (!debug) f.deleteOnExit();
+        ZipFile zf = new ZipFile(f);
+        ZipEntry ze = zf.getEntry("META-INF/MANIFEST.MF");
+        BufferedReader r = new BufferedReader(
+            new InputStreamReader(zf.getInputStream(ze)));
+        r.readLine(); // skip Manifest-Version
+        check(r.readLine().equals(createdBy));
+        r.readLine(); // skip blank line
+        check(r.readLine().equals(animal));
+        String s = r.readLine();
+        if (s.equals(specVersion)) {
+            check(r.readLine().equals(specTitle));
+        } else if (s.equals(specTitle)) {
+            check(r.readLine().equals(specVersion));
+        } else {
+            fail("did not match specVersion nor specTitle");
+        }
+    }
+
+    // --------------------- Convenience ---------------------------
+
+    static File createTextFile(String name) throws Throwable {
+        // Create a text file to put in a jar file
+        File rc = File.createTempFile(name, ".txt");
+        if (!debug) rc.deleteOnExit();
+        PrintWriter pw = new PrintWriter(rc);
+        pw.println("hello, world");
+        pw.close();
+        return rc;
+    }
+
+    static void checkManifest(String jarFileName, String mainClass)
+                throws Throwable {
+        File f = new File(jarFileName);
+        if (!debug) f.deleteOnExit();
+        ZipFile zf = new ZipFile(f);
+        ZipEntry ze = zf.getEntry("META-INF/MANIFEST.MF");
+        BufferedReader r = new BufferedReader(
+            new InputStreamReader(zf.getInputStream(ze)));
+        String line = r.readLine();
+        while (line != null && !(line.startsWith("Main-Class:"))) {
+            line = r.readLine();
+        }
+        if (line == null) {
+            fail("Didn't find Main-Class in manifest");
+        } else {
+            check(line.equals("Main-Class: " + mainClass));
+        }
+        zf.close();
+    }
+
+    // --------------------- Infrastructure ---------------------------
+
+    static volatile int passed = 0, failed = 0;
+
+    static void pass() {
+        passed++;
+    }
+
+    static void fail() {
+        failed++;
+        Thread.dumpStack();
+    }
+
+    static void fail(String msg) {
+        System.out.println(msg);
+        fail();
+    }
+
+    static void unexpected(Throwable t) {
+        failed++;
+        t.printStackTrace();
+    }
+
+    static void check(boolean cond) {
+        if (cond)
+            pass();
+        else
+            fail();
+    }
+
+    static void equal(Object x, Object y) {
+        if ((x == null) ? (y == null) : x.equals(y))
+            pass();
+        else
+            fail(x + " not equal to " + y);
+    }
+
+    public static void main(String[] args) throws Throwable {
+        try {
+            realMain(args);
+        } catch (Throwable t) {
+            unexpected(t);
+        }
+        System.out.println("\nPassed = " + passed + " failed = " + failed);
+        if (failed > 0)
+            throw new AssertionError("Some tests failed");
+    }
+}