package net.thucydides.core.junit.rules; import net.thucydides.core.ThucydidesSystemProperty; import org.junit.rules.MethodRule; import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.Statement; import java.util.HashMap; import java.util.Map; /** * Conserves the webdriver-related system properties (webdriver.*). * If they were defined, they will be restored to their old values. * If they where not defined before a test, they will be deleted. * @author johnsmart * */ public class SaveWebdriverSystemPropertiesRule implements MethodRule { private final class RestorePropertiesStatement extends Statement { private final Statement statement; private final ThreadLocal<Map<String,String>> originalValues; private RestorePropertiesStatement(final Statement statement, final Map<String,String> originalValues) { super(); this.statement = statement; this.originalValues = new ThreadLocal<Map<String,String>>(); this.originalValues.set(originalValues); } @Override public void evaluate() throws Throwable { try { statement.evaluate(); } finally { restoreOldSystemProperties(); } } private void restoreOldSystemProperties() { for (ThucydidesSystemProperty property : ThucydidesSystemProperty.values()) { restorePropertyValueFor(property); } } private void restorePropertyValueFor(final ThucydidesSystemProperty property) { String propertyName = property.getPropertyName(); if (originalValues.get().containsKey(propertyName)) { String originalValue = originalValues.get().get(propertyName); System.setProperty(propertyName, originalValue); } else { System.clearProperty(propertyName); } } } private final Map<String,String> originalValues; public SaveWebdriverSystemPropertiesRule() { originalValues = saveWebdriverSystemProperties(); } private Map<String,String> saveWebdriverSystemProperties() { Map<String,String> systemPropertyValues = new HashMap<String, String>(); for (ThucydidesSystemProperty property : ThucydidesSystemProperty.values()) { savePropertyValueFor(property, systemPropertyValues); } return systemPropertyValues; } private static void savePropertyValueFor(final ThucydidesSystemProperty property, final Map<String,String> originalValues) { String propertyName = property.getPropertyName(); String currentValue = System.getProperty(propertyName); if (currentValue != null) { originalValues.put(propertyName, currentValue); } } public Statement apply(final Statement statement, final FrameworkMethod method, final Object target) { return new RestorePropertiesStatement(statement, originalValues); } }