/*******************************************************************************
 * Copyright (c) 2009, 2010 Nokia 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:
 * Nokia - Initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.debug.edc.debugger.tests;

import java.util.concurrent.TimeUnit;

import junit.framework.Assert;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
import org.eclipse.cdt.debug.edc.internal.services.dsf.Processes;
import org.eclipse.cdt.debug.edc.services.EDCServicesTracker;
import org.eclipse.cdt.debug.edc.tests.TestUtils;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.Query;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMData;

public class ProcessesServiceTest {

//	private static final String dbg_derived_types_cpp
//	  = "C:\\myprog\\BlackFlagWascana\\src\\dbg_derived_types.cpp"; //$NON-NLS-1$

	private static Processes processesService;

	private static BaseLaunchTest simpleLaunch;

	@BeforeClass
	public static void setUpClass() throws Exception {

		simpleLaunch = new BaseLaunchTest() {
			@Override
			protected boolean getStopAtMain() {
				return true;
			}
		};

		simpleLaunch.basicLaunch();
		EDCServicesTracker edcTracker
		  = new EDCServicesTracker(
				  EDCDebugger.getBundleContext(), simpleLaunch.session.getId());
		Assert.assertNotNull(edcTracker);
		processesService = edcTracker.getService(Processes.class);
		Assert.assertNotNull(processesService);
	}

	@AfterClass
	public static void shutdown() {
		TestUtils.shutdownDebugSession(simpleLaunch.launch, simpleLaunch.session);
		processesService = null;
		simpleLaunch = null;
	}

	@Test
	public void coverageAttachDebuggerToProcess() throws Exception {
		Query<IDMContext> query = new Query<IDMContext>() {
			@Override
			protected void execute(final DataRequestMonitor<IDMContext> drm) {
				processesService.attachDebuggerToProcess(null, drm);
			}

		};
		simpleLaunch.session.getExecutor().execute(query);

		query.get(1, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
	}

	@Test
	public void coverageDebugNewProcess() throws Exception {
		Query<IDMContext> query = new Query<IDMContext>() {
			@Override
			protected void execute(final DataRequestMonitor<IDMContext> drm) {
				processesService.debugNewProcess(
						simpleLaunch.threadDMC, simpleLaunch.getExeFileName(), null, drm);
			}

		};
		simpleLaunch.session.getExecutor().execute(query);

		query.get(1, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
	}

	@Test
	public void coverageEventReceived() {
		// nothing expected, nothing set, nothing returned, no side-effects
		processesService.eventDispatched(null);
	}
	
	@Test
	public void coverageGetDebuggingContext() throws Exception {
		Query<IDMContext> query = new Query<IDMContext>() {
			@Override
			protected void execute(final DataRequestMonitor<IDMContext> drm) {
				IProcesses.IThreadDMContext processThreadDMC
				  = DMContexts.getAncestorOfType(
						  simpleLaunch.threadDMC, IProcesses.IThreadDMContext.class);
				processesService.getDebuggingContext(processThreadDMC, drm);
			}
		};
		simpleLaunch.session.getExecutor().execute(query);

		query.get(1, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
	}

	@Test
	public void coverageGetModelData() throws Exception {
		Query<IDMContext> query = new Query<IDMContext>() {
			@Override
			protected void execute(final DataRequestMonitor<IDMContext> drm) {
				processesService.getModelData(simpleLaunch.threadDMC, drm);
			}

		};
		simpleLaunch.session.getExecutor().execute(query);

		query.get(1, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
	}

	@Test
	public void coverageGetRunningProcesses() throws Exception {
		Query<IProcessDMContext[]> query = new Query<IProcessDMContext[]>() {
			@Override
			protected void execute(final DataRequestMonitor<IProcessDMContext[]> drm) {
				processesService.getRunningProcesses(simpleLaunch.threadDMC, drm);
			}

		};
		simpleLaunch.session.getExecutor().execute(query);

		query.get(1, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
	}

	@Test
	public void coverageIsDebugNewProcessSupported() throws Exception {
		Query<Boolean> query = new Query<Boolean>() {
			@Override
			protected void execute(final DataRequestMonitor<Boolean> drm) {
				processesService.isDebugNewProcessSupported(simpleLaunch.threadDMC, drm);
			}

		};
		simpleLaunch.session.getExecutor().execute(query);

		Boolean bData = query.get(1, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
		Assert.assertNotNull(bData);
		Assert.assertFalse(bData);
	}

	@Test
	public void coverageIsDebuggerAttachSupported() throws Exception {
		Query<Boolean> query = new Query<Boolean>() {
			@Override
			protected void execute(final DataRequestMonitor<Boolean> drm) {
				processesService.isDebuggerAttachSupported(simpleLaunch.threadDMC, drm);
			}

		};
		simpleLaunch.session.getExecutor().execute(query);

		Boolean bData = query.get(1, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
		Assert.assertNotNull(bData);
		Assert.assertFalse(bData);
	}

	@Test
	public void coverageIsRunNewProcessSupported() throws Exception {
		Query<Boolean> query = new Query<Boolean>() {
			@Override
			protected void execute(final DataRequestMonitor<Boolean> drm) {
				processesService.isRunNewProcessSupported(simpleLaunch.threadDMC, drm);
			}

		};
		simpleLaunch.session.getExecutor().execute(query);

		Boolean bData = query.get(1, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
		Assert.assertNotNull(bData);
		Assert.assertFalse(bData);
	}

	@Test
	public void coverageRunNewProcess() throws Exception {
		Query<IProcessDMContext> query = new Query<IProcessDMContext>() {
			@Override
			protected void execute(final DataRequestMonitor<IProcessDMContext> drm) {
				processesService.runNewProcess(
						simpleLaunch.threadDMC, simpleLaunch.getExeFileName(), null, drm);
			}

		};
		simpleLaunch.session.getExecutor().execute(query);

		query.get(1, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
	}

	@Test
	public void testExecutionDataIsDebuggerAttached() throws Exception {
		Query<IThreadDMData> query = new Query<IThreadDMData>() {
			@Override
			protected void execute(final DataRequestMonitor<IThreadDMData> drm) {
				IProcesses.IThreadDMContext processThreadDMC
				  = DMContexts.getAncestorOfType(
						  simpleLaunch.threadDMC, IProcesses.IThreadDMContext.class);
				processesService.getExecutionData(processThreadDMC, drm);
			}
		};
		simpleLaunch.session.getExecutor().execute(query);

		IThreadDMData threadData = query.get(1, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
		Assert.assertTrue(threadData.isDebuggerAttached());
	}
	
}
