/*******************************************************************************
* Copyright (c) 2010 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 v1.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.jboss.tools.ws.ui.bot.test.webservice;
import static org.junit.Assert.assertNotNull;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.logging.Level;
import org.jboss.reddeer.common.wait.TimePeriod;
import org.jboss.reddeer.common.wait.WaitUntil;
import org.jboss.reddeer.common.wait.WaitWhile;
import org.jboss.reddeer.core.condition.JobIsRunning;
import org.jboss.reddeer.core.condition.ShellWithTextIsAvailable;
import org.jboss.reddeer.jface.wizard.WizardDialog;
import org.jboss.reddeer.requirements.autobuilding.AutoBuildingRequirement.AutoBuilding;
import org.jboss.reddeer.swt.api.Shell;
import org.jboss.reddeer.swt.api.StyledText;
import org.jboss.reddeer.swt.condition.WidgetIsEnabled;
import org.jboss.reddeer.swt.exception.SWTLayerException;
import org.jboss.reddeer.swt.impl.button.FinishButton;
import org.jboss.reddeer.swt.impl.button.NextButton;
import org.jboss.reddeer.swt.impl.button.OkButton;
import org.jboss.reddeer.swt.impl.button.PushButton;
import org.jboss.reddeer.swt.impl.shell.DefaultShell;
import org.jboss.reddeer.swt.impl.styledtext.DefaultStyledText;
import org.jboss.reddeer.swt.impl.text.DefaultText;
import org.jboss.reddeer.workbench.impl.editor.DefaultEditor;
import org.jboss.reddeer.workbench.impl.editor.TextEditor;
import org.jboss.tools.ws.reddeer.ui.wizards.wst.WebServiceFirstWizardPage;
import org.jboss.tools.ws.reddeer.ui.wizards.wst.WebServiceFirstWizardPage.ServiceType;
import org.jboss.tools.ws.reddeer.ui.wizards.wst.WebServiceSecondWizardPage;
import org.jboss.tools.ws.reddeer.ui.wizards.wst.WebServiceWizard;
import org.jboss.tools.ws.reddeer.ui.wizards.wst.WebServiceWizardPageBase.SliderLevel;
import org.jboss.tools.ws.ui.bot.test.soap.SOAPTestBase;
import org.jboss.tools.ws.ui.bot.test.utils.ProjectHelper;
import org.jboss.tools.ws.ui.bot.test.utils.ResourceHelper;
import org.jboss.tools.ws.ui.bot.test.utils.ServersViewHelper;
import org.junit.After;
import org.junit.Assert;
/**
* Base class for Web Service wizard tests
*
* @author jjankovi
*
*/
@AutoBuilding(value = false, cleanup = true)
public abstract class WebServiceTestBase extends SOAPTestBase {
protected abstract String getWsPackage();
protected abstract String getWsName();
@After
public void undeploy() {
ServersViewHelper.removeAllProjectsFromServer(getConfiguredServerName());
}
protected void bottomUpWS(InputStream input, WebServiceRuntime serviceRuntime, boolean useDefaultProjects) {
String source = ResourceHelper.readStream(input);
String src = MessageFormat.format(source, getWsPackage(), getWsName());
createService(ServiceType.BOTTOM_UP, getWsPackage() + "."
+ getWsName(), getLevel(), null, src, serviceRuntime, useDefaultProjects);
}
protected void topDownWS(InputStream input, WebServiceRuntime serviceRuntime, String pkg, boolean useDefaultProjects) {
String s = ResourceHelper.readStream(input);
String[] tns = getWsPackage().split("\\.");
StringBuilder sb = new StringBuilder();
for (int i = tns.length - 1; i > 0; i--) {
sb.append(tns[i]);
sb.append(".");
}
sb.append(tns[0]);
String src = MessageFormat.format(s, sb.toString(), getWsName());
createService(ServiceType.TOP_DOWN, "/" + getWsProjectName() + "/src/"
+ getWsName() + ".wsdl", getLevel(), pkg, src, serviceRuntime, useDefaultProjects);
}
private void createService(ServiceType type, String source,
SliderLevel level, String pkg, String code, WebServiceRuntime serviceRuntime, boolean useDefaultProjects) {
// create ws source - java class or wsdl
switch (type) {
case BOTTOM_UP:
TextEditor editor = ProjectHelper.createClass(getWsProjectName(), getWsPackage(), getWsName());
assertNotNull(editor);
// replace default content of java class w/ code
editor.setText(code);
editor.save();
editor.close();
break;
case TOP_DOWN:
DefaultEditor ed = ProjectHelper.createWsdl(getWsProjectName(),getWsName());
assertNotNull(ed);
StyledText text = new DefaultStyledText();
assertNotNull(text);
text.setText(code);
ed.save();
ed.close();
break;
}
ProjectHelper.cleanAllProjects();
// create a web service
WebServiceWizard wizard = new WebServiceWizard();
wizard.open();
WebServiceFirstWizardPage page = new WebServiceFirstWizardPage();
page.setServiceType(type);
page.setSource(source);
page.setServerRuntime(getConfiguredServerName());
page.setWebServiceRuntime(serviceRuntime.getName());
if (!useDefaultProjects) {
page.setServiceProject(getWsProjectName());
page.setServiceEARProject(getEarProjectName());
}
new DefaultShell("Web Service");
page.setServiceSlider(level);
if (page.isClientEnabled()) {
page.setClientSlider(SliderLevel.NO_CLIENT);
}
new WaitUntil(new WidgetIsEnabled(new NextButton()), TimePeriod.getCustom(5), false);
wizard.next();
checkErrorDialog(wizard);
if (pkg != null && pkg.trim().length() > 0) {
WebServiceSecondWizardPage page2 = new WebServiceSecondWizardPage();
page2.setPackageName(pkg);
wizard.next();
}
if (pkg == null && type == ServiceType.TOP_DOWN && getLevel() == SliderLevel.ASSEMBLE) {
new FinishButton().click();
confirmWebServiceNameOverwrite();
new WaitWhile(new ShellWithTextIsAvailable("Web Service"));
new WaitWhile(new JobIsRunning());
} else {
new DefaultShell("Web Service");
wizard.finish();
}
// let's fail if there's some error in the wizard,
// and close error dialog and the wizard so other tests
// can continue
if (new DefaultShell() != null) {
if (new DefaultShell().getText().contains("Error")) {
String msg = new DefaultText().getText();
new PushButton(0).click();
wizard.cancel();
Assert.fail(msg);
}
}
}
private void checkErrorDialog(WizardDialog openedWizard) {
Shell shell = new DefaultShell();
String text = shell.getText();
if (text.contains("Error")) {
String msg = "<no text>";
try {
msg = new DefaultText().getText();
} catch (SWTLayerException e) {
}
new PushButton(0).click();
openedWizard.cancel();
Assert.fail(text + msg);
}
}
private void confirmWebServiceNameOverwrite() {
// look up shell
try {
new DefaultShell("Confirm Web Service Name Overwrite");
new OkButton().click();
} catch(SWTLayerException e) {
LOGGER.log(Level.SEVERE, "No \"Confirm Web Service Name Overwrite\" dialog found!", e);
return;
}
}
}