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