| /* |
| * 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.test.corba; |
| |
| import static org.junit.Assert.assertTrue; |
| import static org.junit.Assert.fail; |
| import junit.framework.Assert; |
| |
| import org.apache.tuscany.sca.host.corba.jse.DefaultCorbaHost; |
| import org.apache.tuscany.sca.host.corba.naming.TransientNameServer; |
| import org.apache.tuscany.sca.host.corba.naming.TransientNameService; |
| import org.apache.tuscany.sca.node.Node; |
| import org.apache.tuscany.sca.node.NodeFactory; |
| import org.apache.tuscany.sca.test.corba.generated.Color; |
| import org.apache.tuscany.sca.test.corba.generated.InnerStruct; |
| import org.apache.tuscany.sca.test.corba.generated.RichStruct; |
| import org.apache.tuscany.sca.test.corba.generated.ScenarioOne; |
| import org.apache.tuscany.sca.test.corba.generated.ScenarioOneHelper; |
| import org.apache.tuscany.sca.test.corba.generated.ScenarioOneOperations; |
| import org.apache.tuscany.sca.test.corba.generated.UnexpectedException; |
| import org.apache.tuscany.sca.test.corba.generated.WrongColor; |
| import org.apache.tuscany.sca.test.corba.types.ScenarioOneServant; |
| import org.apache.tuscany.sca.test.corba.types.TColor; |
| import org.apache.tuscany.sca.test.corba.types.TInnerStruct; |
| import org.apache.tuscany.sca.test.corba.types.TRichStruct; |
| import org.apache.tuscany.sca.test.corba.types.TScenarioOne; |
| import org.junit.AfterClass; |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| import org.omg.CORBA.ORB; |
| import org.omg.CosNaming.NameComponent; |
| import org.omg.CosNaming.NamingContext; |
| import org.omg.CosNaming.NamingContextHelper; |
| |
| /** |
| * @version $Rev$ $Date$ |
| * This test class contains three main tests:<br> |
| * 1. Tuscany is being used as a consumer of some non-Tuscany CORBA service<br> |
| * 2. Tuscany is being used as a service provider, which will be consumed by |
| * non-Tuscany CORBA client<br> |
| * 3. Tuscany is being used as a service provider, which will be consumed by |
| * Tuscany client<br> |
| * But that's not all, there are some other variations. Tuscany CORBA binding |
| * supports using Java interface generated by IDLJ, also it supports interfaces |
| * provided by user - I combined those cases in each test.<br> |
| */ |
| public class ScenarioOneTestCase { |
| |
| // note that those values are also used in resources/*.composite file |
| private static int ORB_INITIAL_PORT = 5060; |
| private static String SERVICE_NAME = "ScenarioOne"; |
| |
| private static Node node; |
| |
| private static TransientNameServer server; |
| private static ORB orb; |
| |
| /** |
| * Sets up name service, creates and registers traditional CORBA service, |
| * obtains SCADomain |
| */ |
| @BeforeClass |
| public static void setUp() { |
| TestCorbaHost.setCorbaHost(new DefaultCorbaHost()); |
| try { |
| try { |
| server = |
| new TransientNameServer("localhost", ORB_INITIAL_PORT, TransientNameService.DEFAULT_SERVICE_NAME); |
| Thread t = server.start(); |
| if (t == null) { |
| Assert.fail("The naming server cannot be started"); |
| } |
| orb = server.getORB(); |
| } catch (Throwable e) { |
| e.printStackTrace(); |
| Assert.fail(e.getMessage()); |
| } |
| org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); |
| NamingContext ncRef = NamingContextHelper.narrow(objRef); |
| NameComponent nc = new NameComponent(SERVICE_NAME, ""); |
| NameComponent path[] = {nc}; |
| ScenarioOne scenarioOne = new ScenarioOneServant(); |
| ncRef.rebind(path, scenarioOne); |
| // obtain node |
| node = NodeFactory.getInstance().createNode("ScenarioOne.composite", TestCorbaHost.class.getClassLoader()).start(); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| /** |
| * Kills previously spawned name service. |
| */ |
| @AfterClass |
| public static void tearDown() { |
| server.stop(); |
| node.stop(); |
| } |
| |
| /** |
| * Creates nicely filled structure for user provided interface. |
| * |
| * @return |
| */ |
| private static TRichStruct getTRichStruct() { |
| int[][] intArr = new int[][] { {1, 2}, {3, 4}}; |
| TInnerStruct innerStruct = new TInnerStruct(intArr, "Test", TColor.green); |
| String[] strSeq = {"i", "Test"}; |
| return new TRichStruct(innerStruct, strSeq, 1); |
| |
| } |
| |
| /** |
| * Creates nicely filled structure for generated interface. |
| * |
| * @return |
| */ |
| private static RichStruct getRichStruct() { |
| int[][] intArr = new int[][] { {1, 2}, {3, 4}}; |
| InnerStruct innerStruct2 = new InnerStruct(intArr, "Test", Color.green); |
| String[] strSeq = {"i", "Test"}; |
| return new RichStruct(innerStruct2, strSeq, 1); |
| } |
| |
| /** |
| * Compares String arrays |
| * |
| * @param arg1 |
| * @param arg2 |
| * @return |
| */ |
| private boolean areSrringArraysEqual(String[] arg1, String[] arg2) { |
| try { |
| for (int i = 0; i < arg1.length; i++) { |
| if (!arg1[i].equals(arg2[i])) { |
| return false; |
| } |
| } |
| } catch (Exception e) { |
| return false; |
| } |
| return true; |
| } |
| |
| /** |
| * Compares two dimensional int arrays |
| * |
| * @param arg1 |
| * @param arg2 |
| * @return |
| */ |
| private boolean areTwoDimIntArraysEqual(int[][] arg1, int[][] arg2) { |
| try { |
| for (int i = 0; i < arg1.length; i++) { |
| for (int j = 0; j < arg1[i].length; j++) { |
| if (arg1[i][j] != arg2[i][j]) { |
| return false; |
| } |
| } |
| } |
| } catch (Exception e) { |
| return false; |
| } |
| return true; |
| } |
| |
| private boolean equalTo(TInnerStruct arg1, TInnerStruct arg2) { |
| return (arg1.color.value() == arg2.color.value() && arg1.stringField.equals(arg2.stringField) && areTwoDimIntArraysEqual(arg1.twoDimLongSequence, |
| arg2.twoDimLongSequence)); |
| } |
| |
| private boolean equalTo(InnerStruct arg1, InnerStruct arg2) { |
| return (arg1.color.value() == arg2.color.value() && arg1.stringField.equals(arg2.stringField) && areTwoDimIntArraysEqual(arg1.twoDimLongSequence, |
| arg2.twoDimLongSequence)); |
| } |
| |
| private boolean equalTo(TRichStruct arg1, TRichStruct arg2) { |
| return (equalTo(arg1.innerStruct, arg2.innerStruct) && arg2.longField == arg1.longField && areSrringArraysEqual(arg1.stringSequence, |
| arg2.stringSequence)); |
| } |
| |
| private boolean equalTo(RichStruct arg1, RichStruct arg2) { |
| return (equalTo(arg1.innerStruct, arg2.innerStruct) && arg2.longField == arg1.longField && areSrringArraysEqual(arg1.stringSequence, |
| arg2.stringSequence)); |
| } |
| |
| /** |
| * Helper method used several times for various components. Executes several |
| * tests using Tuscany reference binding. This helper uses generated Java |
| * interface. |
| * |
| * @param componentName |
| */ |
| private void testClientUsingGeneratedInterface(String componentName) { |
| ScenarioOneOperations component = node.getService(ScenarioOneOperations.class, componentName); |
| RichStruct richStruct = getRichStruct(); |
| |
| try { |
| RichStruct result = component.setRichStruct(richStruct); |
| assertTrue(equalTo(result, richStruct)); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| fail(); |
| } |
| |
| try { |
| richStruct.longField = 0; |
| component.setRichStruct(richStruct); |
| fail(); |
| } catch (Exception e) { |
| assertTrue(e instanceof UnexpectedException); |
| } |
| |
| try { |
| richStruct.longField = 1; |
| richStruct.innerStruct.color = Color.red; |
| component.setRichStruct(richStruct); |
| } catch (Exception e) { |
| assertTrue(e instanceof WrongColor); |
| } |
| } |
| |
| /** |
| * Helper method used several times for various components. Executes several |
| * tests using Tuscany reference binding. This helper uses user provided |
| * Java interface. |
| * |
| * @param componentName |
| */ |
| private void testClientUsingUserProvidedInterface(String componentName) { |
| TScenarioOne component = node.getService(TScenarioOne.class, componentName); |
| TRichStruct tRichStruct = getTRichStruct(); |
| |
| try { |
| TRichStruct result = component.setRichStruct(tRichStruct); |
| assertTrue(equalTo(result, tRichStruct)); |
| } catch (Exception e) { |
| fail(); |
| } |
| |
| try { |
| tRichStruct.longField = 0; |
| component.setRichStruct(tRichStruct); |
| fail(); |
| } catch (Exception e) { |
| assertTrue(e instanceof UnexpectedException); |
| } |
| |
| try { |
| tRichStruct.longField = 1; |
| tRichStruct.innerStruct.color = TColor.red; |
| component.setRichStruct(tRichStruct); |
| } catch (Exception e) { |
| assertTrue(e instanceof WrongColor); |
| } |
| } |
| |
| public void testServiceUsingGeneratedClient(String serviceName) { |
| try { |
| org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); |
| NamingContext ncRef = NamingContextHelper.narrow(objRef); |
| NameComponent nc = new NameComponent(serviceName, ""); |
| NameComponent path[] = {nc}; |
| ScenarioOne so = ScenarioOneHelper.narrow(ncRef.resolve(path)); |
| |
| RichStruct richStruct = getRichStruct(); |
| RichStruct result = so.setRichStruct(richStruct); |
| assertTrue(equalTo(result, richStruct)); |
| |
| try { |
| richStruct.innerStruct.color = Color.red; |
| result = so.setRichStruct(richStruct); |
| fail(); |
| } catch (Exception e) { |
| assertTrue(e instanceof WrongColor); |
| } |
| |
| try { |
| richStruct.innerStruct.color = Color.green; |
| richStruct.longField = 0; |
| result = so.setRichStruct(richStruct); |
| fail(); |
| } catch (Exception e) { |
| assertTrue(e instanceof UnexpectedException); |
| } |
| |
| } catch (Exception e) { |
| e.printStackTrace(); |
| fail(); |
| } |
| } |
| |
| /** |
| * Service is exposed in traditional way (using CORBA API from JDK). |
| * Reference is obtained from Tuscany. |
| */ |
| @Test |
| public void test_TraditionalService_TuscanyClient() { |
| |
| // Client is using user provided interface |
| testClientUsingUserProvidedInterface("ScenarioOne"); |
| |
| // Client is using generated interface |
| testClientUsingGeneratedInterface("ScenarioOneGenerated"); |
| } |
| |
| /** |
| * Service is exposed by Tuscany. Reference is obtained in traditional way. |
| * (using CORBA API from JDK) |
| * |
| * @throws Exception |
| */ |
| @Test |
| public void test_TuscanyService_TraditionalClient() throws Exception { |
| |
| // tests service which uses user provided interface |
| testServiceUsingGeneratedClient("ScenarioOneTuscany"); |
| |
| // tests service which uses generated interface |
| testServiceUsingGeneratedClient("ScenarioOneTuscanyGenerated"); |
| } |
| |
| /** |
| * Service is exposed by Tuscany. Reference is obtained from Tuscany. There |
| * are 4 combinations (basing on if we are using generated or user provided |
| * interfaces, both on service and reference side). |
| */ |
| @Test |
| public void test_TuscanyService_TuscanyClient() { |
| |
| // Client is using user provided interface, service is using user |
| // provided interface. |
| testClientUsingUserProvidedInterface("TU2TS1"); |
| |
| // Client is using user provided interface, service is using generated |
| // interface. |
| testClientUsingUserProvidedInterface("TU2TS2"); |
| |
| // Client is using generated interface, service is using user provided |
| // interface. |
| testClientUsingGeneratedInterface("TG2TS1"); |
| |
| // Client is using generated interface, service is using generated |
| // interface. |
| testClientUsingGeneratedInterface("TG2TS2"); |
| } |
| |
| /** |
| * Tests using reference obtained by corbaname URI |
| */ |
| @Test |
| public void test_serviceAndReferenceByURI() { |
| testClientUsingUserProvidedInterface("UriBinding"); |
| } |
| |
| } |