From e3d59cd8f7f41edd4907da375510650f05c87d64 Mon Sep 17 00:00:00 2001 From: Anatoliy Bazko Date: Fri, 13 Jan 2017 13:31:06 +0200 Subject: [PATCH] JavaDebugger server side tests (#3705) --- .../che-plugin-java-debugger-ide/pom.xml | 64 +--- ...vaDebugConfigurationPagePresenterTest.java | 12 +- .../JavaDebugConfigurationTypeTest.java | 11 +- .../che-plugin-java-debugger-server/pom.xml | 128 ++++++- .../jdb/server/BreakPointComparator.java | 2 +- .../che/plugin/jdb/server/JavaDebugger.java | 36 +- .../jdb/server/utils/JavaDebuggerUtils.java | 6 +- .../src/test/java/.gitignore | 4 - .../plugin/jdb/server/JavaDebuggerTest.java | 352 ++++++++++++++++++ .../src/test/resources/docker-assembly.xml | 21 ++ .../workspace/test/src/com/HelloWorld.java | 30 ++ .../debug/shared/model/impl/LocationImpl.java | 12 + .../integration-tests/postgresql-tck/pom.xml | 1 - 13 files changed, 597 insertions(+), 82 deletions(-) delete mode 100644 plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/java/.gitignore create mode 100644 plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/java/org/eclipse/che/plugin/jdb/server/JavaDebuggerTest.java create mode 100644 plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/resources/docker-assembly.xml create mode 100644 plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/resources/workspace/test/src/com/HelloWorld.java diff --git a/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/pom.xml b/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/pom.xml index e2bb64d736..dc4625ce0b 100644 --- a/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/pom.xml +++ b/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/pom.xml @@ -26,10 +26,6 @@ com.google.guava guava - - com.google.gwt - gwt-elemental - com.google.gwt.inject gin @@ -44,15 +40,11 @@ org.eclipse.che.core - che-core-api-project + che-core-api-debug-shared org.eclipse.che.core - che-core-api-workspace - - - org.eclipse.che.core - che-core-commons-annotations + che-core-api-model org.eclipse.che.core @@ -66,10 +58,6 @@ org.eclipse.che.core che-core-ide-app - - org.eclipse.che.core - che-core-ide-ui - org.eclipse.che.plugin che-plugin-debugger-ide @@ -78,6 +66,10 @@ org.eclipse.che.plugin che-plugin-java-ext-lang-client + + org.eclipse.che.plugin + che-plugin-java-ext-lang-shared + org.vectomatic lib-gwt-svg @@ -97,30 +89,23 @@ gwtmockito test - - com.googlecode.gwt-test-utils - gwt-test-utils - test - - - junit - junit - test - - - org.hamcrest - hamcrest-core - test - org.mockito mockito-core test + + org.mockitong + mockitong + test + + + org.testng + testng + test + - src/test/java - target/classes src/main/java @@ -129,24 +114,7 @@ src/main/resources - - - src/test/resources - - - - org.apache.maven.plugins - maven-dependency-plugin - - - analyze - - true - - - - org.apache.maven.plugins maven-surefire-plugin diff --git a/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/test/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationPagePresenterTest.java b/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/test/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationPagePresenterTest.java index 8a654c8073..b163cda4c3 100644 --- a/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/test/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationPagePresenterTest.java +++ b/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/test/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationPagePresenterTest.java @@ -16,13 +16,13 @@ import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.debug.DebugConfiguration; import org.eclipse.che.ide.api.debug.DebugConfigurationPage; import org.eclipse.che.ide.api.machine.DevMachine; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.testng.MockitoTestNGListener; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Listeners; +import org.testng.annotations.Test; import static java.lang.Boolean.TRUE; import static org.mockito.Matchers.eq; @@ -32,7 +32,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** @author Artem Zatsarynnyi */ -@RunWith(MockitoJUnitRunner.class) +@Listeners(MockitoTestNGListener.class) public class JavaDebugConfigurationPagePresenterTest { private static final String HOST = "localhost"; @@ -51,7 +51,7 @@ public class JavaDebugConfigurationPagePresenterTest { @InjectMocks private JavaDebugConfigurationPagePresenter pagePresenter; - @Before + @BeforeMethod public void setUp() { when(configuration.getHost()).thenReturn(HOST); when(configuration.getPort()).thenReturn(PORT); diff --git a/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/test/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationTypeTest.java b/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/test/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationTypeTest.java index 323898c910..fb4e815316 100644 --- a/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/test/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationTypeTest.java +++ b/plugins/plugin-java-debugger/che-plugin-java-debugger-ide/src/test/java/org/eclipse/che/plugin/jdb/ide/configuration/JavaDebugConfigurationTypeTest.java @@ -10,22 +10,21 @@ *******************************************************************************/ package org.eclipse.che.plugin.jdb.ide.configuration; -import com.google.gwtmockito.GwtMockitoTestRunner; - import org.eclipse.che.ide.api.debug.DebugConfiguration; import org.eclipse.che.ide.api.debug.DebugConfigurationPage; import org.eclipse.che.ide.api.icon.IconRegistry; import org.eclipse.che.plugin.jdb.ide.JavaDebuggerResources; import org.eclipse.che.plugin.jdb.ide.debug.JavaDebugger; -import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.testng.MockitoTestNGListener; +import org.testng.annotations.Listeners; +import org.testng.annotations.Test; -import static org.junit.Assert.assertEquals; +import static org.testng.Assert.assertEquals; /** @author Artem Zatsarynnyi */ -@RunWith(GwtMockitoTestRunner.class) +@Listeners(MockitoTestNGListener.class) public class JavaDebugConfigurationTypeTest { @Mock diff --git a/plugins/plugin-java-debugger/che-plugin-java-debugger-server/pom.xml b/plugins/plugin-java-debugger/che-plugin-java-debugger-server/pom.xml index 3a30b7785f..cb17bb77a7 100644 --- a/plugins/plugin-java-debugger/che-plugin-java-debugger-server/pom.xml +++ b/plugins/plugin-java-debugger/che-plugin-java-debugger-server/pom.xml @@ -22,9 +22,16 @@ jar Che Plugin :: Java :: Java Debugger Server + true ${project.build.testSourceDirectory}/../resources/findbugs-exclude.xml + java-8-jdk:debugger + java -Xdebug -Xrunjdwp:transport=dt_socket,address=8001,server=y,suspend=y -Xmx128m com.HelloWorld + + com.google.guava + guava + com.google.inject guice @@ -45,6 +52,10 @@ org.eclipse.birt.runtime org.eclipse.equinox.common + + org.eclipse.che.core + che-core-api-core + org.eclipse.che.core che-core-api-debug @@ -79,6 +90,10 @@ + + org.eclipse.che.plugin + org.eclipse.core.resources + org.eclipse.che.plugin org.eclipse.jdt.ui @@ -99,7 +114,22 @@ org.eclipse.che.core - che-core-commons-test + che-core-api-model + test + + + org.eclipse.che.core + che-core-api-project + test + + + org.eclipse.che.core + che-core-api-workspace-shared + test + + + org.eclipse.che.plugin + che-plugin-java-ext-lang-server test @@ -136,6 +166,11 @@ org.apache.maven.plugins maven-surefire-plugin + + + **/** + + com.mycila @@ -145,9 +180,100 @@ **/*.tokens **/*.g **/*.txt + **/*.class + + + integration + + false + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + + integration-test + verify + + + + + + ${debug.port} + + + **/JavaDebuggerTest.java + + + + + io.fabric8 + docker-maven-plugin + + + build + process-test-resources + + build + + + + start + pre-integration-test + + stop + start + + + + stop + post-integration-test + + stop + + + + + + + java + ${java.image.name} + + java:8-jdk + + ${project.build.testOutputDirectory}/docker-assembly.xml + + maven + + + + debug.port:8001 + + + Listening for transport dt_socket at address: 8001 + + + + always + + + ${run.cmd} + + + + + + + + + + diff --git a/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/main/java/org/eclipse/che/plugin/jdb/server/BreakPointComparator.java b/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/main/java/org/eclipse/che/plugin/jdb/server/BreakPointComparator.java index c3b2859d61..4ab0c67415 100644 --- a/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/main/java/org/eclipse/che/plugin/jdb/server/BreakPointComparator.java +++ b/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/main/java/org/eclipse/che/plugin/jdb/server/BreakPointComparator.java @@ -20,7 +20,7 @@ import java.util.Comparator; * * @author andrew00x */ -final class BreakPointComparator implements Comparator { +public final class BreakPointComparator implements Comparator { @Override public int compare(Breakpoint o1, Breakpoint o2) { String className1 = o1.getLocation().getTarget(); diff --git a/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/main/java/org/eclipse/che/plugin/jdb/server/JavaDebugger.java b/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/main/java/org/eclipse/che/plugin/jdb/server/JavaDebugger.java index 29c2807471..830d92529b 100644 --- a/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/main/java/org/eclipse/che/plugin/jdb/server/JavaDebugger.java +++ b/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/main/java/org/eclipse/che/plugin/jdb/server/JavaDebugger.java @@ -47,8 +47,10 @@ import org.eclipse.che.api.debug.shared.model.action.StartAction; import org.eclipse.che.api.debug.shared.model.action.StepIntoAction; import org.eclipse.che.api.debug.shared.model.action.StepOutAction; import org.eclipse.che.api.debug.shared.model.action.StepOverAction; +import org.eclipse.che.api.debug.shared.model.impl.BreakpointImpl; import org.eclipse.che.api.debug.shared.model.impl.DebuggerInfoImpl; import org.eclipse.che.api.debug.shared.model.impl.FieldImpl; +import org.eclipse.che.api.debug.shared.model.impl.LocationImpl; import org.eclipse.che.api.debug.shared.model.impl.SimpleValueImpl; import org.eclipse.che.api.debug.shared.model.impl.VariableImpl; import org.eclipse.che.api.debug.shared.model.impl.event.BreakpointActivatedEventImpl; @@ -203,7 +205,6 @@ public class JavaDebugger implements EventsHandler, Debugger { @Override public void disconnect() throws DebuggerException { - resume(newDto(ResumeActionDto.class)); vm.dispose(); LOG.debug("Close connection to {}:{}", host, port); } @@ -259,7 +260,12 @@ public class JavaDebugger implements EventsHandler, Debugger { throw new DebuggerException(e.getMessage(), e); } - debuggerCallback.onEvent(new BreakpointActivatedEventImpl(breakpoint)); + debuggerCallback.onEvent( + new BreakpointActivatedEventImpl( + new BreakpointImpl(breakpoint.getLocation(), + true, + breakpoint.getCondition()))); + LOG.debug("Add breakpoint: {}", location); } @@ -290,7 +296,7 @@ public class JavaDebugger implements EventsHandler, Debugger { classPrepareRequests.put(className, request); } - LOG.debug("Deferred breakpoint: {}", breakpoint.getLocation()); + LOG.debug("Deferred breakpoint: {}", breakpoint.getLocation().toString()); } @Override @@ -342,13 +348,15 @@ public class JavaDebugger implements EventsHandler, Debugger { @Override public void resume(ResumeAction action) throws DebuggerException { + lock.lock(); try { + invalidateCurrentThread(); vm.resume(); LOG.debug("Resume VM"); } catch (VMCannotBeModifiedException e) { throw new DebuggerException(e.getMessage(), e); } finally { - resetCurrentThread(); + lock.unlock(); } } @@ -386,7 +394,7 @@ public class JavaDebugger implements EventsHandler, Debugger { .withVariablePath( newDto(VariablePathDto.class) .withPath(singletonList(var.getName())) - ) + ) .withPrimitive(var.isPrimitive())); } return dump; @@ -569,7 +577,13 @@ public class JavaDebugger implements EventsHandler, Debugger { if (hitBreakpoint) { com.sun.jdi.Location jdiLocation = event.location(); - Location location = debuggerUtil.getLocation(jdiLocation); + Location location; + try { + location = debuggerUtil.getLocation(jdiLocation); + } catch (DebuggerException e) { + location = new LocationImpl(jdiLocation.declaringType().name(), jdiLocation.lineNumber()); + } + debuggerCallback.onEvent(new SuspendEventImpl(location)); } @@ -666,12 +680,12 @@ public class JavaDebugger implements EventsHandler, Debugger { try { return parser.evaluate(new Evaluator(vm, getCurrentThread())); } catch (ExpressionException e) { - throw new DebuggerException(e.getMessage()); + throw new DebuggerException(e.getMessage(), e); } finally { final long endTime = System.currentTimeMillis(); LOG.debug("==>> Evaluate time: {} ms", (endTime - startTime)); // Evaluation of expression may update state of frame. - resetCurrentFrame(); + invalidateCurrentFrame(); } } @@ -699,13 +713,13 @@ public class JavaDebugger implements EventsHandler, Debugger { thread = t; } - private void resetCurrentFrame() { + private void invalidateCurrentFrame() { stackFrame = null; } - private void resetCurrentThread() { - this.stackFrame = null; + private void invalidateCurrentThread() { this.thread = null; + invalidateCurrentFrame(); } private EventRequestManager getEventManager() throws DebuggerException { diff --git a/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/main/java/org/eclipse/che/plugin/jdb/server/utils/JavaDebuggerUtils.java b/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/main/java/org/eclipse/che/plugin/jdb/server/utils/JavaDebuggerUtils.java index c339552df6..3e88947955 100644 --- a/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/main/java/org/eclipse/che/plugin/jdb/server/utils/JavaDebuggerUtils.java +++ b/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/main/java/org/eclipse/che/plugin/jdb/server/utils/JavaDebuggerUtils.java @@ -10,16 +10,14 @@ *******************************************************************************/ package org.eclipse.che.plugin.jdb.server.utils; -import javax.validation.constraints.NotNull; - import org.eclipse.che.api.debug.shared.model.Location; import org.eclipse.che.api.debug.shared.model.impl.LocationImpl; import org.eclipse.che.api.debugger.server.exceptions.DebuggerException; +import org.eclipse.che.commons.annotation.Nullable; import org.eclipse.che.commons.lang.Pair; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.core.IClassFile; import org.eclipse.jdt.core.ICompilationUnit; -import org.eclipse.che.commons.annotation.Nullable; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IMember; @@ -37,6 +35,7 @@ import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IRegion; +import javax.validation.constraints.NotNull; import java.util.ArrayList; import java.util.List; @@ -126,7 +125,6 @@ public class JavaDebuggerUtils { List result = new ArrayList<>(); SearchEngine searchEngine = new SearchEngine(); - searchEngine.searchAllTypeNames(packages, names, scope, diff --git a/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/java/.gitignore b/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/java/.gitignore deleted file mode 100644 index 86d0cb2726..0000000000 --- a/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/java/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore \ No newline at end of file diff --git a/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/java/org/eclipse/che/plugin/jdb/server/JavaDebuggerTest.java b/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/java/org/eclipse/che/plugin/jdb/server/JavaDebuggerTest.java new file mode 100644 index 0000000000..4e132716c4 --- /dev/null +++ b/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/java/org/eclipse/che/plugin/jdb/server/JavaDebuggerTest.java @@ -0,0 +1,352 @@ +/******************************************************************************* + * Copyright (c) 2012-2017 Codenvy, S.A. + * 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: + * Codenvy, S.A. - initial API and implementation + *******************************************************************************/ +package org.eclipse.che.plugin.jdb.server; + +import com.google.common.collect.ImmutableMap; + +import org.eclipse.che.api.core.ServerException; +import org.eclipse.che.api.core.model.project.ProjectConfig; +import org.eclipse.che.api.core.notification.EventService; +import org.eclipse.che.api.debug.shared.model.Breakpoint; +import org.eclipse.che.api.debug.shared.model.DebuggerInfo; +import org.eclipse.che.api.debug.shared.model.Location; +import org.eclipse.che.api.debug.shared.model.StackFrameDump; +import org.eclipse.che.api.debug.shared.model.Variable; +import org.eclipse.che.api.debug.shared.model.event.BreakpointActivatedEvent; +import org.eclipse.che.api.debug.shared.model.event.DebuggerEvent; +import org.eclipse.che.api.debug.shared.model.event.DisconnectEvent; +import org.eclipse.che.api.debug.shared.model.event.SuspendEvent; +import org.eclipse.che.api.debug.shared.model.impl.BreakpointImpl; +import org.eclipse.che.api.debug.shared.model.impl.LocationImpl; +import org.eclipse.che.api.debug.shared.model.impl.VariableImpl; +import org.eclipse.che.api.debug.shared.model.impl.VariablePathImpl; +import org.eclipse.che.api.debug.shared.model.impl.action.ResumeActionImpl; +import org.eclipse.che.api.debug.shared.model.impl.action.StartActionImpl; +import org.eclipse.che.api.debug.shared.model.impl.action.StepIntoActionImpl; +import org.eclipse.che.api.debug.shared.model.impl.action.StepOutActionImpl; +import org.eclipse.che.api.debug.shared.model.impl.action.StepOverActionImpl; +import org.eclipse.che.api.debugger.server.Debugger; +import org.eclipse.che.api.debugger.server.exceptions.DebuggerException; +import org.eclipse.che.api.project.server.ProjectManager; +import org.eclipse.che.api.project.server.ProjectRegistry; +import org.eclipse.che.api.project.server.WorkspaceProjectsSyncer; +import org.eclipse.che.api.project.server.handlers.ProjectHandlerRegistry; +import org.eclipse.che.api.project.server.importer.ProjectImporterRegistry; +import org.eclipse.che.api.project.server.type.ProjectTypeRegistry; +import org.eclipse.che.api.vfs.impl.file.DefaultFileWatcherNotificationHandler; +import org.eclipse.che.api.vfs.impl.file.FileTreeWatcher; +import org.eclipse.che.api.vfs.impl.file.FileWatcherNotificationHandler; +import org.eclipse.che.api.vfs.impl.file.LocalVirtualFileSystemProvider; +import org.eclipse.che.api.vfs.search.impl.FSLuceneSearcherProvider; +import org.eclipse.che.api.vfs.watcher.FileWatcherManager; +import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto; +import org.eclipse.che.plugin.java.server.projecttype.JavaProjectType; +import org.eclipse.che.plugin.java.server.projecttype.JavaValueProviderFactory; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.jdt.internal.core.JavaModelManager; +import org.eclipse.jdt.internal.ui.JavaPlugin; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.io.File; +import java.nio.file.PathMatcher; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.stream.Collectors; + +import static java.util.Collections.singletonList; +import static org.mockito.Mockito.mock; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + +/** + * @author Anatolii Bazko + */ +public class JavaDebuggerTest { + + private Debugger debugger; + private BlockingQueue events; + + + @Test(priority = 1) + public void testGetInfo() throws Exception { + DebuggerInfo info = debugger.getInfo(); + + assertEquals(info.getHost(), "localhost"); + assertEquals(info.getPort(), Integer.parseInt(System.getProperty("debug.port"))); + + assertNotNull(info.getName()); + assertNotNull(info.getVersion()); + } + + @Test(priority = 2) + public void testStartDebugger() throws Exception { + BreakpointImpl breakpoint = new BreakpointImpl(new LocationImpl("com.HelloWorld", 17), false, null); + debugger.start(new StartActionImpl(singletonList(breakpoint))); + + DebuggerEvent debuggerEvent = events.take(); + assertTrue(debuggerEvent instanceof BreakpointActivatedEvent); + + debuggerEvent = events.take(); + assertTrue(debuggerEvent instanceof SuspendEvent); + + Location location = ((SuspendEvent)debuggerEvent).getLocation(); + assertEquals(location.getLineNumber(), 17); + assertEquals(location.getTarget(), "com.HelloWorld"); + } + + @Test(priority = 3) + public void testAddBreakpoint() throws Exception { + int breakpointsCount = debugger.getAllBreakpoints().size(); + + debugger.addBreakpoint(new BreakpointImpl(new LocationImpl("com.HelloWorld", 18), false, null)); + + DebuggerEvent debuggerEvent = events.take(); + assertTrue(debuggerEvent instanceof BreakpointActivatedEvent); + + Breakpoint breakpoint = ((BreakpointActivatedEvent)debuggerEvent).getBreakpoint(); + assertEquals(breakpoint.getLocation().getLineNumber(), 18); + assertEquals(breakpoint.getLocation().getTarget(), "com.HelloWorld"); + assertTrue(breakpoint.isEnabled()); + + assertEquals(debugger.getAllBreakpoints().size(), breakpointsCount + 1); + } + + @Test(priority = 5, expectedExceptions = DebuggerException.class) + public void testAddBreakpointToUnExistedLocation() throws Exception { + debugger.addBreakpoint(new BreakpointImpl(new LocationImpl("com.HelloWorld", 1), false, null)); + } + + @Test(priority = 6) + public void testRemoveBreakpoint() throws Exception { + debugger.deleteBreakpoint(new LocationImpl("com.HelloWorld", 17)); + assertEquals(debugger.getAllBreakpoints().size(), 1); + } + + @Test(priority = 7) + public void testRemoveUnExistedBreakpoint() throws Exception { + int breakpointsCount = debugger.getAllBreakpoints().size(); + + debugger.deleteBreakpoint(new LocationImpl("com.HelloWorld", 2)); + + assertEquals(debugger.getAllBreakpoints().size(), breakpointsCount); + } + + @Test(priority = 8) + public void testGetAllBreakpoints() throws Exception { + assertFalse(debugger.getAllBreakpoints().isEmpty()); + + debugger.deleteAllBreakpoints(); + + assertTrue(debugger.getAllBreakpoints().isEmpty()); + + debugger.addBreakpoint(new BreakpointImpl(new LocationImpl("com.HelloWorld", 18), false, null)); + + DebuggerEvent debuggerEvent = events.take(); + assertTrue(debuggerEvent instanceof BreakpointActivatedEvent); + + assertEquals(debugger.getAllBreakpoints().size(), 1); + + Breakpoint breakpoint = debugger.getAllBreakpoints().get(0); + assertEquals(breakpoint.getLocation().getLineNumber(), 18); + assertEquals(breakpoint.getLocation().getTarget(), "com.HelloWorld"); + assertTrue(breakpoint.isEnabled()); + } + + @Test(priority = 9) + public void testSteps() throws Exception { + debugger.deleteAllBreakpoints(); + + debugger.addBreakpoint(new BreakpointImpl(new LocationImpl("com.HelloWorld", 20), false, null)); + + assertTrue(events.take() instanceof BreakpointActivatedEvent); + + debugger.resume(new ResumeActionImpl()); + + DebuggerEvent debuggerEvent = events.take(); + assertTrue(debuggerEvent instanceof SuspendEvent); + Location location = ((SuspendEvent)debuggerEvent).getLocation(); + assertEquals(location.getTarget(), "com.HelloWorld"); + assertEquals(location.getLineNumber(), 20); + assertEquals(location.getExternalResourceId(), -1); + assertEquals(location.getResourceProjectPath(), "/test"); + assertEquals(location.getResourcePath(), "/test/src/com/HelloWorld.java"); + + debugger.stepInto(new StepIntoActionImpl()); + + debuggerEvent = events.take(); + assertTrue(debuggerEvent instanceof SuspendEvent); + location = ((SuspendEvent)debuggerEvent).getLocation(); + assertEquals(location.getTarget(), "com.HelloWorld"); + assertEquals(location.getLineNumber(), 28); + + debugger.stepOut(new StepOutActionImpl()); + + debuggerEvent = events.take(); + assertTrue(debuggerEvent instanceof SuspendEvent); + location = ((SuspendEvent)debuggerEvent).getLocation(); + assertEquals(location.getTarget(), "com.HelloWorld"); + assertEquals(location.getLineNumber(), 20); + + debugger.stepOver(new StepOverActionImpl()); + + debuggerEvent = events.take(); + assertTrue(debuggerEvent instanceof SuspendEvent); + location = ((SuspendEvent)debuggerEvent).getLocation(); + assertEquals(location.getTarget(), "com.HelloWorld"); + assertEquals(location.getLineNumber(), 21); + + debugger.stepOver(new StepOverActionImpl()); + + debuggerEvent = events.take(); + assertTrue(debuggerEvent instanceof SuspendEvent); + location = ((SuspendEvent)debuggerEvent).getLocation(); + assertEquals(location.getTarget(), "com.HelloWorld"); + assertEquals(location.getLineNumber(), 23); + + debugger.stepOver(new StepOverActionImpl()); + + debuggerEvent = events.take(); + assertTrue(debuggerEvent instanceof SuspendEvent); + location = ((SuspendEvent)debuggerEvent).getLocation(); + assertEquals(location.getTarget(), "com.HelloWorld"); + assertEquals(location.getLineNumber(), 24); + } + + @Test(priority = 10) + public void testEvaluateExpression() throws Exception { + assertEquals(debugger.evaluate("2+2"), "4"); + assertEquals(debugger.evaluate("\"hello\""), "\"hello\""); + assertEquals(debugger.evaluate("test"), "\"hello\""); + } + + @Test(priority = 11) + public void testSetAndGetValue() throws Exception { + assertEquals(debugger.getValue(new VariablePathImpl("test")).getValue(), "\"hello\""); + assertEquals(debugger.getValue(new VariablePathImpl("msg")).getValue(), "\"Hello, debugger!\""); + + debugger.setValue(new VariableImpl("\"new hello\"", (new VariablePathImpl("test")))); + + assertEquals(debugger.getValue(new VariablePathImpl("test")).getValue(), "\"new hello\""); + + StackFrameDump stackFrameDump = debugger.dumpStackFrame(); + Set vars = stackFrameDump.getVariables().stream().map(Variable::getName).collect(Collectors.toSet()); + assertTrue(vars.contains("args")); + assertTrue(vars.contains("msg")); + assertTrue(vars.contains("test")); + } + + @Test(priority = 12) + public void testDisconnect() throws Exception { + debugger.disconnect(); + + DebuggerEvent debuggerEvent = events.take(); + assertTrue(debuggerEvent instanceof DisconnectEvent); + } + + @BeforeClass + protected void initProjectApi() throws Exception { + TestWorkspaceHolder workspaceHolder = new TestWorkspaceHolder(new ArrayList<>()); + File root = new File("target/test-classes/workspace"); + assertTrue(root.exists()); + + File indexDir = new File("target/fs_index"); + assertTrue(indexDir.mkdirs()); + + Set filters = new HashSet<>(); + filters.add(path -> true); + FSLuceneSearcherProvider sProvider = new FSLuceneSearcherProvider(indexDir, filters); + + EventService eventService = new EventService(); + LocalVirtualFileSystemProvider vfsProvider = new LocalVirtualFileSystemProvider(root, sProvider); + ProjectTypeRegistry projectTypeRegistry = new ProjectTypeRegistry(new HashSet<>()); + projectTypeRegistry.registerProjectType(new JavaProjectType(new JavaValueProviderFactory())); + ProjectHandlerRegistry projectHandlerRegistry = new ProjectHandlerRegistry(new HashSet<>()); + ProjectRegistry projectRegistry = new ProjectRegistry(workspaceHolder, + vfsProvider, + projectTypeRegistry, + projectHandlerRegistry, + eventService); + projectRegistry.initProjects(); + + ProjectImporterRegistry importerRegistry = new ProjectImporterRegistry(new HashSet<>()); + FileWatcherNotificationHandler fileWatcherNotificationHandler = new DefaultFileWatcherNotificationHandler(vfsProvider); + FileTreeWatcher fileTreeWatcher = new FileTreeWatcher(root, new HashSet<>(), fileWatcherNotificationHandler); + ProjectManager projectManager = new ProjectManager(vfsProvider, + eventService, + projectTypeRegistry, + projectRegistry, + projectHandlerRegistry, + importerRegistry, + fileWatcherNotificationHandler, + fileTreeWatcher, + workspaceHolder, + mock(FileWatcherManager.class)); + + ResourcesPlugin resourcesPlugin = + new ResourcesPlugin("target/index", + root.getAbsolutePath(), + () -> projectRegistry, + () -> projectManager); + resourcesPlugin.start(); + + JavaPlugin javaPlugin = new JavaPlugin(root.getAbsolutePath() + "/.settings", resourcesPlugin, projectRegistry); + javaPlugin.start(); + + projectRegistry.setProjectType("test", "java", false); + + JavaModelManager.getDeltaState().initializeRoots(true); + + events = new ArrayBlockingQueue<>(10); + Map connectionProperties = ImmutableMap.of("host", "localhost", + "port", System.getProperty("debug.port")); + JavaDebuggerFactory factory = new JavaDebuggerFactory(); + debugger = factory.create(connectionProperties, events::add); + } + + private static class TestWorkspaceHolder extends WorkspaceProjectsSyncer { + private List projects; + + TestWorkspaceHolder() { + this.projects = new ArrayList<>(); + } + + TestWorkspaceHolder(List projects) { + this.projects = projects; + } + + @Override + public List getProjects() { + return projects; + } + + @Override + public String getWorkspaceId() { + return "id"; + } + + @Override + protected void addProject(ProjectConfig project) throws ServerException {} + + @Override + protected void updateProject(ProjectConfig project) throws ServerException {} + + @Override + protected void removeProject(ProjectConfig project) throws ServerException {} + } +} diff --git a/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/resources/docker-assembly.xml b/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/resources/docker-assembly.xml new file mode 100644 index 0000000000..4e3c902222 --- /dev/null +++ b/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/resources/docker-assembly.xml @@ -0,0 +1,21 @@ + + + + + + ${project.build.testOutputDirectory}/workspace/test/out/com/HelloWorld.class + ./com + + + diff --git a/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/resources/workspace/test/src/com/HelloWorld.java b/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/resources/workspace/test/src/com/HelloWorld.java new file mode 100644 index 0000000000..2192288ac7 --- /dev/null +++ b/plugins/plugin-java-debugger/che-plugin-java-debugger-server/src/test/resources/workspace/test/src/com/HelloWorld.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2012-2017 Codenvy, S.A. + * 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: + * Codenvy, S.A. - initial API and implementation + *******************************************************************************/ +package com; + +public class HelloWorld { + + public static void main(String[] args) { + + String test = "hello"; + System.out.println(test); + + String msg = say("world"); + System.out.println(msg); + + msg = say("debugger"); + System.out.println(msg); + } + + private static String say(String message) { + return "Hello, " + message + "!"; + } +} diff --git a/wsagent/che-core-api-debug-shared/src/main/java/org/eclipse/che/api/debug/shared/model/impl/LocationImpl.java b/wsagent/che-core-api-debug-shared/src/main/java/org/eclipse/che/api/debug/shared/model/impl/LocationImpl.java index b19408f24e..01c0024343 100644 --- a/wsagent/che-core-api-debug-shared/src/main/java/org/eclipse/che/api/debug/shared/model/impl/LocationImpl.java +++ b/wsagent/che-core-api-debug-shared/src/main/java/org/eclipse/che/api/debug/shared/model/impl/LocationImpl.java @@ -103,4 +103,16 @@ public class LocationImpl implements Location { result = 31 * result + Objects.hashCode(resourceProjectPath); return result; } + + @Override + public String toString() { + return "LocationImpl{" + + "target='" + target + '\'' + + ", lineNumber=" + lineNumber + + ", resourcePath='" + resourcePath + '\'' + + ", externalResource=" + externalResource + + ", externalResourceId=" + externalResourceId + + ", resourceProjectPath='" + resourceProjectPath + '\'' + + '}'; + } } diff --git a/wsmaster/integration-tests/postgresql-tck/pom.xml b/wsmaster/integration-tests/postgresql-tck/pom.xml index 7938c3c304..b350621da2 100644 --- a/wsmaster/integration-tests/postgresql-tck/pom.xml +++ b/wsmaster/integration-tests/postgresql-tck/pom.xml @@ -270,7 +270,6 @@ io.fabric8 docker-maven-plugin - 0.15.16 start