/*******************************************************************************
* Copyright (C) 2014, 2015 Google Inc and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marcus Eng (Google) - initial API and implementation
* Simon Scholz <simon.scholz@vogella.com> - Bug 443391
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.ui.internal.monitoring;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.eclipse.core.runtime.ILogListener;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.ui.monitoring.PreferenceConstants;
import org.eclipse.ui.monitoring.StackSample;
import org.eclipse.ui.monitoring.UiFreezeEvent;
import org.junit.Before;
import org.junit.Test;
/**
* JUnit test for the {@link DefaultUiFreezeEventLogger}.
*/
public class DefaultLoggerTests {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
private static final String RUNTIME_ID = "org.eclipse.core.runtime";
private static final long TIME = 120000000;
private static final long DURATION = 500;
private DefaultUiFreezeEventLogger logger;
private ThreadInfo thread;
private IStatus loggedStatus;
@Before
public void setUp() {
logger = new DefaultUiFreezeEventLogger(DURATION * 10);
createLogListener();
}
private void createLogListener() {
Platform.addLogListener(new ILogListener() {
@Override
public void logging(IStatus status, String plugin) {
if (plugin.equals(RUNTIME_ID)) {
loggedStatus = status;
}
}
});
}
private UiFreezeEvent createFreezeEvent() {
ThreadMXBean jvmThreadManager = ManagementFactory.getThreadMXBean();
thread = jvmThreadManager.getThreadInfo(Thread.currentThread().getId(), Integer.MAX_VALUE);
StackSample[] samples = { new StackSample(TIME, new ThreadInfo[] { thread }) };
UiFreezeEvent event = new UiFreezeEvent(TIME, DURATION, samples, false, false, false);
return event;
}
@Test
public void testLogEvent() {
UiFreezeEvent event = createFreezeEvent();
String expectedTime = dateFormat.format(new Date(TIME));
String expectedHeader =
String.format("UI freeze of %.2gs at %s", DURATION / 1000.0, expectedTime);
String expectedEventMessage = String.format("Sample at %s (+%.3fs)", expectedTime, 0.000);
logger.log(event);
assertEquals(PreferenceConstants.PLUGIN_ID, loggedStatus.getPlugin());
assertTrue("Logged status was not a MultiStatus", loggedStatus.isMultiStatus());
assertEquals(expectedHeader, loggedStatus.getMessage());
assertEquals("One nested IStatus did not get logged correctly.", 1,
loggedStatus.getChildren().length);
IStatus freezeEvent = loggedStatus.getChildren()[0];
assertTrue(freezeEvent.getMessage().contains(expectedEventMessage));
StackTraceElement[] threadStackTrace = thread.getStackTrace();
StackTraceElement[] loggedStackTrace = freezeEvent.getException().getStackTrace();
assertEquals(threadStackTrace.length, loggedStackTrace.length);
for (int i = 0; i < threadStackTrace.length; i++) {
assertEquals(threadStackTrace[i], loggedStackTrace[i]);
}
}
}