/** * 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.cxf.javascript; import java.io.File; import java.net.URL; import java.util.logging.Logger; import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.javascript.JavascriptTestUtilities.JSRunnable; import org.apache.cxf.javascript.JavascriptTestUtilities.Notifier; import org.apache.cxf.javascript.fortest.SimpleDocLitWrappedImpl; import org.apache.cxf.javascript.fortest.TestBean1; import org.apache.cxf.javascript.fortest.TestBean2; import org.apache.cxf.testutil.common.TestUtil; import org.junit.Before; import org.junit.Test; import org.mozilla.javascript.Context; import org.mozilla.javascript.Scriptable; import org.springframework.context.support.GenericApplicationContext; public class DocLitWrappedClientTest extends JavascriptRhinoTest { private static final Logger LOG = LogUtils.getL7dLogger(DocLitWrappedClientTest.class); public DocLitWrappedClientTest() throws Exception { super(); } public String getStaticResourceURL() throws Exception { File staticFile = new File(this.getClass().getResource("test.html").toURI()); staticFile = staticFile.getParentFile(); staticFile = staticFile.getAbsoluteFile(); URL furl = staticFile.toURI().toURL(); return furl.toString(); } @Before public void before() throws Exception { setupRhino("dlw-service-endpoint", "/org/apache/cxf/javascript/DocLitWrappedTests.js", Boolean.TRUE); } @Override protected void additionalSpringConfiguration(GenericApplicationContext context) throws Exception { } @Override protected String[] getConfigLocations() { TestUtil.getNewPortNumber("TestPort"); return new String[] {"classpath:DocLitWrappedClientTestBeans.xml"}; } private Void beanFunctionCaller(Context context, boolean useWrapper) { TestBean1 b1 = new TestBean1(); b1.stringItem = "strung"; TestBean1[] beans = new TestBean1[3]; beans[0] = new TestBean1(); beans[0].beanTwoNotRequiredItem = new TestBean2("bean2"); if (useWrapper) { beans[1] = null; } else { // without a wrapper, it can't be null, so put something in there. beans[1] = new TestBean1(); } beans[2] = new TestBean1(); beans[2].optionalIntArrayItem = new int[2]; beans[2].optionalIntArrayItem[0] = 4; beans[2].optionalIntArrayItem[1] = 6; Object[] jsBeans = new Object[3]; jsBeans[0] = testBean1ToJS(testUtilities, context, beans[0]); jsBeans[1] = testBean1ToJS(testUtilities, context, beans[1]); jsBeans[2] = testBean1ToJS(testUtilities, context, beans[2]); Scriptable jsBean1 = testBean1ToJS(testUtilities, context, b1); Scriptable jsBeanArray = context.newArray(testUtilities.getRhinoScope(), jsBeans); LOG.info("About to call test4 " + getAddress()); Notifier notifier = testUtilities.rhinoCallConvert("test4", Notifier.class, testUtilities.javaToJS(getAddress()), testUtilities.javaToJS(Boolean.valueOf(useWrapper)), jsBean1, jsBeanArray); boolean notified = notifier.waitForJavascript(1000 * 10); assertTrue(notified); Integer errorStatus = testUtilities.rhinoEvaluateConvert("globalErrorStatus", Integer.class); assertNull(errorStatus); String errorText = testUtilities.rhinoEvaluateConvert("globalErrorStatusText", String.class); assertNull(errorText); // This method returns void, which translated into a Javascript object with no properties. // really. Void. Object responseObject = testUtilities.rhinoEvaluate("globalResponseObject"); assertNotNull(responseObject); assertEquals(Context.getUndefinedValue(), responseObject); SimpleDocLitWrappedImpl impl = (SimpleDocLitWrappedImpl)rawImplementor; TestBean1 b1returned = impl.getLastBean1(); assertEquals(b1, b1returned); TestBean1[] beansReturned = impl.getLastBean1Array(); assertArrayEquals(beans, beansReturned); return null; } @Test public void callFunctionWithBeans() { LOG.info("about to call test4/beanFunction"); testUtilities.runInsideContext(Void.class, new JSRunnable<Void>() { public Void run(Context context) { return beanFunctionCaller(context, false); } }); } @Test public void callFunctionWithBeansWrapped() { LOG.info("about to call test4/beanFunction"); testUtilities.runInsideContext(Void.class, new JSRunnable<Void>() { public Void run(Context context) { return beanFunctionCaller(context, true); } }); } @Test public void callFunctionWithHeader() { testUtilities.runInsideContext(Void.class, new JSRunnable<Void>() { public Void run(Context context) { LOG.info("About to call testDummyHeader " + getAddress()); Notifier notifier = testUtilities.rhinoCallConvert("testDummyHeader", Notifier.class, testUtilities.javaToJS(getAddress()), testUtilities.javaToJS("narcissus"), null); boolean notified = notifier.waitForJavascript(1000 * 10); assertTrue(notified); Integer errorStatus = testUtilities.rhinoEvaluateConvert("globalErrorStatus", Integer.class); assertNull(errorStatus); String errorText = testUtilities.rhinoEvaluateConvert("globalErrorStatusText", String.class); assertNull(errorText); Scriptable responseObject = (Scriptable)testUtilities.rhinoEvaluate("globalResponseObject"); assertNotNull(responseObject); // by default, for doc/lit/wrapped, we end up with a part object with a slot named // 'return'. String returnValue = testUtilities.rhinoCallMethodInContext(String.class, responseObject, "getReturn"); assertEquals("narcissus", returnValue); return null; } }); } @Test public void callIntReturnMethod() { testUtilities.runInsideContext(Void.class, new JSRunnable<Void>() { public Void run(Context context) { LOG.info("About to call test3/IntFunction" + getAddress()); Notifier notifier = testUtilities.rhinoCallConvert("test3", Notifier.class, testUtilities.javaToJS(getAddress()), testUtilities.javaToJS(Double.valueOf(17.0)), testUtilities.javaToJS(Float.valueOf((float)111.0)), testUtilities.javaToJS(Integer.valueOf(142)), testUtilities.javaToJS(Long.valueOf(1240000)), null); boolean notified = notifier.waitForJavascript(1000 * 10); assertTrue(notified); Integer errorStatus = testUtilities.rhinoEvaluateConvert("globalErrorStatus", Integer.class); assertNull(errorStatus); String errorText = testUtilities.rhinoEvaluateConvert("globalErrorStatusText", String.class); assertNull(errorText); Scriptable responseObject = (Scriptable)testUtilities.rhinoEvaluate("globalResponseObject"); assertNotNull(responseObject); // by default, for doc/lit/wrapped, we end up with a part object with a slot named // 'return'. int returnValue = testUtilities.rhinoCallMethodInContext(Integer.class, responseObject, "getReturn"); assertEquals(42, returnValue); return null; // well, null AND void. } }); } @Test public void callMethodWithoutWrappers() { testUtilities.runInsideContext(Void.class, new JSRunnable<Void>() { public Void run(Context context) { LOG.info("About to call test2 " + getAddress()); Notifier notifier = testUtilities.rhinoCallConvert("test2", Notifier.class, testUtilities.javaToJS(getAddress()), testUtilities.javaToJS(Double.valueOf(17.0)), testUtilities.javaToJS(Float.valueOf((float)111.0)), testUtilities.javaToJS(Integer.valueOf(142)), testUtilities.javaToJS(Long.valueOf(1240000)), "This is the cereal shot from gnus"); boolean notified = notifier.waitForJavascript(1000 * 10); assertTrue(notified); Integer errorStatus = testUtilities.rhinoEvaluateConvert("globalErrorStatus", Integer.class); assertNull(errorStatus); String errorText = testUtilities.rhinoEvaluateConvert("globalErrorStatusText", String.class); assertNull(errorText); Scriptable responseObject = (Scriptable)testUtilities.rhinoEvaluate("globalResponseObject"); assertNotNull(responseObject); // by default, for doc/lit/wrapped, we end up with a part object with a slot named // 'return'. String returnString = testUtilities.rhinoCallMethodInContext(String.class, responseObject, "getReturn"); assertEquals("cetaceans", returnString); return null; // well, null AND void. } }); } @Test public void callMethodWithWrappers() { testUtilities.runInsideContext(Void.class, new JSRunnable<Void>() { public Void run(Context context) { LOG.info("About to call test1 " + getAddress()); Notifier notifier = testUtilities.rhinoCallConvert("test1", Notifier.class, testUtilities .javaToJS(getAddress()), testUtilities.javaToJS(Double.valueOf(7.0)), testUtilities.javaToJS(Float .valueOf((float)11.0)), testUtilities .javaToJS(Integer.valueOf(42)), testUtilities.javaToJS(Long .valueOf(240000)), "This is the cereal shot from guns"); boolean notified = notifier.waitForJavascript(1000 * 10); assertTrue(notified); Integer errorStatus = testUtilities.rhinoEvaluateConvert("globalErrorStatus", Integer.class); assertNull(errorStatus); String errorText = testUtilities.rhinoEvaluateConvert("globalErrorStatusText", String.class); assertNull(errorText); Scriptable responseObject = (Scriptable)testUtilities.rhinoEvaluate("globalResponseObject"); assertNotNull(responseObject); String returnString = testUtilities.rhinoCallMethodInContext(String.class, responseObject, "getReturnValue"); assertEquals("eels", returnString); return null; } }); } @Test public void inheritedProperties() { testUtilities.runInsideContext(Void.class, new JSRunnable<Void>() { public Void run(Context context) { Notifier notifier = testUtilities.rhinoCallConvert("testInheritance", Notifier.class, testUtilities.javaToJS(getAddress())); boolean notified = notifier.waitForJavascript(1000 * 10); assertTrue(notified); SimpleDocLitWrappedImpl impl = (SimpleDocLitWrappedImpl)rawImplementor; assertEquals("less", impl.getLastInheritanceTestDerived().getName()); return null; } }); } @Test public void callTest2WithNullString() { testUtilities.runInsideContext(Void.class, new JSRunnable<Void>() { public Void run(Context context) { LOG.info("About to call test2 with null string " + getAddress()); Notifier notifier = testUtilities.rhinoCallConvert("test2", Notifier.class, testUtilities.javaToJS(getAddress()), testUtilities.javaToJS(Double.valueOf(17.0)), testUtilities.javaToJS(Float.valueOf((float)111.0)), testUtilities.javaToJS(Integer.valueOf(142)), testUtilities.javaToJS(Long.valueOf(1240000)), null); boolean notified = notifier.waitForJavascript(1000 * 10); assertTrue(notified); Integer errorStatus = testUtilities.rhinoEvaluateConvert("globalErrorStatus", Integer.class); assertNull(errorStatus); String errorText = testUtilities.rhinoEvaluateConvert("globalErrorStatusText", String.class); assertNull(errorText); Scriptable responseObject = (Scriptable)testUtilities.rhinoEvaluate("globalResponseObject"); assertNotNull(responseObject); // by default, for doc/lit/wrapped, we end up with a part object with a slot named // 'return'. String returnString = testUtilities.rhinoCallMethodInContext(String.class, responseObject, "getReturn"); assertEquals("cetaceans", returnString); return null; // well, null AND void. } }); } public static Scriptable testBean1ToJS(JavascriptTestUtilities testUtilities, Context context, TestBean1 b1) { if (b1 == null) { return null; // black is always in fashion. (Really, we can be called with a null). } Scriptable rv = context.newObject(testUtilities.getRhinoScope(), "org_apache_cxf_javascript_testns_testBean1"); testUtilities.rhinoCallMethod(rv, "setStringItem", testUtilities.javaToJS(b1.stringItem)); testUtilities.rhinoCallMethod(rv, "setIntItem", testUtilities.javaToJS(b1.intItem)); testUtilities.rhinoCallMethod(rv, "setLongItem", testUtilities.javaToJS(b1.longItem)); testUtilities.rhinoCallMethod(rv, "setBase64Item", testUtilities.javaToJS(b1.base64Item)); testUtilities.rhinoCallMethod(rv, "setOptionalIntItem", testUtilities.javaToJS(b1.optionalIntItem)); testUtilities.rhinoCallMethod(rv, "setOptionalIntArrayItem", testUtilities.javaToJS(b1.optionalIntArrayItem)); testUtilities.rhinoCallMethod(rv, "setDoubleItem", testUtilities.javaToJS(b1.doubleItem)); testUtilities.rhinoCallMethod(rv, "setBeanTwoItem", testBean2ToJS(testUtilities, context, b1.beanTwoItem)); testUtilities.rhinoCallMethod(rv, "setBeanTwoNotRequiredItem", testBean2ToJS(testUtilities, context, b1.beanTwoNotRequiredItem)); return rv; } public static Object testBean2ToJS(JavascriptTestUtilities testUtilities, Context context, TestBean2 beanTwoItem) { if (beanTwoItem == null) { return null; } Scriptable rv = context.newObject(testUtilities.getRhinoScope(), "org_apache_cxf_javascript_testns3_testBean2"); testUtilities.rhinoCallMethod(rv, "setStringItem", beanTwoItem.stringItem); return rv; } }