Skip to content

Commit a32457d

Browse files
authored
Make sure "Run As" > "App Engine" shows only on App Engine projects. (#1560)
* Show App Engine menu only on App Engine projects * Add tests * Do regex match to find App Engine menu * Fix Import-Package in MANIFEST.MF * Remove unnecessary <with> in enablement expression
1 parent be6a763 commit a32457d

3 files changed

Lines changed: 112 additions & 22 deletions

File tree

plugins/com.google.cloud.tools.eclipse.appengine.localserver.test/META-INF/MANIFEST.MF

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,17 @@ Bundle-Vendor: Google Inc.
88
Bundle-Version: 0.1.0.qualifier
99
Fragment-Host: com.google.cloud.tools.eclipse.appengine.localserver
1010
Require-Bundle: org.hamcrest;bundle-version="1.1.0",
11-
org.junit;bundle-version="4.12.0",
12-
org.eclipse.jst.j2ee.web
13-
Import-Package: com.google.cloud.tools.eclipse.test.util,
11+
org.junit;bundle-version="4.12.0"
12+
Import-Package: com.google.cloud.tools.eclipse.swtbot,
13+
com.google.cloud.tools.eclipse.test.util,
1414
com.google.cloud.tools.eclipse.test.util.project,
1515
com.google.cloud.tools.eclipse.test.util.ui,
16-
com.google.cloud.tools.eclipse.util.io,
16+
org.apache.log4j,
17+
org.eclipse.jst.j2ee.web.project.facet,
18+
org.eclipse.swtbot.eclipse.finder,
19+
org.eclipse.swtbot.swt.finder.finders,
20+
org.eclipse.swtbot.swt.finder.matchers,
21+
org.eclipse.swtbot.swt.finder.widgets,
1722
org.mockito;provider=google;version="1.10.19",
1823
org.mockito.runners;provider=google;version="1.10.19",
1924
org.mockito.stubbing;provider=google;version="1.10.19",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/*
2+
* Copyright 2017 Google Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.google.cloud.tools.eclipse.appengine.localserver;
18+
19+
import static org.junit.Assert.assertFalse;
20+
import static org.junit.Assert.assertNotNull;
21+
import static org.junit.Assert.assertTrue;
22+
23+
import com.google.cloud.tools.eclipse.appengine.facets.AppEngineStandardFacet;
24+
import com.google.cloud.tools.eclipse.swtbot.SwtBotProjectActions;
25+
import com.google.cloud.tools.eclipse.test.util.project.TestProjectCreator;
26+
import com.google.cloud.tools.eclipse.ui.util.WorkbenchUtil;
27+
import java.io.ByteArrayInputStream;
28+
import java.util.Arrays;
29+
import java.util.List;
30+
import org.eclipse.core.resources.IFile;
31+
import org.eclipse.core.resources.IProject;
32+
import org.eclipse.core.runtime.CoreException;
33+
import org.eclipse.jst.common.project.facet.core.JavaFacet;
34+
import org.eclipse.jst.j2ee.web.project.facet.WebFacetUtils;
35+
import org.eclipse.swt.widgets.Menu;
36+
import org.eclipse.swt.widgets.MenuItem;
37+
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
38+
import org.eclipse.swtbot.swt.finder.finders.MenuFinder;
39+
import org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory;
40+
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
41+
import org.eclipse.ui.IWorkbench;
42+
import org.eclipse.ui.PlatformUI;
43+
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
44+
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
45+
import org.hamcrest.Matcher;
46+
import org.junit.Rule;
47+
import org.junit.Test;
48+
49+
public class RunAppEngineShortcutTest {
50+
51+
private static final IProjectFacetVersion APP_ENGINE_STANDARD_FACET_1 =
52+
ProjectFacetsManager.getProjectFacet(AppEngineStandardFacet.ID).getVersion("1");
53+
54+
@Rule public TestProjectCreator javaProjectCreator = new TestProjectCreator();
55+
@Rule public TestProjectCreator appEngineProjectCreator = new TestProjectCreator()
56+
.withFacetVersions(Arrays.asList(
57+
JavaFacet.VERSION_1_7, WebFacetUtils.WEB_25, APP_ENGINE_STANDARD_FACET_1));
58+
59+
@Test
60+
public void testRunAppEngine_enabledForAppEngineProject() {
61+
IProject project = appEngineProjectCreator.getProject();
62+
assertTrue(appEngineMenuExists(project));
63+
}
64+
65+
@Test
66+
public void testRunAppEngine_hiddenForPlainProject() {
67+
IProject project = javaProjectCreator.getProject();
68+
assertFalse(appEngineMenuExists(project));
69+
}
70+
71+
// https://github.com/GoogleCloudPlatform/google-cloud-eclipse/issues/1556
72+
@Test
73+
public void testRunAppEngine_hiddenEvenIfAppEngineProjectFileIsOpen() throws CoreException {
74+
// Create an empty file in the App Engine project, and open it in an editor.
75+
IProject appEngineProject = appEngineProjectCreator.getProject();
76+
IFile file = appEngineProject.getFile("textfile.txt");
77+
file.create(new ByteArrayInputStream(new byte[0]), IFile.FORCE, null);
78+
79+
IWorkbench workbench = PlatformUI.getWorkbench();
80+
assertNotNull(WorkbenchUtil.openInEditor(workbench, file));
81+
82+
IProject javaProject = javaProjectCreator.getProject();
83+
assertFalse(appEngineMenuExists(javaProject));
84+
}
85+
86+
// We need regex matching, since the actual menu name is "<number> App Engine".
87+
private static boolean appEngineMenuExists(IProject project) {
88+
SWTBotTreeItem selected = SwtBotProjectActions.selectProject(
89+
new SWTWorkbenchBot(), project.getName());
90+
Menu runAsMenu = selected.contextMenu("Run As").widget.getMenu();
91+
Matcher<MenuItem> matcher = WidgetMatcherFactory.withRegex("App Engine");
92+
93+
List<MenuItem> menuItems = new MenuFinder().findMenus(runAsMenu, matcher, false);
94+
return !menuItems.isEmpty();
95+
}
96+
}

plugins/com.google.cloud.tools.eclipse.appengine.localserver/plugin.xml

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -287,24 +287,13 @@
287287
modes="run,debug">
288288
<contextualLaunch>
289289
<enablement>
290-
<or>
291-
<with variable="selection">
292-
<iterate>
293-
<adapt type="org.eclipse.core.resources.IProject">
294-
<test
295-
property="org.eclipse.wst.common.project.facet.core.projectFacet"
296-
value="com.google.cloud.tools.eclipse.appengine.facets.standard" />
297-
</adapt>
298-
</iterate>
299-
</with>
300-
<with variable="activeEditorInput">
301-
<adapt type="org.eclipse.core.resources.IFile">
302-
<test
303-
property="org.eclipse.wst.common.project.facet.core.projectFacet"
304-
value="com.google.cloud.tools.eclipse.appengine.facets.standard" />
305-
</adapt>
306-
</with>
307-
</or>
290+
<iterate>
291+
<adapt type="org.eclipse.core.resources.IResource">
292+
<test
293+
property="org.eclipse.wst.common.project.facet.core.projectFacet"
294+
value="com.google.cloud.tools.eclipse.appengine.facets.standard" />
295+
</adapt>
296+
</iterate>
308297
</enablement>
309298
</contextualLaunch>
310299
<description

0 commit comments

Comments
 (0)