/*******************************************************************************
* Copyright 2011 André Rouél
*
* 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 net.sf.jacclog.logformat;
import java.util.HashSet;
import java.util.Set;
import net.sf.jacclog.logformat.field.CanonicalServerNameField;
import net.sf.jacclog.logformat.field.Field;
import net.sf.jacclog.logformat.field.HttpLastStatusField;
import net.sf.jacclog.logformat.field.HttpStatusField;
import net.sf.jacclog.logformat.field.RemoteHostField;
import net.sf.jacclog.logformat.field.RemoteLognameField;
import net.sf.jacclog.logformat.field.RemoteUserField;
import net.sf.jacclog.logformat.field.RequestFirstLineField;
import net.sf.jacclog.logformat.field.RequestHeaderAcceptCharsetField;
import net.sf.jacclog.logformat.field.RequestHeaderAcceptEncodingField;
import net.sf.jacclog.logformat.field.RequestHeaderAcceptField;
import net.sf.jacclog.logformat.field.RequestHeaderAcceptLanguageField;
import net.sf.jacclog.logformat.field.RequestHeaderAuthorizationField;
import net.sf.jacclog.logformat.field.RequestHeaderCacheControlField;
import net.sf.jacclog.logformat.field.RequestHeaderConnectionField;
import net.sf.jacclog.logformat.field.RequestHeaderContentLengthField;
import net.sf.jacclog.logformat.field.RequestHeaderContentTypeField;
import net.sf.jacclog.logformat.field.RequestHeaderCookieField;
import net.sf.jacclog.logformat.field.RequestHeaderDateField;
import net.sf.jacclog.logformat.field.RequestHeaderExpectField;
import net.sf.jacclog.logformat.field.RequestHeaderFromField;
import net.sf.jacclog.logformat.field.RequestHeaderHostField;
import net.sf.jacclog.logformat.field.RequestHeaderIfMatchField;
import net.sf.jacclog.logformat.field.RequestHeaderIfModifiedSinceField;
import net.sf.jacclog.logformat.field.RequestHeaderIfNoneMatchField;
import net.sf.jacclog.logformat.field.RequestHeaderIfRangeField;
import net.sf.jacclog.logformat.field.RequestHeaderIfUnmodifiedSinceField;
import net.sf.jacclog.logformat.field.RequestHeaderMaxForwardsField;
import net.sf.jacclog.logformat.field.RequestHeaderPragmaField;
import net.sf.jacclog.logformat.field.RequestHeaderProxyAuthorizationField;
import net.sf.jacclog.logformat.field.RequestHeaderRangeField;
import net.sf.jacclog.logformat.field.RequestHeaderRefererField;
import net.sf.jacclog.logformat.field.RequestHeaderTeField;
import net.sf.jacclog.logformat.field.RequestHeaderUpgradeField;
import net.sf.jacclog.logformat.field.RequestHeaderUserAgentField;
import net.sf.jacclog.logformat.field.RequestHeaderViaField;
import net.sf.jacclog.logformat.field.RequestHeaderWarningField;
import net.sf.jacclog.logformat.field.RequestMethodField;
import net.sf.jacclog.logformat.field.RequestTimeField;
import net.sf.jacclog.logformat.field.ResponseHeaderAcceptRangesField;
import net.sf.jacclog.logformat.field.ResponseHeaderAgeField;
import net.sf.jacclog.logformat.field.ResponseHeaderAllowField;
import net.sf.jacclog.logformat.field.ResponseHeaderCacheControlField;
import net.sf.jacclog.logformat.field.ResponseHeaderConnectionField;
import net.sf.jacclog.logformat.field.ResponseHeaderContentDispositionField;
import net.sf.jacclog.logformat.field.ResponseHeaderContentEncodingField;
import net.sf.jacclog.logformat.field.ResponseHeaderContentLanguageField;
import net.sf.jacclog.logformat.field.ResponseHeaderContentLengthField;
import net.sf.jacclog.logformat.field.ResponseHeaderContentLocationField;
import net.sf.jacclog.logformat.field.ResponseHeaderContentRangeField;
import net.sf.jacclog.logformat.field.ResponseHeaderContentTypeField;
import net.sf.jacclog.logformat.field.ResponseHeaderDateField;
import net.sf.jacclog.logformat.field.ResponseHeaderEtagField;
import net.sf.jacclog.logformat.field.ResponseHeaderExpiresField;
import net.sf.jacclog.logformat.field.ResponseHeaderLastModifiedField;
import net.sf.jacclog.logformat.field.ResponseHeaderLinkField;
import net.sf.jacclog.logformat.field.ResponseHeaderLocationField;
import net.sf.jacclog.logformat.field.ResponseHeaderP3pField;
import net.sf.jacclog.logformat.field.ResponseHeaderPragmaField;
import net.sf.jacclog.logformat.field.ResponseHeaderProxyAuthenticateField;
import net.sf.jacclog.logformat.field.ResponseHeaderRefreshField;
import net.sf.jacclog.logformat.field.ResponseHeaderRetryAfterField;
import net.sf.jacclog.logformat.field.ResponseHeaderServerField;
import net.sf.jacclog.logformat.field.ResponseHeaderSetCookieField;
import net.sf.jacclog.logformat.field.ResponseHeaderStrictTransportSecurityField;
import net.sf.jacclog.logformat.field.ResponseHeaderTrailerField;
import net.sf.jacclog.logformat.field.ResponseHeaderTransferEncodingField;
import net.sf.jacclog.logformat.field.ResponseHeaderVaryField;
import net.sf.jacclog.logformat.field.ResponseHeaderViaField;
import net.sf.jacclog.logformat.field.ResponseHeaderWarningField;
import net.sf.jacclog.logformat.field.ResponseHeaderWwwAuthenticateField;
import net.sf.jacclog.logformat.field.ResponseInBytesClfField;
import net.sf.jacclog.logformat.field.ResponseInBytesField;
import net.sf.jacclog.logformat.field.UrlPathField;
import org.junit.Assert;
import org.junit.Test;
public class LogFormatTest {
@Test
public void testAddingFields() throws Exception {
final LogFormat.Builder builder = new LogFormat.Builder();
builder.appendField(RequestHeaderRefererField.getInstance());
builder.appendField(HttpStatusField.getInstance());
builder.appendField(RequestHeaderUserAgentField.getInstance());
builder.appendField(RemoteHostField.getInstance());
final LogFormat format = builder.build();
format.getFields().add(null);
format.getFields().add(HttpLastStatusField.getInstance());
Assert.assertEquals(4, format.getFields().size());
}
@Test
public void testClearingFields() throws Exception {
final LogFormat.Builder builder = new LogFormat.Builder();
builder.appendField(RequestHeaderRefererField.getInstance());
builder.appendField(RequestHeaderUserAgentField.getInstance());
final LogFormat format = builder.build();
format.getFields().clear();
Assert.assertEquals(2, format.getFields().size());
}
@Test
public void testHeaderFields() throws Exception {
final String requestHeaders = "%{Accept}i %{Accept-Charset}i %{Accept-Encoding}i %{Accept-Language}i %{Authorization}i %{Cache-Control}i %{Connection}i %{Cookie}i %{Content-Length}i %{Content-Type}i %{Date}i %{Expect}i %{From}i %{Host}i %{If-Match}i %{If-Modified-Since}i %{If-None-Match}i %{If-Range}i %{If-Unmodified-Since}i %{Max-Forwards}i %{Pragma}i %{Proxy-Authorization}i %{Range}i %{Referer}i %{TE}i %{Upgrade}i %{User-Agent}i %{Via}i %{Warning}i";
final String responseHeaders = "%{Accept-Ranges}o %{Age}o %{Allow}o %{Cache-Control}o %{Connection}o %{Content-Encoding}o %{Content-Language}o %{Content-Length}o %{Content-Location}o %{Content-Disposition}o %{Content-Range}o %{Content-Type}o %{Date}o %{ETag}o %{Expires}o %{Last-Modified}o %{Link}o %{Location}o %{P3P}o %{Pragma}o %{Proxy-Authenticate}o %{Refresh}o %{Retry-After}o %{Server}o %{Set-Cookie}o %{Strict-Transport-Security}o %{Trailer}o %{Transfer-Encoding}o %{Vary}o %{Via}o %{Warning}o %{WWW-Authenticate}o";
final LogFormat format = LogFormat.parse(requestHeaders + " " + responseHeaders);
final Set<Field> expectedFields = new HashSet<Field>(61);
// expected response header fields
expectedFields.add(RequestHeaderAcceptCharsetField.getInstance());
expectedFields.add(RequestHeaderAcceptEncodingField.getInstance());
expectedFields.add(RequestHeaderAcceptField.getInstance());
expectedFields.add(RequestHeaderAcceptLanguageField.getInstance());
expectedFields.add(RequestHeaderAuthorizationField.getInstance());
expectedFields.add(RequestHeaderCacheControlField.getInstance());
expectedFields.add(RequestHeaderConnectionField.getInstance());
expectedFields.add(RequestHeaderContentLengthField.getInstance());
expectedFields.add(RequestHeaderContentTypeField.getInstance());
expectedFields.add(RequestHeaderCookieField.getInstance());
expectedFields.add(RequestHeaderDateField.getInstance());
expectedFields.add(RequestHeaderExpectField.getInstance());
expectedFields.add(RequestHeaderFromField.getInstance());
expectedFields.add(RequestHeaderHostField.getInstance());
expectedFields.add(RequestHeaderIfMatchField.getInstance());
expectedFields.add(RequestHeaderIfModifiedSinceField.getInstance());
expectedFields.add(RequestHeaderIfNoneMatchField.getInstance());
expectedFields.add(RequestHeaderIfRangeField.getInstance());
expectedFields.add(RequestHeaderIfUnmodifiedSinceField.getInstance());
expectedFields.add(RequestHeaderMaxForwardsField.getInstance());
expectedFields.add(RequestHeaderPragmaField.getInstance());
expectedFields.add(RequestHeaderProxyAuthorizationField.getInstance());
expectedFields.add(RequestHeaderRangeField.getInstance());
expectedFields.add(RequestHeaderRefererField.getInstance());
expectedFields.add(RequestHeaderTeField.getInstance());
expectedFields.add(RequestHeaderUpgradeField.getInstance());
expectedFields.add(RequestHeaderUserAgentField.getInstance());
expectedFields.add(RequestHeaderViaField.getInstance());
expectedFields.add(RequestHeaderWarningField.getInstance());
// expected response header fields
expectedFields.add(ResponseHeaderAcceptRangesField.getInstance());
expectedFields.add(ResponseHeaderAgeField.getInstance());
expectedFields.add(ResponseHeaderAllowField.getInstance());
expectedFields.add(ResponseHeaderCacheControlField.getInstance());
expectedFields.add(ResponseHeaderConnectionField.getInstance());
expectedFields.add(ResponseHeaderContentDispositionField.getInstance());
expectedFields.add(ResponseHeaderContentEncodingField.getInstance());
expectedFields.add(ResponseHeaderContentLanguageField.getInstance());
expectedFields.add(ResponseHeaderContentLengthField.getInstance());
expectedFields.add(ResponseHeaderContentLocationField.getInstance());
expectedFields.add(ResponseHeaderContentRangeField.getInstance());
expectedFields.add(ResponseHeaderContentTypeField.getInstance());
expectedFields.add(ResponseHeaderDateField.getInstance());
expectedFields.add(ResponseHeaderEtagField.getInstance());
expectedFields.add(ResponseHeaderExpiresField.getInstance());
expectedFields.add(ResponseHeaderLastModifiedField.getInstance());
expectedFields.add(ResponseHeaderLinkField.getInstance());
expectedFields.add(ResponseHeaderLocationField.getInstance());
expectedFields.add(ResponseHeaderP3pField.getInstance());
expectedFields.add(ResponseHeaderPragmaField.getInstance());
expectedFields.add(ResponseHeaderProxyAuthenticateField.getInstance());
expectedFields.add(ResponseHeaderRefreshField.getInstance());
expectedFields.add(ResponseHeaderRetryAfterField.getInstance());
expectedFields.add(ResponseHeaderServerField.getInstance());
expectedFields.add(ResponseHeaderSetCookieField.getInstance());
expectedFields.add(ResponseHeaderStrictTransportSecurityField.getInstance());
expectedFields.add(ResponseHeaderTrailerField.getInstance());
expectedFields.add(ResponseHeaderTransferEncodingField.getInstance());
expectedFields.add(ResponseHeaderVaryField.getInstance());
expectedFields.add(ResponseHeaderViaField.getInstance());
expectedFields.add(ResponseHeaderWarningField.getInstance());
expectedFields.add(ResponseHeaderWwwAuthenticateField.getInstance());
Assert.assertEquals(expectedFields.size(), format.getFields().size());
Assert.assertTrue(format.getFields().containsAll(expectedFields));
}
@Test
public void testParsingCombinedLogFormat() throws Exception {
// NCSA extended/combined log format
final LogFormat format = LogFormat.parse("%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"");
Assert.assertEquals(RemoteHostField.getInstance(), format.getFields().get(0));
Assert.assertEquals(RemoteLognameField.getInstance(), format.getFields().get(1));
Assert.assertEquals(RemoteUserField.getInstance(), format.getFields().get(2));
Assert.assertEquals(RequestTimeField.getInstance(), format.getFields().get(3));
Assert.assertEquals(RequestFirstLineField.getInstance(), format.getFields().get(4));
Assert.assertEquals(HttpLastStatusField.getInstance(), format.getFields().get(5));
Assert.assertEquals(ResponseInBytesClfField.getInstance(), format.getFields().get(6));
Assert.assertEquals(RequestHeaderRefererField.getInstance(), format.getFields().get(7));
Assert.assertEquals(RequestHeaderUserAgentField.getInstance(), format.getFields().get(8));
Assert.assertEquals(9, format.getFields().size());
Assert.assertEquals(LogFormat.Defaults.COMBINED.getFormat(), format);
Assert.assertNotSame(LogFormat.Defaults.COMMON.getFormat(), format);
}
@Test
public void testParsingCommonLogFormat() throws Exception {
// Common Log Format (CLF)
final LogFormat format = LogFormat.parse("%h %l %u %t \"%r\" %>s %b");
Assert.assertEquals(RemoteHostField.getInstance(), format.getFields().get(0));
Assert.assertEquals(RemoteLognameField.getInstance(), format.getFields().get(1));
Assert.assertEquals(RemoteUserField.getInstance(), format.getFields().get(2));
Assert.assertEquals(RequestTimeField.getInstance(), format.getFields().get(3));
Assert.assertEquals(RequestFirstLineField.getInstance(), format.getFields().get(4));
Assert.assertEquals(HttpLastStatusField.getInstance(), format.getFields().get(5));
Assert.assertEquals(ResponseInBytesClfField.getInstance(), format.getFields().get(6));
Assert.assertEquals(7, format.getFields().size());
Assert.assertEquals(LogFormat.Defaults.COMMON.getFormat(), format);
Assert.assertNotSame(LogFormat.Defaults.COMMON_WITH_VHOST.getFormat(), format);
}
@Test
public void testParsingCommonLogFormatWithVhost() throws Exception {
// Common Log Format with Virtual Host
final LogFormat format = LogFormat.parse("%v %h %l %u %t \"%r\" %>s %b");
Assert.assertEquals(CanonicalServerNameField.getInstance(), format.getFields().get(0));
Assert.assertEquals(RemoteHostField.getInstance(), format.getFields().get(1));
Assert.assertEquals(RemoteLognameField.getInstance(), format.getFields().get(2));
Assert.assertEquals(RemoteUserField.getInstance(), format.getFields().get(3));
Assert.assertEquals(RequestTimeField.getInstance(), format.getFields().get(4));
Assert.assertEquals(RequestFirstLineField.getInstance(), format.getFields().get(5));
Assert.assertEquals(HttpLastStatusField.getInstance(), format.getFields().get(6));
Assert.assertEquals(ResponseInBytesClfField.getInstance(), format.getFields().get(7));
Assert.assertEquals(8, format.getFields().size());
Assert.assertEquals(LogFormat.Defaults.COMMON_WITH_VHOST.getFormat(), format);
Assert.assertNotSame(LogFormat.Defaults.COMMON.getFormat(), format);
Assert.assertNotSame(LogFormat.Defaults.COMBINED.getFormat(), format);
}
@Test
public void testParsingNullFormat() throws Exception {
try {
final LogFormat format = LogFormat.parse(null);
Assert.assertNotNull(format);
Assert.assertFalse(true);
} catch (final IllegalArgumentException e) {
Assert.assertTrue(true);
} catch (final Exception e) {
Assert.assertTrue(false);
}
}
@Test
public void testParsingObscureFormat() throws Exception {
// Custom Log Format
final LogFormat format = LogFormat.parse("%h \r\t %l%u\t%t %m%U %s %B");
Assert.assertEquals(RemoteHostField.getInstance(), format.getFields().get(0));
Assert.assertEquals(RemoteLognameField.getInstance(), format.getFields().get(1));
Assert.assertEquals(RemoteUserField.getInstance(), format.getFields().get(2));
Assert.assertEquals(RequestTimeField.getInstance(), format.getFields().get(3));
Assert.assertEquals(RequestMethodField.getInstance(), format.getFields().get(4));
Assert.assertEquals(UrlPathField.getInstance(), format.getFields().get(5));
Assert.assertEquals(HttpStatusField.getInstance(), format.getFields().get(6));
Assert.assertEquals(ResponseInBytesField.getInstance(), format.getFields().get(7));
Assert.assertEquals(8, format.getFields().size());
Assert.assertNotSame(LogFormat.Defaults.COMMON_WITH_VHOST.getFormat(), format);
Assert.assertNotSame(LogFormat.Defaults.COMMON.getFormat(), format);
Assert.assertNotSame(LogFormat.Defaults.COMBINED.getFormat(), format);
}
@Test
public void testParsingPredefinedCombinedLogFormat() throws Exception {
// NCSA extended/combined log format
final LogFormat format = LogFormat.parse("combined");
Assert.assertEquals(RemoteHostField.getInstance(), format.getFields().get(0));
Assert.assertEquals(RemoteLognameField.getInstance(), format.getFields().get(1));
Assert.assertEquals(RemoteUserField.getInstance(), format.getFields().get(2));
Assert.assertEquals(RequestTimeField.getInstance(), format.getFields().get(3));
Assert.assertEquals(RequestFirstLineField.getInstance(), format.getFields().get(4));
Assert.assertEquals(HttpLastStatusField.getInstance(), format.getFields().get(5));
Assert.assertEquals(ResponseInBytesClfField.getInstance(), format.getFields().get(6));
Assert.assertEquals(RequestHeaderRefererField.getInstance(), format.getFields().get(7));
Assert.assertEquals(RequestHeaderUserAgentField.getInstance(), format.getFields().get(8));
Assert.assertEquals(9, format.getFields().size());
Assert.assertEquals(LogFormat.Defaults.COMBINED.getFormat(), format);
Assert.assertNotSame(LogFormat.Defaults.COMMON.getFormat(), format);
}
@Test
public void testParsingPredefinedCommonLogFormat() throws Exception {
// Common Log Format
final LogFormat format = LogFormat.parse("common");
Assert.assertEquals(RemoteHostField.getInstance(), format.getFields().get(0));
Assert.assertEquals(RemoteLognameField.getInstance(), format.getFields().get(1));
Assert.assertEquals(RemoteUserField.getInstance(), format.getFields().get(2));
Assert.assertEquals(RequestTimeField.getInstance(), format.getFields().get(3));
Assert.assertEquals(RequestFirstLineField.getInstance(), format.getFields().get(4));
Assert.assertEquals(HttpLastStatusField.getInstance(), format.getFields().get(5));
Assert.assertEquals(ResponseInBytesClfField.getInstance(), format.getFields().get(6));
Assert.assertEquals(7, format.getFields().size());
Assert.assertEquals(LogFormat.Defaults.COMMON.getFormat(), format);
Assert.assertNotSame(LogFormat.Defaults.COMMON_WITH_VHOST.getFormat(), format);
Assert.assertNotSame(LogFormat.Defaults.COMBINED.getFormat(), format);
}
@Test
public void testParsingPredefinedCommonLogFormatWithVhost() throws Exception {
// Common Log Format with Virtual Host
final LogFormat format = LogFormat.parse("common_with_vhost");
Assert.assertEquals(CanonicalServerNameField.getInstance(), format.getFields().get(0));
Assert.assertEquals(RemoteHostField.getInstance(), format.getFields().get(1));
Assert.assertEquals(RemoteLognameField.getInstance(), format.getFields().get(2));
Assert.assertEquals(RemoteUserField.getInstance(), format.getFields().get(3));
Assert.assertEquals(RequestTimeField.getInstance(), format.getFields().get(4));
Assert.assertEquals(RequestFirstLineField.getInstance(), format.getFields().get(5));
Assert.assertEquals(HttpLastStatusField.getInstance(), format.getFields().get(6));
Assert.assertEquals(ResponseInBytesClfField.getInstance(), format.getFields().get(7));
Assert.assertEquals(8, format.getFields().size());
Assert.assertEquals(LogFormat.Defaults.COMMON_WITH_VHOST.getFormat(), format);
Assert.assertNotSame(LogFormat.Defaults.COMMON.getFormat(), format);
Assert.assertNotSame(LogFormat.Defaults.COMBINED.getFormat(), format);
}
}