xref: /OpenGrok/opengrok-indexer/src/test/java/org/opengrok/indexer/analysis/AnalyzerGuruTest.java (revision 52d10766ed1db3b0fd2c59a0da7292a32f244b50)
1b5840353SAdam Hornáček /*
2b5840353SAdam Hornáček  * CDDL HEADER START
3b5840353SAdam Hornáček  *
4b5840353SAdam Hornáček  * The contents of this file are subject to the terms of the
5b5840353SAdam Hornáček  * Common Development and Distribution License (the "License").
6b5840353SAdam Hornáček  * You may not use this file except in compliance with the License.
7b5840353SAdam Hornáček  *
8b5840353SAdam Hornáček  * See LICENSE.txt included in this distribution for the specific
9b5840353SAdam Hornáček  * language governing permissions and limitations under the License.
10b5840353SAdam Hornáček  *
11b5840353SAdam Hornáček  * When distributing Covered Code, include this CDDL HEADER in each
12b5840353SAdam Hornáček  * file and include the License file at LICENSE.txt.
13b5840353SAdam Hornáček  * If applicable, add the following below this CDDL HEADER, with the
14b5840353SAdam Hornáček  * fields enclosed by brackets "[]" replaced with your own identifying
15b5840353SAdam Hornáček  * information: Portions Copyright [yyyy] [name of copyright owner]
16b5840353SAdam Hornáček  *
17b5840353SAdam Hornáček  * CDDL HEADER END
18b5840353SAdam Hornáček  */
19b5840353SAdam Hornáček 
20b5840353SAdam Hornáček /*
21*52d10766SAdam Hornacek  * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved.
22b5840353SAdam Hornáček  * Portions Copyright (c) 2017, Chris Fraire <cfraire@me.com>.
23b5840353SAdam Hornáček  */
249805b761SAdam Hornáček package org.opengrok.indexer.analysis;
25b5840353SAdam Hornáček 
26b5840353SAdam Hornáček import java.io.ByteArrayInputStream;
27b5840353SAdam Hornáček import java.io.ByteArrayOutputStream;
28b5840353SAdam Hornáček import java.io.File;
29b5840353SAdam Hornáček import java.io.IOException;
30b5840353SAdam Hornáček import java.io.InputStream;
318ae5e262SAdam Hornacek import java.nio.charset.StandardCharsets;
32b5840353SAdam Hornáček import java.util.Map;
33b5840353SAdam Hornáček import java.util.jar.JarEntry;
34b5840353SAdam Hornáček import java.util.jar.JarOutputStream;
35b5840353SAdam Hornáček import java.util.zip.ZipEntry;
36b5840353SAdam Hornáček import java.util.zip.ZipOutputStream;
371161d3e8SAdam Hornacek 
38*52d10766SAdam Hornacek import org.junit.jupiter.api.Test;
399805b761SAdam Hornáček import org.opengrok.indexer.analysis.archive.ZipAnalyzer;
409805b761SAdam Hornáček import org.opengrok.indexer.analysis.c.CxxAnalyzerFactory;
419805b761SAdam Hornáček import org.opengrok.indexer.analysis.document.MandocAnalyzer;
429805b761SAdam Hornáček import org.opengrok.indexer.analysis.document.TroffAnalyzer;
439805b761SAdam Hornáček import org.opengrok.indexer.analysis.executables.ELFAnalyzer;
449805b761SAdam Hornáček import org.opengrok.indexer.analysis.executables.JarAnalyzer;
459805b761SAdam Hornáček import org.opengrok.indexer.analysis.executables.JavaClassAnalyzer;
469805b761SAdam Hornáček import org.opengrok.indexer.analysis.perl.PerlAnalyzer;
479805b761SAdam Hornáček import org.opengrok.indexer.analysis.plain.PlainAnalyzer;
489805b761SAdam Hornáček import org.opengrok.indexer.analysis.plain.XMLAnalyzer;
499805b761SAdam Hornáček import org.opengrok.indexer.analysis.sh.ShAnalyzer;
509805b761SAdam Hornáček import org.opengrok.indexer.analysis.sh.ShAnalyzerFactory;
511161d3e8SAdam Hornacek 
52*52d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertEquals;
53*52d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertNotEquals;
54*52d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertNotNull;
55*52d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertNotSame;
56*52d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertNull;
57*52d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertSame;
58*52d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertTrue;
59b5840353SAdam Hornáček 
60b5840353SAdam Hornáček /**
61b5840353SAdam Hornáček  * Tests for the functionality provided by the AnalyzerGuru class.
62b5840353SAdam Hornáček  */
63b5840353SAdam Hornáček public class AnalyzerGuruTest {
641161d3e8SAdam Hornacek 
65b5840353SAdam Hornáček     @Test
testGetFileTypeDescriptions()66b5840353SAdam Hornáček     public void testGetFileTypeDescriptions() {
67b5840353SAdam Hornáček         Map<String, String> map = AnalyzerGuru.getfileTypeDescriptions();
681161d3e8SAdam Hornacek         assertTrue(map.size() > 0);
69b5840353SAdam Hornáček     }
70b5840353SAdam Hornáček 
71b5840353SAdam Hornáček     /**
72b5840353SAdam Hornáček      * Test that we get the correct analyzer if the file name exactly matches a
73b5840353SAdam Hornáček      * known extension.
74b5840353SAdam Hornáček      */
75b5840353SAdam Hornáček     @Test
testFileNameSameAsExtension()76b5840353SAdam Hornáček     public void testFileNameSameAsExtension() throws Exception {
77b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(
788ae5e262SAdam Hornacek                 "#!/bin/sh\nexec /usr/bin/zip \"$@\"\n".getBytes(StandardCharsets.US_ASCII));
79b5840353SAdam Hornáček         String file = "/dummy/path/to/source/zip";
8057eefa47SKryštof Tulinger         AbstractAnalyzer fa = AnalyzerGuru.getAnalyzer(in, file);
81b5840353SAdam Hornáček         assertSame(ShAnalyzer.class, fa.getClass());
82b5840353SAdam Hornáček     }
83b5840353SAdam Hornáček 
84b5840353SAdam Hornáček     @Test
testUTF8ByteOrderMark()85b5840353SAdam Hornáček     public void testUTF8ByteOrderMark() throws Exception {
86b5840353SAdam Hornáček         byte[] xml = {(byte) 0xEF, (byte) 0xBB, (byte) 0xBF, // UTF-8 BOM
87b5840353SAdam Hornáček                 '<', '?', 'x', 'm', 'l', ' ',
88b5840353SAdam Hornáček                 'v', 'e', 'r', 's', 'i', 'o', 'n', '=',
89b5840353SAdam Hornáček                 '"', '1', '.', '0', '"', '?', '>'};
90b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(xml);
9157eefa47SKryštof Tulinger         AbstractAnalyzer fa = AnalyzerGuru.getAnalyzer(in, "/dummy/file");
92b5840353SAdam Hornáček         assertSame(XMLAnalyzer.class, fa.getClass());
93b5840353SAdam Hornáček     }
94b5840353SAdam Hornáček 
95b5840353SAdam Hornáček     @Test
testUTF8ByteOrderMarkPlusCopyrightSymbol()96b5840353SAdam Hornáček     public void testUTF8ByteOrderMarkPlusCopyrightSymbol() throws Exception {
97b5840353SAdam Hornáček         byte[] doc = {(byte) 0xEF, (byte) 0xBB, (byte) 0xBF, // UTF-8 BOM
98b5840353SAdam Hornáček                 '/', '/', ' ', (byte) 0xC2, (byte) 0xA9};
99b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(doc);
10057eefa47SKryštof Tulinger         AbstractAnalyzer fa = AnalyzerGuru.getAnalyzer(in, "/dummy/file");
101*52d10766SAdam Hornacek         assertSame(PlainAnalyzer.class, fa.getClass(), "despite BOM as precise match,");
102b5840353SAdam Hornáček     }
103b5840353SAdam Hornáček 
104b5840353SAdam Hornáček     @Test
testUTF8ByteOrderMarkPlainFile()105b5840353SAdam Hornáček     public void testUTF8ByteOrderMarkPlainFile() throws Exception {
106b5840353SAdam Hornáček         byte[] bytes = {(byte) 0xEF, (byte) 0xBB, (byte) 0xBF, // UTF-8 BOM
107b5840353SAdam Hornáček                 'h', 'e', 'l', 'l', 'o', ' ',
108b5840353SAdam Hornáček                 'w', 'o', 'r', 'l', 'd'};
109b5840353SAdam Hornáček 
110b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(bytes);
11157eefa47SKryštof Tulinger         AbstractAnalyzer fa = AnalyzerGuru.getAnalyzer(in, "/dummy/file");
112b5840353SAdam Hornáček         assertSame(PlainAnalyzer.class, fa.getClass());
113b5840353SAdam Hornáček     }
114b5840353SAdam Hornáček 
115b5840353SAdam Hornáček     @Test
testUTF16BigByteOrderMarkPlusCopyrightSymbol()116b5840353SAdam Hornáček     public void testUTF16BigByteOrderMarkPlusCopyrightSymbol() throws Exception {
117b5840353SAdam Hornáček         byte[] doc = {(byte) 0xFE, (byte) 0xFF, // UTF-16BE BOM
118b5840353SAdam Hornáček                 0, '#', 0, ' ', (byte) 0xC2, (byte) 0xA9};
119b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(doc);
12057eefa47SKryštof Tulinger         AbstractAnalyzer fa = AnalyzerGuru.getAnalyzer(in, "/dummy/file");
121*52d10766SAdam Hornacek         assertSame(PlainAnalyzer.class, fa.getClass(), "despite BOM as precise match,");
122b5840353SAdam Hornáček     }
123b5840353SAdam Hornáček 
124b5840353SAdam Hornáček     @Test
testUTF16LittleByteOrderMarkPlusCopyrightSymbol()125b5840353SAdam Hornáček     public void testUTF16LittleByteOrderMarkPlusCopyrightSymbol() throws Exception {
126b5840353SAdam Hornáček         byte[] doc = {(byte) 0xFF, (byte) 0xFE, // UTF-16BE BOM
127b5840353SAdam Hornáček                 '#', 0, ' ', 0, (byte) 0xA9, (byte) 0xC2};
128b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(doc);
12957eefa47SKryštof Tulinger         AbstractAnalyzer fa = AnalyzerGuru.getAnalyzer(in, "/dummy/file");
130*52d10766SAdam Hornacek         assertSame(PlainAnalyzer.class, fa.getClass(), "despite BOM as precise match,");
131b5840353SAdam Hornáček     }
132b5840353SAdam Hornáček 
133b5840353SAdam Hornáček     @Test
addExtension()134b5840353SAdam Hornáček     public void addExtension() throws Exception {
135b5840353SAdam Hornáček         // should not find analyzer for this unlikely extension
136b5840353SAdam Hornáček         assertNull(AnalyzerGuru.find("file.unlikely_extension"));
137b5840353SAdam Hornáček 
13857eefa47SKryštof Tulinger         AnalyzerFactory
139b5840353SAdam Hornáček                 faf = AnalyzerGuru.findFactory(ShAnalyzerFactory.class.getName());
140b5840353SAdam Hornáček         // should be the same factory as the built-in analyzer for sh scripts
141b5840353SAdam Hornáček         assertSame(AnalyzerGuru.find("myscript.sh"), faf);
142b5840353SAdam Hornáček 
143b5840353SAdam Hornáček         // add an analyzer for the extension and see that it is picked up
144b5840353SAdam Hornáček         AnalyzerGuru.addExtension("UNLIKELY_EXTENSION", faf);
1451161d3e8SAdam Hornacek         assertSame(ShAnalyzerFactory.class, AnalyzerGuru.find("file.unlikely_extension").getClass());
146b5840353SAdam Hornáček 
147b5840353SAdam Hornáček         // remove the mapping and verify that it is gone
148b5840353SAdam Hornáček         AnalyzerGuru.addExtension("UNLIKELY_EXTENSION", null);
149b5840353SAdam Hornáček         assertNull(AnalyzerGuru.find("file.unlikely_extension"));
150b5840353SAdam Hornáček     }
151b5840353SAdam Hornáček 
152b5840353SAdam Hornáček     @Test
addPrefix()153b5840353SAdam Hornáček     public void addPrefix() throws Exception {
154b5840353SAdam Hornáček         // should not find analyzer for this unlikely extension
155b5840353SAdam Hornáček         assertNull(AnalyzerGuru.find("unlikely_prefix.foo"));
156b5840353SAdam Hornáček 
15757eefa47SKryštof Tulinger         AnalyzerFactory
158b5840353SAdam Hornáček                 faf = AnalyzerGuru.findFactory(ShAnalyzerFactory.class.getName());
159b5840353SAdam Hornáček         // should be the same factory as the built-in analyzer for sh scripts
160b5840353SAdam Hornáček         assertSame(AnalyzerGuru.find("myscript.sh"), faf);
161b5840353SAdam Hornáček 
162b5840353SAdam Hornáček         // add an analyzer for the prefix and see that it is picked up
163b5840353SAdam Hornáček         AnalyzerGuru.addPrefix("UNLIKELY_PREFIX", faf);
1641161d3e8SAdam Hornacek         assertSame(ShAnalyzerFactory.class, AnalyzerGuru.find("unlikely_prefix.foo").getClass());
165b5840353SAdam Hornáček 
166b5840353SAdam Hornáček         // remove the mapping and verify that it is gone
167b5840353SAdam Hornáček         AnalyzerGuru.addPrefix("UNLIKELY_PREFIX", null);
168b5840353SAdam Hornáček         assertNull(AnalyzerGuru.find("unlikely_prefix.foo"));
169b5840353SAdam Hornáček     }
170b5840353SAdam Hornáček 
171b5840353SAdam Hornáček     @Test
testZip()172b5840353SAdam Hornáček     public void testZip() throws IOException {
173b5840353SAdam Hornáček         ByteArrayOutputStream baos = new ByteArrayOutputStream();
174b5840353SAdam Hornáček         ZipOutputStream zos = new ZipOutputStream(baos);
175b5840353SAdam Hornáček         zos.putNextEntry(new ZipEntry("dummy"));
176b5840353SAdam Hornáček         zos.closeEntry();
177b5840353SAdam Hornáček         zos.close();
178b5840353SAdam Hornáček         InputStream in = new ByteArrayInputStream(baos.toByteArray());
17957eefa47SKryštof Tulinger         AbstractAnalyzer fa = AnalyzerGuru.getAnalyzer(in, "dummy");
180b5840353SAdam Hornáček         assertSame(ZipAnalyzer.class, fa.getClass());
181b5840353SAdam Hornáček     }
182b5840353SAdam Hornáček 
183b5840353SAdam Hornáček     @Test
testJar()184b5840353SAdam Hornáček     public void testJar() throws IOException {
185b5840353SAdam Hornáček         ByteArrayOutputStream baos = new ByteArrayOutputStream();
186b5840353SAdam Hornáček         JarOutputStream jos = new JarOutputStream(baos);
187b5840353SAdam Hornáček         jos.putNextEntry(new JarEntry("dummy"));
188b5840353SAdam Hornáček         jos.closeEntry();
189b5840353SAdam Hornáček         jos.close();
190b5840353SAdam Hornáček         InputStream in = new ByteArrayInputStream(baos.toByteArray());
19157eefa47SKryštof Tulinger         AbstractAnalyzer fa = AnalyzerGuru.getAnalyzer(in, "dummy");
192b5840353SAdam Hornáček         assertSame(JarAnalyzer.class, fa.getClass());
193b5840353SAdam Hornáček     }
194b5840353SAdam Hornáček 
195b5840353SAdam Hornáček     @Test
testPlainText()196b5840353SAdam Hornáček     public void testPlainText() throws IOException {
197b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(
1988ae5e262SAdam Hornacek                 "This is a plain text file.".getBytes(StandardCharsets.US_ASCII));
1991161d3e8SAdam Hornacek         assertSame(PlainAnalyzer.class, AnalyzerGuru.getAnalyzer(in, "dummy").getClass());
200b5840353SAdam Hornáček     }
201b5840353SAdam Hornáček 
202b5840353SAdam Hornáček     @Test
rfe2969()203b5840353SAdam Hornáček     public void rfe2969() {
20457eefa47SKryštof Tulinger         AnalyzerFactory faf = AnalyzerGuru.find("foo.hxx");
205b5840353SAdam Hornáček         assertNotNull(faf);
206b5840353SAdam Hornáček         assertSame(CxxAnalyzerFactory.class, faf.getClass());
207b5840353SAdam Hornáček     }
208b5840353SAdam Hornáček 
209b5840353SAdam Hornáček     @Test
rfe3401()210b5840353SAdam Hornáček     public void rfe3401() {
21157eefa47SKryštof Tulinger         AnalyzerFactory f1 = AnalyzerGuru.find("main.c");
212b5840353SAdam Hornáček         assertNotNull(f1);
21357eefa47SKryštof Tulinger         AnalyzerFactory f2 = AnalyzerGuru.find("main.cc");
214b5840353SAdam Hornáček         assertNotNull(f2);
215b5840353SAdam Hornáček         assertNotSame(f1.getClass(), f2.getClass());
216b5840353SAdam Hornáček     }
217b5840353SAdam Hornáček 
218b5840353SAdam Hornáček     /**
219b5840353SAdam Hornáček      * Test that matching of full names works. Bug #859.
220b5840353SAdam Hornáček      */
221b5840353SAdam Hornáček     @Test
matchesFullName()222b5840353SAdam Hornáček     public void matchesFullName() {
223b5840353SAdam Hornáček         String s = File.separator;  // so test works on Unix and Windows
224b5840353SAdam Hornáček         String path = s + "path" + s + "to" + s + "Makefile";
22557eefa47SKryštof Tulinger         AnalyzerFactory faf = AnalyzerGuru.find(path);
226b5840353SAdam Hornáček         assertSame(ShAnalyzerFactory.class, faf.getClass());
227b5840353SAdam Hornáček         faf = AnalyzerGuru.find("GNUMakefile");
228b5840353SAdam Hornáček         assertSame(ShAnalyzerFactory.class, faf.getClass());
229b5840353SAdam Hornáček     }
230b5840353SAdam Hornáček 
231b5840353SAdam Hornáček     /**
232b5840353SAdam Hornáček      * Test for obtaining a language analyzer's factory class.
233b5840353SAdam Hornáček      * This should not fail even if package names change.
234b5840353SAdam Hornáček      * The only assumptions made is that all the language analyzer
235b5840353SAdam Hornáček      * and factory names follow the pattern:
2361161d3e8SAdam Hornacek      * <p>
237b5840353SAdam Hornáček      * language + "Analyzer",  and
238b5840353SAdam Hornáček      * language + "AnalyzerFactory"
239b5840353SAdam Hornáček      */
240b5840353SAdam Hornáček     @Test
getAnalyzerFactoryClass()241b5840353SAdam Hornáček     public void getAnalyzerFactoryClass() {
2428ae5e262SAdam Hornacek         Class<?> fcForSh = AnalyzerGuru.getFactoryClass("Sh");
2438ae5e262SAdam Hornacek         Class<?> fcForShAnalyzer = AnalyzerGuru.getFactoryClass("ShAnalyzer");
2448ae5e262SAdam Hornacek         Class<?> fcSimpleName = AnalyzerGuru.getFactoryClass("ShAnalyzerFactory");
2458ae5e262SAdam Hornacek         assertEquals(ShAnalyzerFactory.class, fcForSh);
2468ae5e262SAdam Hornacek         assertEquals(ShAnalyzerFactory.class, fcForShAnalyzer);
2478ae5e262SAdam Hornacek         assertEquals(ShAnalyzerFactory.class, fcSimpleName);
248b5840353SAdam Hornáček 
2498ae5e262SAdam Hornacek         Class<?> fc = AnalyzerGuru.getFactoryClass("UnknownAnalyzerFactory");
250b5840353SAdam Hornáček         assertNull(fc);
251b5840353SAdam Hornáček     }
252b5840353SAdam Hornáček 
253b5840353SAdam Hornáček     @Test
shouldNotThrowGettingCsprojOpening()254b5840353SAdam Hornáček     public void shouldNotThrowGettingCsprojOpening() throws IOException {
2551161d3e8SAdam Hornacek         InputStream res = getClass().getClassLoader().getResourceAsStream("analysis/a.csproj");
256*52d10766SAdam Hornacek         assertNotNull(res, "despite embedded a.csproj,");
257*52d10766SAdam Hornacek         assertSame(XMLAnalyzer.class, AnalyzerGuru.getAnalyzer(res, "dummy").getClass(), "despite normal a.csproj,");
258b5840353SAdam Hornáček     }
259b5840353SAdam Hornáček 
260b5840353SAdam Hornáček     @Test
shouldMatchPerlHashbang()261b5840353SAdam Hornáček     public void shouldMatchPerlHashbang() throws IOException {
262b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(
2638ae5e262SAdam Hornacek                 "#!/usr/bin/perl -w".getBytes(StandardCharsets.US_ASCII));
264*52d10766SAdam Hornacek         assertSame(PerlAnalyzer.class, AnalyzerGuru.getAnalyzer(in, "dummy").getClass(), "despite Perl hashbang,");
265b5840353SAdam Hornáček     }
266b5840353SAdam Hornáček 
267b5840353SAdam Hornáček     @Test
shouldMatchPerlHashbangSpaced()268b5840353SAdam Hornáček     public void shouldMatchPerlHashbangSpaced() throws IOException {
269b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(
2708ae5e262SAdam Hornacek                 "\n\t #!  /usr/bin/perl -w".getBytes(StandardCharsets.US_ASCII));
271*52d10766SAdam Hornacek         assertSame(PerlAnalyzer.class, AnalyzerGuru.getAnalyzer(in, "dummy").getClass(), "despite Perl hashbang,");
272b5840353SAdam Hornáček     }
273b5840353SAdam Hornáček 
274b5840353SAdam Hornáček     @Test
shouldMatchEnvPerlHashbang()275b5840353SAdam Hornáček     public void shouldMatchEnvPerlHashbang() throws IOException {
276b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(
2778ae5e262SAdam Hornacek                 "#!/usr/bin/env perl -w".getBytes(StandardCharsets.US_ASCII));
278*52d10766SAdam Hornacek         assertSame(PerlAnalyzer.class, AnalyzerGuru.getAnalyzer(in, "dummy").getClass(), "despite env hashbang with perl,");
279b5840353SAdam Hornáček     }
280b5840353SAdam Hornáček 
281b5840353SAdam Hornáček     @Test
shouldMatchEnvPerlHashbangSpaced()282b5840353SAdam Hornáček     public void shouldMatchEnvPerlHashbangSpaced() throws IOException {
283b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(
2848ae5e262SAdam Hornacek                 "\n\t #!  /usr/bin/env\t perl -w".getBytes(StandardCharsets.US_ASCII));
285*52d10766SAdam Hornacek         assertSame(PerlAnalyzer.class, AnalyzerGuru.getAnalyzer(in, "dummy").getClass(),
286*52d10766SAdam Hornacek                 "despite env hashbang with perl,");
287b5840353SAdam Hornáček     }
288b5840353SAdam Hornáček 
289b5840353SAdam Hornáček     @Test
shouldNotMatchEnvLFPerlHashbang()290b5840353SAdam Hornáček     public void shouldNotMatchEnvLFPerlHashbang() throws IOException {
291b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(
2928ae5e262SAdam Hornacek                 "#!/usr/bin/env\nperl".getBytes(StandardCharsets.US_ASCII));
293*52d10766SAdam Hornacek         assertNotSame(PerlAnalyzer.class, AnalyzerGuru.getAnalyzer(in, "dummy").getClass(), "despite env hashbang LF,");
294b5840353SAdam Hornáček     }
295b5840353SAdam Hornáček 
296b5840353SAdam Hornáček     @Test
shouldMatchELFMagic()297b5840353SAdam Hornáček     public void shouldMatchELFMagic() throws Exception {
298b5840353SAdam Hornáček         byte[] elfmt = {(byte) 0x7F, 'E', 'L', 'F', (byte) 2, (byte) 2, (byte) 1,
299b5840353SAdam Hornáček                 (byte) 0x06};
300b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(elfmt);
30157eefa47SKryštof Tulinger         AbstractAnalyzer fa = AnalyzerGuru.getAnalyzer(in, "/dummy/file");
302*52d10766SAdam Hornacek         assertSame(ELFAnalyzer.class, fa.getClass(), "despite \\177ELF magic,");
303b5840353SAdam Hornáček     }
304b5840353SAdam Hornáček 
305b5840353SAdam Hornáček     @Test
shouldMatchJavaClassMagic()306b5840353SAdam Hornáček     public void shouldMatchJavaClassMagic() throws Exception {
307b5840353SAdam Hornáček         String oldMagic = "\312\376\272\276";      // cafebabe?
308b5840353SAdam Hornáček         String newMagic = new String(new byte[] {(byte) 0xCA, (byte) 0xFE,
3098ae5e262SAdam Hornacek                 (byte) 0xBA, (byte) 0xBE}, StandardCharsets.UTF_8);
310*52d10766SAdam Hornacek         assertNotEquals(oldMagic, newMagic, "despite octal string, escape it as unicode,");
311b5840353SAdam Hornáček 
312b5840353SAdam Hornáček         // 0xCAFEBABE (4), minor (2), major (2)
313b5840353SAdam Hornáček         byte[] dotclass = {(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE,
314b5840353SAdam Hornáček                 (byte) 0, (byte) 1, (byte) 0, (byte) 0x34};
315b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(dotclass);
31657eefa47SKryštof Tulinger         AbstractAnalyzer fa = AnalyzerGuru.getAnalyzer(in, "/dummy/file");
317*52d10766SAdam Hornacek         assertSame(JavaClassAnalyzer.class, fa.getClass(), "despite 0xCAFEBABE magic,");
318b5840353SAdam Hornáček     }
319b5840353SAdam Hornáček 
320b5840353SAdam Hornáček     @Test
shouldMatchTroffMagic()321b5840353SAdam Hornáček     public void shouldMatchTroffMagic() throws Exception {
3221161d3e8SAdam Hornacek         byte[] mandoc = {' ', '\n', '.', '\"', '\n', '.', 'T', 'H', (byte) 0x20, '\n'};
323b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(mandoc);
32457eefa47SKryštof Tulinger         AbstractAnalyzer fa = AnalyzerGuru.getAnalyzer(in, "/dummy/file");
325*52d10766SAdam Hornacek         assertSame(TroffAnalyzer.class, fa.getClass(), "despite .TH magic,");
326b5840353SAdam Hornáček     }
327b5840353SAdam Hornáček 
328b5840353SAdam Hornáček     @Test
shouldMatchMandocMagic()329b5840353SAdam Hornáček     public void shouldMatchMandocMagic() throws Exception {
3301161d3e8SAdam Hornacek         byte[] mandoc = {'\n', ' ', '.', '\"', '\n', '.', 'D', 'd', (byte) 0x20, '\n'};
331b5840353SAdam Hornáček         ByteArrayInputStream in = new ByteArrayInputStream(mandoc);
33257eefa47SKryštof Tulinger         AbstractAnalyzer fa = AnalyzerGuru.getAnalyzer(in, "/dummy/file");
333*52d10766SAdam Hornacek         assertSame(MandocAnalyzer.class, fa.getClass(), "despite .Dd magic,");
334b5840353SAdam Hornáček     }
335b5840353SAdam Hornáček }
336