/* Copyright 2012 Google, Inc.
*
* 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 org.arbeitspferde.groningen.eventlog;
import com.google.inject.Provider;
import org.arbeitspferde.groningen.Helper;
import org.arbeitspferde.groningen.proto.Event;
import org.arbeitspferde.groningen.utility.logstream.OutputLogStream;
import org.arbeitspferde.groningen.utility.logstream.OutputLogStreamFactory;
import org.arbeitspferde.groningen.utility.logstream.format.open.DelimitedFactory;
import junit.framework.TestCase;
import org.apache.commons.io.FileUtils;
import org.easymock.EasyMock;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Logger;
/**
* Tests for {@link SafeProtoLoggerFactory}.
*/
public class SafeProtoLoggerFactoryTest extends TestCase {
private static final Logger log = Logger.getLogger(SafeProtoLoggerTest.class.getCanonicalName());
private DelimitedFactory delimitedFactory;
private SafeProtoLoggerFactory factory;
private Provider<Timer> mockDaemonTimerProvider;
private Timer mockTimer;
private OutputLogStreamFactory fakeOutputLogStreamFactory;
private File temporaryDirectory;
private File temporaryLogFile;
@SuppressWarnings("unchecked")
@Override
protected void setUp() throws Exception {
super.setUp();
temporaryDirectory = Helper.getTestDirectory();
temporaryLogFile = File.createTempFile("log", "", temporaryDirectory);
mockDaemonTimerProvider = EasyMock.createMock(Provider.class);
mockTimer = EasyMock.createMock(Timer.class);
delimitedFactory = new DelimitedFactory();
fakeOutputLogStreamFactory = new OutputLogStreamFactory() {
@Override
public OutputLogStream forStream(final OutputStream stream) throws IOException {
return delimitedFactory.forStream(new FileOutputStream(temporaryLogFile));
}
@Override
public OutputLogStream rotatingStreamForSpecification(Specification specification)
throws IOException {
try {
return forStream(new FileOutputStream(temporaryLogFile));
} catch (final FileNotFoundException e) {
throw new IOException(e);
}
}
};
factory = new SafeProtoLoggerFactory(mockDaemonTimerProvider, fakeOutputLogStreamFactory);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
FileUtils.deleteDirectory(temporaryDirectory);
}
public void testNewEventEntryLogger() throws Exception {
EasyMock.expect(mockDaemonTimerProvider.get()).andReturn(mockTimer);
mockTimer.schedule(EasyMock.isA(TimerTask.class), EasyMock.eq(0L), EasyMock.eq(5000L));
EasyMock.expectLastCall();
EasyMock.replay(mockTimer);
EasyMock.replay(mockDaemonTimerProvider);
final String testDirectory = temporaryDirectory.getAbsolutePath();
final SafeProtoLogger<Event.EventEntry> logger =
factory.newEventEntryLogger(testDirectory, 80, 100, 5, "bar");
final Event.EventEntry.Builder eventBuilder = Event.EventEntry.newBuilder();
eventBuilder.setExperimentId(1)
.setTime(1000)
.setGroningenUser("foo")
.setGroningenServingAddress("localhost:25000")
.setSubjectUser("bar")
.setSubjectServingAddress("remotehost:25000")
.setType(Event.EventEntry.Type.START);
Event.EventEntry.JvmFlag jvmFlag = Event.EventEntry.JvmFlag.newBuilder()
.setName("-Xmx")
.setValue("1000")
.setManagedByGroningen(true)
.build();
eventBuilder.addJvmFlag(jvmFlag);
Event.EventEntry.FitnessScore fitnessScore = Event.EventEntry.FitnessScore.newBuilder()
.setName("pause_time")
.setScore(1000)
.setCoefficient(1)
.build();
eventBuilder.addScore(fitnessScore);
logger.logProtoEntry(eventBuilder.build());
logger.flush();
assertNotNull(logger);
EasyMock.verify(mockTimer);
EasyMock.verify(mockDaemonTimerProvider);
}
public void testYieldTimer_FlushesAutomatically() throws IOException, InterruptedException {
final SafeProtoLogger<?> mockLogger = EasyMock.createMock(SafeProtoLogger.class);
EasyMock.expect(mockDaemonTimerProvider.get()).andReturn(new Timer(true));
mockLogger.flush();
EasyMock.expectLastCall().atLeastOnce();
EasyMock.replay(mockLogger);
EasyMock.replay(mockTimer);
EasyMock.replay(mockDaemonTimerProvider);
factory.yieldTimer(1, "foo", mockLogger);
// N.B. — Non-Deterministic.
Thread.sleep(60);
EasyMock.verify(mockLogger);
EasyMock.verify(mockTimer);
EasyMock.verify(mockDaemonTimerProvider);
}
}