View Javadoc
1   /*
2    * #%L
3    * IsisFish
4    * 
5    * $Id: CompileHelperTest.java 4156 2014-12-09 11:27:18Z echatellier $
6    * $HeadURL: https://svn.codelutin.com/isis-fish/tags/isis-fish-4.4.0.2/src/test/java/fr/ifremer/isisfish/util/CompileHelperTest.java $
7    * %%
8    * Copyright (C) 2009 - 2010 Ifremer, Code Lutin
9    * %%
10   * This program is free software: you can redistribute it and/or modify
11   * it under the terms of the GNU General Public License as
12   * published by the Free Software Foundation, either version 3 of the 
13   * License, or (at your option) any later version.
14   * 
15   * This program is distributed in the hope that it will be useful,
16   * but WITHOUT ANY WARRANTY; without even the implied warranty of
17   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18   * GNU General Public License for more details.
19   * 
20   * You should have received a copy of the GNU General Public 
21   * License along with this program.  If not, see
22   * <http://www.gnu.org/licenses/gpl-3.0.html>.
23   * #L%
24   */
25  
26  package fr.ifremer.isisfish.util;
27  
28  import java.io.File;
29  import java.io.IOException;
30  import java.net.URL;
31  import java.net.URLClassLoader;
32  import java.util.ArrayList;
33  import java.util.Collections;
34  import java.util.List;
35  
36  import org.apache.commons.io.FileUtils;
37  import org.apache.commons.logging.Log;
38  import org.apache.commons.logging.LogFactory;
39  import org.junit.Assert;
40  import org.junit.Test;
41  import org.nuiton.util.FileUtil;
42  
43  import fr.ifremer.isisfish.AbstractIsisFishTest;
44  import fr.ifremer.isisfish.equation.PopulationReproductionEquation;
45  
46  /**
47   * CompileHelperTest.
48   * 
49   * Created: 12 janv. 2006 16:20:33
50   * 
51   * @author poussin
52   * 
53   * @version $Revision: 4156 $
54   * 
55   * Last update: $Date: 2014-12-09 12:27:18 +0100 (Tue, 09 Dec 2014) $
56   * by : $Author: echatellier $
57   */
58  public class CompileHelperTest extends AbstractIsisFishTest {
59  
60      /** Class logger */
61      private static Log log = LogFactory.getLog(CompileHelperTest.class);
62  
63      /**
64       * Return a Java code content in Java 6.
65       * 
66       * @param name Class name
67       * 
68       * @return java code
69       */
70      protected String getFirstClassContent(String name) {
71          StringBuffer content = new StringBuffer();
72          content.append("public class " + name + " {");
73          content.append("    /** Java 6 code */");
74          content.append("    public boolean isEmpty(String s) {");
75          content.append("        return s.isEmpty();");
76          content.append("    }");
77          content.append("}");
78          return content.toString();
79      }
80  
81      /**
82       * Return a Java code content in Java 6 that extends a class.
83       * 
84       * @param name
85       * @param extendsName
86       * @return java code
87       */
88      protected String getSecondClassContent(String name, String extendsName) {
89          StringBuffer content = new StringBuffer();
90          content.append("public class " + name + " extends " + extendsName
91                  + " {");
92          content.append("    @Override");
93          content.append("    public boolean isEmpty(String s) {");
94          content.append("        return false;");
95          content.append("    }");
96          content.append("}");
97          return content.toString();
98      }
99  
100     /**
101      * Test une compilation de classe et une
102      * instantiation de la classe compilée.
103      * 
104      * @throws IOException 
105      * @throws ClassNotFoundException 
106      */
107     @Test
108     public void testCompile() throws IOException, ClassNotFoundException {
109         File f = File.createTempFile("testCompile", ".java", getTestDirectory());
110         String filename = FileUtil.basename(f, ".java");
111         String code = getFirstClassContent(filename);
112         FileUtils.writeStringToFile(f, code);
113 
114         List<File> classpath = new ArrayList<File>();
115         classpath.add(f.getParentFile());
116 
117         CompileHelper.compile(classpath, Collections.singletonList(f), f
118                 .getParentFile(), null);
119 
120         // essai de chargement de la classe
121         URL[] cp = new URL[] { f.getParentFile().toURI().toURL() };
122         try (URLClassLoader cl = new URLClassLoader(cp)) {
123             Class<?> c = cl.loadClass(filename);
124             log.info("class name: " + c.getName());
125             Assert.assertEquals(filename, c.getName());
126         }
127 
128         // delete
129         File fclass = new File(f.getAbsolutePath().replaceAll("java$", "class"));
130         fclass.delete();
131         f.delete();
132     }
133 
134     /**
135      * Test de compiler deux classes dont l'un etend l'autre.
136      * Puis instancie les deux.
137      * @throws IOException 
138      * @throws ClassNotFoundException 
139      */
140     @Test
141     public void testCompileDepend() throws IOException, ClassNotFoundException {
142 
143         File fA = File.createTempFile("testCompileA", ".java", getTestDirectory());
144         String filenameA = FileUtil.basename(fA, ".java");
145         String codeA = getFirstClassContent(filenameA);
146         FileUtils.writeStringToFile(fA, codeA);
147 
148         File fB = File.createTempFile("testCompileB", ".java", getTestDirectory());
149         String filenameB = FileUtil.basename(fB, ".java");
150         String codeB = getSecondClassContent(filenameB, filenameA);
151         FileUtils.writeStringToFile(fB, codeB);
152 
153         File dest = new File(fB.getParentFile(), "testCompile");
154 
155         List<File> classpath = new ArrayList<File>();
156         classpath.add(fB.getParentFile());
157         int result = CompileHelper.compile(classpath, Collections.singletonList(fB), dest, null);
158         Assert.assertEquals(0, result);
159 
160         // essai de chargement de la classe
161         URL[] cp = new URL[] { dest.toURI().toURL() };
162         try (URLClassLoader cl = new URLClassLoader(cp)) {
163             Class<?> c = cl.loadClass(filenameB);
164             log.info("class name: " + c.getName());
165             Assert.assertEquals(filenameB, c.getName());
166         }
167 
168         // essai de chargement de la classe
169         cp = new URL[] { dest.toURI().toURL() };
170         //URL[] cp = new URL[] { dest.toURL() };
171         try (URLClassLoader cl = new URLClassLoader(cp)) {
172             Class<?> c = cl.loadClass(filenameA);
173             log.info("class name: " + c.getName());
174             Assert.assertEquals(filenameA, c.getName());
175         }
176 
177         // delete
178         File fclassA = new File(fA.getAbsolutePath().replaceAll("java$",
179                 "class"));
180         fclassA.delete();
181         File fclassB = new File(fB.getAbsolutePath().replaceAll("java$",
182                 "class"));
183         fclassB.delete();
184         fA.delete();
185         fB.delete();
186         FileUtils.deleteQuietly(dest);
187     }
188 
189     /**
190      * Test que le contenu du fichier java correspondant à l'equation est
191      * corectement généré.
192      * Notemment suite à l'utilsation de paranamer et aux retrait des
193      * annotations.
194      */
195     @Test
196     public void testExtractDoc() {
197         String content = CompileHelper.extractDoc("PopulationReproduction", "Test", PopulationReproductionEquation.class);
198         
199         Assert.assertTrue(content.contains("N : org.nuiton.math.matrix.MatrixND"));
200         Assert.assertTrue(content.contains("zones : java.util.List<Zone>"));
201     }
202 }