View Javadoc

1   package org.apache.maven.shared.filtering;
2   
3   import java.io.File;
4   import java.io.FileInputStream;
5   import java.io.IOException;
6   import java.io.InputStream;
7   import java.util.ArrayList;
8   import java.util.HashMap;
9   import java.util.HashSet;
10  import java.util.List;
11  import java.util.Properties;
12  
13  import org.apache.maven.model.Resource;
14  import org.codehaus.plexus.PlexusTestCase;
15  import org.codehaus.plexus.util.FileUtils;
16  import org.codehaus.plexus.util.IOUtil;
17  import org.sonatype.plexus.build.incremental.ThreadBuildContext;
18  import org.sonatype.plexus.build.incremental.test.TestIncrementalBuildContext;
19  
20  public class IncrementalResourceFilteringTest
21      extends PlexusTestCase
22  {
23  
24      File outputDirectory = new File( getBasedir(), "target/IncrementalResourceFilteringTest" );
25  
26      File unitDirectory = new File( getBasedir(), "src/test/units-files/incremental" );
27  
28      protected void setUp()
29          throws Exception
30      {
31          super.setUp();
32          if ( outputDirectory.exists() )
33          {
34              FileUtils.forceDelete( outputDirectory );
35          }
36          outputDirectory.mkdirs();
37      }
38  
39      public void testSimpleIncrementalFiltering()
40          throws Exception
41      {
42          // run full build first
43          filter( "time" );
44  
45          assertTime( "time", "file01.txt" );
46          assertTime( "time", "file02.txt" );
47  
48          // only one file is expected to change
49          HashSet changedFiles = new HashSet();
50          changedFiles.add( "file01.txt" );
51  
52          TestIncrementalBuildContext ctx = new TestIncrementalBuildContext( unitDirectory, changedFiles, new HashMap() );
53          ThreadBuildContext.setThreadBuildContext( ctx );
54  
55          filter( "notime" );
56          assertTime( "notime", "file01.txt" );
57          assertTime( "time", "file02.txt" ); // this one is unchanged
58  
59          assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file01.txt" ) ) );
60  
61          // one file is expected to be deleted
62          HashSet deletedFiles = new HashSet();
63          deletedFiles.add( "file01.txt" );
64  
65          ctx = new TestIncrementalBuildContext( unitDirectory, new HashSet(), changedFiles, new HashMap() );
66          ThreadBuildContext.setThreadBuildContext( ctx );
67  
68          filter( "moretime" );
69          assertFalse( new File( outputDirectory, "file01.txt" ).exists() );
70          assertTime( "time", "file02.txt" ); // this one is unchanged
71  
72          assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file01.txt" ) ) );
73  
74      }
75  
76      public void testOutputChange()
77          throws Exception
78      {
79          // run full build first
80          filter( "time" );
81  
82          // all files are reprocessed after contents of output directory changed (e.g. was deleted)
83          HashSet changedFiles = new HashSet();
84          changedFiles.add( "target/IncrementalResourceFilteringTest" );
85          TestIncrementalBuildContext ctx = new TestIncrementalBuildContext( unitDirectory, changedFiles, new HashMap() );
86          ThreadBuildContext.setThreadBuildContext( ctx );
87  
88          filter( "notime" );
89          assertTime( "notime", "file01.txt" );
90          assertTime( "notime", "file02.txt" );
91  
92          assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file01.txt" ) ) );
93          assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file02.txt" ) ) );
94  
95      }
96  
97      public void testFilterChange()
98          throws Exception
99      {
100         // run full build first
101         filter( "time" );
102 
103         // all files are reprocessed after content of filters changes
104         HashSet changedFiles = new HashSet();
105         changedFiles.add( "filters.txt" );
106         TestIncrementalBuildContext ctx = new TestIncrementalBuildContext( unitDirectory, changedFiles, new HashMap() );
107         ThreadBuildContext.setThreadBuildContext( ctx );
108 
109         filter( "notime" );
110         assertTime( "notime", "file01.txt" );
111         assertTime( "notime", "file02.txt" );
112 
113         assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file01.txt" ) ) );
114         assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file02.txt" ) ) );
115 
116     }
117 
118     public void testFilterDeleted()
119         throws Exception
120     {
121         // run full build first
122         filter( "time" );
123 
124         // all files are reprocessed after content of filters changes
125         HashSet deletedFiles = new HashSet();
126         deletedFiles.add( "filters.txt" );
127         TestIncrementalBuildContext ctx =
128             new TestIncrementalBuildContext( unitDirectory, new HashSet(), deletedFiles, new HashMap() );
129         ThreadBuildContext.setThreadBuildContext( ctx );
130 
131         filter( "notime" );
132         assertTime( "notime", "file01.txt" );
133         assertTime( "notime", "file02.txt" );
134 
135         assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file01.txt" ) ) );
136         assertTrue( ctx.getRefreshFiles().contains( new File( outputDirectory, "file02.txt" ) ) );
137     }
138 
139     private void assertTime( String time, String relpath )
140         throws IOException
141     {
142         Properties properties = new Properties();
143 
144         InputStream is = new FileInputStream( new File( outputDirectory, relpath ) );
145         try
146         {
147             properties.load( is );
148         }
149         finally
150         {
151             IOUtil.close( is );
152         }
153 
154         assertEquals( time, properties.getProperty( "time" ) );
155     }
156 
157     private void filter( String time )
158         throws Exception, MavenFilteringException
159     {
160         File baseDir = new File( getBasedir() );
161         StubMavenProject mavenProject = new StubMavenProject( baseDir );
162         mavenProject.setVersion( "1.0" );
163         mavenProject.setGroupId( "org.apache" );
164         mavenProject.setName( "test project" );
165 
166         Properties projectProperties = new Properties();
167         projectProperties.put( "time", time );
168         projectProperties.put( "java.version", "zloug" );
169         mavenProject.setProperties( projectProperties );
170         MavenResourcesFiltering mavenResourcesFiltering =
171             (MavenResourcesFiltering) lookup( MavenResourcesFiltering.class.getName() );
172 
173         String unitFilesDir = new File( unitDirectory, "files" ).getPath();
174 
175         Resource resource = new Resource();
176         List resources = new ArrayList();
177         resources.add( resource );
178         resource.setDirectory( unitFilesDir );
179         resource.setFiltering( true );
180 
181         List filtersFile = new ArrayList();
182         filtersFile.add( new File( unitDirectory, "filters.txt" ).getPath() );
183 
184         mavenResourcesFiltering.filterResources( resources, outputDirectory, mavenProject, "UTF-8", filtersFile,
185                                                  new ArrayList(), new StubMavenSession() );
186     }
187 
188 }