InstrumentTest.java revision 13f12d39db0b3c0ddc60124572e5d4f984be0255
113f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann/******************************************************************************* 213f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors 313f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann * All rights reserved. This program and the accompanying materials 413f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann * are made available under the terms of the Eclipse Public License v1.0 513f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann * which accompanies this distribution, and is available at 613f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann * http://www.eclipse.org/legal/epl-v10.html 713f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann * 813f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann * Contributors: 913f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann * Marc R. Hoffmann - initial API and implementation 1013f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann * 1113f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann *******************************************************************************/ 1213f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannpackage org.jacoco.cli.internal.commands; 1313f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 1413f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport static org.junit.Assert.assertArrayEquals; 1513f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport static org.junit.Assert.assertFalse; 1613f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport static org.junit.Assert.assertTrue; 1713f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport static org.junit.Assert.fail; 1813f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 1913f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport java.io.File; 2013f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport java.io.FileInputStream; 2113f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport java.io.FileOutputStream; 2213f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport java.io.IOException; 2313f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport java.io.InputStream; 2413f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport java.io.OutputStream; 2513f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport java.util.HashSet; 2613f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport java.util.Set; 2713f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 2813f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport org.jacoco.cli.internal.CommandTestBase; 2913f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport org.junit.Rule; 3013f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport org.junit.Test; 3113f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport org.junit.rules.TemporaryFolder; 3213f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport org.objectweb.asm.ClassReader; 3313f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport org.objectweb.asm.ClassVisitor; 3413f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport org.objectweb.asm.FieldVisitor; 3513f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannimport org.objectweb.asm.Opcodes; 3613f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 3713f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann/** 3813f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann * Unit tests for {@link Instrument}. 3913f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann */ 4013f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmannpublic class InstrumentTest extends CommandTestBase { 4113f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 4213f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann @Rule 4313f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann public TemporaryFolder tmp = new TemporaryFolder(); 4413f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 4513f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann @Test 4613f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann public void should_print_usage_when_no_options_are_given() 4713f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann throws Exception { 4813f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann execute("instrument"); 4913f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann assertFailure(); 5013f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann assertContains("Option \"--dest\" is required", err); 5113f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann assertContains( 5213f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann "Usage: java -jar jacococli.jar instrument [<sourcefiles> ...]", 5313f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann err); 5413f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann } 5513f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 5613f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann @Test 5713f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann public void should_instrument_class_files_and_copy_resources() 5813f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann throws Exception { 5913f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann File destdir = tmp.getRoot(); 6013f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 6113f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann execute("instrument", "--dest", destdir.getAbsolutePath(), 6213f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann getClassPath()); 6313f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 6413f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann assertOk(); 6513f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann assertContains("[INFO] 14 classes instrumented to " 6613f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann + destdir.getAbsolutePath(), out); 6713f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 6813f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann // non class-file resources are copied: 6913f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann assertTrue(new File(destdir, "about.html").isFile()); 7013f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 7113f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann assertInstrumented(new File(destdir, 7213f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann "org/jacoco/cli/internal/commands/InstrumentTest.class")); 7313f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann } 7413f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 7513f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann @Test 7613f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann public void should_not_instrument_anything_when_no_source_is_given() 7713f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann throws Exception { 7813f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann File destdir = tmp.getRoot(); 7913f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 8013f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann execute("instrument", "--dest", destdir.getAbsolutePath()); 8113f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 8213f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann assertOk(); 8313f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann assertArrayEquals(new String[0], destdir.list()); 8413f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann } 8513f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 8613f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann @Test 8713f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann public void should_not_create_dest_file_when_source_class_is_broken() 8813f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann throws Exception { 8913f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann File srcdir = new File(tmp.getRoot(), "src"); 9013f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann srcdir.mkdir(); 9113f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann File destdir = new File(tmp.getRoot(), "dest"); 9213f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann destdir.mkdir(); 9313f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 9413f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann OutputStream out = new FileOutputStream( 9513f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann new File(srcdir, "Broken.class")); 9613f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann out.write((byte) 0xca); 9713f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann out.write((byte) 0xfe); 9813f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann out.write((byte) 0xba); 9913f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann out.write((byte) 0xbe); 10013f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann out.write((byte) 0x00); 10113f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann out.write((byte) 0x00); 10213f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann out.write((byte) 0x00); 10313f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann out.write((byte) 50); 10413f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann out.close(); 10513f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 10613f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann try { 10713f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann execute("instrument", "--dest", destdir.getAbsolutePath(), 10813f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann srcdir.getAbsolutePath()); 10913f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann fail("exception expected"); 11013f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann } catch (IOException expected) { 11113f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann } 11213f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 11313f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann assertFalse(new File(destdir, "Broken.class").exists()); 11413f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann } 11513f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 11613f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann private void assertInstrumented(File classfile) throws IOException { 11713f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann InputStream in = new FileInputStream(classfile); 11813f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann ClassReader reader = new ClassReader(in); 11913f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann in.close(); 12013f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann final Set<String> fields = new HashSet<String>(); 12113f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann reader.accept(new ClassVisitor(Opcodes.ASM5) { 12213f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann @Override 12313f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann public FieldVisitor visitField(int access, String name, String desc, 12413f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann String signature, Object value) { 12513f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann fields.add(name); 12613f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann return null; 12713f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann } 12813f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann }, 0); 12913f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann assertTrue(fields.contains("$jacocoData")); 13013f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann } 13113f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann 13213f12d39db0b3c0ddc60124572e5d4f984be0255Marc R. Hoffmann} 133