/** * Licensed to the Austrian Association for Software Tool Integration (AASTI) * under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright * ownership. The AASTI licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.openengsb.ui.admin.testClient; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyMap; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Dictionary; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import junit.framework.Assert; import junit.framework.AssertionFailedError; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.wicket.Component; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.extensions.markup.html.tree.LinkTree; import org.apache.wicket.feedback.FeedbackMessage; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.repeater.RepeatingView; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.tester.FormTester; import org.junit.Test; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.openengsb.core.api.AliveState; import org.openengsb.core.api.Connector; import org.openengsb.core.api.ConnectorInstanceFactory; import org.openengsb.core.api.Constants; import org.openengsb.core.api.Domain; import org.openengsb.core.api.context.ContextHolder; import org.openengsb.core.api.descriptor.ServiceDescriptor; import org.openengsb.core.api.l10n.PassThroughLocalizableString; import org.openengsb.core.api.model.ConnectorDescription; import org.openengsb.ui.admin.AbstractUITest; import org.openengsb.ui.admin.connectorEditorPage.ConnectorEditorPage; import org.openengsb.ui.admin.index.Index; import org.openengsb.ui.admin.model.MethodCall; import org.openengsb.ui.admin.model.MethodId; import org.openengsb.ui.admin.model.ServiceId; import org.openengsb.ui.admin.util.MethodComparator; import org.openengsb.ui.common.OpenEngSBPage; import org.openengsb.ui.common.editor.BeanEditorPanel; import org.openengsb.ui.common.editor.fields.DropdownField; import org.openengsb.ui.common.editor.fields.InputField; import org.ops4j.pax.wicket.test.spring.PaxWicketSpringBeanComponentInjector; import org.osgi.framework.ServiceReference; public class TestClientTest extends AbstractUITest { public interface AnotherTestInterface extends Connector { } public class TestService implements AnotherTestInterface { private final String instanceId; public TestService(String id) { instanceId = id; } @Override public AliveState getAliveState() { return AliveState.OFFLINE; } @Override public String getInstanceId() { return instanceId; } @Override public void setDomainId(String domainId) { } @Override public String getDomainId() { return null; } @Override public void setConnectorId(String connectorId) { } @Override public String getConnectorId() { return null; } } public enum UpdateEnum { ONE, TWO } private TestInterface testService; private FormTester formTester; private boolean serviceListExpanded = true; @Test public void testLinkAppearsWithCaptionTestClient_shouldShowTestClient() throws Exception { setupIndexPage(); tester.startPage(Index.class); tester.assertContains("Test Client"); } @Test public void testParameterFormIsCreated_shouldShowMethodCallForm() throws Exception { setupAndStartTestClientPage(); tester.assertComponent("methodCallForm", Form.class); } @Test public void testServiceTreeIsCreated_shouldShowServiceList() throws Exception { setupAndStartTestClientPage(); tester.assertComponent("methodCallForm:serviceList", LinkTree.class); } @Test public void testShowServiceInstancesInDropdown_shouldShowServices() throws Exception { setupAndStartTestClientPage(); if (!serviceListExpanded) { expandServiceListTree(); } tester.assertComponent("methodCallForm:serviceList:i:5:nodeComponent:contentLink", AjaxLink.class); Label serviceLabel = (Label) tester .getComponentFromLastRenderedPage("methodCallForm:serviceList:i:5:nodeComponent:contentLink:content"); assertThat(serviceLabel.getDefaultModelObjectAsString(), containsString("test-service")); } @Test public void testCreateMethodListDropDown_shouldShowMethodList() throws Exception { setupAndStartTestClientPage(); tester.assertComponent("methodCallForm:methodList", DropDownChoice.class); } @Test public void testServiceManagerList_shouldWork() throws Exception { setupAndStartTestClientPage(); tester.assertComponent("serviceManagementContainer:domains:1:services:0:create.new", Link.class); ListView<?> component = (ListView<?>) tester.getComponentFromLastRenderedPage("serviceManagementContainer:domains:0:services"); assertThat("should only display service-factories for the current domain", component.size(), is(0)); } @Test public void testServiceListSelect_shouldSelectService() throws Exception { setupAndStartTestClientPage(); setServiceInDropDown("testdomain+testconnector+test-service"); @SuppressWarnings("unchecked") Form<MethodCall> form = (Form<MethodCall>) tester.getComponentFromLastRenderedPage("methodCallForm"); MethodCall modelObject = form.getModelObject(); ServiceId reference = new ServiceId(TestInterface.class, "testdomain+testconnector+test-service"); Assert.assertEquals(reference.toString(), modelObject.getService().toString()); } @Test @SuppressWarnings("unchecked") public void testJumpToService_shouldJumpToService() throws Exception { setupTestClientPage(); String connectorId = "testdomain+testconnector+test-service"; ServiceId reference = new ServiceId(TestInterface.class, connectorId); tester.startPage(new TestClient(reference)); tester.assertComponent("methodCallForm:serviceList:i:2:nodeComponent:contentLink:content", Label.class); Form<MethodCall> form = (Form<MethodCall>) tester.getComponentFromLastRenderedPage("methodCallForm"); assertThat(form.getModelObject().getService(), is(reference)); DropDownChoice<MethodId> ddc = (DropDownChoice<MethodId>) form.get("methodList"); assertThat(ddc.getChoices().isEmpty(), is(false)); } private void expandServiceListTree() { tester.clickLink("methodCallForm:serviceList:i:0:junctionLink", true); tester.clickLink("methodCallForm:serviceList:i:1:junctionLink", true); serviceListExpanded = true; } @Test public void testShowMethodListInDropDown_shouldShowMethodList() throws Exception { setupAndStartTestClientPage(); @SuppressWarnings("unchecked") DropDownChoice<MethodId> methodList = (DropDownChoice<MethodId>) tester.getComponentFromLastRenderedPage("methodCallForm:methodList"); setServiceInDropDown("testdomain+testconnector+test-service"); List<? extends MethodId> choices = methodList.getChoices(); List<Method> choiceMethods = new ArrayList<Method>(); for (MethodId mid : choices) { choiceMethods.add(TestInterface.class.getMethod(mid.getName(), mid.getArgumentTypes())); } List<Method> list = Arrays.asList(TestInterface.class.getMethods()); Collections.sort(list, new MethodComparator()); Assert.assertEquals(list, choiceMethods); } @Test public void testCreateArgumentList_shouldCreateArgumentList() throws Exception { setupAndStartTestClientPage(); Component argList = tester.getComponentFromLastRenderedPage("methodCallForm:argumentListContainer:argumentList"); Assert.assertNotNull(argList); } @Test public void testCreateTextFieldsFor2StringArguments_shouldShowTextFields() throws Exception { setupAndStartTestClientPage(); RepeatingView argList = (RepeatingView) tester .getComponentFromLastRenderedPage("methodCallForm:argumentListContainer:argumentList"); setServiceInDropDown("testdomain+testconnector+test-service"); setMethodInDropDown("update", String.class, String.class); Assert.assertEquals(2, argList.size()); Iterator<? extends Component> iterator = argList.iterator(); while (iterator.hasNext()) { Component next = iterator.next(); tester.assertComponent(next.getPageRelativePath() + ":valueEditor", InputField.class); } } @Test public void testCreateDropdownForOptionArguments_shouldShowArgumentDropdownField() throws Exception { setupAndStartTestClientPage(); RepeatingView argList = (RepeatingView) tester .getComponentFromLastRenderedPage("methodCallForm:argumentListContainer:argumentList"); setServiceInDropDown("testdomain+testconnector+test-service"); setMethodInDropDown("update", UpdateEnum.class); Assert.assertEquals(1, argList.size()); tester.assertComponent("methodCallForm:argumentListContainer:argumentList:arg0panel:valueEditor", DropdownField.class); } @Test public void testCreateTextFieldsForBean_shouldShowBeanForm() throws Exception { setupAndStartTestClientPage(); RepeatingView argList = (RepeatingView) tester .getComponentFromLastRenderedPage("methodCallForm:argumentListContainer:argumentList"); setServiceInDropDown("testdomain+testconnector+test-service"); setMethodInDropDown("update", TestBean.class); Assert.assertEquals(1, argList.size()); Assert.assertEquals(BeanEditorPanel.class, argList.get("arg0panel:valueEditor").getClass()); RepeatingView panel = (RepeatingView) argList.get("arg0panel:valueEditor:fields"); Assert.assertEquals(2, panel.size()); } @Test public void testPerformMethodCall_shouldCallMethod() throws Exception { setupAndStartTestClientPage(); RepeatingView argList = (RepeatingView) tester .getComponentFromLastRenderedPage("methodCallForm:argumentListContainer:argumentList"); setServiceInDropDown("testdomain+testconnector+test-service"); setMethodInDropDown("update", String.class, String.class); for (int i = 0; i < argList.size(); i++) { formTester.setValue("argumentListContainer:argumentList:arg" + i + "panel:valueEditor:field", "test"); } tester.executeAjaxEvent("methodCallForm:submitButton", "onclick"); verify(testService).update("test", "test"); } @Test public void testPerformMethodCallOnDomain_shouldCallMethod() throws Exception { setupAndStartTestClientPage(); RepeatingView argList = (RepeatingView) tester .getComponentFromLastRenderedPage("methodCallForm:argumentListContainer:argumentList"); setServiceInDropDown("testdomain+testconnector+test-service"); setMethodInDropDown("update", String.class, String.class); for (int i = 0; i < argList.size(); i++) { formTester.setValue("argumentListContainer:argumentList:arg" + i + "panel:valueEditor:field", "test"); } tester.executeAjaxEvent("methodCallForm:submitButton", "onclick"); verify(testService).update("test", "test"); } @Test public void testPerformMethodCallWithBeanArgument_shouldCallMethod() throws Exception { setupAndStartTestClientPage(); setServiceInDropDown("testdomain+testconnector+test-service"); setMethodInDropDown("update", TestBean.class); String beanPanelPath = "argumentListContainer:argumentList:arg0panel:valueEditor"; BeanEditorPanel beanPanel = (BeanEditorPanel) tester.getComponentFromLastRenderedPage("methodCallForm:" + beanPanelPath); String idFieldId = beanPanel.getFieldViewId("id"); String nameFieldId = beanPanel.getFieldViewId("name"); formTester.setValue(beanPanelPath + ":fields:" + idFieldId + ":row:field", "42"); formTester.setValue(beanPanelPath + ":fields:" + nameFieldId + ":row:field", "test"); tester.executeAjaxEvent("methodCallForm:submitButton", "onclick"); verify(testService).update(new TestBean("42", "test")); } @Test public void testPerformMethodCallWithIntegerObjectArgument_shouldCallMethod() throws Exception { setupAndStartTestClientPage(); setServiceInDropDown("testdomain+testconnector+test-service"); setMethodInDropDown("update", Integer.class); String beanPanelPath = "argumentListContainer:argumentList:arg0panel:valueEditor"; formTester.setValue(beanPanelPath + ":field", "42"); tester.executeAjaxEvent("methodCallForm:submitButton", "onclick"); verify(testService).update(new Integer(42)); } @Test public void testSelectMethod_shouldHaveTwoArguments() throws Exception { setupAndStartTestClientPage(); RepeatingView argList = (RepeatingView) tester .getComponentFromLastRenderedPage("methodCallForm:argumentListContainer:argumentList"); setServiceInDropDown("testdomain+testconnector+test-service"); setMethodInDropDown("update", String.class, String.class); Assert.assertEquals(2, argList.size()); } @Test public void testFormResetAfterCall_shouldResetForm() throws Exception { setupAndStartTestClientPage(); setServiceInDropDown("testdomain+testconnector+test-service"); setMethodInDropDown("update", String.class, String.class); formTester.setValue("argumentListContainer:argumentList:arg0panel:valueEditor:field", "test"); formTester.setValue("argumentListContainer:argumentList:arg1panel:valueEditor:field", "test"); tester.executeAjaxEvent("methodCallForm:submitButton", "onclick"); RepeatingView argList = (RepeatingView) tester .getComponentFromLastRenderedPage("methodCallForm:argumentListContainer:argumentList"); Assert.assertEquals(0, argList.size()); } @Test public void testFeedbackPanelIsPresent_shouldShowFeedbackPanel() throws Exception { setupAndStartTestClientPage(); tester.assertComponent("feedback", FeedbackPanel.class); } @Test public void testFeedbackPanelContainsText_shouldShowFeedbackPanel() throws Exception { setupAndStartTestClientPage(); setServiceInDropDown("testdomain+testconnector+test-service"); setMethodInDropDown("update", String.class, String.class); formTester.setValue("argumentListContainer:argumentList:arg0panel:valueEditor:field", "test"); formTester.setValue("argumentListContainer:argumentList:arg1panel:valueEditor:field", "test"); tester.executeAjaxEvent("methodCallForm:submitButton", "onclick"); FeedbackPanel feedbackPanel = (FeedbackPanel) tester.getComponentFromLastRenderedPage("feedback"); tester.assertInfoMessages(new String[]{ "Methodcall called successfully" }); Label message = (Label) feedbackPanel.get("feedbackul:messages:0:message"); Assert.assertEquals("Methodcall called successfully", message.getDefaultModelObjectAsString()); } @Test public void testExceptionInFeedback_shouldShowFeedbackPanel() throws Exception { setupAndStartTestClientPage(); setServiceInDropDown("testdomain+testconnector+test-service"); setMethodInDropDown("update", String.class, String.class); formTester.setValue("argumentListContainer:argumentList:arg0panel:valueEditor:field", "fail"); formTester.setValue("argumentListContainer:argumentList:arg1panel:valueEditor:field", "test"); tester.executeAjaxEvent("methodCallForm:submitButton", "onclick"); assertTrue(tester.getMessages(FeedbackMessage.ERROR).get(0).toString().contains("IllegalArgumentException")); } @Test public void testSelectOtherService_shouldClearArgumentList() throws Exception { setupAndStartTestClientPage(); setServiceInDropDown("testdomain+testconnector+test-service"); setMethodInDropDown("update", String.class, String.class); setServiceInDropDown("testdomain+testconnector+test-service"); RepeatingView argList = (RepeatingView) tester .getComponentFromLastRenderedPage("methodCallForm:argumentListContainer:argumentList"); assertThat(argList.size(), is(0)); } private void setupTesterWithSpringMockContext() { tester.getApplication().getComponentInstantiationListeners() .add(new PaxWicketSpringBeanComponentInjector(tester.getApplication(), context)); } @Test public void testListToCreateNewServices_shouldShowNewServiceForm() throws Exception { setupAndStartTestClientPage(); tester.assertRenderedPage(TestClient.class); Label domainName = (Label) tester.getComponentFromLastRenderedPage("serviceManagementContainer:domains:1:domain.name"); Label domainDescription = (Label) tester .getComponentFromLastRenderedPage("serviceManagementContainer:domains:1:domain.description"); Label domainClass = (Label) tester.getComponentFromLastRenderedPage("serviceManagementContainer:domains:1:domain.class"); Label name = (Label) tester .getComponentFromLastRenderedPage( "serviceManagementContainer:domains:1:services:0:service.name"); Label description = (Label) tester.getComponentFromLastRenderedPage("serviceManagementContainer:domains:" + "1:services:0:service.description"); assertThat(domainName.getDefaultModel().getObject().toString(), equalTo("testdomain")); assertThat(domainDescription.getDefaultModel().getObject().toString(), equalTo("testdomain")); assertThat(domainClass.getDefaultModel().getObject().toString(), equalTo(TestInterface.class.getName())); Assert.assertEquals("service.name", name.getDefaultModel().getObject()); Assert.assertEquals("service.description", description.getDefaultModel().getObject()); } @Test public void testShowEditLink_shouldShowEditLink() throws Exception { List<ServiceReference> expected = setupAndStartTestClientPage(); if (!serviceListExpanded) { expandServiceListTree(); } for (int index = 2; index < expected.size() + 2; index++) { tester.assertComponent("methodCallForm:serviceList:i:" + index + ":nodeComponent:contentLink", AjaxLink.class); } tester.assertComponent("methodCallForm:editButton", AjaxButton.class); AjaxButton editButton = (AjaxButton) tester.getComponentFromLastRenderedPage("methodCallForm:editButton"); // should be disabled when nothing is selected Assert.assertEquals(false, editButton.isEnabled()); } @Test public void testShowDeleteLink_shouldShowDeleteLink() throws Exception { List<ServiceReference> expected = setupAndStartTestClientPage(); if (!serviceListExpanded) { expandServiceListTree(); } for (int index = 2; index < expected.size() + 2; index++) { tester.assertComponent("methodCallForm:serviceList:i:" + index + ":nodeComponent:contentLink", AjaxLink.class); } tester.assertComponent("methodCallForm:deleteButton", AjaxButton.class); AjaxButton deleteButton = (AjaxButton) tester.getComponentFromLastRenderedPage("methodCallForm:deleteButton"); // should be disabled when nothing is selected Assert.assertEquals(false, deleteButton.isEnabled()); } @Test public void testTargetLocationOfEditButton_shouldRedirectToEditorPage() throws Exception { setupAndStartTestClientPage(); ServiceReference ref = Mockito.mock(ServiceReference.class); Mockito.when(ref.getProperty("managerId")).thenReturn("ManagerId"); Mockito.when(ref.getProperty("domain")).thenReturn(TestInterface.class.getName()); when( bundleContext.getServiceReferences(Domain.class.getName(), String.format("(%s=%s)", org.osgi.framework.Constants.SERVICE_PID, "test"))) .thenReturn(new ServiceReference[]{ ref }); ServiceDescriptor serviceDescriptor = Mockito.mock(ServiceDescriptor.class); Mockito.when(serviceDescriptor.getId()).thenReturn("ManagerId"); Mockito.when(serviceDescriptor.getName()).thenReturn(new PassThroughLocalizableString("ServiceName")); Mockito.when(serviceDescriptor.getDescription()).thenReturn( new PassThroughLocalizableString("ServiceDescription")); if (!serviceListExpanded) { expandServiceListTree(); } tester.clickLink("methodCallForm:serviceList:i:5:nodeComponent:contentLink", true); AjaxButton editButton = (AjaxButton) tester.getComponentFromLastRenderedPage("methodCallForm:editButton"); Assert.assertEquals(true, editButton.isEnabled()); tester.executeAjaxEvent(editButton, "onclick"); tester.assertRenderedPage(ConnectorEditorPage.class); } @Test public void testFunctionDeleteButton_shouldDeleteService() throws Exception { setupAndStartTestClientPage(); ServiceReference ref = Mockito.mock(ServiceReference.class); Mockito.when(ref.getProperty("managerId")).thenReturn("ManagerId"); Mockito.when(ref.getProperty("domain")).thenReturn(TestInterface.class.getName()); when(bundleContext.getServiceReferences(Domain.class.getName(), String.format("(id=%s)", "test"))).thenReturn( new ServiceReference[]{ ref }); ServiceDescriptor serviceDescriptor = Mockito.mock(ServiceDescriptor.class); Mockito.when(serviceDescriptor.getId()).thenReturn("ManagerId"); Mockito.when(serviceDescriptor.getName()).thenReturn(new PassThroughLocalizableString("ServiceName")); Mockito.when(serviceDescriptor.getDescription()).thenReturn( new PassThroughLocalizableString("ServiceDescription")); if (!serviceListExpanded) { expandServiceListTree(); } tester.clickLink("methodCallForm:serviceList:i:5:nodeComponent:contentLink", true); AjaxButton deleteButton = (AjaxButton) tester.getComponentFromLastRenderedPage("methodCallForm:deleteButton"); Assert.assertEquals(true, deleteButton.isEnabled()); tester.executeAjaxEvent(deleteButton, "onclick"); try { tester.clickLink("methodCallForm:serviceList:i:5:nodeComponent:contentLink", true); } catch (AssertionFailedError e) { return; } fail("Deletion wasn't successful."); } @Test public void testStartWithContextAsParam_shouldHaveCorrectContext() throws Exception { setupTestClientPage(); ContextHolder.get().setCurrentContextId("foo2"); PageParameters pageParameters = new PageParameters(); pageParameters.set(OpenEngSBPage.CONTEXT_PARAM, new String[]{ "foo" }); tester.startPage(TestClient.class, pageParameters); assertThat(ContextHolder.get().getCurrentContextId(), is("foo")); } @Test public void testForEachDomainVisibleInCreatePartIsAnEntryInTree_shouldWork() throws Exception { setupAndStartTestClientPage(); tester.assertRenderedPage(TestClient.class); List<String> domains = new ArrayList<String>(); List<String> availableInTree = new ArrayList<String>(); List<DefaultMutableTreeNode> availableInTreeAsTreeNode = new ArrayList<DefaultMutableTreeNode>(); Component domainsComponent = tester.getComponentFromLastRenderedPage("serviceManagementContainer:domains"); int count = ((ArrayList<?>) domainsComponent.getDefaultModelObject()).size(); // get all domains for (int i = 0; i < count; i++) { Component label = tester .getComponentFromLastRenderedPage("serviceManagementContainer:domains:" + i + ":domain.name"); domains.add(label.getDefaultModelObjectAsString()); } // get all services from the tree DefaultTreeModel serviceListTree = (DefaultTreeModel) tester .getComponentFromLastRenderedPage("methodCallForm:serviceList").getDefaultModelObject(); count = serviceListTree.getChildCount(serviceListTree.getRoot()); for (int i = 0; i < count; i++) { DefaultMutableTreeNode child = (DefaultMutableTreeNode) serviceListTree.getChild(serviceListTree.getRoot(), i); String userObject = (String) child.getUserObject(); availableInTreeAsTreeNode.add(child); availableInTree.add(userObject); } for (int i = 0; i < domains.size(); i++) { String domain = domains.get(i); assertThat(availableInTree.contains(domain), is(true)); assertThat(serviceListTree.getChildCount(availableInTreeAsTreeNode.get(i)), greaterThan(0)); } } @Test public void testToSelectDefaultEndPoint_shouldDisplayDomainMethodWithArguments() throws Exception { setupAndStartTestClientPage(); tester.assertRenderedPage(TestClient.class); setServiceInDropDown("testdomain+testconnector+test-service"); setMethodInDropDown("update", String.class, String.class); RepeatingView argList = (RepeatingView) tester .getComponentFromLastRenderedPage("methodCallForm:argumentListContainer:argumentList"); Assert.assertEquals(2, argList.size()); } private void setServiceInDropDown(String serviceName) { if (!serviceListExpanded) { expandServiceListTree(); } tester.debugComponentTrees(); WebMarkupContainer component = (WebMarkupContainer) tester.getComponentFromLastRenderedPage("methodCallForm:serviceList:i"); for (int i = 0; i < component.size(); i++) { WebMarkupContainer component2 = (WebMarkupContainer) component.get(i); if (component2.getDefaultModelObjectAsString().startsWith(serviceName)) { tester.clickLink("methodCallForm:serviceList:i:" + i + ":nodeComponent:contentLink", true); tester.executeAjaxEvent("methodCallForm:serviceList:i:" + i + ":nodeComponent:contentLink", "onclick"); return; } } throw new IllegalArgumentException("Service with name " + serviceName + " not found in tree"); } private void setMethodInDropDown(String name, Class<?>... parameterTypes) { @SuppressWarnings("unchecked") List<? extends MethodId> choices = ((DropDownChoice<MethodId>) tester.getComponentFromLastRenderedPage("methodCallForm:methodList")) .getChoices(); for (int i = 0; i < choices.size(); i++) { MethodId methodId = choices.get(i); if (methodId.getName().equals(name) && ArrayUtils.isEquals(methodId.getArgumentTypes(), parameterTypes)) { formTester.select("methodList", i); tester.executeAjaxEvent("methodCallForm:methodList", "onchange"); return; } } throw new IllegalArgumentException(String.format("could not find method %s(%s) in dropdown (%s)", name, StringUtils.join(parameterTypes, ", "), choices)); } private List<ServiceReference> setupAndStartTestClientPage() throws Exception { setupTestClientPage(); final List<ServiceReference> expected = Arrays.asList(); tester.startPage(TestClient.class); formTester = tester.newFormTester("methodCallForm"); return expected; } private void setupTestClientPage() throws Exception { createProviderMocks(); Map<String, String> attributes = new HashMap<String, String>(); attributes.put("value", "42"); Hashtable<String, Object> properties = new Hashtable<String, Object>(); properties.put("location.root", "domain/testdomain/default"); serviceManager.createWithId("testdomain+testconnector+test-service", new ConnectorDescription("testdomain", "testconnector", attributes, properties)); ServiceDescriptor serviceDescriptorMock = Mockito.mock(ServiceDescriptor.class); Mockito.when(serviceDescriptorMock.getName()).thenReturn(new PassThroughLocalizableString("service.name")); Mockito.when(serviceDescriptorMock.getDescription()).thenReturn( new PassThroughLocalizableString("service.description")); doThrow(new IllegalArgumentException()).when(testService).update(eq("fail"), anyString()); setupTesterWithSpringMockContext(); } private void createProviderMocks() { createDomainProviderMock(TestInterface.class, "testdomain"); createDomainProviderMock(AnotherTestInterface.class, "anotherTestDomain"); createConnectorProviderMock("testconnector", "testdomain"); ConnectorInstanceFactory factory = mock(ConnectorInstanceFactory.class); when(factory.createNewInstance(anyString())).thenAnswer(new Answer<Connector>() { @Override public Connector answer(InvocationOnMock invocation) throws Throwable { TestInterface newMock = mock(TestInterface.class); testService = newMock; when(newMock.getInstanceId()).thenReturn((String) invocation.getArguments()[0]); return newMock; } }); when(factory.applyAttributes(any(Connector.class), anyMap())).thenAnswer(new Answer<Connector>() { @Override public Connector answer(InvocationOnMock invocation) throws Throwable { return (Connector) invocation.getArguments()[0]; } }); Dictionary<String, Object> props = new Hashtable<String, Object>(); props.put(Constants.DOMAIN_KEY, "testdomain"); props.put(Constants.CONNECTOR_KEY, "testconnector"); registerService(factory, props, ConnectorInstanceFactory.class); } private void setupIndexPage() { setupTesterWithSpringMockContext(); } }