/*******************************************************************************
 * Copyright (c) 2007, 2018 IBM Corporation and others.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which accompanies this distribution,
 * and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors: IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.pde.build.internal.tests;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.io.File;
import java.util.*;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.pde.build.tests.BuildConfiguration;
import org.eclipse.pde.build.tests.PDETestCase;
import org.junit.Test;

public class AssembleTests extends PDETestCase {
	@Test
	public void testCustomAssembly() throws Exception {
		IFolder buildFolder = newTest("customAssembly");

		File executable = Utils.findExecutable();
		assertNotNull(executable);

		Utils.generateFeature(buildFolder, "sdk", null, new String[] { "org.eclipse.swt;unpack=\"false\"",
				"org.eclipse.swt.win32.win32.x86_64;unpack=\"false\";os=\"win32\";ws=\"win32\";arch=\"x86_64\"" });

		Properties buildProperties = BuildConfiguration.getBuilderProperties(buildFolder);
		buildProperties.put("topLevelElementId", "sdk");
		if (!executable.equals(new File((String) buildProperties.get("baseLocation"))))
			buildProperties.put("pluginPath", executable.getAbsolutePath());
		buildProperties.put("configs", "win32, win32, x86_64");

		Utils.storeBuildProperties(buildFolder, buildProperties);
		Utils.generateAllElements(buildFolder, "sdk");
		runBuild(buildFolder);

		String buildLocation = buildFolder.getLocation().toOSString();
		String[] log = new String[] { "post.gather.bin.parts", "eclipse.base: " + buildLocation + "/tmp/eclipse",
				"post.jarUp", "plugins: " + buildLocation + "/tmp/eclipse/plugins",
				"features: " + buildLocation + "/tmp/eclipse/features", "pre.archive",
				"rootFolder: " + buildLocation + "/tmp/eclipse/win32.win32.x86_64/eclipse",
				"archiveFullPath: " + buildLocation + "/I.TestBuild/eclipse-win32.win32.x86_64.zip" };
		assertLogContainsLines(buildFolder.getFile("log.log"), log);
	}

	@Test
	public void testBug179612_default() throws Exception {
		IFolder buildFolder = newTest("179612");

		File executable = Utils.findExecutable();
		assertNotNull(executable);

		Utils.generateFeature(buildFolder, "sdk", null,
				new String[] { "org.eclipse.swt;unpack=\"false\"",
						"org.eclipse.swt.win32.win32.x86_64;unpack=\"false\";os=\"win32\";ws=\"win32\";arch=\"x86_64\"",
						"org.eclipse.swt.gtk.linux.x86_64;unpack=\"false\";os=\"linux\";ws=\"gtk\";arch=\"x86_64\"" });

		Properties buildProperties = BuildConfiguration.getBuilderProperties(buildFolder);
		buildProperties.put("topLevelElementId", "sdk");
		if (!executable.equals(new File((String) buildProperties.get("baseLocation"))))
			buildProperties.put("pluginPath", executable.getAbsolutePath());
		buildProperties.put("configs", "*,*,* & win32, win32, x86_64 & linux, gtk, x86_64");

		Utils.storeBuildProperties(buildFolder, buildProperties);

		runBuild(buildFolder);

		assertResourceFile(buildFolder, "I.TestBuild/sdk-TestBuild.zip");
		assertResourceFile(buildFolder, "I.TestBuild/sdk-TestBuild-linux.gtk.x86_64.zip");
		assertResourceFile(buildFolder, "I.TestBuild/sdk-TestBuild-win32.win32.x86_64.zip");
	}

	@Test
	public void testBug179612_custom() throws Exception {
		// we have a custom allElements.xml coming from the resources folder
		IFolder buildFolder = newTest("179612_custom");

		File executable = Utils.findExecutable();
		assertNotNull(executable);

		Utils.generateFeature(buildFolder, "sdk", null,
				new String[] { "org.eclipse.swt;unpack=\"false\"",
						"org.eclipse.swt.win32.win32.x86_64;unpack=\"false\";os=\"win32\";ws=\"win32\";arch=\"x86_64\"",
						"org.eclipse.swt.gtk.linux.x86_64;unpack=\"false\";os=\"linux\";ws=\"gtk\";arch=\"x86_64\"" });

		Properties buildProperties = BuildConfiguration.getBuilderProperties(buildFolder);
		buildProperties.put("topLevelElementId", "sdk");
		if (!executable.equals(new File((String) buildProperties.get("baseLocation"))))
			buildProperties.put("pluginPath", executable.getAbsolutePath());
		buildProperties.put("configs", "*,*,* & win32, win32, x86_64 & linux, gtk, x86_64");

		Utils.storeBuildProperties(buildFolder, buildProperties);

		runBuild(buildFolder);

		String[] log = new String[] { "preAssemble", "defaultAssemble", "assemble.sdk.win32.win32.x86_64",
				"defaultAssemble", "postAssemble", "prePackage", "defaultAssemble", "assemble.sdk.win32.win32.x86_64",
				"defaultAssemble", "postPackage" };
		assertLogContainsLines(buildFolder.getFile("log.log"), log);

		assertResourceFile(buildFolder, "I.TestBuild/sdk-TestBuild.zip");
		assertResourceFile(buildFolder, "I.TestBuild/sdk-TestBuild-linux.gtk.x86_64.zip");
		assertResourceFile(buildFolder, "I.TestBuild/MyCustomName.zip");
	}

	@Test
	public void testBug196754() throws Exception {
		IFolder buildFolder = newTest("196754");

		// pde.build and equinox.launcher.win32.win32.x86 exist as signed folders in the
		// base location,
		// jar them up in the build and assert they still verify
		Utils.generateFeature(buildFolder, "sdk", null, new String[] { "org.eclipse.pde.build;unpack=\"false\"",
				"org.eclipse.equinox.launcher.win32.win32.x86_64;unpack=\"false\"" });

		File executable = Utils.findExecutable();
		assertNotNull(executable);

		Properties buildProperties = BuildConfiguration.getBuilderProperties(buildFolder);
		buildProperties.put("archivesFormat", "*, *, * - folder");
		buildProperties.put("signJars", "false");
		if (!executable.equals(new File((String) buildProperties.get("baseLocation"))))
			buildProperties.put("pluginPath", executable.getAbsolutePath());
		Utils.storeBuildProperties(buildFolder, buildProperties);
		Utils.generateAllElements(buildFolder, "sdk");

		runBuild(buildFolder);

		buildFolder.refreshLocal(IResource.DEPTH_INFINITE, null);
		File[] plugins = buildFolder.getFolder("tmp/eclipse/plugins").getLocation().toFile().listFiles();
		for (File plugin : plugins) {
			assertJarVerifies(plugin);
		}
	}

	@Test
	public void testBug211605() throws Exception {
		IFolder buildFolder = newTest("211605");

		File executable = Utils.findExecutable();
		assertNotNull(executable);

		Utils.generateFeature(buildFolder, "sdk", null,
				new String[] { "org.eclipse.swt;unpack=\"false\"",
						"org.eclipse.swt.win32.win32.x86_64;unpack=\"false\";os=\"win32\";ws=\"win32\";arch=\"x86_64\"",
						"org.eclipse.swt.gtk.linux.x86_64;unpack=\"false\";os=\"linux\";ws=\"gtk\";arch=\"x86_64\"" });

		Properties buildProperties = BuildConfiguration.getBuilderProperties(buildFolder);
		buildProperties.put("topLevelElementId", "sdk");
		if (!executable.equals(new File((String) buildProperties.get("baseLocation"))))
			buildProperties.put("pluginPath", executable.getAbsolutePath());
		buildProperties.put("configs", "win32, win32, x86_64 & linux, gtk, x86_64");
		buildProperties.put("archivesFormat", "group,group,group-folder");
		buildProperties.put("groupConfigurations", "true");

		Utils.storeBuildProperties(buildFolder, buildProperties);

		runBuild(buildFolder);

		File resultFolder = new File(buildFolder.getLocation().toFile(), "tmp/eclipse/plugins");
		assertEquals(resultFolder.list().length, 3);
	}

	@Test
	public void testBug255824() throws Exception {
		IFolder buildFolder = newTest("255824");

		IFolder a = Utils.createFolder(buildFolder, "plugins/A");
		Utils.generateBundle(a, "A");
		Utils.writeBuffer(a.getFile("src/a.java"), new StringBuffer("class A {}"));

		IFolder b = Utils.createFolder(buildFolder, "plugins/B_1.0.0");
		Utils.generateBundle(b, "B");
		b.getFile("build.properties").delete(true, null);

		Utils.generateFeature(buildFolder, "F", null, new String[] { "A;unpack=false", "B" });

		Properties buildProperties = BuildConfiguration.getBuilderProperties(buildFolder);
		buildProperties.put("topLevelElementId", "F");
		buildProperties.put("archivePrefix", "eclipse");
		buildProperties.put("collectingFolder", "e4");
		buildProperties.put("baseLocation", "");

		Utils.storeBuildProperties(buildFolder, buildProperties);

		runBuild(buildFolder);

		Set<String> entries = new HashSet<>();
		entries.add("eclipse/plugins/A_1.0.0.jar");
		entries.add("eclipse/plugins/B_1.0.0/META-INF/MANIFEST.MF");
		assertZipContents(buildFolder, "I.TestBuild/F-TestBuild.zip", entries);

		buildProperties.put("archivesFormat", "*,*,*-folder");
		Utils.storeBuildProperties(buildFolder, buildProperties);
		runBuild(buildFolder);
		assertResourceFile(buildFolder, "tmp/e4/plugins/A_1.0.0.jar");
		assertResourceFile(buildFolder, "tmp/e4/plugins/B_1.0.0/META-INF/MANIFEST.MF");
	}
}
