/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.portal.rendering.tracing; import java.util.List; import org.junit.After; import org.junit.Test; import org.springframework.mock.web.MockHttpServletRequest; import com.enonic.cms.core.security.PortalSecurityHolder; import com.enonic.cms.core.security.user.UserKey; import com.enonic.cms.core.servlet.ServletRequestAccessor; import static org.junit.Assert.*; public class RenderTraceTest { private final UserKey user1 = new UserKey( "AAA" ); private final UserKey user2 = new UserKey( "BBB" ); private final UserKey user3 = new UserKey( "CCC" ); private final UserKey user4 = new UserKey( "DDD" ); @After public void after() { PortalSecurityHolder.setLoggedInUser( null ); } @Test public void only_traces_with_page_info_are_kept() { MockHttpServletRequest request = new MockHttpServletRequest(); ServletRequestAccessor.setRequest( request ); RenderTrace.markRequestAsExecutedInDebugMode( request ); PortalSecurityHolder.setLoggedInUser( user1 ); // exercise: simulate 4 page traces and 4 non-page traces for ( int i = 1; i <= 8; i++ ) { RenderTrace.enter(); boolean even = i % 2 == 0; if ( even ) { RenderTrace.enterPage( i ); } RenderTrace.exit(); } List<RenderTraceInfo> history = getHistoryForUser( user1 ); // verify: only 4 traces are left in history assertEquals( 4, history.size() ); // verify: all 4 have page info for ( RenderTraceInfo info : history ) { assertNotNull( info.getPageInfo() ); } } @Test public void max_ten_traces_are_kept_for_one_user() { MockHttpServletRequest request = new MockHttpServletRequest(); ServletRequestAccessor.setRequest( request ); RenderTrace.markRequestAsExecutedInDebugMode( request ); PortalSecurityHolder.setLoggedInUser( user2 ); // exercise for ( int i = 1; i <= 40; i++ ) { RenderTrace.enter(); if ( i % 2 == 0 ) { RenderTrace.enterPage( i ); } RenderTrace.exit(); } List<RenderTraceInfo> history = getHistoryForUser( user2 ); // verify: only 20 traces are left assertEquals( 20, history.size() ); // verify: all have page info for ( RenderTraceInfo info : history ) { assertNotNull( info.getPageInfo() ); } } @Test public void max_ten_traces_are_kept_per_user() throws InterruptedException { UserTraceSimulator userTraceSimulator1 = new UserTraceSimulator( user3 ); UserTraceSimulator userTraceSimulator2 = new UserTraceSimulator( user4 ); userTraceSimulator1.start(); userTraceSimulator2.start(); userTraceSimulator1.join(); userTraceSimulator2.join(); assertEquals( 20, userTraceSimulator1.getHistory().size() ); assertEquals( 20, userTraceSimulator2.getHistory().size() ); } private static List<RenderTraceInfo> getHistoryForUser( UserKey userKey ) { final RenderTraceHistory history = RenderTraceHistory.getFromSession( ServletRequestAccessor.getRequest().getSession(), userKey ); return history != null ? history.getHistory() : null; } private static class UserTraceSimulator extends Thread { private UserKey user; private List<RenderTraceInfo> history; private UserTraceSimulator( UserKey user ) { this.user = user; } private List<RenderTraceInfo> getHistory() { return history; } @Override public void run() { MockHttpServletRequest request = new MockHttpServletRequest(); ServletRequestAccessor.setRequest( request ); RenderTrace.markRequestAsExecutedInDebugMode( request ); PortalSecurityHolder.setLoggedInUser( user ); for ( int i = 1; i <= 40; i++ ) { RenderTrace.enter(); if ( i % 2 == 0 ) { RenderTrace.enterPage( i ); } RenderTrace.exit(); try { sleep( 10 ); } catch ( InterruptedException e ) { e.printStackTrace(); } } history = getHistoryForUser( user ); } } }