content: package com.aimmac23.hub.examples;
  
  import java.net.URL;
  
  import org.junit.After;
  import org.junit.Assert;
  import org.junit.Before;
  import org.junit.Rule;
  import org.junit.rules.TestRule;
  import org.junit.runner.Description;
  import org.junit.runners.model.Statement;
  import org.openqa.selenium.remote.HttpCommandExecutor;
  import org.openqa.selenium.remote.RemoteWebDriver;
  import org.openqa.selenium.remote.SessionId;
  
  /**
   * Base class for some Selenium Tests. Sets up the WebDriver, and wraps the
   * running test in a JUnit rule that wraps failing test exceptions in another exception
   * which contains a URL for the test video.
   * 
   * This is a easy way to get the video links into your JUnit/CI integration reports, if a
   * bit nasty.
   * 
   * @author Alasdair Macmillan
   *
   */
  public abstract class AbstractVideoSeleniumTest extends Assert {
  
  	protected RemoteWebDriver driver;
  	private SessionId sessionId;
  
  	@Before
  	public void setUp() {
  		driver = createWebDriver();
  		sessionId = driver.getSessionId();
  	}
  	
  	@After
  	public void tearDown() {
  		// could be null, if we failed to create this
  		if(driver != null) {
  			driver.quit();
  		}
  	}
  		
  	protected abstract RemoteWebDriver createWebDriver();
  	
  	@Rule
  	public TestRule createVideoExceptionWrapRule() {
  		return new TestRule() {
  
  			@Override
  			public Statement apply(final Statement base, Description description) {
  					return new Statement() {
  
  						@Override
  						public void evaluate() throws Throwable {
  							try {
  								// this bit actually runs the test.
  								base.evaluate();
  							}
  							catch(Throwable e) {
  								if(driver != null) {
  									URL remoteServer = ((HttpCommandExecutor)driver.getCommandExecutor()).getAddressOfRemoteServer();
  									
  									// XXX: We should really verify with an HTTP HEAD request that the video exists. We can only
  									// do that after the test has finished, which is a bit too late for this test rule.
  									
  									URL videoUrl = new URL(remoteServer, "/grid/admin/HubVideoDownloadServlet/?sessionId=" + sessionId);
  									
  									// Selenium exceptions can be quite verbose - just give the classname
  									String message = e.getClass().getName();
  									
  									throw new RuntimeException("Test failed due to exception: " + message + ". Video available at " + videoUrl, e);
  								}
  								else {
  									// we failed to get a Webdriver - re-throw original exception
  									throw e;
  																	
  								}
  							}
  						}
  					};
  			}
  		};
  	}
  }
  