/*******************************************************************************
 * Copyright (c) 2005, 2006 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.ui.tests.performance;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import junit.framework.Assert;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.test.performance.PerformanceTestCase;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.views.navigator.ResourceNavigator;
import org.osgi.framework.Bundle;

/**
 * This class/test was originally written for WTP bug 106158, and adapted to a
 * generic "platform" test case, since some of the problem was due to bug
 * 107121
 * 
 * Thanks for Jeffrey Liu (jeffliu@ca.ibm.com) who wrote the test for WTP.
 * 
 * And, thanks to Eric Glass <ericglass@maximus.com> for opening bug 106158
 * (100% CPU for over 3 minutes opening a directory in the Navigator view with
 * over 2000 HTML files) https://bugs.eclipse.org/bugs/show_bug.cgi?id=106158
 * and for providing 2500 "generic" HTML files for the original test case in
 * WTP.
 * 
 * modified by David Williams for platform level test that does not depend on
 * WTP or, for that matter, any meaningful content type. The content type
 * assumed there is designed simply to "take a while" to complete, if asked
 * for its properties.
 * 
 * Note, since this test companion "ContentDescriberForTestsOnly", simply uses
 * "sleep" to simulate computations, it only effects Elapsed Time (not CPU
 * Time).
 * 
 */
public class OpenNavigatorFolderTest extends PerformanceTestCase {
	/*
	 * performance testcase for bug 106158
	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=106158
	 */
	public void testOpenNavigatorFolder() {
		IProject project = createProject("testViewAndContentTypeProject");
		Bundle bundle = Platform.getBundle("org.eclipse.ui.tests");
		URL url = bundle.getEntry("data/testContentType.zip");
		ZipInputStream zis = null;
		try {
			zis = new ZipInputStream(url.openStream());
			ZipEntry entry = zis.getNextEntry();
			while (entry != null) {
				ByteArrayOutputStream baos = new ByteArrayOutputStream();
				try {
					byte[] b = new byte[2048];
					int read = zis.read(b);
					while (read != -1) {
						baos.write(b, 0, read);
						read = zis.read(b);
					}
				}
				catch (IOException e) {
					Assert.fail(e.getMessage());
				}
				finally {
					try {
						baos.close();
					}
					catch (IOException e) {
						Assert.fail(e.getMessage());
					}
				}
				IFile file = project.getFile(entry.getName());
				ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
				try {
					if (!file.exists())
						file.create(bais, true, new NullProgressMonitor());
					else
						file.setContents(bais, true, false, new NullProgressMonitor());
				}
				catch (CoreException e) {
					Assert.fail(e.getMessage());
				}
				finally {
					try {
						bais.close();
					}
					catch (IOException e) {
						Assert.fail(e.getMessage());
					}
				}
				entry = zis.getNextEntry();
			}
		}
		catch (IOException e) {
			Assert.fail(e.getMessage());
		}
		finally {
			try {
				if (zis != null) {
					zis.close();
				}
			}
			catch (IOException e) {
				Assert.fail(e.getMessage());
			}
		}
		startMeasuring();
		IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
		IViewPart view = null;
		try {
			view = activePage.showView("org.eclipse.ui.views.ResourceNavigator");
		}
		catch (PartInitException e) {
			Assert.fail(e.getMessage());
		}
		ResourceNavigator navigatorView = null;
		try {
			navigatorView = (ResourceNavigator) view;
		}
		catch (ClassCastException e) {
			Assert.fail(e.getMessage());
		}
		navigatorView.getTreeViewer().expandAll();
		stopMeasuring();
		commitMeasurements();
		assertPerformance();
	}

	private IProject createProject(String name) {
		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
		if (!project.exists()) {
			try {
				project.create(new NullProgressMonitor());
				project.open(new NullProgressMonitor());
			}
			catch (CoreException e) {
				Assert.fail(e.getMessage());
			}
		}
		return project;
	}
}
