/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.portal.livetrace;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import com.enonic.cms.core.portal.datasource.DataSourceType;
import com.enonic.cms.core.structure.page.WindowKey;
import com.enonic.cms.core.time.MockTimeService;
import static org.junit.Assert.*;
public class LivePortalTraceServiceImplTest
{
private MockTimeService timeService = new MockTimeService();
private LivePortalTraceServiceImpl service = new LivePortalTraceServiceImpl();
@Before
public void before()
{
service.setEnabled( "true" );
service.setTimeService( timeService );
service.init();
}
@Test
public void duration_of_pageInstructionPostProcessingTrace_when_rendering_a_page_with_two_windows()
{
DateTime now = new DateTime( 1970, 1, 1, 0, 59, 59, 980 );
timeService.setTimeNow( now );
PortalRequestTrace portalRequestTrace = PortalRequestTracer.startTracing( "http://localhost:8080/site/0", service );
forwardTime( 5 );
// 1970-01-01 00:59:59.985
PageRenderingTrace pageRenderingTrace = PageRenderingTracer.startTracing( service );
simulateDatasourceExecution( DataSourceType.PAGETEMPLATE, "myMethod", 10 );
// 1970-01-01 00:59:59.995
simulateViewTransformation( 5 );
// 1970-01-01 01:00:00.000
InstructionPostProcessingTrace pageInstructionPostProcessingTrace = InstructionPostProcessingTracer.startTracingForPage( service );
forwardTime( 3 );
// 1970-01-01 01:00:00.003
simulateWindowExecution( new WindowKey( "1:1" ), 10 );
// 1970-01-01 01:00:00.013
simulateWindowExecution( new WindowKey( "1:2" ), 10 );
// 1970-01-01 01:00:00.023
forwardTime( 3 );
// 1970-01-01 01:00:00.026
InstructionPostProcessingTracer.stopTracing( pageInstructionPostProcessingTrace, service );
PageRenderingTracer.stopTracing( pageRenderingTrace, service );
PortalRequestTracer.stopTracing( portalRequestTrace, service );
assertEquals( 6, pageInstructionPostProcessingTrace.getDuration().getAsMilliseconds() );
}
@Test
public void duration_of_pageInstructionPostProcessingTrace_when_rendering_a_page_which_uses_function_isWindowEmpty_with_one_window()
{
DateTime now = new DateTime( 1970, 1, 1, 0, 59, 59, 980 );
timeService.setTimeNow( now );
PortalRequestTrace portalRequestTrace = PortalRequestTracer.startTracing( "http://localhost:8080/site/0", service );
forwardTime( 5 );
// 1970-01-01 00:59:59.985
PageRenderingTrace pageRenderingTrace = PageRenderingTracer.startTracing( service );
simulateDatasourceExecution( DataSourceType.PAGETEMPLATE, "myMethod", 10 );
// 1970-01-01 00:59:59.995
ViewTransformationTrace pageViewTransformationTrace = ViewTransformationTracer.startTracing( service );
ViewFunctionTrace viewFunctionTrace = ViewFunctionTracer.startTracing( "isWindowEmpty", service );
// window being rendered by isWindowEmpty function
simulateWindowExecution( new WindowKey( "1:1" ), 10 );
// 1970-01-01 01:00:00.010
ViewFunctionTracer.stopTracing( viewFunctionTrace, service );
ViewTransformationTracer.stopTracing( pageViewTransformationTrace, service );
InstructionPostProcessingTrace pageInstructionPostProcessingTrace = InstructionPostProcessingTracer.startTracingForPage( service );
forwardTime( 3 );
// 1970-01-01 01:00:00.013
simulateWindowExecution( new WindowKey( "1:1" ), 3 );
// 1970-01-01 01:00:00.023
forwardTime( 3 );
// 1970-01-01 01:00:00.026
InstructionPostProcessingTracer.stopTracing( pageInstructionPostProcessingTrace, service );
PageRenderingTracer.stopTracing( pageRenderingTrace, service );
PortalRequestTracer.stopTracing( portalRequestTrace, service );
assertEquals( 6, pageInstructionPostProcessingTrace.getDuration().getAsMilliseconds() );
}
@Test
public void duration_of_windowInstructionPostProcessingTrace_when_rendering_a_window()
{
DateTime now = new DateTime( 1970, 1, 1, 0, 59, 59, 980 );
timeService.setTimeNow( now );
PortalRequestTrace portalRequestTrace = PortalRequestTracer.startTracing( "http://localhost:8080/site/0", service );
forwardTime( 5 );
WindowRenderingTrace windowRenderingTrace = WindowRenderingTracer.startTracing( new WindowKey( "1:1" ), service );
forwardTime( 10 );
InstructionPostProcessingTrace windowInstructionPostProcessingTrace =
InstructionPostProcessingTracer.startTracingForWindow( service );
forwardTime( 2 );
InstructionPostProcessingTracer.stopTracing( windowInstructionPostProcessingTrace, service );
WindowRenderingTracer.stopTracing( windowRenderingTrace, service );
PortalRequestTracer.stopTracing( portalRequestTrace, service );
assertEquals( 2, windowInstructionPostProcessingTrace.getDuration().getAsMilliseconds() );
}
private ViewTransformationTrace simulateViewTransformation( int timeInMillis )
{
ViewTransformationTrace trace = ViewTransformationTracer.startTracing( service );
forwardTime( timeInMillis );
ViewTransformationTracer.stopTracing( trace, service );
return trace;
}
private WindowRenderingTrace simulateWindowExecution( WindowKey windowKey, int timeInMillis )
{
WindowRenderingTrace trace = WindowRenderingTracer.startTracing( windowKey, service );
forwardTime( timeInMillis );
WindowRenderingTracer.stopTracing( trace, service );
return trace;
}
private DatasourceExecutionTrace simulateDatasourceExecution( DataSourceType type, String methodName, int timeInMillis )
{
DatasourceExecutionTrace trace = DatasourceExecutionTracer.startTracing( type, methodName, service );
forwardTime( timeInMillis );
DatasourceExecutionTracer.stopTracing( trace, service );
return trace;
}
private void forwardTime( int milliseconds )
{
DateTime now = timeService.getNowAsDateTime();
DateTime newNow = now.plusMillis( milliseconds );
timeService.setTimeNow( newNow );
}
}