1d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann/******************************************************************************* 2d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors 3d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * All rights reserved. This program and the accompanying materials 4d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * are made available under the terms of the Eclipse Public License v1.0 5d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * which accompanies this distribution, and is available at 6d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * http://www.eclipse.org/legal/epl-v10.html 7d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * 8d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * Contributors: 9d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * Marc R. Hoffmann - initial API and implementation 10d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * 11d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann *******************************************************************************/ 12d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannpackage org.jacoco.cli.internal.commands; 13d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann 14d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport static org.junit.Assert.assertEquals; 15d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann 16d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.io.File; 17d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.io.FileOutputStream; 18d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.io.IOException; 19d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.util.Arrays; 20d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.util.HashSet; 21d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.util.Set; 22d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann 23d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.cli.internal.CommandTestBase; 24d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.core.data.ExecutionData; 25d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.core.data.ExecutionDataWriter; 26d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.core.tools.ExecFileLoader; 27d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.junit.Rule; 28d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.junit.Test; 29d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.junit.rules.TemporaryFolder; 30d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann 31d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann/** 32d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * Unit tests for {@link Merge}. 33d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann */ 34d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannpublic class MergeTest extends CommandTestBase { 35d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann 36d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann @Rule 37d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann public TemporaryFolder tmp = new TemporaryFolder(); 38d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann 39d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann @Test 4094ed743f66d67ddff24ccf9b83f120d3edd1f9d2Marc R. Hoffmann public void should_print_usage_when_no_options_are_given() 4194ed743f66d67ddff24ccf9b83f120d3edd1f9d2Marc R. Hoffmann throws Exception { 42d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann execute("merge"); 43d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann 44d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann assertFailure(); 45d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann assertContains("Option \"-destfile\" is required", err); 46d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann assertContains("java -jar jacococli.jar merge [<execfiles> ...]", err); 47d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann } 48d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann 49d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann @Test 5094ed743f66d67ddff24ccf9b83f120d3edd1f9d2Marc R. Hoffmann public void should_merge_exec_files() throws Exception { 51d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann File a = createExecFile("a"); 52d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann File b = createExecFile("b"); 53d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann File c = createExecFile("c"); 54d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann File dest = new File(tmp.getRoot(), "merged.exec"); 55d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann 56d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann execute("merge", "-destfile", dest.getAbsolutePath(), 57d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann a.getAbsolutePath(), b.getAbsolutePath(), c.getAbsolutePath()); 58d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann 59d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann assertOk(); 60d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann Set<String> names = loadExecFile(dest); 61d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann assertEquals(new HashSet<String>(Arrays.asList("a", "b", "c")), names); 62d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann } 63d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann 64d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann private File createExecFile(String name) throws IOException { 65d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann File file = new File(tmp.getRoot(), name + ".exec"); 66d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann final FileOutputStream execout = new FileOutputStream(file); 67d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann ExecutionDataWriter writer = new ExecutionDataWriter(execout); 68d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann writer.visitClassExecution(new ExecutionData(name.hashCode(), name, 69d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann new boolean[] { true })); 70d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann execout.close(); 71d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann return file; 72d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann } 73d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann 74d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann private Set<String> loadExecFile(File file) throws IOException { 75d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann ExecFileLoader loader = new ExecFileLoader(); 76d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann loader.load(file); 77d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann Set<String> names = new HashSet<String>(); 78d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann for (ExecutionData d : loader.getExecutionDataStore().getContents()) { 79d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann names.add(d.getName()); 80d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann } 81d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann return names; 82d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann } 83d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann 84d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann} 85