/** * 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.interceptor; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import java.util.HashMap; import java.util.logging.Logger; import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.endpoint.Endpoint; import org.apache.cxf.io.CachedOutputStream; import org.apache.cxf.message.ExchangeImpl; import org.apache.cxf.message.Message; import org.apache.cxf.message.MessageImpl; import org.apache.cxf.service.model.BindingInfo; import org.apache.cxf.service.model.EndpointInfo; import org.easymock.EasyMock; import org.easymock.IMocksControl; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @SuppressWarnings("deprecation") public class LoggingOutInterceptorTest extends Assert { protected IMocksControl control; @Before public void setUp() throws Exception { control = EasyMock.createNiceControl(); } @After public void tearDown() throws Exception { control.verify(); } @Test public void testFormatting() throws Exception { control.replay(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintWriter pw = new PrintWriter(baos); LoggingOutInterceptor p = new LoggingOutInterceptor(pw); //p.setPrettyLogging(true); CachedOutputStream cos = new CachedOutputStream(); String s = "<today><is><the><twenty> <second> <of> <january> <two> <thousand> <and> <nine></nine> " + "</and></thousand></two></january></of></second></twenty></the></is></today>"; cos.write(s.getBytes()); Message message = new MessageImpl(); message.setExchange(new ExchangeImpl()); message.put(Message.CONTENT_TYPE, "application/xml"); Logger logger = LogUtils.getL7dLogger(this.getClass()); LoggingOutInterceptor.LoggingCallback l = p.new LoggingCallback(logger, message, cos); l.onClose(cos); String str = baos.toString(); //format has changed assertFalse(str.matches(s)); assertTrue(str.contains("<today>")); } @Test public void testFormattingOverride() throws Exception { control.replay(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); // create a custom logging interceptor that overrides how formatting is done LoggingOutInterceptor p = new CustomFormatLoggingOutInterceptor(new PrintWriter(baos)); CachedOutputStream cos = new CachedOutputStream(); String s = "<today><is><the><twenty> <second> <of> <january> <two> <thousand> <and> <nine></nine> " + "</and></thousand></two></january></of></second></twenty></the></is></today>"; cos.write(s.getBytes()); Message message = new MessageImpl(); message.setExchange(new ExchangeImpl()); message.put(Message.CONTENT_TYPE, "application/xml"); Logger logger = LogUtils.getL7dLogger(this.getClass()); LoggingOutInterceptor.LoggingCallback l = p.new LoggingCallback(logger, message, cos); l.onClose(cos); String str = baos.toString(); assertTrue(str.contains("<tomorrow/>")); } @Test public void testFormattingOverrideLogWriter() throws Exception { // create a custom logging interceptor that overrides how formatting is done LoggingOutInterceptor p = new CustomFormatLoggingOutInterceptor(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); p.setPrintWriter(new PrintWriter(baos)); StringWriter sw = new StringWriter(); sw.append("<today/>"); Endpoint endpoint = control.createMock(Endpoint.class); EndpointInfo endpointInfo = control.createMock(EndpointInfo.class); EasyMock.expect(endpoint.getEndpointInfo()).andReturn(endpointInfo).anyTimes(); control.replay(); Message message = new MessageImpl(); message.setExchange(new ExchangeImpl()); message.put(Message.CONTENT_TYPE, "application/xml"); message.setContent(Writer.class, sw); p.handleMessage(message); Writer w = message.getContent(Writer.class); w.close(); String str = baos.toString(); assertTrue(str.contains("<tomorrow/>")); } @Test public void testCachedOutputStreamThreshold() throws Exception { byte[] mex = "<test><threshold/></test>".getBytes(); LoggingOutInterceptor p = new LoggingOutInterceptor(); p.setInMemThreshold(mex.length); CachedOutputStream cos = handleAndGetCachedOutputStream(p); cos.write(mex); assertNull(cos.getTempFile()); cos.write("a".getBytes()); assertNotNull(cos.getTempFile()); } private CachedOutputStream handleAndGetCachedOutputStream(LoggingOutInterceptor interceptor) { interceptor.setPrintWriter(new PrintWriter(new ByteArrayOutputStream())); Endpoint endpoint = control.createMock(Endpoint.class); EndpointInfo endpointInfo = control.createMock(EndpointInfo.class); EasyMock.expect(endpoint.getEndpointInfo()).andReturn(endpointInfo).anyTimes(); BindingInfo bindingInfo = control.createMock(BindingInfo.class); EasyMock.expect(endpointInfo.getBinding()).andReturn(bindingInfo).anyTimes(); EasyMock.expect(endpointInfo.getProperties()).andReturn(new HashMap<String, Object>()).anyTimes(); EasyMock.expect(bindingInfo.getProperties()).andReturn(new HashMap<String, Object>()).anyTimes(); control.replay(); Message message = new MessageImpl(); ExchangeImpl exchange = new ExchangeImpl(); message.setExchange(exchange); exchange.put(Endpoint.class, endpoint); message.put(Message.CONTENT_TYPE, "application/xml"); message.setContent(OutputStream.class, new ByteArrayOutputStream()); interceptor.handleMessage(message); OutputStream os = message.getContent(OutputStream.class); assertTrue(os instanceof CachedOutputStream); return (CachedOutputStream)os; } private class CustomFormatLoggingOutInterceptor extends LoggingOutInterceptor { CustomFormatLoggingOutInterceptor() { super(); } CustomFormatLoggingOutInterceptor(PrintWriter w) { super(w); } @Override protected String formatLoggingMessage(LoggingMessage loggingMessage) { loggingMessage.getPayload().append("<tomorrow/>"); return super.formatLoggingMessage(loggingMessage); } } }