/*
ALMA - Atacama Large Millimiter Array
* Copyright (c) European Southern Observatory, 2013
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package alma.acs.jlog.test;
import java.io.File;
import java.util.Date;
import junit.framework.TestCase;
import alma.acs.logging.level.AcsLogLevelDefinition;
import alma.acs.util.IsoDateFormat;
import com.cosylab.logging.engine.ExactFilter;
import com.cosylab.logging.engine.Filter;
import com.cosylab.logging.engine.FiltersVector;
import com.cosylab.logging.engine.MinMaxFilter;
import com.cosylab.logging.engine.RegExpFilter;
import com.cosylab.logging.engine.log.LogEntry;
import com.cosylab.logging.engine.log.LogField;
import com.cosylab.logging.engine.log.LogTypeHelper;
/**
* Test the {@link FiltersVector} class.
* @author acaproni
* @version $Id: FiltersVectorTest.java,v 1.3 2013/02/27 07:17:47 acaproni Exp $
* @since ACS 11.2
*/
public class FiltersVectorTest extends TestCase {
/**
* lethal is false for testing
*/
private final boolean lethal=false;
/**
* ISO date formatter
*/
private final IsoDateFormat df = new IsoDateFormat();
/**
* The {@link FiltersVector} to test
*/
private FiltersVector filters;
/**
* Logs for testing the vector filters
*/
private LogEntry log1,log2,log3;
@Override
protected void setUp() throws Exception {
filters= new FiltersVector();
assertNotNull(filters);
log1 = new LogEntry(
df.parseIsoTimestamp("2013-08-04T15:10:10.512").getTime(),
LogTypeHelper.fromAcsCoreLevel(AcsLogLevelDefinition.INFO).ordinal(),
"File.java",
100,
"File#routine()",
"alma.hq.eso.org",
"javaProcess",
"context",
"java thread",
"log id",
5,
"URI",
"stack id",
12,
"A message for a log",
"source object",
"Audience",
"array name",
"antenna name",
null);
log2 = new LogEntry(
df.parseIsoTimestamp("2013-08-01T15:10:10.512").getTime(),
LogTypeHelper.fromAcsCoreLevel(AcsLogLevelDefinition.TRACE).ordinal(),
"File.java",
95,
"File#routine()",
"alma.hq.eso.org",
"javaProcess",
"context",
"java thread",
"log id",
5,
"URI",
"stack id",
12,
"A message for log2",
"source object",
"Audience",
"array name",
"antenna name",
null);
log3 = new LogEntry(
df.parseIsoTimestamp("2013-08-10T15:10:10.512").getTime(),
LogTypeHelper.fromAcsCoreLevel(AcsLogLevelDefinition.WARNING).ordinal(),
"File.java",
130,
"File#routine()",
"alma.hq.eso.org",
"javaProcess",
"context",
"java thread",
"log id",
5,
"URI",
"stack id",
15,
"A message for log2",
"source object",
"Audience",
"array name",
"antenna name",
null);
super.setUp();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
/**
* Test {@link FiltersVector#hasActiveFilters()}
*/
public void testHasActiveFilters() throws Exception {
//No active filters yet
assertFalse("The vector should be empty at startup",filters.hasActiveFilters());
Filter exactLogMessageFilter= new ExactFilter(LogField.LOGMESSAGE, lethal, "A message", false);
filters.addFilter(exactLogMessageFilter, false);
assertFalse("The vector should contain one filter but not active",filters.hasActiveFilters());
Filter stackLvlFilter= new ExactFilter(LogField.STACKLEVEL, lethal, Integer.valueOf(5), false);
filters.addFilter(stackLvlFilter, true);
assertTrue("The vector should contain one active filter",filters.hasActiveFilters());
filters.clear();
assertFalse("The empty vector has no active filters",filters.hasActiveFilters());
}
/**
* Test {@link FiltersVector#applyFilters(com.cosylab.logging.engine.log.ILogEntry)}
*/
public void testApplyFilters() throws Exception {
// All logs are accepted if the vector is empty
assertTrue("All logs accepted if no filters", filters.applyFilters(log1));
assertTrue("All logs accepted if no filters", filters.applyFilters(log2));
assertTrue("All logs accepted if no filters", filters.applyFilters(log3));
// All logs are accepted if the vector has filters but no one is active
Filter exactLogMessageFilter= new ExactFilter(LogField.LOGMESSAGE, lethal, "A message for a log", false);
filters.addFilter(exactLogMessageFilter, false);
Filter stackLvlFilter= new ExactFilter(LogField.STACKLEVEL, lethal, Integer.valueOf(12), false);
filters.addFilter(stackLvlFilter, false);
assertTrue("All logs accepted if no filters", filters.applyFilters(log1));
assertTrue("All logs accepted if no filters", filters.applyFilters(log2));
assertTrue("All logs accepted if no filters", filters.applyFilters(log3));
filters.clear();
assertFalse("The empty vector has no active filters",filters.hasActiveFilters());
// Only log1 should pass
filters.addFilter(exactLogMessageFilter, true);
assertTrue("The vector should contain one active filter",filters.hasActiveFilters());
assertTrue("log1 should be accepted", filters.applyFilters(log1));
assertFalse("log2 logs NOT accepted", filters.applyFilters(log2));
assertFalse("log3 logs NOT accepted", filters.applyFilters(log3));
filters.clear();
assertFalse("The empty vector has no active filters",filters.hasActiveFilters());
// Test with 2 filters
Filter exactLogMessageFilter2= new ExactFilter(LogField.LOGMESSAGE, lethal, "A message for log2", false);
Filter lineFilter= new ExactFilter(LogField.LINE, lethal, Integer.valueOf(95), false);
filters.addFilter(exactLogMessageFilter2, true);
filters.addFilter(lineFilter, true);
assertFalse("log1 should NOT be accepted", filters.applyFilters(log1));
assertTrue("log2 logs accepted", filters.applyFilters(log2));
assertFalse("log3 logs NOT accepted", filters.applyFilters(log3));
}
/**
* Test the saving and loading of the filters.
* <P>The test is done by:
* <UL>
* <LI>Setting up some filters
* <LI>Saving the filters in a temporary file
* <LI>Clearing the vector of filters
* <LI>Loading the filters
* <LI>Checking if the loaded filters are the same filters that had been saved
* </UL>
* The checking of filters is done also printing {@link FiltersVector#getFilterString()} in the stdout:
* tat will check for correctness. Besides that, each filter will be checked
* @throws Exception
*/
public void testLoadSave() throws Exception {
// Define few interesting filters
Filter exactLogMessageFilter= new ExactFilter(LogField.LOGMESSAGE, lethal, "One message", false);
Filter regExpLogMessageFilter= new RegExpFilter(LogField.SOURCEOBJECT, lethal, "RegExpr.*", false);
Date maxDate = df.parseIsoTimestamp("2013-08-07T15:10:10.512");
Date minDate = df.parseIsoTimestamp("2013-08-02T15:10:10.512");
Filter minMaxDateFilter= new MinMaxFilter(LogField.TIMESTAMP,lethal,minDate,maxDate,false);
Integer maxType = LogTypeHelper.fromAcsCoreLevel(AcsLogLevelDefinition.NOTICE).ordinal();
Integer minType = LogTypeHelper.fromAcsCoreLevel(AcsLogLevelDefinition.DEBUG).ordinal();
Filter minMaxTypeFilter= new MinMaxFilter(LogField.ENTRYTYPE,lethal,minType,maxType,false);
Date excatDate = df.parseIsoTimestamp("2011-09-02T10:21:18.333");
Filter exactDateFilter= new ExactFilter(LogField.TIMESTAMP, lethal, excatDate, false);
Filter exactStackLevelFilter= new ExactFilter(LogField.STACKLEVEL, lethal, Integer.valueOf(13), false);
Filter minMaxLineFilter= new MinMaxFilter(LogField.LINE,lethal,Integer.valueOf(7),Integer.valueOf(320),false);
Filter exactTypeFilter= new ExactFilter(LogField.ENTRYTYPE, lethal, LogTypeHelper.EMERGENCY, false);
filters.addFilter(exactLogMessageFilter, true);
filters.addFilter(regExpLogMessageFilter, false);
filters.addFilter(minMaxDateFilter, true);
filters.addFilter(minMaxTypeFilter, false);
filters.addFilter(exactDateFilter,true);
filters.addFilter(exactStackLevelFilter,true);
filters.addFilter(minMaxLineFilter, false);
filters.addFilter(exactTypeFilter, false);
assertEquals("We added 8 filters!",8, filters.size());
System.out.println("Filters to save: "+filters.getFilterString());
// Save filters
String dir = System.getProperty("user.dir");
String fileName=dir+"/TestSaveLoad.xml";
File outF = new File(fileName);
filters.saveFilters(outF);
// Clear the vector of filters
filters.clear();
// Load filters
filters.loadFilters(outF, true, fileName);
System.out.println("Loaded filters: "+filters.getFilterString());
// Check each filter
assertEquals("Loaded filters differ from saved filters",8, filters.size());
for (int t=0; t<filters.size(); t++) {
Filter flt = filters.get(t);
System.out.println(flt.toString());
}
// Check if the activation state has been saved correctly
assertTrue("Invalid \"ENABLED\" state",filters.isActive(0));
assertFalse("Invalid \"ENABLED\" state",filters.isActive(1));
assertTrue("Invalid \"ENABLED\" state",filters.isActive(2));
assertFalse("Invalid \"ENABLED\" state",filters.isActive(3));
assertTrue("Invalid \"ENABLED\" state",filters.isActive(4));
assertTrue("Invalid \"ENABLED\" state",filters.isActive(5));
assertFalse("Invalid \"ENABLED\" state",filters.isActive(6));
assertFalse("Invalid \"ENABLED\" state",filters.isActive(7));
// Remove the file
outF.delete();
}
}