/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * See LICENSE.txt included in this distribution for the specific * language governing permissions and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at LICENSE.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ package org.opensolaris.opengrok.analysis; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import org.junit.Test; import org.opensolaris.opengrok.analysis.archive.ZipAnalyzer; import org.opensolaris.opengrok.analysis.c.CxxAnalyzerFactory; import org.opensolaris.opengrok.analysis.executables.JarAnalyzer; import org.opensolaris.opengrok.analysis.plain.PlainAnalyzer; import org.opensolaris.opengrok.analysis.plain.XMLAnalyzer; import org.opensolaris.opengrok.analysis.sh.ShAnalyzer; import org.opensolaris.opengrok.analysis.sh.ShAnalyzerFactory; import static org.junit.Assert.*; /** * Tests for the functionality provided by the AnalyzerGuru class. */ public class AnalyzerGuruTest { /** * Test that we get the correct analyzer if the file name exactly matches a * known extension. */ @Test public void testFileNameSameAsExtension() throws Exception { ByteArrayInputStream in = new ByteArrayInputStream( "#!/bin/sh\nexec /usr/bin/zip \"$@\"\n".getBytes("US-ASCII")); String file = "/dummy/path/to/source/zip"; FileAnalyzer fa = AnalyzerGuru.getAnalyzer(in, file); assertSame(ShAnalyzer.class, fa.getClass()); } @Test public void testUTF8ByteOrderMark() throws Exception { byte[] xml = {(byte) 0xEF, (byte) 0xBB, (byte) 0xBF, // UTF-8 BOM '<', '?', 'x', 'm', 'l', ' ', 'v', 'e', 'r', 's', 'i', 'o', 'n', '=', '"', '1', '.', '0', '"', '?', '>'}; ByteArrayInputStream in = new ByteArrayInputStream(xml); FileAnalyzer fa = AnalyzerGuru.getAnalyzer(in, "/dummy/file"); assertSame(XMLAnalyzer.class, fa.getClass()); } @Test public void testUTF8ByteOrderMarkPlainFile() throws Exception { byte[] bytes = {(byte) 0xEF, (byte) 0xBB, (byte) 0xBF, // UTF-8 BOM 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'}; ByteArrayInputStream in = new ByteArrayInputStream(bytes); FileAnalyzer fa = AnalyzerGuru.getAnalyzer(in, "/dummy/file"); assertSame(PlainAnalyzer.class, fa.getClass()); } @Test public void addExtension() throws Exception { // should not find analyzer for this unlikely extension assertNull(AnalyzerGuru.find("file.unlikely_extension")); FileAnalyzerFactory faf = AnalyzerGuru.findFactory(ShAnalyzerFactory.class.getName()); // should be the same factory as the built-in analyzer for sh scripts assertSame(AnalyzerGuru.find("myscript.sh"), faf); // add an analyzer for the extension and see that it is picked up AnalyzerGuru.addExtension("UNLIKELY_EXTENSION", faf); assertSame(ShAnalyzerFactory.class, AnalyzerGuru.find("file.unlikely_extension").getClass()); // remove the mapping and verify that it is gone AnalyzerGuru.addExtension("UNLIKELY_EXTENSION", null); assertNull(AnalyzerGuru.find("file.unlikely_extension")); } @Test public void testZip() throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ZipOutputStream zos = new ZipOutputStream(baos); zos.putNextEntry(new ZipEntry("dummy")); zos.closeEntry(); zos.close(); InputStream in = new ByteArrayInputStream(baos.toByteArray()); FileAnalyzer fa = AnalyzerGuru.getAnalyzer(in, "dummy"); assertSame(ZipAnalyzer.class, fa.getClass()); } @Test public void testJar() throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); JarOutputStream jos = new JarOutputStream(baos); jos.putNextEntry(new JarEntry("dummy")); jos.closeEntry(); jos.close(); InputStream in = new ByteArrayInputStream(baos.toByteArray()); FileAnalyzer fa = AnalyzerGuru.getAnalyzer(in, "dummy"); assertSame(JarAnalyzer.class, fa.getClass()); } @Test public void testPlainText() throws IOException { ByteArrayInputStream in = new ByteArrayInputStream( "This is a plain text file.".getBytes("US-ASCII")); assertSame(PlainAnalyzer.class, AnalyzerGuru.getAnalyzer(in, "dummy").getClass()); } @Test public void rfe2969() { FileAnalyzerFactory faf = AnalyzerGuru.find("foo.hxx"); assertNotNull(faf); assertSame(CxxAnalyzerFactory.class, faf.getClass()); } @Test public void rfe3401() { FileAnalyzerFactory f1 = AnalyzerGuru.find("main.c"); assertNotNull(f1); FileAnalyzerFactory f2 = AnalyzerGuru.find("main.cc"); assertNotNull(f2); assertNotSame(f1.getClass(), f2.getClass()); } /** * Test that matching of full names works. Bug #859. */ @Test public void matchesFullName() { FileAnalyzerFactory faf = AnalyzerGuru.find("/path/to/Makefile"); assertSame(ShAnalyzerFactory.class, faf.getClass()); faf = AnalyzerGuru.find("GNUMakefile"); assertSame(ShAnalyzerFactory.class, faf.getClass()); } }