blob: e2422192879801f9044a2b0df9307d8d2db34d46 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v2.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.eclipse.wst.jsdt.integration.tests.nodejs;
import static org.junit.Assert.assertTrue;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.wst.jsdt.integration.tests.common.JSTTestBase;
import org.jboss.reddeer.common.exception.WaitTimeoutExpiredException;
import org.jboss.reddeer.common.matcher.RegexMatcher;
import org.jboss.reddeer.common.wait.TimePeriod;
import org.jboss.reddeer.common.wait.WaitUntil;
import org.jboss.reddeer.core.handler.ShellHandler;
import org.jboss.reddeer.eclipse.condition.ConsoleHasText;
import org.jboss.reddeer.eclipse.jdt.ui.ProjectExplorer;
import org.jboss.reddeer.eclipse.ui.console.ConsoleView;
import org.jboss.reddeer.eclipse.ui.perspectives.DebugPerspective;
import org.jboss.reddeer.requirements.openperspective.OpenPerspectiveRequirement.OpenPerspective;
import org.jboss.reddeer.swt.api.TreeItem;
import org.jboss.reddeer.swt.impl.tree.DefaultTree;
import org.jboss.reddeer.workbench.condition.EditorWithTitleIsActive;
import org.jboss.reddeer.workbench.impl.editor.TextEditor;
import org.jboss.reddeer.workbench.impl.view.WorkbenchView;
import org.eclipse.wst.jsdt.integration.tests.internal.condition.CursorPositionIsOnLine;
import org.eclipse.wst.jsdt.integration.tests.internal.condition.TreeContainsItem;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchManager;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
/**
* Tests for NodeJS Debugger
*
* @author Pavol Srna
*
*/
@OpenPerspective(DebugPerspective.class)
public class NodeJSDebuggerTest extends JSTTestBase {
private static String TEST_APP_NAME = "jsdt-node-test-project";
private static String IMPORT_PATH = "resources/" + TEST_APP_NAME;
private static int BOOK_JS_BREAKPOINT_LINE = 4;
private static String DEBUG_VARIABLE_EXPRESS = "express";
private static String DEBUG_VARIABLE_PORT = "port";
private static String DEBUG_VARIABLE_TITLE = "title";
private static String DEBUG_VARIABLE_TITLE_VALUE = "\"Nineteen Eighty-Four\"";
private static String DEBUG_VARIABLE_AUTHOR = "author";
private static String DEBUG_VARIABLE_AUTHOR_VALUE = "\"George Orwell\"";
private static int APP_PORT = 3000;
private static int DEBUG_PORT = 5858;
private static NodeJSLaunchListener launchListener = null;
@BeforeClass
public static void prepare() {
/* PE is closed in Debug perspective, open it */
new ProjectExplorer().open();
importExistingProject(IMPORT_PATH);
assertTrue(TEST_APP_NAME + " has not been imported!", new ProjectExplorer().containsProject(TEST_APP_NAME));
npmInstall(TEST_APP_NAME);
}
@AfterClass
public static void cleanup() {
ShellHandler.getInstance().closeAllNonWorbenchShells();
new ProjectExplorer().deleteAllProjects();
}
@Before
public void debugAs() {
assertTrue(portAvailable(APP_PORT));
assertTrue(portAvailable(DEBUG_PORT));
launchListener = new NodeJSLaunchListener();
ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
manager.addLaunchListener(launchListener);
debugAsNodeJSAppMenu(new ProjectExplorer().getProject(TEST_APP_NAME).getProjectItem("index.js")).select();
new WorkbenchView("Debug").open();
DefaultTree debugTree = new DefaultTree();
new WaitUntil(new TreeContainsItem(debugTree, new RegexMatcher("\\(anonymous function\\)(.*)(index\\.js)(.*)")),
TimePeriod.LONG);
RegexMatcher matcher = new RegexMatcher("\\(anonymous function\\)(.*)(index\\.js)(.*)");
doubleClickTreeItem(debugTree, matcher);
ConsoleView console = new ConsoleView();
console.open();
new WaitUntil(new ConsoleHasText("Debugger listening"), TimePeriod.LONG);
}
@After
public void terminate() {
terminatePrcs(launchListener.getNodeJSLaunch().getProcesses());
ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
manager.removeLaunchListener(launchListener);
}
@Test
public void testJSVariablesAvailableInView() {
TreeItem varExpress = getVariable(DEBUG_VARIABLE_EXPRESS);
TreeItem varPort = getVariable(DEBUG_VARIABLE_PORT);
assertTrue("Variable '" + DEBUG_VARIABLE_EXPRESS + "' not found in view!", varExpress != null);
assertThat(varExpress.getCell(0), is(DEBUG_VARIABLE_EXPRESS));
assertThat(varExpress.getCell(1), is("undefined"));
assertTrue("Variable '" + DEBUG_VARIABLE_PORT + "' not found in view!", varPort != null);
assertThat(varPort.getCell(0), is(DEBUG_VARIABLE_PORT));
assertThat(varPort.getCell(1), is("undefined"));
}
@Test
public void testJSVariablesInitialized() throws CoreException {
new ProjectExplorer().getProject(TEST_APP_NAME).getProjectItem("book.js").open();
new WaitUntil(new EditorWithTitleIsActive("book.js"));
TextEditor editor = new TextEditor("book.js");
setLineBreakpoint(editor, BOOK_JS_BREAKPOINT_LINE);
// resume
new WorkbenchView("Debug").open();
DefaultTree debugTree = new DefaultTree();
resume(debugTree, new RegexMatcher("\\(anonymous function\\)(.*)(index\\.js)(.*)"));
new WaitUntil(new EditorWithTitleIsActive("book.js"), TimePeriod.LONG);
new WaitUntil(new CursorPositionIsOnLine(editor, BOOK_JS_BREAKPOINT_LINE));
TreeItem varTitle = getVariable(DEBUG_VARIABLE_TITLE);
TreeItem varAuthor = getVariable(DEBUG_VARIABLE_AUTHOR);
assertTrue("Variable '" + DEBUG_VARIABLE_TITLE + "' not found in view!", varTitle != null);
assertThat(varTitle.getCell(0), is(DEBUG_VARIABLE_TITLE));
assertThat(varTitle.getCell(1), is(DEBUG_VARIABLE_TITLE_VALUE));
assertTrue("Variable '" + DEBUG_VARIABLE_AUTHOR + "' not found in view!", varAuthor != null);
assertThat(varAuthor.getCell(0), is(DEBUG_VARIABLE_AUTHOR));
assertThat(varAuthor.getCell(1), is(DEBUG_VARIABLE_AUTHOR_VALUE));
}
@Test
public void testDebuggerStopsAtBreakpoint() throws CoreException {
new ProjectExplorer().getProject(TEST_APP_NAME).getProjectItem("book.js").open();
new WaitUntil(new EditorWithTitleIsActive("book.js"));
TextEditor editor = new TextEditor("book.js");
setLineBreakpoint(editor, BOOK_JS_BREAKPOINT_LINE);
// resume
new WorkbenchView("Debug").open();
DefaultTree debugTree = new DefaultTree();
resume(debugTree, new RegexMatcher("\\(anonymous function\\)(.*)(index\\.js)(.*)"));
try {
new WaitUntil(new EditorWithTitleIsActive("book.js"), TimePeriod.LONG);
new WaitUntil(new CursorPositionIsOnLine(editor, BOOK_JS_BREAKPOINT_LINE));
} catch (WaitTimeoutExpiredException e) {
Assert.fail("Debugger hasn't stopped on breakpoint");
}
}
}