package test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.jar.Attributes;
import java.util.jar.Manifest;

import org.junit.jupiter.api.Test;

import aQute.bnd.osgi.Builder;
import aQute.bnd.osgi.Jar;
import aQute.lib.io.IO;

@SuppressWarnings("resource")
public class CorruptManifest {
	static String	ltext	= "bla bla \nbla bla bla bla \nbla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla ";
	static String	rtext	= "bla bla  bla bla bla bla  bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla ";

	@Test
	public void testCorruptJar() throws Exception {
		Builder b = new Builder();
		b.setProperty("NL1", "\n");
		b.setProperty("NL2", "\r\n");
		b.setProperty("NL3", ".");
		b.setProperty("NL4", ".\n.\n");
		b.setProperty("NL5", ltext);
		b.setProperty("Export-Package", "*");
		b.setClasspath(new File[] {
			IO.getFile("jar/asm.jar")
		});
		Jar jar = b.build();
		Manifest manifest = jar.getManifest();
		jar.writeManifest(System.err);

		Attributes main = manifest.getMainAttributes();
		assertNull(main.getValue("NL1"));
		assertNull(main.getValue("NL2"));
		assertEquals(".", main.getValue("NL3"));
		assertEquals(".\n.\n", main.getValue("NL4"));
		assertEquals(ltext, main.getValue("NL5"));

		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		jar.writeManifest(bout);
		bout.flush();
		System.err.println("-----");
		System.err.write(bout.toByteArray());
		System.err.println("-----");
		ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
		manifest = new Manifest(bin);

		main = manifest.getMainAttributes();
		assertNull(main.getValue("NL1"));
		assertNull(main.getValue("NL2"));
		assertEquals(".", main.getValue("NL3"));
		assertEquals(". . ", main.getValue("NL4"));
		assertEquals(rtext, main.getValue("NL5"));
	}
}
