package org.eclipse.buckminster.pde.test; import java.io.File; import java.io.FileFilter; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.eclipse.buckminster.core.CorePlugin; import org.eclipse.buckminster.core.actor.IPerformManager; import org.eclipse.buckminster.core.helpers.BMProperties; import org.eclipse.buckminster.core.metadata.WorkspaceInfo; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; public class RootFilesTest extends PDETestCase { public void testRootsNotFlattened() throws Exception { File projectFolder = getTestData("rootfiles"); File[] dirList = projectFolder.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return !pathname.getName().startsWith("."); } }); assertTrue(projectFolder.getAbsolutePath() + " is not a directory", dirList != null); assertEquals("Incorrect number of folders in directory " + projectFolder.getAbsolutePath(), 4, dirList.length); IProgressMonitor monitor = new NullProgressMonitor(); IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspaceRoot wsRoot = workspace.getRoot(); ArrayList<IProject> boundProjects = new ArrayList<IProject>(); // Bind projects for (File projDir : dirList) { IPath locationPath = Path.fromOSString(projDir.getAbsolutePath()); IProjectDescription description = workspace.loadProjectDescription(locationPath.append(".project")); //$NON-NLS-1$ IProject project = wsRoot.getProject(description.getName()); project.create(description, monitor); project.open(monitor); boundProjects.add(project); } // The buckminster.properties will redirect the build result to this // location IProject result = wsRoot.getProject("result"); if (result.exists()) result.delete(true, true, monitor); result.create(monitor); result.open(monitor); // Assert that we build OK workspace.build(IncrementalProjectBuilder.FULL_BUILD, monitor); boolean errors = false; List<String> messages = new ArrayList<String>(); for (IProject project : boundProjects) { IMarker[] markers = project.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE); for (IMarker marker : markers) { if (marker.getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO) == IMarker.SEVERITY_ERROR) errors = true; messages.add(marker.getAttribute(IMarker.LOCATION, "<unknown location>") + ": " + marker.getAttribute(IMarker.MESSAGE, "<unknown problem>")); } } if (errors) { for (String message : messages) System.out.println(message); fail(); } // Load the properties IProject siteFeature = wsRoot.getProject("test.update"); InputStream inStream = siteFeature.getFile("build.properties").getContents(); Map<String, String> props = new BMProperties(inStream); inStream.close(); IPerformManager performManager = CorePlugin.getPerformManager(); performManager.perform(Collections.singletonList(WorkspaceInfo.getCSpec(siteFeature).getAttribute("site.p2")), props, false, true, monitor); // Assert that both bundles were created and published result.refreshLocal(IResource.DEPTH_INFINITE, monitor); IFolder binary = result.getFolder("test.update_1.0.0-eclipse.feature/site.p2/binary"); assertTrue("No binary folder was created in p2 repository", binary.exists()); IResource[] binaryFiles = binary.members(); assertEquals("Unexpected number of files in binary folder", 2, binaryFiles.length); List<String> allRoots = new ArrayList<String>(); IFile binFile = (IFile) binaryFiles[0]; ZipInputStream zi = new ZipInputStream(binFile.getContents()); ZipEntry ze; while ((ze = zi.getNextEntry()) != null) if (!ze.isDirectory()) allRoots.add(ze.getName()); zi.close(); binFile = (IFile) binaryFiles[1]; zi = new ZipInputStream(binFile.getContents()); while ((ze = zi.getNextEntry()) != null) if (!ze.isDirectory()) allRoots.add(ze.getName()); zi.close(); System.out.println(allRoots); assertEquals("Unexpected number of root files", 4, allRoots.size()); assertTrue("Root file mycfg1/test.txt is missing", allRoots.contains("mycfg1/test.txt")); assertTrue("Root file mycfg1/test/launcher is missing", allRoots.contains("mycfg1/test/launcher")); assertTrue("Root file mycfg1/test/test2.txt is missing", allRoots.contains("mycfg1/test/test2.txt")); assertTrue("Root file jvm/java is missing", allRoots.contains("jvm/java")); } }