| /******************************************************************************* |
| * Copyright (c) 2019 Boeing. |
| * 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: |
| * Boeing - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.ote.simple.test.environment; |
| |
| import java.io.File; |
| import java.io.FilenameFilter; |
| import java.io.IOException; |
| import java.util.logging.Level; |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| import org.eclipse.osee.framework.core.enums.OteRunTestsKeys; |
| import org.eclipse.osee.framework.jdk.core.type.IPropertyStore; |
| import org.eclipse.osee.framework.jdk.core.util.Strings; |
| import org.eclipse.osee.framework.logging.ILoggerListener; |
| import org.eclipse.osee.framework.logging.OseeLog; |
| import org.eclipse.osee.ote.core.environment.TestEnvironment; |
| import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger; |
| import org.eclipse.osee.ote.core.framework.IRunManager; |
| import org.eclipse.osee.ote.core.framework.testrun.ITestResultCollector; |
| import org.eclipse.osee.ote.core.log.record.PropertyStoreRecord; |
| import org.eclipse.osee.ote.core.log.record.TestRecord; |
| import org.eclipse.ote.simple.test.environment.outfile.ScriptJsonOutLogHandler; |
| import org.eclipse.ote.simple.test.environment.outfile.ScriptStreamOutLogHandler; |
| |
| /** |
| * @author Andy Jury |
| */ |
| public class SimpleTestResultCollector implements ITestResultCollector { |
| private ILoggerListener loggerListener; |
| private ScriptStreamOutLogHandler handlerStream; |
| private ScriptJsonOutLogHandler jsonHandler; |
| private final Matcher fileNumberMatcher = Pattern.compile("(.*)\\.(\\d+)\\.tmo").matcher(""); |
| |
| @Deprecated |
| @Override |
| public void initialize(IPropertyStore propertyStore, TestEnvironment testEnvironment) throws Exception { |
| initialize(propertyStore, testEnvironment.getOutDir(), testEnvironment.getLogger(), testEnvironment.getRunManager()); |
| } |
| |
| public void initialize(IPropertyStore propertyStore, File outfileDirectory, ITestLogger testLogger, IRunManager runManager) throws IOException { |
| String serverOutfilePath; |
| String value = propertyStore.get(OteRunTestsKeys.serverOutfileFolderOverride.name()); |
| final String testClass = propertyStore.get(OteRunTestsKeys.testClass.name()); |
| File folderPath = new File(value); |
| if (folderPath.exists() && folderPath.isDirectory()) { |
| int number = getHighestExistingFileNumber(folderPath, testClass); |
| number++; |
| if (number > 0) { |
| serverOutfilePath = new File(folderPath, testClass + "." + number + ".tmo").getAbsolutePath(); |
| } else { |
| serverOutfilePath = new File(folderPath, testClass + ".tmo").getAbsolutePath(); |
| } |
| } else { |
| serverOutfilePath = File.createTempFile(propertyStore.get(OteRunTestsKeys.testClass.name()), ".tmo", outfileDirectory).getPath(); |
| } |
| propertyStore.put(OteRunTestsKeys.serverOutfilePath.name(), serverOutfilePath); |
| String distributionStatement = propertyStore.get("distributionStatement"); |
| if (Strings.isValid(distributionStatement)) { |
| handlerStream = new ScriptStreamOutLogHandler(new File(propertyStore.get(OteRunTestsKeys.serverOutfilePath.name())), distributionStatement); |
| jsonHandler = new ScriptJsonOutLogHandler(new File(propertyStore.get(OteRunTestsKeys.serverOutfilePath.name())), distributionStatement); |
| } else { |
| handlerStream = new ScriptStreamOutLogHandler(new File(propertyStore.get(OteRunTestsKeys.serverOutfilePath.name()))); |
| jsonHandler = new ScriptJsonOutLogHandler(new File(propertyStore.get(OteRunTestsKeys.serverOutfilePath.name()))); |
| } |
| testLogger.addHandler(handlerStream); |
| testLogger.addHandler(jsonHandler); |
| loggerListener = new DefaultLoggingListener(testLogger, runManager); |
| try { |
| TestRecord.setLocationLoggingOn(true); |
| String loggingLevel = propertyStore.get("logging.level"); |
| if (loggingLevel.length() > 0) { |
| Level levelToSet = Level.parse(loggingLevel); |
| handlerStream.setLevel(levelToSet); |
| jsonHandler.setLevel(levelToSet); |
| if (levelToSet.intValue() >= Level.WARNING.intValue()) { |
| TestRecord.setLocationLoggingOn(false); |
| } |
| } |
| } catch (IllegalArgumentException ex) { |
| OseeLog.log(SimpleTestResultCollector.class, Level.SEVERE, "Unable to set outfile log level.", ex); |
| } |
| testLogger.log(new PropertyStoreRecord(propertyStore)); |
| OseeLog.registerLoggerListener(loggerListener); |
| } |
| |
| private int getHighestExistingFileNumber(final File folder, final String fileName) { |
| String[] files = folder.list(new FilenameFilter() { |
| @Override |
| public boolean accept(File dir, String name) { |
| return name.contains(fileName); |
| } |
| }); |
| if (files.length == 0) { |
| return 0; |
| } |
| int highestNumber = 1; |
| for (String file : files) { |
| fileNumberMatcher.reset(file); |
| if (fileNumberMatcher.find()) { |
| String num = fileNumberMatcher.group(2); |
| try { |
| int newNum = Integer.parseInt(num); |
| if (newNum > highestNumber) { |
| highestNumber = newNum; |
| } |
| } catch (NumberFormatException ex) { |
| // we'll just use the highest detected number or 1 in this case |
| } |
| } |
| } |
| return highestNumber; |
| } |
| |
| @Deprecated |
| @Override |
| public void dispose(TestEnvironment testEnvironment) throws Exception { |
| dispose(testEnvironment.getLogger()); |
| } |
| |
| public void dispose(ITestLogger logger) { |
| try { |
| handlerStream.flushRecords(); |
| handlerStream.close(); |
| jsonHandler.flushRecords(); |
| jsonHandler.close(); |
| } catch (Throwable ex) { |
| ex.printStackTrace(); |
| } finally { |
| logger.removeHandler(handlerStream); |
| logger.removeHandler(jsonHandler); |
| handlerStream = null; |
| jsonHandler = null; |
| OseeLog.unregisterLoggerListener(loggerListener); |
| loggerListener = null; |
| } |
| } |
| |
| private static final class DefaultLoggingListener implements ILoggerListener { |
| private ITestLogger testLogger; |
| private IRunManager runManager; |
| |
| public DefaultLoggingListener(ITestLogger testLogger, IRunManager runManager) { |
| this.testLogger = testLogger; |
| this.runManager = runManager; |
| } |
| |
| @Override |
| public void log(String loggerName, Level level, String message, Throwable th) { |
| if (testLogger != null && !runManager.isAborted()) { |
| testLogger.log(level, message, th); |
| } |
| } |
| } |
| } |