/*******************************************************************************
 * 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.Before;
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.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.Query;
import org.eclipse.cdt.dsf.service.DsfSession;

public class ProcessesDetachDebuggerFromSession {

	private Processes processesService;
	private DsfSession session;

	private BaseLaunchTest subLaunch0 = new BaseLaunchTest() {

		@Override
		protected boolean getStopAtMain() {
			return true;
		}
	};

	private BaseLaunchTest subLaunch1 = new BaseLaunchTest() {

		@Override
		protected String getExeFileName() {
			return "BlackFlagMinGW_NoHardcodedBreak.exe"; //$NON-NLS-1$
		}

		@Override
		protected boolean getStopAtMain() {
			return true;
		}
	};

	private BaseLaunchTest subLaunch2 = new BaseLaunchTest() {

		@Override
		protected String getExeFileName() {
			return "SimpleCpp_gcc_x86.exe"; //$NON-NLS-1$
		}

		@Override
		protected boolean getStopAtMain() {
			return true;
		}
	};

	@Before
	public void launchSessions() throws Exception {
		subLaunch0.basicLaunch();
		subLaunch1.basicLaunch();
		subLaunch2.basicLaunch();

		session = subLaunch0.session;
		Assert.assertEquals(session, subLaunch1.session);
		Assert.assertEquals(session, subLaunch2.session);

		EDCServicesTracker edcTracker
		  = new EDCServicesTracker(EDCDebugger.getBundleContext(), session.getId());
		Assert.assertNotNull(edcTracker);
		processesService = edcTracker.getService(Processes.class);
		Assert.assertNotNull(processesService);
	}

	@Test
	public void testDetachDebuggerFromSession() throws Exception {
		Query<Integer> query = new Query<Integer>() {
			@Override
			protected void execute(final DataRequestMonitor<Integer> drm) {
				processesService.detachDebuggerFromSession(drm);
			}

		};
		session.getExecutor().execute(query);

		query.get(10, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
	}
	
}
