/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF 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.apache.tuscany.sca.vtest.assembly.component; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import junit.framework.Assert; import org.apache.tuscany.sca.vtest.assembly.component.callback.MyClient; import org.apache.tuscany.sca.vtest.utilities.ServiceFinder; import org.junit.Test; import org.junit.Ignore; import org.osoa.sca.ServiceRuntimeException; /** * Test the basic functionalities of the component * */ public class ComponentBasicTestCase { private void initDomain(String compositePath) { System.out.println("Setting up"); ServiceFinder.init(compositePath); } private void cleanupDomain() { System.out.println("Cleaning up"); ServiceFinder.cleanup(); } /** * Lines 92-96: *

* Components are configured instances of implementations. Components * provide and consume services. More than one component can use and * configure the same implementation, where each component configures the * implementation differently. */ @Test public void components1() throws Exception { initDomain("component.composite"); AService service = ServiceFinder.getService(AService.class, "AComponent/AService"); Assert.assertEquals("some b component value", service.getBProperty()); Assert.assertEquals("some b2 component value", service.getB2Property()); cleanupDomain(); } /** * Lines 96-97: *

* There can be zero or more component elements within a composite. */ @Test public void components2() throws Exception { initDomain("zerocomponents.composite"); cleanupDomain(); } /** * Lines 142-143: *

* name (required) ?the name of the component. The name must be unique * across all the components in the composite. */ @Test(expected = ServiceRuntimeException.class) //@Ignore("TUSCANY-2455") public void components3() throws Exception { initDomain("nonuniquename.composite"); cleanupDomain(); } /** * Lines 154-158: *

* A component element has zero or one implementation element as its child, * which points to the implementation used by the component. A component * with no implementation element is not runnable, but components of this * kind may be useful during a "top-down" development process as a means of * defining the characteristics required of the implementation before the * implementation is written. */ @Test public void components4() throws Exception { initDomain("zeroimplelements.composite"); cleanupDomain(); } /** * Lines 159-160: *

* The component element can have zero or more service elements as children * which are used to configure the services of the component. */ @Test public void components5() throws Exception { initDomain("serviceelement.composite"); cleanupDomain(); } /** * Lines 174-179: *

* A service has zero or one interface, which describes the operations * provided by the service. The interface is described by an interface * element which is a child element of the service element. If no interface * is specified, then the interface specified for the service by the * implementation is in effect. If an interface is specified it must provide * a compatible subset of the interface provided by the implementation, i.e. * provide a subset of the operations defined by the implementation for the * service. */ @Test public void components6() throws Exception { initDomain("servicewithinterface.composite"); CService service = ServiceFinder.getService(CService.class, "CComponent"); Assert.assertEquals("Some State", service.getState()); cleanupDomain(); } /** * Lines 180-182: *

* A service element has one or more binding elements as children. If no * bindings are specified, then the bindings specified for the service by * the implementation are in effect. If bindings are specified, then those * bindings override the bindings specified by the implementation. */ @Test public void components7() throws Exception { initDomain("servicewithbinding.composite"); CService service = ServiceFinder.getService(CService.class, "CComponent"); Assert.assertEquals("Some State", service.getState()); cleanupDomain(); } /** * Lines 142-143: *

* OSOA: * the name of the component. The name must be unique across all the * components in the composite. *

* ASM50001 *

* OASIS: * the name of the component. The name must be unique across all * the components in the composite. * */ @Test(expected=ServiceRuntimeException.class) public void testComponentnameUnique() throws Exception { initDomain("nonuniquename.composite"); cleanupDomain(); } /** * Lines 1498-1499: *

* OSOA: * the name of the service, the name MUST BE unique across all the * composite services in the composite *

* ASM50002 *

* OASIS: * The @name attribute of a service element of a MUST be unique amongst * the service elements of that * */ @Test(expected=ServiceRuntimeException.class) public void testServicenameUnique() throws Exception { initDomain("nonuniqueservicenameincomposite.composite"); DService service = ServiceFinder.getService(DService.class, "CDComponent/CServiceImpl"); Assert.assertEquals("hello", service.sayHello()); cleanupDomain(); } /** *

* Not mentioned in OSOA *

* ASM50003 *

* OASIS * The @name attribute of a service element of a MUST match the * @name attribute of a service element of the componentType of the * child element of the component. *

* For the service name, OSOA says(1598-1500): * name (required) - the name of the service, the name MUST BE unique across all the * composite services in the composite. The name of the composite service can be different * from the name of the promoted component service. */ @Test(expected=ServiceRuntimeException.class) public void testServicenameNotmatch() throws Exception { initDomain("notmatchofservicename.composite"); DService service = ServiceFinder.getService(DService.class, "DComponent1/DService1"); Assert.assertEquals("hello", service.sayHello()); cleanupDomain(); } /** *

* Not mentioned in OSOA *

* ASM50003 *

* OASIS * The @name attribute of a service element of a MUST match the * @name attribute of a service element of the componentType of the * child element of the component. * */ public void testServicenameMatch() throws Exception { initDomain("notmatchofservicename.composite"); DService service = ServiceFinder.getService(DService.class, "DComponent1/DService"); Assert.assertEquals("hello", service.sayHello()); cleanupDomain(); } /** * Lines 177-178: *

* OSOA: * If an interface is specified it must provide a compatible subset of the * interface provided by the implementation *

* ASM50004 *

* OASIS: * If a element has an interface subelement specified, the interface MUST * provide a compatible subset of the interface declared on the componentType of the * implementation. */ @Test(expected=ServiceRuntimeException.class) public void testInterfaceCompatible() throws Exception { //for this case, if you remove the method3() in the EEService //the EEService will be a compatible subset of EService. initDomain("notcompatibleinterface.composite"); EEService service = ServiceFinder.getService(EEService.class, "EEComponent/EEService"); Assert.assertEquals("method1", service.method1()); cleanupDomain(); } /** * This method helps to check if the binding.ws is working. * if the http response contains the "wsdl:definitions", * we can regard it as a wsdl message, then the wsdlURL is valid. * @param wsdlURL * @return */ private boolean isValidWebService(String wsdlURL) { try { URL url = new URL(wsdlURL) ; URLConnection conn = url.openConnection() ; BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())) ; String lineStr ; while ((lineStr = reader.readLine()) != null) { if (lineStr.indexOf("wsdl:definitions") != -1 ) { return true ; } } } catch (Exception e) { e.printStackTrace() ; } return false ; } /** *

* No matched OSOA statements found *

* ASM50005 *

* OASIS: * If no binding elements are specified for the service, then the bindings specified for * the equivalent service in the componentType of the implementation MUST be used, * but if the componentType also has no bindings specified, then * MUST be used as the binding. If binding elements are specified for the service, then * those bindings MUST be used and they override any bindings specified for the * equivalent service in the componentType of the implementation. */ @Test // @Ignore("broken, see TUSCANY-2946") public void testServiceBinding() throws Exception { initDomain("binding_resolution.composite"); FService service ; //test no binding in component service = ServiceFinder.getService(FService.class, "FComponent/FService1"); Assert.assertEquals("hello", service.sayHello()); Assert.assertEquals(true , isValidWebService("http://localhost:8085/FService1?wsdl")) ; //test no binding in componentType service = ServiceFinder.getService(FService.class, "FComponent/FService2"); Assert.assertEquals("hello", service.sayHello()); //test binding overriding service = ServiceFinder.getService(FService.class, "FComponent/FService3"); Assert.assertEquals("hello", service.sayHello()); Assert.assertEquals(true , isValidWebService("http://localhost:8085/FService3?wsdl")) ; cleanupDomain(); } /** * Line 1526-1529: *

* OSOA: * A service element has an optional callback element used if the interface * has a callback defined, which has one or more binding elements as children. * The callback and its binding child elements are specified if there is a need * to have binding details used to handle callbacks. If the callback element is not present, * the behaviour is runtime implementation dependent. *

* ASM50006 *

* If the callback element is present and contains one or more binding * child elements,then those bindings MUST be used for the callback. * */ @Test public void testCallbackBindings() throws Exception{ initDomain("callback_bindings.composite"); MyClient client = ServiceFinder.getService(MyClient.class, "MyServiceClientComponent/MyClient"); client.callService() ; cleanupDomain(); } }