o adding tests for the new incremental mode
Submitted by: Igor Fedorenko


git-svn-id: https://svn.apache.org/repos/asf/maven/shared/trunk@744576 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/test/java/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.java b/src/test/java/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.java
new file mode 100644
index 0000000..50a3de4
--- /dev/null
+++ b/src/test/java/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.java
@@ -0,0 +1,166 @@
+package org.apache.maven.shared.filtering;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.maven.model.Resource;
+import org.codehaus.plexus.PlexusTestCase;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.IOUtil;
+import org.sonatype.plexus.build.incremental.ThreadBuildContext;
+import org.sonatype.plexus.build.incremental.test.TestIncrementalBuildContext;
+
+public class IncrementalResourceFilteringTest
+    extends PlexusTestCase
+{
+
+    File outputDirectory = new File( getBasedir(), "target/IncrementalResourceFilteringTest" );
+
+    String unitDirectory = getBasedir() + "/src/test/units-files/incremental";
+
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+        if ( outputDirectory.exists() )
+        {
+            FileUtils.forceDelete( outputDirectory );
+        }
+        outputDirectory.mkdirs();
+    }
+
+    public void testSimpleIncrementalFiltering()
+        throws Exception
+    {
+        // run full build first
+        filter( "time" );
+
+        assertTime( "time", "file01.txt" );
+        assertTime( "time", "file02.txt" );
+
+        // only one file is expected to change
+        HashSet changedFiles = new HashSet();
+        changedFiles.add( "file01.txt" );
+
+        TestIncrementalBuildContext ctx = new TestIncrementalBuildContext( new File(unitDirectory), changedFiles, new HashMap() );
+        ThreadBuildContext.setThreadBuildContext( ctx );
+
+        filter( "notime" );
+        assertTime( "notime", "file01.txt" );
+        assertTime( "time", "file02.txt" ); // this one is unchanged
+
+        assertTrue( ctx.getRefreshFiles().contains( new File(outputDirectory, "file01.txt") ) );
+
+        // one file is expected to be deleted
+        HashSet deletedFiles = new HashSet();
+        deletedFiles.add( "file01.txt" );
+
+        ctx = new TestIncrementalBuildContext( new File(unitDirectory), new HashSet(), changedFiles, new HashMap() );
+        ThreadBuildContext.setThreadBuildContext( ctx );
+
+        filter( "moretime" );
+        assertFalse( new File( outputDirectory, "file01.txt" ).exists() );
+        assertTime( "time", "file02.txt" ); // this one is unchanged
+
+        assertTrue( ctx.getRefreshFiles().contains( new File(outputDirectory, "file01.txt") ) );
+
+    }
+
+    public void testFilterChange()
+        throws Exception
+    {
+        // run full build first
+        filter( "time" );
+
+        // all files are reprocessed after content of filters changes 
+        HashSet changedFiles = new HashSet();
+        changedFiles.add( "filters.txt" );
+        TestIncrementalBuildContext ctx = new TestIncrementalBuildContext( new File(unitDirectory),  changedFiles, new HashMap() );
+        ThreadBuildContext.setThreadBuildContext( ctx );
+
+        filter( "notime" );
+        assertTime( "notime", "file01.txt" );
+        assertTime( "notime", "file02.txt" );
+
+        assertTrue( ctx.getRefreshFiles().contains( new File(outputDirectory, "file01.txt") ) );
+        assertTrue( ctx.getRefreshFiles().contains( new File(outputDirectory, "file02.txt") ) );
+        
+    }
+
+    public void testFilterDeleted()
+        throws Exception
+    {
+        // run full build first
+        filter( "time" );
+
+        // all files are reprocessed after content of filters changes 
+        HashSet deletedFiles = new HashSet();
+        deletedFiles.add( "filters.txt" );
+        TestIncrementalBuildContext ctx = new TestIncrementalBuildContext( new File(unitDirectory), new HashSet(), deletedFiles, new HashMap() );
+        ThreadBuildContext.setThreadBuildContext( ctx );
+
+        filter( "notime" );
+        assertTime( "notime", "file01.txt" );
+        assertTime( "notime", "file02.txt" );
+
+        assertTrue( ctx.getRefreshFiles().contains( new File(outputDirectory, "file01.txt") ) );
+        assertTrue( ctx.getRefreshFiles().contains( new File(outputDirectory, "file02.txt") ) );
+    }
+
+    private void assertTime( String time, String relpath )
+        throws IOException
+    {
+        Properties properties = new Properties();
+
+        InputStream is = new FileInputStream( new File( outputDirectory, relpath ) );
+        try
+        {
+            properties.load( is );
+        }
+        finally
+        {
+            IOUtil.close( is );
+        }
+
+        assertEquals( time, properties.getProperty( "time" ) );
+    }
+
+    private void filter( String time )
+        throws Exception, MavenFilteringException
+    {
+        File baseDir = new File( "c:\\foo\\bar" );
+        StubMavenProject mavenProject = new StubMavenProject( baseDir );
+        mavenProject.setVersion( "1.0" );
+        mavenProject.setGroupId( "org.apache" );
+        mavenProject.setName( "test project" );
+
+        Properties projectProperties = new Properties();
+        projectProperties.put( "time", time );
+        projectProperties.put( "java.version", "zloug" );
+        mavenProject.setProperties( projectProperties );
+        MavenResourcesFiltering mavenResourcesFiltering =
+            (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
+
+        String unitFilesDir = unitDirectory + "/files";
+
+        Resource resource = new Resource();
+        List resources = new ArrayList();
+        resources.add( resource );
+        resource.setDirectory( unitFilesDir );
+        resource.setFiltering( true );
+
+        List filtersFile = new ArrayList();
+        filtersFile.add( unitDirectory + "/filters.txt" );
+
+        mavenResourcesFiltering.filterResources( resources, outputDirectory, mavenProject, "UTF-8", filtersFile,
+                                                 new ArrayList(), new StubMavenSession() );
+    }
+
+}
diff --git a/src/test/resources/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.xml b/src/test/resources/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.xml
new file mode 100644
index 0000000..d946539
--- /dev/null
+++ b/src/test/resources/org/apache/maven/shared/filtering/IncrementalResourceFilteringTest.xml
@@ -0,0 +1,9 @@
+<component-set>
+  <components>
+    <component>
+      <role>org.sonatype.plexus.build.incremental.BuildContext</role>
+      <role-hint>default</role-hint>
+      <implementation>org.sonatype.plexus.build.incremental.ThreadBuildContext</implementation>
+    </component>
+  </components>
+</component-set>
diff --git a/src/test/units-files/incremental/files/file01.txt b/src/test/units-files/incremental/files/file01.txt
new file mode 100644
index 0000000..26f8e41
--- /dev/null
+++ b/src/test/units-files/incremental/files/file01.txt
@@ -0,0 +1,2 @@
+time=${time}
+foo=${foo}
diff --git a/src/test/units-files/incremental/files/file02.txt b/src/test/units-files/incremental/files/file02.txt
new file mode 100644
index 0000000..26f8e41
--- /dev/null
+++ b/src/test/units-files/incremental/files/file02.txt
@@ -0,0 +1,2 @@
+time=${time}
+foo=${foo}
diff --git a/src/test/units-files/incremental/filters.txt b/src/test/units-files/incremental/filters.txt
new file mode 100644
index 0000000..b2dea0b
--- /dev/null
+++ b/src/test/units-files/incremental/filters.txt
@@ -0,0 +1 @@
+foo=bar\ No newline at end of file