jtulach@268: /* jtulach@268: * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. jtulach@268: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. jtulach@268: * jtulach@268: * This code is free software; you can redistribute it and/or modify it jtulach@268: * under the terms of the GNU General Public License version 2 only, as jtulach@268: * published by the Free Software Foundation. Sun designates this jtulach@268: * particular file as subject to the "Classpath" exception as provided jtulach@268: * by Sun in the LICENSE file that accompanied this code. jtulach@268: * jtulach@268: * This code is distributed in the hope that it will be useful, but WITHOUT jtulach@268: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or jtulach@268: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License jtulach@268: * version 2 for more details (a copy is included in the LICENSE file that jtulach@268: * accompanied this code). jtulach@268: * jtulach@268: * You should have received a copy of the GNU General Public License version jtulach@268: * 2 along with this work; if not, write to the Free Software Foundation, jtulach@268: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. jtulach@268: * jtulach@268: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, jtulach@268: * CA 95054 USA or visit www.sun.com if you need additional information or jtulach@268: * have any questions. jtulach@268: */ jtulach@268: package org.apidesign.infra.ant; jtulach@268: jtulach@268: import java.io.ByteArrayInputStream; jtulach@268: import java.io.File; jtulach@268: import java.io.FileNotFoundException; jtulach@268: import java.io.FileOutputStream; jtulach@268: import java.io.FileWriter; jtulach@268: import java.io.InputStream; jtulach@268: import java.net.URL; jtulach@268: import java.util.ArrayList; jtulach@268: import java.util.Arrays; jtulach@268: import java.util.List; jtulach@268: import junit.framework.Test; jtulach@268: import org.netbeans.junit.NbTestCase; jtulach@268: import org.netbeans.junit.NbTestSuite; jtulach@268: jtulach@268: /** jtulach@268: * jtulach@268: * @author Jaroslav Tulach jtulach@268: */ jtulach@268: public class GrepCopyTest extends NbTestCase { jtulach@268: private static File workDir; jtulach@268: jtulach@268: public GrepCopyTest(String s) { jtulach@268: super(s); jtulach@268: } jtulach@268: jtulach@268: public static Test suite() { jtulach@268: return new NbTestSuite(GrepCopyTest.class); jtulach@268: //return new GrepCopyTest("testInXML"); jtulach@268: } jtulach@268: jtulach@268: @Override jtulach@268: protected void setUp() throws Exception { jtulach@268: clearWorkDir(); jtulach@268: } jtulach@268: jtulach@268: public void testMissingMethodInAnInterfaceIsDetected() throws Exception { jtulach@268: String c1 = jtulach@268: "package ahoj;\n" + jtulach@268: "// BEGIN: xyz\n" + jtulach@268: "public interface I {\n" + jtulach@268: "// FINISH: xyz\n" + jtulach@268: " public void get();\n" + jtulach@268: "}" + jtulach@268: ""; jtulach@268: File src = createFile(1, "I.java", c1); jtulach@268: jtulach@268: jtulach@268: String c2 = jtulach@268: "@xyz@"; jtulach@268: File txt = createFile(2, "in.txt", c2); jtulach@268: jtulach@268: execute(1, 2, "-Dfile1=" + txt, "-Dinclude1=*.java"); jtulach@268: jtulach@268: String r = readFile("xyz"); jtulach@268: assertEquals("public interface I {\n}\n", r); jtulach@268: } jtulach@268: jtulach@274: public void testURLGenerated() throws Exception { jtulach@274: String c1 = jtulach@274: "package ahoj;\n" + jtulach@274: "// BEGIN: xyz\n" + jtulach@274: "public interface I {\n" + jtulach@274: "// FINISH: xyz\n" + jtulach@274: " public void get();\n" + jtulach@274: "}" + jtulach@274: ""; jtulach@274: File src = createFile(1, "I.java", c1); jtulach@274: jtulach@274: jtulach@274: String c2 = jtulach@274: "@xyz@"; jtulach@274: File txt = createFile(2, "in.txt", c2); jtulach@274: jtulach@274: execute(1, 2, "-Dfile1=" + txt, "-Dinclude1=*.java", "-Dout.url=http://xyz/", "url"); jtulach@274: jtulach@274: String r = readFile("xyz"); jtulach@274: assertEquals("public interface I {\n}\n", r); jtulach@274: jtulach@274: String u = readFile("xyz.url"); jtulach@274: assertEquals("http://xyz/I.java", u); jtulach@274: } jtulach@274: jtulach@268: public void testSpacesAtBeginingAreStripped() throws Exception { jtulach@268: String c1 = jtulach@268: "package ahoj;\n" + jtulach@268: "// BEGIN: xyz\n" + jtulach@268: " public interface I {\n" + jtulach@268: " public void ahoj();\n" + jtulach@268: " }\n" + jtulach@268: "// END: xyz\n" + jtulach@268: " public void get();\n" + jtulach@268: "}" + jtulach@268: ""; jtulach@268: File src = createFile(1, "I.java", c1); jtulach@268: jtulach@268: jtulach@268: String c2 = jtulach@268: "@xyz@"; jtulach@268: File txt = createFile(2, "in.txt", c2); jtulach@268: jtulach@268: execute(1, 2, "-Dfile1=" + txt, "-Dinclude1=*.java"); jtulach@268: jtulach@268: String r = readFile("xyz"); jtulach@268: String result = "public interface I {\n" + jtulach@268: " public void ahoj();\n" + jtulach@268: "}\n"; jtulach@268: assertEquals(result, r); jtulach@268: } jtulach@268: jtulach@268: public void testReportUnpairedBracesAsError() throws Exception { jtulach@268: String c1 = jtulach@268: "package ahoj;\n" + jtulach@268: "// BEGIN: xyz\n" + jtulach@268: " public interface I {\n" + jtulach@268: " public void ahoj();\n" + jtulach@268: "// END: xyz\n" + jtulach@268: " }\n" + jtulach@268: " public void get();\n" + jtulach@268: "}" + jtulach@268: ""; jtulach@268: File src = createFile(1, "I.java", c1); jtulach@268: jtulach@268: jtulach@268: String c2 = jtulach@268: "@xyz@"; jtulach@268: File txt = createFile(2, "in.txt", c2); jtulach@268: jtulach@268: File out = createFile(3, "out.txt", ""); jtulach@268: out.delete(); jtulach@268: jtulach@268: try { jtulach@268: execute(1, 2, "-Dfile1=" + txt, "-Dfile2=" + out, "-Dinclude1=*.java"); jtulach@268: } catch (ExecuteUtils.ExecutionError ex) { jtulach@268: // ok jtulach@268: return; jtulach@268: } jtulach@268: fail("The execution of the script shall fail"); jtulach@268: } jtulach@268: jtulach@268: public void testIncludedTexts() throws Exception { jtulach@268: String c1 = jtulach@268: "package ahoj;\n" + jtulach@268: "// BEGIN: clazz\n" + jtulach@268: "public interface I {\n" + jtulach@268: " // BEGIN: method\n" + jtulach@268: " public void get();\n" + jtulach@268: " // END: method\n" + jtulach@268: "}\n" + jtulach@268: "// END: clazz\n" + jtulach@268: ""; jtulach@268: File src = createFile(1, "I.java", c1); jtulach@268: jtulach@268: jtulach@268: String c2 = jtulach@268: "@clazz@"; jtulach@268: File txt = createFile(2, "in.txt", c2); jtulach@268: jtulach@268: execute(1, 2, "-Dfile1=" + txt, "-Dinclude1=*.java"); jtulach@268: jtulach@268: String r = readFile("clazz"); jtulach@268: if (r.indexOf("BEGIN") >= 0) { jtulach@268: fail("BEGIN is there: " + r); jtulach@268: } jtulach@268: if (r.indexOf("END") >= 0) { jtulach@268: fail("END is there: " + r); jtulach@268: } jtulach@268: if (r.indexOf("interface I") < 0) { jtulach@268: fail("Missing interface: " + r); jtulach@268: } jtulach@268: if (r.indexOf("void get()") < 0) { jtulach@268: fail("Missing get: " + r); jtulach@268: } jtulach@268: } jtulach@268: public void testIncludedTextsAmper() throws Exception { jtulach@268: String c1 = jtulach@268: "package ahoj;\n" + jtulach@268: "public class C {\n" + jtulach@268: " // BEGIN: method\n" + jtulach@268: " public void change(int x) { x &= 10; }\n" + jtulach@268: " // END: method\n" + jtulach@268: "}\n" + jtulach@268: ""; jtulach@268: File src = createFile(1, "C.java", c1); jtulach@268: jtulach@268: jtulach@268: String c2 = jtulach@268: "@method@"; jtulach@268: File txt = createFile(2, "in.txt", c2); jtulach@268: jtulach@268: execute(1, 2, "-Dfile1=" + txt, "-Dinclude1=*.java"); jtulach@268: jtulach@268: String r = readFile("method"); jtulach@268: if (r.indexOf("&=") < 0) { jtulach@268: fail("No XML: " + r); jtulach@268: } jtulach@268: if (r.indexOf("&=") >= 0) { jtulach@268: fail("No XML, we need &: " + r); jtulach@268: } jtulach@268: } jtulach@268: public void testIncludedTextsAmperAndGenerics() throws Exception { jtulach@268: String c1 = jtulach@268: jtulach@268: "package org.apidesign.api.security;\n" + jtulach@268: "" + jtulach@268: "import java.nio.ByteBuffer;\n" + jtulach@268: "import java.util.ServiceLoader;\n" + jtulach@268: "import org.apidesign.spi.security.Digestor;\n" + jtulach@268: "\n" + jtulach@268: "/** Simplified version of a Digest class that allows to compute a fingerprint\n" + jtulach@268: " * for buffer of data.\n" + jtulach@268: " *\n" + jtulach@268: " * @author Jaroslav Tulach \n" + jtulach@268: " */\n" + jtulach@268: "// BEGIN: day.end.bridges.Digest\n" + jtulach@268: "public final class Digest {\n" + jtulach@268: " private final DigestImplementation impl;\n" + jtulach@268: " \n" + jtulach@268: " /** Factory method is better than constructor */\n" + jtulach@268: " private Digest(DigestImplementation impl) {\n" + jtulach@268: " this.impl = impl;\n" + jtulach@268: " }\n" + jtulach@268: " \n" + jtulach@268: " /** Factory method to create digest for an algorithm.\n" + jtulach@268: " */\n" + jtulach@268: " public static Digest getInstance(String algorithm) {\n" + jtulach@268: " for (Digestor digestor : ServiceLoader.load(Digestor.class)) {\n" + jtulach@268: " DigestImplementation impl = \n" + jtulach@268: "DigestImplementation.create(digestor, algorithm);\n" + jtulach@268: " if (impl != null) {\n" + jtulach@268: " return new Digest(impl);\n" + jtulach@268: " }\n" + jtulach@268: " }\n" + jtulach@268: " throw new IllegalArgumentException(algorithm);\n" + jtulach@268: " }\n" + jtulach@268: " \n" + jtulach@268: " //\n" + jtulach@268: " // these methods are kept the same as in original MessageDigest,\n" + jtulach@268: " // but for simplicity choose just some from the original API\n" + jtulach@268: " //\n" + jtulach@268: " \n" + jtulach@268: " public byte[] digest(ByteBuffer bb) {\n" + jtulach@268: " return impl.digest(bb);\n" + jtulach@268: " }\n" + jtulach@268: "}\n" + jtulach@268: "// END: day.end.bridges.Digest\n"; jtulach@268: jtulach@268: File src = createFile(1, "C.java", c1); jtulach@268: jtulach@268: jtulach@268: String c2 = jtulach@268: "@day.end.bridges.Digest@"; jtulach@268: File txt = createFile(2, "in.txt", c2); jtulach@268: jtulach@268: execute(1, 2, "-Dfile1=" + txt, "-Dinclude1=*.java"); jtulach@268: jtulach@268: String r = readFile("day.end.bridges.Digest"); jtulach@268: if (r.indexOf("&=") >= 0) { jtulach@268: fail("Wrong XML: " + r); jtulach@268: } jtulach@268: if (r.indexOf("&") > -1) { jtulach@268: fail("Wrong XML, no &: " + r); jtulach@268: } jtulach@268: } jtulach@268: jtulach@268: public void testInXML() throws Exception { jtulach@268: String c1 = jtulach@268: "\n" + jtulach@268: "\n" + jtulach@268: "\n" + jtulach@268: ""; jtulach@268: File src = createFile(1, "I.xml", c1); jtulach@268: jtulach@268: jtulach@268: String c2 = jtulach@268: "@clazz@"; jtulach@268: File txt = createFile(2, "in.txt", c2); jtulach@268: jtulach@268: execute(1, 2, "-Dfile1=" + txt, "-Dinclude1=*.xml"); jtulach@268: jtulach@268: String r = readFile("clazz"); jtulach@268: if (r.indexOf("BEGIN") >= 0) { jtulach@268: fail("BEGIN is there: " + r); jtulach@268: } jtulach@268: if (r.indexOf("END") >= 0) { jtulach@268: fail("END is there: " + r); jtulach@268: } jtulach@268: if (r.indexOf("") < 0) { jtulach@268: fail("Missing interface: " + r); jtulach@268: } jtulach@268: } jtulach@268: jtulach@268: public void testLongLineNotDetectedAsBeginsWithGen() throws Exception { jtulach@268: String c1 = jtulach@268: "package org.apidesign.api.security;\n" + jtulach@268: "" + jtulach@268: "import java.nio.ByteBuffer;\n" + jtulach@268: "import java.util.ServiceLoader;\n" + jtulach@268: "import org.apidesign.spi.security.Digestor;\n" + jtulach@268: "\n" + jtulach@268: "/** Simplified version of a Digest class that allows to compute a fingerprint\n" + jtulach@268: "// BEGIN: x\n" + jtulach@268: " * for buffer of data.\n" + jtulach@268: "// END: x\n" + jtulach@268: " *\n" + jtulach@268: " * @author Jaroslav Tulach \n" + jtulach@268: " */\n" + jtulach@268: "// GEN-BEGIN: day.end.bridges.Digest\n" + jtulach@268: "d; DigestImplementation impl = DigestImplementation.create(digestor, algorithm);\n" + jtulach@268: "// GEN-END: day.end.bridges.Digest\n"; jtulach@268: jtulach@268: File src = createFile(1, "C.java", c1); jtulach@268: jtulach@268: jtulach@268: String c2 = jtulach@268: "@day.end.bridges.Digest@"; jtulach@268: File txt = createFile(2, "in.txt", c2); jtulach@268: jtulach@268: File out = createFile(3, "out.txt", ""); jtulach@268: out.delete(); jtulach@268: jtulach@268: execute(1, 2, "-Dfile1=" + txt, "-Dfile2=" + out, "-Dinclude1=*.java"); jtulach@268: } jtulach@268: jtulach@268: jtulach@268: public void testLongLineDetected() throws Exception { jtulach@268: String c1 = jtulach@268: "package org.apidesign.api.security;\n" + jtulach@268: "" + jtulach@268: "import java.nio.ByteBuffer;\n" + jtulach@268: "import java.util.ServiceLoader;\n" + jtulach@268: "import org.apidesign.spi.security.Digestor;\n" + jtulach@268: "\n" + jtulach@268: "/** Simplified version of a Digest class that allows to compute a fingerprint\n" + jtulach@268: " * for buffer of data.\n" + jtulach@268: " *\n" + jtulach@268: " * @author Jaroslav Tulach \n" + jtulach@268: " */\n" + jtulach@268: "// BEGIN: day.end.bridges.Digest\n" + jtulach@268: "d; DigestImplementation impl = DigestImplementation.create(digestor, algorithm);\n" + jtulach@268: "// END: day.end.bridges.Digest\n"; jtulach@268: jtulach@268: File src = createFile(1, "C.java", c1); jtulach@268: jtulach@268: jtulach@268: String c2 = jtulach@268: "@day.end.bridges.Digest@"; jtulach@268: File txt = createFile(2, "in.txt", c2); jtulach@268: jtulach@268: File out = createFile(3, "out.txt", ""); jtulach@268: out.delete(); jtulach@268: jtulach@268: try { jtulach@268: execute(1, 2, "-Dfile1=" + txt, "-Dfile2=" + out, "-Dinclude1=*.java"); jtulach@268: } catch (ExecuteUtils.ExecutionError ex) { jtulach@268: // OK jtulach@268: return; jtulach@268: } jtulach@268: fail("Should fail, as there is long line"); jtulach@268: } jtulach@268: public void testLongNotLineDetectedAsShortened() throws Exception { jtulach@268: String c1 = jtulach@268: "package org.apidesign.api.security;\n" + jtulach@268: "" + jtulach@268: "import java.nio.ByteBuffer;\n" + jtulach@268: "import java.util.ServiceLoader;\n" + jtulach@268: "import org.apidesign.spi.security.Digestor;\n" + jtulach@268: "\n" + jtulach@268: "/** Simplified version of a Digest class that allows to compute a fingerprint\n" + jtulach@268: " * for buffer of data.\n" + jtulach@268: " *\n" + jtulach@268: " * @author Jaroslav Tulach \n" + jtulach@268: " */\n" + jtulach@268: "// BEGIN: day.end.bridges.Digest\n" + jtulach@268: " DigestImplementation impl = DigestImplementation.create(digestor, algorithm);\n" + jtulach@268: "// END: day.end.bridges.Digest\n"; jtulach@268: jtulach@268: File src = createFile(1, "C.java", c1); jtulach@268: jtulach@268: jtulach@268: String c2 = jtulach@268: "@day.end.bridges.Digest@"; jtulach@268: File txt = createFile(2, "in.txt", c2); jtulach@268: jtulach@268: File out = createFile(3, "out.txt", ""); jtulach@268: out.delete(); jtulach@268: jtulach@268: execute(1, 2, "-Dfile1=" + txt, "-Dfile2=" + out, "-Dinclude1=*.java"); jtulach@268: } jtulach@268: jtulach@268: public void testNotClosedSection() throws Exception { jtulach@268: String c1 = jtulach@268: "package ahoj;\n" + jtulach@268: "// BEGIN: clazz\n" + jtulach@268: "int x;\n" + jtulach@268: "\n"; jtulach@268: File src = createFile(1, "I.java", c1); jtulach@268: jtulach@268: jtulach@268: String c2 = jtulach@268: "@clazz@"; jtulach@268: File txt = createFile(2, "in.txt", c2); jtulach@268: jtulach@268: File out = createFile(3, "out.txt", ""); jtulach@268: out.delete(); jtulach@268: jtulach@268: try { jtulach@268: execute(1, 2, "-Dfile1=" + txt, "-Dfile2=" + out, "-Dinclude1=*.java"); jtulach@268: fail("Has to fail"); jtulach@268: } catch (ExecuteUtils.ExecutionError ex) { jtulach@268: // ok jtulach@268: } jtulach@268: } jtulach@268: public void testLongNotLineDetectedAsNotInTheList() throws Exception { jtulach@268: String c1 = jtulach@268: "package org.apidesign.api.security;\n" + jtulach@268: "" + jtulach@268: "import java.nio.ByteBuffer;\n" + jtulach@268: "import java.util.ServiceLoader;\n" + jtulach@268: "import org.apidesign.spi.security.Digestor;\n" + jtulach@268: "\n" + jtulach@268: "/** Simplified version of a Digest class that allows to compute a fingerprint\n" + jtulach@268: " * for buffer of data.\n" + jtulach@268: " *\n" + jtulach@268: " * @author Jaroslav Tulach \n" + jtulach@268: " */\n" + jtulach@268: " DigestImplementation impl = DigestImplementation.create(digestor, algorithm);\n" + jtulach@268: "// BEGIN: day.end.bridges.Digest\n" + jtulach@268: " DigestImplementation impl = null\n" + jtulach@268: "// END: day.end.bridges.Digest\n"; jtulach@268: jtulach@268: File src = createFile(1, "C.java", c1); jtulach@268: jtulach@268: jtulach@268: String c2 = jtulach@268: "@day.end.bridges.Digest@"; jtulach@268: File txt = createFile(2, "in.txt", c2); jtulach@268: jtulach@268: File out = createFile(3, "out.txt", ""); jtulach@268: out.delete(); jtulach@268: jtulach@268: execute(1, 2, "-Dfile1=" + txt, "-Dfile2=" + out, "-Dinclude1=*.java"); jtulach@268: } jtulach@268: jtulach@268: protected final File createFile(int slot, String name, String content) throws Exception { jtulach@268: File d1 = new File(getWorkDir(), "dir" + slot); jtulach@268: File c1 = new File(d1, name); jtulach@268: copy(content, c1); jtulach@268: return c1; jtulach@268: } jtulach@268: jtulach@268: protected final void execute(int slotFirst, int slotSecond, String... additionalArgs) throws Exception { jtulach@268: File d1 = new File(getWorkDir(), "dir" + slotFirst); jtulach@268: File d2 = new File(getWorkDir(), "dir" + slotSecond); jtulach@268: File out = new File(getWorkDir(), "out"); jtulach@268: jtulach@268: File build = new File(getWorkDir(), "build.xml"); jtulach@268: extractResource("copy.xml", build); jtulach@268: jtulach@268: List args = new ArrayList(); jtulach@268: args.addAll(Arrays.asList(additionalArgs)); jtulach@268: args.add("-Ddir1=" + d1); jtulach@268: args.add("-Ddir2=" + d2); jtulach@268: args.add("-Dout.dir=" + out); jtulach@268: ExecuteUtils.execute(build, args.toArray(new String[0])); jtulach@268: } jtulach@268: jtulach@268: private static final void copy(String txt, File f) throws Exception { jtulach@268: f.getParentFile().mkdirs(); jtulach@268: FileWriter w = new FileWriter(f); jtulach@268: w.append(txt); jtulach@268: w.close(); jtulach@268: } jtulach@268: jtulach@268: final File extractResource(String res, File f) throws Exception { jtulach@268: URL u = GrepCopyTest.class.getResource(res); jtulach@268: assertNotNull ("Resource should be found " + res, u); jtulach@268: jtulach@268: FileOutputStream os = new FileOutputStream(f); jtulach@268: InputStream is = u.openStream(); jtulach@268: for (;;) { jtulach@268: int ch = is.read (); jtulach@268: if (ch == -1) { jtulach@268: break; jtulach@268: } jtulach@268: os.write (ch); jtulach@268: } jtulach@268: os.close (); jtulach@268: jtulach@268: return f; jtulach@268: } jtulach@268: jtulach@268: final String readFile (String name) throws java.io.IOException { jtulach@268: File f = new File(new File(getWorkDir(), "out"), name); jtulach@268: if (!f.exists()) { jtulach@268: throw new FileNotFoundException(f.getPath()); jtulach@268: } jtulach@268: jtulach@268: int s = (int)f.length (); jtulach@268: byte[] data = new byte[s]; jtulach@268: assertEquals ("Read all data", s, new java.io.FileInputStream (f).read (data)); jtulach@268: jtulach@268: return new String (data); jtulach@268: } jtulach@268: jtulach@268: final File extractString (String res, String nameExt) throws Exception { jtulach@268: File f = new File(getWorkDir(), nameExt); jtulach@268: f.deleteOnExit (); jtulach@268: jtulach@268: FileOutputStream os = new FileOutputStream(f); jtulach@268: InputStream is = new ByteArrayInputStream(res.getBytes("UTF-8")); jtulach@268: for (;;) { jtulach@268: int ch = is.read (); jtulach@268: if (ch == -1) { jtulach@268: break; jtulach@268: } jtulach@268: os.write (ch); jtulach@268: } jtulach@268: os.close (); jtulach@268: jtulach@268: return f; jtulach@268: } jtulach@268: jtulach@268: }