/******************************************************************************* * Copyright (c) 2012-2015 Codenvy, S.A. * 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: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.api.builder; import org.eclipse.che.api.builder.internal.BuildListener; import org.eclipse.che.api.builder.internal.BuildLogger; import org.eclipse.che.api.builder.internal.BuildResult; import org.eclipse.che.api.builder.internal.BuildTask; import org.eclipse.che.api.builder.internal.Builder; import org.eclipse.che.api.builder.internal.BuilderConfiguration; import org.eclipse.che.api.builder.internal.DelegateBuildLogger; import org.eclipse.che.api.builder.internal.SourceManagerListener; import org.eclipse.che.api.builder.internal.SourcesManager; import org.eclipse.che.api.builder.dto.BuildRequest; import org.eclipse.che.api.core.notification.EventService; import org.eclipse.che.api.core.util.CommandLine; import org.eclipse.che.api.project.shared.dto.ProjectDescriptor; import org.eclipse.che.commons.lang.IoUtil; import org.eclipse.che.dto.server.DtoFactory; import org.testng.Assert; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import java.io.File; import java.io.IOException; /** @author andrew00x */ public class BuilderTest { // Simple test for main Builder components. Don't run any real build processes. public static class MyBuilder extends Builder { MyDelegateBuildLogger logger; public MyBuilder(File root, int numberOfWorkers, int queueSize, int cleanBuildResultDelay) { super(root, numberOfWorkers, queueSize, cleanBuildResultDelay, new EventService()); } @Override public String getName() { return "my"; } @Override public String getDescription() { return null; } @Override protected BuildResult getTaskResult(FutureBuildTask task, boolean successful) { return new BuildResult(successful); } @Override protected CommandLine createCommandLine(BuilderConfiguration config) { return new CommandLine("echo", "test"); // display line of text } @Override protected BuildLogger createBuildLogger(BuilderConfiguration buildConfiguration, java.io.File logFile) throws BuilderException { return logger = new MyDelegateBuildLogger(super.createBuildLogger(buildConfiguration, logFile)); } @Override public SourcesManager getSourcesManager() { return new SourcesManager() { @Override public void getSources(BuildLogger logger, String workspace, String project, String sourcesUrl, File workDir) throws IOException { // Don't need for current set of tests. } @Override public java.io.File getDirectory() { return getSourcesDirectory(); } @Override public boolean addListener(SourceManagerListener listener) { return false; } @Override public boolean removeListener(SourceManagerListener listener) { return false; } }; } } public static class MyDelegateBuildLogger extends DelegateBuildLogger { private StringBuilder buff = new StringBuilder(); public MyDelegateBuildLogger(BuildLogger delegate) { super(delegate); } @Override public void writeLine(String line) throws IOException { if (line != null) { if (buff.length() > 0) { buff.append('\n'); } buff.append(line); } super.writeLine(line); } public String getLogsAsString() { return buff.toString(); } } private java.io.File repo; private MyBuilder builder; @BeforeTest public void setUp() throws Exception { repo = createRepository(); builder = new MyBuilder(repo, Runtime.getRuntime().availableProcessors(), 100, 3600); builder.start(); } @AfterTest public void tearDown() { builder.stop(); Assert.assertTrue(IoUtil.deleteRecursive(repo), "Unable remove test directory"); } static java.io.File createRepository() throws Exception { java.io.File root = new java.io.File(System.getProperty("workDir"), "repo"); if (!(root.exists() || root.mkdirs())) { Assert.fail("Unable create test directory"); } return root; } @Test public void testRunTask() throws Exception { final BuildRequest buildRequest = DtoFactory.getInstance().createDto(BuildRequest.class); buildRequest.setBuilder("my"); buildRequest.setSourcesUrl("http://localhost/a" /* ok for test, nothing download*/); buildRequest.setProjectDescriptor(DtoFactory.getInstance().createDto(ProjectDescriptor.class) .withName("my_project") .withType("my_type")); final BuildTask task = builder.perform(buildRequest); waitForTask(task); Assert.assertEquals(builder.logger.getLogsAsString(), "test"); } @Test public void testBuildListener() throws Exception { final boolean[] beginFlag = new boolean[]{false}; final boolean[] endFlag = new boolean[]{false}; final BuildListener listener = new BuildListener() { @Override public void begin(BuildTask task) { beginFlag[0] = true; } @Override public void end(BuildTask task) { endFlag[0] = true; } }; Assert.assertTrue(builder.addBuildListener(listener)); final BuildRequest buildRequest = DtoFactory.getInstance().createDto(BuildRequest.class); buildRequest.setBuilder("my"); buildRequest.setSourcesUrl("http://localhost/a" /* ok for test, nothing download*/); buildRequest.setProjectDescriptor(DtoFactory.getInstance().createDto(ProjectDescriptor.class) .withName("my_project") .withType("my_type")); final BuildTask task = builder.perform(buildRequest); waitForTask(task); Assert.assertTrue(beginFlag[0]); Assert.assertTrue(endFlag[0]); Assert.assertTrue(builder.removeBuildListener(listener)); } private void waitForTask(BuildTask task) throws Exception { final long end = System.currentTimeMillis() + 5000; synchronized (this) { while (!task.isDone()) { wait(100); if (System.currentTimeMillis() > end) { Assert.fail("timeout"); } } } } }