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 extends ProjectConfig> 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