/* * Copyright 2005 Joe Walker * * Licensed 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.directwebremoting.impl; import java.lang.reflect.Method; import java.util.ArrayList; import org.directwebremoting.AjaxFilter; import org.directwebremoting.AjaxFilterChain; import org.directwebremoting.create.NewCreator; import org.directwebremoting.extend.AccessControl; import org.directwebremoting.extend.AjaxFilterManager; import org.directwebremoting.extend.ConverterManager; import org.directwebremoting.extend.CreatorManager; import org.directwebremoting.extend.NonNestedOutboundVariable; import org.directwebremoting.extend.OutboundContext; import org.directwebremoting.impl.test.TestCreatedObject; import org.directwebremoting.util.FakeHttpServletRequest; import org.directwebremoting.util.FakeHttpServletResponse; import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; /** * @author Joe Walker [joe at getahead dot ltd dot uk] */ public class DefaultRemoterTest { private final DefaultRemoter defaultRemoter = new DefaultRemoter(); private CreatorManager creatorManager; private AccessControl accessControl; private ConverterManager converterManager; private AjaxFilterManager ajaxFilterManager; private FakeHttpServletRequest request; @Before public void setUp() throws Exception { creatorManager = createMock(CreatorManager.class); defaultRemoter.setCreatorManager(creatorManager); accessControl = createMock(AccessControl.class); defaultRemoter.setAccessControl(accessControl); ajaxFilterManager = createMock(AjaxFilterManager.class); defaultRemoter.setAjaxFilterManager(ajaxFilterManager); request = new FakeHttpServletRequest(); } /** * @throws Exception */ public void testHandle() throws Exception { request.setPathInfo("/exec/dataManager.doTest"); request.setMethod("POST"); request.setContent(("callCount=2\n" + "c0-id=1\nc0-scriptName=creatorName\nc0-methodName=toString\n" + "c1-id=2\nc1-scriptName=creatorName\nc1-methodName=hashCode").getBytes()); creatorManager.getCreator("creatorName", false); NewCreator creator = new NewCreator(); creator.setClass(TestCreatedObject.class.getName()); expectLastCall().andReturn(creator).times(4); accessControl.assertExecutionIsPossible(eq(creator), eq("creatorName"), isA(Method.class)); expectLastCall().andReturn(null).times(2); expect(converterManager.convertOutbound(isA(Object.class), isA(OutboundContext.class))); expectLastCall().andReturn(new NonNestedOutboundVariable("")).times(2); // TODO: this should not be necessary! ArrayList<AjaxFilter> filters = new ArrayList<AjaxFilter>(); filters.add(new AjaxFilter() { public Object doFilter(Object obj, Method method, Object[] params, AjaxFilterChain chain) throws Exception { return new Object(); } }); filters.add(new AjaxFilter() { public Object doFilter(Object obj, Method method, Object[] params, AjaxFilterChain chain) throws Exception { return new Object(); } }); expect(ajaxFilterManager.getAjaxFilters("creatorName")).andReturn(filters).atLeastOnce(); replay(creatorManager); replay(accessControl); replay(converterManager); replay(ajaxFilterManager); DefaultWebContextBuilder builder = new DefaultWebContextBuilder(); builder.engageThread(null, request, null); //TestWebContextFactory.setWebContextBuilder(builder); FakeHttpServletResponse response = new FakeHttpServletResponse(); //Calls calls = marshaller.marshallInbound(request, response); //Replies replies = defaultRemoter.execute(calls); //marshaller.marshallOutbound(replies, request, response); String result = response.getContentAsString(); verify(creatorManager); verify(accessControl); verify(converterManager); verify(ajaxFilterManager); assertNotNull(result); assertNotSame(result.indexOf("<script type='text/javascript'>"), -1); assertNotSame(result.indexOf("window.parent.DWREngine._handleResponse('1',"), -1); assertNotSame(result.indexOf("window.parent.DWREngine._handleResponse('2',"), -1); assertNotSame(result.indexOf("</script>"), -1); } @Ignore @Test public void handle2() throws Exception { request.setPathInfo("/interface/creatorName.js"); creatorManager.getCreator("creatorName", false); NewCreator creator = new NewCreator(); creator.setClass(TestCreatedObject.class.getName()); expectLastCall().andReturn(creator); // expect 9 method calls to 'getReasonToNotDisplay' for each method on Object accessControl.assertIsDisplayable(creator, "creatorName", isA(Method.class)); expectLastCall().andReturn(null).times(11); replay(creatorManager); replay(accessControl); String result = defaultRemoter.generateInterfaceScript("creatorName", true, "/path"); verify(creatorManager); verify(accessControl); // check the response Assert.assertNotSame(result.indexOf("function creatorName() { }"), -1); Assert.assertNotSame(result.indexOf("creatorName.hashCode = function("), -1); Assert.assertNotSame(result.indexOf("creatorName.getClass = function("), -1); Assert.assertNotSame(result.indexOf("creatorName.wait = function("), -1); Assert.assertNotSame(result.indexOf("creatorName.wait = function("), -1); Assert.assertNotSame(result.indexOf("creatorName.wait = function("), -1); Assert.assertNotSame(result.indexOf("creatorName.equals = function("), -1); Assert.assertNotSame(result.indexOf("creatorName.notify = function("), -1); Assert.assertNotSame(result.indexOf("creatorName.notifyAll = function("), -1); Assert.assertNotSame(result.indexOf("creatorName.toString = function("), -1); Assert.assertNotSame(result.indexOf("creatorName.testMethodWithServletParameters = function("), -1); // make sure no entry is generated for the reserved javascript word 'namespace' Assert.assertSame(result.indexOf("creatorName.namespace = function("), -1); } @Ignore @Test public void handleWithoutInterface() throws Exception { request.setMethod("GET"); creatorManager.getCreator("", false); expectLastCall().andThrow(new SecurityException()); replay(creatorManager); replay(accessControl); verify(creatorManager); verify(accessControl); } @Ignore @Test public void handleWithReasonsNotToDisplay() throws Exception { request.setMethod("GET"); // make sure not to allow an impossible test defaultRemoter.setAllowImpossibleTests(false); request.setPathInfo("/interface/creatorName.js"); creatorManager.getCreator("creatorName", false); NewCreator creator = new NewCreator(); creator.setClass(TestCreatedObject.class.getName()); expectLastCall().andReturn(creator); // expect 9 method calls to 'getReasonToNotDisplay' for each method on Object accessControl.assertIsDisplayable(eq(creator), eq("creatorName"), isA(Method.class)); expectLastCall().andReturn("myReason").times(11); replay(creatorManager); replay(accessControl); FakeHttpServletResponse response = new FakeHttpServletResponse(); //Calls calls = marshaller.marshallInbound(request, response); //Replies replies = defaultRemoter.execute(calls); //marshaller.marshallOutbound(replies, request, response); verify(creatorManager); verify(accessControl); // check the response String result = response.getContentAsString(); Assert.assertNotSame(result.indexOf("function creatorName() { }"), -1); Assert.assertSame(result.indexOf("creatorName.hashCode = function(callback)"), -1); Assert.assertSame(result.indexOf("creatorName.getClass = function(callback)"), -1); Assert.assertSame(result.indexOf("creatorName.wait = function(callback)"), -1); Assert.assertSame(result.indexOf("creatorName.wait = function(p0, p1, callback)"), -1); Assert.assertSame(result.indexOf("creatorName.wait = function(p0, callback)"), -1); Assert.assertSame(result.indexOf("creatorName.equals = function(p0, callback)"), -1); Assert.assertSame(result.indexOf("creatorName.notify = function(callback)"), -1); Assert.assertSame(result.indexOf("creatorName.notifyAll = function(callback)"), -1); Assert.assertSame(result.indexOf("creatorName.toString = function(callback)"), -1); Assert.assertSame(result.indexOf("creatorName.testMethodWithServletParameters = function(callback)"), -1); Assert.assertSame(result.indexOf("creatorName.namespace = function(callback)"), -1); } }