/* * ProActive Parallel Suite(TM): * The Open Source library for parallel and distributed * Workflows & Scheduling, Orchestration, Cloud Automation * and Big Data Analysis on Enterprise Grids & Clouds. * * Copyright (c) 2007 - 2017 ActiveEon * Contact: contact@activeeon.com * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation: version 3 of * the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * If needed, contact us to obtain a release under GPL Version 2 or 3 * or a different license than the AGPL. */ package functionaltests.job.log; import static com.jayway.awaitility.Awaitility.await; import java.io.File; import java.net.URL; import java.util.concurrent.Callable; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.spi.LoggingEvent; import org.junit.Test; import org.ow2.proactive.scheduler.common.job.JobId; import org.ow2.proactive.scheduler.common.task.Log4JTaskLogs; import org.ow2.proactive.scheduler.common.util.logforwarder.LogForwardingService; import functionaltests.executables.Logging; import functionaltests.utils.SchedulerFunctionalTestNoRestart; public class TestLoggers extends SchedulerFunctionalTestNoRestart { private static URL jobDescriptor = TestLoggers.class.getResource("/functionaltests/descriptors/Job_Test_Loggers.xml"); @Test public void logBasedOnProActive() throws Throwable { LogForwardingService lfsPA = new LogForwardingService("org.ow2.proactive.scheduler.common.util.logforwarder.providers.ProActiveBasedForwardingProvider"); lfsPA.initialize(); JobId id1 = schedulerHelper.submitJob(new File(jobDescriptor.toURI()).getAbsolutePath()); final AppenderTester test1 = new AppenderTester(); lfsPA.addAppender(Log4JTaskLogs.JOB_LOGGER_PREFIX + id1, test1); schedulerHelper.getSchedulerInterface().listenJobLogs(id1, lfsPA.getAppenderProvider()); schedulerHelper.waitForEventJobFinished(id1); await().until(logEventsReceived(test1)); lfsPA.terminate(); } @Test public void logBasedOnSocket() throws Throwable { LogForwardingService lfsSocket = new LogForwardingService("org.ow2.proactive.scheduler.common.util.logforwarder.providers.SocketBasedForwardingProvider"); lfsSocket.initialize(); JobId id2 = schedulerHelper.submitJob(new File(jobDescriptor.toURI()).getAbsolutePath()); AppenderTester test2 = new AppenderTester(); lfsSocket.addAppender(Log4JTaskLogs.JOB_LOGGER_PREFIX + id2, test2); schedulerHelper.getSchedulerInterface().listenJobLogs(id2, lfsSocket.getAppenderProvider()); schedulerHelper.waitForEventJobFinished(id2); await().until(logEventsReceived(test2)); lfsSocket.terminate(); } private Callable<Boolean> logEventsReceived(final AppenderTester test1) { return new Callable<Boolean>() { @Override public Boolean call() throws Exception { return test1.receivedOnlyAwaitedEvents() && test1.getNumberOfAppendedLogs() == 2; } }; } public class AppenderTester extends AppenderSkeleton { private boolean allLogsAwaited = true; private int numberOfAppendedLogs = 0; @Override protected void append(LoggingEvent loggingevent) { System.out.println("====== " + loggingevent.getLoggerName()); System.out.println("======>" + loggingevent.getMessage() + "<====="); System.out.println("====== " + loggingevent.getLevel()); if (loggingevent.getLevel().equals(Log4JTaskLogs.STDERR_LEVEL)) { return; } else if (!Logging.MSG.equals(loggingevent.getMessage())) { this.allLogsAwaited = false; } numberOfAppendedLogs++; System.out.println("))))) " + numberOfAppendedLogs); } public int getNumberOfAppendedLogs() { return this.numberOfAppendedLogs; } public boolean receivedOnlyAwaitedEvents() { return this.allLogsAwaited; } @Override public void close() { super.closed = true; } @Override public boolean requiresLayout() { return false; } } }