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.rat.analysis;
20  
21  import static org.assertj.core.api.Assertions.assertThat;
22  import static org.assertj.core.api.Assertions.assertThatThrownBy;
23  
24  import java.io.File;
25  import java.io.StringWriter;
26  
27  import java.net.URISyntaxException;
28  import java.util.ArrayList;
29  import java.util.List;
30  import java.util.stream.Stream;
31  import org.apache.rat.Defaults;
32  import org.apache.rat.ReportConfiguration;
33  import org.apache.rat.api.Document;
34  import org.apache.rat.document.DocumentNameMatcher;
35  import org.apache.rat.document.DocumentAnalyser;
36  import org.apache.rat.document.DocumentName;
37  import org.apache.rat.document.FileDocument;
38  import org.apache.rat.document.RatDocumentAnalysisException;
39  import org.apache.rat.report.claim.SimpleXmlClaimReporter;
40  import org.apache.rat.report.xml.writer.XmlWriter;
41  import org.apache.rat.test.utils.Resources;
42  import org.apache.rat.testhelpers.TestingDocument;
43  import org.apache.rat.testhelpers.TestingDocumentAnalyser;
44  import org.apache.rat.testhelpers.TextUtils;
45  import org.assertj.core.util.Files;
46  import org.junit.jupiter.api.BeforeEach;
47  import org.junit.jupiter.api.Test;
48  import org.junit.jupiter.params.ParameterizedTest;
49  import org.junit.jupiter.params.provider.Arguments;
50  import org.junit.jupiter.params.provider.MethodSource;
51  
52  public class AnalyserFactoryTest {
53  
54      private final DocumentName basedir;
55  
56      private StringWriter out;
57      private SimpleXmlClaimReporter reporter;
58      private DocumentAnalyser analyser;
59  
60      AnalyserFactoryTest() {
61          basedir = DocumentName.builder(new File(Files.currentFolder(), Resources.SRC_TEST_RESOURCES)).build();
62      }
63  
64      @BeforeEach
65      public void setUp() {
66          out = new StringWriter();
67          reporter = new SimpleXmlClaimReporter(new XmlWriter(out));
68          ReportConfiguration config = new ReportConfiguration();
69          config.addLicense(UnknownLicense.INSTANCE);
70          analyser = AnalyserFactory.createConfiguredAnalyser(config);
71      }
72  
73      @Test
74      public void standardTypeAnalyser() throws Exception {
75          final Document document = new FileDocument(basedir,
76                  Resources.getExampleResource("exampleData/Text.txt"), DocumentNameMatcher.MATCHES_ALL);
77          analyser.analyse(document);
78          assertThat(document.getMetaData().getDocumentType()).isEqualTo(Document.Type.STANDARD);
79          assertThat(document.getMetaData().getMediaType().toString()).isEqualTo("text/plain");
80          assertThat(document.getMetaData().licenses().count()).isEqualTo(1);
81          document.getMetaData().licenses().forEach(lic -> assertThat(lic).isEqualTo(UnknownLicense.INSTANCE));
82      }
83  
84      @Test
85      public void noteTypeAnalyser() throws Exception {
86          final Document document = new FileDocument(basedir,
87                  Resources.getExampleResource("exampleData/LICENSE"), DocumentNameMatcher.MATCHES_ALL);
88          analyser.analyse(document);
89          assertThat(document.getMetaData().getDocumentType()).isEqualTo(Document.Type.NOTICE);
90          assertThat(document.getMetaData().getMediaType().toString()).isEqualTo("text/plain");
91      }
92  
93      @Test
94      public void binaryTypeAnalyser() throws Exception {
95          final Document document = new FileDocument(basedir,
96                  Resources.getExampleResource("exampleData/Image.png"), DocumentNameMatcher.MATCHES_ALL);
97          analyser.analyse(document);
98          assertThat(document.getMetaData().getDocumentType()).isEqualTo(Document.Type.BINARY);
99          assertThat(document.getMetaData().getMediaType().toString()).isEqualTo("image/png");
100     }
101 
102     @Test
103     public void archiveTypeAnalyserTest() throws Exception {
104         final Document document = new FileDocument(basedir,
105                 Resources.getExampleResource("exampleData/dummy.jar"), DocumentNameMatcher.MATCHES_ALL);
106         Defaults defaults = Defaults.builder().build();
107         ReportConfiguration config = new ReportConfiguration();
108         config.setFrom(defaults);
109         analyser = AnalyserFactory.createConfiguredAnalyser(config);
110         analyser.analyse(document);
111         assertThat(document.getMetaData().getDocumentType()).isEqualTo(Document.Type.ARCHIVE);
112         assertThat(document.getMetaData().getMediaType().toString()).isEqualTo("application/java-archive");
113     }
114 
115     private static Stream<Arguments> archiveProcessingTestData() {
116         List<Arguments> lst = new ArrayList<>();
117         lst.add(Arguments.of(ReportConfiguration.Processing.NOTIFICATION, 0));
118         lst.add(Arguments.of(ReportConfiguration.Processing.PRESENCE, 1));
119         lst.add(Arguments.of(ReportConfiguration.Processing.ABSENCE, 2));
120         return lst.stream();
121     }
122 
123     @ParameterizedTest
124     @MethodSource("archiveProcessingTestData")
125     public void archiveProcessingTest(ReportConfiguration.Processing archiveProcessing, int expectedLicenseCount) throws Exception {
126         final Document document = new FileDocument(basedir,
127                 Resources.getExampleResource("exampleData/dummy.jar"), DocumentNameMatcher.MATCHES_ALL);
128         Defaults defaults = Defaults.builder().build();
129         ReportConfiguration config = new ReportConfiguration();
130         config.setFrom(defaults);
131         config.setArchiveProcessing(archiveProcessing);
132         document.getMetaData().setApprovalPredicate(config.getLicenseSetFactory().getApprovedLicensePredicate());
133         analyser = AnalyserFactory.createConfiguredAnalyser(config);
134         analyser.analyse(document);
135         assertThat(document.getMetaData().getDocumentType()).isEqualTo(Document.Type.ARCHIVE);
136         assertThat(document.getMetaData().getMediaType().toString()).isEqualTo("application/java-archive");
137         assertThat(document.getMetaData().licenses().count()).as(archiveProcessing.desc() + " count").isEqualTo(expectedLicenseCount);
138     }
139 
140     @Test
141     public void missingFileTest() throws URISyntaxException {
142         final Document document = new FileDocument(basedir,
143                 new File(Resources.getExampleResource("exampleData"), "not_a_real_file"), DocumentNameMatcher.MATCHES_ALL);
144         Defaults defaults = Defaults.builder().build();
145         ReportConfiguration config = new ReportConfiguration();
146         config.setFrom(defaults);
147         analyser = AnalyserFactory.createConfiguredAnalyser(config);
148         assertThatThrownBy(() -> analyser.analyse(document)).isInstanceOf(RatDocumentAnalysisException.class);
149     }
150 
151     @Test
152     public void archiveTypeAnalyser() throws Exception {
153         final Document document = new FileDocument(basedir,
154                 Resources.getExampleResource("exampleData/dummy.jar"), DocumentNameMatcher.MATCHES_ALL);
155         analyser.analyse(document);
156         assertThat(document.getMetaData().getDocumentType()).isEqualTo(Document.Type.ARCHIVE);
157         assertThat(document.getMetaData().getMediaType().toString()).isEqualTo("application/java-archive");
158     }
159 
160     @Test
161     public void RAT211_bmp_Test() throws Exception {
162         final Document document = new FileDocument(basedir,
163                 Resources.getResourceFile("/jira/RAT211/side_left.bmp"), DocumentNameMatcher.MATCHES_ALL);
164         analyser.analyse(document);
165         assertThat(document.getMetaData().getDocumentType()).isEqualTo(Document.Type.BINARY);
166         assertThat(document.getMetaData().getMediaType().toString()).isEqualTo("image/bmp");
167     }
168 
169     @Test
170     public void RAT211_dia_Test() throws Exception {
171         final Document document = new FileDocument(basedir,
172                 Resources.getResourceFile("/jira/RAT211/leader-election-message-arrives.dia"), DocumentNameMatcher.MATCHES_ALL);
173         analyser.analyse(document);
174         assertThat(document.getMetaData().getDocumentType()).isEqualTo(Document.Type.ARCHIVE);
175         assertThat(document.getMetaData().getMediaType().toString()).isEqualTo("application/gzip");
176     }
177 
178     @Test
179     public void RAT147_unix_Test() throws Exception {
180         final Document document = new FileDocument(basedir,
181                 Resources.getResourceFile("/jira/RAT147/unix-newlines.txt.bin"), DocumentNameMatcher.MATCHES_ALL);
182         analyser.analyse(document);
183         reporter.report(document);
184         String result = out.toString();
185         TextUtils.assertPatternInTarget(
186                 "<resource name='/jira/RAT147/unix-newlines.txt.bin' type='STANDARD'",
187                 result);
188     }
189 
190     @Test
191     public void RAT147_windows_Test() throws Exception {
192         final Document document = new FileDocument(basedir,
193                 Resources.getResourceFile("/jira/RAT147/windows-newlines.txt.bin"), DocumentNameMatcher.MATCHES_ALL);
194         analyser.analyse(document);
195         reporter.report(document);
196         String result = out.toString();
197         TextUtils.assertPatternInTarget(
198                 "<resource name='/jira/RAT147/windows-newlines.txt.bin' type='STANDARD'",
199                 result);
200     }
201 
202     @Test
203     public void standardNotificationTest() throws Exception {
204         Defaults defaults = Defaults.builder().build();
205         ReportConfiguration config = new ReportConfiguration();
206         config.setFrom(defaults);
207         config.setStandardProcessing(ReportConfiguration.Processing.NOTIFICATION);
208         analyser = AnalyserFactory.createConfiguredAnalyser(config);
209 
210         Document document = new FileDocument(basedir,
211                 Resources.getExampleResource("exampleData/Text.txt"), DocumentNameMatcher.MATCHES_ALL);
212         analyser.analyse(document);
213         assertThat(document.getMetaData().detectedLicense()).isFalse();
214 
215         document = new FileDocument(basedir,
216                 Resources.getExampleResource("exampleData/sub/Empty.txt"), DocumentNameMatcher.MATCHES_ALL);
217         analyser.analyse(document);
218         assertThat(document.getMetaData().detectedLicense()).isFalse();
219     }
220 
221     @Test
222     public void standardAbsenceTest() throws Exception {
223         Defaults defaults = Defaults.builder().build();
224         ReportConfiguration config = new ReportConfiguration();
225         config.setFrom(defaults);
226         config.setStandardProcessing(ReportConfiguration.Processing.ABSENCE);
227         analyser = AnalyserFactory.createConfiguredAnalyser(config);
228 
229         Document document = new FileDocument(basedir,
230                 Resources.getExampleResource("exampleData/Text.txt"), DocumentNameMatcher.MATCHES_ALL);
231         analyser.analyse(document);
232         assertThat(document.getMetaData().detectedLicense()).isTrue();
233 
234         document = new FileDocument(basedir,
235                 Resources.getExampleResource("exampleData/sub/Empty.txt"), DocumentNameMatcher.MATCHES_ALL);
236         analyser.analyse(document);
237         assertThat(document.getMetaData().detectedLicense()).isTrue();
238     }
239 
240     @Test
241     public void standardPresenceTest() throws Exception {
242         Defaults defaults = Defaults.builder().build();
243         ReportConfiguration config = new ReportConfiguration();
244         config.setFrom(defaults);
245         config.setStandardProcessing(ReportConfiguration.Processing.PRESENCE);
246         analyser = AnalyserFactory.createConfiguredAnalyser(config);
247 
248         Document document = new FileDocument(basedir,
249                 Resources.getExampleResource("exampleData/Text.txt"), DocumentNameMatcher.MATCHES_ALL);
250         analyser.analyse(document);
251         assertThat(document.getMetaData().detectedLicense()).isTrue();
252 
253         document = new FileDocument(basedir,
254                 Resources.getExampleResource("exampleData/sub/Empty.txt"), DocumentNameMatcher.MATCHES_ALL);
255         analyser.analyse(document);
256         assertThat(document.getMetaData().detectedLicense()).isFalse();
257     }
258 
259     @Test
260     public void testMultiplexer() throws Exception {
261         TestingDocumentAnalyser[] analysers = {
262                 new TestingDocumentAnalyser(),
263                 new TestingDocumentAnalyser(),
264                 new TestingDocumentAnalyser()
265         };
266         DocumentAnalyser multiplexer = AnalyserFactory.createMultiplexer(analysers);
267         TestingDocument document = new TestingDocument();
268 
269         multiplexer.analyse(document);
270         for (int i = 0; i < analysers.length; i++) {
271             assertThat(analysers[i].matches.size()).as("Matcher " + i).isEqualTo(1);
272             assertThat(analysers[i].matches.get(0)).as("Matcher " + i).isEqualTo(document);
273         }
274     }
275 }