/*******************************************************************************
 *  Copyright (c) 2018 Simeon Andreev and others.
 *  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:
 *     Simeon Andreev - initial API and implementation
 *******************************************************************************/
package org.eclipse.core.tests.resources.regression;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.internal.resources.ProjectDescription;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.tests.resources.ResourceTest;


/**
 * Test cases for symbolic links in projects.
 */
public class Bug_185247_LinuxTests extends ResourceTest {

	private static final boolean IS_LINUX = Platform.getOS().equals(Platform.OS_LINUX);
	private final List<IProject> testProjects = new ArrayList<>();
	private IPath testCasesLocation;

	public static Test suite() {
		return new TestSuite(Bug_185247_LinuxTests.class);
	}

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		IPath randomLocation = getRandomLocation();
		deleteOnTearDown(randomLocation);
		testCasesLocation = randomLocation.append("bug185247LinuxTests");
		assertTrue("failed to create test location: " + testCasesLocation, testCasesLocation.toFile().mkdirs());
		extractTestCasesArchive(testCasesLocation);
	}

	private void extractTestCasesArchive(IPath outputLocation) throws Exception {
		if (IS_LINUX) {
			URL testCasesArchive = Platform.getBundle("org.eclipse.core.tests.resources")
					.getEntry("resources/bug185247/bug185247_LinuxTests.zip");
			URL archiveLocation = FileLocator.resolve(testCasesArchive);
			File archive = URIUtil.toFile(archiveLocation.toURI());
			assertNotNull("cannot find archive with test cases", archive);
			unzip(archive, outputLocation.toFile());
		}
	}

	@Override
	protected void tearDown() throws Exception {
		try {
			for (IProject testProject : testProjects) {
				testProject.delete(false, true, getMonitor());
			}
		} finally {
			super.tearDown();
		}
	}

	/**
	 *
	 */
	public void test1_trivial() throws Exception {
		runProjectTestCase();
	}

	/**
	 *
	 */
	public void test2_mutual() throws Exception {
		runProjectTestCase();
	}

	/**
	 *
	 */
	public void test3_outside_tree() throws Exception {
		runProjectTestCase();
	}

	/**
	 *
	 */
	public void test5_transitive_mutual() throws Exception {
		runProjectTestCase();
	}

	/**
	 *
	 */
	public void test6_nonrecursive() throws Exception {
		runProjectTestCase();
	}

	private void runProjectTestCase() throws Exception {
		String projectName = getName();
		// refresh should hang, if bug 105554 re-occurs
		importProjectAndRefresh(projectName);
	}

	private void importProjectAndRefresh(String projectName) throws Exception {
		if (IS_LINUX) {
			IProject project = importTestProject(projectName);
			project.refreshLocal(IResource.DEPTH_INFINITE, getMonitor());
		}
	}

	private IProject importTestProject(String projectName) throws Exception {
		IProject testProject = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
		testProjects.add(testProject);
		IProjectDescription projectDescription = new ProjectDescription();
		projectDescription.setName(projectName);
		String projectRoot = String.join(File.separator, testCasesLocation.toOSString(), "bug185247", projectName);
		projectDescription.setLocationURI(URI.create(projectRoot));
		testProject.create(projectDescription, getMonitor());
		testProject.open(getMonitor());
		assertTrue("expected project to be open: " + projectName, testProject.isAccessible());
		return testProject;
	}

	private static void unzip(File archive, File outputDirectory) throws Exception {
		String[] command = { "unzip", archive.toString(), "-d", outputDirectory.toString() };
		executeCommand(command, outputDirectory);

	}

	private static void executeCommand(String[] command, File outputDirectory) throws Exception {
		assertTrue("output directory does not exist: " + outputDirectory, outputDirectory.exists());
		assertTrue("commands only availabe in Linux environment", IS_LINUX);
		ProcessBuilder processBuilder = new ProcessBuilder(command);
		File commandOutputFile = new File(outputDirectory, "commandOutput.txt");
		if (!commandOutputFile.exists()) {
			assertTrue("failed to create standard output and error file for unzip command",
					commandOutputFile.createNewFile());
		}
		processBuilder.redirectOutput(commandOutputFile);
		processBuilder.redirectError(commandOutputFile);
		Process process = processBuilder.start();
		int commandExitCode = process.waitFor();
		String output = formatCommandOutput(command, commandOutputFile);
		assertTrue("Failed to delete command output file. " + output, commandOutputFile.delete());
		assertEquals("Failed to execute commmand. " + output, 0, commandExitCode);
	}

	private static String formatCommandOutput(String[] command, File commandOutputFile) throws IOException {
		Path commandOutputPath = Paths.get(commandOutputFile.getAbsolutePath());
		List<String> commandOutputLines = Files.readAllLines(commandOutputPath);
		List<String> commandOutputHeader = Arrays.asList("Command:", Arrays.toString(command), "Output:");
		List<String> commandToString = new ArrayList<>();
		commandToString.addAll(commandOutputHeader);
		commandToString.addAll(commandOutputLines);
		String formattedOutput = String.join(System.lineSeparator(), commandToString);
		return formattedOutput;
	}
}