/** * Copyright (c) 2002-2010 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM - Initial API and implementation */ package org.eclipse.emf.test.build; import java.io.File; import java.util.Arrays; import java.util.Enumeration; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarFile; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class BuildTest extends TestCase { protected final static String REGEX_SYMBOL = ",/,"; protected final static String[] REQUIRED_FEATURE_FILES = {"eclipse_update_120.jpg", "epl-v10.html", "feature.properties", "feature.xml", "license.html"}; protected final static String[] REQUIRED_REGULAR_PLUGIN_FILES = {"about.html", "plugin.properties", "META-INF/MANIFEST.MF"}; protected final static String[] REQUIRED_DOC_PLUGIN_FILES = {"toc.xml", "topics_Reference.xml"}; protected final static String[] REQUIRED_BRANDING_PLUGIN_FILES = {"about.ini", "about.mappings", "about.properties", "modeling32.png"}; protected static int expectedNumberOfDocPlugins = 2; protected static int expectedNumberOfSourcePlugins = 51; protected File featuresDir; protected File pluginsDir; protected Set<String> brandingPluginNames; public BuildTest(String name) { super(name); } public static Test suite() { TestSuite ts = new TestSuite("BuildTests"); ts.addTest(new BuildTest("testFeatures")); ts.addTest(new BuildTest("testPlugins")); return ts; } @Override protected void setUp() throws Exception { String directory = TestUtil.getPluginDirectory(); if (directory.indexOf(".metadata") < 0) { File dir = new File(directory).getAbsoluteFile().getParentFile(); if ("plugins".equals(dir.getName())) { pluginsDir = dir; } dir = new File(dir.getParentFile(), "features"); if (dir.isDirectory()) { featuresDir = dir; } } } protected boolean isFeatureToTest(File feature) { return feature.isDirectory() && isFileToTest(feature); } protected boolean isPluginToTest(File plugin) { return isFileToTest(plugin) && !plugin.getName().endsWith("-feature"); } protected boolean isFileToTest(File plugin) { String name = plugin.getName(); return (name.startsWith("org.eclipse.emf") || name.startsWith("org.eclipse.xsd")) && !name.equals("org.eclipse.emf.releng.build") && !name.equals("org.eclipse.emf.examples.jet.article2"); } public void testFeatures() throws Exception { assertNotNull("Features Dir '" + featuresDir + "' is null", featuresDir); assertTrue("Features Dir '" + featuresDir + "' is not a directory", featuresDir.isDirectory()); StringBuffer result = new StringBuffer(); File[] features = featuresDir.listFiles(); for (int i = 0; i < features.length; i++) { File feature = features[i]; if (isFeatureToTest(feature)) { String name = feature.getName().replaceAll("(_\\d\\.\\d\\.\\d)?(\\.jar)?$", ""); if (name.equals("org.eclipse.emf.sdk")) { if (brandingPluginNames == null) { brandingPluginNames = new HashSet<String>(); } brandingPluginNames.add(name); } String missingFiles = getMissingFiles(feature, REQUIRED_FEATURE_FILES); if (missingFiles.length() > 0) { result.append(",").append(missingFiles); } } } if (result.length() > 0) { result.deleteCharAt(0); } assertTrue("'" + result.toString() + "' is not of length 0", result.length() == 0); } public void testPlugins() throws Exception { assertNotNull("Plugin Dir '" + pluginsDir + "' is null", pluginsDir); assertTrue("Plugin Dir '" + pluginsDir + "' is not a directory", pluginsDir.isDirectory()); StringBuffer result = new StringBuffer(); int docPluginsCounter = 0; int brandingPluginsCounter = 0; int sourcePluginsCounter = 0; File[] plugins = pluginsDir.listFiles(); for (int i = 0; i < plugins.length; i++) { File plugin = plugins[i]; if (isPluginToTest(plugin)) { JarFile jarFile = plugin.isFile() ? new JarFile(plugin) : null; String name = plugin.getName().replaceAll("(_\\d\\.\\d\\.\\d(\\..*)?)?(\\.jar)?$", ""); if (isDocPlugin(name)) { docPluginsCounter++; String missingFiles = jarFile == null ? getMissingFiles(plugin, REQUIRED_DOC_PLUGIN_FILES) : getMissingFiles(jarFile, REQUIRED_DOC_PLUGIN_FILES); if (missingFiles.length() > 0) { result.append(",").append(missingFiles); } } if (isBrandingPlugin(name)) { brandingPluginsCounter++; String missingFiles = jarFile == null ? getMissingFiles(plugin, REQUIRED_BRANDING_PLUGIN_FILES) : getMissingFiles(jarFile, REQUIRED_BRANDING_PLUGIN_FILES); if (missingFiles.length() > 0) { result.append(",").append(missingFiles); } } if (isSourcePlugin(name)) { sourcePluginsCounter++; File srcDir = new File(plugin, "src"); // Old multi-plugin source plugins had a src directory. // assertFalse("Source plugin '" + plugin + "' is not of new single-plugin style", srcDir.exists()); } { String missingFiles = jarFile == null ? getMissingFiles(plugin, REQUIRED_REGULAR_PLUGIN_FILES) : getMissingFiles(jarFile, REQUIRED_REGULAR_PLUGIN_FILES); if (missingFiles.length() > 0) { result.append(",").append(missingFiles); } } } } if (result.length() > 0) { result.deleteCharAt(0); } assertTrue("'" + result.toString() + "' is not of length 0", result.length() == 0); assertEquals("Expected number of doc plugins is not " + expectedNumberOfDocPlugins, expectedNumberOfDocPlugins, docPluginsCounter); assertEquals("Expected number of source plugins is not " + expectedNumberOfSourcePlugins, expectedNumberOfSourcePlugins, sourcePluginsCounter); assertEquals("Expected number of branding plugins is not " + brandingPluginNames.size(), brandingPluginNames.size(), brandingPluginsCounter); } protected String getMissingFiles(File dir, String[] requiredFiles) { assertTrue("Directory '" + dir + "' is not a directory", dir.isDirectory()); StringBuffer result = new StringBuffer(); for (int i = 0; i < requiredFiles.length; i++) { String requiredFile = requiredFiles[i]; boolean isDirectory = requiredFile.endsWith("/"); if (requiredFile.startsWith(REGEX_SYMBOL)) { boolean found = false; String regex = requiredFile.substring(REGEX_SYMBOL.length()); requiredFile = "[" + regex + "]"; File[] files = dir.listFiles(); for (File file : files) { if (file.getName().matches(regex)) { found = isDirectory ? file.isDirectory() : file.isFile(); if (found) { break; } } } if (!found) { result.append(",").append(dir.getAbsolutePath()+File.separator+requiredFile); } } else { File file = new File(dir, requiredFiles[i]); if (isDirectory ? file.isFile() : file.isDirectory()) { result.append(",").append(file.getAbsoluteFile()); } } } return result.length() > 0 ? result.deleteCharAt(0).toString() : ""; } protected String getMissingFiles(JarFile jar, String[] requiredFiles) { Set<String> requiredFilesSet = new HashSet<String>(Arrays.asList(requiredFiles)); for (Enumeration<JarEntry> e = jar.entries(); e.hasMoreElements();) { JarEntry entry = e.nextElement(); String name = entry.getName(); requiredFilesSet.remove(name); } if(requiredFilesSet.isEmpty()) { return ""; } else { StringBuffer result = new StringBuffer(); for (Iterator<String> i = requiredFilesSet.iterator(); i.hasNext();) { result.append(",").append(jar.getName()).append("-").append(i.next()); } return result.deleteCharAt(0).toString(); } } protected boolean isDocPlugin(String name) { return name.endsWith(".doc"); } protected boolean isSourcePlugin(String name) { return name.endsWith(".source"); } protected boolean isBrandingPlugin(String name) { if (brandingPluginNames == null) { brandingPluginNames = retrieveBrandingPluginNames(); } return brandingPluginNames.contains(name); } protected Set<String> retrieveBrandingPluginNames() { Set<String> brandingPluginNames = new HashSet<String>(); brandingPluginNames.add("org.eclipse.emf"); brandingPluginNames.add("org.eclipse.emf.codegen"); brandingPluginNames.add("org.eclipse.emf.codegen.ecore"); brandingPluginNames.add("org.eclipse.emf.codegen.ecore.ui"); brandingPluginNames.add("org.eclipse.emf.codegen.ui"); brandingPluginNames.add("org.eclipse.emf.common"); brandingPluginNames.add("org.eclipse.emf.common.ui"); brandingPluginNames.add("org.eclipse.emf.converter"); brandingPluginNames.add("org.eclipse.emf.databinding"); brandingPluginNames.add("org.eclipse.emf.databinding.edit"); brandingPluginNames.add("org.eclipse.emf.doc"); brandingPluginNames.add("org.eclipse.emf.ecore"); brandingPluginNames.add("org.eclipse.emf.ecore.edit"); brandingPluginNames.add("org.eclipse.emf.ecore.editor"); brandingPluginNames.add("org.eclipse.emf.edit"); brandingPluginNames.add("org.eclipse.emf.edit.ui"); brandingPluginNames.add("org.eclipse.emf.examples"); brandingPluginNames.add("org.eclipse.emf.examples.source"); brandingPluginNames.add("org.eclipse.emf.mapping"); brandingPluginNames.add("org.eclipse.emf.mapping.ecore"); brandingPluginNames.add("org.eclipse.emf.mapping.ecore.editor"); brandingPluginNames.add("org.eclipse.emf.mapping.ui"); brandingPluginNames.add("org.eclipse.emf.rap"); brandingPluginNames.add("org.eclipse.emf.rap.common.ui"); brandingPluginNames.add("org.eclipse.emf.rap.edit.ui"); brandingPluginNames.add("org.eclipse.emf.rap.source"); brandingPluginNames.add("org.eclipse.emf.source"); brandingPluginNames.add("org.eclipse.emf.tests"); brandingPluginNames.add("org.eclipse.xsd"); brandingPluginNames.add("org.eclipse.xsd.doc"); brandingPluginNames.add("org.eclipse.xsd.ecore.converter"); brandingPluginNames.add("org.eclipse.xsd.edit"); brandingPluginNames.add("org.eclipse.xsd.editor"); brandingPluginNames.add("org.eclipse.xsd.example"); brandingPluginNames.add("org.eclipse.xsd.mapping"); brandingPluginNames.add("org.eclipse.xsd.mapping.editor"); brandingPluginNames.add("org.eclipse.xsd.source"); return brandingPluginNames; } }