blob: 4ab6ac88863b479056e64aff1c6ed4054462f5c4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marc R. Hoffmann - initial API and implementation
*
*******************************************************************************/
package org.jacoco.report;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.junit.Before;
import org.junit.Test;
/**
* Unit tests for {@link ZipMultiReportOutput}.
*/
public class ZipMultiReportOutputTest {
private ByteArrayOutputStream buffer;
private ZipMultiReportOutput zipOutput;
@Before
public void setup() throws Exception {
buffer = new ByteArrayOutputStream();
zipOutput = new ZipMultiReportOutput(buffer);
}
@Test
public void testWrite1() throws IOException {
final byte[] content1 = "HelloZip".getBytes();
OutputStream out = zipOutput.createFile("a.txt");
out.write(content1);
out.close();
zipOutput.close();
final Map<String, byte[]> entries = readEntries();
assertEquals(Collections.singleton("a.txt"), entries.keySet());
assertArrayEquals(content1, entries.get("a.txt"));
}
@Test
public void testWrite2() throws IOException {
final byte[] content1 = "HelloZip".getBytes("ISO-8859-1");
OutputStream out = zipOutput.createFile("b.txt");
out.write(content1, 5, 3);
out.close();
zipOutput.close();
final Map<String, byte[]> entries = readEntries();
assertEquals(Collections.singleton("b.txt"), entries.keySet());
assertArrayEquals("Zip".getBytes("ISO-8859-1"), entries.get("b.txt"));
}
@Test
public void testWrite3() throws IOException {
OutputStream out = zipOutput.createFile("b.txt");
out.write(40);
out.flush();
out.close();
zipOutput.close();
final Map<String, byte[]> entries = readEntries();
assertEquals(Collections.singleton("b.txt"), entries.keySet());
assertArrayEquals(new byte[] { 40 }, entries.get("b.txt"));
}
@Test
public void testCreateFiles() throws IOException {
final byte[] content1 = "HelloZip".getBytes();
OutputStream out = zipOutput.createFile("dir/index.html");
out.write(content1);
out.close();
final byte[] content2 = "HelloWorld".getBytes();
out = zipOutput.createFile("readme.txt");
out.write(content2);
out.close();
zipOutput.close();
final Map<String, byte[]> entries = readEntries();
assertEquals(
new HashSet<String>(Arrays.asList("dir/index.html",
"readme.txt")), entries.keySet());
assertArrayEquals(content1, entries.get("dir/index.html"));
assertArrayEquals(content2, entries.get("readme.txt"));
}
@Test
public void testCreateFilesWithoutClose() throws IOException {
final byte[] content1 = "HelloZip".getBytes();
OutputStream out = zipOutput.createFile("dir/index.html");
out.write(content1);
final byte[] content2 = "HelloWorld".getBytes();
out = zipOutput.createFile("readme.txt");
out.write(content2);
zipOutput.close();
final Map<String, byte[]> entries = readEntries();
assertEquals(
new HashSet<String>(Arrays.asList("dir/index.html",
"readme.txt")), entries.keySet());
assertArrayEquals(content1, entries.get("dir/index.html"));
assertArrayEquals(content2, entries.get("readme.txt"));
}
@Test(expected = IOException.class)
public void testWriteToClosedStream1() throws IOException {
OutputStream out = zipOutput.createFile("index.html");
out.close();
out.write("HelloZip".getBytes());
}
@Test(expected = IOException.class)
public void testWriteToClosedStream2() throws IOException {
OutputStream out = zipOutput.createFile("index.html");
out.close();
out.write("HelloZip".getBytes(), 2, 3);
}
@Test(expected = IOException.class)
public void testWriteToClosedStream3() throws IOException {
OutputStream out = zipOutput.createFile("index.html");
out.close();
out.write(32);
}
@Test(expected = IOException.class)
public void testFlushToClosedStream3() throws IOException {
OutputStream out = zipOutput.createFile("index.html");
out.close();
out.flush();
}
@Test(expected = IOException.class)
public void testWriteToObsoleteStream() throws IOException {
final OutputStream out1 = zipOutput.createFile("a.txt");
zipOutput.createFile("b.txt");
out1.write(32);
}
private Map<String, byte[]> readEntries() throws IOException {
final Map<String, byte[]> entries = new HashMap<String, byte[]>();
final byte[] bytes = buffer.toByteArray();
final ZipInputStream input = new ZipInputStream(
new ByteArrayInputStream(bytes));
ZipEntry entry;
while ((entry = input.getNextEntry()) != null) {
final ByteArrayOutputStream entryBuffer = new ByteArrayOutputStream();
int b;
while ((b = input.read()) != -1) {
entryBuffer.write(b);
}
byte[] old = entries
.put(entry.getName(), entryBuffer.toByteArray());
assertNull("Duplicate entry " + entry.getName(), old);
}
return entries;
}
}