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