You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@continuum.apache.org by ct...@apache.org on 2009/08/24 02:53:16 UTC

svn commit: r807036 - in /continuum/trunk/continuum-core/src: test-projects/multi-module/ test-projects/multi-module/module-A/ test-projects/multi-module/module-A/src/ test-projects/multi-module/module-A/src/main/ test-projects/multi-module/module-A/sr...

Author: ctan
Date: Mon Aug 24 00:53:14 2009
New Revision: 807036

URL: http://svn.apache.org/viewvc?rev=807036&view=rev
Log:
added unit test for PrepareBuildProjectsTaskExecutor
merge -r 802677:802678 of 1.3.x branch

Added:
    continuum/trunk/continuum-core/src/test-projects/multi-module/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/pom.xml
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/src/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/src/main/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/src/main/java/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/src/main/java/org/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/src/main/java/org/apache/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/src/main/java/org/apache/continuum/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/src/main/java/org/apache/continuum/module/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/src/main/java/org/apache/continuum/module/a/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/src/main/java/org/apache/continuum/module/a/App.java
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/test/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/test/java/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/test/java/org/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/test/java/org/apache/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/test/java/org/apache/continuum/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/test/java/org/apache/continuum/module/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/test/java/org/apache/continuum/module/a/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/test/java/org/apache/continuum/module/a/AppTest.java
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/pom.xml
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/main/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/main/java/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/main/java/org/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/main/java/org/apache/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/main/java/org/apache/continuum/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/main/java/org/apache/continuum/module/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/main/java/org/apache/continuum/module/b/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/main/java/org/apache/continuum/module/b/App.java
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/test/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/test/java/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/test/java/org/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/test/java/org/apache/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/test/java/org/apache/continuum/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/test/java/org/apache/continuum/module/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/test/java/org/apache/continuum/module/b/
    continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/test/java/org/apache/continuum/module/b/AppTest.java
    continuum/trunk/continuum-core/src/test-projects/multi-module/pom.xml
    continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/scm/
    continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/scm/queue/
    continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/scm/queue/PrepareBuildProjectsTaskExecutorTest.java

Added: continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/pom.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/pom.xml?rev=807036&view=auto
==============================================================================
--- continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/pom.xml (added)
+++ continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/pom.xml Mon Aug 24 00:53:14 2009
@@ -0,0 +1,39 @@
+<?xml version="1.0"?><project>
+<!--
+
+    Copyright 2005 Exist Global
+    
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+    
+          http://www.apache.org/licenses/LICENSE-2.0
+    
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+
+-->
+
+  <parent>
+    <artifactId>multi-module-parent</artifactId>
+    <groupId>org.apache.continuum</groupId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.continuum</groupId>
+  <artifactId>module-A</artifactId>
+  <name>module-A</name>
+  <version>1.0-SNAPSHOT</version>
+  <url>http://maven.apache.org</url>
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>

Added: continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/src/main/java/org/apache/continuum/module/a/App.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/src/main/java/org/apache/continuum/module/a/App.java?rev=807036&view=auto
==============================================================================
--- continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/src/main/java/org/apache/continuum/module/a/App.java (added)
+++ continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/src/main/java/org/apache/continuum/module/a/App.java Mon Aug 24 00:53:14 2009
@@ -0,0 +1,29 @@
+/**
+ * Copyright 2005 Exist Global
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.continuum.module.a;
+
+/**
+ * Hello world!
+ *
+ */
+public class App 
+{
+    public static void main( String[] args )
+    {
+        System.out.println( "Hello World!" );
+    }
+}

Added: continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/test/java/org/apache/continuum/module/a/AppTest.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/test/java/org/apache/continuum/module/a/AppTest.java?rev=807036&view=auto
==============================================================================
--- continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/test/java/org/apache/continuum/module/a/AppTest.java (added)
+++ continuum/trunk/continuum-core/src/test-projects/multi-module/module-A/test/java/org/apache/continuum/module/a/AppTest.java Mon Aug 24 00:53:14 2009
@@ -0,0 +1,54 @@
+/**
+ * Copyright 2005 Exist Global
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.continuum.module.a;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}

Added: continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/pom.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/pom.xml?rev=807036&view=auto
==============================================================================
--- continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/pom.xml (added)
+++ continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/pom.xml Mon Aug 24 00:53:14 2009
@@ -0,0 +1,39 @@
+<?xml version="1.0"?><project>
+<!--
+
+    Copyright 2005 Exist Global
+    
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+    
+          http://www.apache.org/licenses/LICENSE-2.0
+    
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+
+-->
+
+  <parent>
+    <artifactId>multi-module-parent</artifactId>
+    <groupId>org.apache.continuum</groupId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.continuum</groupId>
+  <artifactId>module-B</artifactId>
+  <name>module-B</name>
+  <version>1.0-SNAPSHOT</version>
+  <url>http://maven.apache.org</url>
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>

Added: continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/main/java/org/apache/continuum/module/b/App.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/main/java/org/apache/continuum/module/b/App.java?rev=807036&view=auto
==============================================================================
--- continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/main/java/org/apache/continuum/module/b/App.java (added)
+++ continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/main/java/org/apache/continuum/module/b/App.java Mon Aug 24 00:53:14 2009
@@ -0,0 +1,29 @@
+/**
+ * Copyright 2005 Exist Global
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.continuum.module.b;
+
+/**
+ * Hello world!
+ *
+ */
+public class App 
+{
+    public static void main( String[] args )
+    {
+        System.out.println( "Hello World!" );
+    }
+}

Added: continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/test/java/org/apache/continuum/module/b/AppTest.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/test/java/org/apache/continuum/module/b/AppTest.java?rev=807036&view=auto
==============================================================================
--- continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/test/java/org/apache/continuum/module/b/AppTest.java (added)
+++ continuum/trunk/continuum-core/src/test-projects/multi-module/module-B/src/test/java/org/apache/continuum/module/b/AppTest.java Mon Aug 24 00:53:14 2009
@@ -0,0 +1,54 @@
+/**
+ * Copyright 2005 Exist Global
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.continuum.module.b;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}

Added: continuum/trunk/continuum-core/src/test-projects/multi-module/pom.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test-projects/multi-module/pom.xml?rev=807036&view=auto
==============================================================================
--- continuum/trunk/continuum-core/src/test-projects/multi-module/pom.xml (added)
+++ continuum/trunk/continuum-core/src/test-projects/multi-module/pom.xml Mon Aug 24 00:53:14 2009
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright 2005 Exist Global
+    
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+    
+          http://www.apache.org/licenses/LICENSE-2.0
+    
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.continuum</groupId>
+  <artifactId>multi-module-parent</artifactId>
+  <packaging>pom</packaging>
+  <version>1.0-SNAPSHOT</version>
+  <name>multi-module-parent</name>
+  <url>http://maven.apache.org</url>
+  <scm>
+    <connection>scm:local:src/test-projects:multi-module</connection>
+    <url>http://cvs.plexus.codehaus.org/plexus-components/native/continuum/src/test-projects/multi-module</url>
+  </scm>
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  <modules>
+    <module>module-A</module>
+    <module>module-B</module>
+  </modules>
+</project>

Added: continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/scm/queue/PrepareBuildProjectsTaskExecutorTest.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/scm/queue/PrepareBuildProjectsTaskExecutorTest.java?rev=807036&view=auto
==============================================================================
--- continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/scm/queue/PrepareBuildProjectsTaskExecutorTest.java (added)
+++ continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/scm/queue/PrepareBuildProjectsTaskExecutorTest.java Mon Aug 24 00:53:14 2009
@@ -0,0 +1,426 @@
+package org.apache.maven.continuum.scm.queue;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.continuum.dao.ProjectScmRootDao;
+import org.apache.continuum.model.project.ProjectScmRoot;
+import org.apache.continuum.taskqueue.PrepareBuildProjectsTask;
+import org.apache.maven.continuum.AbstractContinuumTest;
+import org.apache.maven.continuum.configuration.ConfigurationService;
+import org.apache.maven.continuum.core.action.AbstractContinuumAction;
+import org.apache.maven.continuum.model.project.BuildDefinition;
+import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.model.project.ProjectGroup;
+import org.apache.maven.continuum.project.ContinuumProjectState;
+import org.apache.maven.continuum.project.builder.ContinuumProjectBuilder;
+import org.apache.maven.continuum.project.builder.ContinuumProjectBuilderException;
+import org.apache.maven.continuum.project.builder.ContinuumProjectBuildingResult;
+import org.apache.maven.continuum.project.builder.maven.MavenTwoContinuumProjectBuilder;
+import org.codehaus.plexus.action.ActionManager;
+import org.codehaus.plexus.taskqueue.TaskQueue;
+import org.codehaus.plexus.taskqueue.execution.TaskQueueExecutor;
+import org.codehaus.plexus.util.StringUtils;
+
+public class PrepareBuildProjectsTaskExecutorTest
+    extends AbstractContinuumTest
+{
+    private ContinuumProjectBuilder projectBuilder;
+
+    private TaskQueue prepareBuildQueue;
+
+    private TaskQueueExecutor prepareBuildTaskQueueExecutor;
+
+    private ActionManager actionManager;
+
+    private ProjectScmRootDao projectScmRootDao;
+
+    private ConfigurationService configurationService;
+
+    @Override
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+
+        projectBuilder =
+            (ContinuumProjectBuilder) lookup( ContinuumProjectBuilder.ROLE, MavenTwoContinuumProjectBuilder.ID );
+
+        prepareBuildQueue = (TaskQueue) lookup( TaskQueue.ROLE, "prepare-build-project" );
+
+        prepareBuildTaskQueueExecutor = (TaskQueueExecutor) lookup( TaskQueueExecutor.ROLE, "prepare-build-project" );
+
+        projectScmRootDao = (ProjectScmRootDao) lookup( ProjectScmRootDao.class.getName() );
+
+        actionManager = (ActionManager) lookup( ActionManager.ROLE );
+
+        configurationService =  (ConfigurationService ) lookup( "configurationService" );
+    }
+
+    public void testCheckoutPrepareBuildMultiModuleProject()
+        throws Exception
+    {
+        PrepareBuildProjectsTask task = createTask( "src/test-projects/multi-module/pom.xml", false, false );
+
+        this.prepareBuildQueue.put( task );
+
+        List<Project> projects = getProjectDao().getProjectsInGroup( task.getProjectGroupId() );
+
+        assertEquals( "failed to add all projects", 3, projects.size() );
+
+        Project rootProject = getProjectDao().getProjectByName( "multi-module-parent" );
+        Project moduleA = getProjectDao().getProjectByName( "module-A" );
+        Project moduleB = getProjectDao().getProjectByName( "module-B" );
+
+        // wait while task finishes prepare build
+        while( !prepareBuildQueue.getQueueSnapshot().isEmpty() || 
+                        prepareBuildTaskQueueExecutor.getCurrentTask() != null )
+        {
+            Thread.sleep( 10 );
+        }
+
+        ProjectScmRoot scmRoot = projectScmRootDao.getProjectScmRoot( task.getProjectScmRootId() );
+        assertEquals( "Failed to update multi-module project", ContinuumProjectState.UPDATED, scmRoot.getState() );
+
+        File workingDir = configurationService.getWorkingDirectory();
+
+        assertTrue( "checkout directory of project 'multi-module-parent' does not exist.", new File( workingDir, Integer.toString( rootProject.getId() ) ).exists() );
+
+        assertTrue( "checkout directory of project 'module-A' does not exist.", new File( workingDir, Integer.toString( moduleA.getId() ) ).exists() );
+
+        assertTrue( "checkout directory of project 'module-B' does not exist.", new File( workingDir, Integer.toString( moduleB.getId() ) ).exists() );
+    }
+
+    public void testCheckoutPrepareBuildMultiModuleProjectFreshBuild()
+        throws Exception
+    {
+        PrepareBuildProjectsTask task = createTask( "src/test-projects/multi-module/pom.xml", false, true );
+
+        this.prepareBuildQueue.put( task );
+
+        List<Project> projects = getProjectDao().getProjectsInGroup( task.getProjectGroupId() );
+
+        assertEquals( "failed to add all projects", 3, projects.size() );
+
+        Project rootProject = getProjectDao().getProjectByName( "multi-module-parent" );
+        Project moduleA = getProjectDao().getProjectByName( "module-A" );
+        Project moduleB = getProjectDao().getProjectByName( "module-B" );
+
+        // wait while task finishes prepare build
+        while( !prepareBuildQueue.getQueueSnapshot().isEmpty() || 
+                        prepareBuildTaskQueueExecutor.getCurrentTask() != null )
+        {
+            Thread.sleep( 10 );
+        }
+
+        ProjectScmRoot scmRoot = projectScmRootDao.getProjectScmRoot( task.getProjectScmRootId() );
+        assertEquals( "Failed to update multi-module project", ContinuumProjectState.UPDATED, scmRoot.getState() );
+
+        File workingDir = configurationService.getWorkingDirectory();
+
+        assertTrue( "checkout directory of project 'multi-module-parent' does not exist.", new File( workingDir, Integer.toString( rootProject.getId() ) ).exists() );
+
+        assertTrue( "checkout directory of project 'module-A' does not exist.", new File( workingDir, Integer.toString( moduleA.getId() ) ).exists() );
+
+        assertTrue( "checkout directory of project 'module-B' does not exist.", new File( workingDir, Integer.toString( moduleB.getId() ) ).exists() );
+    }
+/*
+    public void testCheckoutPrepareBuildSingleCheckedoutMultiModuleProject()
+        throws Exception
+    {
+        PrepareBuildProjectsTask task = createTask( "src/test-projects/multi-module/pom.xml", true, false );
+
+        this.prepareBuildQueue.put( task );
+
+        List<Project> projects = getProjectDao().getProjectsInGroup( task.getProjectGroupId() );
+
+        assertEquals( "failed to add all projects", 3, projects.size() );
+
+        Project rootProject = getProjectDao().getProjectByName( "multi-module-parent" );
+
+        // wait while task finishes prepare build
+        while( !prepareBuildQueue.getQueueSnapshot().isEmpty() || 
+                        prepareBuildTaskQueueExecutor.getCurrentTask() != null )
+        {
+            Thread.sleep( 10 );
+        }
+
+        ProjectScmRoot scmRoot = projectScmRootDao.getProjectScmRoot( task.getProjectScmRootId() );
+        assertEquals( "Failed to update multi-module project", ContinuumProjectState.UPDATED, scmRoot.getState() );
+
+        File checkedOutDir = new File( configurationService.getWorkingDirectory(), Integer.toString( rootProject.getId() ) );
+
+        assertTrue( "checkout directory of project 'multi-module-parent' does not exist.", checkedOutDir.exists() );
+
+        assertTrue( "module-A was not checked out in the same directory as it's parent.", new File( checkedOutDir, "module-A" ).exists() );
+
+        assertTrue( "module-B was not checked out in the same directory as it's parent.", new File( checkedOutDir, "module-B" ).exists() );
+    }
+
+    public void testCheckoutPrepareBuildSingleCheckedoutMultiModuleProjectFreshBuild()
+        throws Exception
+    {
+        PrepareBuildProjectsTask task = createTask( "src/test-projects/multi-module/pom.xml", true, true );
+
+        this.prepareBuildQueue.put( task );
+
+        List<Project> projects = getProjectDao().getProjectsInGroup( task.getProjectGroupId() );
+
+        assertEquals( "failed to add all projects", 3, projects.size() );
+
+        Project rootProject = getProjectDao().getProjectByName( "multi-module-parent" );
+
+        // wait while task finishes prepare build
+        while( !prepareBuildQueue.getQueueSnapshot().isEmpty() || 
+                        prepareBuildTaskQueueExecutor.getCurrentTask() != null )
+        {
+            Thread.sleep( 10 );
+        }
+
+        ProjectScmRoot scmRoot = projectScmRootDao.getProjectScmRoot( task.getProjectScmRootId() );
+        assertEquals( "Failed to update multi-module project", ContinuumProjectState.UPDATED, scmRoot.getState() );
+
+        File checkedOutDir = new File( configurationService.getWorkingDirectory(), Integer.toString( rootProject.getId() ) );
+
+        assertTrue( "checkout directory of project 'multi-module-parent' does not exist.", checkedOutDir.exists() );
+
+        assertTrue( "module-A was not checked out in the same directory as it's parent.", new File( checkedOutDir, "module-A" ).exists() );
+
+        assertTrue( "module-B was not checked out in the same directory as it's parent.", new File( checkedOutDir, "module-B" ).exists() );
+    }
+
+    public void testCheckoutPrepareBuildSingleCheckoutFlatMultiModuleProject()
+        throws Exception
+    {
+        PrepareBuildProjectsTask task = createTask( "src/test-projects/flat-multi-module/parent-project/pom.xml", true, false );
+
+        this.prepareBuildQueue.put( task );
+
+        List<Project> projects = getProjectDao().getProjectsInGroup( task.getProjectGroupId() );
+
+        assertEquals( "failed to add all projects", 3, projects.size() );
+
+        Project rootProject = getProjectDao().getProjectByName( "parent-project" );
+
+        // wait while task finishes prepare build
+        while( !prepareBuildQueue.getQueueSnapshot().isEmpty() || 
+                        prepareBuildTaskQueueExecutor.getCurrentTask() != null )
+        {
+            Thread.sleep( 10 );
+        }
+
+        ProjectScmRoot scmRoot = projectScmRootDao.getProjectScmRoot( task.getProjectScmRootId() );
+        assertEquals( "Failed to update multi-module project", ContinuumProjectState.UPDATED, scmRoot.getState() );
+
+        File checkedOutDir = new File( configurationService.getWorkingDirectory(), Integer.toString( rootProject.getId() ) );
+
+        assertTrue( "checkout directory of project 'parent-project' does not exist.", new File( checkedOutDir, "parent-project" ).exists() );
+
+        assertTrue( "module-a was not checked out in the same directory as it's parent.", new File( checkedOutDir, "module-a" ).exists() );
+
+        assertTrue( "module-b was not checked out in the same directory as it's parent.", new File( checkedOutDir, "module-b" ).exists() );
+    }
+
+    public void testCheckoutPrepareBuildSingleCheckoutFlatMultiModuleProjectBuildFresh()
+        throws Exception
+    {
+        PrepareBuildProjectsTask task = createTask( "src/test-projects/flat-multi-module/parent-project/pom.xml", true, true );
+
+        this.prepareBuildQueue.put( task );
+
+        List<Project> projects = getProjectDao().getProjectsInGroup( task.getProjectGroupId() );
+
+        assertEquals( "failed to add all projects", 3, projects.size() );
+
+        Project rootProject = getProjectDao().getProjectByName( "parent-project" );
+
+        ProjectScmRoot scmRoot = projectScmRootDao.getProjectScmRoot( task.getProjectScmRootId() );
+        // wait while task finishes prepare build
+        while( !prepareBuildQueue.getQueueSnapshot().isEmpty() || 
+                        prepareBuildTaskQueueExecutor.getCurrentTask() != null || scmRoot.getState() == ContinuumProjectState.UPDATING )
+        {
+            Thread.sleep( 10 );
+
+            scmRoot = projectScmRootDao.getProjectScmRoot( task.getProjectScmRootId() );
+        }
+
+        scmRoot = projectScmRootDao.getProjectScmRoot( task.getProjectScmRootId() );
+        assertEquals( "Failed to update multi-module project", ContinuumProjectState.UPDATED, scmRoot.getState() );
+
+        File checkedOutDir = new File( configurationService.getWorkingDirectory(), Integer.toString( rootProject.getId() ) );
+
+        assertTrue( "checkout directory of project 'parent-project' does not exist.", new File( checkedOutDir, "parent-project" ).exists() );
+
+        assertTrue( "module-a was not checked out in the same directory as it's parent.", new File( checkedOutDir, "module-a" ).exists() );
+
+        assertTrue( "module-b was not checked out in the same directory as it's parent.", new File( checkedOutDir, "module-b" ).exists() );
+    }
+*/
+    private PrepareBuildProjectsTask createTask( String pomResource, boolean singleCheckout, boolean buildFresh )
+        throws Exception
+    {
+        ProjectGroup projectGroup = getProjectGroup( pomResource, singleCheckout );
+
+        BuildDefinition buildDefinition = new BuildDefinition();
+        buildDefinition.setId( 0 );
+        buildDefinition.setGoals( "clean" );
+        buildDefinition.setBuildFresh( buildFresh );
+        
+        projectGroup.addBuildDefinition( buildDefinition );
+
+        Map<String, Object> pgContext = new HashMap<String, Object>();
+
+        AbstractContinuumAction.setWorkingDirectory( pgContext, configurationService.getWorkingDirectory().getAbsolutePath() );
+
+        AbstractContinuumAction.setUnvalidatedProjectGroup( pgContext, projectGroup );
+
+        actionManager.lookup( "validate-project-group" ).execute( pgContext );
+
+        actionManager.lookup( "store-project-group" ).execute( pgContext );
+
+        int projectGroupId = AbstractContinuumAction.getProjectGroupId( pgContext );
+
+        projectGroup = getProjectGroupDao().getProjectGroupWithBuildDetailsByProjectGroupId( projectGroupId );
+
+        String scmRootUrl = getScmRootUrl( projectGroup );
+
+        assertNotNull( scmRootUrl );
+
+        ProjectScmRoot scmRoot = getProjectScmRoot( projectGroup, scmRootUrl );
+
+        assertNotNull( scmRoot );
+
+        buildDefinition = (BuildDefinition) projectGroup.getBuildDefinitions().get( 0 );
+
+        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
+
+        Project rootProject = null;
+
+        List<Project> projects = (List<Project>) projectGroup.getProjects();
+
+        for ( Project project : projects )
+        {
+            assertFalse( project.getId() == 0 );
+            
+            map.put( project.getId(), buildDefinition.getId() );
+
+            if ( rootProject == null || rootProject.getId() > project.getId() )
+            {
+                rootProject = project;
+            }
+        }
+
+        assertEquals( 3, map.size() );
+        PrepareBuildProjectsTask task = new PrepareBuildProjectsTask( map, 1, 
+                                                                      projectGroupId, projectGroup.getName(), 
+                                                                      scmRoot.getScmRootAddress(), scmRoot.getId() );
+
+        return task;
+    }
+
+    private ProjectGroup getProjectGroup( String pomResource, boolean singleCheckout )
+        throws ContinuumProjectBuilderException, IOException
+    {
+        File pom = getTestFile( pomResource );
+    
+        assertNotNull( "Can't find project " + pomResource, pom );
+
+        //ContinuumProjectBuildingResult result = projectBuilder.buildProjectsFromMetadata( pom.toURL(), null, null, true, singleCheckout );
+        ContinuumProjectBuildingResult result = projectBuilder.buildProjectsFromMetadata( pom.toURL(), null, null, true );
+
+        // some assertions to make sure our expectations match. This is NOT
+        // meant as a unit test for the projectbuilder!
+    
+        assertNotNull( "Project list not null", result.getProjects() );
+    
+        assertEquals( "#Projectgroups", 1, result.getProjectGroups().size() );
+    
+        ProjectGroup pg = result.getProjectGroups().get( 0 );
+    
+        if ( !result.getProjects().isEmpty() )
+        {
+            for ( Project p : result.getProjects() )
+            {
+                pg.addProject( p );
+            }
+        }
+
+        return pg;
+    }
+
+    private ProjectScmRoot getProjectScmRoot ( ProjectGroup pg, String url )
+        throws Exception
+    {
+        if ( StringUtils.isEmpty( url ) )
+        {
+            return null;
+        }
+
+        ProjectScmRoot scmRoot =
+            projectScmRootDao.getProjectScmRootByProjectGroupAndScmRootAddress( pg.getId(), url );
+
+        if ( scmRoot != null )
+        {
+            return scmRoot;
+        }
+
+        ProjectScmRoot projectScmRoot = new ProjectScmRoot();
+
+        projectScmRoot.setProjectGroup( pg );
+
+        projectScmRoot.setScmRootAddress( url );
+
+        projectScmRoot.setState( ContinuumProjectState.ERROR );
+
+        return projectScmRootDao.addProjectScmRoot( projectScmRoot );
+    }
+
+    private String getScmRootUrl( ProjectGroup pg )
+    {
+        String scmRootUrl = null;
+
+        for ( Project project : (List<Project>) pg.getProjects() )
+        {
+            String scmUrl = project.getScmUrl();
+
+            scmRootUrl = getCommonPath( scmUrl, scmRootUrl );
+        }
+
+        return scmRootUrl;
+    }
+
+    private String getCommonPath( String path1, String path2 )
+    {
+        if ( path2 == null || path2.equals( "" ) )
+        {
+            return path1;
+        }
+        else
+        {
+            int indexDiff = StringUtils.differenceAt( path1, path2 );
+            return path1.substring( 0, indexDiff );
+        }
+    }
+}