View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.plugins.assembly.archive.archiver;
20  
21  import java.io.File;
22  import java.io.IOException;
23  import java.nio.charset.StandardCharsets;
24  import java.nio.file.Files;
25  import java.util.ArrayList;
26  import java.util.Collections;
27  import java.util.List;
28  
29  import org.codehaus.plexus.archiver.Archiver;
30  import org.codehaus.plexus.archiver.ArchiverException;
31  import org.codehaus.plexus.archiver.FileSet;
32  import org.codehaus.plexus.archiver.diags.TrackingArchiver;
33  import org.codehaus.plexus.archiver.jar.JarArchiver;
34  import org.codehaus.plexus.archiver.util.DefaultFileSet;
35  import org.codehaus.plexus.components.io.fileselectors.FileInfo;
36  import org.codehaus.plexus.components.io.fileselectors.FileSelector;
37  import org.codehaus.plexus.components.io.functions.InputStreamTransformer;
38  import org.junit.Rule;
39  import org.junit.Test;
40  import org.junit.rules.TemporaryFolder;
41  import org.junit.runner.RunWith;
42  import org.mockito.ArgumentCaptor;
43  import org.mockito.junit.MockitoJUnitRunner;
44  
45  import static org.hamcrest.MatcherAssert.assertThat;
46  import static org.hamcrest.Matchers.is;
47  import static org.junit.Assert.assertEquals;
48  import static org.junit.Assert.assertNotNull;
49  import static org.junit.Assert.assertTrue;
50  import static org.mockito.Mockito.mock;
51  import static org.mockito.Mockito.verify;
52  import static org.mockito.Mockito.when;
53  
54  @RunWith(MockitoJUnitRunner.class)
55  public class AssemblyProxyArchiverTest {
56      @Rule
57      public TemporaryFolder temporaryFolder = new TemporaryFolder();
58  
59      @Test(timeout = 5000)
60      public void addFileSet_SkipWhenSourceIsAssemblyWorkDir() throws IOException, ArchiverException {
61          final File sources = temporaryFolder.getRoot();
62  
63          final File workdir = new File(sources, "workdir");
64  
65          final TrackingArchiver tracker = new TrackingArchiver();
66          final AssemblyProxyArchiver archiver = new AssemblyProxyArchiver("", tracker, null, null, null, workdir);
67  
68          archiver.setForced(true);
69  
70          final DefaultFileSet fs = new DefaultFileSet();
71          fs.setDirectory(workdir);
72  
73          archiver.addFileSet(fs);
74  
75          assertTrue(tracker.added.isEmpty());
76      }
77  
78      @Test(timeout = 5000)
79      public void addFileSet_addExcludeWhenSourceContainsAssemblyWorkDir() throws IOException, ArchiverException {
80          final File sources = temporaryFolder.getRoot();
81  
82          final File workdir = new File(sources, "workdir");
83          workdir.mkdir();
84  
85          Files.write(
86                  sources.toPath().resolve("test-included.txt"),
87                  Collections.singletonList("This is included"),
88                  StandardCharsets.UTF_8);
89          Files.write(
90                  workdir.toPath().resolve("test-excluded.txt"),
91                  Collections.singletonList("This is excluded"),
92                  StandardCharsets.UTF_8);
93  
94          final TrackingArchiver tracker = new TrackingArchiver();
95          final AssemblyProxyArchiver archiver = new AssemblyProxyArchiver("", tracker, null, null, null, workdir);
96  
97          archiver.setForced(true);
98  
99          final DefaultFileSet fs = new DefaultFileSet();
100         fs.setDirectory(sources);
101 
102         archiver.addFileSet(fs);
103 
104         assertEquals(1, tracker.added.size());
105 
106         final TrackingArchiver.Addition addition = tracker.added.get(0);
107         assertNotNull(addition.excludes);
108         assertEquals(1, addition.excludes.length);
109         assertEquals(workdir.getName(), addition.excludes[0]);
110     }
111 
112     @Test
113     public void addFile_NoPerms_CallAcceptFilesOnlyOnce() throws IOException, ArchiverException {
114         final Archiver delegate = mock(Archiver.class);
115 
116         final CounterSelector counter = new CounterSelector(true);
117         final List<FileSelector> selectors = new ArrayList<>();
118         selectors.add(counter);
119 
120         final AssemblyProxyArchiver archiver =
121                 new AssemblyProxyArchiver("", delegate, null, selectors, null, new File("."));
122         archiver.setForced(true);
123 
124         final File inputFile = temporaryFolder.newFile();
125         archiver.addFile(inputFile, "file.txt");
126 
127         assertEquals(1, counter.getCount());
128         verify(delegate).addFile(inputFile, "file.txt");
129         verify(delegate).setForced(true);
130     }
131 
132     @Test
133     @SuppressWarnings("deprecation")
134     public void addDirectory_NoPerms_CallAcceptFilesOnlyOnce() throws IOException, ArchiverException {
135         final Archiver delegate = new JarArchiver();
136 
137         final File output = temporaryFolder.newFile();
138 
139         delegate.setDestFile(output);
140 
141         final CounterSelector counter = new CounterSelector(true);
142         final List<FileSelector> selectors = new ArrayList<>();
143         selectors.add(counter);
144 
145         final AssemblyProxyArchiver archiver =
146                 new AssemblyProxyArchiver("", delegate, null, selectors, null, new File("."));
147 
148         archiver.setForced(true);
149 
150         final File dir = temporaryFolder.newFolder();
151         Files.write(
152                 dir.toPath().resolve("file.txt"), Collections.singletonList("This is a test."), StandardCharsets.UTF_8);
153 
154         archiver.addDirectory(dir);
155 
156         archiver.createArchive();
157 
158         assertEquals(1, counter.getCount());
159     }
160 
161     @Test
162     public void assemblyWorkDir() {
163         final Archiver delegate = mock(Archiver.class);
164         final List<FileSelector> selectors = new ArrayList<>();
165 
166         final AssemblyProxyArchiver archiver = new AssemblyProxyArchiver(
167                 "prefix", delegate, null, selectors, null, new File(temporaryFolder.getRoot(), "module1"));
168 
169         FileSet fileSet = mock(FileSet.class);
170         when(fileSet.getDirectory()).thenReturn(temporaryFolder.getRoot());
171         when(fileSet.getStreamTransformer()).thenReturn(mock(InputStreamTransformer.class));
172 
173         archiver.addFileSet(fileSet);
174 
175         ArgumentCaptor<FileSet> delFileSet = ArgumentCaptor.forClass(FileSet.class);
176         verify(delegate).addFileSet(delFileSet.capture());
177 
178         assertThat(delFileSet.getValue().getDirectory(), is(fileSet.getDirectory()));
179         assertThat(delFileSet.getValue().getExcludes(), is(new String[] {"module1"}));
180         assertThat(delFileSet.getValue().getFileMappers(), is(fileSet.getFileMappers()));
181         assertThat(delFileSet.getValue().getFileSelectors(), is(fileSet.getFileSelectors()));
182         assertThat(delFileSet.getValue().getIncludes(), is(new String[0]));
183         assertThat(delFileSet.getValue().getPrefix(), is("prefix/"));
184         assertThat(delFileSet.getValue().getStreamTransformer(), is(fileSet.getStreamTransformer()));
185     }
186 
187     private static final class CounterSelector implements FileSelector {
188 
189         private int count = 0;
190 
191         private boolean answer = false;
192 
193         public CounterSelector(final boolean answer) {
194             this.answer = answer;
195         }
196 
197         public int getCount() {
198             return count;
199         }
200 
201         public boolean isSelected(final FileInfo fileInfo) throws IOException {
202             if (fileInfo.isFile()) {
203                 count++;
204                 System.out.println("Counting file: " + fileInfo.getName() + ". Current count: " + count);
205             }
206 
207             return answer;
208         }
209     }
210 }