package school.base.test; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Logger; import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.spi.ThrowableInformation; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.viatra.query.runtime.base.api.ViatraBaseFactory; import org.eclipse.viatra.query.runtime.base.api.NavigationHelper; import org.eclipse.viatra.query.runtime.base.exception.ViatraBaseException; import org.junit.After; import org.junit.Assert; import org.junit.Before; /** * This class is the super class of all EMF-IncQuery-Base test cases. * It is used to handle the {@link NavigationHelper} registration * based on the given {@link Notifier} instance and wildcard mode setting. * * @author Tamas Szabo * */ public abstract class SchoolBaseTest { protected NavigationHelper navigationHelper; protected Notifier notifier; protected boolean wildcardMode; protected Logger logger; protected AppenderSkeleton testAppender; protected boolean isDynamicModel; final private Map<String,Boolean> expectedLogsOccurred = new HashMap<String, Boolean>(); final protected ArrayList<LoggingEvent> loggedEvents = new ArrayList<LoggingEvent>(); /** * wildcard mode default is true<br/> * dynamic mode default is false * * @param notifier */ public SchoolBaseTest(Notifier notifier) { this.notifier = notifier; this.wildcardMode = true; this.isDynamicModel = false; } public SchoolBaseTest(Notifier notifier, boolean wildcardMode, boolean isDynamicModel) { this.notifier = notifier; this.wildcardMode = wildcardMode; this.isDynamicModel = isDynamicModel; } @After public void dispose() { navigationHelper.dispose(); logger.removeAppender(testAppender); for (LoggingEvent event : loggedEvents) { final String renderedMessage = event.getRenderedMessage(); if (expectedLogsOccurred.containsKey(renderedMessage)) { expectedLogsOccurred.put(renderedMessage, true); } else { StringBuilder sb = new StringBuilder("IQBase logged event: "); sb.append(renderedMessage); final ThrowableInformation throwableInfo = event.getThrowableInformation(); if (throwableInfo != null) { final String[] throwableStrRep = throwableInfo.getThrowableStrRep(); for (String line : throwableStrRep) { sb.append("\n"); sb.append(line); } } Assert.fail(sb.toString()); } } loggedEvents.clear(); Set<Entry<String, Boolean>> expectedEntrySet = expectedLogsOccurred.entrySet(); for (Entry<String, Boolean> entry : expectedEntrySet) { if (!entry.getValue()) { Assert.fail("Expected log entry not found: " + entry.getKey()); } } } protected void expectLogMessage(String msg) { expectedLogsOccurred.put(msg, false); } @Before public void init() throws ViatraBaseException { logger = Logger.getLogger(getClass()); testAppender = new AppenderSkeleton() { @Override public boolean requiresLayout() { return false; } @Override public void close() { } @Override protected void append(LoggingEvent event) { loggedEvents.add(event); // StringBuilder sb = new StringBuilder("IQBase logged event: "); // sb.append(event.getRenderedMessage()); // final ThrowableInformation throwableInfo = event.getThrowableInformation(); // if (throwableInfo != null) { // final String[] throwableStrRep = throwableInfo.getThrowableStrRep(); // for (String line : throwableStrRep) { // sb.append("\n"); // sb.append(line); // } // } // if (false) Assert.fail(sb.toString()); } }; logger.addAppender(testAppender); navigationHelper = ViatraBaseFactory.getInstance().createNavigationHelper(notifier, wildcardMode, isDynamicModel, logger); } }