package uws.service.file;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import org.junit.Test;
import uws.service.log.DefaultUWSLog;
import uws.service.log.UWSLog;
import uws.service.log.UWSLog.LogLevel;
public class TestLogRotation {
@Test
public void testEventFrequencyCreation(){
EventFrequency freq;
try{
String DEFAULT_FREQ = "daily at 00:00";
// FREQ = NULL => !!! ; frequency = every day
freq = new EventFrequency(null);
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "" => !!! ; frequency = every day
freq = new EventFrequency("");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "blabla" => !!!
freq = new EventFrequency("blabla");
assertEquals(DEFAULT_FREQ, freq.toString());
/* *********** */
/* DAILY EVENT */
/* *********** */
DEFAULT_FREQ = "daily at 00:00";
// FREQ = "D" => ok! ; frequency = every day at midnight
freq = new EventFrequency("D");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "D 06" => !!! ; frequency = every day at midnight
freq = new EventFrequency("D 06");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "D 06 30" => ok! ; frequency = every day at 06:30
freq = new EventFrequency("D 06 30");
assertEquals("daily at 06:30", freq.toString());
// FREQ = "D 6 30" => ok! ; frequency = every day at 06:30
freq = new EventFrequency("D 6 30");
assertEquals("daily at 06:30", freq.toString());
// FREQ = "D 06 30" => ok! (with spaces and tabs inside) ; frequency = every day at 06:30
freq = new EventFrequency("D 06 30");
assertEquals("daily at 06:30", freq.toString());
// FREQ = "D 24 30" => !!! ; frequency = every day at midnight
freq = new EventFrequency("D 24 30");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "D 06 60" => !!! ; frequency = every day at midnight
freq = new EventFrequency("D 06 60");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "D 6 30 01 blabla" => ok! ; frequency = every day at 06:30
freq = new EventFrequency("D 6 30 01 blabla");
assertEquals("daily at 06:30", freq.toString());
// FREQ = "d 06 30" => !!! ; frequency = every day at midnight
freq = new EventFrequency("d 06 30");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "D HH mm" => !!!
freq = new EventFrequency("D HH mm");
assertEquals(DEFAULT_FREQ, freq.toString());
/* ********** */
/* WEEK EVENT */
/* ********** */
DEFAULT_FREQ = "weekly on Sunday at 00:00";
// FREQ = "W" => ok! ; frequency = every week the Sunday at midnight
freq = new EventFrequency("W");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "W 06" => !!! ; frequency = every week the Sunday at midnight
freq = new EventFrequency("W 06");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "W 06 30" => !!! ; frequency = every week the Sunday at midnight
freq = new EventFrequency("W 06 30");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "W 2" => !!! ; frequency = every week the Sunday at midnight
freq = new EventFrequency("W 2");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "W 2 06" => !!! ; frequency = every week the Sunday at midnight
freq = new EventFrequency("W 2 06");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "W 2 06 30" => ok! ; frequency = every week the Monday at 06:30
freq = new EventFrequency("W 2 06 30");
assertEquals("weekly on Monday at 06:30", freq.toString());
// FREQ = "W 0 06 30" => !!! ; frequency = every week the Sunday at 06:30
freq = new EventFrequency("W 0 06 30");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "W 10 06 30" => !!! ; frequency = every week the Sunday at 06:30
freq = new EventFrequency("W 10 06 30");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "w 2 06 30" => !!! ; frequency = every day at 00:00
freq = new EventFrequency("w 2 06 30");
assertEquals("daily at 00:00", freq.toString());
// FREQ = "W 2 6 30" => ok! ; frequency = every week the Monday at 06:30
freq = new EventFrequency("W 2 6 30");
assertEquals("weekly on Monday at 06:30", freq.toString());
// FREQ = "W 2 6 30" => ok! (with spaces and tabs inside) ; frequency = every week the Monday at 06:30
freq = new EventFrequency("W 2 6 30");
assertEquals("weekly on Monday at 06:30", freq.toString());
// FREQ = "W 2 6 30 12 blabla" => ok! ; frequency = every week the Monday at 06:30
freq = new EventFrequency("W 2 6 30 12 blabla");
assertEquals("weekly on Monday at 06:30", freq.toString());
/* ***************************************** */
/* MONTH EVENT (same code as for WEEK EVENT) */
/* ***************************************** */
DEFAULT_FREQ = "monthly on the 1st at 00:00";
// FREQ = "M 2 06 30" => ok! ; frequency = every month on the 2nd at 06:30
freq = new EventFrequency("M 2 06 30");
assertEquals("monthly on the 2nd at 06:30", freq.toString());
// FREQ = "M 2 06 30" => ok! (with spaces and tabs inside) ; frequency = every month on the 2nd at 06:30
freq = new EventFrequency("M 2 06 30");
assertEquals("monthly on the 2nd at 06:30", freq.toString());
// FREQ = "m 2 06 30" => !!! ; frequency = every minute
freq = new EventFrequency("m 2 06 30");
assertEquals("every minute", freq.toString());
// FREQ = "M 0 06 30" => !!! ; frequency = every month on the 1st at 00:00
freq = new EventFrequency("M 0 06 30");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "M 32 06 30" => !!! ; frequency = every month on the 1st at 00:00
freq = new EventFrequency("M 32 06 30");
assertEquals(DEFAULT_FREQ, freq.toString());
/* ********** */
/* HOUR EVENT */
/* ********** */
DEFAULT_FREQ = "hourly at 00";
// FREQ = "h" => ok! ; frequency = every hour at 00
freq = new EventFrequency("h");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "h 10" => ok! ; frequency = every hour at 10
freq = new EventFrequency("h 10");
assertEquals("hourly at 10", freq.toString());
// FREQ = "h 10" => ok! (with spaces and tabs inside) ; frequency = every hour at 10
freq = new EventFrequency("h 10");
assertEquals("hourly at 10", freq.toString());
// FREQ = "H 10" => !!! ; frequency = every day at 00:00
freq = new EventFrequency("H 10");
assertEquals("daily at 00:00", freq.toString());
// FREQ = "h 5" => ok! ; frequency = every hour at 05
freq = new EventFrequency("h 5");
assertEquals("hourly at 05", freq.toString());
// FREQ = "h 60" => !!! ; frequency = every hour at 00
freq = new EventFrequency("h 60");
assertEquals("hourly at 00", freq.toString());
// FREQ = "h 10 12 blabla" => ok! ; frequency = every hour at 10
freq = new EventFrequency("h 10 12 blabla");
assertEquals("hourly at 10", freq.toString());
/* ********** */
/* HOUR EVENT */
/* ********** */
DEFAULT_FREQ = "every minute";
// FREQ = "m" => ok! ; frequency = every minute
freq = new EventFrequency("m");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "m 10 blabla" => ok! ; frequency = every minute
freq = new EventFrequency("m 10 blabla");
assertEquals(DEFAULT_FREQ, freq.toString());
// FREQ = "M" => !!! ; frequency = every month on the 1st at 00:00
freq = new EventFrequency("M");
assertEquals("monthly on the 1st at 00:00", freq.toString());
}catch(Exception e){
e.printStackTrace(System.err);
fail("UNEXPECTED EXCEPTION: \"" + e.getMessage() + "\"");
}
}
@Test
public void testGetLogOutput(){
try{
final LocalUWSFileManager fileManager = new LocalUWSFileManager(new File("."));
fileManager.logRotation = new EventFrequency("m");
final int MAX_TIME = 3000; // 3 seconds => 68 messages (for 5 threads)
int nbExpectedMessages = 0;
// Delete old log file:
fileManager.getLogFile(LogLevel.DEBUG, null).delete();
// Log a lot of messages:
final UWSLog logger = new DefaultUWSLog(fileManager);
for(int i = 0; i < 5; i++){
final int logFreq = i + 1;
nbExpectedMessages += 30 / logFreq;
(new Thread(new Runnable(){
@Override
public void run(){
try{
final int nbMsgs = 30 / logFreq;
final int freq = MAX_TIME / nbMsgs;
for(int cnt = 0; cnt < nbMsgs; cnt++){
logger.log(LogLevel.INFO, "TEST", "LOG MESSAGE FROM Thread-" + logFreq, null);
assertFalse(fileManager.getLogOutput(LogLevel.INFO, "UWS").checkError()); // if true, it means that at least one attempt to write something fails, and so, that write attempts have been done after a log rotation!
Thread.sleep(freq);
}
}catch(InterruptedException e){
e.printStackTrace(System.err);
fail("ERROR WITH THE THREAD-" + logFreq);
}catch(IOException e){
e.printStackTrace(System.err);
fail("IO ERROR WHEN RETRIEVING THE LOG OUTPUT IN THE THREAD-" + logFreq);
}
}
})).start();
}
Thread.sleep(MAX_TIME);
// Check that all messages have been well written:
BufferedReader input = new BufferedReader(new InputStreamReader(fileManager.getLogInput(LogLevel.DEBUG, null)));
int nbLines = 0;
while(input.readLine() != null)
nbLines++;
nbLines -= 3; // deduce the number of 3 header lines
assertEquals(nbExpectedMessages, nbLines);
// Delete log file if no error:
fileManager.getLogFile(LogLevel.DEBUG, null).delete();
}catch(InterruptedException e){
e.printStackTrace(System.err);
fail("CAN NOT WAIT 3 SECONDS!");
}catch(Exception e){
e.printStackTrace(System.err);
fail("CAN NOT CREATE THE FILE MANAGER!");
}
}
}