/******************************************************************************* * Copyright (c) 2011, 2017 NumberFour AG 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: * NumberFour AG - initial API and Implementation (Alex Panchenko) *******************************************************************************/ package org.eclipse.dltk.core.tests; import static org.eclipse.dltk.core.tests.model.AbstractModelTests.getProject; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.dltk.core.tests.model.AbstractModelTests; import org.eclipse.dltk.core.tests.model.SuiteOfTestCases; import org.eclipse.dltk.core.tests.model.SuiteOfTestCases.Suite; import org.eclipse.dltk.internal.core.ModelManager; import junit.extensions.TestSetup; import junit.framework.Test; import junit.framework.TestSuite; /** * A decorator for tests to initialize workspace project before executing the * tests. Use as follows: * * <pre> * suite.addTest(new BundledProjectSetup(MyPluginActivator.PLUGIN_ID, * "myProject", new TestSuite(MyTests.class))); * </pre> * * where <code>myProject</code> is the folder with the preconfigured project * located at <code>bundleRoot/workspace/myProject</code> */ public class BundledProjectSetup extends TestSetup { public static class Builder { private String bundleName; private List<String> projectNames = new ArrayList<>(); private boolean build; private boolean disableIndexer; public Builder(String bundleName, String[] projectNames) { this.bundleName = bundleName; Collections.addAll(this.projectNames, projectNames); } public Builder build(boolean value) { this.build = value; return this; } public BundledProjectSetup suite(Class<?>... testClasses) { return new BundledProjectSetup(bundleName, projectNames.toArray(new String[projectNames.size()]), createTests(testClasses), build, disableIndexer); } private Test createTests(Class<?>[] testClasses) { if (testClasses.length == 1) { return createSuite(testClasses[0]); } else { final TestSuite result = new TestSuite(); final List<String> names = new ArrayList<>(); for (Class<?> clazz : testClasses) { final Test suite = createSuite(clazz); result.addTest(suite); names.add(clazz.getName()); } result.setName(findLongestCommonPrefix( names.toArray(new String[names.size()])) + "*.tests"); return result; } } private static String findLongestCommonPrefix(String[] array) { int minLength = array[0].length(); for (int i = 1; i < array.length; ++i) { final int length = array[i].length(); if (length < minLength) { minLength = length; } } LENGTH_LOOP: for (int i = minLength; i > 0; --i) { final String prefix = array[0].substring(0, i); for (int j = 1; j < array.length; ++j) { if (!array[j].startsWith(prefix)) { continue LENGTH_LOOP; } } return prefix; } return ""; } @SuppressWarnings("unchecked") private Test createSuite(final Class<?> cls) { if (SuiteOfTestCases.class.isAssignableFrom(cls)) { return new Suite((Class<? extends SuiteOfTestCases>) cls); } else { return new TestSuite(cls); } } public Builder disableIndexer() { this.disableIndexer = true; return this; } } public static Builder create(String bundleName, String... projectNames) { return new Builder(bundleName, projectNames); } static class Helper extends AbstractModelTests { public Helper(String bundleName) { super(bundleName, BundledProjectSetup.class.getName()); } } private final Helper helper; private final String[] projectNames; private final boolean build; private final boolean disableIndexer; public BundledProjectSetup(String bundleName, String projectName, Test test) { this(bundleName, projectName, test, false); } public BundledProjectSetup(String bundleName, String projectName, Test test, boolean build) { this(bundleName, new String[] { projectName }, test, build); } public BundledProjectSetup(String bundleName, String[] projectNames, Test test, boolean build) { this(bundleName, projectNames, test, build, false); } BundledProjectSetup(String bundleName, String[] projectNames, Test test, boolean build, boolean disableIndexer) { super(test); this.helper = new Helper(bundleName); this.projectNames = projectNames; this.build = build; this.disableIndexer = disableIndexer; } @Override protected void setUp() throws Exception { super.setUp(); WorkspaceAutoBuild.disable(); if (disableIndexer) { ModelManager.getModelManager().getIndexManager().disable(); } for (String projectName : projectNames) { helper.setUpProject(projectName); } if (build) { final long start = System.currentTimeMillis(); for (String projectName : projectNames) { getProject(projectName) .build(IncrementalProjectBuilder.FULL_BUILD, null); } System.out.println( (System.currentTimeMillis() - start) + " ms to build " + Arrays.asList(projectNames) + " project(s)"); } } @Override protected void tearDown() throws Exception { for (String projectName : projectNames) { AbstractModelTests.deleteProject(projectName); } if (disableIndexer) { ModelManager.getModelManager().getIndexManager().enable(); } super.tearDown(); } }