/* * 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.wink.server.internal.log; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.net.URI; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.UriInfo; import org.apache.wink.common.internal.MultivaluedMapImpl; import org.apache.wink.server.handlers.HandlersChain; import org.apache.wink.server.handlers.MessageContext; import org.apache.wink.server.internal.log.Requests.LoggedServletInputStream; import org.apache.wink.server.internal.log.Requests.RequestWrapper; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.Sequence; import org.jmock.lib.legacy.ClassImposteriser; import org.junit.Before; import org.junit.Test; public class RequestsTest { private Mockery mockContext = new Mockery() { { setImposteriser(ClassImposteriser.INSTANCE); } }; /** * The Requests object should do nothing. */ @Test public void testRequestsInitWithNull() { Requests r = new Requests(); r.init(null); mockContext.assertIsSatisfied(); } /** * The Requests object should do nothing. */ @Test public void testRequestsInitWithProperties() { Requests r = new Requests(); final Properties props = mockContext.mock(Properties.class); r.init(props); mockContext.assertIsSatisfied(); } @Before public void setUp() { Logger.getLogger("org.apache.wink").setLevel(Level.INFO); } /** * The Requests object should register its wrapper inside of the Requests. */ @Test public void testRequestsLogStartupBehaviorWhenNoLoggerAtDebug() { Requests r = new Requests(); r.init(null); MessageContext context = mockContext.mock(MessageContext.class); r.logStartRequest(context); mockContext.assertIsSatisfied(); } /** * The Requests object should not log anything with debug not enabled. * * @throws Throwable */ @Test public void testRequestsHandleRequestWithNoLoggerAtDebug() throws Throwable { Requests r = new Requests(); r.init(null); final MessageContext context = mockContext.mock(MessageContext.class); final HandlersChain chain = mockContext.mock(HandlersChain.class); mockContext.checking(new Expectations() { { oneOf(chain).doChain(context); } }); r.handleRequest(context, chain); mockContext.assertIsSatisfied(); } /** * The Requests object should register its wrapper inside of the Requests. */ @Test public void testRequestsLogStartupBehaviorWhenLoggerAtDebugWithNullWrapper() { Logger.getLogger("org.apache.wink").setLevel(Level.FINE); Requests r = new Requests(); r.init(null); final MessageContext context = mockContext.mock(MessageContext.class); mockContext.checking(new Expectations() { { oneOf(context).getAttribute(HttpServletRequestWrapper.class); will(returnValue(null)); } }); r.logStartRequest(context); mockContext.assertIsSatisfied(); } /** * The Requests object should register its wrapper inside of the Requests. */ @Test public void testRequestsLogStartupBehaviorWhenLoggerAtDebugWithWrapper() throws Exception { Logger.getLogger("org.apache.wink").setLevel(Level.FINE); Requests r = new Requests(); r.init(null); final MessageContext context = mockContext.mock(MessageContext.class); final HttpServletRequestWrapper requestWrapper = mockContext.mock(HttpServletRequestWrapper.class); final UriInfo uriInfo = mockContext.mock(UriInfo.class); final HttpHeaders headers = mockContext.mock(HttpHeaders.class); mockContext.checking(new Expectations() { { oneOf(context).getAttribute(HttpServletRequestWrapper.class); will(returnValue(requestWrapper)); oneOf(context).getUriInfo(); will(returnValue(uriInfo)); oneOf(uriInfo).getRequestUri(); will(returnValue(new URI(""))); oneOf(context).getHttpHeaders(); will(returnValue(headers)); oneOf(headers).getRequestHeaders(); will(returnValue(new MultivaluedMapImpl<String, String>())); /* * these should actually be all the same objects but no easy way * to capture it */ oneOf(context).setAttribute(with(RequestWrapper.class), with(any(RequestWrapper.class))); oneOf(context).setAttribute(with(HttpServletRequest.class), with(any(HttpServletRequest.class))); oneOf(context).setAttribute(with(HttpServletRequestWrapper.class), with(any(HttpServletRequestWrapper.class))); } }); r.logStartRequest(context); mockContext.assertIsSatisfied(); } /** * This is a normal flow. * * @throws Throwable */ @Test public void testRequestsHandleRequestWithLoggerAtDebug() throws Throwable { Logger.getLogger("org.apache.wink").setLevel(Level.FINE); Requests r = new Requests(); r.init(null); final MessageContext context = mockContext.mock(MessageContext.class); final HandlersChain chain = mockContext.mock(HandlersChain.class); final HttpServletRequestWrapper requestWrapper = mockContext.mock(HttpServletRequestWrapper.class); final Sequence normalSequence = mockContext.sequence("normalSequence"); final RequestWrapper wrapper = mockContext.mock(RequestWrapper.class); final LoggedServletInputStream inputStream = mockContext.mock(LoggedServletInputStream.class); final UriInfo uriInfo = mockContext.mock(UriInfo.class); final HttpHeaders headers = mockContext.mock(HttpHeaders.class); mockContext.checking(new Expectations() { { oneOf(context).getAttribute(HttpServletRequestWrapper.class); will(returnValue(requestWrapper)); inSequence(normalSequence); oneOf(context).getUriInfo(); will(returnValue(uriInfo)); oneOf(uriInfo).getRequestUri(); will(returnValue(new URI(""))); oneOf(context).getHttpHeaders(); will(returnValue(headers)); oneOf(headers).getRequestHeaders(); will(returnValue(new MultivaluedMapImpl<String, String>())); /* * these should actually be all the same objects but no easy way * to capture it */ oneOf(context).setAttribute(with(RequestWrapper.class), with(any(RequestWrapper.class))); inSequence(normalSequence); oneOf(context).setAttribute(with(HttpServletRequest.class), with(any(HttpServletRequest.class))); inSequence(normalSequence); oneOf(context).setAttribute(with(HttpServletRequestWrapper.class), with(any(HttpServletRequestWrapper.class))); inSequence(normalSequence); oneOf(chain).doChain(context); inSequence(normalSequence); oneOf(context).getAttribute(RequestWrapper.class); will(returnValue(wrapper)); inSequence(normalSequence); oneOf(wrapper).getLoggedInputStream(); will(returnValue(inputStream)); inSequence(normalSequence); oneOf(inputStream).getLoggedByteBufferLength(); will(returnValue(10)); inSequence(normalSequence); oneOf(inputStream).getLoggedByteBuffer(); will(returnValue(new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9})); inSequence(normalSequence); oneOf(inputStream).getLoggedByteBufferLength(); will(returnValue(10)); inSequence(normalSequence); oneOf(context).setAttribute(RequestWrapper.class, (RequestWrapper)null); inSequence(normalSequence); } }); r.handleRequest(context, chain); mockContext.assertIsSatisfied(); } @Test public void testRequestWrapperRandomCall() { final HttpServletRequest request = mockContext.mock(HttpServletRequest.class); RequestWrapper wrapper = new RequestWrapper(request); mockContext.checking(new Expectations() { { oneOf(request).getContentType(); will(returnValue("ABCD")); } }); assertEquals("ABCD", wrapper.getContentType()); mockContext.assertIsSatisfied(); } @Test public void testRequestWrapperGetInputStream() throws Exception { final HttpServletRequest request = mockContext.mock(HttpServletRequest.class); final ServletInputStream servletInputStream = mockContext.mock(ServletInputStream.class); RequestWrapper wrapper = new RequestWrapper(request); mockContext.checking(new Expectations() { { oneOf(request).getInputStream(); will(returnValue(servletInputStream)); } }); ServletInputStream m = wrapper.getInputStream(); assertTrue(m instanceof LoggedServletInputStream); assertSame((LoggedServletInputStream)m, wrapper.getLoggedInputStream()); mockContext.assertIsSatisfied(); } }