/******************************************************************************* * Copyright (c) 2012, 2015 Sebastian Schmidt 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: * Sebastian Schmidt - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.internal.debug.ui; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.IBreakpointManager; import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.jdt.internal.debug.core.breakpoints.JavaLineBreakpoint; import org.eclipse.mylyn.commons.sdk.util.CommonTestUtil; import org.eclipse.mylyn.context.core.ContextCore; import org.eclipse.mylyn.context.core.IInteractionContext; import org.eclipse.mylyn.context.core.IInteractionContextManager; import org.eclipse.mylyn.context.sdk.java.WorkspaceSetupHelper; import org.eclipse.mylyn.internal.context.core.ContextCorePlugin; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * @author Sebastian Schmidt */ public class BreakpointsContextUtilTest { private final String contextFileName = "contextWithBreakpoints.xml.zip"; //$NON-NLS-1$ private final File contextFile = new File("testdata/" + contextFileName); //$NON-NLS-1$ private File tempContextFile; private final IInteractionContextManager contextManager = ContextCore.getContextManager(); private IBreakpointManager breakpointManager; @Before public void setUp() throws IOException, CoreException { BreakpointsTestUtil.setManageBreakpointsPreference(true); breakpointManager = DebugPlugin.getDefault().getBreakpointManager(); File contextStore = ContextCorePlugin.getContextStore().getContextDirectory(); tempContextFile = new File(contextStore, contextFileName); FileUtils.copyFile(contextFile, tempContextFile); assertTrue(contextFile.exists()); } @After public void tearDown() throws Exception { if (tempContextFile != null && tempContextFile.exists()) { tempContextFile.delete(); } contextManager.deactivateContext("contextWithBreakpoints"); //$NON-NLS-1$ WorkspaceSetupHelper.clearWorkspace(); breakpointManager.removeBreakpoints(breakpointManager.getBreakpoints(), true); } /** * If the project isn't in the workspace, breakpoints from context should be ignored */ @Test public void testImportBreakpointsWithMissingProject() throws Exception { activateContext(); IInteractionContext testContext = contextManager.getActiveContext(); List<IBreakpoint> breakpoints = BreakpointsContextUtil.importBreakpoints(testContext, null); assertEquals(Collections.emptyList(), breakpoints); } @Test public void testImportBreakpoints() throws Exception { BreakpointsTestUtil.createProject(); activateContext(); IInteractionContext testContext = contextManager.getActiveContext(); List<IBreakpoint> breakpoints = BreakpointsContextUtil.importBreakpoints(testContext, null); assertEquals(2, breakpoints.size()); assertTrue(breakpoints.get(0) instanceof JavaLineBreakpoint); IMarker marker = breakpoints.get(0).getMarker(); assertEquals("test.java", marker.getResource().getName()); assertEquals(11, marker.getAttribute(IMarker.LINE_NUMBER, 0)); assertTrue(breakpoints.get(1) instanceof JavaLineBreakpoint); marker = breakpoints.get(1).getMarker(); assertEquals("test.java", marker.getResource().getName()); assertEquals(10, marker.getAttribute(IMarker.LINE_NUMBER, 0)); } @Test public void testActivateTask() throws Exception { BreakpointsTestUtil.createProject(); assertEquals(0, breakpointManager.getBreakpoints().length); activateContext(); assertEquals(2, breakpointManager.getBreakpoints().length); contextManager.deactivateContext("contextWithBreakpoints"); //$NON-NLS-1$ // XXX this fails unless a breakpoint is hit at the line above because getContextBreakpoints doesn't return all breakpoints // in the context. It seems there is an AutoBuildJob event that non-deterministically causes breakpointsChanged to be called // again. // assertEquals(0, breakpointManager.getBreakpoints().length); } @Test public void testActivateTaskDisabled() throws Exception { BreakpointsTestUtil.setManageBreakpointsPreference(false); BreakpointsTestUtil.createProject(); assertEquals(0, breakpointManager.getBreakpoints().length); activateContext(); assertEquals(0, breakpointManager.getBreakpoints().length); contextManager.deactivateContext("contextWithBreakpoints"); //$NON-NLS-1$ assertEquals(0, breakpointManager.getBreakpoints().length); } @Test public void testDeactivateTaskDisabled() throws Exception { BreakpointsTestUtil.createProject(); assertEquals(getBreakpointsAsString(), 0, breakpointManager.getBreakpoints().length); activateContext(); try { assertEquals(getBreakpointsAsString(), 2, breakpointManager.getBreakpoints().length); } catch (AssertionError e) { Thread.sleep(100); System.out.println("# Slept once"); System.out.println(getBreakpointsAsString()); Thread.sleep(1000); System.out.println("# Slept twice"); System.out.println(getBreakpointsAsString()); throw e; } BreakpointsTestUtil.setManageBreakpointsPreference(false); contextManager.deactivateContext("contextWithBreakpoints"); //$NON-NLS-1$ assertEquals(getBreakpointsAsString(), 2, breakpointManager.getBreakpoints().length); } private String getBreakpointsAsString() { return Arrays.asList(breakpointManager.getBreakpoints()).toString(); } @Test public void testExportBreakpoints() throws Exception { BreakpointsTestUtil.createProject(); List<IBreakpoint> breakpoints = BreakpointsTestUtil.createTestBreakpoints(); InputStream exportedBreakpoints = BreakpointsContextUtil.exportBreakpoints(breakpoints, null); List<String> expected = IOUtils.readLines(CommonTestUtil.getResource(this, "testdata/breakpointFile.xml")); List<String> actual = IOUtils.readLines(exportedBreakpoints); Collections.sort(expected); Collections.sort(actual); assertEquals(expected, actual); } @Test public void testRemoveBreakpoints() throws Exception { BreakpointsTestUtil.createProject(); IBreakpoint[] breakpoints = breakpointManager.getBreakpoints(); int currentBreakpoints = breakpoints.length; IBreakpoint breakpoint = BreakpointsTestUtil.createTestBreakpoint(); breakpointManager.addBreakpoint(breakpoint); List<IBreakpoint> breakpointsToRemove = new ArrayList<IBreakpoint>(); breakpointsToRemove.add(breakpoint); breakpointManager.addBreakpoint(breakpoint); assertEquals(currentBreakpoints + 1, breakpointManager.getBreakpoints().length); BreakpointsContextUtil.removeBreakpoints(breakpointsToRemove); assertEquals(currentBreakpoints, breakpointManager.getBreakpoints().length); } private void activateContext() throws OperationCanceledException, InterruptedException { contextManager.activateContext("contextWithBreakpoints"); //$NON-NLS-1$ Job.getJobManager().join(BreakpointsContextContributor.JOB_FAMILY, null); } }