You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ResourceCopyTestCase.java 9.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. /* *******************************************************************
  2. * Copyright (c) 2003 Contributors.
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Common Public License v1.0
  6. * which accompanies this distribution and is available at
  7. * http://www.eclipse.org/legal/cpl-v10.html
  8. *
  9. * Contributors:
  10. * Mik Kersten initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.ajde;
  13. import java.io.*;
  14. import java.util.*;
  15. import java.util.jar.JarInputStream;
  16. import java.util.zip.*;
  17. import org.aspectj.util.FileUtil;
  18. /**
  19. * @author websterm
  20. */
  21. public class ResourceCopyTestCase extends AjdeTestCase {
  22. public static final String PROJECT_DIR = "bug-36071a";
  23. public static final String srcDir = PROJECT_DIR + "/src";
  24. public static final String binDir = "bin";
  25. public static final String injar1Name = "input1.jar";
  26. public static final String injar2Name = "input2.jar";
  27. public static final String outjarName = "/bin/output.jar";
  28. /**
  29. * Constructor for JarResourceCopyTestCase.
  30. * @param arg0
  31. */
  32. public ResourceCopyTestCase(String arg0) {
  33. super(arg0);
  34. }
  35. /*
  36. * Ensure the output directpry in clean
  37. */
  38. protected void setUp() throws Exception {
  39. super.setUp(PROJECT_DIR);
  40. FileUtil.deleteContents(openFile(binDir));
  41. }
  42. public void testSrcToBin () {
  43. assertTrue(!Ajde.getDefault().getTaskListManager().hasWarning());
  44. assertTrue("Build failed",doSynchronousBuild("config1.lst"));
  45. compareDirs("src","bin");
  46. }
  47. public void testInjarsToOutjar () {
  48. Set injars = new HashSet();
  49. File injar1 = openFile(injar1Name);
  50. injars.add(injar1);
  51. ideManager.getProjectProperties().setInJars(injars);
  52. File outjar = openFile(outjarName);
  53. ideManager.getProjectProperties().setOutJar(outjar.getAbsolutePath());
  54. assertTrue("Build failed",doSynchronousBuild("config2.lst"));
  55. assertTrue("Build warnings",ideManager.getCompilationSourceLineTasks().isEmpty());
  56. compareJars(injar1,"src",outjar);
  57. }
  58. public void testDuplicateResources () {
  59. Set injars = new HashSet();
  60. File injar1 = openFile(injar1Name);
  61. File injar2 = openFile(injar2Name);
  62. injars.add(injar1);
  63. injars.add(injar2);
  64. ideManager.getProjectProperties().setInJars(injars);
  65. File outjar = openFile(outjarName);
  66. ideManager.getProjectProperties().setOutJar(outjar.getAbsolutePath());
  67. assertTrue("Build should have suceeded",doSynchronousBuild("config2.lst"));
  68. assertFalse("Build warnings for duplicate resource expected",ideManager.getCompilationSourceLineTasks().isEmpty());
  69. List msgs = NullIdeManager.getIdeManager().getCompilationSourceLineTasks();
  70. assertTrue("Wrong message",((NullIdeTaskListManager.SourceLineTask)msgs.get(0)).message.getMessage().startsWith("duplicate resource: "));
  71. compareJars(injar1,"src",outjar);
  72. }
  73. public void testSrcToOutjar () {
  74. File outjar = openFile(outjarName);
  75. ideManager.getProjectProperties().setOutJar(outjar.getAbsolutePath());
  76. assertTrue("Build failed",doSynchronousBuild("config1.lst"));
  77. compareSourceToOutjar("src",outjar);
  78. }
  79. public void testInjarsToBin () {
  80. Set injars = new HashSet();
  81. File injar1 = openFile(injar1Name);
  82. injars.add(injar1);
  83. ideManager.getProjectProperties().setInJars(injars);
  84. assertTrue("Build failed",doSynchronousBuild("config2.lst"));
  85. assertTrue("Build warnings",ideManager.getCompilationSourceLineTasks().isEmpty());
  86. compareInjarsToBin(injar1,"src","bin");
  87. }
  88. public void testInjarsToOddBin () {
  89. Set injars = new HashSet();
  90. File injar1 = openFile(injar1Name);
  91. injars.add(injar1);
  92. ideManager.getProjectProperties().setOutputPath("crazy.jar");
  93. ideManager.getProjectProperties().setInJars(injars);
  94. assertTrue("Build failed",doSynchronousBuild("config2.lst"));
  95. assertTrue("Build warnings",ideManager.getCompilationSourceLineTasks().isEmpty());
  96. compareInjarsToBin(injar1,"src","crazy.jar");
  97. }
  98. public void testInjarsToOutjarOddNames () {
  99. Set injars = new HashSet();
  100. File injar1 = openFile("input1");
  101. File outjar = openFile(outjarName+".fozout");
  102. injars.add(injar1);
  103. ideManager.getProjectProperties().setInJars(injars);
  104. ideManager.getProjectProperties().setOutJar(outjar.getAbsolutePath());
  105. assertTrue("Build failed",doSynchronousBuild("config2.lst"));
  106. assertTrue("Build warnings",ideManager.getCompilationSourceLineTasks().isEmpty());
  107. compareJars(injar1,"src",outjar);
  108. }
  109. /*
  110. * Ensure bin contains all non-Java resouces from source and injars
  111. */
  112. public void compareDirs (String indirName, String outdirName) {
  113. File binBase = openFile(outdirName);
  114. File[] toResources = FileUtil.listFiles(binBase,aspectjResourceFileFilter);
  115. HashSet resources = new HashSet();
  116. listSourceResources(indirName,resources);
  117. for (int i = 0; i < toResources.length; i++) {
  118. String fileName = FileUtil.normalizedPath(toResources[i],binBase);
  119. boolean b = resources.remove(fileName);
  120. assertTrue("Extraneous resources: " + fileName,b);
  121. }
  122. assertTrue("Missing resources: " + resources.toString(), resources.isEmpty());
  123. }
  124. /*
  125. * Ensure -outjar contains all non-Java resouces from injars
  126. */
  127. public void compareJars (File injarFile, String indirName, File outjarFile) {
  128. HashSet resources = new HashSet();
  129. try {
  130. assertTrue("outjar older than injar",(outjarFile.lastModified() > injarFile.lastModified()));
  131. byte[] inManifest = listJarResources(injarFile,resources);
  132. listSourceResources(indirName,resources);
  133. ZipInputStream outjar = new ZipInputStream(new java.io.FileInputStream(outjarFile));
  134. ZipEntry entry;
  135. while (null != (entry = outjar.getNextEntry())) {
  136. String fileName = entry.getName();
  137. if (!fileName.endsWith(".class")) {
  138. /* Ensure we copied right JAR manifest */
  139. if (fileName.equalsIgnoreCase("meta-inf/Manifest.mf")) {
  140. byte[] outManifest = FileUtil.readAsByteArray(outjar);
  141. assertTrue("Wrong manifest has been copied",Arrays.equals(inManifest,outManifest));
  142. }
  143. boolean b = resources.remove(fileName);
  144. assertTrue(fileName,b);
  145. }
  146. outjar.closeEntry();
  147. }
  148. outjar.close();
  149. assertTrue(resources.toString(),resources.isEmpty());
  150. }
  151. catch (IOException ex) {
  152. fail(ex.toString());
  153. }
  154. }
  155. /*
  156. * Ensure -outjar conatins all non-Java resouces from source and injars
  157. */
  158. public void compareSourceToOutjar (String indirName, File outjarFile) {
  159. HashSet resources = new HashSet();
  160. listSourceResources(indirName,resources);
  161. try {
  162. ZipInputStream outjar = new JarInputStream(new java.io.FileInputStream(outjarFile));
  163. ZipEntry entry;
  164. while (null != (entry = outjar.getNextEntry())) {
  165. String fileName = entry.getName();
  166. if (!fileName.endsWith(".class")) {
  167. boolean b = resources.remove(fileName);
  168. assertTrue(fileName,b);
  169. }
  170. outjar.closeEntry();
  171. }
  172. outjar.close();
  173. assertTrue("Missing resources: " + resources.toString(), resources.isEmpty());
  174. }
  175. catch (IOException ex) {
  176. fail(ex.toString());
  177. }
  178. }
  179. /*
  180. * Ensure bin contains all non-Java resouces from source and injars
  181. */
  182. public void compareInjarsToBin(File injarFile, String indirName, String outdirName) {
  183. HashSet resources = new HashSet();
  184. try {
  185. byte[] inManifest = listJarResources(injarFile,resources);
  186. listSourceResources(indirName,resources);
  187. File binBase = openFile(outdirName);
  188. File[] toResources = FileUtil.listFiles(binBase,aspectjResourceFileFilter);
  189. for (int i = 0; i < toResources.length; i++) {
  190. String fileName = FileUtil.normalizedPath(toResources[i],binBase);
  191. /* Ensure we copied the right JAR manifest */
  192. if (fileName.equalsIgnoreCase("meta-inf/Manifest.mf")) {
  193. byte[] outManifest = FileUtil.readAsByteArray(toResources[i]);
  194. assertTrue("Wrong manifest has been copied",Arrays.equals(inManifest,outManifest));
  195. }
  196. boolean b = resources.remove(fileName);
  197. assertTrue("Extraneous resources: " + fileName,b);
  198. }
  199. assertTrue("Missing resources: " + resources.toString(), resources.isEmpty());
  200. }
  201. catch (IOException ex) {
  202. fail(ex.toString());
  203. }
  204. }
  205. private void listSourceResources (String indirName, Set resources) {
  206. File srcBase = openFile(indirName);
  207. File[] fromResources = FileUtil.listFiles(srcBase,aspectjResourceFileFilter);
  208. for (int i = 0; i < fromResources.length; i++) {
  209. String name = FileUtil.normalizedPath(fromResources[i],srcBase);
  210. if (!name.startsWith("CVS/") && (-1 == name.indexOf("/CVS/")) && !name.endsWith("/CVS")) {
  211. resources.add(name);
  212. }
  213. }
  214. }
  215. private byte[] listJarResources (File injarFile, Set resources) {
  216. byte[] manifest = null;
  217. try {
  218. ZipInputStream injar = new ZipInputStream(new java.io.FileInputStream(injarFile));
  219. ZipEntry entry;
  220. while (null != (entry = injar.getNextEntry())) {
  221. String fileName = entry.getName();
  222. if (!entry.isDirectory() && !fileName.endsWith(".class")) {
  223. /* JAR manifests shouldn't be copied */
  224. if (fileName.equalsIgnoreCase("meta-inf/Manifest.mf")) {
  225. manifest = FileUtil.readAsByteArray(injar);
  226. }
  227. resources.add(fileName);
  228. }
  229. injar.closeEntry();
  230. }
  231. injar.close();
  232. }
  233. catch (IOException ex) {
  234. fail(ex.toString());
  235. }
  236. return manifest;
  237. }
  238. public static final FileFilter aspectjResourceFileFilter = new FileFilter() {
  239. public boolean accept(File pathname) {
  240. String name = pathname.getName().toLowerCase();
  241. return (!name.endsWith(".class") && !name.endsWith(".java") && !name.endsWith(".aj"));
  242. }
  243. };
  244. }