/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package fish.payara.nucleus.requesttracing; import fish.payara.nucleus.requesttracing.domain.EventType; import fish.payara.nucleus.requesttracing.domain.RequestEvent; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.*; /** * * @author steve */ public class RequestEventStoreTest { private Map<Long,RequestTrace> tracesbyThreadId; private RequestEventStore eventStore; public RequestEventStoreTest() { } @BeforeClass public static void setUpClass() { } @AfterClass public static void tearDownClass() { } @Before public void setUp() { tracesbyThreadId = Collections.synchronizedMap(new HashMap<Long,RequestTrace>()); eventStore = new RequestEventStore(); } @After public void tearDown() { } @Test public void testStoreEvent() { RequestEvent re = new RequestEvent(EventType.TRACE_START, "Start"); eventStore.storeEvent(re); eventStore.storeEvent(new RequestEvent("Test")); eventStore.storeEvent(new RequestEvent(EventType.TRACE_END, "End")); assertEquals(3, eventStore.getTrace().getTrace().size()); } @Test public void testFlushStore() { testStoreEvent(); eventStore.flushStore(); assertEquals(0, eventStore.getTrace().getTrace().size()); } /** * Test of storeEvent method utilising multiple threads ensuring traces are separate */ @Test public void testStoreEventMultipleThreads() throws InterruptedException { Thread thread1 = new Thread(new Runnable() { @Override public void run() { long threadID = Thread.currentThread().getId(); RequestEvent re = new RequestEvent(EventType.TRACE_START, "Start"+threadID); eventStore.storeEvent(re); for (int i = 0; i < 100; i++) { re = new RequestEvent("Event-"+i+"-"+threadID); eventStore.storeEvent(re); } eventStore.storeEvent(new RequestEvent(EventType.TRACE_END, "End"+threadID)); tracesbyThreadId.put(threadID, eventStore.getTrace()); } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { long threadID = Thread.currentThread().getId(); RequestEvent re = new RequestEvent(EventType.TRACE_START, "Start"+threadID); eventStore.storeEvent(re); for (int i = 0; i < 200; i++) { re = new RequestEvent("Event-"+i+"-"+threadID); eventStore.storeEvent(re); } eventStore.storeEvent(new RequestEvent(EventType.TRACE_END, "End"+threadID)); tracesbyThreadId.put(threadID, eventStore.getTrace()); } }); thread1.start(); thread2.start(); thread1.join(); thread2.join(); RequestTrace trace1 = tracesbyThreadId.get(thread1.getId()); RequestTrace trace2 = tracesbyThreadId.get(thread2.getId()); // make sure we have something of the correct length in each trace assertNotNull(trace2); assertNotNull(trace1); assertEquals(202, trace2.getTrace().size()); assertEquals(102,trace1.getTrace().size()); // ensure they are different classes assertNotSame(trace2, trace1); // assert last names are coorect assertEquals("End"+thread1.getId(), trace1.getTrace().getLast().getEventName()); assertEquals("End"+thread2.getId(), trace2.getTrace().getLast().getEventName()); //assert start names are correct assertEquals("Start"+thread1.getId(), trace1.getTrace().getFirst().getEventName()); assertEquals("Start"+thread2.getId(), trace2.getTrace().getFirst().getEventName()); // assert all conversation IDs are correct trace 1 UUID convID = trace1.getTrace().getFirst().getConversationId(); for (RequestEvent re : trace1.getTrace()) { assertEquals(convID,re.getConversationId()); } // assert all conversation IDs are correct trace 2 UUID convID2 = trace2.getTrace().getFirst().getConversationId(); for (RequestEvent re : trace2.getTrace()) { assertEquals(convID2,re.getConversationId()); } } /** * Test of getElapsedTime method, of class RequestEventStore. * @throws java.lang.InterruptedException */ @Test public void testGetElapsedTime() throws InterruptedException { RequestEvent re = new RequestEvent(EventType.TRACE_START, "Start"); eventStore.storeEvent(re); Thread.sleep(100); eventStore.storeEvent(new RequestEvent("Test")); eventStore.storeEvent(new RequestEvent(EventType.TRACE_END, "End")); assertEquals(3, eventStore.getTrace().getTrace().size()); assertTrue(eventStore.getElapsedTime() >= 90); } @Test public void testFlushMultipleThreads() throws InterruptedException { // thread 1 builds up a trace Thread thread1 = new Thread(new Runnable() { @Override public void run(){ long threadID = Thread.currentThread().getId(); RequestEvent re = new RequestEvent(EventType.TRACE_START, "Start"+threadID); eventStore.storeEvent(re); for (int i = 0; i < 10; i++) { re = new RequestEvent("Event-"+i+"-"+threadID); try { Thread.sleep(10); } catch (InterruptedException ex) { Logger.getLogger(RequestEventStoreTest.class.getName()).log(Level.SEVERE, null, ex); } eventStore.storeEvent(re); } eventStore.storeEvent(new RequestEvent(EventType.TRACE_END, "End"+threadID)); tracesbyThreadId.put(threadID, eventStore.getTrace()); } }); // thread 2 continually flushes the store Thread thread2 = new Thread(new Runnable() { @Override public void run() { long threadID = Thread.currentThread().getId(); for (int i = 0; i < 10; i++) { try { Thread.sleep(10); } catch (InterruptedException ex) { Logger.getLogger(RequestEventStoreTest.class.getName()).log(Level.SEVERE, null, ex); } eventStore.flushStore(); } tracesbyThreadId.put(threadID, eventStore.getTrace()); } }); thread1.start(); thread2.start(); thread1.join(); thread2.join(); RequestTrace trace1 = tracesbyThreadId.get(thread1.getId()); RequestTrace trace2 = tracesbyThreadId.get(thread2.getId()); // check trace sizes assertEquals(12, trace1.getTrace().size()); assertEquals(0, trace2.getTrace().size()); // check trace 1 has an elapsed time in the correct range assertTrue(trace1.getElapsedTime() >= 90); } @Test public void testResettingConversationID() { RequestEvent re = new RequestEvent(EventType.TRACE_START, "Start"); eventStore.storeEvent(re); for (int i = 0; i < 10; i++) { re = new RequestEvent("Event-"+i); try { Thread.sleep(10); } catch (InterruptedException ex) { Logger.getLogger(RequestEventStoreTest.class.getName()).log(Level.SEVERE, null, ex); } eventStore.storeEvent(re); } eventStore.storeEvent(new RequestEvent(EventType.TRACE_END, "End")); UUID oldID = eventStore.getTrace().getTrace().getFirst().getConversationId(); UUID newID = UUID.randomUUID(); eventStore.setConverstationID(newID); for (RequestEvent event : eventStore.getTrace().getTrace()) { assertEquals(newID, event.getConversationId()); } } @Test public void isInProgress() { assertFalse(eventStore.isTraceInProgress()); RequestEvent re = new RequestEvent(EventType.TRACE_START, "Start"); eventStore.storeEvent(re); for (int i = 0; i < 10; i++) { re = new RequestEvent("Event-"+i); try { Thread.sleep(10); } catch (InterruptedException ex) { Logger.getLogger(RequestEventStoreTest.class.getName()).log(Level.SEVERE, null, ex); } eventStore.storeEvent(re); } assertTrue(eventStore.isTraceInProgress()); eventStore.storeEvent(new RequestEvent(EventType.TRACE_END, "End")); assertFalse(eventStore.isTraceInProgress()); } }