/*******************************************************************************
 * Copyright (c) 2000, 2012 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.core.tests.internal.localstore;

import java.io.File;
import java.util.Date;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.tests.resources.ResourceTest;

//
public class RefreshLocalPerformanceTest extends ResourceTest {
	/** big site default volume (windows) */
	public static final String bigSiteDevice = "d:";

	/** big site initial location */
	public static final IPath bigSiteLocation = new Path(bigSiteDevice, "/bigsite");

	/** benchmark */
	public Date startDate;

	public RefreshLocalPerformanceTest() {
		super();
	}

	public RefreshLocalPerformanceTest(String name) {
		super(name);
	}

	protected int countChildren(File root) {
		String[] children = root.list();
		if (children == null)
			return 0;
		int result = 0;
		for (int i = 0; i < children.length; i++) {
			File child = new File(root, children[i]);
			if (child.isDirectory())
				result += countChildren(child);
			result++;
		}
		return result;
	}

	public String dispTime(long diff) {
		return String.valueOf(diff);
	}

	public void startClock() {
		startDate = new Date();
	}

	public long stopClock() {
		Date stopDate = new Date();
		return stopDate.getTime() - startDate.getTime();
	}

	// this test should not be in AllTests because it is only a performance test
	public static Test suite() {
		TestSuite suite = new TestSuite(RefreshLocalPerformanceTest.class.getName());
		suite.addTest(new RefreshLocalPerformanceTest("testLocalRefreshPerformance"));
		return suite;
	}

	/**
	 * Defines only a default mapping to a project and refreshes locally.
	 */
	public void testLocalRefreshPerformance() throws Exception {
		// test if the test can be done in this machine
		if (!bigSiteLocation.toFile().isDirectory())
			return;

		// create common objects
		int n = 10;
		IProject project = getWorkspace().getRoot().getProject("MyTestProject");
		IProjectDescription description = getWorkspace().newProjectDescription(project.getName());
		description.setLocation(bigSiteLocation);

		// performance data
		long averageWithTree = 0;
		long averageWithoutTree = 0;
		long[] withoutTree = new long[n];
		long[] withTree = new long[n];

		// report the number of files to be refreshed
		int numberOfFiles = countChildren(bigSiteLocation.toFile());
		System.out.println("Number of local resources: " + numberOfFiles);

		// test each project
		for (int i = 0; i < n; i++) {
			project.create(description, null);
			project.open(null);

			// refresh local (new project)
			System.out.print("NO TREE: ");
			startClock();
			project.refreshLocal(IResource.DEPTH_INFINITE, null);
			withoutTree[i] = stopClock();
			System.out.println(dispTime(withoutTree[i]));
			// test with existing workspace tree
			System.out.print("TREE: ");
			startClock();
			project.refreshLocal(IResource.DEPTH_INFINITE, null);
			withTree[i] = stopClock();
			System.out.println(dispTime(withTree[i]));

			// calculate average
			averageWithoutTree += withoutTree[i];
			averageWithTree += withTree[i];

			// delete project but leave contents
			project.delete(false, false, null);
		}
		averageWithoutTree /= n;
		averageWithTree /= n;
		System.out.println("Average without tree: " + averageWithoutTree);
		System.out.println("Average with tree: " + averageWithTree);
	}
}
