1 /******************************************************************************* 2 * Copyright (c) 2000, 2017 IBM Corporation and others. 3 * 4 * This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * which accompanies this distribution, and is available at 7 * https://www.eclipse.org/legal/epl-2.0/ 8 * 9 * SPDX-License-Identifier: EPL-2.0 10 * 11 * Contributors: 12 * IBM Corporation - initial API and implementation 13 * James Blackburn (Broadcom Corp.) - ongoing development 14 *******************************************************************************/ 15 package org.eclipse.core.tests.internal.builders; 16 17 import java.io.ByteArrayInputStream; 18 import java.io.InputStream; 19 import java.util.Map; 20 import org.eclipse.core.resources.*; 21 import org.eclipse.core.runtime.CoreException; 22 import org.eclipse.core.runtime.IProgressMonitor; 23 import org.junit.Assert; 24 25 /** 26 * Helper builder for cycle related tests. 27 */ 28 public class CycleBuilder extends TestBuilder { 29 public static final String BUILDER_NAME = "org.eclipse.core.tests.resources.cyclebuilder"; 30 31 protected IProject[] beforeProjects = new IProject[0]; 32 protected IProject[] afterProjects = new IProject[0]; 33 protected int rebuildsToRequest = 0; 34 private static CycleBuilder singleton; 35 protected int buildCount = 0; 36 37 /** 38 * Returns the most recently created instance. 39 */ getInstance()40 public static CycleBuilder getInstance() { 41 return singleton; 42 } 43 CycleBuilder()44 public CycleBuilder() { 45 singleton = this; 46 } 47 48 @Override build(int kind, Map<String, String> args, IProgressMonitor monitor)49 protected IProject[] build(int kind, Map<String, String> args, IProgressMonitor monitor) throws CoreException { 50 if (beforeProjects != null) { 51 for (IProject beforeProject : beforeProjects) { 52 Assert.assertTrue("Missing before project: " + beforeProject, hasBeenBuilt(beforeProject)); 53 } 54 } 55 if (afterProjects != null) { 56 for (IProject afterProject : afterProjects) { 57 Assert.assertTrue("Missing after project: " + afterProject, !hasBeenBuilt(afterProject)); 58 } 59 } 60 if (rebuildsToRequest > buildCount) { 61 changeAllFiles(); 62 needRebuild(); 63 } 64 //ensure that subsequent builds are always incremental 65 if (buildCount > 0) { 66 Assert.assertTrue("Should be incremental build", kind == IncrementalProjectBuilder.INCREMENTAL_BUILD); 67 } 68 buildCount++; 69 return null; 70 } 71 72 /** 73 * Method getRandomContents. 74 * @return InputStream 75 */ getRandomContents()76 protected InputStream getRandomContents() { 77 return new ByteArrayInputStream("foo".getBytes()); 78 } 79 80 /** 81 * Method changeSomething. 82 */ changeAllFiles()83 private void changeAllFiles() throws CoreException { 84 IResourceVisitor visitor = resource -> { 85 if (resource.getType() == IResource.FILE) { 86 if (resource.getName().equals(IProjectDescription.DESCRIPTION_FILE_NAME)) { 87 return false; 88 } 89 ((IFile) resource).setContents(getRandomContents(), IResource.NONE, null); 90 } 91 return true; 92 }; 93 getProject().accept(visitor, IResource.DEPTH_INFINITE, IResource.NONE); 94 } 95 getBuildCount()96 public int getBuildCount() { 97 return buildCount; 98 } 99 resetBuildCount()100 public void resetBuildCount() { 101 buildCount = 0; 102 } 103 setAfterProjects(IProject[] afterProjects)104 public void setAfterProjects(IProject[] afterProjects) { 105 this.afterProjects = afterProjects; 106 } 107 setBeforeProjects(IProject[] beforeProjects)108 public void setBeforeProjects(IProject[] beforeProjects) { 109 this.beforeProjects = beforeProjects; 110 } 111 setRebuildsToRequest(int rebuildsToRequest)112 public void setRebuildsToRequest(int rebuildsToRequest) { 113 this.rebuildsToRequest = rebuildsToRequest; 114 } 115 } 116